diff --git a/.ci/android/build.sh b/.ci/android/build.sh index 1fb721b3b2..836faa38d5 100755 --- a/.ci/android/build.sh +++ b/.ci/android/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later export NDK_CCACHE=$(which ccache) @@ -13,8 +13,8 @@ fi cd src/android chmod +x ./gradlew -./gradlew assembleRelease -./gradlew bundleRelease +./gradlew assembleMainlineRelease +./gradlew bundleMainlineRelease if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then rm "${ANDROID_KEYSTORE_FILE}" diff --git a/.ci/android/package.sh b/.ci/android/package.sh index c2eb975a02..50b7bbc332 100755 --- a/.ci/android/package.sh +++ b/.ci/android/package.sh @@ -1,6 +1,6 @@ #!/bin/sh -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later GITDATE="$(git show -s --date=short --format='%ad' | sed 's/-//g')" diff --git a/.ci/license-header.sh b/.ci/license-header.sh index d14d5adf42..3d4929d1c1 100755 --- a/.ci/license-header.sh +++ b/.ci/license-header.sh @@ -1,53 +1,102 @@ #!/bin/sh -e HEADER="$(cat "$PWD/.ci/license/header.txt")" +HEADER_HASH="$(cat "$PWD/.ci/license/header-hash.txt")" echo "Getting branch changes" -BRANCH=`git rev-parse --abbrev-ref HEAD` -COMMITS=`git log ${BRANCH} --not master --pretty=format:"%h"` -RANGE="${COMMITS[${#COMMITS[@]}-1]}^..${COMMITS[0]}" -FILES=`git diff-tree --no-commit-id --name-only ${RANGE} -r` +# BRANCH=`git rev-parse --abbrev-ref HEAD` +# COMMITS=`git log ${BRANCH} --not master --pretty=format:"%h"` +# RANGE="${COMMITS[${#COMMITS[@]}-1]}^..${COMMITS[0]}" +# FILES=`git diff-tree --no-commit-id --name-only ${RANGE} -r` + +BASE=`git merge-base master HEAD` +FILES=`git diff --name-only $BASE` #FILES=$(git diff --name-only master) echo "Done" +check_header() { + CONTENT="`head -n3 < $1`" + case "$CONTENT" in + "$HEADER"*) ;; + *) BAD_FILES="$BAD_FILES $1" ;; + esac +} + +check_cmake_header() { + CONTENT="`head -n3 < $1`" + + case "$CONTENT" in + "$HEADER_HASH"*) ;; + *) + BAD_CMAKE="$BAD_CMAKE $1" ;; + esac +} for file in $FILES; do [ -f "$file" ] || continue + if [ `basename -- "$file"` = "CMakeLists.txt" ]; then + check_cmake_header "$file" + continue + fi + EXTENSION="${file##*.}" case "$EXTENSION" in kts|kt|cpp|h) - CONTENT="`cat $file`" - case "$CONTENT" in - "$HEADER"*) ;; - *) BAD_FILES="$BAD_FILES $file" ;; - esac + check_header "$file" + ;; + cmake) + check_cmake_header "$file" ;; esac done -if [ "$BAD_FILES" = "" ]; then +if [ "$BAD_FILES" = "" ] && [ "$BAD_CMAKE" = "" ]; then echo echo "All good." exit fi -echo "The following files have incorrect license headers:" -echo +if [ "$BAD_FILES" != "" ]; then + echo "The following source files have incorrect license headers:" + echo -for file in $BAD_FILES; do echo $file; done + for file in $BAD_FILES; do echo $file; done -cat << EOF + cat << EOF -The following license header should be added to the start of all offending files: +The following license header should be added to the start of all offending SOURCE files: === BEGIN === $HEADER === END === +EOF + +fi + +if [ "$BAD_CMAKE" != "" ]; then + echo "The following CMake files have incorrect license headers:" + echo + + for file in $BAD_CMAKE; do echo $file; done + + cat << EOF + +The following license header should be added to the start of all offending CMake files: + +=== BEGIN === +$HEADER_HASH +=== END === + +EOF + +fi + +cat << EOF If some of the code in this PR is not being contributed by the original author, the files which have been exclusively changed by that code can be ignored. If this happens, this PR requirement can be bypassed once all other files are addressed. @@ -70,6 +119,17 @@ if [ "$FIX" = "true" ]; then git add $file done + for file in $BAD_CMAKE; do + cat $file > $file.bak + + cat .ci/license/header-hash.txt > $file + echo >> $file + cat $file.bak >> $file + + rm $file.bak + + git add $file + done echo "License headers fixed." if [ "$COMMIT" = "true" ]; then diff --git a/.ci/license/header-hash.txt b/.ci/license/header-hash.txt new file mode 100644 index 0000000000..91bc195e23 --- /dev/null +++ b/.ci/license/header-hash.txt @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh index 7c8bed1279..41e0ca308b 100755 --- a/.ci/linux/build.sh +++ b/.ci/linux/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later case "$1" in @@ -104,6 +104,7 @@ cmake .. -G Ninja \ -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ -DYUZU_USE_FASTER_LD=ON \ -DYUZU_ENABLE_LTO=ON \ + -DDYNARMIC_ENABLE_LTO=ON \ "${EXTRA_CMAKE_FLAGS[@]}" ninja -j${NPROC} diff --git a/.ci/linux/eden.dwfsprof b/.ci/linux/eden.dwfsprof index bc360f0d46..9a3bee6f14 100644 --- a/.ci/linux/eden.dwfsprof +++ b/.ci/linux/eden.dwfsprof @@ -1,6 +1,6 @@ AppRun eden.desktop -org.eden_emu.eden.desktop +dev.eden_emu.eden.desktop shared/bin/eden shared/lib/lib.path shared/lib/ld-linux-x86-64.so.2 diff --git a/.ci/linux/package.sh b/.ci/linux/package.sh index 911fea2f7b..838476097a 100755 --- a/.ci/linux/package.sh +++ b/.ci/linux/package.sh @@ -1,6 +1,6 @@ #!/bin/sh -e -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # This script assumes you're in the source directory @@ -59,15 +59,15 @@ VERSION="$(echo "$EDEN_TAG")" mkdir -p ./AppDir cd ./AppDir -cp ../dist/org.eden_emu.eden.desktop . -cp ../dist/org.eden_emu.eden.svg . +cp ../dist/dev.eden_emu.eden.desktop . +cp ../dist/dev.eden_emu.eden.svg . -ln -sf ./org.eden_emu.eden.svg ./.DirIcon +ln -sf ./dev.eden_emu.eden.svg ./.DirIcon UPINFO='gh-releases-zsync|eden-emulator|Releases|latest|*.AppImage.zsync' if [ "$DEVEL" = 'true' ]; then - sed -i 's|Name=Eden|Name=Eden Nightly|' ./org.eden_emu.eden.desktop + sed -i 's|Name=Eden|Name=Eden Nightly|' ./dev.eden_emu.eden.desktop UPINFO="$(echo "$UPINFO" | sed 's|Releases|nightly|')" fi diff --git a/.ci/translate.sh b/.ci/translate.sh index 55104b7c76..c0b7dba9f6 100755 --- a/.ci/translate.sh +++ b/.ci/translate.sh @@ -5,7 +5,7 @@ for i in dist/languages/*.ts; do TARGET=`head -n1 $i | awk -F 'language="' '{split($2, a, "\""); print a[1]}'` # requires fd - SOURCES=`fd . src/yuzu -tf -e ui -e cpp -e h -e plist` + SOURCES=`fd . src/yuzu src/qt_common -tf -e ui -e cpp -e h -e plist` lupdate -source-language $SRC -target-language $TARGET $SOURCES -ts /data/code/eden/$i done diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index 7504630a57..d554e00e1b 100644 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -1,58 +1,45 @@ -#!/bin/bash -e +#!/bin/bash -ex -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -if [ "$DEVEL" != "true" ]; then - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DENABLE_QT_UPDATE_CHECKER=ON) +if [ "$COMPILER" == "clang" ] +then + EXTRA_CMAKE_FLAGS+=( + -DCMAKE_CXX_COMPILER=clang-cl + -DCMAKE_C_COMPILER=clang-cl + -DCMAKE_CXX_FLAGS="-O3" + -DCMAKE_C_FLAGS="-O3" + ) + + BUILD_TYPE="RelWithDebInfo" fi -if [ "$CCACHE" = "true" ]; then - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DUSE_CCACHE=ON) -fi +[ -z "$WINDEPLOYQT" ] && { echo "WINDEPLOYQT environment variable required."; exit 1; } -if [ "$BUNDLE_QT" = "true" ]; then - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_BUNDLED_QT=ON) -else - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_BUNDLED_QT=OFF) -fi - -if [ -z "$BUILD_TYPE" ]; then - export BUILD_TYPE="Release" -fi - -if [ "$WINDEPLOYQT" == "" ]; then - echo "You must supply the WINDEPLOYQT environment variable." - exit 1 -fi - -if [ "$USE_WEBENGINE" = "true" ]; then - WEBENGINE=ON -else - WEBENGINE=OFF -fi - -if [ "$USE_MULTIMEDIA" = "false" ]; then - MULTIMEDIA=OFF -else - MULTIMEDIA=ON -fi - -export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) +echo $EXTRA_CMAKE_FLAGS mkdir -p build && cd build cmake .. -G Ninja \ - -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ - -DENABLE_QT_TRANSLATION=ON \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE:-Release}" \ + -DENABLE_QT_TRANSLATION=ON \ -DUSE_DISCORD_PRESENCE=ON \ -DYUZU_USE_BUNDLED_SDL2=ON \ + -DBUILD_TESTING=OFF \ -DYUZU_TESTS=OFF \ + -DDYNARMIC_TESTS=OFF \ -DYUZU_CMD=OFF \ -DYUZU_ROOM_STANDALONE=OFF \ - -DYUZU_USE_QT_MULTIMEDIA=$MULTIMEDIA \ - -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ + -DYUZU_USE_QT_MULTIMEDIA=${USE_MULTIMEDIA:-false} \ + -DYUZU_USE_QT_WEB_ENGINE=${USE_WEBENGINE:-false} \ -DYUZU_ENABLE_LTO=ON \ - "${EXTRA_CMAKE_FLAGS[@]}" + -DCMAKE_EXE_LINKER_FLAGS=" /LTCG" \ + -DDYNARMIC_ENABLE_LTO=ON \ + -DYUZU_USE_BUNDLED_QT=${BUNDLE_QT:-false} \ + -DUSE_CCACHE=${CCACHE:-false} \ + -DENABLE_QT_UPDATE_CHECKER=${DEVEL:-true} \ + "${EXTRA_CMAKE_FLAGS[@]}" \ + "$@" ninja @@ -61,4 +48,5 @@ rm -f bin/*.pdb set -e $WINDEPLOYQT --release --no-compiler-runtime --no-opengl-sw --no-system-dxc-compiler --no-system-d3d-compiler --dir pkg bin/eden.exe + cp bin/* pkg diff --git a/.ci/windows/install-msvc.ps1 b/.ci/windows/install-msvc.ps1 new file mode 100755 index 0000000000..788b2848ad --- /dev/null +++ b/.ci/windows/install-msvc.ps1 @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +$ErrorActionPreference = "Stop" + +# Check if running as administrator +if (-not ([bool](net session 2>$null))) { + Write-Host "This script must be run with administrator privileges!" + Exit 1 +} + +$VSVer = "17" +$ExeFile = "vs_community.exe" +$Uri = "https://aka.ms/vs/$VSVer/release/$ExeFile" +$Destination = "./$ExeFile" + +Write-Host "Downloading Visual Studio Build Tools from $Uri" +$WebClient = New-Object System.Net.WebClient +$WebClient.DownloadFile($Uri, $Destination) +Write-Host "Finished downloading $ExeFile" + +$Arguments = @( + "--quiet", # Suppress installer UI + "--wait", # Wait for installation to complete + "--norestart", # Prevent automatic restart + "--force", # Force installation even if components are already installed + "--add Microsoft.VisualStudio.Workload.NativeDesktop", # Desktop development with C++ + "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64", # Core C++ compiler/tools for x86/x64 + "--add Microsoft.VisualStudio.Component.Windows11SDK.26100",# Windows 11 SDK (26100) + "--add Microsoft.VisualStudio.Component.Windows10SDK.19041",# Windows 10 SDK (19041) + "--add Microsoft.VisualStudio.Component.VC.Llvm.Clang", # LLVM Clang compiler + "--add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset", # LLVM Clang integration toolset + "--add Microsoft.VisualStudio.Component.Windows11SDK.22621",# Windows 11 SDK (22621) + "--add Microsoft.VisualStudio.Component.VC.CMake.Project", # CMake project support + "--add Microsoft.VisualStudio.ComponentGroup.VC.Tools.142.x86.x64", # VC++ 14.2 toolset + "--add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Llvm.Clang" # LLVM Clang for native desktop +) + +Write-Host "Installing Visual Studio Build Tools" +$InstallProcess = Start-Process -FilePath $Destination -NoNewWindow -PassThru -ArgumentList $Arguments + +# Spinner while installing +$Spinner = "|/-\" +$i = 0 +while (-not $InstallProcess.HasExited) { + Write-Host -NoNewline ("`rInstalling... " + $Spinner[$i % $Spinner.Length]) + Start-Sleep -Milliseconds 250 + $i++ +} + +# Clear spinner line +Write-Host "`rSetup completed! " + +$ExitCode = $InstallProcess.ExitCode +if ($ExitCode -ne 0) { + Write-Host "Error installing Visual Studio Build Tools (Error: $ExitCode)" + Exit $ExitCode +} + +Write-Host "Finished installing Visual Studio Build Tools" diff --git a/.ci/windows/install-vulkan-sdk.ps1 b/.ci/windows/install-vulkan-sdk.ps1 index 1d4e1b20bf..4c5274d1b7 100755 --- a/.ci/windows/install-vulkan-sdk.ps1 +++ b/.ci/windows/install-vulkan-sdk.ps1 @@ -3,6 +3,12 @@ $ErrorActionPreference = "Stop" +# Check if running as administrator +if (-not ([bool](net session 2>$null))) { + Write-Host "This script must be run with administrator privileges!" + Exit 1 +} + $VulkanSDKVer = "1.4.321.1" $ExeFile = "vulkansdk-windows-X64-$VulkanSDKVer.exe" $Uri = "https://sdk.lunarg.com/sdk/download/$VulkanSDKVer/windows/$ExeFile" diff --git a/.gitignore b/.gitignore index 83881117ac..2b342e5145 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ Thumbs.db eden-windows-msvc artifacts *.AppImage* +/install* diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 94ac4d33f3..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: 2014 Citra Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -[submodule "libusb"] - path = externals/libusb/libusb - url = https://github.com/libusb/libusb.git diff --git a/.patch/boost/0001-clang-cl.patch b/.patch/boost/0001-clang-cl.patch new file mode 100644 index 0000000000..cdabc712cb --- /dev/null +++ b/.patch/boost/0001-clang-cl.patch @@ -0,0 +1,13 @@ +diff --git a/libs/cobalt/include/boost/cobalt/concepts.hpp b/libs/cobalt/include/boost/cobalt/concepts.hpp +index d49f2ec..a9bdb80 100644 +--- a/libs/cobalt/include/boost/cobalt/concepts.hpp ++++ b/libs/cobalt/include/boost/cobalt/concepts.hpp +@@ -62,7 +62,7 @@ struct enable_awaitables + template + concept with_get_executor = requires (T& t) + { +- {t.get_executor()} -> asio::execution::executor; ++ t.get_executor(); + }; + + diff --git a/.patch/boost/0002-use-marmasm.patch b/.patch/boost/0002-use-marmasm.patch new file mode 100644 index 0000000000..10f490b878 --- /dev/null +++ b/.patch/boost/0002-use-marmasm.patch @@ -0,0 +1,11 @@ +--- a/libs/context/CMakeLists.txt 2025-09-08 00:42:31.303651800 -0400 ++++ b/libs/context/CMakeLists.txt 2025-09-08 00:42:40.592184300 -0400 +@@ -146,7 +146,7 @@ + set(ASM_LANGUAGE ASM) + endif() + elseif(BOOST_CONTEXT_ASSEMBLER STREQUAL armasm) +- set(ASM_LANGUAGE ASM_ARMASM) ++ set(ASM_LANGUAGE ASM_MARMASM) + else() + set(ASM_LANGUAGE ASM_MASM) + endif() diff --git a/.patch/boost/0003-armasm-options.patch b/.patch/boost/0003-armasm-options.patch new file mode 100644 index 0000000000..3869f95f6f --- /dev/null +++ b/.patch/boost/0003-armasm-options.patch @@ -0,0 +1,14 @@ +diff --git a/libs/context/CMakeLists.txt b/libs/context/CMakeLists.txt +index 8210f65..0e59dd7 100644 +--- a/libs/context/CMakeLists.txt ++++ b/libs/context/CMakeLists.txt +@@ -186,7 +186,8 @@ if(BOOST_CONTEXT_IMPLEMENTATION STREQUAL "fcontext") + set_property(SOURCE ${ASM_SOURCES} APPEND PROPERTY COMPILE_OPTIONS "/safeseh") + endif() + +- else() # masm ++ # armasm doesn't support most of these options ++ elseif(NOT BOOST_CONTEXT_ASSEMBLER STREQUAL armasm) # masm + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set_property(SOURCE ${ASM_SOURCES} APPEND PROPERTY COMPILE_OPTIONS "-x" "assembler-with-cpp") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") diff --git a/.patch/cpp-jwt/0001-no-install.patch b/.patch/cpp-jwt/0001-no-install.patch deleted file mode 100644 index b5be557a53..0000000000 --- a/.patch/cpp-jwt/0001-no-install.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8c1761f..52c4ca4 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -69,42 +69,3 @@ endif() - if(CPP_JWT_BUILD_EXAMPLES) - add_subdirectory(examples) - endif() -- --# ############################################################################## --# INSTALL --# ############################################################################## -- --include(GNUInstallDirs) --include(CMakePackageConfigHelpers) --set(CPP_JWT_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}) -- --install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets) --install( -- EXPORT ${PROJECT_NAME}Targets -- DESTINATION ${CPP_JWT_CONFIG_INSTALL_DIR} -- NAMESPACE ${PROJECT_NAME}:: -- COMPONENT dev) --configure_package_config_file(cmake/Config.cmake.in ${PROJECT_NAME}Config.cmake -- INSTALL_DESTINATION ${CPP_JWT_CONFIG_INSTALL_DIR} -- NO_SET_AND_CHECK_MACRO) --write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake -- COMPATIBILITY SameMajorVersion -- ARCH_INDEPENDENT) --install( -- FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake -- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake -- DESTINATION ${CPP_JWT_CONFIG_INSTALL_DIR} -- COMPONENT dev) -- --if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON) -- set(CPP_JWT_VENDORED_NLOHMANN_JSON_INSTALL_PATTERN PATTERN "json" EXCLUDE) --endif() --install( -- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jwt/ -- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/jwt -- COMPONENT dev -- FILES_MATCHING -- PATTERN "*.hpp" -- PATTERN "*.ipp" -- PATTERN "test" EXCLUDE -- ${CPP_JWT_VENDORED_NLOHMANN_JSON_INSTALL_PATTERN}) diff --git a/.patch/cpp-jwt/0002-missing-decl.patch b/.patch/cpp-jwt/0002-missing-decl.patch deleted file mode 100644 index cd5175dbe0..0000000000 --- a/.patch/cpp-jwt/0002-missing-decl.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/include/jwt/algorithm.hpp b/include/jwt/algorithm.hpp -index 0e3b843..1156e6a 100644 ---- a/include/jwt/algorithm.hpp -+++ b/include/jwt/algorithm.hpp -@@ -64,6 +64,8 @@ using verify_func_t = verify_result_t (*) (const jwt::string_view key, - const jwt::string_view head, - const jwt::string_view jwt_sign); - -+verify_result_t is_secret_a_public_key(const jwt::string_view secret); -+ - namespace algo { - - //Me: TODO: All these can be done using code generaion. diff --git a/.patch/discord-rpc/0001-cmake-version.patch b/.patch/discord-rpc/0001-cmake-version.patch deleted file mode 100644 index 6a1609fadf..0000000000 --- a/.patch/discord-rpc/0001-cmake-version.patch +++ /dev/null @@ -1,10 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 5dad9e9..760a1b2 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -1,4 +1,4 @@ --cmake_minimum_required (VERSION 3.2.0) -+cmake_minimum_required (VERSION 3.10) - project (DiscordRPC) - - include(GNUInstallDirs) diff --git a/.patch/discord-rpc/0002-no-clang-format.patch b/.patch/discord-rpc/0002-no-clang-format.patch deleted file mode 100644 index 4b1e37c29f..0000000000 --- a/.patch/discord-rpc/0002-no-clang-format.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 760a1b2..540d643 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -12,20 +12,6 @@ file(GLOB_RECURSE ALL_SOURCE_FILES - src/*.cpp src/*.h src/*.c - ) - --# Set CLANG_FORMAT_SUFFIX if you are using custom clang-format, e.g. clang-format-5.0 --find_program(CLANG_FORMAT_CMD clang-format${CLANG_FORMAT_SUFFIX}) -- --if (CLANG_FORMAT_CMD) -- add_custom_target( -- clangformat -- COMMAND ${CLANG_FORMAT_CMD} -- -i -style=file -fallback-style=none -- ${ALL_SOURCE_FILES} -- DEPENDS -- ${ALL_SOURCE_FILES} -- ) --endif(CLANG_FORMAT_CMD) -- - # thirdparty stuff - execute_process( - COMMAND mkdir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty -diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt -index 290d761..cd2cc92 100644 ---- a/src/CMakeLists.txt -+++ b/src/CMakeLists.txt -@@ -120,10 +120,6 @@ if (${BUILD_SHARED_LIBS}) - target_compile_definitions(discord-rpc PRIVATE -DDISCORD_BUILDING_SDK) - endif(${BUILD_SHARED_LIBS}) - --if (CLANG_FORMAT_CMD) -- add_dependencies(discord-rpc clangformat) --endif(CLANG_FORMAT_CMD) -- - # install - - install( diff --git a/.patch/discord-rpc/0003-fix-cpp17.patch b/.patch/discord-rpc/0003-fix-cpp17.patch deleted file mode 100644 index 35b725d307..0000000000 --- a/.patch/discord-rpc/0003-fix-cpp17.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 540d643..5d12f3d 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -17,12 +17,14 @@ execute_process( - COMMAND mkdir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty - ERROR_QUIET - ) -+# new commit that fixes c++17 -+set(RAPIDJSON_SHA 3b2441b87f99ab65f37b141a7b548ebadb607b96) - --find_file(RAPIDJSONTEST NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH) -+find_file(RAPIDJSONTEST NAMES rapidjson rapidjson-${RAPIDJSON_SHA} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH) - if (NOT RAPIDJSONTEST) - message("no rapidjson, download") -- set(RJ_TAR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/v1.1.0.tar.gz) -- file(DOWNLOAD https://github.com/miloyip/rapidjson/archive/v1.1.0.tar.gz ${RJ_TAR_FILE}) -+ set(RJ_TAR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/${RAPIDJSON_SHA}.tar.gz) -+ file(DOWNLOAD https://github.com/miloyip/rapidjson/archive/${RAPIDJSON_SHA}.tar.gz ${RJ_TAR_FILE}) - execute_process( - COMMAND ${CMAKE_COMMAND} -E tar xzf ${RJ_TAR_FILE} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty -@@ -30,7 +32,7 @@ if (NOT RAPIDJSONTEST) - file(REMOVE ${RJ_TAR_FILE}) - endif(NOT RAPIDJSONTEST) - --find_file(RAPIDJSON NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH) -+find_file(RAPIDJSON NAMES rapidjson rapidjson-${RAPIDJSON_SHA} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH) - - add_library(rapidjson STATIC IMPORTED ${RAPIDJSON}) - diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000000..96e22629de --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1 @@ +shell=sh diff --git a/.tx/config b/.tx/config new file mode 100755 index 0000000000..fdca1f30dc --- /dev/null +++ b/.tx/config @@ -0,0 +1,21 @@ +[main] +host = https://app.transifex.com + +[o:edenemu:p:eden-emulator:r:android-translations] +file_filter = src/android/app/src/main/res/values-/strings.xml +source_file = src/android/app/src/main/res/values/strings.xml +type = ANDROID +minimum_perc = 0 +resource_name = Android Translations +replace_edited_strings = false +keep_translations = false +lang_map = zh_CN: zh-rCN, zh_TW: zh-rTW, pt_BR: pt-rBR, pt_PT: pt-rPT, vi_VN: vi, ku: ckb, ja_JP: ja, ko_KR: ko, ru_RU: ru + +[o:edenemu:p:eden-emulator:r:qt-translations] +file_filter = dist/languages/.ts +source_file = dist/languages/en.ts +type = QT +minimum_perc = 0 +resource_name = Qt Translations +replace_edited_strings = false +keep_translations = false diff --git a/CMakeLists.txt b/CMakeLists.txt index dacbc73685..1b69782a23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,12 +15,37 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(PLATFORM_LINUX ON) endif() +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CXX_CLANG ON) + if (MSVC) + set(CXX_CLANG_CL ON) + endif() +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CXX_GCC ON) +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CXX_CL ON) +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") + set(CXX_ICC ON) +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set(CXX_APPLE ON) +endif() + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules") + +# NB: this does not account for SPARC +# If you get Eden working on SPARC, please shoot crueter@crueter.xyz multiple emails +# and you will be hailed for eternity if (PLATFORM_SUN) # Terrific Solaris pkg shenanigans list(APPEND CMAKE_PREFIX_PATH "/usr/lib/qt/6.6/lib/amd64/cmake") list(APPEND CMAKE_MODULE_PATH "/usr/lib/qt/6.6/lib/amd64/cmake") + + # amazing + # absolutely incredible + list(APPEND CMAKE_PREFIX_PATH "/usr/lib/amd64/cmake") + list(APPEND CMAKE_MODULE_PATH "/usr/lib/amd64/cmake") + # For some mighty reason, doing a normal release build sometimes may not trigger # the proper -O3 switch to materialize if (CMAKE_BUILD_TYPE MATCHES "Release") @@ -29,239 +54,11 @@ if (PLATFORM_SUN) endif() endif() -set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm) - -include(DownloadExternals) -include(CMakeDependentOption) -include(CTest) - -# Disable Warnings as Errors for MSVC -if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-") -endif() - -if (PLATFORM_FREEBSD) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") -endif() - -# Set bundled sdl2/qt as dependent options. -# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion -CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF) - -set(EXT_DEFAULT ON) - -if (PLATFORM_FREEBSD) - set(EXT_DEFAULT OFF) -endif() - -CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ${EXT_DEFAULT} "ENABLE_SDL2;NOT MSVC" OFF) - -cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) - -option(ENABLE_OPENGL "Enable OpenGL" ON) -mark_as_advanced(FORCE ENABLE_OPENGL) - -option(ENABLE_QT "Enable the Qt frontend" ON) -option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) -option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF) - -CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF) - -option(YUZU_USE_CPM "Use CPM to fetch Eden dependencies if needed" ON) - -option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) -option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF) - -option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT}) -option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ${EXT_DEFAULT}) -option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ${EXT_DEFAULT}) -option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ${EXT_DEFAULT}) - -option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF) - -option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF) - -set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries") - -option(ENABLE_CUBEB "Enables the cubeb audio backend" ON) - -CMAKE_DEPENDENT_OPTION(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF) - -option(ENABLE_MICROPROFILE "Enables microprofile capabilities" OFF) - -option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") - -option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT}) - -option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON) - -option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF) - -if (YUZU_USE_CPM AND ENABLE_SDL2) - option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}") - CMAKE_DEPENDENT_OPTION(FORCE_DOWNLOAD_SDL2 "Forcefully download all bundled SDL2 builds (useful for CI)" OFF "YUZU_USE_BUNDLED_SDL2" OFF) -endif() - -CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF) - -CMAKE_DEPENDENT_OPTION(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF) - -CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF) - -CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF) - -if (PLATFORM_FREEBSD) - option(YUZU_CHECK_SUBMODULES "Check if submodules are present" OFF) -else() - option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ON) -endif() - -option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF) - -option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON) - -option(YUZU_ENABLE_PORTABLE "Allow yuzu to enable portable mode if a user folder is found in the CWD" ON) - -CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF) - -CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF) - -set(DEFAULT_ENABLE_OPENSSL ON) -if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN) - # - Windows defaults to the Schannel backend. - # - macOS defaults to the SecureTransport backend. - # - Android currently has no SSL backend as the NDK doesn't include any SSL - # library; a proper 'native' backend would have to go through Java. - # But you can force builds for those platforms to use OpenSSL if you have - # your own copy of it. - set(DEFAULT_ENABLE_OPENSSL OFF) -endif() - -if (ENABLE_WEB_SERVICE) - set(DEFAULT_ENABLE_OPENSSL ON) -endif() - -option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) - -if (YUZU_USE_CPM AND ENABLE_OPENSSL) - CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON) - CMAKE_DEPENDENT_OPTION(FORCE_DOWNLOAD_OPENSSL "Forcefully download all bundled OpenSSL builds (useful for CI)" OFF "YUZU_USE_BUNDLED_OPENSSL" OFF) -endif() - -if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) - set(vvl_version "sdk-1.3.261.1") - set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip") - if (NOT EXISTS "${vvl_zip_file}") - # Download and extract validation layer release to externals directory - set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download") - file(DOWNLOAD "${vvl_base_url}/${vvl_version}/android-binaries-${vvl_version}-android.zip" - "${vvl_zip_file}" SHOW_PROGRESS) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") - endif() - - # Copy the arm64 binary to src/android/app/main/jniLibs - set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/") - file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" - DESTINATION "${vvl_lib_path}") -endif() - -if (ANDROID) - set(CMAKE_SKIP_INSTALL_RULES ON) - set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe -endif() - -if (YUZU_USE_PRECOMPILED_HEADERS) - if (MSVC AND CCACHE) - # buildcache does not properly cache PCH files, leading to compilation errors. - # See https://github.com/mbitsnbites/buildcache/discussions/230 - message(WARNING "buildcache does not properly support Precompiled Headers. Disabling PCH") - set(DYNARMIC_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) - set(YUZU_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) - endif() -endif() -if (YUZU_USE_PRECOMPILED_HEADERS) - message(STATUS "Using Precompiled Headers.") - set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON) -endif() - - -# Default to a Release build -get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) - message(STATUS "Defaulting to a Release build") -endif() - -if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit) - if (EXISTS ${PROJECT_SOURCE_DIR}/.git/) - message(STATUS "Copying pre-commit hook") - file(COPY hooks/pre-commit DESTINATION ${PROJECT_SOURCE_DIR}/.git/hooks) - endif() -endif() - -# Sanity check : Check that all submodules are present -# ======================================================================= - -function(check_submodules_present) - file(READ "${PROJECT_SOURCE_DIR}/.gitmodules" gitmodules) - string(REGEX MATCHALL "path *= *[^ \t\r\n]*" gitmodules ${gitmodules}) - foreach(module ${gitmodules}) - string(REGEX REPLACE "path *= *" "" module ${module}) - - file(GLOB RESULT "${PROJECT_SOURCE_DIR}/${module}/*") - list(LENGTH RESULT RES_LEN) - if(RES_LEN EQUAL 0) - message(FATAL_ERROR "Git submodule ${module} not found. " - "Please run: \ngit submodule update --init --recursive") - endif() - if (EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git") - set(SUBMODULE_DIR "${PROJECT_SOURCE_DIR}/${module}") - - execute_process( - COMMAND git rev-parse --short=10 HEAD - WORKING_DIRECTORY ${SUBMODULE_DIR} - OUTPUT_VARIABLE SUBMODULE_SHA - ) - - # would probably be better to do string parsing, but whatever - execute_process( - COMMAND git remote get-url origin - WORKING_DIRECTORY ${SUBMODULE_DIR} - OUTPUT_VARIABLE SUBMODULE_URL - ) - - string(REGEX REPLACE "\n|\r" "" SUBMODULE_SHA ${SUBMODULE_SHA}) - string(REGEX REPLACE "\n|\r|\\.git" "" SUBMODULE_URL ${SUBMODULE_URL}) - - get_filename_component(SUBMODULE_NAME ${SUBMODULE_DIR} NAME) - - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${SUBMODULE_NAME}) - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${SUBMODULE_SHA}) - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${SUBMODULE_URL}) - endif() - endforeach() -endfunction() - -if(EXISTS ${PROJECT_SOURCE_DIR}/.gitmodules AND YUZU_CHECK_SUBMODULES) - check_submodules_present() -endif() -configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc - ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc - COPYONLY) -if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json) - configure_file("${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json" - "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" - COPYONLY) -endif() -if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) - message(STATUS "Downloading compatibility list for yuzu...") - file(DOWNLOAD - https://api.yuzu-emu.org/gamedb/ - "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS) -endif() -if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) - file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "") +# Needed for FFmpeg w/ VAAPI and DRM +if (PLATFORM_OPENBSD) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/X11R6/include") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/X11R6/include") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/X11R6/lib") endif() # Detect current compilation architecture and create standard definitions @@ -303,23 +100,267 @@ if (NOT DEFINED ARCHITECTURE) set(ARCHITECTURE_GENERIC 1) add_definitions(-DARCHITECTURE_GENERIC=1) endif() + message(STATUS "Target architecture: ${ARCHITECTURE}") +if (MSVC AND ARCHITECTURE_x86) + message(FATAL_ERROR "Attempting to build with the x86 environment is not supported. \ + This can typically happen if you used the Developer Command Prompt from the start menu; \ + instead, run vcvars64.bat directly, located at C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat") +endif() + +if (CXX_CLANG_CL) + add_compile_options( + # clang-cl prints literally 10000+ warnings without this + $<$:-Wno-unused-command-line-argument> + $<$:-Wno-unsafe-buffer-usage> + $<$:-Wno-unused-value> + $<$:-Wno-extra-semi-stmt> + $<$:-Wno-sign-conversion> + $<$:-Wno-reserved-identifier> + $<$:-Wno-deprecated-declarations> + $<$:-Wno-cast-function-type-mismatch> + $<$:/EHsc> # thanks microsoft + ) + + if (ARCHITECTURE_x86_64) + add_compile_options( + # Required CPU features for amd64 + $<$:-msse4.1> + $<$:-mcx16> + ) + endif() +endif() + +set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm) + +include(DownloadExternals) +include(CMakeDependentOption) +include(CTest) + +# Disable Warnings as Errors for MSVC +if (MSVC AND NOT CXX_CLANG) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-") +endif() + +if (PLATFORM_FREEBSD) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") +endif() + +# Set bundled sdl2/qt as dependent options. +# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion +cmake_dependent_option(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF) + +if (ENABLE_SDL2) + # TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system + cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "NOT MSVC" OFF) + option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}") +endif() + +# qt stuff +option(ENABLE_QT "Enable the Qt frontend" ON) +option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) +option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF) +cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF) +option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF) +option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF) +set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries") + +option(ENABLE_CUBEB "Enables the cubeb audio backend" ON) + +set(EXT_DEFAULT OFF) +if (MSVC OR ANDROID) + set(EXT_DEFAULT ON) +endif() +option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT}) + +# ffmpeg +option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT}) +cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF) + +# sirit +option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${EXT_DEFAULT}) + +cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF) + +cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF) +mark_as_advanced(FORCE ENABLE_OPENGL) + +option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) +option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF) + +cmake_dependent_option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF) + +option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") + +option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) +if (YUZU_USE_PRECOMPILED_HEADERS) + message(STATUS "Using Precompiled Headers.") + set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON) +endif() +option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF) +if(YUZU_ENABLE_LTO) + include(CheckIPOSupported) + check_ipo_supported(RESULT COMPILER_SUPPORTS_LTO) + if(NOT COMPILER_SUPPORTS_LTO) + message(FATAL_ERROR "Your compiler does not support interprocedural optimization (IPO). Re-run CMake with -DYUZU_ENABLE_LTO=OFF.") + endif() + set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${COMPILER_SUPPORTS_LTO}) +endif() +option(USE_CCACHE "Use ccache for compilation" OFF) +set(CCACHE_PATH "ccache" CACHE STRING "Path to ccache binary") +if(USE_CCACHE) + find_program(CCACHE_BINARY ${CCACHE_PATH}) + if(CCACHE_BINARY) + message(STATUS "Found ccache at: ${CCACHE_BINARY}") + set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY}) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BINARY}) + if (YUZU_USE_PRECOMPILED_HEADERS) + message(FATAL_ERROR "Precompiled headers are incompatible with ccache. Re-run CMake with -DYUZU_USE_PRECOMPILED_HEADERS=OFF.") + endif() + else() + message(WARNING "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}") + endif() +endif() + +# TODO(crueter): CI this? +option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON) + +option(YUZU_LEGACY "Apply patches that improve compatibility with older GPUs (e.g. Snapdragon 865) at the cost of performance" OFF) + +cmake_dependent_option(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF) +cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF) + +cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF) + +cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF) + +option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON) +set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database") + +cmake_dependent_option(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "LINUX" OFF) + +cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" ON "APPLE" OFF) + +option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF) + +set(DEFAULT_ENABLE_OPENSSL ON) +if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN) + # - Windows defaults to the Schannel backend. + # - macOS defaults to the SecureTransport backend. + # - Android currently has no SSL backend as the NDK doesn't include any SSL + # library; a proper 'native' backend would have to go through Java. + # But you can force builds for those platforms to use OpenSSL if you have + # your own copy of it. + set(DEFAULT_ENABLE_OPENSSL OFF) +endif() +if (ENABLE_WEB_SERVICE) + set(DEFAULT_ENABLE_OPENSSL ON) +endif() +option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) +if (ENABLE_OPENSSL) + cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON) +endif() + +if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) + # TODO(crueter): CPM this + set(vvl_version "1.4.321.0") + set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip") + if (NOT EXISTS "${vvl_zip_file}") + # Download and extract validation layer release to externals directory + set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download") + file(DOWNLOAD "${vvl_base_url}/vulkan-sdk-${vvl_version}/android-binaries-${vvl_version}.zip" + "${vvl_zip_file}" SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") + endif() + + # Copy the arm64 binary to src/android/app/main/jniLibs + set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/") + file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" + DESTINATION "${vvl_lib_path}") +endif() + +if (ANDROID) + set(CMAKE_SKIP_INSTALL_RULES ON) + set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe +endif() + +# We need to downgrade debug info (/Zi -> /Z7) to use an older but more cacheable format +# See https://github.com/nanoant/CMakePCHCompiler/issues/21 +if(WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") +endif() + +# Default to a Release build +get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) + message(STATUS "Defaulting to a Release build") +endif() + +if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit) + if (EXISTS ${PROJECT_SOURCE_DIR}/.git/) + message(STATUS "Copying pre-commit hook") + file(COPY hooks/pre-commit DESTINATION ${PROJECT_SOURCE_DIR}/.git/hooks) + endif() +endif() + +configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc + ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc + COPYONLY) + +if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json) + configure_file("${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json" + "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" + COPYONLY) +endif() + +if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) + message(STATUS "Downloading compatibility list for yuzu...") + file(DOWNLOAD + https://api.yuzu-emu.org/gamedb/ + "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS) +endif() + +if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) + file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "") +endif() + if (UNIX) - add_definitions(-DYUZU_UNIX=1) + add_compile_definitions(YUZU_UNIX=1) +endif() + +if (YUZU_LEGACY) + message(WARNING "Making legacy build. Performance may suffer.") + add_compile_definitions(YUZU_LEGACY) endif() if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) set(HAS_NCE 1) - add_definitions(-DHAS_NCE=1) + add_compile_definitions(HAS_NCE=1) endif() if (YUZU_ROOM) - add_definitions(-DYUZU_ROOM) + add_compile_definitions(YUZU_ROOM) +endif() + +if (ANDROID OR PLATFORM_FREEBSD OR PLATFORM_OPENBSD OR PLATFORM_SUN OR APPLE) + if(CXX_APPLE OR CXX_CLANG) + # libc++ has stop_token and jthread as experimental + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-library") + else() + # Uses glibc, mostly? + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1") + endif() endif() # Build/optimization presets -if (PLATFORM_LINUX) +if (PLATFORM_LINUX OR CXX_CLANG) if (ARCHITECTURE_x86_64) set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, v3, zen2, zen4, native") if (${YUZU_BUILD_PRESET} STREQUAL "generic") @@ -367,44 +408,28 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) include(CPMUtil) +# openssl funniness +if (ENABLE_OPENSSL) + if (YUZU_USE_BUNDLED_OPENSSL) + AddJsonPackage(openssl) + endif() + + find_package(OpenSSL 1.1.1 REQUIRED) +endif() + if (YUZU_USE_CPM) message(STATUS "Fetching needed dependencies with CPM") set(BUILD_SHARED_LIBS OFF) set(BUILD_TESTING OFF) + set(ENABLE_TESTING OFF) # TODO(crueter): renderdoc? - # openssl funniness - if (ENABLE_OPENSSL) - if (YUZU_USE_BUNDLED_OPENSSL) - AddCIPackage( - PACKAGE OpenSSL - NAME openssl - REPO crueter-ci/OpenSSL - VERSION 3.5.2 - MIN_VERSION 1.1.1 - FORCE_DOWNLOAD ${FORCE_DOWNLOAD_OPENSSL} - ) - endif() - - find_package(OpenSSL 1.1.1 REQUIRED) - endif() - # boost set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant) - AddPackage( - NAME Boost - REPO boostorg/boost - TAG boost-1.88.0 - ARTIFACT boost-1.88.0-cmake.7z - HASH e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01 - - GIT_VERSION 1.88.0 - VERSION 1.57 - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(boost) # really annoying thing where boost::headers doesn't work with cpm # TODO(crueter) investigate @@ -413,12 +438,15 @@ if (YUZU_USE_CPM) if (Boost_ADDED) if (MSVC OR ANDROID) add_compile_definitions(YUZU_BOOST_v1) - else() - message(WARNING "Using bundled Boost on a non-MSVC or Android system is not recommended. You are strongly encouraged to install Boost through your system's package manager.") endif() - if (NOT MSVC) + if (NOT MSVC OR CXX_CLANG) # boost sucks + if (PLATFORM_SUN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads") + endif() + target_compile_options(boost_heap INTERFACE -Wno-shadow) target_compile_options(boost_icl INTERFACE -Wno-shadow) target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough) @@ -426,170 +454,69 @@ if (YUZU_USE_CPM) endif() # fmt - AddPackage( - NAME fmt - REPO fmtlib/fmt - SHA 40626af88b - HASH d59f06c24339f223de4ec2afeba1c67b5835a0f350a1ffa86242a72fc3e616a6b8b21798355428d4200c75287308b66634619ffa0b52ba5bd74cc01772ea1a8a - VERSION 8 - OPTIONS - "FMT_INSTALL OFF" - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(fmt) # lz4 - AddPackage( - NAME lz4 - REPO lz4/lz4 - SHA ebb370ca83 - HASH 43600e87b35256005c0f2498fa56a77de6783937ba4cfce38c099f27c03188d097863e8a50c5779ca0a7c63c29c4f7ed0ae526ec798c1fd2e3736861b62e0a37 - SOURCE_SUBDIR build/cmake - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(lz4) if (lz4_ADDED) add_library(lz4::lz4 ALIAS lz4_static) endif() # nlohmann - AddPackage( - NAME nlohmann_json - REPO nlohmann/json - SHA 55f93686c0 - HASH b739749b066800e21154506ea150d2c5cbce8a45344177f46f884547a1399d26753166fd0df8135269ce28cf223552b1b65cd625b88c844d54753f2434900486 - VERSION 3.8 - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(nlohmann) # zlib - AddPackage( - NAME ZLIB - REPO madler/zlib - SHA 51b7f2abda - HASH 16eaf1f3752489d12fd9ce30f7b5f7cbd5cb8ff53d617005a9847ae72d937f65e01e68be747f62d7ac19fd0c9aeba9956e60f16d6b465c5fdc2f3d08b4db2e6c - VERSION 1.2 - OPTIONS - "ZLIB_BUILD_SHARED OFF" - "ZLIB_INSTALL OFF" - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(zlib) if (ZLIB_ADDED) add_library(ZLIB::ZLIB ALIAS zlibstatic) endif() # zstd - AddPackage( - NAME zstd - REPO facebook/zstd - SHA f8745da6ff - HASH 3037007f990040fe32573b46f9bef8762fd5dbeeb07ffffcbfeba51ec98167edae39bb9c87f9299efcd61c4e467c5e84f7c19f0df7799bc1fc04864a278792ee - VERSION 1.5 - SOURCE_SUBDIR build/cmake - OPTIONS - "ZSTD_BUILD_SHARED OFF" - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(zstd) - # Catch2 - if (YUZU_TESTS OR DYNARMIC_TESTS) - AddPackage( - NAME Catch2 - REPO catchorg/Catch2 - SHA 644821ce28 - HASH f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f - VERSION 3.0.1 - EXCLUDE_FROM_ALL ON - ) - endif() - - # ENet - AddPackage( - NAME enet - REPO lsalzman/enet - SHA 2662c0de09 - VERSION 1.3 - HASH 3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd - FIND_PACKAGE_ARGUMENTS "MODULE" - EXCLUDE_FROM_ALL ON - ) - - if (enet_ADDED) - target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include) + if (zstd_ADDED) + add_library(zstd::zstd ALIAS libzstd_static) + add_library(zstd::libzstd ALIAS libzstd_static) endif() # Opus - AddPackage( - NAME Opus - VERSION 1.3 - REPO "xiph/opus" - SHA 5ded705cf4 - HASH 0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203 - FIND_PACKAGE_ARGUMENTS "MODULE" - OPTIONS - "OPUS_BUILD_TESTING OFF" - "OPUS_BUILD_PROGRAMS OFF" - "OPUS_INSTALL_PKG_CONFIG_MODULE OFF" - "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF" - EXCLUDE_FROM_ALL ON - ) + AddJsonPackage(opus) - if(ENABLE_CUBEB) - AddPackage( - NAME cubeb - REPO "mozilla/cubeb" - SHA fa02160712 - HASH 82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61 - FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo - OPTIONS - "USE_SANITIZERS OFF" - "BUILD_TESTS OFF" - "BUILD_TOOLS OFF" - "BUNDLE_SPEEX ON" - EXCLUDE_FROM_ALL ON - ) - - if (cubeb_ADDED) - if (NOT MSVC) - if (TARGET speex) - target_compile_options(speex PRIVATE -Wno-sign-compare) - endif() - - set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "") - target_compile_options(cubeb INTERFACE - -Wno-implicit-const-int-float-conversion - -Wno-shadow - -Wno-missing-declarations - -Wno-return-type - -Wno-uninitialized - ) - else() - target_compile_options(cubeb PRIVATE - /wd4456 - /wd4458 - ) - endif() + if (Opus_ADDED) + if (MSVC AND CXX_CLANG) + target_compile_options(opus PRIVATE + -Wno-implicit-function-declaration + ) endif() endif() + + if (NOT TARGET Opus::opus) + add_library(Opus::opus ALIAS opus) + endif() else() # Enforce the search mode of non-required packages for better and shorter failure messages find_package(fmt 8 REQUIRED) - find_package(LLVM MODULE COMPONENTS Demangle) + + if (NOT YUZU_DISABLE_LLVM) + find_package(LLVM MODULE COMPONENTS Demangle) + endif() + find_package(nlohmann_json 3.8 REQUIRED) find_package(lz4 REQUIRED) find_package(RenderDoc MODULE) find_package(stb MODULE) - find_package(enet 1.3 MODULE) - find_package(Opus 1.3 MODULE) + + find_package(Opus 1.3 MODULE REQUIRED) find_package(ZLIB 1.2 REQUIRED) - find_package(zstd 1.5 REQUIRED) + find_package(zstd 1.5 REQUIRED MODULE) - if (ENABLE_CUBEB) - find_package(cubeb CONFIG) - endif() - - if (YUZU_TESTS) - find_package(Catch2 3.0.1 REQUIRED) + # wow + if (PLATFORM_LINUX) + find_package(Boost 1.57.0 CONFIG REQUIRED headers context system fiber) + else() + find_package(Boost 1.57.0 CONFIG REQUIRED) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID) @@ -602,121 +529,7 @@ else() endif() if(NOT TARGET Boost::headers) - AddPackage( - NAME boost_headers - REPO "boostorg/headers" - SHA 0456900fad - HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3 - BUNDLED_PACKAGE ON - EXCLUDE_FROM_ALL ON - ) -endif() - -if (ENABLE_LIBUSB) - if (PLATFORM_FREEBSD) - find_package(libusb MODULE) - else() - find_package(libusb 1.0.24 MODULE) - endif() -endif() - -# DiscordRPC -if (USE_DISCORD_PRESENCE) - AddPackage( - NAME discord-rpc - REPO "discord/discord-rpc" - SHA 963aa9f3e5 - HASH 386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde - OPTIONS - "BUILD_EXAMPLES OFF" - PATCHES - ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch - ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch - ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch - EXCLUDE_FROM_ALL ON - ) - - target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include) - add_library(DiscordRPC::discord-rpc ALIAS discord-rpc) -endif() - -# SimpleIni -AddPackage( - NAME SimpleIni - REPO brofield/simpleini - SHA 09c21bda1d - HASH 99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c - FIND_PACKAGE_ARGUMENTS "MODULE" - EXCLUDE_FROM_ALL ON -) - -# TODO(crueter): Work around this -if (NOT YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS) - find_package(PkgConfig REQUIRED) - pkg_check_modules(SPIRV-Tools REQUIRED SPIRV-Tools) -endif() - -# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package -if (ENABLE_SDL2) - # this was hard to get right, but ultimately I decided to make it so that FORCE_DOWNLOAD_SDL2 also downloads the - # external one. Really silly behavior imo but in the interest of getting something out there I'm leaving it for now - if (YUZU_USE_EXTERNAL_SDL2 OR FORCE_DOWNLOAD_SDL2) - message(STATUS "Using SDL2 from externals.") - if (NOT WIN32) - # 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) - # Yuzu-cmd also needs: Video (depends on Loadso/Dlopen) - # CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809) - set(SDL_UNUSED_SUBSYSTEMS - File Filesystem - Locale Power Render) - foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS}) - string(TOUPPER ${_SUB} _OPT) - set(SDL_${_OPT} OFF) - endforeach() - - set(HIDAPI ON) - endif() - - if (APPLE) - set(SDL_FILE ON) - endif() - - if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck") - set(SDL_HASH cc016b0046) - set(SDL_PIPEWIRE OFF) # build errors out with this on - set(SDL_SHA512SUM 34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b) - else() - set(SDL_HASH 54772f345a) - set(SDL_SHA512SUM 2a68a0e01c390043aa9d9df63d8a20a52076c88bb460ac4e0f33194ca7d9bc8fadbbcc04e7506872ac4b6354a73fbc267c036f82200da59465789b87c7d9e3a4) - endif() - - AddPackage( - NAME SDL2 - REPO "libsdl-org/SDL" - SHA ${SDL_HASH} - HASH ${SDL_SHA512SUM} - KEY ${YUZU_SYSTEM_PROFILE} - BUNDLED_PACKAGE ON - EXCLUDE_FROM_ALL ON - ) - endif() - - if (YUZU_USE_BUNDLED_SDL2) - message(STATUS "Using bundled SDL2") - AddCIPackage( - PACKAGE SDL2 - NAME SDL2 - REPO crueter-ci/SDL2 - VERSION 2.32.8 - MIN_VERSION 2.26.4 - CMAKE_FILENAME sdl2 - FORCE_DOWNLOAD ${FORCE_DOWNLOAD_SDL2} - TARGET "SDL2::SDL2" - ) - endif() - - find_package(SDL2 2.26.4 REQUIRED) + AddJsonPackage(boost_headers) endif() # List of all FFmpeg components required @@ -747,9 +560,18 @@ endfunction() add_subdirectory(externals) # pass targets from externals -find_package(VulkanHeaders) -find_package(VulkanUtilityLibraries) +find_package(libusb) find_package(VulkanMemoryAllocator) +find_package(enet) +find_package(MbedTLS) +find_package(VulkanUtilityLibraries) +find_package(SimpleIni) +find_package(SPIRV-Tools) +find_package(sirit) + +if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) + find_package(xbyak) +endif() if (ENABLE_WEB_SERVICE) find_package(httplib) @@ -759,10 +581,26 @@ if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER) find_package(cpp-jwt) endif() +if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) + find_package(oaknut) +endif() + if (ENABLE_SDL2) find_package(SDL2) endif() +if (USE_DISCORD_PRESENCE) + find_package(DiscordRPC) +endif() + +if (ENABLE_CUBEB) + find_package(cubeb) +endif() + +if (YUZU_TESTS OR DYNARMIC_TESTS) + find_package(Catch2) +endif() + if (ENABLE_QT) if (YUZU_USE_BUNDLED_QT) download_qt(6.8.3) @@ -781,6 +619,8 @@ if (ENABLE_QT) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + # yes Qt, we get it + set(QT_NO_PRIVATE_MODULE_WARNING ON) find_package(Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS GuiPrivate) elseif (UNIX AND NOT APPLE) find_package(Qt6 REQUIRED COMPONENTS DBus Gui) @@ -835,9 +675,8 @@ if (UNIX AND NOT APPLE AND NOT ANDROID) pkg_check_modules(LIBVA libva) endif() -if (NOT YUZU_USE_BUNDLED_FFMPEG) +if (NOT (YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG)) # Use system installed FFmpeg - #find_package(FFmpeg 4.3 REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) find_package(FFmpeg REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) # TODO(crueter): Version @@ -881,7 +720,7 @@ if (APPLE) list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY}) elseif (WIN32) # Target Windows 10 - add_definitions(-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00) + add_compile_definitions(_WIN32_WINNT=0x0A00 WINVER=0x0A00) set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi) if (MINGW) # PSAPI is the Process Status API @@ -951,18 +790,67 @@ if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja") ) endif() -if (YUZU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - # We will assume that if the compiler is GCC, it will attempt to use ld.bfd by default. - # Try to pick a faster linker. - find_program(LLD lld) - find_program(MOLD mold) +# Adjustments for clang-cl +if (MSVC AND CXX_CLANG) + if (ARCHITECTURE_x86_64) + set(FILE_ARCH x86_64) + elseif (ARCHITECTURE_arm64) + set(FILE_ARCH aarch64) + else() + message(FATAL_ERROR "clang-cl: Unsupported architecture ${ARCHITECTURE}") + endif() - if (MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1") - message(NOTICE "Selecting mold as linker") - add_link_options("-fuse-ld=mold") - elseif (LLD) - message(NOTICE "Selecting lld as linker") - add_link_options("-fuse-ld=lld") + AddJsonPackage(llvm-mingw) + set(LIB_PATH "${llvm-mingw_SOURCE_DIR}/libclang_rt.builtins-${FILE_ARCH}.a") + + add_library(llvm-mingw-runtime STATIC IMPORTED) + set_target_properties(llvm-mingw-runtime PROPERTIES + IMPORTED_LOCATION "${LIB_PATH}" + ) + + link_libraries(llvm-mingw-runtime) +endif() + +#[[ + search order: + - gold (GCC only) - the best, generally, but unfortunately not packaged anymore + - mold (GCC only) - generally does well on GCC + - ldd - preferred on clang + - bfd - the final fallback + - If none are found (macOS uses ld.prime, etc) just use the default linker +]] +if (YUZU_USE_FASTER_LD) + find_program(LINKER_BFD bfd) + if (LINKER_BFD) + set(LINKER bfd) + endif() + + find_program(LINKER_LLD lld) + if (LINKER_LLD) + set(LINKER lld) + endif() + + if (CXX_GCC) + find_program(LINKER_MOLD mold) + if (LINKER_MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1") + set(LINKER mold) + endif() + + find_program(LINKER_GOLD gold) + if (LINKER_GOLD) + set(LINKER gold) + endif() + endif() + + if (LINKER) + message(NOTICE "Selecting ${LINKER} as linker") + add_link_options("-fuse-ld=${LINKER}") + else() + message(WARNING "No faster linker found--using default") + endif() + + if (LINKER STREQUAL "lld" AND CXX_GCC) + message(WARNING "Using lld on GCC may cause issues with certain LTO settings. If the program fails to compile, disable YUZU_USE_FASTER_LD, or install mold or GNU gold.") endif() endif() @@ -1003,14 +891,14 @@ endif() # https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html # https://www.freedesktop.org/software/appstream/docs/ if(ENABLE_QT AND UNIX AND NOT APPLE) - install(FILES "dist/org.eden_emu.eden.desktop" + install(FILES "dist/dev.eden_emu.eden.desktop" DESTINATION "share/applications") - install(FILES "dist/org.eden_emu.eden.svg" + install(FILES "dist/dev.eden_emu.eden.svg" DESTINATION "share/icons/hicolor/scalable/apps") # TODO: these files need to be updated. - install(FILES "dist/org.eden_emu.eden.xml" + install(FILES "dist/dev.eden_emu.eden.xml" DESTINATION "share/mime/packages") - install(FILES "dist/org.eden_emu.eden.metainfo.xml" + install(FILES "dist/dev.eden_emu.eden.metainfo.xml" DESTINATION "share/metainfo") endif() diff --git a/CMakeModules/CPM.cmake b/CMakeModules/CPM.cmake index 3636ee5da0..5544d8eefe 100644 --- a/CMakeModules/CPM.cmake +++ b/CMakeModules/CPM.cmake @@ -743,9 +743,11 @@ function(CPMAddPackage) if(NOT DEFINED CPM_ARGS_NAME) set(CPM_ARGS_NAME ${nameFromUrl}) endif() - if(NOT DEFINED CPM_ARGS_VERSION) - set(CPM_ARGS_VERSION ${verFromUrl}) - endif() + + # this is dumb and should not be done + # if(NOT DEFINED CPM_ARGS_VERSION) + # set(CPM_ARGS_VERSION ${verFromUrl}) + # endif() list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS URL "${CPM_ARGS_URL}") endif() diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index 519e7e32a8..3d7b84c029 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -1,32 +1,243 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 crueter # SPDX-License-Identifier: GPL-3.0-or-later -# Created-By: crueter -# Docs will come at a later date, mostly this is to just reduce boilerplate -# and some cmake magic to allow for runtime viewing of dependency versions - -include(CMakeDependentOption) if (MSVC OR ANDROID) - set(SYSTEM_DEFAULT OFF) + set(BUNDLED_DEFAULT ON) else() - set(SYSTEM_DEFAULT ON) + set(BUNDLED_DEFAULT OFF) endif() -CMAKE_DEPENDENT_OPTION(CPMUTIL_DEFAULT_SYSTEM - "Allow usage of system packages for CPM dependencies" ${SYSTEM_DEFAULT} - "NOT ANDROID" OFF) +option(CPMUTIL_FORCE_BUNDLED + "Force bundled packages for all CPM depdendencies" ${BUNDLED_DEFAULT}) + +option(CPMUTIL_FORCE_SYSTEM + "Force system packages for all CPM dependencies (NOT RECOMMENDED)" OFF) cmake_minimum_required(VERSION 3.22) include(CPM) +# cpmfile parsing +set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json") + +if (EXISTS ${CPMUTIL_JSON_FILE}) + file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT) +else() + message(WARNING "[CPMUtil] cpmfile ${CPMUTIL_JSON_FILE} does not exist, AddJsonPackage will be a no-op") +endif() + +# Utility stuff function(cpm_utils_message level name message) message(${level} "[CPMUtil] ${name}: ${message}") endfunction() +function(array_to_list array length out) + math(EXPR range "${length} - 1") + + foreach(IDX RANGE ${range}) + string(JSON _element GET "${array}" "${IDX}") + + list(APPEND NEW_LIST ${_element}) + endforeach() + + set("${out}" "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +function(get_json_element object out member default) + string(JSON out_type ERROR_VARIABLE err TYPE "${object}" ${member}) + + if (err) + set("${out}" "${default}" PARENT_SCOPE) + return() + endif() + + string(JSON outvar GET "${object}" ${member}) + + if (out_type STREQUAL "ARRAY") + string(JSON _len LENGTH "${object}" ${member}) + # array_to_list("${outvar}" ${_len} outvar) + set("${out}_LENGTH" "${_len}" PARENT_SCOPE) + endif() + + set("${out}" "${outvar}" PARENT_SCOPE) +endfunction() + +# The preferred usage +function(AddJsonPackage) + set(oneValueArgs + NAME + + # these are overrides that can be generated at runtime, so can be defined separately from the json + DOWNLOAD_ONLY + BUNDLED_PACKAGE + ) + + set(multiValueArgs OPTIONS) + + cmake_parse_arguments(JSON "" "${oneValueArgs}" "${multiValueArgs}" + "${ARGN}") + + list(LENGTH ARGN argnLength) + + # single name argument + if(argnLength EQUAL 1) + set(JSON_NAME "${ARGV0}") + endif() + + if (NOT DEFINED CPMFILE_CONTENT) + cpm_utils_message(WARNING ${name} "No cpmfile, AddJsonPackage is a no-op") + return() + endif() + + if (NOT DEFINED JSON_NAME) + cpm_utils_message(FATAL_ERROR "json package" "No name specified") + endif() + + string(JSON object ERROR_VARIABLE err GET "${CPMFILE_CONTENT}" "${JSON_NAME}") + + if (err) + cpm_utils_message(FATAL_ERROR ${JSON_NAME} "Not found in cpmfile") + endif() + + get_json_element("${object}" package package ${JSON_NAME}) + get_json_element("${object}" repo repo "") + get_json_element("${object}" ci ci OFF) + get_json_element("${object}" version version "") + + if (ci) + get_json_element("${object}" name name "${JSON_NAME}") + get_json_element("${object}" extension extension "tar.zst") + get_json_element("${object}" min_version min_version "") + get_json_element("${object}" raw_disabled disabled_platforms "") + + if (raw_disabled) + array_to_list("${raw_disabled}" ${raw_disabled_LENGTH} disabled_platforms) + else() + set(disabled_platforms "") + endif() + + AddCIPackage( + VERSION ${version} + NAME ${name} + REPO ${repo} + PACKAGE ${package} + EXTENSION ${extension} + MIN_VERSION ${min_version} + DISABLED_PLATFORMS ${disabled_platforms} + ) + + # pass stuff to parent scope + set(${package}_ADDED "${${package}_ADDED}" + PARENT_SCOPE) + set(${package}_SOURCE_DIR "${${package}_SOURCE_DIR}" + PARENT_SCOPE) + set(${package}_BINARY_DIR "${${package}_BINARY_DIR}" + PARENT_SCOPE) + + return() + endif() + + get_json_element("${object}" hash hash "") + get_json_element("${object}" hash_suffix hash_suffix "") + get_json_element("${object}" sha sha "") + get_json_element("${object}" url url "") + get_json_element("${object}" key key "") + get_json_element("${object}" tag tag "") + get_json_element("${object}" artifact artifact "") + get_json_element("${object}" git_version git_version "") + get_json_element("${object}" git_host git_host "") + get_json_element("${object}" source_subdir source_subdir "") + get_json_element("${object}" bundled bundled "unset") + get_json_element("${object}" find_args find_args "") + get_json_element("${object}" raw_patches patches "") + + # okay here comes the fun part: REPLACEMENTS! + # first: tag gets %VERSION% replaced if applicable, with either git_version (preferred) or version + # second: artifact gets %VERSION% and %TAG% replaced accordingly (same rules for VERSION) + + if (git_version) + set(version_replace ${git_version}) + else() + set(version_replace ${version}) + endif() + + # TODO(crueter): fmt module for cmake + if (tag) + string(REPLACE "%VERSION%" "${version_replace}" tag ${tag}) + endif() + + if (artifact) + string(REPLACE "%VERSION%" "${version_replace}" artifact ${artifact}) + string(REPLACE "%TAG%" "${tag}" artifact ${artifact}) + endif() + + # format patchdir + if (raw_patches) + math(EXPR range "${raw_patches_LENGTH} - 1") + + foreach(IDX RANGE ${range}) + string(JSON _patch GET "${raw_patches}" "${IDX}") + + set(full_patch "${CMAKE_SOURCE_DIR}/.patch/${JSON_NAME}/${_patch}") + if (NOT EXISTS ${full_patch}) + cpm_utils_message(FATAL_ERROR ${JSON_NAME} "specifies patch ${full_patch} which does not exist") + endif() + + list(APPEND patches "${full_patch}") + endforeach() + endif() + # end format patchdir + + # options + get_json_element("${object}" raw_options options "") + + if (raw_options) + array_to_list("${raw_options}" ${raw_options_LENGTH} options) + endif() + + set(options ${options} ${JSON_OPTIONS}) + # end options + + # system/bundled + if (bundled STREQUAL "unset" AND DEFINED JSON_BUNDLED_PACKAGE) + set(bundled ${JSON_BUNDLED_PACKAGE}) + endif() + + AddPackage( + NAME "${package}" + VERSION "${version}" + URL "${url}" + HASH "${hash}" + HASH_SUFFIX "${hash_suffix}" + SHA "${sha}" + REPO "${repo}" + KEY "${key}" + PATCHES "${patches}" + OPTIONS "${options}" + FIND_PACKAGE_ARGUMENTS "${find_args}" + BUNDLED_PACKAGE "${bundled}" + SOURCE_SUBDIR "${source_subdir}" + + GIT_VERSION ${git_version} + GIT_HOST ${git_host} + + ARTIFACT ${artifact} + TAG ${tag} + ) + + # pass stuff to parent scope + set(${package}_ADDED "${${package}_ADDED}" + PARENT_SCOPE) + set(${package}_SOURCE_DIR "${${package}_SOURCE_DIR}" + PARENT_SCOPE) + set(${package}_BINARY_DIR "${${package}_BINARY_DIR}" + PARENT_SCOPE) + +endfunction() + function(AddPackage) cpm_set_policies() - # TODO(crueter): docs, git clone + # TODO(crueter): git clone? #[[ URL configurations, descending order of precedence: @@ -48,6 +259,7 @@ function(AddPackage) NAME VERSION GIT_VERSION + GIT_HOST REPO TAG @@ -64,10 +276,9 @@ function(AddPackage) GIT_URL KEY - DOWNLOAD_ONLY - FIND_PACKAGE_ARGUMENTS - SYSTEM_PACKAGE BUNDLED_PACKAGE + FORCE_BUNDLED_PACKAGE + FIND_PACKAGE_ARGUMENTS ) set(multiValueArgs OPTIONS PATCHES) @@ -79,11 +290,20 @@ function(AddPackage) cpm_utils_message(FATAL_ERROR "package" "No package name defined") endif() + option(${PKG_ARGS_NAME}_FORCE_SYSTEM "Force the system package for ${PKG_ARGS_NAME}") + option(${PKG_ARGS_NAME}_FORCE_BUNDLED "Force the bundled package for ${PKG_ARGS_NAME}") + + if (NOT DEFINED PKG_ARGS_GIT_HOST) + set(git_host github.com) + else() + set(git_host ${PKG_ARGS_GIT_HOST}) + endif() + if (DEFINED PKG_ARGS_URL) set(pkg_url ${PKG_ARGS_URL}) if (DEFINED PKG_ARGS_REPO) - set(pkg_git_url https://github.com/${PKG_ARGS_REPO}) + set(pkg_git_url https://${git_host}/${PKG_ARGS_REPO}) else() if (DEFINED PKG_ARGS_GIT_URL) set(pkg_git_url ${PKG_ARGS_GIT_URL}) @@ -92,7 +312,7 @@ function(AddPackage) endif() endif() elseif (DEFINED PKG_ARGS_REPO) - set(pkg_git_url https://github.com/${PKG_ARGS_REPO}) + set(pkg_git_url https://${git_host}/${PKG_ARGS_REPO}) if (DEFINED PKG_ARGS_TAG) set(pkg_key ${PKG_ARGS_TAG}) @@ -123,25 +343,23 @@ function(AddPackage) cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}") - if (DEFINED PKG_ARGS_GIT_VERSION) - set(git_version ${PKG_ARGS_VERSION}) - elseif(DEFINED PKG_ARGS_VERSION) - set(git_version ${PKG_ARGS_GIT_VERSION}) - endif() - if (NOT DEFINED PKG_ARGS_KEY) if (DEFINED PKG_ARGS_SHA) string(SUBSTRING ${PKG_ARGS_SHA} 0 4 pkg_key) cpm_utils_message(DEBUG ${PKG_ARGS_NAME} "No custom key defined, using ${pkg_key} from sha") - elseif (DEFINED git_version) - set(pkg_key ${git_version}) + elseif(DEFINED PKG_ARGS_GIT_VERSION) + set(pkg_key ${PKG_ARGS_GIT_VERSION}) cpm_utils_message(DEBUG ${PKG_ARGS_NAME} "No custom key defined, using ${pkg_key}") elseif (DEFINED PKG_ARGS_TAG) set(pkg_key ${PKG_ARGS_TAG}) cpm_utils_message(DEBUG ${PKG_ARGS_NAME} "No custom key defined, using ${pkg_key}") + elseif (DEFINED PKG_ARGS_VERSION) + set(pkg_key ${PKG_ARGS_VERSION}) + cpm_utils_message(DEBUG ${PKG_ARGS_NAME} + "No custom key defined, using ${pkg_key}") else() cpm_utils_message(WARNING ${PKG_ARGS_NAME} "Could not determine cache key, using CPM defaults") @@ -178,30 +396,67 @@ function(AddPackage) if (DEFINED hash_url) set(outfile ${CMAKE_CURRENT_BINARY_DIR}/${PKG_ARGS_NAME}.hash) - file(DOWNLOAD ${hash_url} ${outfile}) - file(READ ${outfile} pkg_hash_tmp) - file(REMOVE ${outfile}) + # TODO(crueter): This is kind of a bad solution + # because "technically" the hash is invalidated each week + # but it works for now kjsdnfkjdnfjksdn + string(TOLOWER ${PKG_ARGS_NAME} lowername) + if (NOT EXISTS ${outfile} AND NOT EXISTS ${CPM_SOURCE_CACHE}/${lowername}/${pkg_key}) + file(DOWNLOAD ${hash_url} ${outfile}) + endif() - set(pkg_hash "${hash_algo}=${pkg_hash_tmp}") + if (EXISTS ${outfile}) + file(READ ${outfile} pkg_hash_tmp) + endif() + + if (DEFINED ${pkg_hash_tmp}) + set(pkg_hash "${hash_algo}=${pkg_hash_tmp}") + endif() endif() - if (NOT CPMUTIL_DEFAULT_SYSTEM) - set(CPM_USE_LOCAL_PACKAGES OFF) - elseif (DEFINED PKG_ARGS_SYSTEM_PACKAGE) - set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE}) - elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE) + macro(set_precedence local force) + set(CPM_USE_LOCAL_PACKAGES ${local}) + set(CPM_LOCAL_PACKAGES_ONLY ${force}) + endmacro() + + #[[ + Precedence: + - package_FORCE_SYSTEM + - package_FORCE_BUNDLED + - CPMUTIL_FORCE_SYSTEM + - CPMUTIL_FORCE_BUNDLED + - BUNDLED_PACKAGE + - default to allow local + ]]# + if (PKG_ARGS_FORCE_BUNDLED_PACKAGE) + set_precedence(OFF OFF) + elseif (${PKG_ARGS_NAME}_FORCE_SYSTEM) + set_precedence(ON ON) + elseif (${PKG_ARGS_NAME}_FORCE_BUNDLED) + set_precedence(OFF OFF) + elseif (CPMUTIL_FORCE_SYSTEM) + set_precedence(ON ON) + elseif(CPMUTIL_FORCE_BUNDLED) + set_precedence(OFF OFF) + elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE AND NOT PKG_ARGS_BUNDLED_PACKAGE STREQUAL "unset") if (PKG_ARGS_BUNDLED_PACKAGE) - set(CPM_USE_LOCAL_PACKAGES OFF) + set(local OFF) else() - set(CPM_USE_LOCAL_PACKAGES ON) + set(local ON) endif() + + set_precedence(${local} OFF) else() - set(CPM_USE_LOCAL_PACKAGES ON) + set_precedence(ON OFF) + endif() + + if (DEFINED PKG_ARGS_VERSION) + list(APPEND EXTRA_ARGS + VERSION ${PKG_ARGS_VERSION} + ) endif() CPMAddPackage( NAME ${PKG_ARGS_NAME} - VERSION ${PKG_ARGS_VERSION} URL ${pkg_url} URL_HASH ${pkg_hash} CUSTOM_CACHE_KEY ${pkg_key} @@ -210,6 +465,9 @@ function(AddPackage) OPTIONS ${PKG_ARGS_OPTIONS} PATCHES ${PKG_ARGS_PATCHES} + EXCLUDE_FROM_ALL ON + + ${EXTRA_ARGS} ${PKG_ARGS_UNPARSED_ARGUMENTS} ) @@ -221,12 +479,15 @@ function(AddPackage) if (DEFINED PKG_ARGS_SHA) set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_SHA}) - elseif(DEFINED git_version) - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS - ${git_version}) + elseif (DEFINED PKG_ARGS_GIT_VERSION) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS + ${PKG_ARGS_GIT_VERSION}) elseif (DEFINED PKG_ARGS_TAG) set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_TAG}) + elseif(DEFINED PKG_ARGS_VERSION) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS + ${PKG_ARGS_VERSION}) else() cpm_utils_message(WARNING ${PKG_ARGS_NAME} "Package has no specified sha, tag, or version") @@ -257,24 +518,22 @@ function(add_ci_package key) set(ARTIFACT ${ARTIFACT_NAME}-${key}-${ARTIFACT_VERSION}.${ARTIFACT_EXT}) AddPackage( - NAME ${ARTIFACT_PACKAGE}-${key} + NAME ${ARTIFACT_PACKAGE} REPO ${ARTIFACT_REPO} TAG v${ARTIFACT_VERSION} - VERSION ${ARTIFACT_VERSION} + GIT_VERSION ${ARTIFACT_VERSION} ARTIFACT ${ARTIFACT} - KEY ${key} + KEY ${key}-${ARTIFACT_VERSION} HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ON + FORCE_BUNDLED_PACKAGE ON ) - if (NOT ARTIFACT_FORCE_DOWNLOAD OR ARTIFACT_OVERRIDE) - set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}-${key}_SOURCE_DIR} PARENT_SCOPE) - endif() + set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE) endfunction() -# TODO(crueter): doc +# TODO(crueter): we could do an AddMultiArchPackage, multiplatformpackage? +# name is the artifact name, package is for find_package override function(AddCIPackage) set(oneValueArgs VERSION @@ -282,11 +541,8 @@ function(AddCIPackage) REPO PACKAGE EXTENSION - FORCE_DOWNLOAD MIN_VERSION DISABLED_PLATFORMS - CMAKE_FILENAME - TARGET ) cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN}) @@ -316,12 +572,6 @@ function(AddCIPackage) set(ARTIFACT_EXT ${PKG_ARGS_EXTENSION}) endif() - if(NOT DEFINED PKG_ARGS_FORCE_DOWNLOAD) - set(ARTIFACT_FORCE_DOWNLOAD OFF) - else() - set(ARTIFACT_FORCE_DOWNLOAD ${PKG_ARGS_FORCE_DOWNLOAD}) - endif() - if (DEFINED PKG_ARGS_MIN_VERSION) set(ARTIFACT_MIN_VERSION ${PKG_ARGS_MIN_VERSION}) endif() @@ -336,86 +586,42 @@ function(AddCIPackage) set(ARTIFACT_REPO ${PKG_ARGS_REPO}) set(ARTIFACT_PACKAGE ${PKG_ARGS_PACKAGE}) - if ((MSVC AND ARCHITECTURE_x86_64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "windows-amd64" IN_LIST DISABLED_PLATFORMS) - # kinda hacky - if(MSVC AND ARCHITECTURE_x86_64) - set(ARTIFACT_OVERRIDE ON) - endif() - + if ((MSVC AND ARCHITECTURE_x86_64) AND NOT "windows-amd64" IN_LIST DISABLED_PLATFORMS) add_ci_package(windows-amd64) - set(ARTIFACT_OVERRIDE OFF) endif() - if ((MSVC AND ARCHITECTURE_arm64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "windows-arm64" IN_LIST DISABLED_PLATFORMS) - if(MSVC AND ARCHITECTURE_arm64) - set(ARTIFACT_OVERRIDE ON) - endif() - + if ((MSVC AND ARCHITECTURE_arm64) AND NOT "windows-arm64" IN_LIST DISABLED_PLATFORMS) add_ci_package(windows-arm64) - set(ARTIFACT_OVERRIDE OFF) endif() - if (ANDROID OR ARTIFACT_FORCE_DOWNLOAD AND NOT "android" IN_LIST DISABLED_PLATFORMS) - if(ANDROID) - set(ARTIFACT_OVERRIDE ON) - endif() - + if (ANDROID AND NOT "android" IN_LIST DISABLED_PLATFORMS) add_ci_package(android) - set(ARTIFACT_OVERRIDE OFF) endif() - if(PLATFORM_SUN OR ARTIFACT_FORCE_DOWNLOAD AND NOT "solaris" IN_LIST DISABLED_PLATFORMS) - if(PLATFORM_SUN) - set(ARTIFACT_OVERRIDE ON) - endif() - - add_ci_package(solaris) - set(ARTIFACT_OVERRIDE OFF) + if(PLATFORM_SUN AND NOT "solaris-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(solaris-amd64) endif() - if(PLATFORM_FREEBSD OR ARTIFACT_FORCE_DOWNLOAD AND NOT "freebsd" IN_LIST DISABLED_PLATFORMS) - if(PLATFORM_FREEBSD) - set(ARTIFACT_OVERRIDE ON) - endif() - - add_ci_package(freebsd) - set(ARTIFACT_OVERRIDE OFF) + if(PLATFORM_FREEBSD AND NOT "freebsd-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(freebsd-amd64) endif() - if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "linux" IN_LIST DISABLED_PLATFORMS) - if(PLATFORM_LINUX AND ARCHITECTURE_x86_64) - set(ARTIFACT_OVERRIDE ON) - endif() - - add_ci_package(linux) - set(ARTIFACT_OVERRIDE OFF) + if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux-amd64" IN_LIST DISABLED_PLATFORMS) + add_ci_package(linux-amd64) endif() - if((PLATFORM_LINUX AND ARCHITECTURE_arm64) OR ARTIFACT_FORCE_DOWNLOAD AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS) - if(PLATFORM_LINUX AND ARCHITECTURE_arm64) - set(ARTIFACT_OVERRIDE ON) - endif() - + if((PLATFORM_LINUX AND ARCHITECTURE_arm64) AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS) add_ci_package(linux-aarch64) - set(ARTIFACT_OVERRIDE OFF) + endif() + + # TODO(crueter): macOS amd64/aarch64 split mayhaps + if (APPLE AND NOT "macos-universal" IN_LIST DISABLED_PLATFORMS) + add_ci_package(macos-universal) endif() if (DEFINED ARTIFACT_DIR) - if (NOT DEFINED PKG_ARGS_TARGET OR NOT TARGET "${PKG_ARGS_TARGET}") - include(${ARTIFACT_DIR}/${ARTIFACT_CMAKE}.cmake) - - # Overrides find package - CPMAddPackage( - NAME ${ARTIFACT_PACKAGE} - SOURCE_DIR ${ARTIFACT_DIR} - ) - - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${ARTIFACT_NAME}) - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS "https://github.com/${ARTIFACT_REPO}") # TODO(crueter) other hosts? - set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${ARTIFACT_VERSION}) - - set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE) - endif() + set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE) + set(${ARTIFACT_PACKAGE}_SOURCE_DIR "${ARTIFACT_DIR}" PARENT_SCOPE) else() find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED) endif() diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 642d7d0df1..f6e3aaa4ad 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -10,11 +10,19 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi set(package_base_url "https://github.com/eden-emulator/") set(package_repo "no_platform") set(package_extension "no_platform") + set(CACHE_KEY "") + # TODO(crueter): Need to convert ffmpeg to a CI. if (WIN32 OR FORCE_WIN_ARCHIVES) - set(CACHE_KEY "windows") - set(package_repo "ext-windows-bin/raw/master/") - set(package_extension ".7z") + if (ARCHITECTURE_arm64) + set(CACHE_KEY "windows") + set(package_repo "ext-windows-arm64-bin/raw/master/") + set(package_extension ".zip") + elseif(ARCHITECTURE_x86_64) + set(CACHE_KEY "windows") + set(package_repo "ext-windows-bin/raw/master/") + set(package_extension ".7z") + endif() elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(CACHE_KEY "linux") set(package_repo "ext-linux-bin/raw/master/") @@ -26,9 +34,11 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi else() message(FATAL_ERROR "No package available for this platform") endif() - set(package_url "${package_base_url}${package_repo}") - set(full_url ${package_url}${remote_path}${lib_name}${package_extension}) + string(CONCAT package_url "${package_base_url}" "${package_repo}") + string(CONCAT full_url "${package_url}" "${remote_path}" "${lib_name}" "${package_extension}") + message(STATUS "Resolved bundled URL: ${full_url}") + # TODO(crueter): DELETE THIS ENTIRELY, GLORY BE TO THE CI! AddPackage( NAME ${cpm_key} VERSION ${version} @@ -39,35 +49,12 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi # TODO(crueter): hash ) - set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE) - message(STATUS "Using bundled binaries at ${${cpm_key}_SOURCE_DIR}") -endfunction() - -function(download_win_archives) - set(FORCE_WIN_ARCHIVES ON) - set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") - - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1) - - set(FORCE_WIN_ARCHIVES OFF) -endfunction() - -function(download_moltenvk_external platform version) - set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK") - set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar") - if (NOT EXISTS ${MOLTENVK_DIR}) - if (NOT EXISTS ${MOLTENVK_TAR}) - file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar - ${MOLTENVK_TAR} SHOW_PROGRESS) - endif() - - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") + if (DEFINED ${cpm_key}_SOURCE_DIR) + set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE) + message(STATUS "Using bundled binaries at ${${cpm_key}_SOURCE_DIR}") + else() + message(FATAL_ERROR "AddPackage did not set ${cpm_key}_SOURCE_DIR") endif() - - # Add the MoltenVK library path to the prefix so find_library can locate it. - list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}") - set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) endfunction() # Determine installation parameters for OS, architecture, and compiler @@ -109,7 +96,7 @@ function(determine_qt_parameters target host_out type_out arch_out arch_path_out set(host "linux") set(type "desktop") set(arch "linux_gcc_64") - set(arch_path "linux") + set(arch_path "gcc_64") endif() set(${host_out} "${host}" PARENT_SCOPE) @@ -144,56 +131,79 @@ function(download_qt_configuration prefix_out target host type arch arch_path ba set(install_args -c "${CURRENT_MODULE_DIR}/aqt_config.ini") if (tool) set(prefix "${base_path}/Tools") - set(install_args ${install_args} install-tool --outputdir ${base_path} ${host} desktop ${target}) + list(APPEND install_args install-tool --outputdir "${base_path}" "${host}" desktop "${target}") else() set(prefix "${base_path}/${target}/${arch_path}") - set(install_args ${install_args} install-qt --outputdir ${base_path} ${host} ${type} ${target} ${arch} -m qt_base) + list(APPEND install_args install-qt --outputdir "${base_path}" "${host}" "${type}" "${target}" "${arch}" -m qt_base) if (YUZU_USE_QT_MULTIMEDIA) - set(install_args ${install_args} qtmultimedia) + list(APPEND install_args qtmultimedia) endif() if (YUZU_USE_QT_WEB_ENGINE) - set(install_args ${install_args} qtpositioning qtwebchannel qtwebengine) + list(APPEND install_args qtpositioning qtwebchannel qtwebengine) endif() - if (NOT ${YUZU_QT_MIRROR} STREQUAL "") + if (NOT "${YUZU_QT_MIRROR}" STREQUAL "") message(STATUS "Using Qt mirror ${YUZU_QT_MIRROR}") - set(install_args ${install_args} -b ${YUZU_QT_MIRROR}) + list(APPEND install_args -b "${YUZU_QT_MIRROR}") endif() endif() - message(STATUS "Install Args ${install_args}") + message(STATUS "Install Args: ${install_args}") + if (NOT EXISTS "${prefix}") message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}") set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.3.0") if (WIN32) set(aqt_path "${base_path}/aqt.exe") if (NOT EXISTS "${aqt_path}") - file(DOWNLOAD - ${AQT_PREBUILD_BASE_URL}/aqt.exe - ${aqt_path} SHOW_PROGRESS) + file(DOWNLOAD "${AQT_PREBUILD_BASE_URL}/aqt.exe" "${aqt_path}" SHOW_PROGRESS) + endif() + execute_process(COMMAND "${aqt_path}" ${install_args} + WORKING_DIRECTORY "${base_path}" + RESULT_VARIABLE aqt_res + OUTPUT_VARIABLE aqt_out + ERROR_VARIABLE aqt_err) + if (NOT aqt_res EQUAL 0) + message(FATAL_ERROR "aqt.exe failed: ${aqt_err}") endif() - execute_process(COMMAND ${aqt_path} ${install_args} - WORKING_DIRECTORY ${base_path}) elseif (APPLE) set(aqt_path "${base_path}/aqt-macos") if (NOT EXISTS "${aqt_path}") - file(DOWNLOAD - ${AQT_PREBUILD_BASE_URL}/aqt-macos - ${aqt_path} SHOW_PROGRESS) + file(DOWNLOAD "${AQT_PREBUILD_BASE_URL}/aqt-macos" "${aqt_path}" SHOW_PROGRESS) + endif() + execute_process(COMMAND chmod +x "${aqt_path}") + execute_process(COMMAND "${aqt_path}" ${install_args} + WORKING_DIRECTORY "${base_path}" + RESULT_VARIABLE aqt_res + ERROR_VARIABLE aqt_err) + if (NOT aqt_res EQUAL 0) + message(FATAL_ERROR "aqt-macos failed: ${aqt_err}") endif() - execute_process(COMMAND chmod +x ${aqt_path}) - execute_process(COMMAND ${aqt_path} ${install_args} - WORKING_DIRECTORY ${base_path}) else() + find_program(PYTHON3_EXECUTABLE python3) + if (NOT PYTHON3_EXECUTABLE) + message(FATAL_ERROR "python3 is required to install Qt using aqt (pip mode).") + endif() set(aqt_install_path "${base_path}/aqt") file(MAKE_DIRECTORY "${aqt_install_path}") - execute_process(COMMAND python3 -m pip install --target=${aqt_install_path} aqtinstall - WORKING_DIRECTORY ${base_path}) - execute_process(COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${aqt_install_path} python3 -m aqt ${install_args} - WORKING_DIRECTORY ${base_path}) + execute_process(COMMAND "${PYTHON3_EXECUTABLE}" -m pip install --target="${aqt_install_path}" aqtinstall + WORKING_DIRECTORY "${base_path}" + RESULT_VARIABLE pip_res + ERROR_VARIABLE pip_err) + if (NOT pip_res EQUAL 0) + message(FATAL_ERROR "pip install aqtinstall failed: ${pip_err}") + endif() + + execute_process(COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH="${aqt_install_path}" "${PYTHON3_EXECUTABLE}" -m aqt ${install_args} + WORKING_DIRECTORY "${base_path}" + RESULT_VARIABLE aqt_res + ERROR_VARIABLE aqt_err) + if (NOT aqt_res EQUAL 0) + message(FATAL_ERROR "aqt (python) failed: ${aqt_err}") + endif() endif() message(STATUS "Downloaded Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path} to ${prefix}") @@ -211,7 +221,7 @@ endfunction() function(download_qt target) determine_qt_parameters("${target}" host type arch arch_path host_type host_arch host_arch_path) - get_external_prefix(qt base_path) + set(base_path "${CMAKE_BINARY_DIR}/externals/qt") file(MAKE_DIRECTORY "${base_path}") download_qt_configuration(prefix "${target}" "${host}" "${type}" "${arch}" "${arch_path}" "${base_path}") @@ -228,26 +238,34 @@ function(download_qt target) set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) endfunction() -function(download_moltenvk) -set(MOLTENVK_PLATFORM "macOS") +function(download_moltenvk version platform) + if(NOT version) + message(FATAL_ERROR "download_moltenvk: version argument is required") + endif() + if(NOT platform) + message(FATAL_ERROR "download_moltenvk: platform argument is required") + endif() -set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK") -set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar") -if (NOT EXISTS ${MOLTENVK_DIR}) -if (NOT EXISTS ${MOLTENVK_TAR}) - file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.10-rc2/MoltenVK-all.tar - ${MOLTENVK_TAR} SHOW_PROGRESS) -endif() + set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK") + set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar") -execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") -endif() + if(NOT EXISTS "${MOLTENVK_DIR}") + if(NOT EXISTS "${MOLTENVK_TAR}") + file(DOWNLOAD "https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar" + "${MOLTENVK_TAR}" SHOW_PROGRESS) + endif() -# Add the MoltenVK library path to the prefix so find_library can locate it. -list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${MOLTENVK_PLATFORM}") -set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals" + RESULT_VARIABLE tar_res + ERROR_VARIABLE tar_err + ) + if(NOT tar_res EQUAL 0) + message(FATAL_ERROR "Extracting MoltenVK failed: ${tar_err}") + endif() + endif() + list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) endfunction() -function(get_external_prefix lib_name prefix_var) - set(${prefix_var} "${CMAKE_BINARY_DIR}/externals/${lib_name}" PARENT_SCOPE) -endfunction() diff --git a/CMakeModules/FindSPIRV-Tools.cmake b/CMakeModules/FindSPIRV-Tools.cmake new file mode 100644 index 0000000000..aef74df5d9 --- /dev/null +++ b/CMakeModules/FindSPIRV-Tools.cmake @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +include(FindPackageHandleStandardArgs) + +find_package(PkgConfig QUIET) +pkg_search_module(SPIRV-Tools QUIET IMPORTED_TARGET SPIRV-Tools) +find_package_handle_standard_args(SPIRV-Tools + REQUIRED_VARS SPIRV-Tools_LINK_LIBRARIES + VERSION_VAR SPIRV-Tools_VERSION +) + +if (SPIRV-Tools_FOUND AND NOT TARGET SPIRV-Tools::SPIRV-Tools) + if (TARGET SPIRV-Tools) + add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools) + else() + add_library(SPIRV-Tools::SPIRV-Tools ALIAS PkgConfig::SPIRV-Tools) + endif() +endif() diff --git a/CMakeModules/Findzstd.cmake b/CMakeModules/Findzstd.cmake index ae3ea08653..17efec2192 100644 --- a/CMakeModules/Findzstd.cmake +++ b/CMakeModules/Findzstd.cmake @@ -3,24 +3,22 @@ include(FindPackageHandleStandardArgs) -find_package(zstd QUIET CONFIG) -if (zstd_CONSIDERED_CONFIGS) - find_package_handle_standard_args(zstd CONFIG_MODE) -else() - find_package(PkgConfig QUIET) - pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd) - find_package_handle_standard_args(zstd - REQUIRED_VARS ZSTD_LINK_LIBRARIES - VERSION_VAR ZSTD_VERSION - ) -endif() +find_package(PkgConfig QUIET) +pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd) +find_package_handle_standard_args(zstd + REQUIRED_VARS ZSTD_LINK_LIBRARIES + VERSION_VAR ZSTD_VERSION +) if (zstd_FOUND AND NOT TARGET zstd::zstd) if (TARGET zstd::libzstd_shared) add_library(zstd::zstd ALIAS zstd::libzstd_shared) + add_library(zstd::libzstd ALIAS zstd::libzstd_shared) elseif (TARGET zstd::libzstd_static) add_library(zstd::zstd ALIAS zstd::libzstd_static) + add_library(zstd::libzstd ALIAS zstd::libzstd_static) else() add_library(zstd::zstd ALIAS PkgConfig::ZSTD) + add_library(zstd::libzstd ALIAS PkgConfig::ZSTD) endif() endif() diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 3b8e996751..1ae608c085 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -1,38 +1,41 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2019 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later -# Gets a UTC timestamp and sets the provided variable to it +# generate git/build information +include(GetSCMRev) + function(get_timestamp _var) string(TIMESTAMP timestamp UTC) set(${_var} "${timestamp}" PARENT_SCOPE) endfunction() -# generate git/build information -include(GetGitRevisionDescription) -if(NOT GIT_REF_SPEC) - get_git_head_revision(GIT_REF_SPEC GIT_REV) -endif() -if(NOT GIT_DESC) - git_describe(GIT_DESC --always --long --dirty) -endif() -if (NOT GIT_BRANCH) - git_branch_name(GIT_BRANCH) -endif() get_timestamp(BUILD_DATE) -git_get_exact_tag(GIT_TAG --tags) -if (GIT_TAG MATCHES "NOTFOUND") - set(BUILD_VERSION "${GIT_DESC}") - set(IS_DEV_BUILD true) -else() - set(BUILD_VERSION ${GIT_TAG}) +if (DEFINED GIT_RELEASE) + set(BUILD_VERSION "${GIT_TAG}") + set(GIT_REFSPEC "${GIT_RELEASE}") set(IS_DEV_BUILD false) +else() + string(SUBSTRING ${GIT_COMMIT} 0 10 BUILD_VERSION) + set(BUILD_VERSION "${BUILD_VERSION}-${GIT_REFSPEC}") + set(IS_DEV_BUILD true) endif() +set(GIT_DESC ${BUILD_VERSION}) + # Generate cpp with Git revision from template # Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well set(REPO_NAME "Eden") -set(BUILD_ID ${GIT_BRANCH}) +set(BUILD_ID ${GIT_REFSPEC}) set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ") +set(CXX_COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") + +# Auto-updater metadata! Must somewhat mirror GitHub API endpoint +set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com") +set(BUILD_AUTO_UPDATE_API "http://api.github.com") +set(BUILD_AUTO_UPDATE_REPO "eden-emulator/Releases") configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY) diff --git a/CMakeModules/GetSCMRev.cmake b/CMakeModules/GetSCMRev.cmake new file mode 100644 index 0000000000..ee5ce6a91c --- /dev/null +++ b/CMakeModules/GetSCMRev.cmake @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +include(GetGitRevisionDescription) + +function(trim var) + string(REGEX REPLACE "\n" "" new "${${var}}") + set(${var} ${new} PARENT_SCOPE) +endfunction() + +set(TAG_FILE ${CMAKE_SOURCE_DIR}/GIT-TAG) +set(REF_FILE ${CMAKE_SOURCE_DIR}/GIT-REFSPEC) +set(COMMIT_FILE ${CMAKE_SOURCE_DIR}/GIT-COMMIT) +set(RELEASE_FILE ${CMAKE_SOURCE_DIR}/GIT-RELEASE) + +if (EXISTS ${REF_FILE} AND EXISTS ${COMMIT_FILE}) + file(READ ${REF_FILE} GIT_REFSPEC) + file(READ ${COMMIT_FILE} GIT_COMMIT) +else() + get_git_head_revision(GIT_REFSPEC GIT_COMMIT) + git_branch_name(GIT_REFSPEC) + if (GIT_REFSPEC MATCHES "NOTFOUND") + set(GIT_REFSPEC 1.0.0) + set(GIT_COMMIT stable) + endif() +endif() + +if (EXISTS ${TAG_FILE}) + file(READ ${TAG_FILE} GIT_TAG) +else() + git_describe(GIT_TAG --tags --abbrev=0) + if (GIT_TAG MATCHES "NOTFOUND") + set(GIT_TAG "${GIT_REFSPEC}") + endif() +endif() + +if (EXISTS ${RELEASE_FILE}) + file(READ ${RELEASE_FILE} GIT_RELEASE) + trim(GIT_RELEASE) + message(STATUS "Git release: ${GIT_RELEASE}") +endif() + +trim(GIT_REFSPEC) +trim(GIT_COMMIT) +trim(GIT_TAG) + +message(STATUS "Git commit: ${GIT_COMMIT}") +message(STATUS "Git tag: ${GIT_TAG}") +message(STATUS "Git refspec: ${GIT_REFSPEC}") diff --git a/CMakeModules/WindowsCopyFiles.cmake b/CMakeModules/WindowsCopyFiles.cmake index 08b598365d..a4afeb77bf 100644 --- a/CMakeModules/WindowsCopyFiles.cmake +++ b/CMakeModules/WindowsCopyFiles.cmake @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later @@ -12,16 +15,25 @@ set(__windows_copy_files YES) # Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR. # This copying happens post-build. -function(windows_copy_files TARGET SOURCE_DIR DEST_DIR) - # windows commandline expects the / to be \ so switch them - string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR}) - string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR}) +if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + function(windows_copy_files TARGET SOURCE_DIR DEST_DIR) + # windows commandline expects the / to be \ so switch them + string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR}) + string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR}) - # /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output - # cmake adds an extra check for command success which doesn't work too well with robocopy - # so trick it into thinking the command was successful with the || cmd /c "exit /b 0" - add_custom_command(TARGET ${TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} - COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0" - ) -endfunction() + # /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output + # cmake adds an extra check for command success which doesn't work too well with robocopy + # so trick it into thinking the command was successful with the || cmd /c "exit /b 0" + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} + COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0" + ) + endfunction() +else() + function(windows_copy_files TARGET SOURCE_DIR DEST_DIR) + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} + COMMAND cp -ra ${SOURCE_DIR}/. ${DEST_DIR} + ) + endfunction() +endif() diff --git a/README.md b/README.md index 70f2c81296..c5aa17ad1e 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ A list of supported games will be available in future. Please be patient. Check out our [website](https://eden-emu.dev) for the latest news on exciting features, monthly progress reports, and more! +[![Packaging status](https://repology.org/badge/vertical-allrepos/eden-emulator.svg)](https://repology.org/project/eden-emulator/versions) + ## Development Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/kXAmGCXBGD) or [Revolt](https://rvlt.gg/qKgFEAbH). @@ -55,14 +57,15 @@ You can also follow us on [X (Twitter)](https://x.com/edenemuofficial) for updat If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Revolt to learn more about the current state of the emulator. +See the [sign-up instructions](docs/SIGNUP.md) for information on registration. + +Alternatively, if you wish to add translations, go to the [Eden project on Transifex](https://app.transifex.com/edenemu/eden-emulator) and review [the translations README](./dist/languages). + ## Building -* **Windows**: [Windows Building Guide](./docs/build/Windows.md) -* **Linux**: [Linux Building Guide](./docs/build/Linux.md) -* **Android**: [Android Building Guide](./docs/build/Android.md) -* **Solaris**: [Solaris Building Guide](./docs/build/Solaris.md) -* **FreeBSD**: [FreeBSD Building Guide](./docs/build/FreeBSD.md) -* **macOS**: [macOS Building Guide](./docs/build/macOS.md) +See the [General Build Guide](docs/Build.md) + +For information on provided development tooling, see the [Tools directory](./tools) ## Download diff --git a/cpmfile.json b/cpmfile.json new file mode 100644 index 0000000000..e9e53ed326 --- /dev/null +++ b/cpmfile.json @@ -0,0 +1,98 @@ +{ + "openssl": { + "ci": true, + "package": "OpenSSL", + "name": "openssl", + "repo": "crueter-ci/OpenSSL", + "version": "3.6.0", + "min_version": "1.1.1", + "disabled_platforms": [ + "macos-universal" + ] + }, + "boost": { + "package": "Boost", + "repo": "boostorg/boost", + "tag": "boost-%VERSION%", + "artifact": "%TAG%-cmake.tar.xz", + "hash": "4fb7f6fde92762305aad8754d7643cd918dd1f3f67e104e9ab385b18c73178d72a17321354eb203b790b6702f2cf6d725a5d6e2dfbc63b1e35f9eb59fb42ece9", + "git_version": "1.89.0", + "version": "1.57", + "find_args": "CONFIG", + "patches": [ + "0001-clang-cl.patch", + "0002-use-marmasm.patch", + "0003-armasm-options.patch" + ] + }, + "fmt": { + "repo": "fmtlib/fmt", + "tag": "%VERSION%", + "hash": "c4ab814c20fbad7e3f0ae169125a4988a2795631194703251481dc36b18da65c886c4faa9acd046b0a295005217b3689eb0126108a9ba5aac2ca909aae263c2f", + "version": "8", + "git_version": "12.0.0" + }, + "lz4": { + "name": "lz4", + "repo": "lz4/lz4", + "sha": "ebb370ca83", + "hash": "43600e87b35256005c0f2498fa56a77de6783937ba4cfce38c099f27c03188d097863e8a50c5779ca0a7c63c29c4f7ed0ae526ec798c1fd2e3736861b62e0a37", + "source_subdir": "build/cmake" + }, + "nlohmann": { + "package": "nlohmann_json", + "repo": "nlohmann/json", + "tag": "v%VERSION%", + "hash": "6cc1e86261f8fac21cc17a33da3b6b3c3cd5c116755651642af3c9e99bb3538fd42c1bd50397a77c8fb6821bc62d90e6b91bcdde77a78f58f2416c62fc53b97d", + "version": "3.8", + "git_version": "3.12.0" + }, + "zlib": { + "package": "ZLIB", + "repo": "madler/zlib", + "tag": "v%VERSION%", + "hash": "8c9642495bafd6fad4ab9fb67f09b268c69ff9af0f4f20cf15dfc18852ff1f312bd8ca41de761b3f8d8e90e77d79f2ccacd3d4c5b19e475ecf09d021fdfe9088", + "version": "1.2", + "git_version": "1.3.1", + "options": [ + "ZLIB_BUILD_SHARED OFF", + "ZLIB_INSTALL OFF" + ] + }, + "zstd": { + "repo": "facebook/zstd", + "sha": "b8d6101fba", + "hash": "a6c8e5272214fd3e65e03ae4fc375f452bd2f646623886664ee23e239e35751cfc842db4d34a84a8039d89fc8f76556121f2a4ae350d017bdff5e22150f9c3de", + "version": "1.5", + "source_subdir": "build/cmake", + "find_args": "MODULE", + "options": [ + "ZSTD_BUILD_SHARED OFF" + ] + }, + "opus": { + "package": "Opus", + "repo": "crueter/opus", + "sha": "ab19c44fad", + "hash": "79d0d015b19e74ce6076197fc32b86fe91d724a0b5a79e86adfc4bdcb946ece384e252adbbf742b74d03040913b70bb0e9556eafa59ef20e42d2f3f4d6f2859a", + "version": "1.3", + "find_args": "MODULE", + "options": [ + "OPUS_PRESUME_NEON ON" + ] + }, + "boost_headers": { + "repo": "boostorg/headers", + "sha": "95930ca8f5", + "hash": "d1dece16f3b209109de02123c537bfe1adf07a62b16c166367e7e5d62e0f7c323bf804c89b3192dd6871bc58a9d879d25a1cc3f7b9da0e497cf266f165816e2a", + "bundled": true + }, + "llvm-mingw": { + "repo": "misc/llvm-mingw", + "git_host": "git.crueter.xyz", + "tag": "%VERSION%", + "version": "20250828", + "artifact": "clang-rt-builtins.tar.zst", + "hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181" + } +} diff --git a/dist/org.eden_emu.eden.desktop b/dist/dev.eden_emu.eden.desktop similarity index 95% rename from dist/org.eden_emu.eden.desktop rename to dist/dev.eden_emu.eden.desktop index d012ab6d07..5d2d7cd8c5 100644 --- a/dist/org.eden_emu.eden.desktop +++ b/dist/dev.eden_emu.eden.desktop @@ -10,7 +10,7 @@ Type=Application Name=Eden GenericName=Switch Emulator Comment=Nintendo Switch video game console emulator -Icon=org.eden_emu.eden +Icon=dev.eden_emu.eden TryExec=eden Exec=eden %f Categories=Game;Emulator;Qt; diff --git a/dist/org.eden_emu.eden.metainfo.xml b/dist/dev.eden_emu.eden.metainfo.xml similarity index 100% rename from dist/org.eden_emu.eden.metainfo.xml rename to dist/dev.eden_emu.eden.metainfo.xml diff --git a/dist/org.eden_emu.eden.svg b/dist/dev.eden_emu.eden.svg similarity index 100% rename from dist/org.eden_emu.eden.svg rename to dist/dev.eden_emu.eden.svg diff --git a/dist/org.eden_emu.eden.xml b/dist/dev.eden_emu.eden.xml similarity index 100% rename from dist/org.eden_emu.eden.xml rename to dist/dev.eden_emu.eden.xml diff --git a/dist/icons/controller/applet_dual_joycon.png b/dist/icons/controller/applet_dual_joycon.png index 32e0a04ae5..f1701453a9 100644 Binary files a/dist/icons/controller/applet_dual_joycon.png and b/dist/icons/controller/applet_dual_joycon.png differ diff --git a/dist/icons/controller/applet_dual_joycon_dark.png b/dist/icons/controller/applet_dual_joycon_dark.png index 6adc663561..da9367b5f3 100644 Binary files a/dist/icons/controller/applet_dual_joycon_dark.png and b/dist/icons/controller/applet_dual_joycon_dark.png differ diff --git a/dist/icons/controller/applet_dual_joycon_dark_disabled.png b/dist/icons/controller/applet_dual_joycon_dark_disabled.png index 208603ee78..a4d38b633d 100644 Binary files a/dist/icons/controller/applet_dual_joycon_dark_disabled.png and b/dist/icons/controller/applet_dual_joycon_dark_disabled.png differ diff --git a/dist/icons/controller/applet_dual_joycon_disabled.png b/dist/icons/controller/applet_dual_joycon_disabled.png index 43950618da..f3cb35bbdd 100644 Binary files a/dist/icons/controller/applet_dual_joycon_disabled.png and b/dist/icons/controller/applet_dual_joycon_disabled.png differ diff --git a/dist/icons/controller/applet_dual_joycon_midnight.png b/dist/icons/controller/applet_dual_joycon_midnight.png index c7edea8a35..e3f42bb99b 100644 Binary files a/dist/icons/controller/applet_dual_joycon_midnight.png and b/dist/icons/controller/applet_dual_joycon_midnight.png differ diff --git a/dist/icons/controller/applet_dual_joycon_midnight_disabled.png b/dist/icons/controller/applet_dual_joycon_midnight_disabled.png index ee1aafc858..ac5cf51179 100644 Binary files a/dist/icons/controller/applet_dual_joycon_midnight_disabled.png and b/dist/icons/controller/applet_dual_joycon_midnight_disabled.png differ diff --git a/dist/icons/controller/applet_handheld.png b/dist/icons/controller/applet_handheld.png index 7f8dd22275..c16361b913 100644 Binary files a/dist/icons/controller/applet_handheld.png and b/dist/icons/controller/applet_handheld.png differ diff --git a/dist/icons/controller/applet_handheld_dark.png b/dist/icons/controller/applet_handheld_dark.png index 41f6d7aea9..a994041fd5 100644 Binary files a/dist/icons/controller/applet_handheld_dark.png and b/dist/icons/controller/applet_handheld_dark.png differ diff --git a/dist/icons/controller/applet_handheld_dark_disabled.png b/dist/icons/controller/applet_handheld_dark_disabled.png index 5a136ddd1d..6a083a60e1 100644 Binary files a/dist/icons/controller/applet_handheld_dark_disabled.png and b/dist/icons/controller/applet_handheld_dark_disabled.png differ diff --git a/dist/icons/controller/applet_handheld_disabled.png b/dist/icons/controller/applet_handheld_disabled.png index 53f8ce7adc..1ebda184e9 100644 Binary files a/dist/icons/controller/applet_handheld_disabled.png and b/dist/icons/controller/applet_handheld_disabled.png differ diff --git a/dist/icons/controller/applet_handheld_midnight.png b/dist/icons/controller/applet_handheld_midnight.png index 7188b91545..5183f4bb69 100644 Binary files a/dist/icons/controller/applet_handheld_midnight.png and b/dist/icons/controller/applet_handheld_midnight.png differ diff --git a/dist/icons/controller/applet_handheld_midnight_disabled.png b/dist/icons/controller/applet_handheld_midnight_disabled.png index 6ccfc32536..4021d05a1d 100644 Binary files a/dist/icons/controller/applet_handheld_midnight_disabled.png and b/dist/icons/controller/applet_handheld_midnight_disabled.png differ diff --git a/dist/icons/controller/applet_pro_controller.png b/dist/icons/controller/applet_pro_controller.png index e322588558..d6b49c3be2 100644 Binary files a/dist/icons/controller/applet_pro_controller.png and b/dist/icons/controller/applet_pro_controller.png differ diff --git a/dist/icons/controller/applet_pro_controller_dark.png b/dist/icons/controller/applet_pro_controller_dark.png index c122b7b11e..5f411af617 100644 Binary files a/dist/icons/controller/applet_pro_controller_dark.png and b/dist/icons/controller/applet_pro_controller_dark.png differ diff --git a/dist/icons/controller/applet_pro_controller_midnight.png b/dist/icons/controller/applet_pro_controller_midnight.png index 622e57fa13..1749c68162 100644 Binary files a/dist/icons/controller/applet_pro_controller_midnight.png and b/dist/icons/controller/applet_pro_controller_midnight.png differ diff --git a/dist/icons/controller/applet_single_joycon_left.png b/dist/icons/controller/applet_single_joycon_left.png index 47c44d43a7..e0ab49e6e6 100644 Binary files a/dist/icons/controller/applet_single_joycon_left.png and b/dist/icons/controller/applet_single_joycon_left.png differ diff --git a/dist/icons/controller/applet_single_joycon_left_dark.png b/dist/icons/controller/applet_single_joycon_left_dark.png index 69530b69ce..0ca0661a63 100644 Binary files a/dist/icons/controller/applet_single_joycon_left_dark.png and b/dist/icons/controller/applet_single_joycon_left_dark.png differ diff --git a/dist/icons/controller/applet_single_joycon_left_dark_disabled.png b/dist/icons/controller/applet_single_joycon_left_dark_disabled.png index cfe4b1475c..d602f99f00 100644 Binary files a/dist/icons/controller/applet_single_joycon_left_dark_disabled.png and b/dist/icons/controller/applet_single_joycon_left_dark_disabled.png differ diff --git a/dist/icons/controller/applet_single_joycon_left_disabled.png b/dist/icons/controller/applet_single_joycon_left_disabled.png index c0102dc20c..8014f80093 100644 Binary files a/dist/icons/controller/applet_single_joycon_left_disabled.png and b/dist/icons/controller/applet_single_joycon_left_disabled.png differ diff --git a/dist/icons/controller/applet_single_joycon_left_midnight.png b/dist/icons/controller/applet_single_joycon_left_midnight.png index 56522bccb3..14fad854a6 100644 Binary files a/dist/icons/controller/applet_single_joycon_left_midnight.png and b/dist/icons/controller/applet_single_joycon_left_midnight.png differ diff --git a/dist/icons/controller/applet_single_joycon_left_midnight_disabled.png b/dist/icons/controller/applet_single_joycon_left_midnight_disabled.png index 62434c188d..29acc86547 100644 Binary files a/dist/icons/controller/applet_single_joycon_left_midnight_disabled.png and b/dist/icons/controller/applet_single_joycon_left_midnight_disabled.png differ diff --git a/dist/icons/controller/applet_single_joycon_right.png b/dist/icons/controller/applet_single_joycon_right.png index b0d4fba906..0270668d04 100644 Binary files a/dist/icons/controller/applet_single_joycon_right.png and b/dist/icons/controller/applet_single_joycon_right.png differ diff --git a/dist/icons/controller/applet_single_joycon_right_dark.png b/dist/icons/controller/applet_single_joycon_right_dark.png index af26cce4bb..5e49cad49e 100644 Binary files a/dist/icons/controller/applet_single_joycon_right_dark.png and b/dist/icons/controller/applet_single_joycon_right_dark.png differ diff --git a/dist/icons/controller/applet_single_joycon_right_dark_disabled.png b/dist/icons/controller/applet_single_joycon_right_dark_disabled.png index b33efab42a..93a7d6cc92 100644 Binary files a/dist/icons/controller/applet_single_joycon_right_dark_disabled.png and b/dist/icons/controller/applet_single_joycon_right_dark_disabled.png differ diff --git a/dist/icons/controller/applet_single_joycon_right_disabled.png b/dist/icons/controller/applet_single_joycon_right_disabled.png index 01ca383226..caee64b747 100644 Binary files a/dist/icons/controller/applet_single_joycon_right_disabled.png and b/dist/icons/controller/applet_single_joycon_right_disabled.png differ diff --git a/dist/icons/controller/applet_single_joycon_right_midnight.png b/dist/icons/controller/applet_single_joycon_right_midnight.png index 5bf70e21e1..dc3be54eef 100644 Binary files a/dist/icons/controller/applet_single_joycon_right_midnight.png and b/dist/icons/controller/applet_single_joycon_right_midnight.png differ diff --git a/dist/icons/controller/applet_single_joycon_right_midnight_disabled.png b/dist/icons/controller/applet_single_joycon_right_midnight_disabled.png index e6693b0270..9b539dcb69 100644 Binary files a/dist/icons/controller/applet_single_joycon_right_midnight_disabled.png and b/dist/icons/controller/applet_single_joycon_right_midnight_disabled.png differ diff --git a/dist/icons/overlay/arrow_left.png b/dist/icons/overlay/arrow_left.png index a5d4fecfe6..00eaf6f279 100644 Binary files a/dist/icons/overlay/arrow_left.png and b/dist/icons/overlay/arrow_left.png differ diff --git a/dist/icons/overlay/arrow_left_dark.png b/dist/icons/overlay/arrow_left_dark.png index f73672a591..c84e33ead4 100644 Binary files a/dist/icons/overlay/arrow_left_dark.png and b/dist/icons/overlay/arrow_left_dark.png differ diff --git a/dist/icons/overlay/arrow_right.png b/dist/icons/overlay/arrow_right.png index e47ee94bd8..44308c5918 100644 Binary files a/dist/icons/overlay/arrow_right.png and b/dist/icons/overlay/arrow_right.png differ diff --git a/dist/icons/overlay/arrow_right_dark.png b/dist/icons/overlay/arrow_right_dark.png index 91cf83d2c5..7a6e2a62e2 100644 Binary files a/dist/icons/overlay/arrow_right_dark.png and b/dist/icons/overlay/arrow_right_dark.png differ diff --git a/dist/icons/overlay/button_A_dark.png b/dist/icons/overlay/button_A_dark.png index d6b5514fab..20f4869f01 100644 Binary files a/dist/icons/overlay/button_A_dark.png and b/dist/icons/overlay/button_A_dark.png differ diff --git a/dist/icons/overlay/button_B_dark.png b/dist/icons/overlay/button_B_dark.png index 3acbeddcd6..981aadb1d4 100644 Binary files a/dist/icons/overlay/button_B_dark.png and b/dist/icons/overlay/button_B_dark.png differ diff --git a/dist/icons/overlay/button_L.png b/dist/icons/overlay/button_L.png index 77838369ee..5acf8a242e 100644 Binary files a/dist/icons/overlay/button_L.png and b/dist/icons/overlay/button_L.png differ diff --git a/dist/icons/overlay/button_L_dark.png b/dist/icons/overlay/button_L_dark.png index c96a5e8681..59a08da1bb 100644 Binary files a/dist/icons/overlay/button_L_dark.png and b/dist/icons/overlay/button_L_dark.png differ diff --git a/dist/icons/overlay/button_R.png b/dist/icons/overlay/button_R.png index 4e55539544..f4b97b23fb 100644 Binary files a/dist/icons/overlay/button_R.png and b/dist/icons/overlay/button_R.png differ diff --git a/dist/icons/overlay/button_R_dark.png b/dist/icons/overlay/button_R_dark.png index ed13199c4a..c66203ee9b 100644 Binary files a/dist/icons/overlay/button_R_dark.png and b/dist/icons/overlay/button_R_dark.png differ diff --git a/dist/icons/overlay/button_X_dark.png b/dist/icons/overlay/button_X_dark.png index b2c83d0c11..4c80f373bf 100644 Binary files a/dist/icons/overlay/button_X_dark.png and b/dist/icons/overlay/button_X_dark.png differ diff --git a/dist/icons/overlay/button_Y_dark.png b/dist/icons/overlay/button_Y_dark.png index 0f3e4df25f..661eb5b43d 100644 Binary files a/dist/icons/overlay/button_Y_dark.png and b/dist/icons/overlay/button_Y_dark.png differ diff --git a/dist/icons/overlay/button_minus.png b/dist/icons/overlay/button_minus.png index 7b315fe79d..10ec120e95 100644 Binary files a/dist/icons/overlay/button_minus.png and b/dist/icons/overlay/button_minus.png differ diff --git a/dist/icons/overlay/button_minus_dark.png b/dist/icons/overlay/button_minus_dark.png index 6dfcdc1b5f..7d33559b76 100644 Binary files a/dist/icons/overlay/button_minus_dark.png and b/dist/icons/overlay/button_minus_dark.png differ diff --git a/dist/icons/overlay/button_plus.png b/dist/icons/overlay/button_plus.png index 4d8090d7db..fa625fd178 100644 Binary files a/dist/icons/overlay/button_plus.png and b/dist/icons/overlay/button_plus.png differ diff --git a/dist/icons/overlay/button_plus_dark.png b/dist/icons/overlay/button_plus_dark.png index abe8b9c95c..3faf46e033 100644 Binary files a/dist/icons/overlay/button_plus_dark.png and b/dist/icons/overlay/button_plus_dark.png differ diff --git a/dist/icons/overlay/button_press_stick_dark.png b/dist/icons/overlay/button_press_stick_dark.png index 757d0ab292..4953738737 100644 Binary files a/dist/icons/overlay/button_press_stick_dark.png and b/dist/icons/overlay/button_press_stick_dark.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_a.png b/dist/icons/overlay/controller_single_joycon_left_a.png index e0f5c2ad4f..e4dac234a2 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_a.png and b/dist/icons/overlay/controller_single_joycon_left_a.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_a_dark.png b/dist/icons/overlay/controller_single_joycon_left_a_dark.png index 53e04781e6..fa36ee03f9 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_a_dark.png and b/dist/icons/overlay/controller_single_joycon_left_a_dark.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_b.png b/dist/icons/overlay/controller_single_joycon_left_b.png index 7429450a33..bafa4847d4 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_b.png and b/dist/icons/overlay/controller_single_joycon_left_b.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_b_dark.png b/dist/icons/overlay/controller_single_joycon_left_b_dark.png index 3bd97a8eb6..df06dc4ec6 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_b_dark.png and b/dist/icons/overlay/controller_single_joycon_left_b_dark.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_x.png b/dist/icons/overlay/controller_single_joycon_left_x.png index 4615172a33..27a5310424 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_x.png and b/dist/icons/overlay/controller_single_joycon_left_x.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_x_dark.png b/dist/icons/overlay/controller_single_joycon_left_x_dark.png index 119e3091af..4074a22f06 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_x_dark.png and b/dist/icons/overlay/controller_single_joycon_left_x_dark.png differ diff --git a/dist/icons/overlay/controller_single_joycon_left_y.png b/dist/icons/overlay/controller_single_joycon_left_y.png index 24421d8b91..6f53699c50 100644 Binary files a/dist/icons/overlay/controller_single_joycon_left_y.png and b/dist/icons/overlay/controller_single_joycon_left_y.png differ diff --git a/dist/icons/overlay/osk_button_B.png b/dist/icons/overlay/osk_button_B.png index 2664b5923b..b572d5d7b9 100644 Binary files a/dist/icons/overlay/osk_button_B.png and b/dist/icons/overlay/osk_button_B.png differ diff --git a/dist/icons/overlay/osk_button_B_dark.png b/dist/icons/overlay/osk_button_B_dark.png index 1bd3745719..c92c41887c 100644 Binary files a/dist/icons/overlay/osk_button_B_dark.png and b/dist/icons/overlay/osk_button_B_dark.png differ diff --git a/dist/icons/overlay/osk_button_B_dark_disabled.png b/dist/icons/overlay/osk_button_B_dark_disabled.png index 3b88e393cb..df992e6d94 100644 Binary files a/dist/icons/overlay/osk_button_B_dark_disabled.png and b/dist/icons/overlay/osk_button_B_dark_disabled.png differ diff --git a/dist/icons/overlay/osk_button_B_disabled.png b/dist/icons/overlay/osk_button_B_disabled.png index 0f35cd8f26..ead1fa0423 100644 Binary files a/dist/icons/overlay/osk_button_B_disabled.png and b/dist/icons/overlay/osk_button_B_disabled.png differ diff --git a/dist/icons/overlay/osk_button_Y.png b/dist/icons/overlay/osk_button_Y.png index 2cd1934818..0a10b01b64 100644 Binary files a/dist/icons/overlay/osk_button_Y.png and b/dist/icons/overlay/osk_button_Y.png differ diff --git a/dist/icons/overlay/osk_button_Y_dark.png b/dist/icons/overlay/osk_button_Y_dark.png index 0cce567d3f..71e578002a 100644 Binary files a/dist/icons/overlay/osk_button_Y_dark.png and b/dist/icons/overlay/osk_button_Y_dark.png differ diff --git a/dist/icons/overlay/osk_button_Y_dark_disabled.png b/dist/icons/overlay/osk_button_Y_dark_disabled.png index de619efa32..279cde5418 100644 Binary files a/dist/icons/overlay/osk_button_Y_dark_disabled.png and b/dist/icons/overlay/osk_button_Y_dark_disabled.png differ diff --git a/dist/icons/overlay/osk_button_Y_disabled.png b/dist/icons/overlay/osk_button_Y_disabled.png index 8d607bc121..6cb53245ad 100644 Binary files a/dist/icons/overlay/osk_button_Y_disabled.png and b/dist/icons/overlay/osk_button_Y_disabled.png differ diff --git a/dist/icons/overlay/osk_button_plus.png b/dist/icons/overlay/osk_button_plus.png index 9f97874192..b87bc71161 100644 Binary files a/dist/icons/overlay/osk_button_plus.png and b/dist/icons/overlay/osk_button_plus.png differ diff --git a/dist/icons/overlay/osk_button_plus_dark.png b/dist/icons/overlay/osk_button_plus_dark.png index dbe7b0c66c..7701651085 100644 Binary files a/dist/icons/overlay/osk_button_plus_dark.png and b/dist/icons/overlay/osk_button_plus_dark.png differ diff --git a/dist/icons/overlay/osk_button_plus_dark_disabled.png b/dist/icons/overlay/osk_button_plus_dark_disabled.png index a79af6501c..fe53a66e71 100644 Binary files a/dist/icons/overlay/osk_button_plus_dark_disabled.png and b/dist/icons/overlay/osk_button_plus_dark_disabled.png differ diff --git a/dist/icons/overlay/osk_button_plus_disabled.png b/dist/icons/overlay/osk_button_plus_disabled.png index 52ace8ecae..72ddf6e824 100644 Binary files a/dist/icons/overlay/osk_button_plus_disabled.png and b/dist/icons/overlay/osk_button_plus_disabled.png differ diff --git a/dist/icons/overlay/osk_button_shift_lock_off.png b/dist/icons/overlay/osk_button_shift_lock_off.png index b506f456fc..91259b2b86 100644 Binary files a/dist/icons/overlay/osk_button_shift_lock_off.png and b/dist/icons/overlay/osk_button_shift_lock_off.png differ diff --git a/dist/icons/overlay/osk_button_shift_lock_on.png b/dist/icons/overlay/osk_button_shift_lock_on.png index eaa4e98ed0..48003eb77a 100644 Binary files a/dist/icons/overlay/osk_button_shift_lock_on.png and b/dist/icons/overlay/osk_button_shift_lock_on.png differ diff --git a/dist/icons/overlay/osk_button_shift_on_dark.png b/dist/icons/overlay/osk_button_shift_on_dark.png index 58e0d9cf41..484d74e302 100644 Binary files a/dist/icons/overlay/osk_button_shift_on_dark.png and b/dist/icons/overlay/osk_button_shift_on_dark.png differ diff --git a/dist/languages/README.md b/dist/languages/README.md index c5ea1ada0e..12f26242ef 100644 --- a/dist/languages/README.md +++ b/dist/languages/README.md @@ -1,3 +1,7 @@ -This directory stores translation patches (TS files) for yuzu Qt frontend. This directory is linked with [yuzu project on transifex](https://www.transifex.com/yuzu-emulator/yuzu), so you can update the translation by executing `tx pull -t -a`. If you want to contribute to the translation, please go the transifex link and submit your translation there. This directory on the main repo will be synchronized with transifex periodically. +This directory stores translation patches (TS files) for yuzu Qt frontend. This directory is linked with the [Eden project on transifex](https://app.transifex.com/edenemu/eden-emulator), so you can update the translation by executing `tx pull -t -a`. If you want to contribute to the translation, please go the transifex link and submit your translation there. This directory on the main repo will be synchronized with transifex periodically. Do not directly open PRs on github to modify the translation. -Do not directly open PRs on github to modify the translation. +When creating/improving translations, please keep in mind: + +- You are responsible for providing accurate translations that do NOT contain illicit content or messages, +- Many of our developers do not speak the languages you may be translating, so will only be able to help with confusions about the source language, +- And bad-faith translations or attempts to insert illicit content may result in an immediate removal of access. diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index 72ac87ed55..48cc91f4e5 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... يتواصل مع الخادوم - + Cancel إلغاء - + Touch the top left corner <br>of your touchpad. المس الركن الأعلى الأيسر <br>من لوح اللمس - + Now touch the bottom right corner <br>of your touchpad. والآن المس الركن الأسفل يمينًا <br> من لوح اللمس. - + Configuration completed! اكتمل الضبط - + OK نعم @@ -397,281 +397,643 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - + Amiibo editor محرر أميبو - + Controller configuration إعدادات ذراع التحكم - + Data erase محو البيانات - + Error خطأ - - Net connect - - - - + Player select اختيار اللاعب - + Software keyboard لوحة المفاتيح البرمجية - - Mii Edit - - - - + Online web شبكة الإنترنت - - Shop - - - - + Photo viewer عارض الصور - + Offline web الويب غير متصل - - Login share - - - - - Wifi web auth - - - - + My page صفحتي - + Output Engine: محرك الإخراج: - + Output Device: جهاز الإخراج: - + Input Device: جهاز الإدخال: - + Mute audio كتم الصوت - + Volume: الصوت: - + Mute audio when in background كتم الصوت عندما تكون في الخلفية - + + Memory Layout + تخطيط الذاكرة + + + + Limit Speed Percent + الحد من السرعة في المئة + + + + Accuracy: + الصحة: + + + + + Backend: + :الخلفية + + + + Faster FRSQRTE and FRECPE + أسرع تقريبات جذور تربيعية متقابلة ذو نقطة عائمة وتقريبات أرقام متقابلة ذو نقطة عائمة + + + + Disable address space checks + تعطيل عمليات التحقق من مساحة العنوان + + + + API: + واجهة برمجة التطبيقات: + + + + Device: + جهاز: + + + + Resolution: + :الدقة + + + + Fullscreen Mode: + وضع ملء الشاشة: + + + + Aspect Ratio: + تناسب الابعاد: + + + + VSync Mode: + VSync وضع: + + + Accuracy Level: + مستوى الدقة: + + + + Enable Reactive Flushing + تمكين التنظيف التفاعلي + + + + Sync to framerate of video playback + المزامنة مع معدل الإطارات لتشغيل الفيديو + + + + Run the game at normal speed during video playback, even when the framerate is unlocked. + قم بتشغيل اللعبة بالسرعة العادية أثناء تشغيل الفيديو، حتى عندما يكون معدل الإطارات مفتوحًا. + + + + RNG Seed + بذرة الرقم العشوائي RNG + + + + Device Name + اسم الجهاز + + + + Language: + اللغة: + + + + Note: this can be overridden when region setting is auto-select + ملحوظة: قد يتم تجاهل هذا الإعداد عندما يحدد إعداد المنطقة على الإختيار التلقائي + + + + Region: + المنطقة: + + + + Time Zone: + المنطقة الزمنية: + + + + Sound Output Mode: + وضع إخراج الصوت: + + + + Console Mode: + وضع وحدة التحكم: + + + + Prompt for user on game boot + مطالبة المستخدم عند تشغيل اللعبة + + + + Pause emulation when in background + إيقاف المحاكاة مؤقتًا عندما تكون في الخلفية + + + + Confirm before stopping emulation + قم بالتأكيد قبل إيقاف المحاكاة + + + + Hide mouse on inactivity + إخفاء الماوس عند عدم النشاط + + + + Disable controller applet + تعطيل تطبيق التحكم + + + + Enable Gamemode + تمكين وضع اللعبة + + + + Custom frontend + الواجهة الأمامية المخصصة + + + + CPU + المعالج + + + + GPU + وحدة معالجة الرسومات + + + + Uncompressed (Best quality) + Uncompressed (أفضل جودة) + + + + BC1 (Low quality) + BC1 (جودة منخفضة) + + + + BC3 (Medium quality) + BC3 (جودة متوسطة) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + لا شيء + + + + GLSL + GLSL + + + + Normal + عادي + + + + High + عالي + + + + Auto + تلقائي + + + + Accurate + دقه + + + + Unsafe + غير آمن + + + + NCE + NCE + + + + Borderless Windowed + نوافذ بلا حدود + + + + Exclusive Fullscreen + شاشة كاملة حصرية + + + + No Video Output + لا يوجد إخراج فيديو + + + + 0.5X (360p/540p) [EXPERIMENTAL] + 0.5X (360p/540p) [تجريبي] + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [تجريبي] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [تجريبي] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest Neighbor + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + Gaussian + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + لا شيء + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + (16:9) افتراضي + + + + Force 4:3 + 4:3 فرض + + + + Force 21:9 + 21:9 فرض + + + + Force 16:10 + 16:10 فرض + + + + Stretch to Window + تمتد إلى النافذة + + + + Automatic + تلقائي + + + + + Default + افتراضي + + + + Net connect + + + + + Mii Edit + + + + + Shop + + + + + Login share + + + + + Wifi web auth + + + + Multicore CPU Emulation - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. - - Memory Layout - تخطيط الذاكرة - - - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - Limit Speed Percent - الحد من السرعة في المئة - - - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. - + Synchronize Core Speed - + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). Compatibility varies by game; many (especially older ones) may not respond well. Can help reduce stuttering at lower framerates. - - Accuracy: - الصحة: - - - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. - - - Backend: - :الخلفية - - - + Fast CPU Time - + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + Unfuse FMA (improve performance on CPUs without FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - Faster FRSQRTE and FRECPE - أسرع تقريبات جذور تربيعية متقابلة ذو نقطة عائمة وتقريبات أرقام متقابلة ذو نقطة عائمة - - - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - + Faster ASIMD instructions (32 bits only) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - + Inaccurate NaN handling - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. - - Disable address space checks - تعطيل عمليات التحقق من مساحة العنوان - - - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. - + Ignore global monitor - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. - - API: - واجهة برمجة التطبيقات: - - - + Switches between the available graphics APIs. Vulkan is recommended in most cases. - - Device: - جهاز: - - - + This setting selects the GPU to use with the Vulkan backend. - + Shader Backend: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -679,86 +1041,71 @@ SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - Resolution: - :الدقة - - - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. - + Window Adapting Filter: - + FSR Sharpness: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. - + Anti-Aliasing Method: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - Fullscreen Mode: - وضع ملء الشاشة: - - - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - Aspect Ratio: - تناسب الابعاد: - - - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use disk pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Optimize SPIRV output shader - + Runs an additional optimization pass over generated SPIRV shaders. Will increase time required for shader compilation. May slightly improve performance. @@ -766,35 +1113,35 @@ This feature is experimental. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -803,33 +1150,39 @@ stuttering at the cost of rendering issues while the texture is being decoded. - + ASTC Recompression Method: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - + VRAM Usage Mode: - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. - - VSync Mode: - VSync وضع: + + Skip CPU Inner Invalidation + - + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -837,1040 +1190,784 @@ Immediate (no synchronization) just presents whatever is available and can exhib - + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. - - Accuracy Level: - مستوى الدقة: - - - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. + + GPU Accuracy: - + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + Use asynchronous shader building (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. - + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - تمكين التنظيف التفاعلي - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - - Sync to framerate of video playback - المزامنة مع معدل الإطارات لتشغيل الفيديو - - - - Run the game at normal speed during video playback, even when the framerate is unlocked. - قم بتشغيل اللعبة بالسرعة العادية أثناء تشغيل الفيديو، حتى عندما يكون معدل الإطارات مفتوحًا. - - - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - بذرة الرقم العشوائي RNG + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - اسم الجهاز - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - - Language: - اللغة: - - - - Note: this can be overridden when region setting is auto-select - ملحوظة: قد يتم تجاهل هذا الإعداد عندما يحدد إعداد المنطقة على الإختيار التلقائي - - - - Region: - المنطقة: - - - + The region of the emulated Switch. - - Time Zone: - المنطقة الزمنية: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - وضع إخراج الصوت: - - - - Console Mode: - وضع وحدة التحكم: - - - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - مطالبة المستخدم عند تشغيل اللعبة - - - - Pause emulation when in background - إيقاف المحاكاة مؤقتًا عندما تكون في الخلفية - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - - Confirm before stopping emulation - قم بالتأكيد قبل إيقاف المحاكاة - - - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - إخفاء الماوس عند عدم النشاط - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - تعطيل تطبيق التحكم - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - - Enable Gamemode - تمكين وضع اللعبة - - - - Custom frontend - الواجهة الأمامية المخصصة - - - + Real applet - + Never - + On Load - + Always - - CPU - المعالج - - - - GPU - وحدة معالجة الرسومات - - - + CPU Asynchronous - - Uncompressed (Best quality) - Uncompressed (أفضل جودة) - - - - BC1 (Low quality) - BC1 (جودة منخفضة) - - - - BC3 (Medium quality) - BC3 (جودة متوسطة) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - لا شيء - - - - GLSL - GLSL - - - + GLASM (Assembly Shaders, NVIDIA Only) - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - عادي - - - - High - عالي - - - + Extreme - - Auto - تلقائي + + Unsafe (fast) + - - Accurate - دقه + + Safe (stable) + - - Unsafe - غير آمن - - - + Paranoid (disables most optimizations) - + Dynarmic - - NCE - NCE - - - - Borderless Windowed - نوافذ بلا حدود - - - - Exclusive Fullscreen - شاشة كاملة حصرية - - - - No Video Output - لا يوجد إخراج فيديو - - - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - - 0.5X (360p/540p) [EXPERIMENTAL] - 0.5X (360p/540p) [تجريبي] - - - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [تجريبي] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [تجريبي] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest Neighbor - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - Gaussian - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - لا شيء - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - (16:9) افتراضي - - - - Force 4:3 - 4:3 فرض - - - - Force 21:9 - 21:9 فرض - - - - Force 16:10 - 16:10 فرض - - - - Stretch to Window - تمتد إلى النافذة - - - - Automatic - تلقائي - - - - Default - افتراضي - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) اليابانية (日本語) - + American English - + French (français) الفرنسية الأوروبية (Français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية الأوروبية (Español) - + Chinese الصينية المبسطة - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية الأوروبية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese الصينية التقليدية (تايوان) - + British English الإنكليزية البريطانية - + Canadian French الفرنسية الأمريكية (كندا) - + Latin American Spanish الإسبانية الأمريكية (أمريكا اللاتينية) - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) - - + + Serbian (српски) + + + + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono صوت مونو - + Stereo صوت ستيريو - + Surround صوت سيراوند - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1879,37 +1976,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB DRAM (غير آمنة) - + Docked مركب بالمنصة - + Handheld محمول - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Always ask (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا @@ -2234,27 +2331,27 @@ When a guest attempts to open the controller applet, it is immediately closed.تسجيل - + Open Log Location فتح موقع السجل - + Global Log Filter مرشح السجل العالمي - + When checked, the max size of the log increases from 100 MB to 1 GB عند تحديده، يزيد الحد الأقصى لحجم السجل من 100 ميجا بايت إلى 1 جيجا بايت - + Enable Extended Logging** تفعيل السجل المطول - + Show Log in Console عرض السجل في الطرفية @@ -2400,7 +2497,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2462,7 +2559,7 @@ When a guest attempts to open the controller applet, it is immediately closed.** سيتم إعادة ضبط هذا تلقائيًا عند إغلاق يوزو. - + Web applet not compiled لم يتم تجميع برنامج الويب @@ -2512,7 +2609,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2521,88 +2618,88 @@ When a guest attempts to open the controller applet, it is immediately closed.بعض الإعدادات تتوفر عندما تكون اللعبة غير مشغلة. - + Applets - - + + Audio الصوت - - + + CPU المعالج - + Debug تصحيح الأخطاء - + Filesystem نظام الملفات - - + + General عام - - + + Graphics الرسومات - + GraphicsAdvanced الرسومات المتقدمة - + GraphicsExtensions - + Hotkeys الأزرار السريعة - - + + Controls ذراع التحكم - + Profiles ملفات المستخدمين - + Network الشبكة - - + + System النظام - + Game List قائمة الألعاب - + Web الشبكة @@ -2700,51 +2797,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache إعادة تعيين الذاكرة المؤقتة للبيانات الوصفية - + Select Emulated NAND Directory... الذي تمت محاكاته NAND حدد مجلد - + Select Emulated SD Directory... حدد مجلد بطاقة الذاكرة الذي تمت محاكاته - + Select Gamecard Path... أختر مسار بطاقة اللعبة - + Select Dump Directory... حدد مجلد التفريغ - + Select Mod Load Directory... حدد مجلد تحميل التعديل - The metadata cache is already empty. - الذاكرة مؤقتة للبيانات الوصفية لقائمة الألعاب فارغة مسبقا. + الذاكرة مؤقتة للبيانات الوصفية لقائمة الألعاب فارغة مسبقا. - The operation completed successfully. - أكتملت العملية بنجاح + أكتملت العملية بنجاح - The metadata cache couldn't be deleted. It might be in use or non-existent. - لا يمكن حذف الذاكرة المؤقتة للبيانات الوصفية لقائمة الألعاب. قد تكون مستخدمة الآن أو غير موجودة. + لا يمكن حذف الذاكرة المؤقتة للبيانات الوصفية لقائمة الألعاب. قد تكون مستخدمة الآن أو غير موجودة. @@ -2775,12 +2866,12 @@ When a guest attempts to open the controller applet, it is immediately closed.يوزو - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? يؤدي هذا إلى إعادة تعيين جميع الإعدادات وإزالة جميع التكوينات لكل لعبة. لن يؤدي هذا إلى حذف أدلة اللعبة أو الملفات الشخصية أو ملفات تعريف الإدخال. يتابع؟ @@ -2813,33 +2904,33 @@ When a guest attempts to open the controller applet, it is immediately closed.:لون الخلفية - + % FSR sharpening percentage (e.g. 50%) % - + Off معطل - + VSync Off VSync معطل - + Recommended مستحسن - + On مفعل - + VSync On VSync مفعل @@ -2876,14 +2967,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2915,75 +3010,75 @@ These settings are experimental, and may cause black screens. If your games fail استعادة الافتراضي - + Action فعل - + Hotkey زر إختصار - + Controller Hotkey مفتاح التحكم السريع - - - + + + Conflicting Key Sequence تسلسل أزرار متناقض مع الموجود - - + + The entered key sequence is already assigned to: %1 سبق و تم تعيين تسلسل الأزرار الذي أدخلته، مع: %1 - + [waiting] [بانتظار الرد] - + Invalid غير صالح - + Invalid hotkey settings إعدادات مفتاح الاختصار غير صالحة - + An error occurred. Please report this issue on github. حدث خطأ. يرجى الإبلاغ عن هذه المشكلة على جيثب. - + Restore Default استعادة الافتراضي - + Clear مسح - + Conflicting Button Sequence - + The default button sequence is already assigned to: %1 - + The default key sequence is already assigned to: %1 %1 تم بالفعل تعيين تسلسل المفاتيح الافتراضي إلى @@ -3303,7 +3398,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3458,7 +3553,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick العصا اليسرى @@ -3568,14 +3663,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3594,7 +3689,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus زائد @@ -3607,15 +3702,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3660,7 +3755,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick العصا اليمنى @@ -3675,241 +3770,241 @@ These settings are experimental, and may cause black screens. If your games fail تعديل - - - - + + + + Clear مسح - - - - - + + + + + [not set] [ غير معد ] - - - + + + Invert button عكس الزر - - + + Toggle button زر التبديل - + Turbo button - - + + Invert axis عكس المحاور - - - + + + Set threshold تعيين الحد الأدنى - - + + Choose a value between 0% and 100% - + Toggle axis تبديل المحور - + Set gyro threshold - + Calibrate sensor معايرة الاستشعار - + Map Analog Stick خريطة عصا التناظرية - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. - + Center axis - - + + Deadzone: %1% المنطقة الميتة: %1% - - + + Modifier Range: %1% %1% :نطاق التعديل - - + + Pro Controller Pro Controller - + Dual Joycons جوي كون ثنائي - + Left Joycon جوي كون يسار - + Right Joycon جوي كون يمين - + Handheld محمول - + GameCube Controller GameCube أداة تحكم - + Poke Ball Plus Poke Ball Plus - + NES Controller أداة تحكم NES - + SNES Controller أداة تحكم SNES - + N64 Controller أداة تحكم N64 - + Sega Genesis Sega Genesis - + Start / Pause بدء / إيقاف مؤقت - + Z Z - + Control Stick عصا التحكم - + C-Stick C-عصا - + Shake! هزة! - + [waiting] [بانتظار الرد] - + New Profile الملف الشخصي الجديد - + Enter a profile name: :أدخل اسم الملف الشخصي - - + + Create Input Profile إنشاء ملف تعريف الإدخال - + The given profile name is not valid! اسم الملف الشخصي المحدد غير صالح! - + Failed to create the input profile "%1" "%1" فشل في إنشاء ملف تعريف الإدخال - + Delete Input Profile حذف ملف تعريف الإدخال - + Failed to delete the input profile "%1" "%1" فشل في مسح ملف تعريف الإدخال - + Load Input Profile تحميل ملف تعريف الإدخال - + Failed to load the input profile "%1" "%1" فشل في تحميل ملف تعريف الإدخال - + Save Input Profile حفظ ملف تعريف الإدخال - + Failed to save the input profile "%1" "%1" فشل في حفظ ملف تعريف الإدخال @@ -3966,7 +4061,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure تعديل @@ -4002,7 +4097,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test إختبار @@ -4021,7 +4116,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">معرفة المزيد</span></a> - + %1:%2 %1:%2 @@ -4030,77 +4125,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< يوزو - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters يحتوي رقم المنفذ على أحرف غير صالحة - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 يجب أن يكون المنفذ في النطاق 0 و 65353 - + IP address is not valid غير صالح IP عنوان - + This UDP server already exists - + Unable to add more than 8 servers غير قادر على إضافة أكثر من 8 خوادم - + Testing اختبار - + Configuring تكوين - + Test Successful تم الاختبار بنجاح - + Successfully received data from the server. تم استلام البيانات من الخادم بنجاح. - + Test Failed فشل الاختبار - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. تعذر تلقي بيانات صالحة من الخادم.<br> يرجى التحقق من إعداد الخادم بشكل صحيح ومن صحة العنوان والمنفذ. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. @@ -4226,7 +4321,12 @@ Current values are %1% and %2% respectively. واجهة الشبكة - + + Enable Airplane Mode + + + + None الاسم @@ -4284,52 +4384,52 @@ Current values are %1% and %2% respectively. بعض الإعدادات تتوفر عند عدم تشغيل اللعبة - + Add-Ons الاضافات - + System النظام - + CPU المعالج - + Graphics الرسومات - + Adv. Graphics الرسومات المتقدمة - + GPU Extensions - + Audio الصوت - + Input Profiles ملفات تعريف الإدخال - + Linux Linux - + Properties خصائص @@ -4347,12 +4447,12 @@ Current values are %1% and %2% respectively. الاضافات - + Patch Name اسم الرقعة - + Version إصدار @@ -4390,27 +4490,32 @@ Current values are %1% and %2% respectively. تعيين صورة - + + Select Avatar + + + + Add إضافة - + Rename تسمية - + Remove إزالة - + Profile management is available only when game is not running. إدارة الملف الشخصي متاحة فقط عندما لا تكون اللعبة قيد التشغيل. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4418,100 +4523,185 @@ Current values are %1% and %2% respectively. %2 - + Enter Username أدخل اسم المستخدم - + Users المستخدمين - + Enter a username for the new user: :أدخل اسم مستخدم للمستخدم الجديد - + Enter a new username: :أدخل اسم مستخدم جديد - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image اختر صورة المستخدم - - JPEG Images (*.jpg *.jpeg) - صور JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + لا توجد برامج ثابتة متاحة + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + صور JPEG (*.jpg *.jpeg) + + + Error deleting image خطأ في حذف الصورة - + Error occurred attempting to overwrite previous image at: %1. %1 حدث خطأ أثناء محاولة الكتابة فوق الصورة السابقة في - + Error deleting file خطأ في حذف الملف - + Unable to delete existing file: %1. %1 غير قادر على حذف الملف الموجود - + Error creating user image directory خطأ في إنشاء مجلد صورة المستخدم - + Unable to create directory %1 for storing user images. - Error copying user image - حدث خطأ أثناء نسخ صورة المستخدم + حدث خطأ أثناء نسخ صورة المستخدم - - Unable to copy image from %1 to %2 + Error resizing user image + خطأ في تغيير حجم صورة المستخدم + + + Unable to resize image + غير قادر على تغيير حجم الصورة + + + + ConfigureProfileManagerAvatarDialog + + + Select - - Error resizing user image - خطأ في تغيير حجم صورة المستخدم + + Cancel + إلغاء - - Unable to resize image - غير قادر على تغيير حجم الصورة + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. حذف هذا المستخدم؟ سيتم حذف جميع بيانات الحفظ الخاصة بالمستخدم. - + Confirm Delete تأكيد الحذف - + Name: %1 UUID: %2 الاسم: %1 @@ -4564,7 +4754,7 @@ UUID: %2 - + Enable تفعيل @@ -4575,7 +4765,7 @@ UUID: %2 - + Not connected غير متصل @@ -4585,63 +4775,63 @@ UUID: %2 استعادة الافتراضي - + Clear مسح - + [not set] [ غير معد ] - + Invert axis عكس المحاور - - + + Deadzone: %1% المنطقة الميتة: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled لم يتم تمكين برنامج تشغيل جوي كون المباشر - + Configuring تكوين - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected الجهاز المعين الحالي غير متصل - + Unexpected driver result %1 %1 نتيجة برنامج التشغيل غير متوقع - + [waiting] [بانتظار الرد] @@ -4679,7 +4869,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4731,12 +4921,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration - + Select TAS Load Directory... @@ -4846,7 +5036,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5166,6 +5356,16 @@ Drag points to change position, or double-click table cells to edit values.Web الشبكة + + + Eden Web Service + + + + + Generate + + yuzu Web Service خدمة الويب يوزو @@ -5175,42 +5375,29 @@ Drag points to change position, or double-click table cells to edit values.بتقديمك اسم المستخدم والرمز المميز الخاص بك، فأنك توافق بالسماح ليوزو بجمع بيانات استخدام إضافية، التي قد تحتوي على بيانات تعريف المستخدم. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - تحقق + تحقق - Sign up - تسجيل + تسجيل - + Token: :الرمز - + Username: :اسم المستخدم - What is my token? - ما هو الرمز الخاص بي؟ + ما هو الرمز الخاص بي؟ - + Web Service configuration can only be changed when a public room isn't being hosted. لا يمكن تغيير تكوين خدمة الويب إلا في حالة عدم استضافة غرفة عامة. @@ -5235,12 +5422,12 @@ Drag points to change position, or double-click table cells to edit values.إعادة توليد - + Discord Presence وجود ديسكورد - + Show Current Game in your Discord Status إظهار اللعبة الحالية في حالة ديسكورد الخاصة بك @@ -5249,24 +5436,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">معرفة المزيد</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">تسجيل</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">تسجيل</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5285,10 +5456,9 @@ Drag points to change position, or double-click table cells to edit values.لم يتم التحقق من الرمز المميز - Unverified, please click Verify before saving configuration Tooltip - لم يتم التحقق منه، الرجاء النقر فوق "تحقق" قبل حفظ التكوين + لم يتم التحقق منه، الرجاء النقر فوق "تحقق" قبل حفظ التكوين Verifying... @@ -5312,20 +5482,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. فشل التحقق. تأكد من إدخال الرمز المميز الخاص بك بشكل صحيح، ومن أن اتصالك بالإنترنت يعمل. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 P1 ذراع التحكم - + &Controller P1 &P1 ذراع التحكم + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + إصدار + + DirectConnect @@ -5431,7 +5648,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5439,11 +5661,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. لقد قام مضيف الغرفة بحظرك. تحدث مع المضيف لإلغاء الحظر عليك أو تجربة غرفة مختلفة. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5501,1203 +5718,1020 @@ Please go to Configure -> System -> Network and make a selection. القياس عن بعد - + Broken Vulkan Installation Detected معطل Vulkan تم اكتشاف تثبيت - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping تشغيل لعبة - + Loading Web Applet... جارٍ تحميل برنامج الويب... - - + + Disable Web Applet تعطيل برنامج الويب - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built كمية التظليل التي يتم بناؤها حاليا - + The current selected resolution scaling multiplier. مضاعف قياس الدقة المحدد الحالي. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. سرعة المحاكاة الحالية. تشير القيم الأعلى أو الأقل من 100% إلى أن المحاكاة تعمل بشكل أسرع أو أبطأ من سويتش. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. كم عدد الإطارات في الثانية التي تعرضها اللعبة حاليًا. سيختلف هذا من لعبة إلى أخرى ومن مشهد إلى آخر. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute إلغاء الكتم - + Mute كتم - + Reset Volume إعادة ضبط مستوى الصوت - + &Clear Recent Files &مسح الملفات الحديثة - + &Continue &استأنف - + &Pause &إيقاف مؤقت - Warning Outdated Game Format - تحذير من تنسيق اللعبة القديم + تحذير من تنسيق اللعبة القديم - - + + Error while loading ROM! ROM خطأ أثناء تحميل - + The ROM format is not supported. غير مدعوم ROM تنسيق. - + An error occurred initializing the video core. حدث خطأ أثناء تهيئة مركز الفيديو. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. حدث خطأ غير معروف. يرجى الاطلاع على السجل لمزيد من التفاصيل. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... إغلاق البرامج - + Save Data حفظ البيانات - + Mod Data - + Error Opening %1 Folder %1 حدث خطأ أثناء فتح المجلد - - + + Folder does not exist! المجلد غير موجود - - Error Opening Transferable Shader Cache - - - - Failed to create the shader cache directory for this title. - فشل إنشاء مجلد ذاكرة التخزين المؤقت للتظليل لهذا العنوان. + فشل إنشاء مجلد ذاكرة التخزين المؤقت للتظليل لهذا العنوان. - Error Removing Contents - خطأ في إزالة المحتويات + خطأ في إزالة المحتويات - Error Removing Update - خطأ في إزالة التحديث + خطأ في إزالة التحديث - Error Removing DLC - DLC خطأ في إزالة + DLC خطأ في إزالة - + Remove Installed Game Contents? هل تريد إزالة محتويات اللعبة المثبتة؟ - + Remove Installed Game Update? هل تريد إزالة تحديث اللعبة المثبت؟ - + Remove Installed Game DLC? للعبة المثبتة؟ DLC إزالة المحتوى القابل للتنزيل - + Remove Entry إزالة الإدخال - - - - - - Successfully Removed - تمت الإزالة بنجاح + تمت الإزالة بنجاح - Successfully removed the installed base game. - تمت إزالة اللعبة الأساسية المثبتة بنجاح. + تمت إزالة اللعبة الأساسية المثبتة بنجاح. - The base game is not installed in the NAND and cannot be removed. - ولا يمكن إزالتها NAND لم يتم تثبيت اللعبة الأساسية في + ولا يمكن إزالتها NAND لم يتم تثبيت اللعبة الأساسية في - Successfully removed the installed update. - تمت إزالة التحديث المثبت بنجاح. + تمت إزالة التحديث المثبت بنجاح. - There is no update installed for this title. - لا يوجد تحديث مثبت لهذا العنوان. + لا يوجد تحديث مثبت لهذا العنوان. - There are no DLC installed for this title. - مثبت لهذا العنوان DLC لا يوجد أي محتوى قابل للتنزيل. + مثبت لهذا العنوان DLC لا يوجد أي محتوى قابل للتنزيل. - - Successfully removed %1 installed DLC. - - - - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? إزالة تكوين اللعبة المخصصة؟ - + Remove Cache Storage? إزالة تخزين ذاكرة التخزين المؤقت؟ - + Remove File إزالة الملف - + Remove Play Time Data إزالة بيانات زمن اللعب - + Reset play time? إعادة تعيين زمن اللعب؟ - - - Error Removing Transferable Shader Cache - - - - - - A shader cache for this title does not exist. - - - - - Successfully removed the transferable shader cache. - - - - - Failed to remove the transferable shader cache. - - - - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - Error Removing Custom Configuration - حدث خطأ أثناء إزالة التكوين المخصص + حدث خطأ أثناء إزالة التكوين المخصص - A custom configuration for this title does not exist. - لا يوجد تكوين مخصص لهذا العنوان. + لا يوجد تكوين مخصص لهذا العنوان. - Successfully removed the custom game configuration. - تمت إزالة تكوين اللعبة المخصص بنجاح. + تمت إزالة تكوين اللعبة المخصص بنجاح. - Failed to remove the custom game configuration. - فشل إزالة تكوين اللعبة المخصص. + فشل إزالة تكوين اللعبة المخصص. - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full كامل - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - - - - + + Cancel إلغاء - + RomFS Extraction Succeeded! - - - + The operation completed successfully. أكتملت العملية بنجاح - Integrity verification couldn't be performed! - لا يمكن إجراء التحقق من سلامة + لا يمكن إجراء التحقق من سلامة - File contents were not checked for validity. - لم يتم التحقق من صحة محتويات الملف. + لم يتم التحقق من صحة محتويات الملف. - - Verifying integrity... - التحقق من سلامة + التحقق من سلامة - - Integrity verification succeeded! - نجح التحقق من سلامة + نجح التحقق من سلامة - - Integrity verification failed! - فشل التحقق من سلامة + فشل التحقق من سلامة - File contents may be corrupt. - قد تكون محتويات الملف تالفة. + قد تكون محتويات الملف تالفة. - - - - Create Shortcut - إنشاء إختصار + إنشاء إختصار - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - %1 تم إنشاء اختصار بنجاح إلى + %1 تم إنشاء اختصار بنجاح إلى - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - Create Icon - إنشاء أيقونة + إنشاء أيقونة - - Cannot create icon file. Path "%1" does not exist and cannot be created. + + Warning: Outdated Game Format - + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 %1 خطأ في فتح - + Select Directory حدد المجلد - + Properties خصائص - + The game properties could not be loaded. تعذر تحميل خصائص اللعبة. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File تشغيل المِلَفّ - + Open Extracted ROM Directory - + Invalid Directory Selected تم تحديد مجلد غير صالح - + The directory you have selected does not contain a 'main' file. لا يحتوي المجلد الذي حددته على ملف رئيسي - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files تثبيت الملفات - + %n file(s) remaining - - - - - + Installing file "%1"... "%1" تثبيت الملف - - + + Install Results تثبيت النتائج - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - - - - - + %n file(s) were overwritten - - - - - + %n file(s) failed to install - - - - - + System Application تطبيق النظام - + System Archive أرشيف النظام - + System Application Update تحديث تطبيق النظام - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game اللعبة - + Game Update تحديث اللعبة - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install فشل فى التثبيت - + The title type you selected for the NCA is invalid. - + File not found لم يتم العثور على الملف - + File "%1" not found - + OK موافق - - + + Hardware requirements not met لم يتم استيفاء متطلبات الأجهزة - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. لا يلبي نظامك متطلبات الأجهزة الموصى بها. تم تعطيل الإبلاغ عن التوافق. - + Missing yuzu Account حساب يوزو مفقود - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? - + + Encryption keys are missing. + + + + Error opening URL خطأ في فتح URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? الكتابة فوق ملف اللاعب 1؟ - + Invalid config detected تم اكتشاف تكوين غير صالح - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo أميبو - - + + The current amiibo has been removed أميبو اللعبة الحالية تمت إزالته - + Error خطأ - - + + The current game is not looking for amiibos اللعبة الحالية لا تبحث عن أميبو - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo تحميل أميبو - + Error loading Amiibo data خطأ أثناء تحميل بيانات أميبو - + The selected file is not a valid amiibo الملف المحدد ليس ملف أميبو صالحًا - + The selected file is already on use الملف المحدد قيد الاستخدام بالفعل - + An unknown error occurred حدث خطأ غير معروف - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available لا توجد برامج ثابتة متاحة - Please install the firmware to use the Album applet. - الرجاء تثبيت البرنامج الثابت لاستخدام التطبيق الصغير للألبوم. + الرجاء تثبيت البرنامج الثابت لاستخدام التطبيق الصغير للألبوم. - + Album Applet التطبيق الصغير للألبوم - + Album applet is not available. Please reinstall firmware. التطبيق الصغير للألبوم غير متوفر. الرجاء إعادة تثبيت البرامج الثابتة. - Please install the firmware to use the Cabinet applet. - الرجاء تثبيت البرنامج الثابت لاستخدام برنامج الخزانة. + الرجاء تثبيت البرنامج الثابت لاستخدام برنامج الخزانة. - + Cabinet Applet التطبيق الصغير للخزانة - + Cabinet applet is not available. Please reinstall firmware. التطبيق الصغير للخزانة غير متوفر. الرجاء إعادة تثبيت البرامج الثابتة. - Please install the firmware to use the Mii editor. - Mii الرجاء تثبيت البرنامج الثابت لاستخدام محرر + Mii الرجاء تثبيت البرنامج الثابت لاستخدام محرر - + Mii Edit Applet Mii تحرير التطبيق الصغير - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet تطبيق التحكم - + Controller Menu is not available. Please reinstall firmware. قائمة التحكم غير متوفرة. الرجاء إعادة تثبيت فريموير - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot لقطة شاشة - + PNG Image (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running &إيقاف التشغيل - + &Start &بدء - + Stop R&ecording &إيقاف التسجيل - + R&ecord &تسجيل - + Building: %n shader(s) - - - - - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA NO AA - + VOLUME: MUTE الصوت: كتم الصوت - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. @@ -6710,7 +6744,7 @@ Would you like to download it? يوزو - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. هل أنت متأكد من أنك تريد إيقاف المحاكاة؟ سيتم فقدان أي تقدم غير محفوظ @@ -6723,102 +6757,102 @@ Would you like to bypass this and exit anyway? هل ترغب في تجاوز هذا والخروج على أية حال؟ - + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked مركب بالمنصة - + Handheld محمول - + Normal عادي - + High عالي - + Extreme - + Vulkan Vulkan - + OpenGL OpenGL - + Null قيمه خاليه - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6826,13 +6860,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! غير متوفر! OpenGL - + OpenGL shared contexts are not supported. @@ -6841,33 +6875,33 @@ Would you like to bypass this and exit anyway? لم يتم تجميع يوزو بدعم OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! حدث خطأ أثناء تهيئة OpenGL - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 @@ -6875,128 +6909,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite مفضلة - + Start Game بدء اللعبة - + Start Game without Custom Configuration بدء اللعبة بدون الإعدادات المخصصة - + Open Save Data Location فتح موقع بيانات الحفظ - + Open Mod Data Location فتح موقع بيانات التعديلات - + Open Transferable Pipeline Cache - + Remove إزالة - + Remove Installed Update إزالة التحديث المثبت - + Remove All Installed DLC المثبت DLC إزالة كافة محتوى - + Remove Custom Configuration إزالة التكوين المخصص - + Remove Play Time Data إزالة بيانات زمن اللعب - + Remove Cache Storage إزالة تخزين ذاكرة التخزين المؤقت - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches - + Remove All Installed Contents إزالة كافة المحتويات المثبتة - + Dump RomFS - + Dump RomFS to SDMC - + Verify Integrity التحقق من سلامة - + Copy Title ID to Clipboard نسخ معرف العنوان إلى الحافظة - + Navigate to GameDB entry - + Create Shortcut إنشاء إختصار - + Add to Desktop إضافة إلى سطح المكتب - + Add to Applications Menu إضافة إلى قائمة التطبيقات - + Configure Game @@ -7005,62 +7039,62 @@ Would you like to bypass this and exit anyway? خصائص - + Scan Subfolders مسح الملفات الداخلية - + Remove Game Directory إزالة مجلد اللعبة - + ▲ Move Up ▲ نقل للأعلى - + ▼ Move Down ▼ نقل للأسفل - + Open Directory Location فتح موقع المجلد - + Clear مسح - + Name الاسم - + Compatibility التوافق - + Add-ons الإضافات - + File type نوع الملف - + Size الحجم - + Play time زمن اللعب @@ -7068,62 +7102,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame في اللعبة - + Game starts, but crashes or major glitches prevent it from being completed. تبدأ اللعبة، لكن الأعطال أو الأخطاء الرئيسية تمنعها من الاكتمال. - + Perfect مثالي - + Game can be played without issues. يمكن لعب اللعبة بدون مشاكل. - + Playable قابل للعب - + Game functions with minor graphical or audio glitches and is playable from start to finish. تحتوي وظائف اللعبة على بعض الأخطاء الرسومية أو الصوتية البسيطة ويمكن تشغيلها من البداية إلى النهاية. - + Intro/Menu مقدمة/القائمة - + Game loads, but is unable to progress past the Start Screen. يتم تحميل اللعبة، ولكنها غير قادرة على التقدم بعد شاشة البدء. - + Won't Boot لا تشتغل - + The game crashes when attempting to startup. تعطل اللعبة عند محاولة بدء التشغيل. - + Not Tested لم تختبر - + The game has not yet been tested. اللعبة لم يتم اختبارها بعد. @@ -7131,7 +7165,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list انقر نقرًا مزدوجًا لإضافة مجلد جديد إلى قائمة الألعاب @@ -7139,24 +7173,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) - - - - - + Filter: :مرشح - + Enter pattern to filter أدخل نمط للمرشح @@ -7238,7 +7268,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7246,190 +7276,190 @@ Debug Message: Hotkeys - + Audio Mute/Unmute كتم الصوت/إلغاء كتم الصوت - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window النافذة الرئيسية - + Audio Volume Down خفض مستوى الصوت - + Audio Volume Up رفع مستوى الصوت - + Capture Screenshot لقطة شاشة - + Change Adapting Filter - + Change Docked Mode تغيير وضع الإرساء - + Change GPU Accuracy - + Configure تعديل - + Configure Current Game - + Continue/Pause Emulation استأنف/إيقاف مؤقت للمحاكاة - + Exit Fullscreen الخروج من وضع ملء الشاشة + + + Exit Eden + + Exit yuzu الخروج من يوزو - - Exit eden - - - - + Fullscreen ملء الشاشة - + Load File تحميل الملف - + Load/Remove Amiibo تحميل/إزالة أميبو - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation إعادة تشغيل المحاكاة - + Stop Emulation إيقاف المحاكاة - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit تبديل حد معدل الإطارات - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar تبديل شريط الحالة @@ -7437,22 +7467,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. الرجاء تأكيد هذه هي الملفات التي ترغب في تثبيتها. - + Installing an Update or DLC will overwrite the previously installed one. إلى استبدال التحديث المثبت مسبقًا DLC سيؤدي تثبيت التحديث أو المحتوى القابل للتنزيل - + Install تثبيت - + Install Files to NAND تثبيت الملفات الى NAND @@ -7460,7 +7490,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 لا يمكن أن يحتوي النص على أي من الأحرف التالية: @@ -7607,152 +7637,207 @@ Debug Message: &الملفات الحديثة - + + Open &Eden Folders + + + + &Emulation &المحاكاة - + &View &عرض - + &Reset Window Size &إعادة ضبط حجم النافذة - + &Debugging &تصحيح الأخطاء - + Reset Window Size to &720p 720p إعادة تعيين حجم النافذة إلى - + Reset Window Size to 720p 720p إعادة تعيين حجم النافذة إلى - + Reset Window Size to &900p 900p إعادة تعيين حجم النافذة إلى - + Reset Window Size to 900p 900p إعادة تعيين حجم النافذة إلى - + Reset Window Size to &1080p 1080p إعادة تعيين حجم النافذة إلى - + Reset Window Size to 1080p 1080p إعادة تعيين حجم النافذة إلى - + &Multiplayer &متعدد اللاعبين - + &Tools &أدوات - + &Amiibo أميبو - + &TAS - + &Create Home Menu Shortcut - + &Help &مساعدة - + &Install Files to NAND... &NAND تثبيت الملفات على - + L&oad File... &تحميل ملف - + Load &Folder... تحميل &مجلد - + E&xit &خروج - + &Pause &إيقاف مؤقت - + &Stop &إيقاف - + &Verify Installed Contents التحقق من المحتويات المثبتة - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7761,97 +7846,97 @@ Debug Message: &حول يوزو - + Single &Window Mode وضع النافذة الواحدة - + Con&figure... &الإعدادات - + Ctrl+, - + Display D&ock Widget Headers - + Show &Filter Bar عرض &شريط المرشح - + Show &Status Bar عرض &شريط الحالة - + Show Status Bar عرض شريط الحالة - + &Browse Public Game Lobby &استعراض ردهة الألعاب العامة - + &Create Room &إنشاء غرفة - + &Leave Room &مغادرة الغرفة - + &Direct Connect to Room &الاتصال المباشر بالغرفة - + &Show Current Room &عرض الغرفة الحالية - + F&ullscreen &ملء الشاشة - + &Restart &إعادة التشغيل - + Load/Remove &Amiibo... تحميل/إزالة &أميبو - + &Report Compatibility &تقرير التوافق - + Open &Mods Page فتح صفحة &التعديلات - + Open &Quickstart Guide فتح دليل البدء السريع - + &FAQ &التعليمات @@ -7860,104 +7945,112 @@ Debug Message: فتح مجلد &يوزو - + &Capture Screenshot &التقاط لقطة للشاشة - + Open &Album فتح الألبوم - + &Set Nickname and Owner &تعيين الاسم المستعار والمالك - + &Delete Game Data حذف بيانات اللعبة - + &Restore Amiibo &استعادة أميبو - + &Format Amiibo &تنسيق أميبو - + Open &Mii Editor Mii فتح محرر - + &Configure TAS... - + Configure C&urrent Game... إعدادات &اللعبة الحالية - + &Start &بدء - + &Reset &إعادة تعيين - + R&ecord &تسجيل - + Open &Controller Menu فتح قائمة التحكم - + Install Firmware - - Install Decryption Keys + + &About Eden - - - MicroProfileDialog - - &MicroProfile + + Install Decryption Keys MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8017,37 +8110,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status حالة الاتصال الحالية - + Not Connected. Click here to find a room! غير متصل. اضغط هنا للبحث عن غرفة! - + Not Connected غير متصل - + Connected متصل - + New Messages Received رسالة جديدة استقبلت - + Error خطأ - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: فشل في تحديث معلومات الغرفة. يرجى التحقق من اتصالك بالإنترنت ومحاولة استضافة الغرفة مرة أخرى. @@ -8239,56 +8332,56 @@ p, li { white-space: pre-wrap; } لا يلعب أي لعبة - + Installed SD Titles عناوين المثبتة على بطاقة الذاكرة - + Installed NAND Titles NAND عناوين المثبتة على - + System Titles عناوين النظام - + Add New Game Directory إضافة مجلد ألعاب جديد - + Favorites المفضلة - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [ غير معد ] @@ -8299,14 +8392,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + Axis %1%2 محور %1%2 @@ -8317,357 +8410,357 @@ p, li { white-space: pre-wrap; } زر %1 - - - - - - + + + + + + [unknown] [غير معروف] - - - + + + Left يسار - - - + + + Right يمين - - - + + + Down تحت - - - + + + Up فوق - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle دائرة - - + + Cross إكس - - + + Square مربع - - + + Triangle مثلث - - + + Share مشاركة - - + + Options خيارات - - + + [undefined] [غير معرف] - + %1%2 %1%2 - - + + [invalid] [غير صالح] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 %1%2محور %3 - - + + %1%2Axis %3,%4,%5 %1%2محور %3,%4,%5 - - + + %1%2Motion %3 %1%2حركة %3 - - + + %1%2Button %3 %1%2زر %3 - - + + [unused] [غير مستخدم] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L العصا اليسرى - + Stick R العصا اليمنى - + Plus زائد - + Minus ناقص - - + + Home المنزل - + Capture تصوير - + Touch اللمس - + Wheel Indicates the mouse wheel العجلة - + Backward الخلف - + Forward الأمام - + Task مهمة - + Extra إضافي - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 %1%2%3محور %4 - - + + %1%2%3Button %4 %1%2%3زر %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8785,6 +8878,298 @@ p, li { white-space: pre-wrap; } هل ترغب في إستعادة أميبو؟ + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + إلغاء + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + التحقق من سلامة + + + + + Integrity verification succeeded! + نجح التحقق من سلامة + + + + + The operation completed successfully. + أكتملت العملية بنجاح + + + + + Integrity verification failed! + فشل التحقق من سلامة + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + خطأ في إزالة المحتويات + + + + Error Removing Update + خطأ في إزالة التحديث + + + + Error Removing DLC + DLC خطأ في إزالة + + + + The base game is not installed in the NAND and cannot be removed. + ولا يمكن إزالتها NAND لم يتم تثبيت اللعبة الأساسية في + + + + There is no update installed for this title. + لا يوجد تحديث مثبت لهذا العنوان. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + تمت الإزالة بنجاح + + + + Successfully removed %1 installed DLC. + + + + + + Error Removing Transferable Shader Cache + + + + + + A shader cache for this title does not exist. + + + + + Successfully removed the transferable shader cache. + + + + + Failed to remove the transferable shader cache. + + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + حدث خطأ أثناء إزالة التكوين المخصص + + + + A custom configuration for this title does not exist. + لا يوجد تكوين مخصص لهذا العنوان. + + + + Successfully removed the custom game configuration. + تمت إزالة تكوين اللعبة المخصص بنجاح. + + + + Failed to remove the custom game configuration. + فشل إزالة تكوين اللعبة المخصص. + + + + Reset Metadata Cache + إعادة تعيين الذاكرة المؤقتة للبيانات الوصفية + + + + The metadata cache is already empty. + الذاكرة مؤقتة للبيانات الوصفية لقائمة الألعاب فارغة مسبقا. + + + + The operation completed successfully. + أكتملت العملية بنجاح + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + لا يمكن حذف الذاكرة المؤقتة للبيانات الوصفية لقائمة الألعاب. قد تكون مستخدمة الآن أو غير موجودة. + + + + Create Shortcut + إنشاء إختصار + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + %1 تم إنشاء اختصار بنجاح إلى + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + إنشاء أيقونة + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + لا توجد برامج ثابتة متاحة + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9079,7 +9464,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9087,7 +9472,7 @@ Please try again or contact the developer of the software. %2 - + Users المستخدمين @@ -9211,7 +9596,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack @@ -9219,12 +9604,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread @@ -9232,102 +9617,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable قابل للتشغيل - + paused متوقف مؤقتا - + sleeping نائم - + waiting for IPC reply - + waiting for objects في انتظار العناصر - + waiting for condition variable - + waiting for address arbiter - + waiting for suspend resume - + waiting ينتظر - + initialized مهيئ - + terminated تم إنهاؤه - + unknown غير معروف - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal خامل - + core %1 النواة %1 - + processor = %1 معالج = %1 - + affinity mask = %1 - + thread id = %1 معرف الخيط = %1 - + priority = %1(current) / %2(normal) الأولوية = %1(الحالي) / %2(الطبيعي) - + last running ticks = %1 @@ -9335,7 +9720,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread @@ -9343,7 +9728,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index c67c2d6f24..8570ed13d9 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Comunicant-se amb el servidor... - + Cancel Cancel·la - + Touch the top left corner <br>of your touchpad. Premi la cantonada superior esquerra<br>del seu panell tàctil. - + Now touch the bottom right corner <br>of your touchpad. Ara premi la cantonada inferior dreta <br>del seu panell tàctil. - + Configuration completed! Configuració completada! - + OK D'acord @@ -395,502 +395,164 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Error - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Motor de sortida: - + Output Device: Dispositiu de Sortida: - + Input Device: Dispositiu d'Entrada: - + Mute audio Silenciar àudio - + Volume: Volum: - + Mute audio when in background Silenciar l'àudio quan estigui en segon plà - + Multicore CPU Emulation Emulació de CPU multinucli - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Limitar percentatge de velocitat - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Precisió: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Desactivar FMA (millora el rendiment en CPUs sense FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE FRSQRTE i FRECPE més ràpid - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Aquest paràmetre millora la velocitat d'algunes funcions de coma flotant, amb l'ús d'aproximacions natives menys precises. - + Faster ASIMD instructions (32 bits only) Instruccions ASIMD més ràpides (només 32 bits) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Gestió imprecisa NaN - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Desactiva les comprovacions d'espai d'adreces - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Ignorar monitorització global - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Dispositiu: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Suport de shaders: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Resolució: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Filtre d'adaptació de finestra: - - FSR Sharpness: - - - - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Mètode d'anti-aliasing - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Mode pantalla completa: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Relació d'aspecte: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Utilitzar cache de shaders de canonada - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Utilitzar emulació asíncrona de GPU - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Emulació NVDEC: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - - VSync Mode: - - - - - FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. -FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. -Mailbox can have lower latency than FIFO and does not tear but may drop frames. -Immediate (no synchronization) just presents whatever is available and can exhibit tearing. - - - - - Enable asynchronous presentation (Vulkan only) - - - - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - - Force maximum clocks (Vulkan only) - - - - - Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - - - - + Anisotropic Filtering: Filtrat anisotròpic: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Nivell de precisió: + Nivell de precisió: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Utilitzar la construcció de shaders asíncrona (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Utilitzar temps ràpid a la GPU (Hack) @@ -900,1021 +562,1456 @@ This feature is experimental. Habilita el temps ràpid de la GPU. Aquesta opció obligarà a la majoria dels jocs a executar-se a la seva resolució nativa més alta. - + + RNG Seed + Llavor de GNA + + + + Device Name + Nom del Dispositiu + + + + Note: this can be overridden when region setting is auto-select + Nota: això pot anul·lar-se quan la configuració de regió es selecciona automàticament + + + + Region: + Regió: + + + + Time Zone: + Zona horària: + + + + Prompt for user on game boot + Sol·licitar l'usuari en l'arrencada del joc + + + + Pause emulation when in background + Pausa l'emulació quan la finestra està en segon pla + + + + Hide mouse on inactivity + Ocultar el cursor del ratolí en cas d'inactivitat + + + + Enable Gamemode + Activa el mode Joc + + + + CPU + CPU + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly Shaders, només NVIDIA) + + + + Auto + Auto + + + + Accurate + Precís + + + + Unsafe + Insegur + + + + Paranoid (disables most optimizations) + Paranoic (desactiva la majoria d'optimitzacions) + + + + Borderless Windowed + Finestra sense vores + + + + Exclusive Fullscreen + Pantalla completa exclusiva + + + + No Video Output + Sense sortida de vídeo + + + + CPU Video Decoding + Descodificació de vídeo a la CPU + + + + GPU Video Decoding (Default) + Descodificació de vídeo a la GPU (Valor Predeterminat) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [EXPERIMENTAL] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + Nearest Neighbor + Veí més proper + + + + Bilinear + Bilineal + + + + Bicubic + Bicúbic + + + + Gaussian + Gaussià + + + + ScaleForce + ScaleForce + + + + None + Cap + + + + FXAA + FXAA + + + + Default (16:9) + Valor predeterminat (16:9) + + + + Force 4:3 + Forçar 4:3 + + + + Force 21:9 + Forçar 21:9 + + + + Stretch to Window + Estirar a la finestra + + + + Automatic + Automàtic + + + + + Default + Valor predeterminat + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + FSR Sharpness: + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + VSync Mode: + + + + + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. +FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. +Mailbox can have lower latency than FIFO and does not tear but may drop frames. +Immediate (no synchronization) just presents whatever is available and can exhibit tearing. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Enable asynchronous presentation (Vulkan only) + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Force maximum clocks (Vulkan only) + + + + + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - Llavor de GNA + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Nom del Dispositiu - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Nota: això pot anul·lar-se quan la configuració de regió es selecciona automàticament - - - - Region: - Regió: - - - + The region of the emulated Switch. - - Time Zone: - Zona horària: - - - + The time zone of the emulated Switch. - + Sound Output Mode: - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Sol·licitar l'usuari en l'arrencada del joc - - - - Pause emulation when in background - Pausa l'emulació quan la finestra està en segon pla - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Ocultar el cursor del ratolí en cas d'inactivitat - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - - Enable Gamemode - Activa el mode Joc - - - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - + OpenGL - + Vulkan - + Null - + GLSL - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly Shaders, només NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - + Normal - + High - + Extreme - - Auto - Auto + + Unsafe (fast) + - - Accurate - Precís + + Safe (stable) + - - Unsafe - Insegur - - - - Paranoid (disables most optimizations) - Paranoic (desactiva la majoria d'optimitzacions) - - - + Dynarmic - + NCE - - Borderless Windowed - Finestra sense vores - - - - Exclusive Fullscreen - Pantalla completa exclusiva - - - - No Video Output - Sense sortida de vídeo - - - - CPU Video Decoding - Descodificació de vídeo a la CPU - - - - GPU Video Decoding (Default) - Descodificació de vídeo a la GPU (Valor Predeterminat) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [EXPERIMENTAL] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - + 1.5X (1080p/1620p) [EXPERIMENTAL] - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - + 7X (5040p/7560p) - + 8X (5760p/8640p) - - Nearest Neighbor - Veí més proper - - - - Bilinear - Bilineal - - - - Bicubic - Bicúbic - - - - Gaussian - Gaussià - - - - ScaleForce - ScaleForce - - - + AMD FidelityFX™️ Super Resolution - + Area - - None - Cap - - - - FXAA - FXAA - - - + SMAA - - Default (16:9) - Valor predeterminat (16:9) - - - - Force 4:3 - Forçar 4:3 - - - - Force 21:9 - Forçar 21:9 - - - + Force 16:10 - - Stretch to Window - Estirar a la finestra - - - - Automatic - Automàtic - - - - Default - Valor predeterminat - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonès (日本語) - + American English - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Acoblada - + Handheld Portàtil - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2265,27 +2362,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Registre - + Open Log Location Obrir ubicació de l'arxiu del registre - + Global Log Filter Filtre de registre global - + When checked, the max size of the log increases from 100 MB to 1 GB Quan està marcat, la mida màxima del registre augmenta de 100 MB a 1 GB - + Enable Extended Logging** Habilitar registre ampliat** - + Show Log in Console Mostra el registre a la consola @@ -2431,7 +2528,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2493,7 +2590,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Això es restablirà automàticament quan es tanqui yuzu. - + Web applet not compiled Web applet no compilat @@ -2543,7 +2640,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2552,88 +2649,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Algunes configuracions són disponibles només quan el joc no està corrent. - + Applets - - + + Audio Àudio - - + + CPU CPU - + Debug Depuració - + Filesystem Sistema de fitxers - - + + General General - - + + Graphics Gràfics - + GraphicsAdvanced GràficsAvançat - + GraphicsExtensions - + Hotkeys Tecles d'accés ràpid - - + + Controls Controls - + Profiles Perfils - + Network Xarxa - - + + System Sistema - + Game List Llista de jocs - + Web Web @@ -2731,51 +2828,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Reiniciar cache de metadades - + Select Emulated NAND Directory... Seleccioni el directori de NAND emulat... - + Select Emulated SD Directory... Seleccioni el directori de SD emulat... - + Select Gamecard Path... Seleccioni la ruta del cartutx de joc... - + Select Dump Directory... Seleccioni el directori de bolcat... - + Select Mod Load Directory... Seleccioni el directori de càrrega de mods... - The metadata cache is already empty. - El cache de metadades ja està buit. + El cache de metadades ja està buit. - The operation completed successfully. - L'operació s'ha completat correctament. + L'operació s'ha completat correctament. - The metadata cache couldn't be deleted. It might be in use or non-existent. - El cache de metadades no s'ha pogut eliminar. Pot ser que es trobi en ús actualment o ja hagi sigut eliminat. + El cache de metadades no s'ha pogut eliminar. Pot ser que es trobi en ús actualment o ja hagi sigut eliminat. @@ -2806,12 +2897,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Això restablirà tota la configuració i eliminarà totes les configuracions dels jocs. No eliminarà ni els directoris de jocs, ni els perfils, ni els perfils dels controladors. Procedir? @@ -2844,33 +2935,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Color de fons: - + % FSR sharpening percentage (e.g. 50%) % - + Off Apagat - + VSync Off Vsync Apagat - + Recommended Recomanat - + On Encés - + VSync On VSync Encés @@ -2907,14 +2998,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2946,75 +3041,75 @@ These settings are experimental, and may cause black screens. If your games fail Restaurar els valors predeterminats - + Action Acció - + Hotkey Tecla d'accés ràpid - + Controller Hotkey Tecla d'accés ràpid del controlador - - - + + + Conflicting Key Sequence Seqüència de tecles en conflicte - - + + The entered key sequence is already assigned to: %1 La seqüència de tecles introduïda ja ha estat assignada a: %1 - + [waiting] [esperant] - + Invalid Invàlid - + Invalid hotkey settings Configuracions de dreceres de teclat invalides - + An error occurred. Please report this issue on github. Hi ha hagut un error. Siusplau informi d'aquest problema a github. - + Restore Default Restaurar el valor predeterminat - + Clear Esborrar - + Conflicting Button Sequence Seqüència de botons en conflicte - + The default button sequence is already assigned to: %1 La seqüència de botons per defecte ja està assignada a: %1 - + The default key sequence is already assigned to: %1 La seqüència de tecles predeterminada ja ha estat assignada a: %1 @@ -3334,7 +3429,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3489,7 +3584,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Palanca esquerra @@ -3599,14 +3694,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3625,7 +3720,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Més @@ -3638,15 +3733,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3691,7 +3786,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Palanca dreta @@ -3706,242 +3801,242 @@ These settings are experimental, and may cause black screens. If your games fail Configurar - - - - + + + + Clear Esborrar - - - - - + + + + + [not set] [no establert] - - - + + + Invert button Botó d'inversió - - + + Toggle button Botó commutador - + Turbo button Botó turbo - - + + Invert axis Invertir eixos - - - + + + Set threshold Configurar llindar - - + + Choose a value between 0% and 100% Esculli un valor entre 0% i 100% - + Toggle axis Activa l'eix - + Set gyro threshold Configurar llindar giroscopi - + Calibrate sensor Calibrar sensor - + Map Analog Stick Configuració de palanca analògica - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Després de prémer D'acord, primer moveu el joystick horitzontalment i després verticalment. Per invertir els eixos, primer moveu el joystick verticalment i després horitzontalment. - + Center axis Centrar eixos - - + + Deadzone: %1% Zona morta: %1% - - + + Modifier Range: %1% Rang del modificador: %1% - - + + Pro Controller Controlador Pro - + Dual Joycons Joycons duals - + Left Joycon Joycon esquerra - + Right Joycon Joycon dret - + Handheld Portàtil - + GameCube Controller Controlador de GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Controlador NES - + SNES Controller Controlador SNES - + N64 Controller Controlador N64 - + Sega Genesis Sega Genesis - + Start / Pause Inici / Pausa - + Z Z - + Control Stick Palanca de control - + C-Stick C-Stick - + Shake! Sacseja! - + [waiting] [esperant] - + New Profile Nou perfil - + Enter a profile name: Introdueixi un nom de perfil: - - + + Create Input Profile Crear perfil d'entrada - + The given profile name is not valid! El nom de perfil introduït no és vàlid! - + Failed to create the input profile "%1" Error al crear el perfil d'entrada "%1" - + Delete Input Profile Eliminar perfil d'entrada - + Failed to delete the input profile "%1" Error al eliminar el perfil d'entrada "%1" - + Load Input Profile Carregar perfil d'entrada - + Failed to load the input profile "%1" Error al carregar el perfil d'entrada "%1" - + Save Input Profile Guardar perfil d'entrada - + Failed to save the input profile "%1" Error al guardar el perfil d'entrada "%1" @@ -3998,7 +4093,7 @@ Per invertir els eixos, primer moveu el joystick verticalment i després horitzo - + Configure Configuració @@ -4034,7 +4129,7 @@ Per invertir els eixos, primer moveu el joystick verticalment i després horitzo - + Test Provar @@ -4053,7 +4148,7 @@ Per invertir els eixos, primer moveu el joystick verticalment i després horitzo <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Més Informació</span></a> - + %1:%2 %1:%2 @@ -4062,77 +4157,77 @@ Per invertir els eixos, primer moveu el joystick verticalment i després horitzo yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters El número de port té caràcters invàlids - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 El port ha d'estar entre el rang 0 i 65353 - + IP address is not valid l'Adreça IP no és vàlida - + This UDP server already exists Aquest servidor UDP ja existeix - + Unable to add more than 8 servers No és possible afegir més de 8 servidors - + Testing Provant - + Configuring Configurant - + Test Successful Prova exitosa - + Successfully received data from the server. S'han rebut dades des del servidor correctament. - + Test Failed Prova fallida - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. No s'han pogut rebre dades vàlides des del servidor.<br>Si us plau, verifiqui que el servidor està configurat correctament i que la direcció i el port són correctes.  - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. La prova del UDP o la configuració de la calibració està en curs.<br>Si us plau, esperi a que acabi el procés. @@ -4258,7 +4353,12 @@ Current values are %1% and %2% respectively. Interfície de xarxa - + + Enable Airplane Mode + + + + None Cap @@ -4316,52 +4416,52 @@ Current values are %1% and %2% respectively. Algunes configuracions són disponibles només quan el joc no està corrent. - + Add-Ons Complements - + System Sistema - + CPU CPU - + Graphics Gràfics - + Adv. Graphics Gràfics avanç. - + GPU Extensions - + Audio Àudio - + Input Profiles Perfils d'entrada - + Linux - + Properties Propietats @@ -4379,12 +4479,12 @@ Current values are %1% and %2% respectively. Complements - + Patch Name Nom del pegat - + Version Versió @@ -4422,27 +4522,32 @@ Current values are %1% and %2% respectively. Establir imatge - + + Select Avatar + + + + Add Afegir - + Rename Renombrar - + Remove Eliminar - + Profile management is available only when game is not running. La gestió de perfils només està disponible quan el joc no s'està executant. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4450,100 +4555,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Introdueixi el nom d'usuari - + Users Usuaris - + Enter a username for the new user: Introdueixi un nom d'usuari per al nou usuari: - + Enter a new username: Introdueixi un nou nom d'usuari: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Seleccioni una imatge d'usuari - - JPEG Images (*.jpg *.jpeg) - Imatges JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Imatges JPEG (*.jpg *.jpeg) + + + Error deleting image Error al eliminar la imatge - + Error occurred attempting to overwrite previous image at: %1. Error al intentar sobreescriure la imatge anterior a: %1. - + Error deleting file Error al eliminar el fitxer - + Unable to delete existing file: %1. No es pot eliminar el fitxer existent: %1. - + Error creating user image directory Error al crear el directori d'imatges de l'usuari - + Unable to create directory %1 for storing user images. No es pot crear el directori %1 per emmagatzemar imatges d’usuari. - Error copying user image - Error al copiar la imatge de l'usuari + Error al copiar la imatge de l'usuari - Unable to copy image from %1 to %2 - No es pot copiar la imatge de %1 a %2 + No es pot copiar la imatge de %1 a %2 - Error resizing user image - Error al redimensionar la imatge d'usuari + Error al redimensionar la imatge d'usuari - Unable to resize image - No es pot redimensionar la imatge + No es pot redimensionar la imatge + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Esborrar aquest usuari? Totes les dades de guardat seran eliminades. - + Confirm Delete Confirmar eliminació - + Name: %1 UUID: %2 Nom: %1 @@ -4596,7 +4790,7 @@ UUID: %2 - + Enable Habilita @@ -4607,7 +4801,7 @@ UUID: %2 - + Not connected No connectat @@ -4617,63 +4811,63 @@ UUID: %2 Restaurar els valors predeterminats - + Clear Esborrar - + [not set] [no establert] - + Invert axis Invertir eixos - - + + Deadzone: %1% Zona morta: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Configurant - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 Resultat de controlador inesperat %1 - + [waiting] [esperant] @@ -4715,7 +4909,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4767,12 +4961,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Configuració TAS - + Select TAS Load Directory... Selecciona el directori de càrrega TAS... @@ -4882,7 +5076,7 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5202,6 +5396,16 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Servei Web de yuzu @@ -5211,42 +5415,29 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les Al proporcionar el seu nom d'usuari i token, dóna el seu consentiment a que yuzu recopili dades d'ús adicionals, que poden incloure informació d'identificació de l'usuari. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verificar + Verificar - Sign up - Registrar-se + Registrar-se - + Token: Token: - + Username: Nom d'usuari: - What is my token? - Quin és el meu token? + Quin és el meu token? - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5271,12 +5462,12 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les Regenerar - + Discord Presence Presència al Discord - + Show Current Game in your Discord Status Mostrar el joc actual al seu estat de Discord @@ -5285,24 +5476,8 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Saber més</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrar-se</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrar-se</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5324,12 +5499,6 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les Token was not verified. The change to your token has not been saved. El token no ha sigut verificat. El canvi al seu token no s'ha guardat. - - - Unverified, please click Verify before saving configuration - Tooltip - - Verifying... Comprovant... @@ -5347,20 +5516,67 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Verificació fallida. Comprovi que hagi ingressat el seu token correctament, i que la seva connexió a internet estigui funcionant. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controlador J1 - + &Controller P1 &Controlador J1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versió + + DirectConnect @@ -5466,7 +5682,12 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5474,11 +5695,6 @@ Arrossegui els punts per a canviar la posició, o faci doble clic a les cel·les The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5538,111 +5754,110 @@ Please go to Configure -> System -> Network and make a selection. Telemetria - + Broken Vulkan Installation Detected - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Carregant Web applet... - - + + Disable Web Applet Desactivar el Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desactivar l'Applet Web pot provocar comportaments indefinits i només hauria d'utilitzar-se amb Super Mario 3D All-Stars. Estàs segur de que vols desactivar l'Applet Web? (Això pot ser reactivat als paràmetres Debug.) - + The amount of shaders currently being built La quantitat de shaders que s'estan compilant actualment - + The current selected resolution scaling multiplier. El multiplicador d'escala de resolució seleccionat actualment. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocitat d'emulació actual. Valors superiors o inferiors a 100% indiquen que l'emulació s'està executant més ràpidament o més lentament que a la Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quants fotogrames per segon està mostrant el joc actualment. Això variarà d'un joc a un altre i d'una escena a una altra. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Temps que costa emular un fotograma de la Switch, sense tenir en compte la limitació de fotogrames o la sincronització vertical. Per a una emulació òptima, aquest valor hauria de ser com a màxim de 16.67 ms. - + Unmute - + Mute Silenciar - + Reset Volume - + &Clear Recent Files &Esborrar arxius recents - + &Continue &Continuar - + &Pause &Pausar - Warning Outdated Game Format - Advertència format del joc desfasat + Advertència format del joc desfasat You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Està utilitzant el format de directori de ROM deconstruït per a aquest joc, que és un format desactualitzat que ha sigut reemplaçat per altres, com NCA, NAX, XCI o NSP. Els directoris de ROM deconstruïts careixen d'icones, metadades i suport d'actualitzacions.<br><br>Per a obtenir una explicació dels diversos formats de Switch que suporta yuzu,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>faci una ullada a la nostra wiki</a>. Aquest missatge no es tornarà a mostrar. - - + + Error while loading ROM! Error carregant la ROM! - + The ROM format is not supported. El format de la ROM no està suportat. - + An error occurred initializing the video core. S'ha produït un error inicialitzant el nucli de vídeo. @@ -5651,7 +5866,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu ha trobat un error mentre executava el nucli de vídeo. Això sol ser causat per controladors de la GPU obsolets, inclosos els integrats. Si us plau, consulti el registre per a més detalls. Per obtenir més informació sobre com accedir al registre, consulti la següent pàgina: <a href='https://yuzu-emu.org/help/reference/log-files/'>Com carregar el fitxer de registre</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Error al carregar la ROM! %1 @@ -5662,473 +5877,349 @@ Please go to Configure -> System -> Network and make a selection. %1<br>Si us plau, segueixi <a href='https://yuzu-emu.org/help/quickstart/'>la guia d'inici de yuzu</a> per a bolcar de nou els seus fitxers.<br>Pot consultar la wiki de yuzu wiki</a> o el Discord de yuzu</a> per obtenir ajuda. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. S'ha produït un error desconegut. Si us plau, consulti el registre per a més detalls. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... S'està tancant el programari - + Save Data Dades de partides guardades - + Mod Data Dades de mods - + Error Opening %1 Folder Error obrint la carpeta %1 - - + + Folder does not exist! La carpeta no existeix! - Error Opening Transferable Shader Cache - Error obrint la cache transferible de shaders + Error obrint la cache transferible de shaders - Failed to create the shader cache directory for this title. - No s'ha pogut crear el directori de la cache dels shaders per aquest títol. + No s'ha pogut crear el directori de la cache dels shaders per aquest títol. - Error Removing Contents - Error eliminant continguts + Error eliminant continguts - Error Removing Update - Error eliminant actualització + Error eliminant actualització - Error Removing DLC - Error eliminant DLC + Error eliminant DLC - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry Eliminar entrada - - - - - - Successfully Removed - S'ha eliminat correctament + S'ha eliminat correctament - Successfully removed the installed base game. - S'ha eliminat correctament el joc base instal·lat. + S'ha eliminat correctament el joc base instal·lat. - The base game is not installed in the NAND and cannot be removed. - El joc base no està instal·lat a la NAND i no pot ser eliminat. + El joc base no està instal·lat a la NAND i no pot ser eliminat. - Successfully removed the installed update. - S'ha eliminat correctament l'actualització instal·lada. + S'ha eliminat correctament l'actualització instal·lada. - There is no update installed for this title. - No hi ha cap actualització instal·lada per aquest títol. + No hi ha cap actualització instal·lada per aquest títol. - There are no DLC installed for this title. - No hi ha cap DLC instal·lat per aquest títol. + No hi ha cap DLC instal·lat per aquest títol. - Successfully removed %1 installed DLC. - S'ha eliminat correctament %1 DLC instal·lat/s. + S'ha eliminat correctament %1 DLC instal·lat/s. - + Delete OpenGL Transferable Shader Cache? Desitja eliminar la cache transferible de shaders d'OpenGL? - + Delete Vulkan Transferable Shader Cache? Desitja eliminar la cache transferible de shaders de Vulkan? - + Delete All Transferable Shader Caches? Desitja eliminar totes les caches transferibles de shaders? - + Remove Custom Game Configuration? Desitja eliminar la configuració personalitzada del joc? - + Remove Cache Storage? - + Remove File Eliminar arxiu - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Error eliminant la cache transferible de shaders + Error eliminant la cache transferible de shaders - - A shader cache for this title does not exist. - No existeix una cache de shaders per aquest títol. + No existeix una cache de shaders per aquest títol. - Successfully removed the transferable shader cache. - S'ha eliminat correctament la cache transferible de shaders. + S'ha eliminat correctament la cache transferible de shaders. - Failed to remove the transferable shader cache. - No s'ha pogut eliminar la cache transferible de shaders. + No s'ha pogut eliminar la cache transferible de shaders. - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - Error Removing Transferable Shader Caches - Error al eliminar les caches de shaders transferibles + Error al eliminar les caches de shaders transferibles - Successfully removed the transferable shader caches. - Caches de shaders transferibles eliminades correctament. + Caches de shaders transferibles eliminades correctament. - Failed to remove the transferable shader cache directory. - No s'ha pogut eliminar el directori de caches de shaders transferibles. + No s'ha pogut eliminar el directori de caches de shaders transferibles. - - Error Removing Custom Configuration - Error eliminant la configuració personalitzada + Error eliminant la configuració personalitzada - A custom configuration for this title does not exist. - No existeix una configuració personalitzada per aquest joc. + No existeix una configuració personalitzada per aquest joc. - Successfully removed the custom game configuration. - S'ha eliminat correctament la configuració personalitzada del joc. + S'ha eliminat correctament la configuració personalitzada del joc. - Failed to remove the custom game configuration. - No s'ha pogut eliminar la configuració personalitzada del joc. + No s'ha pogut eliminar la configuració personalitzada del joc. - - + + RomFS Extraction Failed! La extracció de RomFS ha fallat! - + There was an error copying the RomFS files or the user cancelled the operation. S'ha produït un error copiant els arxius RomFS o l'usuari ha cancel·lat la operació. - + Full Completa - + Skeleton Esquelet - + Select RomFS Dump Mode Seleccioni el mode de bolcat de RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Si us plau, seleccioni la forma en que desitja bolcar la RomFS.<br>Completa copiarà tots els arxius al nou directori mentre que<br>esquelet només crearà l'estructura de directoris. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root No hi ha suficient espai lliure a %1 per extreure el RomFS. Si us plau, alliberi espai o esculli un altre directori de bolcat a Emulació > Configuració > Sistema > Sistema d'arxius > Carpeta arrel de bolcat - + Extracting RomFS... Extraient RomFS... - - - - - + + Cancel Cancel·la - + RomFS Extraction Succeeded! Extracció de RomFS completada correctament! - - - + The operation completed successfully. L'operació s'ha completat correctament. - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - - Verifying integrity... - - - - - - Integrity verification succeeded! - - - - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - - Create Shortcut - - - - - Do you want to launch the game in fullscreen? - - - - - Successfully created a shortcut to %1 - - - - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - Create Icon - Crear icona + Crear icona - - Cannot create icon file. Path "%1" does not exist and cannot be created. + + Warning: Outdated Game Format - + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Error obrint %1 - + Select Directory Seleccionar directori - + Properties Propietats - + The game properties could not be loaded. Les propietats del joc no s'han pogut carregar. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Executable de Switch (%1);;Tots els Arxius (*.*) - + Load File Carregar arxiu - + Open Extracted ROM Directory Obrir el directori de la ROM extreta - + Invalid Directory Selected Directori seleccionat invàlid - + The directory you have selected does not contain a 'main' file. El directori que ha seleccionat no conté un arxiu 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Arxiu de Switch Instal·lable (*.nca *.nsp *.xci);;Arxiu de Continguts Nintendo (*.nca);;Paquet d'enviament Nintendo (*.nsp);;Imatge de Cartutx NX (*.xci) - + Install Files Instal·lar arxius - + %n file(s) remaining %n arxiu(s) restants @@ -6136,25 +6227,25 @@ Please go to Configure -> System -> Network and make a selection. - + Installing file "%1"... Instal·lant arxiu "%1"... - - + + Install Results Resultats instal·lació - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Per evitar possibles conflictes, no recomanem als usuaris que instal·lin jocs base a la NAND. Si us plau, utilitzi aquesta funció només per a instal·lar actualitzacions i DLCs. - + %n file(s) were newly installed @@ -6165,7 +6256,7 @@ Si us plau, utilitzi aquesta funció només per a instal·lar actualitzacions i - + %n file(s) were overwritten @@ -6176,7 +6267,7 @@ Si us plau, utilitzi aquesta funció només per a instal·lar actualitzacions i - + %n file(s) failed to install @@ -6187,489 +6278,443 @@ Si us plau, utilitzi aquesta funció només per a instal·lar actualitzacions i - + System Application Aplicació del sistema - + System Archive Arxiu del sistema - + System Application Update Actualització de l'aplicació del sistema - + Firmware Package (Type A) Paquet de firmware (Tipus A) - + Firmware Package (Type B) Paquet de firmware (Tipus B) - + Game Joc - + Game Update Actualització de joc - + Game DLC DLC del joc - + Delta Title Títol delta - + Select NCA Install Type... Seleccioni el tipus d'instal·lació NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleccioni el tipus de títol que desitja instal·lar aquest NCA com a: (En la majoria dels casos, el valor predeterminat 'Joc' està bé.) - + Failed to Install Ha fallat la instal·lació - + The title type you selected for the NCA is invalid. El tipus de títol seleccionat per el NCA és invàlid. - + File not found Arxiu no trobat - + File "%1" not found Arxiu "%1" no trobat - + OK D'acord - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account Falta el compte de yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Per tal d'enviar un cas de prova de compatibilitat de joc, ha de vincular el seu compte de yuzu.<br><br/>Per a vincular el seu compte de yuzu, vagi a Emulació & gt; Configuració & gt; Web. - + Error opening URL Error obrint URL - + Unable to open the URL "%1". No es pot obrir la URL "%1". - + TAS Recording Gravació TAS - + Overwrite file of player 1? Sobreescriure l'arxiu del jugador 1? - + Invalid config detected Configuració invàlida detectada - + Handheld controller can't be used on docked mode. Pro controller will be selected. El controlador del mode portàtil no es pot fer servir en el mode acoblat. Es seleccionarà el controlador Pro en el seu lloc. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'amiibo actual ha sigut eliminat - + Error Error - - + + The current game is not looking for amiibos El joc actual no està buscant amiibos - + Amiibo File (%1);; All Files (*.*) Arxiu Amiibo (%1);; Tots els Arxius (*.*) - + Load Amiibo Carregar Amiibo - + Error loading Amiibo data Error al carregar les dades d'Amiibo - + The selected file is not a valid amiibo L'arxiu seleccionat no és un amiibo vàlid - + The selected file is already on use - + An unknown error occurred - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Controlador Applet - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Captura de pantalla - + PNG Image (*.png) Imatge PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Estat TAS: executant %1/%2 - + TAS state: Recording %1 Estat TAS: gravant %1 - + TAS state: Idle %1/%2 Estat TAS: inactiu %1/%2 - + TAS State: Invalid Estat TAS: invàlid - + &Stop Running &Parar l'execució - + &Start &Iniciar - + Stop R&ecording Parar g&ravació - + R&ecord G&ravar - + Building: %n shader(s) Construint: %n shader(s) @@ -6677,18 +6722,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocitat: %1% / %2% - + Speed: %1% Velocitat: %1% @@ -6697,54 +6742,54 @@ Would you like to download it? Joc: %1 FPS (desbloquejat) - + Game: %1 FPS Joc: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA SENSE AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing Falten components de derivació - + Select RomFS Dump Target Seleccioni el destinatari per a bolcar el RomFS - + Please select which RomFS you would like to dump. Si us plau, seleccioni quin RomFS desitja bolcar. @@ -6757,7 +6802,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Està segur de que vol aturar l'emulació? Qualsevol progrés no guardat es perdrà. @@ -6770,102 +6815,102 @@ Would you like to bypass this and exit anyway? Desitja tancar-lo de totes maneres? - + None Cap - + FXAA FXAA - + SMAA - + Nearest - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + ScaleForce ScaleForce - + Area - + Docked Acoblada - + Handheld Portàtil - + Normal - + High - + Extreme - + Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6873,13 +6918,13 @@ Desitja tancar-lo de totes maneres? GRenderWindow - - + + OpenGL not available! OpenGL no disponible! - + OpenGL shared contexts are not supported. @@ -6888,33 +6933,33 @@ Desitja tancar-lo de totes maneres? yuzu no ha estat compilat amb suport per OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Error al inicialitzar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. La seva GPU no suporta OpenGL, o no té instal·lat els últims controladors gràfics. - + Error while initializing OpenGL 4.6! Error inicialitzant OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 La seva GPU no suporta OpenGL 4.6, o no té instal·lats els últims controladors gràfics.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 És possible que la seva GPU no suporti una o més extensions necessàries d'OpenGL. Si us plau, asseguris de tenir els últims controladors de la tarjeta gràfica.<br><br>GL Renderer:<br>%1<br><br>Extensions no suportades:<br>%2 @@ -6922,128 +6967,128 @@ Desitja tancar-lo de totes maneres? GameList - + Favorite Preferit - + Start Game Iniciar el joc - + Start Game without Custom Configuration Iniciar el joc sense la configuració personalitzada - + Open Save Data Location Obrir la ubicació dels arxius de partides guardades - + Open Mod Data Location Obrir la ubicació dels mods - + Open Transferable Pipeline Cache Obrir cache transferible de shaders de canonada - + Remove Eliminar - + Remove Installed Update Eliminar actualització instal·lada - + Remove All Installed DLC Eliminar tots els DLC instal·lats - + Remove Custom Configuration Eliminar configuració personalitzada - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache Eliminar cache de canonada d'OpenGL - + Remove Vulkan Pipeline Cache Eliminar cache de canonada de Vulkan - + Remove All Pipeline Caches Eliminar totes les caches de canonada - + Remove All Installed Contents Eliminar tots els continguts instal·lats - + Dump RomFS Bolcar RomFS - + Dump RomFS to SDMC Bolcar RomFS a SDMC - + Verify Integrity - + Copy Title ID to Clipboard Copiar la ID del títol al porta-retalls - + Navigate to GameDB entry Navegar a l'entrada de GameDB - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + Configure Game @@ -7052,62 +7097,62 @@ Desitja tancar-lo de totes maneres? Propietats - + Scan Subfolders Escanejar subdirectoris - + Remove Game Directory Eliminar directori de jocs - + ▲ Move Up ▲ Moure amunt - + ▼ Move Down ▼ Move avall - + Open Directory Location Obre ubicació del directori - + Clear Esborrar - + Name Nom - + Compatibility Compatibilitat - + Add-ons Complements - + File type Tipus d'arxiu - + Size Mida - + Play time @@ -7115,62 +7160,62 @@ Desitja tancar-lo de totes maneres? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Perfect Perfecte - + Game can be played without issues. - + Playable - + Game functions with minor graphical or audio glitches and is playable from start to finish. - + Intro/Menu Intro / Menú - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot No engega - + The game crashes when attempting to startup. El joc es bloqueja al intentar iniciar. - + Not Tested No provat - + The game has not yet been tested. Aquest joc encara no ha estat provat. @@ -7178,7 +7223,7 @@ Desitja tancar-lo de totes maneres? GameListPlaceholder - + Double-click to add a new folder to the game list Faci doble clic per afegir un nou directori a la llista de jocs @@ -7186,7 +7231,7 @@ Desitja tancar-lo de totes maneres? GameListSearchField - + %1 of %n result(s) %1 de %n resultat(s) @@ -7194,12 +7239,12 @@ Desitja tancar-lo de totes maneres? - + Filter: Filtre: - + Enter pattern to filter Introdueixi patró per a filtrar @@ -7281,7 +7326,7 @@ Desitja tancar-lo de totes maneres? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7289,186 +7334,186 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Captura de pantalla - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy - + Configure - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen - - Exit eden + + Exit Eden - + Fullscreen Pantalla Completa - + Load File Carregar arxiu - + Load/Remove Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation - + Stop Emulation - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar @@ -7476,22 +7521,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Si us plau, confirmi que aquests són els arxius que desitja instal·lar. - + Installing an Update or DLC will overwrite the previously installed one. Instal·lar una actualització o DLC sobreescriurà qualsevol prèviament instal·lat. - + Install Instal·lar - + Install Files to NAND Instal·lar arxius a la NAND @@ -7499,7 +7544,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 El text no pot contenir cap dels següents caràcters @@ -7646,152 +7691,207 @@ Debug Message: &Arxius recents - + + Open &Eden Folders + + + + &Emulation &Emulació - + &View &Veure - + &Reset Window Size &Reiniciar tamany de finestra - + &Debugging &Depuració - + Reset Window Size to &720p Reiniciar el tamany de la finestra a &720p - + Reset Window Size to 720p Reiniciar el tamany de la finestra a 720p - + Reset Window Size to &900p Reiniciar el tamany de la finestra a &900p - + Reset Window Size to 900p Reiniciar el tamany de la finestra a 900p - + Reset Window Size to &1080p Reiniciar el tamany de la finestra a &1080p - + Reset Window Size to 1080p Reiniciar el tamany de la finestra a 1080p - + &Multiplayer - + &Tools &Eines - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Ajuda - + &Install Files to NAND... &instal·lar arxius a la NAND... - + L&oad File... C&arregar arxiu... - + Load &Folder... Carregar &carpeta... - + E&xit S&ortir - + &Pause &Pausar - + &Stop &Aturar - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7800,97 +7900,97 @@ Debug Message: &Sobre yuzu - + Single &Window Mode Mode una sola &finestra - + Con&figure... Con&figurar... - + Ctrl+, - + Display D&ock Widget Headers Mostrar complements de capçalera del D&ock - + Show &Filter Bar Mostrar la barra de &filtre - + Show &Status Bar Mostrar la barra d'&estat - + Show Status Bar Mostrar barra d'estat - + &Browse Public Game Lobby - + &Create Room - + &Leave Room - + &Direct Connect to Room - + &Show Current Room - + F&ullscreen P&antalla completa - + &Restart &Reiniciar - + Load/Remove &Amiibo... Carregar/Eliminar &Amiibo... - + &Report Compatibility &Informar de compatibilitat - + Open &Mods Page Obrir la pàgina de &mods - + Open &Quickstart Guide Obre la guia d'&inici ràpid - + &FAQ &Preguntes freqüents @@ -7899,77 +7999,82 @@ Debug Message: Obrir la carpeta de &yuzu - + &Capture Screenshot &Captura de pantalla - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... &Configurar TAS... - + Configure C&urrent Game... Configurar joc a&ctual... - + &Start &Iniciar - + &Reset &Reiniciar - + R&ecord E&nregistrar - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7977,26 +8082,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - &MicroPerfil + &MicroPerfil MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8056,37 +8171,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! - + Not Connected - + Connected Connectat - + New Messages Received - + Error Error - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8204,56 +8319,56 @@ p, li { white-space: pre-wrap; } - + Installed SD Titles Títols instal·lats a la SD - + Installed NAND Titles Títols instal·lats a la NAND - + System Titles Títols del sistema - + Add New Game Directory Afegir un nou directori de jocs - + Favorites Preferits - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [no establert] @@ -8264,14 +8379,14 @@ p, li { white-space: pre-wrap; } Rotació %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Eix %1%2 @@ -8282,357 +8397,357 @@ p, li { white-space: pre-wrap; } Botó %1 - - - - - - + + + + + + [unknown] [desconegut] - - - + + + Left Esquerra - - - + + + Right Dreta - - - + + + Down Avall - - - + + + Up Amunt - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Inici - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Cercle - - + + Cross Creu - - + + Square Cuadrat - - + + Triangle Triangle - - + + Share Compartir - - + + Options Opcions - - + + [undefined] [indefinit] - + %1%2 %1%2 - - + + [invalid] [invàlid] - - + + %1%2Hat %3 %1%2Rotació %3 - - - + + + %1%2Axis %3 %1%2Eix %3 - - + + %1%2Axis %3,%4,%5 %1%2Eixos %3,%4,%5 - - + + %1%2Motion %3 %1%2Moviment %3 - - + + %1%2Button %3 %1%2Botó %3 - - + + [unused] [sense ús] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L - + Stick R - + Plus Més - + Minus Menys - - + + Home Inici - + Capture Captura - + Touch Tàctil - + Wheel Indicates the mouse wheel Roda - + Backward Enrere - + Forward Endavant - + Task Tasca - + Extra Extra - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8750,6 +8865,298 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + L'operació s'ha completat correctament. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Error eliminant continguts + + + + Error Removing Update + Error eliminant actualització + + + + Error Removing DLC + Error eliminant DLC + + + + The base game is not installed in the NAND and cannot be removed. + El joc base no està instal·lat a la NAND i no pot ser eliminat. + + + + There is no update installed for this title. + No hi ha cap actualització instal·lada per aquest títol. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + S'ha eliminat correctament + + + + Successfully removed %1 installed DLC. + S'ha eliminat correctament %1 DLC instal·lat/s. + + + + + Error Removing Transferable Shader Cache + Error eliminant la cache transferible de shaders + + + + + A shader cache for this title does not exist. + No existeix una cache de shaders per aquest títol. + + + + Successfully removed the transferable shader cache. + S'ha eliminat correctament la cache transferible de shaders. + + + + Failed to remove the transferable shader cache. + No s'ha pogut eliminar la cache transferible de shaders. + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + Error al eliminar les caches de shaders transferibles + + + + Successfully removed the transferable shader caches. + Caches de shaders transferibles eliminades correctament. + + + + Failed to remove the transferable shader cache directory. + No s'ha pogut eliminar el directori de caches de shaders transferibles. + + + + + Error Removing Custom Configuration + Error eliminant la configuració personalitzada + + + + A custom configuration for this title does not exist. + No existeix una configuració personalitzada per aquest joc. + + + + Successfully removed the custom game configuration. + S'ha eliminat correctament la configuració personalitzada del joc. + + + + Failed to remove the custom game configuration. + No s'ha pogut eliminar la configuració personalitzada del joc. + + + + Reset Metadata Cache + Reiniciar cache de metadades + + + + The metadata cache is already empty. + El cache de metadades ja està buit. + + + + The operation completed successfully. + L'operació s'ha completat correctament. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + El cache de metadades no s'ha pogut eliminar. Pot ser que es trobi en ús actualment o ja hagi sigut eliminat. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Crear icona + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9045,7 +9452,7 @@ Si us plau, intenti-ho de nou o contacti el desenvolupador del programari. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9053,7 +9460,7 @@ Si us plau, intenti-ho de nou o contacti el desenvolupador del programari. - + Users Usuaris @@ -9177,7 +9584,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Pila de trucades @@ -9185,12 +9592,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread esperat per cap fil @@ -9198,102 +9605,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable executable - + paused pausat - + sleeping dormint - + waiting for IPC reply esperant per resposta IPC - + waiting for objects esperant objectes - + waiting for condition variable esperant variable condicional - + waiting for address arbiter esperant al àrbitre d'adreça - + waiting for suspend resume esperant reanudar la suspensió - + waiting esperant - + initialized inicialitzat - + terminated acabat - + unknown desconegut - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 nucli %1 - + processor = %1 processador = %1 - + affinity mask = %1 màscara d'afinitat = %1 - + thread id = %1 id fil = %1 - + priority = %1(current) / %2(normal) prioritat = %1(actual) / %2(normal) - + last running ticks = %1 últims ticks consecutius = %1 @@ -9301,7 +9708,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread esperat per fil @@ -9309,7 +9716,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree Arbre d'&espera diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index 637e095fee..796ea5bef2 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Komunikujeme se serverem... - + Cancel Zrušit - + Touch the top left corner <br>of your touchpad. Dotkněte se levého horního rohu <br>vašeho touchpadu. - + Now touch the bottom right corner <br>of your touchpad. Teď se dotkněte dolního pravého rohu <br>vašeho touchpadu. - + Configuration completed! Nastavení dokončeno! - + OK OK @@ -395,281 +395,488 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - - Error - - - - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Výstupní Engine: - + Output Device: Výstupní Zařízení: - + Input Device: Vstupní Zařízení: - + Mute audio Ztlumit zvuk - + Volume: Hlasitost: - + Mute audio when in background Ztlumit zvuk, když je aplikace v pozadí - + Multicore CPU Emulation Vícejádrová emulace CPU - + + Memory Layout + Rozložení Paměti + + + + Limit Speed Percent + Omezení rychlosti v procentech + + + + Accuracy: + Přesnost: + + + + Unfuse FMA (improve performance on CPUs without FMA) + Rozložit FMA instrukce (zlepší výkon na CPU bez FMA) + + + + Faster FRSQRTE and FRECPE + Rychlejší FRSQRTE a FRECPE + + + + Faster ASIMD instructions (32 bits only) + Rychlejší instrukce ASIMD (Pouze 32 bitové) + + + + Inaccurate NaN handling + Nepřesné zpracování NaN + + + + Disable address space checks + Zakázat kontrolu adres paměti + + + + Ignore global monitor + Ignorovat globální hlídač. + + + + API: + API: + + + + Device: + Zařízení: + + + + Resolution: + Rozlišení: + + + + Fullscreen Mode: + Režim celé obrazovky: + + + + Aspect Ratio: + Poměr stran: + + + + Use asynchronous GPU emulation + Použít asynchronní emulaci GPU + + + + Anisotropic Filtering: + Anizotropní filtrování: + + + Accuracy Level: + Přesnost: + + + + RNG Seed + RNG Seed + + + + Device Name + Název Zařízení + + + + Language: + Jazyk: + + + + Note: this can be overridden when region setting is auto-select + Pozn.: tohle se může přemazat když se region vybírá automaticky + + + + Region: + Region: + + + + Time Zone: + Časové Pásmo: + + + + Prompt for user on game boot + Zeptat se na uživatele při spuštění hry + + + + Pause emulation when in background + Pozastavit emulaci, když je aplikace v pozadí + + + + Confirm before stopping emulation + Potvrzení před zastavením emulace + + + + Hide mouse on inactivity + Skrýt myš při neaktivitě + + + + CPU + CPU + + + + Vulkan + Vulkan + + + + Normal + Normální + + + + High + Vysoká + + + + Extreme + Extrémní + + + + Auto + Automatické + + + + Accurate + Přesné + + + + Unsafe + Nebezpečné + + + + Paranoid (disables most optimizations) + Paranoidní (zakáže většinu optimizací) + + + + Borderless Windowed + Okno bez okrajů + + + + Exclusive Fullscreen + Exkluzivní + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + Bilinear + Bilineární + + + + None + Žádné + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Výchozí (16:9) + + + + Force 4:3 + Vynutit 4:3 + + + + Force 21:9 + Vynutit 21:9 + + + + Stretch to Window + Roztáhnout podle okna + + + + + Default + Výchozí + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Error + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. - - Memory Layout - Rozložení Paměti - - - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - Limit Speed Percent - Omezení rychlosti v procentech - - - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. - + Synchronize Core Speed - + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). Compatibility varies by game; many (especially older ones) may not respond well. Can help reduce stuttering at lower framerates. - - Accuracy: - Přesnost: - - - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. - - + + Backend: - + Fast CPU Time - + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - Unfuse FMA (improve performance on CPUs without FMA) - Rozložit FMA instrukce (zlepší výkon na CPU bez FMA) + + Custom CPU Ticks + - + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - Faster FRSQRTE and FRECPE - Rychlejší FRSQRTE a FRECPE - - - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - Faster ASIMD instructions (32 bits only) - Rychlejší instrukce ASIMD (Pouze 32 bitové) - - - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - Inaccurate NaN handling - Nepřesné zpracování NaN - - - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. - - Disable address space checks - Zakázat kontrolu adres paměti - - - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. - - Ignore global monitor - Ignorovat globální hlídač. - - - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. - - API: - API: - - - + Switches between the available graphics APIs. Vulkan is recommended in most cases. - - Device: - Zařízení: - - - + This setting selects the GPU to use with the Vulkan backend. - + Shader Backend: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -677,86 +884,71 @@ SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - Resolution: - Rozlišení: - - - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. - + Window Adapting Filter: - + FSR Sharpness: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. - + Anti-Aliasing Method: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - Fullscreen Mode: - Režim celé obrazovky: - - - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - Aspect Ratio: - Poměr stran: - - - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use disk pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Optimize SPIRV output shader - + Runs an additional optimization pass over generated SPIRV shaders. Will increase time required for shader compilation. May slightly improve performance. @@ -764,35 +956,30 @@ This feature is experimental. - - Use asynchronous GPU emulation - Použít asynchronní emulaci GPU - - - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -801,33 +988,44 @@ stuttering at the cost of rendering issues while the texture is being decoded. - + ASTC Recompression Method: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - + VRAM Usage Mode: - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. - + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -835,1078 +1033,977 @@ Immediate (no synchronization) just presents whatever is available and can exhib - + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - - Anisotropic Filtering: - Anizotropní filtrování: - - - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. - - Accuracy Level: - Přesnost: - - - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. + + GPU Accuracy: - + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + Use asynchronous shader building (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. - + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - RNG Seed + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Název Zařízení - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - - Language: - Jazyk: - - - - Note: this can be overridden when region setting is auto-select - Pozn.: tohle se může přemazat když se region vybírá automaticky - - - - Region: - Region: - - - + The region of the emulated Switch. - - Time Zone: - Časové Pásmo: - - - + The time zone of the emulated Switch. - + Sound Output Mode: - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Zeptat se na uživatele při spuštění hry - - - - Pause emulation when in background - Pozastavit emulaci, když je aplikace v pozadí - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - - Confirm before stopping emulation - Potvrzení před zastavením emulace - - - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Skrýt myš při neaktivitě - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - + OpenGL - - Vulkan - Vulkan - - - + Null - + GLSL - + GLASM (Assembly Shaders, NVIDIA Only) - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Normální + + Unsafe (fast) + - - High - Vysoká + + Safe (stable) + - - Extreme - Extrémní - - - - Auto - Automatické - - - - Accurate - Přesné - - - - Unsafe - Nebezpečné - - - - Paranoid (disables most optimizations) - Paranoidní (zakáže většinu optimizací) - - - + Dynarmic - + NCE - - Borderless Windowed - Okno bez okrajů - - - - Exclusive Fullscreen - Exkluzivní - - - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - - 1X (720p/1080p) - 1X (720p/1080p) - - - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - - Bilinear - Bilineární - - - + Bicubic - + Gaussian - + ScaleForce - + AMD FidelityFX™️ Super Resolution - + Area - - None - Žádné - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Výchozí (16:9) - - - - Force 4:3 - Vynutit 4:3 - - - - Force 21:9 - Vynutit 21:9 - - - + Force 16:10 - - Stretch to Window - Roztáhnout podle okna - - - + Automatic - - Default - Výchozí - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Zadokovaná - + Handheld Příruční - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2249,27 +2346,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Logování - + Open Log Location Otevřít lokaci s logama - + Global Log Filter Centrální log filtr - + When checked, the max size of the log increases from 100 MB to 1 GB Po povolení se zvýší maximální velikost logu z 100 MB na 1 GB. - + Enable Extended Logging** Povolit rozšířené logování - + Show Log in Console Zobrazit log v konzoli @@ -2415,7 +2512,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2469,7 +2566,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - + Web applet not compiled @@ -2519,7 +2616,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2528,88 +2625,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Některá nastavení jsou dostupná pouze, pokud hra neběží. - + Applets - - + + Audio Zvuk - - + + CPU CPU - + Debug Ladění - + Filesystem Souborový systém - - + + General Obecné - - + + Graphics Grafika - + GraphicsAdvanced GrafickyPokročilé - + GraphicsExtensions - + Hotkeys Zkratky - - + + Controls Ovládání - + Profiles Profily - + Network Síť - - + + System Systém - + Game List Seznam her - + Web Web @@ -2707,51 +2804,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Resetovat mezipaměť metadat - + Select Emulated NAND Directory... Vyberte emulovanou NAND složku... - + Select Emulated SD Directory... Vyberte emulovanou SD složku... - + Select Gamecard Path... Vyberte cestu ke Gamecard... - + Select Dump Directory... Vyberte složku pro vysypání... - + Select Mod Load Directory... Vyberte složku pro Mod Load... - The metadata cache is already empty. - Mezipaměť metadat je již prázdná. + Mezipaměť metadat je již prázdná. - The operation completed successfully. - Operace byla úspěšně dokončena. + Operace byla úspěšně dokončena. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Mezipaměť metadat nemohla být odstraněna. Možná je používána nebo neexistuje. + Mezipaměť metadat nemohla být odstraněna. Možná je používána nebo neexistuje. @@ -2782,12 +2873,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Toto vyresetuje všechna nastavení a odstraní konfigurace pro jednotlivé hry. Složky s hrami a profily zůstanou zachovány. Přejete si pokračovat? @@ -2820,33 +2911,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Barva Pozadí: - + % FSR sharpening percentage (e.g. 50%) % - + Off - + VSync Off - + Recommended - + On - + VSync On @@ -2883,14 +2974,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2922,75 +3017,75 @@ These settings are experimental, and may cause black screens. If your games fail Vrátit výchozí nastavení - + Action Akce - + Hotkey Zkratka - + Controller Hotkey - - - + + + Conflicting Key Sequence Protichůdné klávesové sekvence - - + + The entered key sequence is already assigned to: %1 Vložená klávesová sekvence je již přiřazena k: %1 - + [waiting] [čekání] - + Invalid - + Invalid hotkey settings - + An error occurred. Please report this issue on github. Došlo k chybě. Nahlaste prosím tento problém na githubu. - + Restore Default Vrátit výchozí nastavení - + Clear Vyčistit - + Conflicting Button Sequence - + The default button sequence is already assigned to: %1 - + The default key sequence is already assigned to: %1 Výchozí klávesová sekvence je již přiřazena k: %1 @@ -3310,7 +3405,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3461,7 +3556,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Levá Páčka @@ -3571,14 +3666,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3597,7 +3692,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plus @@ -3610,15 +3705,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3663,7 +3758,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Pravá páčka @@ -3678,242 +3773,242 @@ These settings are experimental, and may cause black screens. If your games fail Nastavení - - - - + + + + Clear Vyčistit - - - - - + + + + + [not set] [nenastaveno] - - - + + + Invert button - - + + Toggle button Přepnout tlačítko - + Turbo button - - + + Invert axis Převrátit osy - - - + + + Set threshold - - + + Choose a value between 0% and 100% - + Toggle axis - + Set gyro threshold - + Calibrate sensor - + Map Analog Stick Namapovat analogovou páčku - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Po stisknutí OK nejprve posuňte joystick horizontálně, poté vertikálně. Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontálně. - + Center axis - - + + Deadzone: %1% Deadzone: %1% - - + + Modifier Range: %1% Rozsah modifikátoru: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Dual Joycons - + Left Joycon Levý Joycon - + Right Joycon Pravý Joycon - + Handheld V rukou - + GameCube Controller Ovladač GameCube - + Poke Ball Plus - + NES Controller - + SNES Controller - + N64 Controller - + Sega Genesis - + Start / Pause Start / Pause - + Z Z - + Control Stick Control Stick - + C-Stick C-Stick - + Shake! Shake! - + [waiting] [čekání] - + New Profile Nový profil - + Enter a profile name: Zadejte název profilu: - - + + Create Input Profile Vytvořit profil vstupu - + The given profile name is not valid! Zadaný název profilu není platný! - + Failed to create the input profile "%1" Nepodařilo se vytvořit profil vstupu "%1" - + Delete Input Profile Odstranit profil vstupu - + Failed to delete the input profile "%1" Nepodařilo se odstranit profil vstupu "%1" - + Load Input Profile Načíst profil vstupu - + Failed to load the input profile "%1" Nepodařilo se načíst profil vstupu "%1" - + Save Input Profile Uložit profil vstupu - + Failed to save the input profile "%1" Nepodařilo se uložit profil vstupu "%1" @@ -3970,7 +4065,7 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln - + Configure Konfigurovat @@ -4006,7 +4101,7 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln - + Test Test @@ -4025,7 +4120,7 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Dozvědět se více</span></a> - + %1:%2 %1:%2 @@ -4034,77 +4129,77 @@ Pro převrácení os nejprve posuňte joystick vertikálně, poté horizontáln yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Číslo portu obsahuje neplatné znaky - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Port musí být v rozsahu 0 až 65353 - + IP address is not valid IP adresa není platná - + This UDP server already exists UDP server již existuje - + Unable to add more than 8 servers Není možné přidat více než 8 serverů - + Testing Testování - + Configuring Nastavování - + Test Successful Test byl úspěšný - + Successfully received data from the server. Úspěšně jsme získali data ze serveru. - + Test Failed Test byl neúspěšný - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nedostali jsme platná data ze serveru.<br>Prosím zkontrolujte, že váš server je nastaven správně a že adresa a port jsou zadány správně. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Probíhá test UDP nebo konfigurace kalibrace.<br>Prosím vyčkejte na dokončení. @@ -4230,7 +4325,12 @@ Current values are %1% and %2% respectively. Síťové Rozhraní - + + Enable Airplane Mode + + + + None Žádné @@ -4288,52 +4388,52 @@ Current values are %1% and %2% respectively. Některá nastavení jsou dostupná pouze, pokud hra neběží. - + Add-Ons Doplňky - + System Systém - + CPU CPU - + Graphics Grafika - + Adv. Graphics Pokroč. grafika - + GPU Extensions - + Audio Zvuk - + Input Profiles Profily Vstupu - + Linux - + Properties Vlastnosti @@ -4351,12 +4451,12 @@ Current values are %1% and %2% respectively. Doplňky - + Patch Name Název opravy - + Version Verze @@ -4394,27 +4494,32 @@ Current values are %1% and %2% respectively. Nastavit obrázek - + + Select Avatar + + + + Add Přidat - + Rename Přejmenovat - + Remove Odebrat - + Profile management is available only when game is not running. Spravování profilů je k dispozici, pouze když neběží žádná hra. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4422,100 +4527,181 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Zadejte přezdívku - + Users Uživatelé - + Enter a username for the new user: Zadejte přezdívku pro nového uživatele: - + Enter a new username: Zadejte novou přezdívku: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Vyberte obrázek uživatele - - JPEG Images (*.jpg *.jpeg) - Obrázek JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Není k dispozici žádný firmware + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Obrázek JPEG (*.jpg *.jpeg) + + + Error deleting image Chyba při odstraňování obrázku - + Error occurred attempting to overwrite previous image at: %1. Chyba při přepisování předchozího obrázku na: %1 - + Error deleting file Chyba při odstraňování souboru - + Unable to delete existing file: %1. Nelze odstranit existující soubor: %1. - + Error creating user image directory Chyba při vytváření složky s obrázkem uživatele - + Unable to create directory %1 for storing user images. Nelze vytvořit složku %1 pro ukládání obrázků uživatele. - Error copying user image - Chyba při kopírování obrázku uživatele + Chyba při kopírování obrázku uživatele - Unable to copy image from %1 to %2 - Nelze zkopírovat obrázek z %1 do %2 + Nelze zkopírovat obrázek z %1 do %2 + + + ConfigureProfileManagerAvatarDialog - - Error resizing user image + + Select - - Unable to resize image + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Odstranit tohoto uživatele? Všechna jeho uložená data budou smazána. - + Confirm Delete Potvrdit smazání - + Name: %1 UUID: %2 @@ -4567,7 +4753,7 @@ UUID: %2 - + Enable @@ -4578,7 +4764,7 @@ UUID: %2 - + Not connected @@ -4588,63 +4774,63 @@ UUID: %2 Vrátit výchozí nastavení - + Clear Vymazat - + [not set] [nenastaveno] - + Invert axis Převrátit osy - - + + Deadzone: %1% Deadzone: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Nastavování - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [čekání] @@ -4682,7 +4868,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4734,12 +4920,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration - + Select TAS Load Directory... @@ -4849,7 +5035,7 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5169,6 +5355,16 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Web Service @@ -5178,42 +5374,29 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z Poskytnutím jména a tokenu, souhlasíte s povolením yuzu získávat další data, která mohou obsahovat uživatelsky identifikovatelné informace. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Ověřit + Ověřit - Sign up - Zaregistrovat + Zaregistrovat - + Token: Token: - + Username: Jméno: - What is my token? - Co je to ten token: + Co je to ten token: - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5238,12 +5421,12 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z Přegenerovat - + Discord Presence Podoba na Discordu - + Show Current Game in your Discord Status Zobrazovat Aktuální hru v Discordu @@ -5252,24 +5435,8 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Zjistit více</a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Zaregistrovat</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Zaregistrovat</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5292,10 +5459,9 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z Token nebyl ověřen. Změna k vašemu tokenu nebyla uložena. - Unverified, please click Verify before saving configuration Tooltip - Neověřeno, klikni prosím na Ověřit před uložením konfigurace + Neověřeno, klikni prosím na Ověřit před uložením konfigurace Verifying... @@ -5319,20 +5485,67 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Ověřování selhalo. Zkontrolujte, zda jste zadali token správně a že vaše připojení k internetu funguje v pořádku. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Ovladač P1 - + &Controller P1 &Ovladač P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Verze + + DirectConnect @@ -5438,7 +5651,12 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5446,11 +5664,6 @@ Táhněte body pro změnu pozice nebo dvojitě klikněte na buňky tabulky pro z The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5511,115 +5724,114 @@ Jděte prosím do Nastavení -> Systém -> Síť a některé vyberte.Telemetry - + Broken Vulkan Installation Detected - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Načítání Web Appletu... - - + + Disable Web Applet Zakázat Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built Počet aktuálně sestavovaných shaderů - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuální emulační rychlost. Hodnoty vyšší než 100% indikují, že emulace běží rychleji nebo pomaleji než na Switchi. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Kolik snímků za sekundu aktuálně hra zobrazuje. Tohle závisí na hře od hry a scény od scény. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Čas potřebný na emulaci framu scény, nepočítá se limit nebo v-sync. Pro plnou rychlost by se tohle mělo pohybovat okolo 16.67 ms. - + Unmute Vypnout ztlumení - + Mute Ztlumit - + Reset Volume - + &Clear Recent Files &Vymazat poslední soubory - + &Continue &Pokračovat - + &Pause &Pauza - Warning Outdated Game Format - Varování Zastaralý Formát Hry + Varování Zastaralý Formát Hry You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Používáte rozbalený formát hry, který je zastaralý a byl nahrazen jinými jako NCA, NAX, XCI, nebo NSP. Rozbalená ROM nemá ikony, metadata, a podporu updatů.<br><br>Pro vysvětlení všech možných podporovaných typů, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>zkoukni naší wiki</a>. Tato zpráva se nebude znova zobrazovat. - - + + Error while loading ROM! Chyba při načítání ROM! - + The ROM format is not supported. Tento formát ROM není podporován. - + An error occurred initializing the video core. Nastala chyba při inicializaci jádra videa. - + Error while loading ROM! %1 %1 signifies a numeric error code. Chyba při načítání ROM! %1 @@ -5630,1084 +5842,897 @@ Jděte prosím do Nastavení -> Systém -> Síť a některé vyberte.%1<br>Pro extrakci souborů postupujte podle <a href='https://yuzu-emu.org/help/quickstart/'>rychlého průvodce yuzu</a>. Nápovědu naleznete na <br>wiki</a> nebo na Discordu</a>. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Nastala chyba. Koukni do logu. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Ukončování softwaru... - + Save Data Uložit data - + Mod Data Módovat Data - + Error Opening %1 Folder Chyba otevírání složky %1 - - + + Folder does not exist! Složka neexistuje! - Error Opening Transferable Shader Cache - Chyba při otevírání přenositelné mezipaměti shaderů + Chyba při otevírání přenositelné mezipaměti shaderů - - Failed to create the shader cache directory for this title. - - - - - Error Removing Contents - - - - - Error Removing Update - - - - - Error Removing DLC - - - - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry Odebrat položku - - - - - - Successfully Removed - Úspěšně odebráno + Úspěšně odebráno - Successfully removed the installed base game. - Úspěšně odebrán nainstalovaný základ hry. + Úspěšně odebrán nainstalovaný základ hry. - The base game is not installed in the NAND and cannot be removed. - Základ hry není nainstalovaný na NAND a nemůže být odstraněn. + Základ hry není nainstalovaný na NAND a nemůže být odstraněn. - Successfully removed the installed update. - Úspěšně odebrána nainstalovaná aktualizace. + Úspěšně odebrána nainstalovaná aktualizace. - There is no update installed for this title. - Není nainstalovaná žádná aktualizace pro tento titul. + Není nainstalovaná žádná aktualizace pro tento titul. - There are no DLC installed for this title. - Není nainstalované žádné DLC pro tento titul. + Není nainstalované žádné DLC pro tento titul. - Successfully removed %1 installed DLC. - Úspěšně odstraněno %1 nainstalovaných DLC. + Úspěšně odstraněno %1 nainstalovaných DLC. - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? Odstranit vlastní konfiguraci hry? - + Remove Cache Storage? - + Remove File Odstranit soubor - + Remove Play Time Data Odstranit data o době hraní - + Reset play time? Resetovat dobu hraní? - - Error Removing Transferable Shader Cache - Chyba při odstraňování přenositelné mezipaměti shaderů + Chyba při odstraňování přenositelné mezipaměti shaderů - - A shader cache for this title does not exist. - Mezipaměť shaderů pro tento titul neexistuje. + Mezipaměť shaderů pro tento titul neexistuje. - Successfully removed the transferable shader cache. - Přenositelná mezipaměť shaderů úspěšně odstraněna + Přenositelná mezipaměť shaderů úspěšně odstraněna - Failed to remove the transferable shader cache. - Nepodařilo se odstranit přenositelnou mezipaměť shaderů + Nepodařilo se odstranit přenositelnou mezipaměť shaderů - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - Error Removing Custom Configuration - Chyba při odstraňování vlastní konfigurace hry + Chyba při odstraňování vlastní konfigurace hry - A custom configuration for this title does not exist. - Vlastní konfigurace hry pro tento titul neexistuje. + Vlastní konfigurace hry pro tento titul neexistuje. - Successfully removed the custom game configuration. - Úspěšně odstraněna vlastní konfigurace hry. + Úspěšně odstraněna vlastní konfigurace hry. - Failed to remove the custom game configuration. - Nepodařilo se odstranit vlastní konfiguraci hry. + Nepodařilo se odstranit vlastní konfiguraci hry. - - + + RomFS Extraction Failed! Extrakce RomFS se nepovedla! - + There was an error copying the RomFS files or the user cancelled the operation. Nastala chyba při kopírování RomFS souborů, nebo uživatel operaci zrušil. - + Full Plný - + Skeleton Kostra - + Select RomFS Dump Mode Vyber RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Vyber jak by si chtěl RomFS vypsat.<br>Plné zkopíruje úplně všechno, ale<br>kostra zkopíruje jen strukturu složky. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Extrahuji RomFS... - - - - - + + Cancel Zrušit - + RomFS Extraction Succeeded! Extrakce RomFS se povedla! - - - + The operation completed successfully. Operace byla dokončena úspěšně. - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - Verifying integrity... - Ověřování integrity... + Ověřování integrity... - - - Integrity verification succeeded! - - - - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - Create Shortcut - Vytvořit Zástupce + Vytvořit Zástupce - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Úspěšně vytvořen zástupce do %1 + Úspěšně vytvořen zástupce do %1 - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - Failed to create a shortcut to %1 - Nepodařilo se vytvořit zástupce do %1 + Nepodařilo se vytvořit zástupce do %1 - Create Icon - Vytvořit Ikonu + Vytvořit Ikonu - - Cannot create icon file. Path "%1" does not exist and cannot be created. + + Warning: Outdated Game Format - + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Chyba při otevírání %1 - + Select Directory Vybraná Složka - + Properties Vlastnosti - + The game properties could not be loaded. Herní vlastnosti nemohly být načteny. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch Executable (%1);;Všechny soubory (*.*) - + Load File Načíst soubor - + Open Extracted ROM Directory Otevřít složku s extrahovanou ROM - + Invalid Directory Selected Vybraná složka je neplatná - + The directory you have selected does not contain a 'main' file. Složka kterou jste vybrali neobsahuje soubor "main" - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Instalovatelný soubor pro Switch (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Instalovat Soubory - + %n file(s) remaining - - + Installing file "%1"... Instalování souboru "%1"... - - + + Install Results Výsledek instalace - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Abychom předešli možným konfliktům, nedoporučujeme uživatelům instalovat základní hry na paměť NAND. Tuto funkci prosím používejte pouze k instalaci aktualizací a DLC. - + %n file(s) were newly installed - - + %n file(s) were overwritten - - + %n file(s) failed to install - - + System Application Systémová Aplikace - + System Archive Systémový archív - + System Application Update Systémový Update Aplikace - + Firmware Package (Type A) Firmware-ový baliček (Typu A) - + Firmware Package (Type B) Firmware-ový baliček (Typu B) - + Game Hra - + Game Update Update Hry - + Game DLC Herní DLC - + Delta Title Delta Title - + Select NCA Install Type... Vyberte typ instalace NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Vyberte typ title-u, který chcete nainstalovat tenhle NCA jako: (Většinou základní "game" stačí.) - + Failed to Install Chyba v instalaci - + The title type you selected for the NCA is invalid. Tento typ pro tento NCA není platný. - + File not found Soubor nenalezen - + File "%1" not found Soubor "%1" nenalezen - + OK OK - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account Chybí účet yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Pro přidání recenze kompatibility je třeba mít účet yuzu<br><br/>Pro nalinkování yuzu účtu jdi do Emulace &gt; Konfigurace &gt; Web. - + Error opening URL Chyba při otevírání URL - + Unable to open the URL "%1". Nelze otevřít URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected Zjištěno neplatné nastavení - + Handheld controller can't be used on docked mode. Pro controller will be selected. Ruční ovladač nelze používat v dokovacím režimu. Bude vybrán ovladač Pro Controller. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) Soubor Amiibo (%1);; Všechny Soubory (*.*) - + Load Amiibo Načíst Amiibo - + Error loading Amiibo data Chyba načítání Amiiba - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available Není k dispozici žádný firmware - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Applet ovladače - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Pořídit Snímek Obrazovky - + PNG Image (*.png) PNG Image (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + &Start &Start - + Stop R&ecording - + R&ecord - + Building: %n shader(s) Budování: %n shader Budování: %n shadery - Budování: %n shaderů - + Scale: %1x %1 is the resolution scaling factor Měřítko: %1x - + Speed: %1% / %2% Rychlost: %1% / %2% - + Speed: %1% Rychlost: %1% - + Game: %1 FPS Hra: %1 FPS - + Frame: %1 ms Frame: %1 ms - + %1 %2 %1 %2 - - + + FSR - + NO AA ŽÁDNÝ AA - + VOLUME: MUTE HLASITOST: ZTLUMENO - + VOLUME: %1% Volume percentage (e.g. 50%) HLASITOST: %1% - + Derivation Components Missing Chybé odvozené komponenty - + Select RomFS Dump Target Vyberte Cíl vypsaní RomFS - + Please select which RomFS you would like to dump. Vyberte, kterou RomFS chcete vypsat. @@ -6720,7 +6745,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Jste si jist, že chcete ukončit emulaci? Jakýkolic neuložený postup bude ztracen. @@ -6733,102 +6758,102 @@ Would you like to bypass this and exit anyway? Opravdu si přejete ukončit tuto aplikaci? - + None Žádné - + FXAA FXAA - + SMAA SMAA - + Nearest - + Bilinear Bilineární - + Bicubic - + Gaussian - + ScaleForce - + Area - + Docked Zadokovaná - + Handheld Příruční - + Normal Normální - + High Vysoká - + Extreme Extrémní - + Vulkan Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6836,13 +6861,13 @@ Opravdu si přejete ukončit tuto aplikaci? GRenderWindow - - + + OpenGL not available! OpenGL není k dispozici! - + OpenGL shared contexts are not supported. @@ -6851,33 +6876,33 @@ Opravdu si přejete ukončit tuto aplikaci? yuzu nebylo sestaveno s OpenGL podporou. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Chyba při inicializaci OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Vaše grafická karta pravděpodobně nepodporuje OpenGL nebo nejsou nainstalovány nejnovější ovladače. - + Error while initializing OpenGL 4.6! Chyba při inicializaci OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Vaše grafická karta pravděpodobně nepodporuje OpenGL 4.6 nebo nejsou nainstalovány nejnovější ovladače.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Vaše grafická karta pravděpodobně nepodporuje jedno nebo více rozšíření OpenGL. Ujistěte se prosím, že jsou nainstalovány nejnovější ovladače.<br><br>GL Renderer:<br>%1<br><br>Nepodporované rozšíření:<br>%2 @@ -6885,128 +6910,128 @@ Opravdu si přejete ukončit tuto aplikaci? GameList - + Favorite Oblíbené - + Start Game Spustit hru - + Start Game without Custom Configuration Spustit hru bez vlastní konfigurace - + Open Save Data Location Otevřít Lokaci Savů - + Open Mod Data Location Otevřít Lokaci Modifikací - + Open Transferable Pipeline Cache - + Remove Odstranit - + Remove Installed Update Odstranit nainstalovanou aktualizaci - + Remove All Installed DLC Odstranit všechny nainstalované DLC - + Remove Custom Configuration Odstranit vlastní konfiguraci hry - + Remove Play Time Data Odstranit data o době hraní - + Remove Cache Storage - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches - + Remove All Installed Contents Odstranit všechen nainstalovaný obsah - + Dump RomFS Vypsat RomFS - + Dump RomFS to SDMC - + Verify Integrity Ověřit Integritu - + Copy Title ID to Clipboard Zkopírovat ID Titulu do schránky - + Navigate to GameDB entry Navigovat do GameDB - + Create Shortcut Vytvořit Zástupce - + Add to Desktop - + Add to Applications Menu - + Configure Game @@ -7015,62 +7040,62 @@ Opravdu si přejete ukončit tuto aplikaci? Vlastnosti - + Scan Subfolders Prohledat podsložky - + Remove Game Directory Odstranit složku se hrou - + ▲ Move Up ▲ Posunout nahoru - + ▼ Move Down ▼ Posunout dolů - + Open Directory Location Otevřít umístění složky - + Clear Vymazat - + Name Název - + Compatibility Kompatibilita - + Add-ons Modifkace - + File type Typ-Souboru - + Size Velikost - + Play time Doba hraní @@ -7078,62 +7103,62 @@ Opravdu si přejete ukončit tuto aplikaci? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Perfect Perfektní - + Game can be played without issues. Hra může být hrána bez problémů. - + Playable Hratelné - + Game functions with minor graphical or audio glitches and is playable from start to finish. Hra funguje s drobnými grafickými nebo zvukovými chybami a je hratelná od začátku do konce. - + Intro/Menu Intro/Menu - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot Nebootuje - + The game crashes when attempting to startup. Hra crashuje při startu. - + Not Tested Netestováno - + The game has not yet been tested. Hra ještě nebyla testována @@ -7141,7 +7166,7 @@ Opravdu si přejete ukončit tuto aplikaci? GameListPlaceholder - + Double-click to add a new folder to the game list Dvojitým kliknutím přidáte novou složku do seznamu her @@ -7149,21 +7174,20 @@ Opravdu si přejete ukončit tuto aplikaci? GameListSearchField - + %1 of %n result(s) - - + Filter: Filtr: - + Enter pattern to filter Zadejte filtr @@ -7245,7 +7269,7 @@ Opravdu si přejete ukončit tuto aplikaci? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7253,213 +7277,213 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Pořídit Snímek Obrazovky - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy Změnit Přesnost GPU - + Configure - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen Opustit Režim Celé Obrazovky + + + Exit Eden + + + + + Load/Remove Amiibo + + + + + Multiplayer Browse Public Game Lobby + + + + + Multiplayer Create Room + + + + + Multiplayer Direct Connect to Room + + + + + Multiplayer Leave Room + + + + + Multiplayer Show Current Room + + + + + Restart Emulation + + + + + Stop Emulation + + + + + TAS Record + + + + + TAS Reset + + + + + TAS Start/Stop + + + + + Toggle Filter Bar + + + + + Toggle Framerate Limit + + + + + Toggle Mouse Panning + + + + + Toggle Renderdoc Capture + + + + + Toggle Status Bar + + Exit yuzu Ukončit yuzu - - Exit eden - - - - + Fullscreen Celá Obrazovka - + Load File Načíst soubor - - - Load/Remove Amiibo - - - - - Multiplayer Browse Public Game Lobby - - - - - Multiplayer Create Room - - - - - Multiplayer Direct Connect to Room - - - - - Multiplayer Leave Room - - - - - Multiplayer Show Current Room - - - - - Restart Emulation - - - - - Stop Emulation - - - - - TAS Record - - - - - TAS Reset - - - - - TAS Start/Stop - - - - - Toggle Filter Bar - - - - - Toggle Framerate Limit - - - - - Toggle Mouse Panning - - - - - Toggle Renderdoc Capture - - - - - Toggle Status Bar - - InstallDialog - + Please confirm these are the files you wish to install. Potvrďte, že se jedná o soubory, které chcete nainstalovat. - + Installing an Update or DLC will overwrite the previously installed one. Instalací aktualizace nebo DLC se přepíše dříve nainstalovaná aktualizace nebo DLC. - + Install Nainstalovat - + Install Files to NAND Instalovat soubory na NAND @@ -7467,7 +7491,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 @@ -7613,152 +7637,207 @@ Debug Message: &Nedávné soubory - + + Open &Eden Folders + + + + &Emulation &Emulace - + &View &Pohled - + &Reset Window Size &Resetovat Velikost Okna - + &Debugging &Ladění - + Reset Window Size to &720p Nastavit velikost okna na &720p - + Reset Window Size to 720p Nastavit velikost okna na 720p - + Reset Window Size to &900p Resetovat Velikost Okna na &900p - + Reset Window Size to 900p Resetovat Velikost Okna na 900p - + Reset Window Size to &1080p Nastavit velikost okna na &1080p - + Reset Window Size to 1080p Nastavit velikost okna na 1080p - + &Multiplayer - + &Tools &Nástroje - + &Amiibo - + &TAS - + &Create Home Menu Shortcut - + &Help &Pomoc - + &Install Files to NAND... &Instalovat soubory na NAND... - + L&oad File... Načís&t soubor... - + Load &Folder... Načíst sl&ožku... - + E&xit E&xit - + &Pause &Pauza - + &Stop &Stop - + &Verify Installed Contents &Ověřit Nainstalovaný Obsah - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7767,97 +7846,97 @@ Debug Message: O &aplikaci yuzu - + Single &Window Mode &Režim jednoho okna - + Con&figure... &Nastavení - + Ctrl+, - + Display D&ock Widget Headers Zobrazit záhlaví widgetů d&oku - + Show &Filter Bar Zobrazit &filtrovací panel - + Show &Status Bar Zobrazit &stavový řádek - + Show Status Bar Zobrazit Staus Bar - + &Browse Public Game Lobby - + &Create Room &Vytvořit Místnost - + &Leave Room &Opustit Místnost - + &Direct Connect to Room - + &Show Current Room - + F&ullscreen &Celá obrazovka - + &Restart &Restartovat - + Load/Remove &Amiibo... - + &Report Compatibility &Nahlásit kompatibilitu - + Open &Mods Page Otevřít stránku s &modifikacemi - + Open &Quickstart Guide Otevřít &rychlého průvodce - + &FAQ Často &kladené otázky @@ -7866,77 +7945,82 @@ Debug Message: Otevřít složku s &yuzu - + &Capture Screenshot Za&chytit snímek obrazovky - + Open &Album Otevřít &Album - + &Set Nickname and Owner &Nastavit Přezdívku a Vlastníka - + &Delete Game Data &Odstranit Herní Data - + &Restore Amiibo &Obnovit Amiibo - + &Format Amiibo - + Open &Mii Editor Otevřít &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... Nastavení současné hry - + &Start &Start - + &Reset &Resetovat - + R&ecord - + Open &Controller Menu Otevřít &Menu Ovladače - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7944,26 +8028,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8023,37 +8117,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! Nepřipojeno. Klikni zde pro nalezení místnosti! - + Not Connected Nepřipojeno - + Connected Připojeno - + New Messages Received - + Error - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8170,56 +8264,56 @@ p, li { white-space: pre-wrap; } Nehraje hru - + Installed SD Titles Nainstalované SD tituly - + Installed NAND Titles Nainstalované NAND tituly - + System Titles Systémové tituly - + Add New Game Directory Přidat novou složku s hrami - + Favorites Oblíbené - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [Nenastaveno] @@ -8230,14 +8324,14 @@ p, li { white-space: pre-wrap; } Poziční klobouček %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Osa %1%2 @@ -8248,357 +8342,357 @@ p, li { white-space: pre-wrap; } Tlačítko %1 - - - - - - + + + + + + [unknown] [Neznámá] - - - + + + Left Doleva - - - + + + Right Doprava - - - + + + Down Dolů - - - + + + Up Nahoru - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 - - + + L2 - - + + L3 - - + + R1 - - + + R2 - - + + R3 - - + + Circle - - + + Cross - - + + Square - - + + Triangle - - + + Share - - + + Options - - + + [undefined] - + %1%2 %1%2 - - + + [invalid] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 - - + + %1%2Motion %3 - - + + %1%2Button %3 - - + + [unused] [nepoužito] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L - + Stick R - + Plus Plus - + Minus Minus - - + + Home Home - + Capture Capture - + Touch Dotyk - + Wheel Indicates the mouse wheel - + Backward - + Forward - + Task - + Extra - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8716,6 +8810,298 @@ p, li { white-space: pre-wrap; } Chcete obnovit toto amiibo? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + Ověřování integrity... + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + + + + + Error Removing Update + + + + + Error Removing DLC + + + + + The base game is not installed in the NAND and cannot be removed. + Základ hry není nainstalovaný na NAND a nemůže být odstraněn. + + + + There is no update installed for this title. + Není nainstalovaná žádná aktualizace pro tento titul. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Úspěšně odebráno + + + + Successfully removed %1 installed DLC. + Úspěšně odstraněno %1 nainstalovaných DLC. + + + + + Error Removing Transferable Shader Cache + Chyba při odstraňování přenositelné mezipaměti shaderů + + + + + A shader cache for this title does not exist. + Mezipaměť shaderů pro tento titul neexistuje. + + + + Successfully removed the transferable shader cache. + Přenositelná mezipaměť shaderů úspěšně odstraněna + + + + Failed to remove the transferable shader cache. + Nepodařilo se odstranit přenositelnou mezipaměť shaderů + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + Chyba při odstraňování vlastní konfigurace hry + + + + A custom configuration for this title does not exist. + Vlastní konfigurace hry pro tento titul neexistuje. + + + + Successfully removed the custom game configuration. + Úspěšně odstraněna vlastní konfigurace hry. + + + + Failed to remove the custom game configuration. + Nepodařilo se odstranit vlastní konfiguraci hry. + + + + Reset Metadata Cache + Resetovat mezipaměť metadat + + + + The metadata cache is already empty. + Mezipaměť metadat je již prázdná. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Mezipaměť metadat nemohla být odstraněna. Možná je používána nebo neexistuje. + + + + Create Shortcut + Vytvořit Zástupce + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Úspěšně vytvořen zástupce do %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Nepodařilo se vytvořit zástupce do %1 + + + + Create Icon + Vytvořit Ikonu + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + Není k dispozici žádný firmware + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9011,7 +9397,7 @@ Zkuste to prosím znovu nebo kontaktujte vývojáře softwaru. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9019,7 +9405,7 @@ Zkuste to prosím znovu nebo kontaktujte vývojáře softwaru. %2 - + Users Uživatelé @@ -9143,7 +9529,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Call stack @@ -9151,12 +9537,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread čekání bez přiřazeného vlákna @@ -9164,102 +9550,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable spustitelné - + paused pauznuto - + sleeping spící - + waiting for IPC reply čekání na odpověd IPC - + waiting for objects waiting for objects - + waiting for condition variable čekání na proměnnou podmínky - + waiting for address arbiter waiting for address arbiter - + waiting for suspend resume čekání na obnovení pozastavení - + waiting čekání - + initialized inicializováno - + terminated ukončeno - + unknown neznámý - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideální - + core %1 jádro %1 - + processor = %1 procesor = %1 - + affinity mask = %1 affinity mask = %1 - + thread id = %1 id vlákna = %1 - + priority = %1(current) / %2(normal) priorita = %1(aktuální) / %2(normální) - + last running ticks = %1 last running ticks = %1 @@ -9267,7 +9653,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread waited by thread @@ -9275,7 +9661,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree Ř&etězec čekání diff --git a/dist/languages/da.ts b/dist/languages/da.ts index 49cd8e6546..bb03ef18ca 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Kommunikerer med serveren... - + Cancel Afbryd - + Touch the top left corner <br>of your touchpad. Rør det øverste venstre hjørne <br> af din pegeplade. - + Now touch the bottom right corner <br>of your touchpad. Rør nu det nederste højre hjørne <br> af din pegeplade. - + Configuration completed! Konfiguration fuldført! - + OK OK @@ -397,502 +397,139 @@ Dette vil bandlyse både vedkommendes forum-brugernavn og IP-adresse. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - - Error - - - - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Udgangsmotor: - - Output Device: - - - - - Input Device: - - - - - Mute audio - - - - + Volume: Lydstyrke: - + Mute audio when in background Gør lydløs, når i baggrunden - + Multicore CPU Emulation Flerkerne-CPU-Emulering - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Begræns Hastighedsprocent - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Nøjagtighed - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Adskil FMA (forbedr ydeevne på CPUer uden FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Hurtigere FRSQRTE og FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Hurtigere ASIMD-instrukser (kun 32-bit) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Unøjagtig NaN-håndtering - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Deaktivér adresseplads-kontrol - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Ignorér global overvågning - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Enhed: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Shader-Bagende: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Opløsning: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Vinduestilpassende Filter: - - FSR Sharpness: - - - - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Anti-Aliaseringsmetode: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Fuldskærmstilstand: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Skærmformat: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Brug disk-rørlinje-mellemlager - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Brug asynkron GPU-emulering - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC-emulering: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - - VSync Mode: - - - - - FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. -FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. -Mailbox can have lower latency than FIFO and does not tear but may drop frames. -Immediate (no synchronization) just presents whatever is available and can exhibit tearing. - - - - - Enable asynchronous presentation (Vulkan only) - - - - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - - Force maximum clocks (Vulkan only) - - - - - Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - - - - + Anisotropic Filtering: Anisotropisk Filtrering: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Nøjagtighedsniveau + Nøjagtighedsniveau - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Brug asynkron shader-opbygning (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Brug Hurtig GPU-Tid (Hack) @@ -902,1021 +539,1481 @@ This feature is experimental. Aktiverer Hurtig GPU-Tid. Denne valgmulighed vil tvinge de fleste spil, til at køre i deres højeste indbyggede opløsning. - + + RNG Seed + RNG-Seed + + + + Note: this can be overridden when region setting is auto-select + Bemærk: Dette kan overskrives, når regionsindstillinger er sat til automatisk valg + + + + Region: + Region + + + + Time Zone: + Tidszone + + + + Prompt for user on game boot + Spørg efter bruger, ved opstart af spil + + + + Pause emulation when in background + Sæt emulering på pause, når i baggrund + + + + Hide mouse on inactivity + Skjul mus ved inaktivitet + + + + CPU + CPU + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly-Shadere, kun NVIDIA) + + + + Auto + Automatisk + + + + Accurate + Nøjagtig + + + + Unsafe + Usikker + + + + Paranoid (disables most optimizations) + Paranoid (deaktiverer de fleste optimeringer) + + + + Borderless Windowed + Uindrammet Vindue + + + + Exclusive Fullscreen + Eksklusiv Fuld Skærm + + + + No Video Output + Ingen Video-Output + + + + CPU Video Decoding + CPU-Video Afkodning + + + + GPU Video Decoding (Default) + GPU-Video Afkodning (Standard) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0,75X (540p/810p) [EKSPERIMENTEL] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + Nearest Neighbor + Nærmeste Nabo + + + + Bilinear + Bilineær + + + + Bicubic + Bikubisk + + + + Gaussian + Gausisk + + + + ScaleForce + ScaleForce + + + + None + Ingen + + + + FXAA + FXAA + + + + Default (16:9) + Standard (16:9) + + + + Force 4:3 + Tving 4:3 + + + + Force 21:9 + Tving 21:9 + + + + Stretch to Window + Stræk til Vindue + + + + + Default + Standard + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Error + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Output Device: + + + + + Input Device: + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + FSR Sharpness: + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + VSync Mode: + + + + + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. +FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. +Mailbox can have lower latency than FIFO and does not tear but may drop frames. +Immediate (no synchronization) just presents whatever is available and can exhibit tearing. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Enable asynchronous presentation (Vulkan only) + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Force maximum clocks (Vulkan only) + + + + + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - RNG-Seed + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - + Device Name - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Bemærk: Dette kan overskrives, når regionsindstillinger er sat til automatisk valg - - - - Region: - Region - - - + The region of the emulated Switch. - - Time Zone: - Tidszone - - - + The time zone of the emulated Switch. - + Sound Output Mode: - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Spørg efter bruger, ved opstart af spil - - - - Pause emulation when in background - Sæt emulering på pause, når i baggrund - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Skjul mus ved inaktivitet - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - + OpenGL - + Vulkan - + Null - + GLSL - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly-Shadere, kun NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - + Normal - + High - + Extreme - - Auto - Automatisk + + Unsafe (fast) + - - Accurate - Nøjagtig + + Safe (stable) + - - Unsafe - Usikker - - - - Paranoid (disables most optimizations) - Paranoid (deaktiverer de fleste optimeringer) - - - + Dynarmic - + NCE - - Borderless Windowed - Uindrammet Vindue - - - - Exclusive Fullscreen - Eksklusiv Fuld Skærm - - - - No Video Output - Ingen Video-Output - - - - CPU Video Decoding - CPU-Video Afkodning - - - - GPU Video Decoding (Default) - GPU-Video Afkodning (Standard) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0,75X (540p/810p) [EKSPERIMENTEL] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - + 1.5X (1080p/1620p) [EXPERIMENTAL] - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - + 7X (5040p/7560p) - + 8X (5760p/8640p) - - Nearest Neighbor - Nærmeste Nabo - - - - Bilinear - Bilineær - - - - Bicubic - Bikubisk - - - - Gaussian - Gausisk - - - - ScaleForce - ScaleForce - - - + AMD FidelityFX™️ Super Resolution - + Area - - None - Ingen - - - - FXAA - FXAA - - - + SMAA - - Default (16:9) - Standard (16:9) - - - - Force 4:3 - Tving 4:3 - - - - Force 21:9 - Tving 21:9 - - - + Force 16:10 - - Stretch to Window - Stræk til Vindue - - - + Automatic - - Default - Standard - - - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Dokket - + Handheld Håndholdt - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2265,27 +2362,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Logføring - + Open Log Location Åbn Logplacering - + Global Log Filter Globalt Logfilter - + When checked, the max size of the log increases from 100 MB to 1 GB Når valgt, øges loggens maksimale størrelse fra 100 MB til 1 GB - + Enable Extended Logging** Aktivér Udvidet Logning** - + Show Log in Console Vis Log i Konsol @@ -2431,7 +2528,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2493,7 +2590,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Dette vil automatisk blive nulstillet, når yuzu lukkes. - + Web applet not compiled Net-applet ikke kompileret @@ -2543,7 +2640,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2552,88 +2649,88 @@ When a guest attempts to open the controller applet, it is immediately closed. - + Applets - - + + Audio Lyd - - + + CPU CPU - + Debug Fejlfind - + Filesystem Filsystem - - + + General Generelt - - + + Graphics Grafik - + GraphicsAdvanced GrafikAvanceret - + GraphicsExtensions - + Hotkeys Genvejstaster - - + + Controls Styring - + Profiles Profiler - + Network Netværk - - + + System System - + Game List Spilliste - + Web Net @@ -2731,51 +2828,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Nulstil Metadata-Mellemlager - + Select Emulated NAND Directory... Vælg Emuleret NAND-Mappe... - + Select Emulated SD Directory... Vælg Emuleret SD-Mappe... - + Select Gamecard Path... Vælg Spilkort-Sti... - + Select Dump Directory... Vælg Nedfældningsmappe... - + Select Mod Load Directory... Vælg Mod-Indlæsningsmappe... - The metadata cache is already empty. - Metadata-mellemlageret er allerede tomt. + Metadata-mellemlageret er allerede tomt. - The operation completed successfully. - Fuldførelse af opgaven lykkedes. + Fuldførelse af opgaven lykkedes. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Metadata-mellemlageret kunne ikke slettes. Det kan være i brug eller ikke-eksisterende. + Metadata-mellemlageret kunne ikke slettes. Det kan være i brug eller ikke-eksisterende. @@ -2806,12 +2897,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? dette nulstiller alle indstillinger og fjerner alle pr-spil-konfigurationer. Dette vil ikke slette spilmapper, -profiler, eller input-profiler. Fortsæt? @@ -2844,33 +2935,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Baggrundsfarve: - + % FSR sharpening percentage (e.g. 50%) % - + Off - + VSync Off - + Recommended - + On - + VSync On @@ -2907,14 +2998,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2946,75 +3041,75 @@ These settings are experimental, and may cause black screens. If your games fail Gendan Standarder - + Action Handling - + Hotkey Genvejstast - + Controller Hotkey - - - + + + Conflicting Key Sequence Modstridende Tastesekvens - - + + The entered key sequence is already assigned to: %1 Den indtastede tastesekvens er allerede tilegnet: %1 - + [waiting] [venter] - + Invalid - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Gendan Standard - + Clear Ryd - + Conflicting Button Sequence - + The default button sequence is already assigned to: %1 - + The default key sequence is already assigned to: %1 Standard-tastesekvensen er allerede tilegnet: %1 @@ -3334,7 +3429,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3489,7 +3584,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Venstre Styrepind @@ -3599,14 +3694,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3625,7 +3720,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plus @@ -3638,15 +3733,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3691,7 +3786,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Højre Styrepind @@ -3706,242 +3801,242 @@ These settings are experimental, and may cause black screens. If your games fail Konfigurér - - - - + + + + Clear Ryd - - - - - + + + + + [not set] [ikke indstillet] - - - + + + Invert button - - + + Toggle button Funktionsskifteknap - + Turbo button - - + + Invert axis Omvend akser - - - + + + Set threshold Angiv tærskel - - + + Choose a value between 0% and 100% Vælg en værdi imellem 0% og 100% - + Toggle axis - + Set gyro threshold - + Calibrate sensor - + Map Analog Stick Tilsted Analog Pind - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Bevæg, efter tryk på OK, først din styrepind vandret og så lodret. Bevæg, for at omvende akserne, først din styrepind lodret og så vandret. - + Center axis - - + + Deadzone: %1% Dødzone: %1% - - + + Modifier Range: %1% Forandringsrækkevidde: %1% - - + + Pro Controller Pro-Styringsenhed - + Dual Joycons Dobbelt-Joycon - + Left Joycon Venstre Joycon - + Right Joycon Højre Joycon - + Handheld Håndholdt - + GameCube Controller GameCube-Styringsenhed - + Poke Ball Plus - + NES Controller - + SNES Controller - + N64 Controller - + Sega Genesis - + Start / Pause Start / Pause - + Z Z - + Control Stick Styrepind - + C-Stick C-Pind - + Shake! Ryst! - + [waiting] [venter] - + New Profile Ny Profil - + Enter a profile name: Indtast et profilnavn: - - + + Create Input Profile Opret Input-Profil - + The given profile name is not valid! Det angivne profilnavn er ikke gyldigt! - + Failed to create the input profile "%1" Oprettelse af input-profil "%1" mislykkedes - + Delete Input Profile Slet Input-Profil - + Failed to delete the input profile "%1" Sletning af input-profil "%1" mislykkedes - + Load Input Profile Indlæs Input-Profil - + Failed to load the input profile "%1" Indlæsning af input-profil "%1" mislykkedes - + Save Input Profile Gem Input-Profil - + Failed to save the input profile "%1" Lagring af input-profil "%1" mislykkedes @@ -3998,7 +4093,7 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret. - + Configure Konfigurér @@ -4034,7 +4129,7 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret. - + Test Afprøv @@ -4053,7 +4148,7 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.<a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Find Ud Af Mere</span></a> - + %1:%2 %1:%2 @@ -4062,77 +4157,77 @@ Bevæg, for at omvende akserne, først din styrepind lodret og så vandret.yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Portnummer indeholder ugyldige tegn - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Port skal være imellem 0 and 65353 - + IP address is not valid IP-adresse er ikke gyldig - + This UDP server already exists Denne UDP-server eksisterer allerede - + Unable to add more than 8 servers Ude af stand til, at tilføje mere end 8 servere - + Testing Afprøvning - + Configuring Konfigurér - + Test Successful Afprøvning Lykkedes - + Successfully received data from the server. Modtagelse af data fra serveren lykkedes. - + Test Failed Afprøvning Mislykkedes - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kunne ikke modtage gyldig data fra serveren.<br>Bekræft venligst, at serveren er opsat korrekt, og at adressen og porten er korrekte. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-Afprøvnings- eller -kalibreringskonfiguration er i gang.<br>vent venligst på, at de bliver færdige. @@ -4258,7 +4353,12 @@ Current values are %1% and %2% respectively. Netværksgrænseflade - + + Enable Airplane Mode + + + + None Ingen @@ -4316,52 +4416,52 @@ Current values are %1% and %2% respectively. - + Add-Ons Tilføjelser - + System System - + CPU CPU - + Graphics Grafik - + Adv. Graphics - + GPU Extensions - + Audio Lyd - + Input Profiles - + Linux - + Properties Egenskaber @@ -4379,12 +4479,12 @@ Current values are %1% and %2% respectively. Tilføjelser - + Patch Name Lap-Navn - + Version Version @@ -4422,27 +4522,32 @@ Current values are %1% and %2% respectively. Angiv Billede - + + Select Avatar + + + + Add Tilføj - + Rename Omdøb - + Remove Fjern - + Profile management is available only when game is not running. Profilhåndtering er kun tilgængelig, når spil ikke kører. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4450,100 +4555,181 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Indtast Brugernavn - + Users Brugere - + Enter a username for the new user: Indtast et brugernavn for den nye bruger: - + Enter a new username: Indtast et nyt brugernavn: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Vælg Brugerbillede - - JPEG Images (*.jpg *.jpeg) - JPEG-Billeder (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG-Billeder (*.jpg *.jpeg) + + + Error deleting image Fejl ved sletning af billede - + Error occurred attempting to overwrite previous image at: %1. Der skete en fejl, ved forsøg på at overskrive forrige billede på: %1. - + Error deleting file Fejl ved sletning af fil - + Unable to delete existing file: %1. Kan ikke slette eksisterende fil: %1. - + Error creating user image directory Fejl ved oprettelse af brugerbillede-mappe - + Unable to create directory %1 for storing user images. Ude af stand til, at oprette mappe %1, til lagring af brugerbilleder. - Error copying user image - Fejl ved kopiering af brugerbillede + Fejl ved kopiering af brugerbillede - Unable to copy image from %1 to %2 - Ude af stand til, at kopiere billede fra %1 til %2 + Ude af stand til, at kopiere billede fra %1 til %2 + + + ConfigureProfileManagerAvatarDialog - - Error resizing user image + + Select - - Unable to resize image + + Cancel + Afbryd + + + + Background Color + + + + + Select Firmware Avatar ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. - + Confirm Delete Bekræft Slet - + Name: %1 UUID: %2 @@ -4595,7 +4781,7 @@ UUID: %2 - + Enable @@ -4606,7 +4792,7 @@ UUID: %2 - + Not connected @@ -4616,63 +4802,63 @@ UUID: %2 Gendan Standarder - + Clear Ryd - + [not set] [ikke indstillet] - + Invert axis Omvend akser - - + + Deadzone: %1% Dødzone: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Konfigurér - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [venter] @@ -4714,7 +4900,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4766,12 +4952,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS-Konfiguration - + Select TAS Load Directory... Vælg TAS-Indlæsningsmappe... @@ -4881,7 +5067,7 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5201,6 +5387,16 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r Web Net + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu-Nettjeneste @@ -5210,42 +5406,29 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r Ved at give dit brugernavn og token, accepterer du, at tillade yuzu, at indsamle yderligere brugsdata, hvilket kan inkludere brugeridentificerende oplysninger. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Bekræft + Bekræft - Sign up - Tilmeld dig + Tilmeld dig - + Token: Token: - + Username: Brugernavn: - What is my token? - Hvad er mit token? + Hvad er mit token? - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5270,12 +5453,12 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r Regenerér - + Discord Presence Tilstedeværelse på Discord - + Show Current Game in your Discord Status Vis Aktuelt Spil i din Discord-Status @@ -5284,24 +5467,8 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Find ud af mere</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Tilmeld dig</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Tilmeld dig</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5323,12 +5490,6 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r Token was not verified. The change to your token has not been saved. Token blev ikke bekræftet. Ændringen af dit token er ikke blevet gemt. - - - Unverified, please click Verify before saving configuration - Tooltip - - Verifying... Bekræfter... @@ -5346,20 +5507,67 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Bekræftelse mislykkedes. Kontrollér at du har indtastet dit token korrekt, og at din internetforbindelse virker. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Styringsenhed P1 - + &Controller P1 &Styringsenhed P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Version + + DirectConnect @@ -5465,7 +5673,12 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5473,11 +5686,6 @@ Træk punkter, for at skifte position, eller dobbeltklik i tabelceller, for at r The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5537,583 +5745,362 @@ Please go to Configure -> System -> Network and make a selection. Telemetri - + Broken Vulkan Installation Detected - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Indlæser Net-Applet... - - + + Disable Web Applet Deaktivér Net-Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuel emuleringshastighed. Værdier højere eller lavere end 100% indikerer, at emulering kører hurtigere eller langsommere end en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + &Pause - Warning Outdated Game Format - Advarsel, Forældet Spilformat + Advarsel, Forældet Spilformat - - + + Error while loading ROM! Fejl under indlæsning af ROM! - + The ROM format is not supported. ROM-formatet understøttes ikke. - + An error occurred initializing the video core. Der skete en fejl under initialisering af video-kerne. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. - + (64-bit) - + (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder Fejl ved Åbning af %1 Mappe - - + + Folder does not exist! Mappe eksisterer ikke! - - Error Opening Transferable Shader Cache - - - - - Failed to create the shader cache directory for this title. - - - - - Error Removing Contents - - - - - Error Removing Update - - - - - Error Removing DLC - - - - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - - - - - - - Successfully Removed - - - - - Successfully removed the installed base game. - - - - - The base game is not installed in the NAND and cannot be removed. - - - - - Successfully removed the installed update. - - - - - There is no update installed for this title. - - - - - There are no DLC installed for this title. - - - - - Successfully removed %1 installed DLC. - - - - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - - Error Removing Transferable Shader Cache - - - + - - A shader cache for this title does not exist. - - - - - Successfully removed the transferable shader cache. - - - - - Failed to remove the transferable shader cache. - - - - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - - Error Removing Custom Configuration - - - - - A custom configuration for this title does not exist. - - - - - Successfully removed the custom game configuration. - - - - - Failed to remove the custom game configuration. - - - - - RomFS Extraction Failed! RomFS-Udpakning Mislykkedes! - + There was an error copying the RomFS files or the user cancelled the operation. Der skete en fejl ved kopiering af RomFS-filerne, eller brugeren afbrød opgaven. - + Full Fuld - + Skeleton Skelet - + Select RomFS Dump Mode Vælg RomFS-Nedfældelsestilstand - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Udpakker RomFS... - - - - - + + Cancel Afbryd - + RomFS Extraction Succeeded! RomFS-Udpakning Lykkedes! - - - + The operation completed successfully. Fuldførelse af opgaven lykkedes. - - Integrity verification couldn't be performed! + + Warning: Outdated Game Format - - File contents were not checked for validity. + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - Verifying integrity... + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - Integrity verification succeeded! + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - - Create Shortcut - - - - - Do you want to launch the game in fullscreen? - - - - - Successfully created a shortcut to %1 - - - - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - - Create Icon - - - - - Cannot create icon file. Path "%1" does not exist and cannot be created. - - - - + Error Opening %1 Fejl ved Åbning af %1 - + Select Directory Vælg Mappe - + Properties Egenskaber - + The game properties could not be loaded. Spil-egenskaberne kunne ikke indlæses. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch-Eksekverbar (%1);;Alle filer (*.*) - + Load File Indlæs Fil - + Open Extracted ROM Directory Åbn Udpakket ROM-Mappe - + Invalid Directory Selected Ugyldig Mappe Valgt - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining @@ -6121,24 +6108,24 @@ Please go to Configure -> System -> Network and make a selection. - + Installing file "%1"... Installér fil "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed @@ -6147,7 +6134,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten @@ -6156,7 +6143,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install @@ -6165,484 +6152,438 @@ Please, only use this feature to install updates and DLC. - + System Application Systemapplikation - + System Archive Systemarkiv - + System Application Update Systemapplikationsopdatering - + Firmware Package (Type A) Firmwarepakke (Type A) - + Firmware Package (Type B) Firmwarepakke (Type B) - + Game Spil - + Game Update Spilopdatering - + Game DLC Spiludvidelse - + Delta Title Delta-Titel - + Select NCA Install Type... Vælg NCA-Installationstype... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install Installation mislykkedes - + The title type you selected for the NCA is invalid. - + File not found Fil ikke fundet - + File "%1" not found Fil "%1" ikke fundet - + OK OK - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account Manglende yuzu-Konto - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? - + + Encryption keys are missing. + + + + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-Fil (%1);; Alle Filer (*.*) - + Load Amiibo Indlæs Amiibo - + Error loading Amiibo data Fejl ved indlæsning af Amiibo-data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Optag Skærmbillede - + PNG Image (*.png) PNG-Billede (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + &Start - + Stop R&ecording - + R&ecord - + Building: %n shader(s) @@ -6650,70 +6591,70 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% Hastighed: %1% / %2% - + Speed: %1% Hastighed: %1% - + Game: %1 FPS Spil: %1 FPS - + Frame: %1 ms Billede: %1 ms - + %1 %2 - - + + FSR - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. @@ -6726,107 +6667,107 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Er du sikker på, at du vil stoppe emulereingen? Enhver ulagret data, vil gå tabt. - + None Ingen - + FXAA FXAA - + SMAA - + Nearest - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + ScaleForce ScaleForce - + Area - + Docked Dokket - + Handheld Håndholdt - + Normal - + High - + Extreme - + Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6834,44 +6775,44 @@ Would you like to download it? GRenderWindow - - + + OpenGL not available! - + OpenGL shared contexts are not supported. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 @@ -6879,128 +6820,128 @@ Would you like to download it? GameList - + Favorite - + Start Game - + Start Game without Custom Configuration - + Open Save Data Location Åbn Gemt Data-Placering - + Open Mod Data Location Åbn Mod-Data-Placering - + Open Transferable Pipeline Cache - + Remove Fjern - + Remove Installed Update - + Remove All Installed DLC - + Remove Custom Configuration - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches - + Remove All Installed Contents - + Dump RomFS - + Dump RomFS to SDMC - + Verify Integrity - + Copy Title ID to Clipboard Kopiér Titel-ID til Udklipsholder - + Navigate to GameDB entry - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + Configure Game @@ -7009,62 +6950,62 @@ Would you like to download it? Egenskaber - + Scan Subfolders - + Remove Game Directory - + ▲ Move Up - + ▼ Move Down - + Open Directory Location - + Clear Ryd - + Name Navn - + Compatibility Kompatibilitet - + Add-ons Tilføjelser - + File type Filtype - + Size Størrelse - + Play time @@ -7072,62 +7013,62 @@ Would you like to download it? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Perfect Perfekt - + Game can be played without issues. - + Playable - + Game functions with minor graphical or audio glitches and is playable from start to finish. - + Intro/Menu Intro/Menu - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot Starter Ikke Op - + The game crashes when attempting to startup. - + Not Tested Ikke Afprøvet - + The game has not yet been tested. Spillet er endnu ikke blevet afprøvet. @@ -7135,7 +7076,7 @@ Would you like to download it? GameListPlaceholder - + Double-click to add a new folder to the game list @@ -7143,7 +7084,7 @@ Would you like to download it? GameListSearchField - + %1 of %n result(s) @@ -7151,12 +7092,12 @@ Would you like to download it? - + Filter: Filter: - + Enter pattern to filter @@ -7238,7 +7179,7 @@ Would you like to download it? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7246,186 +7187,186 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Optag Skærmbillede - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy - + Configure Konfigurér - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen - - Exit eden + + Exit Eden - + Fullscreen Fuldskærm - + Load File Indlæs Fil - + Load/Remove Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation - + Stop Emulation - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar @@ -7433,22 +7374,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. - + Installing an Update or DLC will overwrite the previously installed one. - + Install Installér - + Install Files to NAND @@ -7456,7 +7397,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 @@ -7602,349 +7543,412 @@ Debug Message: - + &Emulation &Emulering - + &View - + &Reset Window Size - + &Debugging - + Reset Window Size to &720p - + Reset Window Size to 720p - + Reset Window Size to &900p - + Reset Window Size to 900p - + Reset Window Size to &1080p - + Reset Window Size to 1080p - + &Multiplayer - + &Tools - + &Amiibo - + &TAS - + &Create Home Menu Shortcut - + &Help &Hjælp - + &Install Files to NAND... - + L&oad File... - + Load &Folder... - + E&xit - + &Pause - + &Stop - + &Verify Installed Contents - - &About eden - - - - - Open &eden Folder - - - - + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu - + Single &Window Mode - + + Open &Eden Folders + + + + + &About Eden + + + + Con&figure... - + Ctrl+, - + Display D&ock Widget Headers - + Show &Filter Bar - + Show &Status Bar - + Show Status Bar Vis Statuslinje - + &Browse Public Game Lobby - + &Create Room - + &Leave Room - + &Direct Connect to Room - + &Show Current Room - + F&ullscreen - + &Restart - + Load/Remove &Amiibo... - + &Report Compatibility - + Open &Mods Page - + Open &Quickstart Guide - + &FAQ - + &Capture Screenshot - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - + &Start - + &Reset - + R&ecord - + Open &Controller Menu - + + &Root Data Folder + + + + + &NAND Folder + + + + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Install Firmware - + Install Decryption Keys - - MicroProfileDialog - - - &MicroProfile - - - MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8004,37 +8008,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! - + Not Connected - + Connected Tilsluttet - + New Messages Received - + Error - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8129,56 +8133,56 @@ p, li { white-space: pre-wrap; } - + Installed SD Titles Installerede SD-Titler - + Installed NAND Titles Installerede NAND-Titler - + System Titles Systemtitler - + Add New Game Directory Tilføj Ny Spilmappe - + Favorites - - + + Shift Skift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [ikke indstillet] @@ -8189,14 +8193,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + Axis %1%2 Akse %1%2 @@ -8207,357 +8211,357 @@ p, li { white-space: pre-wrap; } Knap %1 - - - - - - + + + + + + [unknown] [ukendt] - - - + + + Left Venstre - - - + + + Right Højre - - - + + + Down ed - - - + + + Up Op - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 - - + + L2 - - + + L3 - - + + R1 - - + + R2 - - + + R3 - - + + Circle - - + + Cross - - + + Square - - + + Triangle - - + + Share - - + + Options - - + + [undefined] - + %1%2 - - + + [invalid] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 - - + + %1%2Motion %3 - - + + %1%2Button %3 - - + + [unused] [ubrugt] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L - + Stick R - + Plus Plus - + Minus Minus - - + + Home Hjem - + Capture Optag - + Touch Berøring - + Wheel Indicates the mouse wheel - + Backward - + Forward - + Task - + Extra - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8675,6 +8679,298 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Afbryd + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + Fuldførelse af opgaven lykkedes. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + + + + + Error Removing Update + + + + + Error Removing DLC + + + + + The base game is not installed in the NAND and cannot be removed. + + + + + There is no update installed for this title. + + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + + + + + Successfully removed %1 installed DLC. + + + + + + Error Removing Transferable Shader Cache + + + + + + A shader cache for this title does not exist. + + + + + Successfully removed the transferable shader cache. + + + + + Failed to remove the transferable shader cache. + + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + + + + + A custom configuration for this title does not exist. + + + + + Successfully removed the custom game configuration. + + + + + Failed to remove the custom game configuration. + + + + + Reset Metadata Cache + Nulstil Metadata-Mellemlager + + + + The metadata cache is already empty. + Metadata-mellemlageret er allerede tomt. + + + + The operation completed successfully. + Fuldførelse af opgaven lykkedes. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Metadata-mellemlageret kunne ikke slettes. Det kan være i brug eller ikke-eksisterende. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -8964,7 +9260,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -8972,7 +9268,7 @@ Please try again or contact the developer of the software. %2 - + Users Brugere @@ -9092,7 +9388,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack @@ -9100,12 +9396,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread ventet af ingen tråde @@ -9113,102 +9409,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable - + paused sat på pause - + sleeping slumrer - + waiting for IPC reply venter på IPC-svar - + waiting for objects venter på objekter - + waiting for condition variable - + waiting for address arbiter - + waiting for suspend resume - + waiting - + initialized - + terminated - + unknown - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal idéel - + core %1 kerne %1 - + processor = %1 processor = %1 - + affinity mask = %1 - + thread id = %1 tråd-id = %1 - + priority = %1(current) / %2(normal) prioritet = %1(aktuel) / %2(normal) - + last running ticks = %1 @@ -9216,7 +9512,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread ventet af tråd @@ -9224,7 +9520,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree diff --git a/dist/languages/de.ts b/dist/languages/de.ts index 538994902d..135d508917 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Verbindung mit dem Server wird hergestellt... - + Cancel Abbrechen - + Touch the top left corner <br>of your touchpad. Tippe auf die obere linke Ecke <br>deines Touchpads. - + Now touch the bottom right corner <br>of your touchpad. Tippe nun auf die untere rechte Ecke <br>deines Touchpads. - + Configuration completed! Konfiguration abgeschlossen! - + OK OK @@ -396,439 +396,198 @@ Dies würde deren Forum-Benutzernamen und deren IP-Adresse sperren. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Fehler - - Net connect - - - - - Player select - - - - + Software keyboard Software-Tastatur - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Ausgabe-Engine: - + Output Device: Ausgabegerät: - + Input Device: Eingabegerät: - + Mute audio Audio stummschalten - + Volume: Lautstärke: - + Mute audio when in background Audio im Hintergrund stummschalten - + Multicore CPU Emulation Multicore-CPU-Emulation - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - + Memory Layout Speicher-Layout - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Geschwindigkeit auf % festlegen - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Genauigkeit der Emulation: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - + + Backend: Backend: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Unfuse FMA (erhöht Leistung auf CPUs ohne FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Diese Option verbessert die Geschwindigkeit, indem die Genauigkeit von "Fused-Multiply-Add"-Anweisungen auf CPUs ohne native FMA-Unterstützung reduziert wird. - + Faster FRSQRTE and FRECPE Schnelleres FRSQRTE und FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Diese Option verbessert die Geschwindigkeit einiger ungenauen Fließkomma-Funktionen, indem weniger genaue native Annäherungen benutzt werden. - + Faster ASIMD instructions (32 bits only) Schnellere ASIMD-Instruktionen (nur 32-Bit) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Diese Option verbessert die Geschwindigkeit von 32-Bit-ASIMD-Fließkomma-Funktionen, indem diese mit inkorrekten Rundungsmodi ausgeführt werden. - + Inaccurate NaN handling Ungenaue NaN-Verarbeitung - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Adressraumprüfungen deaktivieren - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Globalen Monitor ignorieren - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Gerät: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Shader-Backend: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Auflösung: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Bildschirmanpassungsfilter: - + FSR Sharpness: FSR-Schärfe - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Kantenglättungs-Methode: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Vollbild-Modus: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Seitenverhältnis: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Disk-Pipeline-Cache verwenden - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Asynchrone GPU-Emulation verwenden - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC-Emulation: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - + ASTC Decoding Method: ASTC-Dekodier-Methode: - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - + ASTC Recompression Method: ASTC-Rekompression-Methode: - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: VSync-Modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -839,62 +598,34 @@ Mailbox kann eine geringere Latenz als FIFO haben und zeigt kein Tearing, kann a Immediate (keine Synchronisierung) zeigt direkt, was verfügbar ist und kann Tearing zeigen. - + Enable asynchronous presentation (Vulkan only) Aktiviere asynchrone Präsentation (Nur Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Erzwinge Maximale Taktrate (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Lässt im Hintergrund die GPU Aufgaben erledigen während diese auf Grafikbefehle wartet, damit diese nicht herunter taktet. - + Anisotropic Filtering: Anisotrope Filterung: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Genauigkeit der Emulation: + Genauigkeit der Emulation: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Aktiviere asynchrones Shader-Kompilieren. (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Verwende Schnelle GPU-Zeit (Hack) @@ -904,23 +635,17 @@ This feature is experimental. Aktiviert Schnelle GPU-Zeit. Diese Option zwingt die meisten Spiele dazu, mit ihrer höchsten nativen Auflösung zu laufen. - + Use Vulkan pipeline cache Vulkan-Pipeline-Cache verwenden - - Enables GPU vendor-specific pipeline cache. -This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - - - - + Enable Compute Pipelines (Intel Vulkan Only) Aktiviere Compute-Pipelines (Nur Intel Vulkan) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -929,960 +654,1332 @@ Diese Einstellung existiert nur für proprietäre Intel-Treiber, und kann zu Abs Compute-Pipelines sind für alle anderen Treiber immer aktiviert. - + Enable Reactive Flushing Aktiviere Reactives Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Benutzt Reactive-Flushing anstatt Predictive-Flushing, welches akkurateres Speicher-Synchronisieren erlaubt. - + Sync to framerate of video playback Synchronisiere mit Bildrate von Video-Wiedergaben - + Run the game at normal speed during video playback, even when the framerate is unlocked. Lasse das Spiel in der normalen Geschwindigkeit abspielen, trotz freigeschalteter Bildrate (FPS) - + Barrier feedback loops Barrier-Feedback-Loops - + Improves rendering of transparency effects in specific games. Verbessert das Rendering von Transparenzeffekten in bestimmten Spielen. - + RNG Seed RNG-Seed - + + Device Name + Gerätename + + + + Language: + Sprache: + + + + Note: this can be overridden when region setting is auto-select + Anmerkung: Diese Einstellung kann überschrieben werden, falls deine Region auf "auto-select" eingestellt ist. + + + + Region: + Region: + + + + Time Zone: + Zeitzone: + + + + Sound Output Mode: + Tonausgangsmodus: + + + + Console Mode: + Konsolenmodus: + + + + Prompt for user on game boot + Beim Spielstart nach Nutzer fragen + + + + Pause emulation when in background + Emulation im Hintergrund pausieren + + + + Confirm before stopping emulation + Vor dem Stoppen der Emulation bestätigen + + + + Hide mouse on inactivity + Mauszeiger verstecken + + + + Disable controller applet + Deaktiviere Controller-Applet + + + + Enable Gamemode + GameMode aktivieren + + + + CPU + CPU + + + + GPU + GPU + + + + CPU Asynchronous + CPU Asynchron + + + + Uncompressed (Best quality) + Unkomprimiert (Beste Qualität) + + + + BC1 (Low quality) + BC1 (Niedrige Qualität) + + + + BC3 (Medium quality) + BC3 (Mittlere Qualität) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly Shaders, Nur NVIDIA) + + + + Normal + Normal + + + + High + Hoch + + + + Extreme + Extrem + + + + Auto + Auto + + + + Accurate + Akkurat + + + + Unsafe + Unsicher + + + + Paranoid (disables most optimizations) + Paranoid (deaktiviert die meisten Optimierungen) + + + + Dynarmic + Dynarmic + + + + NCE + NCE + + + + Borderless Windowed + Rahmenloses Fenster + + + + Exclusive Fullscreen + Exklusiver Vollbildmodus + + + + No Video Output + Keine Videoausgabe + + + + CPU Video Decoding + CPU Video Dekodierung + + + + GPU Video Decoding (Default) + GPU Video Dekodierung (Standard) + + + + 0.5X (360p/540p) [EXPERIMENTAL] + 0,5X (360p/540p) [EXPERIMENTELL] + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0,75X (540p/810p) [EXPERIMENTELL] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1,5X (1080p/1620p) [EXPERIMENTELL] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest-Neighbor + + + + Bilinear + Bilinear + + + + Bicubic + Bikubisch + + + + Gaussian + Gaussian + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️Super Resolution + + + + None + Keiner + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Standard (16:9) + + + + Force 4:3 + Erzwinge 4:3 + + + + Force 21:9 + Erzwinge 21:9 + + + + Force 16:10 + Erzwinge 16:10 + + + + Stretch to Window + Auf Fenster anpassen + + + + Automatic + Automatisch + + + + + Default + Standard + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + Enables GPU vendor-specific pipeline cache. +This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Gerätename - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - - Language: - Sprache: - - - - Note: this can be overridden when region setting is auto-select - Anmerkung: Diese Einstellung kann überschrieben werden, falls deine Region auf "auto-select" eingestellt ist. - - - - Region: - Region: - - - + The region of the emulated Switch. - - Time Zone: - Zeitzone: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Tonausgangsmodus: - - - - Console Mode: - Konsolenmodus: - - - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Beim Spielstart nach Nutzer fragen - - - - Pause emulation when in background - Emulation im Hintergrund pausieren - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - - Confirm before stopping emulation - Vor dem Stoppen der Emulation bestätigen - - - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Mauszeiger verstecken - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - Deaktiviere Controller-Applet - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - - Enable Gamemode - GameMode aktivieren - - - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - - GPU - GPU - - - - CPU Asynchronous - CPU Asynchron - - - - Uncompressed (Best quality) - Unkomprimiert (Beste Qualität) - - - - BC1 (Low quality) - BC1 (Niedrige Qualität) - - - - BC3 (Medium quality) - BC3 (Mittlere Qualität) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly Shaders, Nur NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Normal + + Unsafe (fast) + - - High - Hoch + + Safe (stable) + - - Extreme - Extrem - - - - Auto - Auto - - - - Accurate - Akkurat - - - - Unsafe - Unsicher - - - - Paranoid (disables most optimizations) - Paranoid (deaktiviert die meisten Optimierungen) - - - - Dynarmic - Dynarmic - - - - NCE - NCE - - - - Borderless Windowed - Rahmenloses Fenster - - - - Exclusive Fullscreen - Exklusiver Vollbildmodus - - - - No Video Output - Keine Videoausgabe - - - - CPU Video Decoding - CPU Video Dekodierung - - - - GPU Video Decoding (Default) - GPU Video Dekodierung (Standard) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - - 0.5X (360p/540p) [EXPERIMENTAL] - 0,5X (360p/540p) [EXPERIMENTELL] - - - - 0.75X (540p/810p) [EXPERIMENTAL] - 0,75X (540p/810p) [EXPERIMENTELL] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1,5X (1080p/1620p) [EXPERIMENTELL] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest-Neighbor - - - - Bilinear - Bilinear - - - - Bicubic - Bikubisch - - - - Gaussian - Gaussian - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️Super Resolution - - - + Area - - None - Keiner - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Standard (16:9) - - - - Force 4:3 - Erzwinge 4:3 - - - - Force 21:9 - Erzwinge 21:9 - - - - Force 16:10 - Erzwinge 16:10 - - - - Stretch to Window - Auf Fenster anpassen - - - - Automatic - Automatisch - - - - Default - Standard - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1891,37 +1988,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB DRAM (Unsicher) - + Docked Im Dock - + Handheld Handheld - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Immer fragen (Standard) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen @@ -2274,27 +2371,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Logging - + Open Log Location Log-Verzeichnis öffnen - + Global Log Filter Globaler Log-Filter - + When checked, the max size of the log increases from 100 MB to 1 GB Wenn diese Option aktiviert ist, erhöht sich die maximale Größe des Logs von 100 MB auf 1 GB - + Enable Extended Logging** Erweitertes Logging aktivieren** - + Show Log in Console Log in der Konsole zeigen @@ -2440,7 +2537,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2502,7 +2599,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Dies wird automatisch beim Schließen von yuzu zurückgesetzt. - + Web applet not compiled Web-Applet nicht kompiliert @@ -2552,7 +2649,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2561,88 +2658,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Einige Einstellungen sind nur verfügbar, wenn kein Spiel aktiv ist. - + Applets - - + + Audio Audio - - + + CPU CPU - + Debug Debug - + Filesystem Dateisystem - - + + General Allgemein - - + + Graphics Grafik - + GraphicsAdvanced GraphicsAdvanced - + GraphicsExtensions - + Hotkeys Hotkeys - - + + Controls Steuerung - + Profiles Nutzer - + Network Netzwerk - - + + System System - + Game List Spieleliste - + Web Web @@ -2740,51 +2837,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Metadaten-Cache zurücksetzen - + Select Emulated NAND Directory... Emulierten NAND-Ordner auswählen... - + Select Emulated SD Directory... Emulierten SD-Ordner auswählen... - + Select Gamecard Path... Gamecard-Pfad auswählen... - + Select Dump Directory... Dump-Verzeichnis auswählen... - + Select Mod Load Directory... Mod-Ladeverzeichnis auswählen... - The metadata cache is already empty. - Der Metadaten-Cache ist bereits leer. + Der Metadaten-Cache ist bereits leer. - The operation completed successfully. - Der Vorgang wurde erfolgreich abgeschlossen. + Der Vorgang wurde erfolgreich abgeschlossen. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Der Metadaten-Cache konnte nicht gelöscht werden. Er könnte in Gebrauch oder nicht vorhanden sein. + Der Metadaten-Cache konnte nicht gelöscht werden. Er könnte in Gebrauch oder nicht vorhanden sein. @@ -2815,12 +2906,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Hierdurch werden alle Einstellungen zurückgesetzt und alle spielspezifischen Konfigurationen gelöscht. Spiel-Ordner, Profile oder Eingabeprofile werden nicht gelöscht. Fortfahren? @@ -2853,33 +2944,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Hintergrundfarbe: - + % FSR sharpening percentage (e.g. 50%) % - + Off Aus - + VSync Off Vsync Aus - + Recommended Empfohlen - + On An - + VSync On Vsync An @@ -2916,14 +3007,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2955,75 +3050,75 @@ These settings are experimental, and may cause black screens. If your games fail Standardwerte wiederherstellen - + Action Aktion - + Hotkey Hotkey - + Controller Hotkey Controller-Hotkey - - - + + + Conflicting Key Sequence Tastensequenz bereits belegt - - + + The entered key sequence is already assigned to: %1 Die eingegebene Sequenz ist bereits vergeben an: %1 - + [waiting] [wartet] - + Invalid Ungültig - + Invalid hotkey settings Ungültige Hotkey-Einstellungen - + An error occurred. Please report this issue on github. Ein Fehler fand statt. Bitte berichte dieses Problem auf GitHub. - + Restore Default Standardwerte wiederherstellen - + Clear Löschen - + Conflicting Button Sequence Widersprüchliche Tastenfolge - + The default button sequence is already assigned to: %1 Die Standard Tastenfolge ist bereits belegt von: %1 - + The default key sequence is already assigned to: %1 Die Standard-Sequenz ist bereits vergeben an: %1 @@ -3343,7 +3438,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3498,7 +3593,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Linker Analogstick @@ -3608,14 +3703,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3634,7 +3729,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plus @@ -3647,15 +3742,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3700,7 +3795,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Rechter Analogstick @@ -3715,242 +3810,242 @@ These settings are experimental, and may cause black screens. If your games fail Konfigurieren - - - - + + + + Clear Löschen - - - - - + + + + + [not set] [nicht belegt] - - - + + + Invert button Knopf invertieren - - + + Toggle button Taste umschalten - + Turbo button Turbo Knopf - - + + Invert axis Achsen umkehren - - - + + + Set threshold Schwellwert festlegen - - + + Choose a value between 0% and 100% Wert zwischen 0% und 100% wählen - + Toggle axis Achse umschalten - + Set gyro threshold Gyro-Schwelle einstellen - + Calibrate sensor Kalibriere den Sensor - + Map Analog Stick Analog-Stick festlegen - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Nach dem Drücken von OK den Joystick zuerst horizontal, dann vertikal bewegen. Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizontal. - + Center axis Achse zentrieren - - + + Deadzone: %1% Deadzone: %1% - - + + Modifier Range: %1% Modifikator-Radius: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Zwei Joycons - + Left Joycon Linker Joycon - + Right Joycon Rechter Joycon - + Handheld Handheld - + GameCube Controller GameCube-Controller - + Poke Ball Plus Poke-Ball Plus - + NES Controller NES Controller - + SNES Controller SNES Controller - + N64 Controller N64 Controller - + Sega Genesis Sega Genesis - + Start / Pause Start / Pause - + Z Z - + Control Stick Analog Stick - + C-Stick C-Stick - + Shake! Schütteln! - + [waiting] [wartet] - + New Profile Neues Profil - + Enter a profile name: Profilnamen eingeben: - - + + Create Input Profile Eingabeprofil erstellen - + The given profile name is not valid! Angegebener Profilname ist nicht gültig! - + Failed to create the input profile "%1" Erstellen des Eingabeprofils "%1" ist fehlgeschlagen - + Delete Input Profile Eingabeprofil löschen - + Failed to delete the input profile "%1" Löschen des Eingabeprofils "%1" ist fehlgeschlagen - + Load Input Profile Eingabeprofil laden - + Failed to load the input profile "%1" Laden des Eingabeprofils "%1" ist fehlgeschlagen - + Save Input Profile Eingabeprofil speichern - + Failed to save the input profile "%1" Speichern des Eingabeprofils "%1" ist fehlgeschlagen @@ -4007,7 +4102,7 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta - + Configure Einrichtung @@ -4043,7 +4138,7 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta - + Test Testen @@ -4062,7 +4157,7 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Mehr erfahren</span></a> - + %1:%2 %1:%2 @@ -4071,77 +4166,77 @@ Um die Achsen umzukehren, bewege den Joystick zuerst vertikal und dann horizonta yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Port-Nummer hat ungültige Zeichen - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Port muss zwischen 0 und 65353 liegen - + IP address is not valid IP Adresse ist ungültig - + This UDP server already exists Dieser UDP-Server existiert bereits - + Unable to add more than 8 servers Es können nicht mehr als 8 Server hinzugefügt werden - + Testing Testen - + Configuring Einrichten - + Test Successful Test erfolgreich - + Successfully received data from the server. Daten wurden erfolgreich vom Server empfangen. - + Test Failed Test fehlgeschlagen - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Konnte keine Daten vom Server empfangen.<br>Prüfe bitte, dass der Server korrekt eingerichtet wurde und dass Adresse und Port korrekt sind. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-Test oder Kalibration wird gerade durchgeführt.<br>Bitte warte einen Moment. @@ -4268,7 +4363,12 @@ Aktuell liegen die Werte bei %1% bzw. %2%. Netzwerkinterface - + + Enable Airplane Mode + + + + None Keiner @@ -4326,52 +4426,52 @@ Aktuell liegen die Werte bei %1% bzw. %2%. Einige Einstellungen sind nur verfügbar, wenn kein Spiel aktiv ist. - + Add-Ons Add-Ons - + System System - + CPU CPU - + Graphics Grafik - + Adv. Graphics Erw. Grafik - + GPU Extensions - + Audio Audio - + Input Profiles Eingabe-Profile - + Linux Linux - + Properties Einstellungen @@ -4389,12 +4489,12 @@ Aktuell liegen die Werte bei %1% bzw. %2%. Add-Ons - + Patch Name Patchname - + Version Version @@ -4432,27 +4532,32 @@ Aktuell liegen die Werte bei %1% bzw. %2%. Bild wählen - + + Select Avatar + + + + Add Hinzufügen - + Rename Umbenennen - + Remove Entfernen - + Profile management is available only when game is not running. Die Nutzerverwaltung ist nur verfügbar, wenn kein Spiel aktiv ist. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4460,100 +4565,189 @@ Aktuell liegen die Werte bei %1% bzw. %2%. %2 - + Enter Username Nutzername eingeben - + Users Nutzer - + Enter a username for the new user: Gib einen Benutzernamen für den neuen Benutzer ein: - + Enter a new username: Gib einen neuen Nutzernamen ein: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Profilbild wählen - - JPEG Images (*.jpg *.jpeg) - JPEG Bilddateien (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Keine Firmware verfügbar + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG Bilddateien (*.jpg *.jpeg) + + + Error deleting image Fehler beim Löschen des Bildes - + Error occurred attempting to overwrite previous image at: %1. Fehler beim Überschreiben des vorherigen Bildes bei: %1 - + Error deleting file Fehler beim Löschen der Datei - + Unable to delete existing file: %1. Konnte die bestehende Datei "%1" nicht löschen. - + Error creating user image directory Fehler beim Erstellen des Ordners für die Profilbilder - + Unable to create directory %1 for storing user images. Konnte Ordner "%1" nicht erstellen, um Profilbilder zu speichern. - Error copying user image - Fehler beim Kopieren des Profilbildes + Fehler beim Kopieren des Profilbildes - Unable to copy image from %1 to %2 - Das Bild konnte nicht von "%1" nach "%2" kopiert werden + Das Bild konnte nicht von "%1" nach "%2" kopiert werden - Error resizing user image - Fehler bei der Größenänderung des Benutzerbildes + Fehler bei der Größenänderung des Benutzerbildes - Unable to resize image - Die Bildgröße kann nicht angepasst werden. + Die Bildgröße kann nicht angepasst werden. + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Abbrechen + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Diesen Benutzer löschen? Alle Speicherdaten des Benutzers werden gelöscht. - + Confirm Delete Löschen bestätigen - + Name: %1 UUID: %2 Name: %1 @@ -4606,7 +4800,7 @@ UUID: %2 - + Enable Aktiviere @@ -4617,7 +4811,7 @@ UUID: %2 - + Not connected Nicht verbunden @@ -4627,63 +4821,63 @@ UUID: %2 Standardwerte wiederherstellen - + Clear Löschen - + [not set] [nicht belegt] - + Invert axis Achsen umkehren - - + + Deadzone: %1% Deadzone: %1% - + Error enabling ring input Fehler beim Aktivieren des Ring-Inputs - + Direct Joycon driver is not enabled Direkter JoyCon-Treiber ist nicht aktiviert - + Configuring Einrichten - + The current mapped device doesn't support the ring controller Das aktuell zugeordnete Gerät unterstützt den Ringcontroller nicht - + The current mapped device doesn't have a ring attached Das aktuell genutzte Gerät ist nicht mit dem Ring-Con verbunden - + The current mapped device is not connected Das aktuell zugeordnete Gerät ist nicht verbunden - + Unexpected driver result %1 Unerwartetes Treiber Ergebnis %1 - + [waiting] [wartet] @@ -4725,7 +4919,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4777,12 +4971,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS-Konfiguration - + Select TAS Load Directory... TAS-Lade-Verzeichnis auswählen... @@ -4892,7 +5086,7 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5212,6 +5406,16 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Web Service @@ -5221,42 +5425,29 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf Mit dem Bereitstellen deines Benutzernamens und Tokens erlaubst du yuzu, zusätzliche Nutzungsdaten zu sammeln. Diese könnten auch Informationen beinhalten, die dich identifizieren könnten. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Überprüfen + Überprüfen - Sign up - Registrieren + Registrieren - + Token: Token: - + Username: Nutzername: - What is my token? - Was ist mein Token? + Was ist mein Token? - + Web Service configuration can only be changed when a public room isn't being hosted. Die Konfiguration des Webservice kann nur geändert werden, wenn kein öffentlicher Raum gehostet wird. @@ -5281,12 +5472,12 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf Neu generieren - + Discord Presence Discord-Präsenz - + Show Current Game in your Discord Status Zeig dein momentanes Spiel in deinem Discord-Status @@ -5295,24 +5486,8 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Mehr erfahren</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrieren</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrieren</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5335,10 +5510,9 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf Token wurde nicht verfiziert. Die Änderungen an deinem Token wurden nicht gespeichert. - Unverified, please click Verify before saving configuration Tooltip - Nicht verifiziert, vor dem Speichern Verifizieren wählen + Nicht verifiziert, vor dem Speichern Verifizieren wählen Verifying... @@ -5362,20 +5536,67 @@ Ziehe die Punkte mit deiner Maus, um ihre Position zu ändern. Doppelklicke auf Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Verifizierung fehlgeschlagen. Prüfe ob dein Nutzername und Token richtig eingegeben wurden und ob deine Internetverbindung korrekt funktioniert. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controller P1 - + &Controller P1 &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Version + + DirectConnect @@ -5483,7 +5704,12 @@ Wenn Sie immer noch keine Verbindung herstellen können, wenden Sie sich an den - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5491,11 +5717,6 @@ Wenn Sie immer noch keine Verbindung herstellen können, wenden Sie sich an den The host of the room has banned you. Speak with the host to unban you or try a different room. Der Ersteller des Raumes hat dich gebannt. Wende dich an den Ersteller, um den Bann aufzuheben oder probiere einen anderen Raum aus. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5557,7 +5778,7 @@ Bitte gehen Sie zu Konfigurieren -> System -> Netzwerk und treffen Sie ein Telemetrie - + Broken Vulkan Installation Detected Defekte Vulkan-Installation erkannt @@ -5566,106 +5787,105 @@ Bitte gehen Sie zu Konfigurieren -> System -> Netzwerk und treffen Sie ein Vulkan Initialisierung fehlgeschlagen.<br><br>Klicken Sie auf <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>für Instruktionen zur Problembehebung.</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Spiel wird ausgeführt - + Loading Web Applet... Lade Web-Applet... - - + + Disable Web Applet Deaktiviere die Web Applikation - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Deaktivieren des Web-Applets kann zu undefiniertem Verhalten führen, und sollte nur mit Super Mario 3D All-Stars benutzt werden. Bist du sicher, dass du das Web-Applet deaktivieren möchtest? (Dies kann in den Debug-Einstellungen wieder aktiviert werden.) - + The amount of shaders currently being built Wie viele Shader im Moment kompiliert werden - + The current selected resolution scaling multiplier. Der momentan ausgewählte Auflösungsskalierung Multiplikator. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Derzeitige Emulations-Geschwindigkeit. Werte höher oder niedriger als 100% zeigen, dass die Emulation scheller oder langsamer läuft als auf einer Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Wie viele Bilder pro Sekunde angezeigt werden variiert von Spiel zu Spiel und von Szene zu Szene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Zeit, die gebraucht wurde, um einen Switch-Frame zu emulieren, ohne Framelimit oder V-Sync. Für eine Emulation bei voller Geschwindigkeit sollte dieser Wert bei höchstens 16.67ms liegen. - + Unmute Ton aktivieren - + Mute Stummschalten - + Reset Volume Ton zurücksetzen - + &Clear Recent Files &Zuletzt geladene Dateien leeren - + &Continue &Fortsetzen - + &Pause &Pause - Warning Outdated Game Format - Warnung veraltetes Spielformat + Warnung veraltetes Spielformat You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Du nutzt eine entpackte ROM-Ordnerstruktur für dieses Spiel, welches ein veraltetes Format ist und von anderen Formaten wie NCA, NAX, XCI oder NSP überholt wurde. Entpackte ROM-Ordner unterstützen keine Icons, Metadaten oder Updates.<br><br><a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>Unser Wiki</a> enthält eine Erklärung der verschiedenen Formate, die yuzu unterstützt. Diese Nachricht wird nicht noch einmal angezeigt. - - + + Error while loading ROM! ROM konnte nicht geladen werden! - + The ROM format is not supported. ROM-Format wird nicht unterstützt. - + An error occurred initializing the video core. Beim Initialisieren des Video-Kerns ist ein Fehler aufgetreten. @@ -5676,7 +5896,7 @@ Dies ist in der Regel auf veraltete GPU Treiber zurückzuführen, integrierte GP Bitte öffnen Sie die Log Datei für weitere Informationen. Für weitere Informationen wie Sie auf die Log Datei zugreifen, öffnen Sie bitte die folgende Seite: <a href='https://yuzu-emu.org/help/reference/log-files/'>Wie wird eine Log Datei hochgeladen?</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM konnte nicht geladen werden! %1 @@ -5687,473 +5907,405 @@ Bitte öffnen Sie die Log Datei für weitere Informationen. Für weitere Informa %1<br>Bitte folge der <a href='https://yuzu-emu.org/help/quickstart/'>yuzu-Schnellstart-Anleitung</a> um deine Dateien zu extrahieren.<br>Hilfe findest du im yuzu-Wiki</a> oder dem yuzu-Discord</a>. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Ein unbekannter Fehler ist aufgetreten. Bitte prüfe die Log-Dateien auf mögliche Fehlermeldungen. - + (64-bit) (64-Bit) - + (32-bit) (32-Bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Schließe Software... - + Save Data Speicherdaten - + Mod Data Mod-Daten - + Error Opening %1 Folder Konnte Verzeichnis %1 nicht öffnen - - + + Folder does not exist! Verzeichnis existiert nicht! - Error Opening Transferable Shader Cache - Fehler beim Öffnen des transferierbaren Shader-Caches + Fehler beim Öffnen des transferierbaren Shader-Caches - Failed to create the shader cache directory for this title. - Fehler beim erstellen des Shader-Cache-Ordner für den ausgewählten Titel. + Fehler beim erstellen des Shader-Cache-Ordner für den ausgewählten Titel. - Error Removing Contents - Fehler beim Entfernen des Inhalts + Fehler beim Entfernen des Inhalts - Error Removing Update - Fehler beim Entfernen des Updates + Fehler beim Entfernen des Updates - Error Removing DLC - Fehler beim Entfernen des DLCs + Fehler beim Entfernen des DLCs - + Remove Installed Game Contents? Installierten Spiele-Content entfernen? - + Remove Installed Game Update? Installierte Spiele-Updates entfernen? - + Remove Installed Game DLC? Installierte Spiele-DLCs entfernen? - + Remove Entry Eintrag entfernen - - - - - - Successfully Removed - Erfolgreich entfernt + Erfolgreich entfernt - Successfully removed the installed base game. - Das Spiel wurde entfernt. + Das Spiel wurde entfernt. - The base game is not installed in the NAND and cannot be removed. - Das Spiel ist nicht im NAND installiert und kann somit nicht entfernt werden. + Das Spiel ist nicht im NAND installiert und kann somit nicht entfernt werden. - Successfully removed the installed update. - Das Update wurde entfernt. + Das Update wurde entfernt. - There is no update installed for this title. - Es ist kein Update für diesen Titel installiert. + Es ist kein Update für diesen Titel installiert. - There are no DLC installed for this title. - Es sind keine DLC für diesen Titel installiert. + Es sind keine DLC für diesen Titel installiert. - Successfully removed %1 installed DLC. - %1 DLC entfernt. + %1 DLC entfernt. - + Delete OpenGL Transferable Shader Cache? Transferierbaren OpenGL Shader Cache löschen? - + Delete Vulkan Transferable Shader Cache? Transferierbaren Vulkan Shader Cache löschen? - + Delete All Transferable Shader Caches? Alle transferierbaren Shader Caches löschen? - + Remove Custom Game Configuration? Spiel-Einstellungen entfernen? - + Remove Cache Storage? Cache-Speicher entfernen? - + Remove File Datei entfernen - + Remove Play Time Data Spielzeit-Daten enfernen - + Reset play time? Spielzeit zurücksetzen? - - Error Removing Transferable Shader Cache - Fehler beim Entfernen + Fehler beim Entfernen - - A shader cache for this title does not exist. - Es existiert kein Shader-Cache für diesen Titel. + Es existiert kein Shader-Cache für diesen Titel. - Successfully removed the transferable shader cache. - Der transferierbare Shader-Cache wurde entfernt. + Der transferierbare Shader-Cache wurde entfernt. - Failed to remove the transferable shader cache. - Konnte den transferierbaren Shader-Cache nicht entfernen. + Konnte den transferierbaren Shader-Cache nicht entfernen. - Error Removing Vulkan Driver Pipeline Cache - Fehler beim Entfernen des Vulkan-Pipeline-Cache + Fehler beim Entfernen des Vulkan-Pipeline-Cache - Failed to remove the driver pipeline cache. - Fehler beim Entfernen des Driver-Pipeline-Cache + Fehler beim Entfernen des Driver-Pipeline-Cache - - Error Removing Transferable Shader Caches - Fehler beim Entfernen der transferierbaren Shader Caches + Fehler beim Entfernen der transferierbaren Shader Caches - Successfully removed the transferable shader caches. - Die übertragbaren Shader-Caches wurden erfolgreich entfernt. + Die übertragbaren Shader-Caches wurden erfolgreich entfernt. - Failed to remove the transferable shader cache directory. - Entfernen des transferierbaren Shader-Cache-Verzeichnisses fehlgeschlagen. + Entfernen des transferierbaren Shader-Cache-Verzeichnisses fehlgeschlagen. - - Error Removing Custom Configuration - Fehler beim Entfernen + Fehler beim Entfernen - A custom configuration for this title does not exist. - Es existieren keine Spiel-Einstellungen für dieses Spiel. + Es existieren keine Spiel-Einstellungen für dieses Spiel. - Successfully removed the custom game configuration. - Die Spiel-Einstellungen wurden entfernt. + Die Spiel-Einstellungen wurden entfernt. - Failed to remove the custom game configuration. - Die Spiel-Einstellungen konnten nicht entfernt werden. + Die Spiel-Einstellungen konnten nicht entfernt werden. - - + + RomFS Extraction Failed! RomFS-Extraktion fehlgeschlagen! - + There was an error copying the RomFS files or the user cancelled the operation. Das RomFS konnte wegen eines Fehlers oder Abbruchs nicht kopiert werden. - + Full Komplett - + Skeleton Nur Ordnerstruktur - + Select RomFS Dump Mode RomFS Extraktions-Modus auswählen - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Bitte wähle, wie das RomFS gespeichert werden soll.<br>"Full" wird alle Dateien des Spiels extrahieren, während <br>"Skeleton" nur die Ordnerstruktur erstellt. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Es ist nicht genügend Speicher (%1) vorhanden um das RomFS zu entpacken. Bitte sorge für genügend Speicherplatze oder wähle ein anderes Verzeichnis aus. (Emulation > Konfiguration > System > Dateisystem > Dump Root) - + Extracting RomFS... RomFS wird extrahiert... - - - - - + + Cancel Abbrechen - + RomFS Extraction Succeeded! RomFS wurde extrahiert! - - - + The operation completed successfully. Der Vorgang wurde erfolgreich abgeschlossen. - Integrity verification couldn't be performed! - Integritätsüberprüfung konnte nicht durchgeführt werden! + Integritätsüberprüfung konnte nicht durchgeführt werden! - File contents were not checked for validity. - Datei-Inhalte wurden nicht auf Gültigkeit überprüft. + Datei-Inhalte wurden nicht auf Gültigkeit überprüft. - - Verifying integrity... - Überprüfe Integrität… + Überprüfe Integrität… - - Integrity verification succeeded! - Integritätsüberprüfung erfolgreich! + Integritätsüberprüfung erfolgreich! - - Integrity verification failed! - Integritätsüberprüfung fehlgeschlagen! + Integritätsüberprüfung fehlgeschlagen! - File contents may be corrupt. - Datei-Inhalte könnten defekt sein. + Datei-Inhalte könnten defekt sein. - - - - Create Shortcut - Verknüpfung erstellen + Verknüpfung erstellen - Do you want to launch the game in fullscreen? - Möchtest du das Spiel im Vollbild starten? + Möchtest du das Spiel im Vollbild starten? - Successfully created a shortcut to %1 - Verknüpfung wurde erfolgreich erstellt unter %1 + Verknüpfung wurde erfolgreich erstellt unter %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Dies wird eine Verknüpfung zum aktuellen AppImage erstellen. Dies könnte nicht gut funktionieren falls du aktualisierst. Fortfahren? + Dies wird eine Verknüpfung zum aktuellen AppImage erstellen. Dies könnte nicht gut funktionieren falls du aktualisierst. Fortfahren? - Failed to create a shortcut to %1 - Erstellen einer Verknüpfung zu %1 fehlgeschlagen + Erstellen einer Verknüpfung zu %1 fehlgeschlagen - Create Icon - Icon erstellen + Icon erstellen - Cannot create icon file. Path "%1" does not exist and cannot be created. - Symboldatei konnte nicht erstellt werden. Der Pfad "%1" existiert nicht oder kann nicht erstellt werden. + Symboldatei konnte nicht erstellt werden. Der Pfad "%1" existiert nicht oder kann nicht erstellt werden. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Einstellungen - + The game properties could not be loaded. Spiel-Einstellungen konnten nicht geladen werden. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch-Programme (%1);;Alle Dateien (*.*) - + Load File Datei laden - + Open Extracted ROM Directory Öffne das extrahierte ROM-Verzeichnis - + Invalid Directory Selected Ungültiges Verzeichnis ausgewählt - + The directory you have selected does not contain a 'main' file. Das Verzeichnis, das du ausgewählt hast, enthält keine 'main'-Datei. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installierbares Switch-Programm (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submissions Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Dateien installieren - + %n file(s) remaining %n Datei verbleibend @@ -6161,25 +6313,25 @@ Bitte öffnen Sie die Log Datei für weitere Informationen. Für weitere Informa - + Installing file "%1"... Datei "%1" wird installiert... - - + + Install Results NAND-Installation - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Um Konflikte zu vermeiden, raten wir Nutzern davon ab, Spiele im NAND zu installieren. Bitte nutze diese Funktion nur zum Installieren von Updates und DLC. - + %n file(s) were newly installed @@ -6190,7 +6342,7 @@ Bitte nutze diese Funktion nur zum Installieren von Updates und DLC. - + %n file(s) were overwritten @@ -6201,7 +6353,7 @@ Bitte nutze diese Funktion nur zum Installieren von Updates und DLC. - + %n file(s) failed to install @@ -6212,491 +6364,467 @@ Bitte nutze diese Funktion nur zum Installieren von Updates und DLC. - + System Application Systemanwendung - + System Archive Systemarchiv - + System Application Update Systemanwendungsupdate - + Firmware Package (Type A) Firmware-Paket (Typ A) - + Firmware Package (Type B) Firmware-Paket (Typ B) - + Game Spiel - + Game Update Spiel-Update - + Game DLC Spiel-DLC - + Delta Title Delta-Titel - + Select NCA Install Type... Wähle den NCA-Installationstyp aus... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Bitte wähle, als was diese NCA installiert werden soll: (In den meisten Fällen sollte die Standardeinstellung 'Spiel' ausreichen.) - + Failed to Install Installation fehlgeschlagen - + The title type you selected for the NCA is invalid. Der Titel-Typ, den du für diese NCA ausgewählt hast, ist ungültig. - + File not found Datei nicht gefunden - + File "%1" not found Datei "%1" nicht gefunden - + OK OK - - + + Hardware requirements not met Hardwareanforderungen nicht erfüllt - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Dein System erfüllt nicht die empfohlenen Mindestanforderungen der Hardware. Meldung der Komptabilität wurde deaktiviert. - + Missing yuzu Account Fehlender yuzu-Account - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Um einen Kompatibilitätsbericht abzuschicken, musst du einen yuzu-Account mit yuzu verbinden.<br><br/>Um einen yuzu-Account zu verbinden, prüfe die Einstellungen unter Emulation &gt; Konfiguration &gt; Web. - + Error opening URL Fehler beim Öffnen der URL - + Unable to open the URL "%1". URL "%1" kann nicht geöffnet werden. - + TAS Recording TAS Aufnahme - + Overwrite file of player 1? Datei von Spieler 1 überschreiben? - + Invalid config detected Ungültige Konfiguration erkannt - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handheld-Controller können nicht im Dock verwendet werden. Der Pro-Controller wird verwendet. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Das aktuelle Amiibo wurde entfernt - + Error Fehler - - + + The current game is not looking for amiibos Das aktuelle Spiel sucht nicht nach Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo laden - + Error loading Amiibo data Fehler beim Laden der Amiibo-Daten - + The selected file is not a valid amiibo Die ausgewählte Datei ist keine gültige Amiibo - + The selected file is already on use Die ausgewählte Datei wird bereits verwendet - + An unknown error occurred Ein unbekannter Fehler ist aufgetreten - - Verification failed for the following files: %1 - Überprüfung für die folgenden Dateien ist fehlgeschlagen: + Überprüfung für die folgenden Dateien ist fehlgeschlagen: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available Keine Firmware verfügbar - Please install the firmware to use the Album applet. - Bitte installiere die Firmware um das Album-Applet zu nutzen. + Bitte installiere die Firmware um das Album-Applet zu nutzen. - + Album Applet Album-Applet - + Album applet is not available. Please reinstall firmware. Album-Applet ist nicht verfügbar. Bitte Firmware erneut installieren. - Please install the firmware to use the Cabinet applet. - Bitte installiere die Firmware um das Cabinet-Applet zu nutzen. + Bitte installiere die Firmware um das Cabinet-Applet zu nutzen. - + Cabinet Applet Cabinet-Applet - + Cabinet applet is not available. Please reinstall firmware. Cabinet-Applet ist nicht verfügbar. Bitte Firmware erneut installieren. - Please install the firmware to use the Mii editor. - Bitte installiere die Firmware um den Mii-Editor zu nutzen. + Bitte installiere die Firmware um den Mii-Editor zu nutzen. - + Mii Edit Applet Mii-Edit-Applet - + Mii editor is not available. Please reinstall firmware. Mii-Editor ist nicht verfügbar. Bitte Firmware erneut installieren. - Please install the firmware to use the Controller Menu. - Bitte installiere die Firmware um das Controller-Menü zu nutzen + Bitte installiere die Firmware um das Controller-Menü zu nutzen - + Controller Applet Controller-Applet - + Controller Menu is not available. Please reinstall firmware. Controller-Menü ist nicht verfügbar. Bitte Firmware erneut installieren. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Screenshot aufnehmen - + PNG Image (*.png) PNG Bild (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS Zustand: Läuft %1/%2 - + TAS state: Recording %1 TAS Zustand: Aufnahme %1 - + TAS state: Idle %1/%2 TAS-Status: Untätig %1/%2 - + TAS State: Invalid TAS Zustand: Ungültig - + &Stop Running &Stoppe Ausführung - + &Start &Start - + Stop R&ecording Aufnahme stoppen - + R&ecord Aufnahme - + Building: %n shader(s) Erstelle: %n Shader @@ -6704,18 +6832,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Skalierung: %1x - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + Speed: %1% Geschwindigkeit: %1% @@ -6724,54 +6852,54 @@ Would you like to download it? Spiel: %1 FPS (Unbegrenzt) - + Game: %1 FPS Spiel: %1 FPS - + Frame: %1 ms Frame: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA KEIN AA - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + Derivation Components Missing Derivationskomponenten fehlen - + Select RomFS Dump Target RomFS wählen - + Please select which RomFS you would like to dump. Wähle, welches RomFS du speichern möchtest. @@ -6784,7 +6912,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Bist du sicher, dass du die Emulation stoppen willst? Jeder nicht gespeicherte Fortschritt geht verloren. @@ -6797,102 +6925,102 @@ Would you like to bypass this and exit anyway? Möchtest du dies umgehen und sie trotzdem beenden? - + None Keiner - + FXAA FXAA - + SMAA SMAA - + Nearest Nächster - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked Im Dock - + Handheld Handheld - + Normal Normal - + High Hoch - + Extreme Extrem - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6900,13 +7028,13 @@ Möchtest du dies umgehen und sie trotzdem beenden? GRenderWindow - - + + OpenGL not available! OpenGL nicht verfügbar! - + OpenGL shared contexts are not supported. Gemeinsame OpenGL-Kontexte werden nicht unterstützt. @@ -6915,33 +7043,33 @@ Möchtest du dies umgehen und sie trotzdem beenden? yuzu wurde nicht mit OpenGL-Unterstützung kompiliert. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Fehler beim Initialisieren von OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Deine Grafikkarte unterstützt kein OpenGL oder du hast nicht den neusten Treiber installiert. - + Error while initializing OpenGL 4.6! Fehler beim Initialisieren von OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Deine Grafikkarte unterstützt OpenGL 4.6 nicht, oder du benutzt nicht die neuste Treiberversion.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Deine Grafikkarte unterstützt anscheinend nicht eine oder mehrere von yuzu benötigten OpenGL-Erweiterungen. Bitte stelle sicher, dass du den neusten Grafiktreiber installiert hast.<br><br>GL Renderer:<br>%1<br><br>Nicht unterstützte Erweiterungen:<br>%2 @@ -6949,128 +7077,128 @@ Möchtest du dies umgehen und sie trotzdem beenden? GameList - + Favorite Favorit - + Start Game Spiel starten - + Start Game without Custom Configuration Spiel ohne benutzerdefinierte Spiel-Einstellungen starten - + Open Save Data Location Spielstand-Verzeichnis öffnen - + Open Mod Data Location Mod-Verzeichnis öffnen - + Open Transferable Pipeline Cache Transferierbaren Pipeline-Cache öffnen - + Remove Entfernen - + Remove Installed Update Installiertes Update entfernen - + Remove All Installed DLC Alle installierten DLCs entfernen - + Remove Custom Configuration Spiel-Einstellungen entfernen - + Remove Play Time Data Spielzeit-Daten entfernen - + Remove Cache Storage Cache-Speicher entfernen - + Remove OpenGL Pipeline Cache OpenGL-Pipeline-Cache entfernen - + Remove Vulkan Pipeline Cache Vulkan-Pipeline-Cache entfernen - + Remove All Pipeline Caches Alle Pipeline-Caches entfernen - + Remove All Installed Contents Alle installierten Inhalte entfernen - + Dump RomFS RomFS speichern - + Dump RomFS to SDMC RomFS nach SDMC dumpen - + Verify Integrity Integrität überprüfen - + Copy Title ID to Clipboard Title-ID in die Zwischenablage kopieren - + Navigate to GameDB entry GameDB-Eintrag öffnen - + Create Shortcut Verknüpfung erstellen - + Add to Desktop Zum Desktop hinzufügen - + Add to Applications Menu Zum Menü "Anwendungen" hinzufügen - + Configure Game @@ -7079,62 +7207,62 @@ Möchtest du dies umgehen und sie trotzdem beenden? Eigenschaften - + Scan Subfolders Unterordner scannen - + Remove Game Directory Spieleverzeichnis entfernen - + ▲ Move Up ▲ Nach Oben - + ▼ Move Down ▼ Nach Unten - + Open Directory Location Verzeichnis öffnen - + Clear Löschen - + Name Name - + Compatibility Kompatibilität - + Add-ons Add-ons - + File type Dateityp - + Size Größe - + Play time Spielzeit @@ -7142,62 +7270,62 @@ Möchtest du dies umgehen und sie trotzdem beenden? GameListItemCompat - + Ingame Im Spiel - + Game starts, but crashes or major glitches prevent it from being completed. Spiel startet, stürzt jedoch ab oder hat signifikante Glitches, die es verbieten es durchzuspielen. - + Perfect Perfekt - + Game can be played without issues. Das Spiel kann ohne Probleme gespielt werden. - + Playable Spielbar - + Game functions with minor graphical or audio glitches and is playable from start to finish. Das Spiel funktioniert mit minimalen grafischen oder Tonstörungen und ist komplett spielbar. - + Intro/Menu Intro/Menü - + Game loads, but is unable to progress past the Start Screen. Das Spiel lädt, ist jedoch nicht im Stande den Startbildschirm zu passieren. - + Won't Boot Startet nicht - + The game crashes when attempting to startup. Das Spiel stürzt beim Versuch zu starten ab. - + Not Tested Nicht getestet - + The game has not yet been tested. Spiel wurde noch nicht getestet. @@ -7205,7 +7333,7 @@ Möchtest du dies umgehen und sie trotzdem beenden? GameListPlaceholder - + Double-click to add a new folder to the game list Doppelklicke, um einen neuen Ordner zur Spieleliste hinzuzufügen. @@ -7213,7 +7341,7 @@ Möchtest du dies umgehen und sie trotzdem beenden? GameListSearchField - + %1 of %n result(s) %1 von %n Ergebnis @@ -7221,12 +7349,12 @@ Möchtest du dies umgehen und sie trotzdem beenden? - + Filter: Filter: - + Enter pattern to filter Wörter zum Filtern eingeben @@ -7308,7 +7436,7 @@ Möchtest du dies umgehen und sie trotzdem beenden? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7322,91 +7450,91 @@ Debug Nachricht: Hotkeys - + Audio Mute/Unmute Audio aktivieren / deaktivieren - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Hauptfenster - + Audio Volume Down Lautstärke verringern - + Audio Volume Up Lautstärke erhöhen - + Capture Screenshot Screenshot aufnehmen - + Change Adapting Filter Adaptiven Filter ändern - + Change Docked Mode Dockmodus ändern - + Change GPU Accuracy GPU-Genauigkeit ändern - + Configure - + Configure Current Game - + Continue/Pause Emulation Emulation fortsetzen/pausieren - + Exit Fullscreen Vollbild verlassen @@ -7415,97 +7543,97 @@ Debug Nachricht: yuzu verlassen - - Exit eden + + Exit Eden - + Fullscreen Vollbild - + Load File Datei laden - + Load/Remove Amiibo Amiibo laden/entfernen - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Emulation neustarten - + Stop Emulation Emulation stoppen - + TAS Record TAS aufnehmen - + TAS Reset TAS neustarten - + TAS Start/Stop TAS starten/stoppen - + Toggle Filter Bar Filterleiste umschalten - + Toggle Framerate Limit Aktiviere Bildraten Limitierung - + Toggle Mouse Panning Mausschwenk umschalten - + Toggle Renderdoc Capture Renderdoc-Aufnahme umschalten - + Toggle Status Bar Statusleiste umschalten @@ -7513,22 +7641,22 @@ Debug Nachricht: InstallDialog - + Please confirm these are the files you wish to install. Bitte bestätige, dass du diese Dateien installieren willst. - + Installing an Update or DLC will overwrite the previously installed one. Wenn du ein Update oder DLC installierst, wirst du die vorher installierten überschreiben. - + Install Installieren - + Install Files to NAND Dateien im NAND installieren @@ -7536,7 +7664,7 @@ Debug Nachricht: LimitableInputDialog - + The text can't contain any of the following characters: %1 Der Text darf keines der folgenden Zeichen enthalten: %1 @@ -7682,152 +7810,207 @@ Debug Nachricht: &Zuletzt geladene Dateien - + + Open &Eden Folders + + + + &Emulation &Emulation - + &View &Anzeige - + &Reset Window Size &Fenstergröße zurücksetzen - + &Debugging &Debugging - + Reset Window Size to &720p Fenstergröße auf &720p zurücksetzen - + Reset Window Size to 720p Fenstergröße auf 720p zurücksetzen - + Reset Window Size to &900p Fenstergröße auf &900p zurücksetzen - + Reset Window Size to 900p Fenstergröße auf 900p zurücksetzen - + Reset Window Size to &1080p Fenstergröße auf &1080p zurücksetzen - + Reset Window Size to 1080p Fenstergröße auf 1080p zurücksetzen - + &Multiplayer &Mehrspieler - + &Tools &Werkzeuge - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Hilfe - + &Install Files to NAND... &Dateien im NAND installieren... - + L&oad File... Datei &laden... - + Load &Folder... &Verzeichnis laden... - + E&xit S&chließen - + &Pause &Pause - + &Stop &Stop - + &Verify Installed Contents Installierte Inhalte &überprüfen - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7836,97 +8019,97 @@ Debug Nachricht: &Über yuzu - + Single &Window Mode &Einzelfenster-Modus - + Con&figure... Kon&figurieren - + Ctrl+, - + Display D&ock Widget Headers D&ock-Widget-Header anzeigen - + Show &Filter Bar &Filterleiste anzeigen - + Show &Status Bar &Statusleiste anzeigen - + Show Status Bar Statusleiste anzeigen - + &Browse Public Game Lobby &Öffentliche Spiele-Lobbys durchsuchen - + &Create Room &Raum erstellen - + &Leave Room &Raum verlassen - + &Direct Connect to Room &Direkte Verbindung zum Raum - + &Show Current Room &Aktuellen Raum anzeigen - + F&ullscreen Vollbild (&u) - + &Restart Neusta&rt - + Load/Remove &Amiibo... &Amiibo laden/entfernen... - + &Report Compatibility &Kompatibilität melden - + Open &Mods Page &Mods-Seite öffnen - + Open &Quickstart Guide &Schnellstart-Anleitung öffnen - + &FAQ &FAQ @@ -7935,77 +8118,82 @@ Debug Nachricht: &yuzu-Verzeichnis öffnen - + &Capture Screenshot &Bildschirmfoto aufnehmen - + Open &Album &Album öffnen - + &Set Nickname and Owner Spitzname und Besitzer &festlegen - + &Delete Game Data Spiel-Daten &löschen - + &Restore Amiibo Amiibo &wiederherstellen - + &Format Amiibo Amiibo &formatieren - + Open &Mii Editor &Mii-Editor öffnen - + &Configure TAS... &TAS &konfigurieren... - + Configure C&urrent Game... &Spiel-Einstellungen ändern... - + &Start &Start - + &Reset &Zurücksetzen - + R&ecord Aufnahme - + Open &Controller Menu Öffne &Controller-Menü - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -8013,26 +8201,36 @@ Debug Nachricht: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8092,37 +8290,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Aktueller Verbindungsstatus - + Not Connected. Click here to find a room! Nicht verbunden! Hier klicken um Raum zu finden! - + Not Connected Nicht verbunden - + Connected Verbunden - + New Messages Received Neue Nachrichten erhalten - + Error Fehler - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Aktualisieren der Rauminformationen fehlgeschlagen. Überprüfe deine Internetverbindung und versuche erneut einen Raum zu erstellen. @@ -8315,56 +8513,56 @@ p, li { white-space: pre-wrap; } Spielt kein Spiel - + Installed SD Titles Installierte SD-Titel - + Installed NAND Titles Installierte NAND-Titel - + System Titles Systemtitel - + Add New Game Directory Neues Spieleverzeichnis hinzufügen - + Favorites Favoriten - - + + Shift Shift - - + + Ctrl Strg - - + + Alt Alt - - - - + + + + [not set] [nicht gesetzt] @@ -8375,14 +8573,14 @@ p, li { white-space: pre-wrap; } Hat %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Achse %1%2 @@ -8393,357 +8591,357 @@ p, li { white-space: pre-wrap; } Taste %1 - - - - - - + + + + + + [unknown] [unbekannt] - - - + + + Left Links - - - + + + Right Rechts - - - + + + Down Runter - - - + + + Up Hoch - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Kreis - - + + Cross Kreuz - - + + Square Quadrat - - + + Triangle Dreieck - - + + Share Teilen - - + + Options Optionen - - + + [undefined] [undefiniert] - + %1%2 %1%2 - - + + [invalid] [ungültig] - - + + %1%2Hat %3 %1%2Hat %3 - - - + + + %1%2Axis %3 %1%2Achse %3 - - + + %1%2Axis %3,%4,%5 %1%2Achse %3,%4,%5 - - + + %1%2Motion %3 %1%2Bewegung %3 - - + + %1%2Button %3 %1%2Knopf %3 - - + + [unused] [unbenutzt] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Stick L - + Stick R Stick R - + Plus Plus - + Minus Minus - - + + Home Home - + Capture Screenshot - + Touch Touch - + Wheel Indicates the mouse wheel Mausrad - + Backward Rückwärts - + Forward Vorwärts - + Task Aufgabe - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Hat %4 - - + + %1%2%3Axis %4 %1%2%3Achse %4 - - + + %1%2%3Button %4 %1%2%3Knopf %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8861,6 +9059,300 @@ p, li { white-space: pre-wrap; } Möchtest du diese amiibo wiederherstellen? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Abbrechen + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + Überprüfung für die folgenden Dateien ist fehlgeschlagen: + +%1 + + + + + Verifying integrity... + Überprüfe Integrität… + + + + + Integrity verification succeeded! + Integritätsüberprüfung erfolgreich! + + + + + The operation completed successfully. + Der Vorgang wurde erfolgreich abgeschlossen. + + + + + Integrity verification failed! + Integritätsüberprüfung fehlgeschlagen! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Fehler beim Entfernen des Inhalts + + + + Error Removing Update + Fehler beim Entfernen des Updates + + + + Error Removing DLC + Fehler beim Entfernen des DLCs + + + + The base game is not installed in the NAND and cannot be removed. + Das Spiel ist nicht im NAND installiert und kann somit nicht entfernt werden. + + + + There is no update installed for this title. + Es ist kein Update für diesen Titel installiert. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Erfolgreich entfernt + + + + Successfully removed %1 installed DLC. + %1 DLC entfernt. + + + + + Error Removing Transferable Shader Cache + Fehler beim Entfernen + + + + + A shader cache for this title does not exist. + Es existiert kein Shader-Cache für diesen Titel. + + + + Successfully removed the transferable shader cache. + Der transferierbare Shader-Cache wurde entfernt. + + + + Failed to remove the transferable shader cache. + Konnte den transferierbaren Shader-Cache nicht entfernen. + + + + Error Removing Vulkan Driver Pipeline Cache + Fehler beim Entfernen des Vulkan-Pipeline-Cache + + + + Failed to remove the driver pipeline cache. + Fehler beim Entfernen des Driver-Pipeline-Cache + + + + + Error Removing Transferable Shader Caches + Fehler beim Entfernen der transferierbaren Shader Caches + + + + Successfully removed the transferable shader caches. + Die übertragbaren Shader-Caches wurden erfolgreich entfernt. + + + + Failed to remove the transferable shader cache directory. + Entfernen des transferierbaren Shader-Cache-Verzeichnisses fehlgeschlagen. + + + + + Error Removing Custom Configuration + Fehler beim Entfernen + + + + A custom configuration for this title does not exist. + Es existieren keine Spiel-Einstellungen für dieses Spiel. + + + + Successfully removed the custom game configuration. + Die Spiel-Einstellungen wurden entfernt. + + + + Failed to remove the custom game configuration. + Die Spiel-Einstellungen konnten nicht entfernt werden. + + + + Reset Metadata Cache + Metadaten-Cache zurücksetzen + + + + The metadata cache is already empty. + Der Metadaten-Cache ist bereits leer. + + + + The operation completed successfully. + Der Vorgang wurde erfolgreich abgeschlossen. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Der Metadaten-Cache konnte nicht gelöscht werden. Er könnte in Gebrauch oder nicht vorhanden sein. + + + + Create Shortcut + Verknüpfung erstellen + + + + Do you want to launch the game in fullscreen? + Möchtest du das Spiel im Vollbild starten? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Verknüpfung wurde erfolgreich erstellt unter %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Dies wird eine Verknüpfung zum aktuellen AppImage erstellen. Dies könnte nicht gut funktionieren falls du aktualisierst. Fortfahren? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Erstellen einer Verknüpfung zu %1 fehlgeschlagen + + + + Create Icon + Icon erstellen + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Symboldatei konnte nicht erstellt werden. Der Pfad "%1" existiert nicht oder kann nicht erstellt werden. + + + + No firmware available + Keine Firmware verfügbar + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9156,7 +9648,7 @@ Bitte versuche es noch einmal oder kontaktiere den Entwickler der Software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9164,7 +9656,7 @@ Bitte versuche es noch einmal oder kontaktiere den Entwickler der Software. - + Users Nutzer @@ -9288,7 +9780,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Stack aufrufen @@ -9296,12 +9788,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread von keinem Thread pausiert @@ -9309,102 +9801,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable lauffähig - + paused pausiert - + sleeping schläft - + waiting for IPC reply Warten auf IPC-Antwort - + waiting for objects Warten auf Objekte - + waiting for condition variable wartet auf condition variable - + waiting for address arbiter Warten auf den Adressarbiter - + waiting for suspend resume warten auf Fortsetzen nach Unterbrechung - + waiting warten - + initialized initialisiert - + terminated beendet - + unknown unbekannt - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 Kern %1 - + processor = %1 Prozessor = %1 - + affinity mask = %1 Affinitätsmaske = %1 - + thread id = %1 Thread-ID = %1 - + priority = %1(current) / %2(normal) Priorität = %1(aktuell) / %2(normal) - + last running ticks = %1 Letzte laufende Ticks = %1 @@ -9412,7 +9904,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread gewartet von Thread @@ -9420,7 +9912,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 3d51012936..fc1ea8fcea 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Επικοινωνία με τον διακομιστή... - + Cancel Άκυρο - + Touch the top left corner <br>of your touchpad. Αγγίξτε την πάνω αριστερή γωνία <br>του touchpad σας. - + Now touch the bottom right corner <br>of your touchpad. Τώρα αγγίξτε την κάτω δεξιά γωνία <br>του touchpad σας. - + Configuration completed! Η διαμόρφωση ολοκληρώθηκε! - + OK Εντάξει @@ -397,502 +397,134 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Σφάλμα - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Μηχανή εξόδου: - - Output Device: - - - - - Input Device: - - - - - Mute audio - - - - + Volume: Ένταση: - + Mute audio when in background Σίγαση ήχου όταν βρίσκεται στο παρασκήνιο - + Multicore CPU Emulation Εξομοίωση Πολυπύρηνων CPU - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Όριο Ποσοστού Ταχύτητας - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Ακρίβεια: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Αχρησιμοποίητο FMA (βελτιώνει την απόδοση σε επεξεργαστές χωρίς FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Ταχύτερη FRSQRTE και FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Ταχύτερες οδηγίες ASIMD (μόνο 32 bits) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Ανακριβής χειρισμός NaN - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Απενεργοποίηση ελέγχου χώρου διευθύνσεων - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Αγνοήση καθολικής επίβλεψης - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Συσκευή: - - This setting selects the GPU to use with the Vulkan backend. - - - - - Shader Backend: - - - - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Ανάλυση: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Φίλτρο Προσαρμογής Παραθύρου: - - FSR Sharpness: - - - - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Μέθοδος Anti-Aliasing: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Λειτουργία Πλήρους Οθόνης: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Αναλογία Απεικόνισης: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - - Use disk pipeline cache - - - - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Χρησιμοποίηση ασύγχρονης εξομοίωσης GPU - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Εξομοίωση NVDEC: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - - VSync Mode: - - - - - FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. -FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. -Mailbox can have lower latency than FIFO and does not tear but may drop frames. -Immediate (no synchronization) just presents whatever is available and can exhibit tearing. - - - - - Enable asynchronous presentation (Vulkan only) - - - - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - - Force maximum clocks (Vulkan only) - - - - - Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - - - - + Anisotropic Filtering: Ανισοτροπικό Φιλτράρισμα: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Επίπεδο Ακρίβειας: + Επίπεδο Ακρίβειας: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Χρήση ασύγχρονης σύνταξης σκίασης (Τέχνασμα) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Χρήση Γοργού Ρυθμού GPU (Τέχνασμα) @@ -902,1021 +534,1486 @@ This feature is experimental. Ενεργοποιεί τον Γοργό Ρυθμό GPU. Αυτή η επιλογή θα αναγκάσει τα περισσότερα παιχνίδια να εκτελούνται στην υψηλότερη εγγενή τους ανάλυση. - + + RNG Seed + RNG Seed + + + + Note: this can be overridden when region setting is auto-select + Σημείωση: αυτό μπορεί να παρακαμφθεί όταν η ρύθμιση περιοχής είναι ως αυτόματη επιλογή + + + + Region: + Περιφέρεια: + + + + Time Zone: + Ζώνη Ώρας: + + + + Prompt for user on game boot + Επιλογή χρήστη κατά την εκκίνηση παιχνιδιού + + + + Pause emulation when in background + Παύση εξομοίωσης όταν βρίσκεται στο παρασκήνιο + + + + Hide mouse on inactivity + Απόκρυψη δρομέα ποντικιού στην αδράνεια + + + + CPU + CPU + + + + Vulkan + Vulkan + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Shaders Γλώσσας Μηχανής, μόνο NVIDIA) + + + + Auto + Αυτόματη + + + + Accurate + Ακριβής + + + + Unsafe + Επισφαλής + + + + Borderless Windowed + Παραθυροποιημένο Χωρίς Όρια + + + + Exclusive Fullscreen + Αποκλειστική Πλήρης Οθόνη + + + + No Video Output + Χωρίς Έξοδο Βίντεο + + + + CPU Video Decoding + Αποκωδικοποίηση Βίντεο CPU + + + + GPU Video Decoding (Default) + Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + Nearest Neighbor + Πλησιέστερος Γείτονας + + + + Bilinear + Διγραμμικό + + + + Bicubic + Δικυβικό + + + + Gaussian + Gaussian + + + + ScaleForce + ScaleForce + + + + None + Κανένα + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Προεπιλογή (16:9) + + + + Force 4:3 + Επιβολή 4:3 + + + + Force 21:9 + Επιβολή 21:9 + + + + Force 16:10 + Επιβολή 16:10 + + + + Stretch to Window + Επέκταση στο Παράθυρο + + + + Automatic + Αυτόματα + + + + + Default + Προεπιλεγμένο + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Output Device: + + + + + Input Device: + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + Shader Backend: + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + FSR Sharpness: + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Use disk pipeline cache + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + VSync Mode: + + + + + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. +FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. +Mailbox can have lower latency than FIFO and does not tear but may drop frames. +Immediate (no synchronization) just presents whatever is available and can exhibit tearing. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Enable asynchronous presentation (Vulkan only) + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Force maximum clocks (Vulkan only) + + + + + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - RNG Seed + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - + Device Name - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Σημείωση: αυτό μπορεί να παρακαμφθεί όταν η ρύθμιση περιοχής είναι ως αυτόματη επιλογή - - - - Region: - Περιφέρεια: - - - + The region of the emulated Switch. - - Time Zone: - Ζώνη Ώρας: - - - + The time zone of the emulated Switch. - + Sound Output Mode: - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Επιλογή χρήστη κατά την εκκίνηση παιχνιδιού - - - - Pause emulation when in background - Παύση εξομοίωσης όταν βρίσκεται στο παρασκήνιο - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Απόκρυψη δρομέα ποντικιού στην αδράνεια - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - + OpenGL - - Vulkan - Vulkan - - - + Null - + GLSL - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Shaders Γλώσσας Μηχανής, μόνο NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - + Normal - + High - + Extreme - - Auto - Αυτόματη + + Unsafe (fast) + - - Accurate - Ακριβής + + Safe (stable) + - - Unsafe - Επισφαλής - - - + Paranoid (disables most optimizations) - + Dynarmic - + NCE - - Borderless Windowed - Παραθυροποιημένο Χωρίς Όρια - - - - Exclusive Fullscreen - Αποκλειστική Πλήρης Οθόνη - - - - No Video Output - Χωρίς Έξοδο Βίντεο - - - - CPU Video Decoding - Αποκωδικοποίηση Βίντεο CPU - - - - GPU Video Decoding (Default) - Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - + 1.5X (1080p/1620p) [EXPERIMENTAL] - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - + 7X (5040p/7560p) - + 8X (5760p/8640p) - - Nearest Neighbor - Πλησιέστερος Γείτονας - - - - Bilinear - Διγραμμικό - - - - Bicubic - Δικυβικό - - - - Gaussian - Gaussian - - - - ScaleForce - ScaleForce - - - + AMD FidelityFX™️ Super Resolution - + Area - - None - Κανένα - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Προεπιλογή (16:9) - - - - Force 4:3 - Επιβολή 4:3 - - - - Force 21:9 - Επιβολή 21:9 - - - - Force 16:10 - Επιβολή 16:10 - - - - Stretch to Window - Επέκταση στο Παράθυρο - - - - Automatic - Αυτόματα - - - - Default - Προεπιλεγμένο - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - - + + Serbian (српски) + + + + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Docked - + Handheld Handheld - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2257,27 +2354,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Καταγραφή Συμβάντων - + Open Log Location Άνοιγμα θέσης του αρχείου καταγραφής - + Global Log Filter Παγκόσμιο φίλτρο αρχείου καταγραφής - + When checked, the max size of the log increases from 100 MB to 1 GB Όταν επιλεγεί, το μέγιστο μέγεθος του αρχείου καταγραφής αυξάνεται από 100 MB σε 1 GB - + Enable Extended Logging** Ενεργοποίηση Εκτεταμένης Καταγραφής** - + Show Log in Console @@ -2423,7 +2520,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2485,7 +2582,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Αυτό θα μηδενιστεί αυτόματα όταν το yuzu κλείσει. - + Web applet not compiled Το web applet δεν έχει συσταθεί @@ -2535,7 +2632,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2544,88 +2641,88 @@ When a guest attempts to open the controller applet, it is immediately closed. - + Applets - - + + Audio Ήχος - - + + CPU CPU - + Debug Αποσφαλμάτωση - + Filesystem Σύστημα Αρχείων - - + + General Γενικά - - + + Graphics Γραφικά - + GraphicsAdvanced - + GraphicsExtensions - + Hotkeys Πλήκτρα Συντόμευσης - - + + Controls Χειρισμός - + Profiles Τα προφίλ - + Network Δίκτυο - - + + System Σύστημα - + Game List Λίστα Παιχνιδιών - + Web Ιστός @@ -2723,51 +2820,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Επαναφορά Προσωρινής Μνήμης Μεταδεδομένων - + Select Emulated NAND Directory... - + Select Emulated SD Directory... - + Select Gamecard Path... - + Select Dump Directory... - + Select Mod Load Directory... - The metadata cache is already empty. - Η προσωρινή μνήμη μεταδεδομένων είναι ήδη άδεια. + Η προσωρινή μνήμη μεταδεδομένων είναι ήδη άδεια. - The operation completed successfully. - Η επέμβαση ολοκληρώθηκε με επιτυχία. + Η επέμβαση ολοκληρώθηκε με επιτυχία. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Δεν ήταν δυνατή η διαγραφή της προσωρινής μνήμης μεταδεδομένων. Μπορεί να χρησιμοποιείται ή να μην υπάρχει. + Δεν ήταν δυνατή η διαγραφή της προσωρινής μνήμης μεταδεδομένων. Μπορεί να χρησιμοποιείται ή να μην υπάρχει. @@ -2798,12 +2889,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Επαναφέρει όλες τις ρυθμίσεις και καταργεί όλες τις επιλογές ανά παιχνίδι. Δεν θα διαγράψει καταλόγους παιχνιδιών, προφίλ ή προφίλ εισόδου. Συνέχιση; @@ -2836,33 +2927,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Χρώμα Φόντου: - + % FSR sharpening percentage (e.g. 50%) % - + Off - + VSync Off - + Recommended - + On - + VSync On @@ -2899,14 +2990,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2938,75 +3033,75 @@ These settings are experimental, and may cause black screens. If your games fail Επαναφορά Προεπιλογών - + Action Δράση - + Hotkey Πλήκτρο Συντόμευσης - + Controller Hotkey Πλήκτρο Συντόμευσης Χειριστηρίου - - - + + + Conflicting Key Sequence Αντικρουόμενη Ακολουθία Πλήκτρων - - + + The entered key sequence is already assigned to: %1 Η εισαγόμενη ακολουθία πλήκτρων έχει ήδη αντιστοιχιστεί στο: %1 - + [waiting] [αναμονή] - + Invalid Μη Έγκυρο - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Επαναφορά Προκαθορισμένων - + Clear Καθαρισμός - + Conflicting Button Sequence Αντικρουόμενη Ακολουθία Κουμπιών - + The default button sequence is already assigned to: %1 Η προεπιλεγμένη ακολουθία κουμπιών έχει ήδη αντιστοιχιστεί στο: %1 - + The default key sequence is already assigned to: %1 Η προεπιλεγμένη ακολουθία πλήκτρων έχει ήδη αντιστοιχιστεί στο: %1 @@ -3326,7 +3421,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3481,7 +3576,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Αριστερό Stick @@ -3591,14 +3686,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3617,7 +3712,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Συν @@ -3630,15 +3725,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3683,7 +3778,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Δεξιός Μοχλός @@ -3698,242 +3793,242 @@ These settings are experimental, and may cause black screens. If your games fail Διαμόρφωση - - - - + + + + Clear Καθαρισμός - - - - - + + + + + [not set] [άδειο] - - - + + + Invert button Κουμπί αντιστροφής - - + + Toggle button Κουμπί εναλλαγής - + Turbo button - - + + Invert axis Αντιστροφή άξονα - - - + + + Set threshold Ορισμός ορίου - - + + Choose a value between 0% and 100% Επιλέξτε μια τιμή μεταξύ 0% και 100% - + Toggle axis Εναλλαγή αξόνων - + Set gyro threshold Ρύθμιση κατωφλίου γυροσκοπίου - + Calibrate sensor - + Map Analog Stick Χαρτογράφηση Αναλογικού Stick - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Αφού πατήσετε OK, μετακινήστε πρώτα το joystick σας οριζόντια και μετά κατακόρυφα. Για να αντιστρέψετε τους άξονες, μετακινήστε πρώτα το joystick κατακόρυφα και μετά οριζόντια. - + Center axis Κεντρικός άξονας - - + + Deadzone: %1% Νεκρή Ζώνη: %1% - - + + Modifier Range: %1% Εύρος Τροποποιητή: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Διπλά Joycons - + Left Joycon Αριστερό Joycon - + Right Joycon Δεξί Joycon - + Handheld Handheld - + GameCube Controller Χειριστήριο GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Χειριστήριο NES - + SNES Controller Χειριστήριο SNES - + N64 Controller Χειριστήριο N64 - + Sega Genesis Sega Genesis - + Start / Pause - + Z Z - + Control Stick - + C-Stick C-Stick - + Shake! - + [waiting] [αναμονή] - + New Profile Νέο Προφίλ - + Enter a profile name: Εισαγάγετε ένα όνομα προφίλ: - - + + Create Input Profile Δημιουργία Προφίλ Χειρισμού - + The given profile name is not valid! Το όνομα του προφίλ δεν είναι έγκυρο! - + Failed to create the input profile "%1" Η δημιουργία του προφίλ χειρισμού "%1" απέτυχε - + Delete Input Profile Διαγραφή Προφίλ Χειρισμού - + Failed to delete the input profile "%1" Η διαγραφή του προφίλ χειρισμού "%1" απέτυχε - + Load Input Profile Φόρτωση Προφίλ Χειρισμού - + Failed to load the input profile "%1" Η φόρτωση του προφίλ χειρισμού "%1" απέτυχε - + Save Input Profile Αποθήκευση Προφίλ Χειρισμού - + Failed to save the input profile "%1" Η αποθήκευση του προφίλ χειρισμού "%1" απέτυχε @@ -3990,7 +4085,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure Διαμόρφωση @@ -4026,7 +4121,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test Τεστ @@ -4041,7 +4136,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< Κατάργηση Διακομιστή - + %1:%2 %1:%2 @@ -4050,77 +4145,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Ο αριθμός θύρας έχει μη έγκυρους χαρακτήρες - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Η θύρα πρέπει να ανήκει στο εύρος 0 και 65353 - + IP address is not valid Η διεύθυνση IP δεν είναι έγκυρη - + This UDP server already exists Αυτός ο διακομιστής UDP υπάρχει ήδη - + Unable to add more than 8 servers Δεν είναι δυνατή η προσθήκη περισσότερων από 8 διακομιστών - + Testing Δοκιμή - + Configuring Διαμόρφωση - + Test Successful Τεστ Επιτυχές - + Successfully received data from the server. Λήφθηκαν με επιτυχία δεδομένα από τον διακομιστή. - + Test Failed Η Δοκιμή Απέτυχε - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Δεν ήταν δυνατή η λήψη έγκυρων δεδομένων από τον διακομιστή.<br>Βεβαιωθείτε ότι ο διακομιστής έχει ρυθμιστεί σωστά και ότι η διεύθυνση και η θύρα είναι σωστές. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Η δοκιμή UDP ή η διαμόρφωση βαθμονόμησης είναι σε εξέλιξη.<br>Παρακαλώ περιμένετε να τελειώσουν. @@ -4246,7 +4341,12 @@ Current values are %1% and %2% respectively. Διεπαφή Δικτύου - + + Enable Airplane Mode + + + + None Κανένα @@ -4304,52 +4404,52 @@ Current values are %1% and %2% respectively. - + Add-Ons Πρόσθετα - + System Σύστημα - + CPU CPU - + Graphics Γραφικά - + Adv. Graphics Προχ. Γραφικά - + GPU Extensions - + Audio Ήχος - + Input Profiles - + Linux - + Properties Ιδιότητες @@ -4367,12 +4467,12 @@ Current values are %1% and %2% respectively. Πρόσθετα - + Patch Name Όνομα Ενημέρωσης Κώδικα - + Version Έκδοση @@ -4410,27 +4510,32 @@ Current values are %1% and %2% respectively. Ορισμός Εικόνας - + + Select Avatar + + + + Add Προσθήκη - + Rename Μετονομασία - + Remove Αφαίρεση - + Profile management is available only when game is not running. Η διαχείριση προφίλ είναι διαθέσιμη μόνο όταν το παιχνίδι δεν εκτελείται. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4438,100 +4543,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Εισάγετε Όνομα Χρήστη - + Users Χρήστες - + Enter a username for the new user: Εισαγάγετε ένα όνομα χρήστη για τον νέο χρήστη: - + Enter a new username: Εισαγάγετε ένα νέο όνομα χρήστη: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Επιλέξτε Εικόνα χρήστη - - JPEG Images (*.jpg *.jpeg) - Εικόνες JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Εικόνες JPEG (*.jpg *.jpeg) + + + Error deleting image Σφάλμα κατα τη διαγραφή εικόνας - + Error occurred attempting to overwrite previous image at: %1. Παρουσιάστηκε σφάλμα κατά την προσπάθεια αντικατάστασης της προηγούμενης εικόνας στο: %1. - + Error deleting file Σφάλμα κατα τη διαγραφή του αρχείου - + Unable to delete existing file: %1. Δεν είναι δυνατή η διαγραφή του υπάρχοντος αρχείου: %1. - + Error creating user image directory Σφάλμα δημιουργίας καταλόγου εικόνων χρήστη - + Unable to create directory %1 for storing user images. Δεν είναι δυνατή η δημιουργία του καταλόγου %1 για την αποθήκευση εικόνων χρήστη. - Error copying user image - Σφάλμα κατά την αντιγραφή της εικόνας χρήστη + Σφάλμα κατά την αντιγραφή της εικόνας χρήστη - Unable to copy image from %1 to %2 - Αδύνατη η αντιγραφή της εικόνας από το %1 στο %2 + Αδύνατη η αντιγραφή της εικόνας από το %1 στο %2 - Error resizing user image - Σφάλμα αλλαγής μεγέθους εικόνας χρήστη + Σφάλμα αλλαγής μεγέθους εικόνας χρήστη - Unable to resize image - Δεν είναι δυνατή η αλλαγή μεγέθους της εικόνας + Δεν είναι δυνατή η αλλαγή μεγέθους της εικόνας + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. - + Confirm Delete Επιβεβαίωση Διαγραφής - + Name: %1 UUID: %2 @@ -4583,7 +4777,7 @@ UUID: %2 - + Enable @@ -4594,7 +4788,7 @@ UUID: %2 - + Not connected @@ -4604,63 +4798,63 @@ UUID: %2 Επαναφορά Προεπιλογών - + Clear Καθαρισμός - + [not set] [μη ορισμένο] - + Invert axis Αντιστροφή άξονα - - + + Deadzone: %1% Νεκρή Ζώνη: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Διαμόρφωση - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [αναμονή] @@ -4698,7 +4892,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4750,12 +4944,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Ρυθμίσεις TAS - + Select TAS Load Directory... @@ -4864,7 +5058,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5186,41 +5380,38 @@ Drag points to change position, or double-click table cells to edit values. - eden Web Service + Eden Web Service - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. + + Generate - Verify - Επαλήθευση + Επαλήθευση - Sign up - Εγγραφή + Εγγραφή - + Token: Διαπιστευτήριο: - + Username: Όνομα χρήστη: - What is my token? - Ποιο είναι το διακριτικό μου; + Ποιο είναι το διακριτικό μου; - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5241,12 +5432,12 @@ Drag points to change position, or double-click table cells to edit values.Εκ Νέου Αντικατάσταση - + Discord Presence - + Show Current Game in your Discord Status @@ -5255,30 +5446,9 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Μάθετε περισσότερα</span></a> - - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - - - - Unverified, please click Verify before saving configuration Tooltip - Μη επαληθευμένο, κάντε κλικ στο κουμπί Επαλήθευση πριν αποθηκεύσετε τις ρυθμίσεις + Μη επαληθευμένο, κάντε κλικ στο κουμπί Επαλήθευση πριν αποθηκεύσετε τις ρυθμίσεις Verified @@ -5294,20 +5464,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed Η επαλήθευση απέτυχε + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 - + &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Έκδοση + + DirectConnect @@ -5413,7 +5630,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5421,11 +5643,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5483,93 +5700,88 @@ Please go to Configure -> System -> Network and make a selection. Τηλεμετρία - + Broken Vulkan Installation Detected - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Πόσα καρέ ανά δευτερόλεπτο εμφανίζει το παιχνίδι αυτή τη στιγμή. Αυτό διαφέρει από παιχνίδι σε παιχνίδι και από σκηνή σε σκηνή. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue &Συνέχεια - + &Pause &Παύση - - - Warning Outdated Game Format - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Μη μεταφρασμένη συμβολοσειρά @@ -5578,497 +5790,277 @@ Please go to Configure -> System -> Network and make a selection. Για μια εξήγηση των διαφόρων μορφών Switch που υποστηρίζει το yuzu,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'> δείτε το wiki μας </a>. Αυτό το μήνυμα δεν θα εμφανιστεί ξανά. - - + + Error while loading ROM! Σφάλμα κατά τη φόρτωση της ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Εμφανίστηκε ένα απροσδιόριστο σφάλμα. Ανατρέξτε στο αρχείο καταγραφής για περισσότερες λεπτομέρειες. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... - + Save Data Αποθήκευση δεδομένων - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! Ο φάκελος δεν υπάρχει! - - Error Opening Transferable Shader Cache - - - - - Failed to create the shader cache directory for this title. - - - - - Error Removing Contents - - - - - Error Removing Update - - - - - Error Removing DLC - - - - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - - - - - - - Successfully Removed - - - - - Successfully removed the installed base game. - - - - - The base game is not installed in the NAND and cannot be removed. - - - - - Successfully removed the installed update. - - - - - There is no update installed for this title. - - - - - There are no DLC installed for this title. - - - - - Successfully removed %1 installed DLC. - - - - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File Αφαίρεση Αρχείου - + Remove Play Time Data - + Reset play time? - - - Error Removing Transferable Shader Cache - - - + - - A shader cache for this title does not exist. - - - - - Successfully removed the transferable shader cache. - - - - - Failed to remove the transferable shader cache. - - - - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - - Error Removing Custom Configuration - - - - - A custom configuration for this title does not exist. - - - - - Successfully removed the custom game configuration. - - - - - Failed to remove the custom game configuration. - - - - - RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode Επιλογή λειτουργίας απόρριψης RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Μη αποθηκευμένη μετάφραση. Παρακαλούμε επιλέξτε τον τρόπο με τον οποίο θα θέλατε να γίνει η απόρριψη της RomFS.<br> Η επιλογή Πλήρης θα αντιγράψει όλα τα αρχεία στο νέο κατάλογο, ενώ η επιλογή <br> Σκελετός θα δημιουργήσει μόνο τη δομή του καταλόγου. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - - - - + + Cancel Ακύρωση - + RomFS Extraction Succeeded! - - - + The operation completed successfully. Η επέμβαση ολοκληρώθηκε με επιτυχία. - - Integrity verification couldn't be performed! + + Warning: Outdated Game Format - - File contents were not checked for validity. + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - Verifying integrity... + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - Integrity verification succeeded! + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - - Create Shortcut - - - - - Do you want to launch the game in fullscreen? - - - - - Successfully created a shortcut to %1 - - - - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - - Create Icon - - - - - Cannot create icon file. Path "%1" does not exist and cannot be created. - - - - + Error Opening %1 - + Select Directory Επιλογή καταλόγου - + Properties Ιδιότητες - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File Φόρτωση αρχείου - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining @@ -6076,24 +6068,24 @@ Please go to Configure -> System -> Network and make a selection. - + Installing file "%1"... - - + + Install Results Αποτελέσματα εγκατάστασης - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed @@ -6102,7 +6094,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten @@ -6111,7 +6103,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install @@ -6120,484 +6112,438 @@ Please, only use this feature to install updates and DLC. - + System Application Εφαρμογή συστήματος - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Παιχνίδι - + Game Update Ενημέρωση παιχνιδιού - + Game DLC DLC παιχνιδιού - + Delta Title - + Select NCA Install Type... Επιλέξτε τον τύπο εγκατάστασης NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found Το αρχείο δεν βρέθηκε - + File "%1" not found Το αρχείο "%1" δεν βρέθηκε - + OK OK - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? - + + Encryption keys are missing. + + + + Error opening URL Σφάλμα κατα το άνοιγμα του URL - + Unable to open the URL "%1". Αδυναμία ανοίγματος του URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed - + Error Σφάλμα - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Φόρτωση Amiibo - + Error loading Amiibo data Σφάλμα φόρτωσης δεδομένων Amiibo - + The selected file is not a valid amiibo Το επιλεγμένο αρχείο δεν αποτελεί έγκυρο amiibo - + The selected file is already on use Το επιλεγμένο αρχείο χρησιμοποιείται ήδη - + An unknown error occurred - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Applet Χειρισμού - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Λήψη στιγμιότυπου οθόνης - + PNG Image (*.png) Εικόνα PBG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + &Start &Έναρξη - + Stop R&ecording - + R&ecord - + Building: %n shader(s) @@ -6605,70 +6551,70 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Κλίμακα: %1x - + Speed: %1% / %2% Ταχύτητα: %1% / %2% - + Speed: %1% Ταχύτητα: %1% - + Game: %1 FPS - + Frame: %1 ms Καρέ: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. @@ -6681,107 +6627,107 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Nearest - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked Docked - + Handheld Handheld - + Normal - + High - + Extreme - + Vulkan Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6789,44 +6735,44 @@ Would you like to download it? GRenderWindow - - + + OpenGL not available! Το OpenGL δεν είναι διαθέσιμο! - + OpenGL shared contexts are not supported. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Σφάλμα κατα την αρχικοποίηση του OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 @@ -6834,128 +6780,128 @@ Would you like to download it? GameList - + Favorite Αγαπημένο - + Start Game Έναρξη παιχνιδιού - + Start Game without Custom Configuration - + Open Save Data Location Άνοιγμα Τοποθεσίας Αποθήκευσης Δεδομένων - + Open Mod Data Location Άνοιγμα Τοποθεσίας Δεδομένων Mod - + Open Transferable Pipeline Cache - + Remove Αφαίρεση - + Remove Installed Update Αφαίρεση Εγκατεστημένης Ενημέρωσης - + Remove All Installed DLC Αφαίρεση Όλων των Εγκατεστημένων DLC - + Remove Custom Configuration - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches Καταργήστε Όλη την Κρυφή μνήμη του Pipeline - + Remove All Installed Contents Καταργήστε Όλο το Εγκατεστημένο Περιεχόμενο - + Dump RomFS Απόθεση του RomFS - + Dump RomFS to SDMC Απόθεση του RomFS στο SDMC - + Verify Integrity - + Copy Title ID to Clipboard Αντιγραφή του Title ID στο Πρόχειρο - + Navigate to GameDB entry Μεταβείτε στην καταχώρηση GameDB - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + Configure Game @@ -6964,62 +6910,62 @@ Would you like to download it? Ιδιότητες - + Scan Subfolders Σκανάρισμα Υποφακέλων - + Remove Game Directory Αφαίρεση Φακέλου Παιχνιδιών - + ▲ Move Up ▲ Μετακίνηση Επάνω - + ▼ Move Down ▼ Μετακίνηση Κάτω - + Open Directory Location Ανοίξτε την Τοποθεσία Καταλόγου - + Clear Καθαρισμός - + Name Όνομα - + Compatibility Συμβατότητα - + Add-ons Πρόσθετα - + File type Τύπος αρχείου - + Size Μέγεθος - + Play time @@ -7027,62 +6973,62 @@ Would you like to download it? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Perfect Τέλεια - + Game can be played without issues. - + Playable - + Game functions with minor graphical or audio glitches and is playable from start to finish. - + Intro/Menu Εισαγωγή/Μενου - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot Δεν ξεκινά - + The game crashes when attempting to startup. Το παιχνίδι διακόπτεται κατά την προσπάθεια εκκίνησης. - + Not Tested Μη Τεσταρισμένο - + The game has not yet been tested. Το παιχνίδι δεν έχει ακόμα τεσταριστεί. @@ -7090,7 +7036,7 @@ Would you like to download it? GameListPlaceholder - + Double-click to add a new folder to the game list Διπλο-κλικ για προσθήκη νεου φακέλου στη λίστα παιχνιδιών @@ -7098,7 +7044,7 @@ Would you like to download it? GameListSearchField - + %1 of %n result(s) @@ -7106,12 +7052,12 @@ Would you like to download it? - + Filter: Φίλτρο: - + Enter pattern to filter Εισαγάγετε μοτίβο για φιλτράρισμα @@ -7193,7 +7139,7 @@ Would you like to download it? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7201,186 +7147,186 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Λήψη στιγμιότυπου οθόνης - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy - + Configure Διαμόρφωση - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen - - Exit eden + + Exit Eden - + Fullscreen Πλήρη Οθόνη - + Load File Φόρτωση αρχείου - + Load/Remove Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation - + Stop Emulation - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar @@ -7388,22 +7334,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Επιβεβαιώστε ότι αυτά είναι τα αρχεία που θέλετε να εγκαταστήσετε. - + Installing an Update or DLC will overwrite the previously installed one. Η εγκατάσταση μιας Ενημέρωσης ή DLC θα αντικαταστήσει το προηγουμένως εγκατεστημένο. - + Install Εγκατάσταση - + Install Files to NAND @@ -7411,7 +7357,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 @@ -7557,349 +7503,412 @@ Debug Message: - + &Emulation - + &View - + &Reset Window Size - + &Debugging - + Reset Window Size to &720p - + Reset Window Size to 720p - + Reset Window Size to &900p - + Reset Window Size to 900p - + Reset Window Size to &1080p - + Reset Window Size to 1080p - + &Multiplayer &Πολλαπλών Παικτών - + &Tools - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help - + &Install Files to NAND... - + L&oad File... - + Load &Folder... - + E&xit - + &Pause &Παύση - + &Stop &Σταμάτημα - + &Verify Installed Contents - - &About eden - - - - - Open &eden Folder - - - - + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu - + Single &Window Mode - + + Open &Eden Folders + + + + + &About Eden + + + + Con&figure... - + Ctrl+, - + Display D&ock Widget Headers - + Show &Filter Bar - + Show &Status Bar - + Show Status Bar - + &Browse Public Game Lobby &Περιήγηση σε δημόσιο λόμπι παιχνιδιού - + &Create Room &Δημιουργία δωματίου - + &Leave Room &Αποχωρήσει από το δωμάτιο - + &Direct Connect to Room &Άμεση σύνδεση σε Δωμάτιο - + &Show Current Room &Εμφάνιση τρέχοντος δωματίου - + F&ullscreen - + &Restart - + Load/Remove &Amiibo... - + &Report Compatibility - + Open &Mods Page - + Open &Quickstart Guide - + &FAQ - + &Capture Screenshot - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - + &Start &Έναρξη - + &Reset - + R&ecord - + Open &Controller Menu - + + &Root Data Folder + + + + + &NAND Folder + + + + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Install Firmware - + Install Decryption Keys - - MicroProfileDialog - - - &MicroProfile - - - MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -7959,37 +7968,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! - + Not Connected - + Connected Συνδεδεμένο - + New Messages Received - + Error Σφάλμα - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8128,56 +8137,56 @@ p, li { white-space: pre-wrap; } Δεν παίζει παιχνίδι - + Installed SD Titles - + Installed NAND Titles - + System Titles Τίτλοι Συστήματος - + Add New Game Directory Προσθήκη Νέας Τοποθεσίας Παιχνιδιών - + Favorites Αγαπημένα - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [μη ορισμένο] @@ -8188,14 +8197,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + Axis %1%2 Άξονας%1%2 @@ -8206,357 +8215,357 @@ p, li { white-space: pre-wrap; } - - - - - - + + + + + + [unknown] [άγνωστο] - - - + + + Left Αριστερά - - - + + + Right Δεξιά - - - + + + Down Κάτω - - - + + + Up Πάνω - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X Χ - - + + Y Υ - - + + Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle - - + + Cross - - + + Square - - + + Triangle - - + + Share - - + + Options - - + + [undefined] - + %1%2 - - + + [invalid] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 - - + + %1%2Motion %3 - - + + %1%2Button %3 - - + + [unused] [άδειο] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L - + Stick R - + Plus Συν - + Minus Μείον - - + + Home Αρχική - + Capture Στιγμιότυπο - + Touch - + Wheel Indicates the mouse wheel - + Backward - + Forward - + Task - + Extra - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8674,6 +8683,298 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + Η επέμβαση ολοκληρώθηκε με επιτυχία. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + + + + + Error Removing Update + + + + + Error Removing DLC + + + + + The base game is not installed in the NAND and cannot be removed. + + + + + There is no update installed for this title. + + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + + + + + Successfully removed %1 installed DLC. + + + + + + Error Removing Transferable Shader Cache + + + + + + A shader cache for this title does not exist. + + + + + Successfully removed the transferable shader cache. + + + + + Failed to remove the transferable shader cache. + + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + + + + + A custom configuration for this title does not exist. + + + + + Successfully removed the custom game configuration. + + + + + Failed to remove the custom game configuration. + + + + + Reset Metadata Cache + Επαναφορά Προσωρινής Μνήμης Μεταδεδομένων + + + + The metadata cache is already empty. + Η προσωρινή μνήμη μεταδεδομένων είναι ήδη άδεια. + + + + The operation completed successfully. + Η επέμβαση ολοκληρώθηκε με επιτυχία. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Δεν ήταν δυνατή η διαγραφή της προσωρινής μνήμης μεταδεδομένων. Μπορεί να χρησιμοποιείται ή να μην υπάρχει. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -8963,7 +9264,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -8971,7 +9272,7 @@ Please try again or contact the developer of the software. %2 - + Users Χρήστες @@ -9095,7 +9396,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Κλήση stack @@ -9103,12 +9404,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread @@ -9116,102 +9417,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable - + paused - + sleeping - + waiting for IPC reply - + waiting for objects αναμονή αντικειμένων - + waiting for condition variable - + waiting for address arbiter - + waiting for suspend resume - + waiting - + initialized - + terminated - + unknown - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal - + core %1 πυρήνας %1 - + processor = %1 επεξεργαστής = %1 - + affinity mask = %1 - + thread id = %1 - + priority = %1(current) / %2(normal) προτεραιότητα = %1(τρέχον) / %2(κανονικό) - + last running ticks = %1 @@ -9219,7 +9520,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread @@ -9227,7 +9528,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree diff --git a/dist/languages/es.ts b/dist/languages/es.ts index fca48d93ad..0c799e2aea 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Comunicando con el servidor... - + Cancel Cancelar - + Touch the top left corner <br>of your touchpad. Toque la esquina superior izquierda<br>del trackpad. - + Now touch the bottom right corner <br>of your touchpad. Ahora toque la esquina inferior derecha <br>del trackpad. - + Configuration completed! ¡Configuración completada! - + OK OK @@ -397,134 +397,134 @@ Esto banearía su nombre del foro y su dirección IP. ConfigurationShared - + % % - + Amiibo editor Editor de Amiibo - + Controller configuration Configuración de controles - + Data erase Borrar datos - + Error Error - + Net connect Conexión a la red - + Player select Selección de personaje - + Software keyboard Teclado de software - + Mii Edit Editor de Mii - + Online web Web online - + Shop Tienda - + Photo viewer Álbum - + Offline web Web offline - + Login share Inicio de sesión - + Wifi web auth Autenticación Wi-Fi - + My page Mi página - + Output Engine: Motor de salida: - + Output Device: Dispositivo de salida: - + Input Device: Dispositivo de entrada: - + Mute audio Silenciar sonido - + Volume: Volumen: - + Mute audio when in background Silenciar audio en segundo plano - + Multicore CPU Emulation Emulación de CPU multinúcleo - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Esta opción aumenta los hilos de CPU emulados de 1 a 4, el máximo de la Switch. Esta es una opción para depuración y no ha de activarse. - + Memory Layout Memoria emulada - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ No mejora ni la estabilidad ni el rendimiento y la intención es permitir que lo Activarlo incrementará el uso de memoria. No es recomendable activarlo a menos que un juego específico con un mod de texturas lo necesite. - + Limit Speed Percent Limitar porcentaje de velocidad - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,141 +547,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Precisión: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Este ajuste controla la precisión de la CPU emulada. No ha de cambiarse salvo que sepas lo que estás haciendo. - - + + Backend: Motor: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Desactivar FMA (mejora el rendimiento en las CPU sin FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Esta opción mejora el rendimiento al reducir la precisión de las instrucciones fused-multiply-add en las CPU sin soporte nativo FMA. - + Faster FRSQRTE and FRECPE FRSQRTE y FRECPE rápido - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Esta opción mejora el rendimiento de algunas funciones aproximadas de punto flotante al utilizar aproximaciones nativas menos precisas. - + Faster ASIMD instructions (32 bits only) Instrucciones ASIMD rápidas (sólo 32 bits) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Esta opción mejora la velocidad de las funciones de punto flotante ASIMD de 32 bits al ejecutarlas con redondeos incorrectos. - + Inaccurate NaN handling Gestión imprecisa NaN - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Esta opción mejora el rendimiento al no hacer comprobaciones "NaN". Ten en cuenta que, a cambio, reduce la precisión de ciertas instrucciones de coma flotante. - + Disable address space checks Desactivar comprobación del espacio de destino - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Esta opción mejora el rendimiento eliminando una comprobación de seguridad en cada lectura escritura de memoria emulada (guest). Desactivarlo puede permitir a un juego escribir o leer la memoria el emulador (host). - + Ignore global monitor Ignorar monitorización global - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. Esta opción mejora el rendimiento al depender sólo de la semántica de "cmpxchg" para garantizar la seguridad de las instrucciones de acceso exclusivo. Ten en cuenta que puede resultar en bloqueos y otras condiciones de carrera. - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Alterna entre las APIs gráficas disponibles. Vulkan es la recomendación para la mayoría de casos. - + Device: Dispositivo: - + This setting selects the GPU to use with the Vulkan backend. Selecciona que GPU usar en Vulkan. - + Shader Backend: Soporte de shaders: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -692,12 +669,12 @@ GLASM es un motor específico de NVIDIA ya obsoleto que ofrece mejor rendimiento SPIR-V es el más rápido, pero da malos resultados en la mayoría de drivers. - + Resolution: Resolución: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -706,27 +683,27 @@ Mayores resoluciones requieren mucha más capacidad y ancho de banda de VRAM. Opciones por debajo de 1x pueden causar errores gráficos. - + Window Adapting Filter: Filtro adaptable de ventana: - + FSR Sharpness: Nitidez FSR: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Ajusta la intensidad del filtro de enfoque al usar el contraste dinámico de FSR. - + Anti-Aliasing Method: Método de Anti-Aliasing: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -735,12 +712,12 @@ SMAA ofrece algo mejor calidad. FXAA ofrece algo mejor de rendimiento y mayor estabilidad de imagen a muy bajas resoluciones. - + Fullscreen Mode: Modo pantalla completa: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -749,12 +726,12 @@ Ventana sin bordes ofrece la mejor compatibilidad con el teclado en pantalla que Pantalla completa exclusiva puede ofrecer mejor rendimiento y mejor soporte para FreeSync/G-Sync/VRR. - + Aspect Ratio: Relación de aspecto: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -763,49 +740,36 @@ Nativamente, los juegos solo soportan 16:9. Se necesitarán mods para otras rela También afecta a las capturas de pantalla. - + Use disk pipeline cache Usar caché de canalización en disco - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite almacenar las shaders para cargar más rápido al arrancar el juego otra vez. Solo ha de desactivarse para depuración. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Usar emulación asíncrona de GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa un hilo de CPU adicional para renderizar. Esta opción debería estar siempre activada. - + NVDEC emulation: Emulación NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -814,12 +778,12 @@ Puede usar la CPU, GPU o no decodificar (mostrará una pantalla en negro durante En la mayoría de casos, decodificar mediante GPU es la mejor opción. - + ASTC Decoding Method: Modo decodificación ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -831,34 +795,24 @@ GPU: Usa las unidades de computa de la GPU, recomendado para la mayoría de jueg CPU Asíncrono: Usa la CPU para decodificar al vuelo. Elimina los tirones relacionados con decodificar texturas ASTC a cambio de errores gráficos mientras la textura se decodifica. - + ASTC Recompression Method: Modo recompresión ASTC: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Casi ninguna gráfica dedicada de ordenador tiene soporte para decodificar las texturas ASTC, forzando a descomprimir a un formato intermedio, RGBA8. Esta opción recomprime RGBA8 al formato BC1 o BC3, sacrificando calidad de imagen a cambio de menor uso de VRAM. - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Modo VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -869,63 +823,61 @@ Mailbox puede tener una latencia más baja que FIFO y no causa tearing, pero pod Inmediato (sin sincronización) sólo muestra lo que está disponible y puede mostrar tearing. - + Enable asynchronous presentation (Vulkan only) Activar presentación asíncrona (sólo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Mejora el rendimiento ligeramente al usar un hilo de CPU adicional para la presentación. - + Force maximum clocks (Vulkan only) Forzar relojes al máximo (sólo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Ejecuta los procesos en segundo plano mientras se espera a las instrucciones gráficas para evitar que la GPU reduzca su velocidad de reloj. - + Anisotropic Filtering: Filtrado anisotrópico: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. Controla la calidad de una textura renderizado a ángulos oblicuos. Es un ajuste de bajo coste y sin problemas a 16x en la mayoría de GPUs. - Accuracy Level: - Nivel de precisión: + Nivel de precisión: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - Precisión de GPU emulada. + Precisión de GPU emulada. La mayoría de juegos funcionan con "Normal", pero algunos requieren precisión "Alta". Partículas suelen depender de precisión "Alta". La precisión "Extrema" solo ha de usarse para depuración. Esta opción se puede cambiar mientras se juega, pero algunos juegos necesitan ser reiniciados para aplicar el cambio. - + Use asynchronous shader building (Hack) Usar la construcción de shaders asíncronos (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Activa la compilación asíncrona de shaders, que puede reducir los tirones producidos por shaders. @@ -940,24 +892,24 @@ Esta opción es experimental. Activa el tiempo rápido de GPU. Esta opción hará que la mayoría de juegos estén forzados a ejecutarse en su resolución nativa máxima. - + Use Vulkan pipeline cache Usar caché de canalización de Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Activa la caché de pipeline específica del fabricante. Esta opción puede mejorar los tiempos de cargas de shaders en caso de que el driver de Vulkan no lo almacene internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Activar canalizaciones de cómputo (solo Intel Vulkan) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -966,111 +918,111 @@ Esta opción sólo afecta a los controladores propios de AMD, y puede producir e Las canalizaciones de cómputo siempre están activadas en los demás controladores. - + Enable Reactive Flushing Activar Limpieza Reactiva - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa limpieza de memoria reactiva en vez de predictiva, permitiendo una sincronización de memoria más precisa. - + Sync to framerate of video playback Sincronizar a fotogramas de reproducción de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Ejecuta el juego a velocidad normal durante la reproducción de vídeos, incluso cuando no hay límite de fotogramas. - + Barrier feedback loops Bucles de feedback de barrera - + Improves rendering of transparency effects in specific games. Mejora la renderización de los efectos de transparencia en ciertos juegos. - + RNG Seed Semilla de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. Controla la semilla usada al generar números aleatoriamente (RNG seed). Usado principalmente en speedrunnning. - + Device Name Nombre del dispositivo - + The name of the emulated Switch. Nombre de la consola emulada. - + Custom RTC Date: Fecha Personalizada RTC: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Permite ajustar el reloj interno de la consola emulada. Puede usarse para manipular la hora dentro de los juegos. - + Language: Idioma: - + Note: this can be overridden when region setting is auto-select Nota: esto puede ser reemplazado si la opción de región está en "autoseleccionar" - + Region: Región: - + The region of the emulated Switch. La región de la Switch emulada. - + Time Zone: Zona horaria: - + The time zone of the emulated Switch. El huso horario de la Switch emulada. - + Sound Output Mode: Método de salida de sonido: - + Console Mode: Modo consola: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1079,7 +1031,7 @@ Los juegos cambiarán su resolución, calidad y mandos compatibles según este m Usar el modo Portátil puede ayudar al rendimiento en equipos de bajos recursos. - + Prompt for user on game boot Seleccionar usuario al arrancar @@ -1088,7 +1040,7 @@ Usar el modo Portátil puede ayudar al rendimiento en equipos de bajos recursos. Preguntar qué perfil de usuario usar al inciar, útil si múltiples personas usan yuzu en un mismo equipo. - + Pause emulation when in background Pausar emulación cuando la ventana esté en segundo plano @@ -1097,843 +1049,997 @@ Usar el modo Portátil puede ayudar al rendimiento en equipos de bajos recursos. Pausa yuzu cuando cuando no esté en primer plano. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Confirmar detención - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Salta el aviso del juego para confirmar si ha de salir. Activar esta opción salta ese aviso y detiene la emulacón directamente. - + Hide mouse on inactivity Ocultar el cursor por inactividad. - + This setting hides the mouse after 2.5s of inactivity. Oculta el ratón tras 2,5 segundos de inactividad. - + Disable controller applet Desactivar applet de mandos - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Fuerza la desactivación del applet de control para invitados. Cuando un invitado intenta abrir el applet de control, éste se cierra automáticamente. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Activar Modo Juego - + Custom frontend Interfaz personalizada - + Real applet Applet real - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asíncrona - + Uncompressed (Best quality) Sin compresión (Calidad óptima) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - Conservative - - - - - Aggressive - - - - + OpenGL OpenGL - + Vulkan Vulkan - + Null Ninguno - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (Shaders de ensamblado, sólo NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (Experimental, sólo AMD/Mesa) - + Normal Normal - + High Alto - + Extreme Extremo - + Auto Auto - + Accurate Preciso - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en la CPU - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolution - - Area - - - - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + + Default Predeterminado - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Conservative + + + + + Aggressive + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1942,37 +2048,37 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti 8GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar @@ -2327,27 +2433,27 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti Registro - + Open Log Location Abrir ubicación del archivo de registro - + Global Log Filter Filtro del registro global - + When checked, the max size of the log increases from 100 MB to 1 GB Al activarlo, el tamaño máximo del registro aumenta de 100 MB a 1 GB. - + Enable Extended Logging** Habilitar registro extendido** - + Show Log in Console Ver registro en consola @@ -2493,7 +2599,7 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2555,7 +2661,7 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti **Esto se reiniciará automáticamente cuando yuzu se cierre. - + Web applet not compiled Applet web no compilado @@ -2605,7 +2711,7 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti - eden Configuration + Eden Configuration @@ -2614,88 +2720,88 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti Algunos ajustes sólo están disponibles cuando no se estén ejecutando los juegos. - + Applets Applets - - + + Audio Audio - - + + CPU CPU - + Debug Depuración - + Filesystem Sistema de archivos - - + + General General - - + + Graphics Gráficos - + GraphicsAdvanced Gráficosavanzados - + GraphicsExtensions - + Hotkeys Teclas de acceso rápido - - + + Controls Controles - + Profiles Perfiles - + Network Red - - + + System Sistema - + Game List Lista de juegos - + Web Web @@ -2793,51 +2899,45 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti - - - Reset Metadata Cache Reiniciar caché de metadatos - + Select Emulated NAND Directory... Selecciona el directorio de NAND emulado... - + Select Emulated SD Directory... Seleccione el directorio de SD emulado... - + Select Gamecard Path... Seleccione la ruta del cartucho... - + Select Dump Directory... Seleccione directorio de volcado... - + Select Mod Load Directory... Seleccione el directorio de carga de mod... - The metadata cache is already empty. - El caché de metadatos ya está vacío. + El caché de metadatos ya está vacío. - The operation completed successfully. - La operación se completó con éxito. + La operación se completó con éxito. - The metadata cache couldn't be deleted. It might be in use or non-existent. - El caché de metadatos no se pudo eliminar. Puede que se encuentre en uso actualmente o ya haya sido eliminado. + El caché de metadatos no se pudo eliminar. Puede que se encuentre en uso actualmente o ya haya sido eliminado. @@ -2868,12 +2968,12 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Esto reiniciará y eliminará todas las configuraciones de los juegos. No eliminará ni los directorios de juego, ni los perfiles, ni los perfiles de los mandos. ¿Continuar? @@ -2906,33 +3006,33 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti Color de fondo: - + % FSR sharpening percentage (e.g. 50%) % - + Off Desactivado - + VSync Off VSync Desactivado - + Recommended Recomendado - + On Activado - + VSync On VSync Activado @@ -2969,14 +3069,18 @@ Cuando un invitado intenta abrir el applet de control, éste se cierra automáti - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3008,75 +3112,75 @@ These settings are experimental, and may cause black screens. If your games fail Restaurar valores predeterminados - + Action Acción - + Hotkey Tecla de acceso rápido - + Controller Hotkey Teclas de atajo del control - - - + + + Conflicting Key Sequence Combinación de teclas en conflicto - - + + The entered key sequence is already assigned to: %1 La combinación de teclas introducida ya ha sido asignada a: %1 - + [waiting] [esperando] - + Invalid No válido - + Invalid hotkey settings Configuración de teclas de atajo no válida - + An error occurred. Please report this issue on github. Ha ocurrido un error. Por favor, repórtelo en Github. - + Restore Default Restaurar valor predeterminado - + Clear Eliminar - + Conflicting Button Sequence Secuencia de botones en conflicto - + The default button sequence is already assigned to: %1 La secuencia de botones por defecto ya esta asignada a: %1 - + The default key sequence is already assigned to: %1 La combinación de teclas predeterminada ya ha sido asignada a: %1 @@ -3396,7 +3500,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3551,7 +3655,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Palanca izquierda @@ -3661,14 +3765,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3687,7 +3791,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Más @@ -3700,15 +3804,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3753,7 +3857,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Palanca derecha @@ -3768,242 +3872,242 @@ These settings are experimental, and may cause black screens. If your games fail Configurar - - - - + + + + Clear Borrar - - - - - + + + + + [not set] [no definido] - - - + + + Invert button Invertir botón - - + + Toggle button Alternar botón - + Turbo button Botón turbo - - + + Invert axis Invertir ejes - - - + + + Set threshold Configurar umbral - - + + Choose a value between 0% and 100% Seleccione un valor entre 0% y 100%. - + Toggle axis Alternar ejes - + Set gyro threshold Configurar umbral del Giroscopio - + Calibrate sensor Calibrar sensor - + Map Analog Stick Configuración de palanca analógico - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Después de pulsar OK, mueve primero el joystick de manera horizontal, y luego verticalmente. Para invertir los ejes, mueve primero el joystick de manera vertical, y luego horizontalmente. - + Center axis Centrar ejes - - + + Deadzone: %1% Punto muerto: %1% - - + + Modifier Range: %1% Rango del modificador: %1% - - + + Pro Controller Controlador Pro - + Dual Joycons Joycons duales - + Left Joycon Joycon izquierdo - + Right Joycon Joycon derecho - + Handheld Portátil - + GameCube Controller Controlador de GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Controlador NES - + SNES Controller Controlador SNES - + N64 Controller Controlador N64 - + Sega Genesis Sega Genesis - + Start / Pause Inicio / Pausa - + Z Z - + Control Stick Palanca de control - + C-Stick C-Stick - + Shake! ¡Agita! - + [waiting] [esperando] - + New Profile Nuevo perfil - + Enter a profile name: Introduce un nombre de perfil: - - + + Create Input Profile Crear perfil de entrada - + The given profile name is not valid! ¡El nombre de perfil introducido no es válido! - + Failed to create the input profile "%1" Error al crear el perfil de entrada "%1" - + Delete Input Profile Eliminar perfil de entrada - + Failed to delete the input profile "%1" Error al eliminar el perfil de entrada "%1" - + Load Input Profile Cargar perfil de entrada - + Failed to load the input profile "%1" Error al cargar el perfil de entrada "%1" - + Save Input Profile Guardar perfil de entrada - + Failed to save the input profile "%1" Error al guardar el perfil de entrada "%1" @@ -4060,7 +4164,7 @@ Para invertir los ejes, mueve primero el joystick de manera vertical, y luego ho - + Configure Configurar @@ -4096,7 +4200,7 @@ Para invertir los ejes, mueve primero el joystick de manera vertical, y luego ho - + Test Probar @@ -4115,7 +4219,7 @@ Para invertir los ejes, mueve primero el joystick de manera vertical, y luego ho <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Más información</span></a> - + %1:%2 %1:%2 @@ -4124,77 +4228,77 @@ Para invertir los ejes, mueve primero el joystick de manera vertical, y luego ho yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters El número del puerto tiene caracteres que no son válidos - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 El puerto debe estar en un rango entre 0 y 65353 - + IP address is not valid Dirección IP no válida - + This UDP server already exists Este servidor UDP ya existe - + Unable to add more than 8 servers No es posible añadir más de 8 servidores - + Testing Probando - + Configuring Configurando - + Test Successful Prueba existosa - + Successfully received data from the server. Se han recibido con éxito los datos del servidor. - + Test Failed Prueba fallida - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. No se han podido recibir datos válidos del servidor.<br>Por favor, verifica que el servidor esté configurado correctamente y que la dirección y el puerto sean correctos. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. La prueba de UDP o la configuración de la calibración está en curso.<br>Por favor, espera a que termine el proceso. @@ -4321,7 +4425,12 @@ Los valores actuales son %1% y %2% respectivamente. Interfaz de red - + + Enable Airplane Mode + + + + None Ninguna @@ -4379,52 +4488,52 @@ Los valores actuales son %1% y %2% respectivamente. Algunos ajustes sólo están disponibles cuando no se estén ejecutando los juegos. - + Add-Ons Extras / Add-Ons - + System Sistema - + CPU CPU - + Graphics Gráficos - + Adv. Graphics Gráficos avanz. - + GPU Extensions - + Audio Audio - + Input Profiles Perfiles de entrada - + Linux Linux - + Properties Propiedades @@ -4442,12 +4551,12 @@ Los valores actuales son %1% y %2% respectivamente. Extras / Add-Ons - + Patch Name Nombre del parche - + Version Versión @@ -4485,27 +4594,32 @@ Los valores actuales son %1% y %2% respectivamente. Seleccionar imagen - + + Select Avatar + + + + Add Añadir - + Rename Renombrar - + Remove Eliminar - + Profile management is available only when game is not running. El sistema de perfiles sólo se encuentra disponible cuando no se estén ejecutando los juegos. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4513,100 +4627,189 @@ Los valores actuales son %1% y %2% respectivamente. %2 - + Enter Username Introduzca el nombre - + Users Usuarios - + Enter a username for the new user: Introduce un nombre para el nuevo usuario: - + Enter a new username: Introduce un nuevo nombre de usuario: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Selecciona una imagen de usuario - - JPEG Images (*.jpg *.jpeg) - Imagenes JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + No hay firmware disponible + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Imagenes JPEG (*.jpg *.jpeg) + + + Error deleting image Error al eliminar la imagen - + Error occurred attempting to overwrite previous image at: %1. Ha ocurrido un error al intentar sobrescribir la imagen anterior en: %1. - + Error deleting file Error al eliminar el archivo - + Unable to delete existing file: %1. No se puede eliminar el archivo existente: %1. - + Error creating user image directory Error al crear el directorio de imagen del usuario - + Unable to create directory %1 for storing user images. No se puede crear el directorio %1 para almacenar imágenes de usuario. - Error copying user image - Error al copiar la imagen de usuario. + Error al copiar la imagen de usuario. - Unable to copy image from %1 to %2 - No se puede copiar la imagen de %1 a %2 + No se puede copiar la imagen de %1 a %2 - Error resizing user image - Error al redimensionar la imagen de usuario + Error al redimensionar la imagen de usuario - Unable to resize image - No se puede cambiar el tamaño de la imagen + No se puede cambiar el tamaño de la imagen + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Cancelar + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. ¿Eliminar este usuario? Todos los datos de guardado del usuario serán eliminados. - + Confirm Delete Confirmar eliminación - + Name: %1 UUID: %2 Nombre: %1 @@ -4659,7 +4862,7 @@ UUID: %2 - + Enable Activar @@ -4670,7 +4873,7 @@ UUID: %2 - + Not connected No conectado @@ -4680,63 +4883,63 @@ UUID: %2 Restaurar valores predeterminados - + Clear Limpiar - + [not set] [no definido] - + Invert axis Invertir ejes - - + + Deadzone: %1% Punto muerto: %1% - + Error enabling ring input Error al activar la entrada del Ring - + Direct Joycon driver is not enabled El driver directo JoyCon no está activo. - + Configuring Configurando - + The current mapped device doesn't support the ring controller El dispositivo de entrada actual no soporta el Ring Controller. - + The current mapped device doesn't have a ring attached El dispositivo de entrada actual no tiene el Ring incorporado - + The current mapped device is not connected El dispositivo de entrada actual no está conectado. - + Unexpected driver result %1 Resultado inesperado del driver %1 - + [waiting] [esperando] @@ -4778,7 +4981,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4830,12 +5033,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Configuración TAS - + Select TAS Load Directory... Selecciona el directorio de carga TAS... @@ -4945,7 +5148,7 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5265,6 +5468,16 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Servicio web de yuzu @@ -5274,42 +5487,29 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de Al proporcionar el nombre de usuario y el token, aceptas que yuzu recopile datos de uso adicionales, que pueden incluir información de identificación del usuario. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verificar + Verificar - Sign up - Registrarse + Registrarse - + Token: Token: - + Username: Nombre de usuario: - What is my token? - ¿Cuál es mi token? + ¿Cuál es mi token? - + Web Service configuration can only be changed when a public room isn't being hosted. La configuración del servicio web solo puede ser cambiada cuando una sala pública no esté siendo alojada. @@ -5334,12 +5534,12 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de Regenerar - + Discord Presence Presencia de Discord - + Show Current Game in your Discord Status Mostrar el juego actual en el estado de Discord @@ -5348,24 +5548,8 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Saber más</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Regístrate</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Regístrate</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5388,10 +5572,9 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de El token no se puede verificar. Los cambios realizados en tu token no se ha guardado. - Unverified, please click Verify before saving configuration Tooltip - No verificado. Por favor, haz clic en Verificar antes de guardar los ajustes. + No verificado. Por favor, haz clic en Verificar antes de guardar los ajustes. Verifying... @@ -5415,20 +5598,67 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Error de verificación. Comprueba que has introducido el token correctamente, y que esté funcionando correctamente tu conexión a internet. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controlador J1 - + &Controller P1 &Controlador J1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versión + + DirectConnect @@ -5534,7 +5764,12 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5542,11 +5777,6 @@ Arrastra los puntos para cambiar de posición, o haz doble clic en las celdas de The host of the room has banned you. Speak with the host to unban you or try a different room. El anfitrión de la sala te ha vetado. Habla con el anfitrión para quitar el veto o prueba con una sala diferente. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5608,7 +5838,7 @@ Por favor, vaya a Configuración -> Sistema -> Red y selecciona la interfa Telemetría - + Broken Vulkan Installation Detected Se ha detectado una instalación corrupta de Vulkan @@ -5617,106 +5847,105 @@ Por favor, vaya a Configuración -> Sistema -> Red y selecciona la interfa La inicialización de Vulkan ha fallado durante la ejecución. Haz clic <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>aquí para más información sobre como arreglar el problema</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Ejecutando un juego - + Loading Web Applet... Cargando Web applet... - - + + Disable Web Applet Desactivar Web applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Deshabilitar el Applet Web puede causar comportamientos imprevistos y debería solo ser usado con Super Mario 3D All-Stars. ¿Estas seguro que quieres deshabilitar el Applet Web? (Puede ser reactivado en las configuraciones de Depuración.) - + The amount of shaders currently being built La cantidad de shaders que se están construyendo actualmente - + The current selected resolution scaling multiplier. El multiplicador de escala de resolución seleccionado actualmente. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. La velocidad de emulación actual. Los valores superiores o inferiores al 100% indican que la emulación se está ejecutando más rápido o más lento que en una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. La cantidad de fotogramas por segundo que se está mostrando el juego actualmente. Esto variará de un juego a otro y de una escena a otra. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tiempo que lleva emular un fotograma de la Switch, sin tener en cuenta la limitación de fotogramas o sincronización vertical. Para una emulación óptima, este valor debería ser como máximo de 16.67 ms. - + Unmute Desileciar - + Mute Silenciar - + Reset Volume Restablecer Volumen - + &Clear Recent Files &Eliminar archivos recientes - + &Continue &Continuar - + &Pause &Pausar - Warning Outdated Game Format - Advertencia: formato del juego obsoleto + Advertencia: formato del juego obsoleto You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Está utilizando el formato de directorio de ROM deconstruido para este juego, que es un formato desactualizado que ha sido reemplazado por otros, como los NCA, NAX, XCI o NSP. Los directorios de ROM deconstruidos carecen de íconos, metadatos y soporte de actualizaciones.<br><br>Para ver una explicación de los diversos formatos de Switch que soporta yuzu,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>echa un vistazo a nuestra wiki</a>. Este mensaje no se volverá a mostrar. - - + + Error while loading ROM! ¡Error al cargar la ROM! - + The ROM format is not supported. El formato de la ROM no es compatible. - + An error occurred initializing the video core. Se ha producido un error al inicializar el núcleo de video. @@ -5725,7 +5954,7 @@ Por favor, vaya a Configuración -> Sistema -> Red y selecciona la interfa yuzu ha encontrado un error al ejecutar el núcleo de video. Esto suele ocurrir al no tener los controladores de la GPU actualizados, incluyendo los integrados. Por favor, revisa el registro para más detalles. Para más información sobre cómo acceder al registro, por favor, consulta la siguiente página: <a href='https://yuzu-emu.org/help/reference/log-files/'>Como cargar el archivo de registro</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ¡Error al cargar la ROM! %1 @@ -5736,473 +5965,405 @@ Por favor, vaya a Configuración -> Sistema -> Red y selecciona la interfa %1<br>Por favor, sigue <a href='https://yuzu-emu.org/help/quickstart/'>la guía de inicio rápido de yuzu</a> para revolcar los archivos.<br>Puedes consultar la wiki de yuzu</a> o el Discord de yuzu</a> para obtener ayuda. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Error desconocido. Por favor, consulte el archivo de registro para ver más detalles. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Cerrando software... - + Save Data Datos de guardado - + Mod Data Datos de mods - + Error Opening %1 Folder Error al abrir la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - Error Opening Transferable Shader Cache - Error al abrir el caché transferible de shaders + Error al abrir el caché transferible de shaders - Failed to create the shader cache directory for this title. - No se pudo crear el directorio de la caché de los shaders para este título. + No se pudo crear el directorio de la caché de los shaders para este título. - Error Removing Contents - Error al eliminar el contenido + Error al eliminar el contenido - Error Removing Update - Error al eliminar la actualización + Error al eliminar la actualización - Error Removing DLC - Error al eliminar el DLC + Error al eliminar el DLC - + Remove Installed Game Contents? ¿Eliminar contenido del juego instalado? - + Remove Installed Game Update? ¿Eliminar actualización del juego instalado? - + Remove Installed Game DLC? ¿Eliminar el DLC del juego instalado? - + Remove Entry Eliminar entrada - - - - - - Successfully Removed - Se ha eliminado con éxito + Se ha eliminado con éxito - Successfully removed the installed base game. - Se ha eliminado con éxito el juego base instalado. + Se ha eliminado con éxito el juego base instalado. - The base game is not installed in the NAND and cannot be removed. - El juego base no está instalado en el NAND y no se puede eliminar. + El juego base no está instalado en el NAND y no se puede eliminar. - Successfully removed the installed update. - Se ha eliminado con éxito la actualización instalada. + Se ha eliminado con éxito la actualización instalada. - There is no update installed for this title. - No hay ninguna actualización instalada para este título. + No hay ninguna actualización instalada para este título. - There are no DLC installed for this title. - No hay ningún DLC instalado para este título. + No hay ningún DLC instalado para este título. - Successfully removed %1 installed DLC. - Se ha eliminado con éxito %1 DLC instalado(s). + Se ha eliminado con éxito %1 DLC instalado(s). - + Delete OpenGL Transferable Shader Cache? ¿Deseas eliminar el caché transferible de shaders de OpenGL? - + Delete Vulkan Transferable Shader Cache? ¿Deseas eliminar el caché transferible de shaders de Vulkan? - + Delete All Transferable Shader Caches? ¿Deseas eliminar todo el caché transferible de shaders? - + Remove Custom Game Configuration? ¿Deseas eliminar la configuración personalizada del juego? - + Remove Cache Storage? ¿Quitar almacenamiento de caché? - + Remove File Eliminar archivo - + Remove Play Time Data Eliminar información del tiempo de juego - + Reset play time? ¿Reestablecer tiempo de juego? - - Error Removing Transferable Shader Cache - Error al eliminar la caché de shaders transferibles + Error al eliminar la caché de shaders transferibles - - A shader cache for this title does not exist. - No existe caché de shaders para este título. + No existe caché de shaders para este título. - Successfully removed the transferable shader cache. - El caché de shaders transferibles se ha eliminado con éxito. + El caché de shaders transferibles se ha eliminado con éxito. - Failed to remove the transferable shader cache. - No se ha podido eliminar la caché de shaders transferibles. + No se ha podido eliminar la caché de shaders transferibles. - Error Removing Vulkan Driver Pipeline Cache - Error al eliminar la caché de canalización del controlador Vulkan + Error al eliminar la caché de canalización del controlador Vulkan - Failed to remove the driver pipeline cache. - No se ha podido eliminar la caché de canalización del controlador. + No se ha podido eliminar la caché de canalización del controlador. - - Error Removing Transferable Shader Caches - Error al eliminar las cachés de shaders transferibles + Error al eliminar las cachés de shaders transferibles - Successfully removed the transferable shader caches. - Cachés de shaders transferibles eliminadas con éxito. + Cachés de shaders transferibles eliminadas con éxito. - Failed to remove the transferable shader cache directory. - No se ha podido eliminar el directorio de cachés de shaders transferibles. + No se ha podido eliminar el directorio de cachés de shaders transferibles. - - Error Removing Custom Configuration - Error al eliminar la configuración personalizada del juego + Error al eliminar la configuración personalizada del juego - A custom configuration for this title does not exist. - No existe una configuración personalizada para este título. + No existe una configuración personalizada para este título. - Successfully removed the custom game configuration. - Se eliminó con éxito la configuración personalizada del juego. + Se eliminó con éxito la configuración personalizada del juego. - Failed to remove the custom game configuration. - No se ha podido eliminar la configuración personalizada del juego. + No se ha podido eliminar la configuración personalizada del juego. - - + + RomFS Extraction Failed! ¡La extracción de RomFS ha fallado! - + There was an error copying the RomFS files or the user cancelled the operation. Se ha producido un error al copiar los archivos RomFS o el usuario ha cancelado la operación. - + Full Completo - + Skeleton En secciones - + Select RomFS Dump Mode Elegir método de volcado de RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Por favor, selecciona el método en que quieres volcar el RomFS.<br>Completo copiará todos los archivos al nuevo directorio <br> mientras que en secciones solo creará la estructura del directorio. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root No hay suficiente espacio en %1 para extraer el RomFS. Por favor, libera espacio o elige otro directorio de volcado en Emulación > Configuración > Sistema > Sistema de archivos > Raíz de volcado - + Extracting RomFS... Extrayendo RomFS... - - - - - + + Cancel Cancelar - + RomFS Extraction Succeeded! ¡La extracción RomFS ha tenido éxito! - - - + The operation completed successfully. La operación se completó con éxito. - Integrity verification couldn't be performed! - ¡No se pudo ejecutar la verificación de integridad! + ¡No se pudo ejecutar la verificación de integridad! - File contents were not checked for validity. - No se ha podido comprobar la validez de los contenidos del archivo. + No se ha podido comprobar la validez de los contenidos del archivo. - - Verifying integrity... - Verificando integridad... + Verificando integridad... - - Integrity verification succeeded! - ¡La verificación de integridad ha sido un éxito! + ¡La verificación de integridad ha sido un éxito! - - Integrity verification failed! - ¡Verificación de integridad fallida! + ¡Verificación de integridad fallida! - File contents may be corrupt. - Los contenidos del archivo pueden estar corruptos. + Los contenidos del archivo pueden estar corruptos. - - - - Create Shortcut - Crear acceso directo + Crear acceso directo - Do you want to launch the game in fullscreen? - ¿Desea iniciar el juego en pantalla completa? + ¿Desea iniciar el juego en pantalla completa? - Successfully created a shortcut to %1 - Se ha creado un acceso directo a %1 + Se ha creado un acceso directo a %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Esto creará un acceso directo a la AppImage actual. Esto puede no funcionar bien si se actualiza. ¿Continuar? + Esto creará un acceso directo a la AppImage actual. Esto puede no funcionar bien si se actualiza. ¿Continuar? - Failed to create a shortcut to %1 - No se ha podido crear el acceso directo de %1 + No se ha podido crear el acceso directo de %1 - Create Icon - Crear icono + Crear icono - Cannot create icon file. Path "%1" does not exist and cannot be created. - No se puede crear el archivo de icono. La ruta "%1" no existe y no se ha podido crear. + No se puede crear el archivo de icono. La ruta "%1" no existe y no se ha podido crear. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Error al intentar abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The game properties could not be loaded. No se pueden cargar las propiedades del juego. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Ejecutable de Switch (%1);;Todos los archivos (*.*) - + Load File Cargar archivo - + Open Extracted ROM Directory Abrir el directorio de la ROM extraída - + Invalid Directory Selected Directorio seleccionado no válido - + The directory you have selected does not contain a 'main' file. El directorio que ha seleccionado no contiene ningún archivo 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Archivo de Switch Instalable (*.nca *.nsp *.xci);;Archivo de contenidos de Nintendo (*.nca);;Paquete de envío de Nintendo (*.nsp);;Imagen de cartucho NX (*.xci) - + Install Files Instalar archivos - + %n file(s) remaining %n archivo(s) restantes @@ -6210,25 +6371,25 @@ Por favor, vaya a Configuración -> Sistema -> Red y selecciona la interfa - + Installing file "%1"... Instalando el archivo "%1"... - - + + Install Results Instalar resultados - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar posibles conflictos, no se recomienda a los usuarios que instalen juegos base en el NAND. Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs. - + %n file(s) were newly installed @@ -6239,7 +6400,7 @@ Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs. - + %n file(s) were overwritten @@ -6250,7 +6411,7 @@ Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs. - + %n file(s) failed to install @@ -6261,242 +6422,310 @@ Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs. - + System Application Aplicación del sistema - + System Archive Archivo del sistema - + System Application Update Actualización de la aplicación del sistema - + Firmware Package (Type A) Paquete de firmware (Tipo A) - + Firmware Package (Type B) Paquete de firmware (Tipo B) - + Game Juego - + Game Update Actualización de juego - + Game DLC DLC del juego - + Delta Title Titulo delta - + Select NCA Install Type... Seleccione el tipo de instalación NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleccione el tipo de título en el que deseas instalar este NCA como: (En la mayoría de los casos, el 'Juego' predeterminado está bien). - + Failed to Install Fallo en la instalación - + The title type you selected for the NCA is invalid. El tipo de título que seleccionó para el NCA no es válido. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + OK Aceptar - - + + Hardware requirements not met No se cumplen los requisitos de hardware - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. El sistema no cumple con los requisitos de hardware recomendados. Los informes de compatibilidad se han desactivado. - + Missing yuzu Account Falta la cuenta de Yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Para enviar un caso de prueba de compatibilidad de juegos, debes vincular tu cuenta de yuzu.<br><br/> Para vincular tu cuenta de yuzu, ve a Emulación &gt; Configuración &gt; Web. - + Error opening URL Error al abrir la URL - + Unable to open the URL "%1". No se puede abrir la URL "%1". - + TAS Recording Grabación TAS - + Overwrite file of player 1? ¿Sobrescribir archivo del jugador 1? - + Invalid config detected Configuración no válida detectada - + Handheld controller can't be used on docked mode. Pro controller will be selected. El controlador del modo portátil no puede ser usado en el modo sobremesa. Se seleccionará el controlador Pro en su lugar. - - + + Amiibo Amiibo - - + + The current amiibo has been removed El amiibo actual ha sido eliminado - + Error Error - - + + The current game is not looking for amiibos El juego actual no está buscando amiibos - + Amiibo File (%1);; All Files (*.*) Archivo amiibo (%1);; Todos los archivos (*.*) - + Load Amiibo Cargar amiibo - + Error loading Amiibo data Error al cargar los datos Amiibo - + The selected file is not a valid amiibo El archivo seleccionado no es un amiibo válido - + The selected file is already on use El archivo seleccionado ya se encuentra en uso - + An unknown error occurred Ha ocurrido un error inesperado - - Verification failed for the following files: %1 - La verificación falló en los siguientes archivos: + La verificación falló en los siguientes archivos: %1 - + + Keys not installed Claves no instaladas @@ -6505,255 +6734,187 @@ Would you like to bypass this and exit anyway? Prueba a instalar las claves de encriptado y reinicie yuzu antes de instalar el firmware. - + Select Dumped Firmware Source Location Seleccionar ubicación de origen del firmware volcado - Installing Firmware... - Instalando firmware... + Instalando firmware... - - - - Firmware install failed - Error en la instalación del firmware + Error en la instalación del firmware - Unable to locate potential firmware NCA files - No se ha podido localizar los posibles archivos NCA de firmware. + No se ha podido localizar los posibles archivos NCA de firmware. - Failed to delete one or more firmware file. - No se pudo eliminar uno o más archivos de firmware. + No se pudo eliminar uno o más archivos de firmware. Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. La instalación del firmware se ha cancelado, puede que el firmware esté en mal estado, reinicia yuzu o reinstala el firmware. - One or more firmware files failed to copy into NAND. - Uno o más archivos de firmware no se pudieron copiar en NAND. + Uno o más archivos de firmware no se pudieron copiar en NAND. - Firmware integrity verification failed! - ¡Error en la verificación de integridad del firmware! + ¡Error en la verificación de integridad del firmware! - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available No hay firmware disponible - Please install the firmware to use the Album applet. - Por favor, instala el firmware para usar la aplicación del Álbum. + Por favor, instala el firmware para usar la aplicación del Álbum. - + Album Applet Applet del Álbum - + Album applet is not available. Please reinstall firmware. La aplicación del Álbum no esta disponible. Por favor, reinstala el firmware. - Please install the firmware to use the Cabinet applet. - Por favor, instala el firmware para usar la applet de Cabinet. + Por favor, instala el firmware para usar la applet de Cabinet. - + Cabinet Applet Applet de Cabinet - + Cabinet applet is not available. Please reinstall firmware. La applet de Cabinet no está disponible. Por favor, reinstala el firmware. - Please install the firmware to use the Mii editor. - Por favor, instala el firmware para usar el editor de Mii. + Por favor, instala el firmware para usar el editor de Mii. - + Mii Edit Applet Applet de Editor de Mii - + Mii editor is not available. Please reinstall firmware. El editor de Mii no está disponible. Por favor, reinstala el firmware. - Please install the firmware to use the Controller Menu. - Por favor, instala el firmware para poder utilizar el Menú de mandos. + Por favor, instala el firmware para poder utilizar el Menú de mandos. - + Controller Applet Applet de Mandos - + Controller Menu is not available. Please reinstall firmware. El Menú de mandos no se encuentra disponible. Por favor, reinstala el firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Captura de pantalla - + PNG Image (*.png) Imagen PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Estado TAS: ejecutando %1/%2 - + TAS state: Recording %1 Estado TAS: grabando %1 - + TAS state: Idle %1/%2 Estado TAS: inactivo %1/%2 - + TAS State: Invalid Estado TAS: nulo - + &Stop Running &Parar de ejecutar - + &Start &Iniciar - + Stop R&ecording Pausar g&rabación - + R&ecord G&rabar - + Building: %n shader(s) Creando: %n shader(s) @@ -6761,18 +6922,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Escalado: %1x - + Speed: %1% / %2% Velocidad: %1% / %2% - + Speed: %1% Velocidad: %1% @@ -6781,44 +6942,44 @@ Would you like to download it? Juego: %1 FPS (desbloqueado) - + Game: %1 FPS Juego: %1 FPS - + Frame: %1 ms Fotogramas: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA NO AA - + VOLUME: MUTE VOLUMEN: SILENCIO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing Faltan componentes de derivación @@ -6827,12 +6988,12 @@ Would you like to download it? Faltan las claves de encriptación. <br>Por favor, siga <a href='https://yuzu-emu.org/help/quickstart/'>la guía de inicio rápido de yuzu</a> para obtener todas tus claves, firmware y juegos. - + Select RomFS Dump Target Selecciona el destinatario para volcar el RomFS - + Please select which RomFS you would like to dump. Por favor, seleccione los RomFS que deseas volcar. @@ -6845,7 +7006,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. ¿Estás seguro de que quieres detener la emulación? Cualquier progreso no guardado se perderá. @@ -6858,102 +7019,102 @@ Would you like to bypass this and exit anyway? ¿Quieres salir de todas formas? - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Nearest Más cercano - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + Area - + Docked Sobremesa - + Handheld Portátil - + Normal Normal - + High Alto - + Extreme Extremo - + Vulkan Vulkan - + OpenGL OpenGL - + Null Ninguno - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6961,13 +7122,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! ¡OpenGL no está disponible! - + OpenGL shared contexts are not supported. Los contextos compartidos de OpenGL no son compatibles. @@ -6976,33 +7137,33 @@ Would you like to bypass this and exit anyway? yuzu no ha sido compilado con soporte de OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! ¡Error al inicializar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Tu GPU no soporta OpenGL, o no tienes instalados los últimos controladores gráficos. - + Error while initializing OpenGL 4.6! ¡Error al iniciar OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Tu GPU no soporta OpenGL 4.6, o no tienes instalado el último controlador de la tarjeta gráfica.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Es posible que la GPU no soporte una o más extensiones necesarias de OpenGL . Por favor, asegúrate de tener los últimos controladores de la tarjeta gráfica.<br><br>GL Renderer:<br>%1<br><br>Extensiones no soportadas:<br>%2 @@ -7010,128 +7171,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite Favorito - + Start Game Iniciar juego - + Start Game without Custom Configuration Iniciar juego sin la configuración personalizada - + Open Save Data Location Abrir ubicación de los archivos de guardado - + Open Mod Data Location Abrir ubicación de los mods - + Open Transferable Pipeline Cache Abrir caché de canalización de shaders transferibles - + Remove Eliminar - + Remove Installed Update Eliminar la actualización instalada - + Remove All Installed DLC Eliminar todos los DLC instalados - + Remove Custom Configuration Eliminar la configuración personalizada - + Remove Play Time Data Eliminar información del tiempo de juego - + Remove Cache Storage Quitar almacenamiento de caché - + Remove OpenGL Pipeline Cache Eliminar caché de canalización de OpenGL - + Remove Vulkan Pipeline Cache Eliminar caché de canalización de Vulkan - + Remove All Pipeline Caches Eliminar todas las cachés de canalización - + Remove All Installed Contents Eliminar todo el contenido instalado - + Dump RomFS Volcar RomFS - + Dump RomFS to SDMC Volcar RomFS a SDMC - + Verify Integrity Verificar integridad - + Copy Title ID to Clipboard Copiar la ID del título al portapapeles - + Navigate to GameDB entry Ir a la sección de bases de datos del juego - + Create Shortcut Crear acceso directo - + Add to Desktop Añadir al escritorio - + Add to Applications Menu Añadir al menú de aplicaciones - + Configure Game @@ -7140,62 +7301,62 @@ Would you like to bypass this and exit anyway? Propiedades - + Scan Subfolders Escanear subdirectorios - + Remove Game Directory Eliminar directorio de juegos - + ▲ Move Up ▲ Mover hacia arriba - + ▼ Move Down ▼ Mover hacia abajo - + Open Directory Location Abrir ubicación del directorio - + Clear Limpiar - + Name Nombre - + Compatibility Compatibilidad - + Add-ons Extras/Add-ons - + File type Tipo de archivo - + Size Tamaño - + Play time Tiempo de juego @@ -7203,62 +7364,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame En juego - + Game starts, but crashes or major glitches prevent it from being completed. El juego se inicia, pero se bloquea o se producen fallos importantes que impiden completarlo. - + Perfect Perfecta - + Game can be played without issues. El juego se puede jugar sin problemas. - + Playable Jugable - + Game functions with minor graphical or audio glitches and is playable from start to finish. El juego tiene algunos errores gráficos o de sonido, pero se puede jugar de principio a fin. - + Intro/Menu Inicio/Menu - + Game loads, but is unable to progress past the Start Screen. El juego se ejecuta, pero no puede avanzar de la pantalla de inicio. - + Won't Boot No funciona - + The game crashes when attempting to startup. El juego se bloquea al intentar iniciar. - + Not Tested Sin testear - + The game has not yet been tested. El juego todavía no ha sido testeado todavía. @@ -7266,7 +7427,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list Haz doble clic para agregar un nuevo directorio a la lista de juegos. @@ -7274,7 +7435,7 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) %1 de %n resultado(s) @@ -7282,12 +7443,12 @@ Would you like to bypass this and exit anyway? - + Filter: Búsqueda: - + Enter pattern to filter Introduce un patrón para buscar @@ -7369,7 +7530,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7383,91 +7544,91 @@ Mensaje de depuración: Hotkeys - + Audio Mute/Unmute Activar/Desactivar audio - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Ventana principal - + Audio Volume Down Bajar volumen del audio - + Audio Volume Up Subir volumen del audio - + Capture Screenshot Captura de pantalla - + Change Adapting Filter Cambiar filtro adaptable - + Change Docked Mode Cambiar a modo sobremesa - + Change GPU Accuracy Cambiar precisión de GPU - + Configure Configurar - + Configure Current Game - + Continue/Pause Emulation Continuar/Pausar emulación - + Exit Fullscreen Salir de pantalla completa @@ -7476,97 +7637,97 @@ Mensaje de depuración: Cerrar yuzu - - Exit eden + + Exit Eden - + Fullscreen Pantalla completa - + Load File Cargar archivo - + Load/Remove Amiibo Cargar/Eliminar Amiibo - + Multiplayer Browse Public Game Lobby Buscar en el lobby de juegos públicos multijugador - + Multiplayer Create Room Crear sala multijugador - + Multiplayer Direct Connect to Room Conexión directa a la sala multijugador - + Multiplayer Leave Room Abandonar sala multijugador - + Multiplayer Show Current Room Mostrar actual sala multijugador - + Restart Emulation Reiniciar emulación - + Stop Emulation Detener emulación - + TAS Record Grabar TAS - + TAS Reset Reiniciar TAS - + TAS Start/Stop Iniciar/detener TAS - + Toggle Filter Bar Alternar barra de filtro - + Toggle Framerate Limit Alternar limite de fotogramas - + Toggle Mouse Panning Alternar desplazamiento del ratón - + Toggle Renderdoc Capture Alternar Captura de Renderdoc - + Toggle Status Bar Alternar barra de estado @@ -7574,22 +7735,22 @@ Mensaje de depuración: InstallDialog - + Please confirm these are the files you wish to install. Por favor, confirma que estos son los archivos que desea instalar. - + Installing an Update or DLC will overwrite the previously installed one. Instalar una actualización o DLC reemplazará la instalada previamente. - + Install Instalar - + Install Files to NAND Instalar archivos al NAND... @@ -7597,7 +7758,7 @@ Mensaje de depuración: LimitableInputDialog - + The text can't contain any of the following characters: %1 El texto no puede tener ninguno de estos caracteres: @@ -7744,152 +7905,207 @@ Mensaje de depuración: &Archivos recientes - + + Open &Eden Folders + + + + &Emulation &Emulación - + &View &Ver - + &Reset Window Size &Reiniciar tamaño de ventana - + &Debugging &Depuración - + Reset Window Size to &720p Reiniciar el tamaño de la ventana a &720p - + Reset Window Size to 720p Reiniciar el tamaño de la ventana a 720p - + Reset Window Size to &900p Reiniciar el tamaño de la ventana a &900p - + Reset Window Size to 900p Reiniciar el tamaño de la ventana a 900p - + Reset Window Size to &1080p Reiniciar el tamaño de la ventana a &1080p - + Reset Window Size to 1080p Reiniciar el tamaño de la ventana a 1080p - + &Multiplayer &Multijugador - + &Tools &Herramientas - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Ayuda - + &Install Files to NAND... &Instalar archivos en NAND... - + L&oad File... C&argar archivo... - + Load &Folder... Cargar &carpeta - + E&xit S&alir - + &Pause &Pausar - + &Stop &Detener - + &Verify Installed Contents &Verificar contenidos instalados - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7898,97 +8114,97 @@ Mensaje de depuración: &Acerca de yuzu - + Single &Window Mode Modo &ventana - + Con&figure... Con&figurar... - + Ctrl+, - + Display D&ock Widget Headers Mostrar complementos de cabecera del D&ock - + Show &Filter Bar Mostrar barra de &búsqueda - + Show &Status Bar Mostrar barra de &estado - + Show Status Bar Mostrar barra de estado - + &Browse Public Game Lobby &Buscar en el lobby de juegos públicos - + &Create Room &Crear sala - + &Leave Room &Abandonar sala - + &Direct Connect to Room &Conexión directa a una sala - + &Show Current Room &Mostrar sala actual - + F&ullscreen P&antalla completa - + &Restart &Reiniciar - + Load/Remove &Amiibo... Cargar/Eliminar &Amiibo... - + &Report Compatibility &Reporte de compatibilidad - + Open &Mods Page Abrir página de &mods - + Open &Quickstart Guide Abrir guía de &inicio rápido - + &FAQ &Preguntas frecuentes @@ -7997,77 +8213,82 @@ Mensaje de depuración: Abrir la carpeta de &yuzu - + &Capture Screenshot &Captura de pantalla - + Open &Album Abrir &Álbum - + &Set Nickname and Owner &Darle nombre y propietario - + &Delete Game Data &Borrar datos de juego - + &Restore Amiibo &Restaurar Amiibo - + &Format Amiibo &Formatear Amiibo - + Open &Mii Editor Abrir Editor de &Mii - + &Configure TAS... &Configurar TAS... - + Configure C&urrent Game... Configurar j&uego actual... - + &Start &Iniciar - + &Reset &Reiniciar - + R&ecord G&rabar - + Open &Controller Menu Abrir Menú de &Mandos - + Install Firmware Instalar firmware - + + &About Eden + + + + Install Decryption Keys @@ -8075,26 +8296,36 @@ Mensaje de depuración: MicroProfileDialog - &MicroProfile - &MicroPerfil + &MicroPerfil MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8154,37 +8385,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Estado de la conexión actual - + Not Connected. Click here to find a room! No conectado. Haz clic aquí para buscar una sala. - + Not Connected No conectado - + Connected Conectado - + New Messages Received Nuevos mensajes recibidos - + Error Error - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: No se ha podido actualizar la información de la sala. Por favor, comprueba tu conexión a internet e intenta alojar la sala de nuevo. @@ -8376,56 +8607,56 @@ p, li { white-space: pre-wrap; } No jugando ningún juego - + Installed SD Titles Títulos instalados en la SD - + Installed NAND Titles Títulos instalados en NAND - + System Titles Títulos del sistema - + Add New Game Directory Añadir un nuevo directorio de juegos - + Favorites Favoritos - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [no definido] @@ -8436,14 +8667,14 @@ p, li { white-space: pre-wrap; } Rotación %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Eje %1%2 @@ -8454,357 +8685,357 @@ p, li { white-space: pre-wrap; } Botón %1 - - - - - - + + + + + + [unknown] [desconocido] - - - + + + Left Izquierda - - - + + + Right Derecha - - - + + + Down Abajo - - - + + + Up Arriba - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Comenzar - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Círculo - - + + Cross Cruz - - + + Square Cuadrado - - + + Triangle Triángulo - - + + Share Compartir - - + + Options Opciones - - + + [undefined] [sin definir] - + %1%2 %1%2 - - + + [invalid] [inválido] - - + + %1%2Hat %3 %1%2Rotación %3 - - - + + + %1%2Axis %3 %1%2Eje %3 - - + + %1%2Axis %3,%4,%5 %1%2Eje %3,%4,%5 - - + + %1%2Motion %3 %1%2Movimiento %3 - - + + %1%2Button %3 %1%2Botón %3 - - + + [unused] [no usado] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Palanca L - + Stick R Palanca R - + Plus Más - + Minus Menos - - + + Home Inicio - + Capture Captura - + Touch Táctil - + Wheel Indicates the mouse wheel Rueda - + Backward Atrás - + Forward Adelante - + Task Tarea - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Rotación %4 - - + + %1%2%3Axis %4 %1%2%3Axis %4 - - + + %1%2%3Button %4 %1%2%3Botón %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8922,6 +9153,300 @@ p, li { white-space: pre-wrap; } ¿Deseas reestablecer este amiibo? + + QtCommon::Content + + + Installing Firmware... + Instalando firmware... + + + + + + Cancel + Cancelar + + + + Firmware integrity verification failed! + ¡Error en la verificación de integridad del firmware! + + + + + Verification failed for the following files: + +%1 + La verificación falló en los siguientes archivos: + +%1 + + + + + Verifying integrity... + Verificando integridad... + + + + + Integrity verification succeeded! + ¡La verificación de integridad ha sido un éxito! + + + + + The operation completed successfully. + La operación se completó con éxito. + + + + + Integrity verification failed! + ¡Verificación de integridad fallida! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Error al eliminar el contenido + + + + Error Removing Update + Error al eliminar la actualización + + + + Error Removing DLC + Error al eliminar el DLC + + + + The base game is not installed in the NAND and cannot be removed. + El juego base no está instalado en el NAND y no se puede eliminar. + + + + There is no update installed for this title. + No hay ninguna actualización instalada para este título. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Se ha eliminado con éxito + + + + Successfully removed %1 installed DLC. + Se ha eliminado con éxito %1 DLC instalado(s). + + + + + Error Removing Transferable Shader Cache + Error al eliminar la caché de shaders transferibles + + + + + A shader cache for this title does not exist. + No existe caché de shaders para este título. + + + + Successfully removed the transferable shader cache. + El caché de shaders transferibles se ha eliminado con éxito. + + + + Failed to remove the transferable shader cache. + No se ha podido eliminar la caché de shaders transferibles. + + + + Error Removing Vulkan Driver Pipeline Cache + Error al eliminar la caché de canalización del controlador Vulkan + + + + Failed to remove the driver pipeline cache. + No se ha podido eliminar la caché de canalización del controlador. + + + + + Error Removing Transferable Shader Caches + Error al eliminar las cachés de shaders transferibles + + + + Successfully removed the transferable shader caches. + Cachés de shaders transferibles eliminadas con éxito. + + + + Failed to remove the transferable shader cache directory. + No se ha podido eliminar el directorio de cachés de shaders transferibles. + + + + + Error Removing Custom Configuration + Error al eliminar la configuración personalizada del juego + + + + A custom configuration for this title does not exist. + No existe una configuración personalizada para este título. + + + + Successfully removed the custom game configuration. + Se eliminó con éxito la configuración personalizada del juego. + + + + Failed to remove the custom game configuration. + No se ha podido eliminar la configuración personalizada del juego. + + + + Reset Metadata Cache + Reiniciar caché de metadatos + + + + The metadata cache is already empty. + El caché de metadatos ya está vacío. + + + + The operation completed successfully. + La operación se completó con éxito. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + El caché de metadatos no se pudo eliminar. Puede que se encuentre en uso actualmente o ya haya sido eliminado. + + + + Create Shortcut + Crear acceso directo + + + + Do you want to launch the game in fullscreen? + ¿Desea iniciar el juego en pantalla completa? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Se ha creado un acceso directo a %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Esto creará un acceso directo a la AppImage actual. Esto puede no funcionar bien si se actualiza. ¿Continuar? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + No se ha podido crear el acceso directo de %1 + + + + Create Icon + Crear icono + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + No se puede crear el archivo de icono. La ruta "%1" no existe y no se ha podido crear. + + + + No firmware available + No hay firmware disponible + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9217,7 +9742,7 @@ Por favor, inténtalo de nuevo o contacta con el desarrollador del software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9225,7 +9750,7 @@ Por favor, inténtalo de nuevo o contacta con el desarrollador del software. - + Users Usuarios @@ -9349,7 +9874,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Llamadas acumuladas @@ -9357,12 +9882,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread esperado por ningún hilo @@ -9370,102 +9895,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable ejecutable - + paused en pausa - + sleeping reposando - + waiting for IPC reply esperando respuesta IPC - + waiting for objects esperando objetos - + waiting for condition variable esperando variable condicional - + waiting for address arbiter esperando al árbitro de dirección - + waiting for suspend resume esperando a reanudar - + waiting esperando - + initialized inicializado - + terminated terminado - + unknown desconocido - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 núcleo %1 - + processor = %1 procesador = %1 - + affinity mask = %1 máscara de afinidad = %1 - + thread id = %1 id de hilo = %1 - + priority = %1(current) / %2(normal) prioridad = %1(presente) / %2(normal) - + last running ticks = %1 últimos ticks consecutivos = %1 @@ -9473,7 +9998,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread esperado por el hilo @@ -9481,7 +10006,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Árbol de espera diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index cd75043fcb..7b60ccfdda 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -17,12 +17,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -38,8 +38,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -76,32 +76,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Otetaan yhteyttä palvelimeen... - + Cancel Peruuta - + Touch the top left corner <br>of your touchpad. Kosketa kosketuslevyn vasenta yläreunaa <br> - + Now touch the bottom right corner <br>of your touchpad. Kosketa nyt kosketuslevyn oikeaa alakulmaa <br> - + Configuration completed! Konfiguraatio suoritettu! - + OK OK @@ -451,276 +451,298 @@ This would ban both their forum username and their IP address. ConfigurationShared - + Amiibo editor - + Controller configuration - + Data erase - + Error - + Net connect - + Player select - + Software keyboard - + Mii Edit - + Online web - + Shop - + Photo viewer - + Offline web - + Login share - + Wifi web auth - + My page - + Output Engine: Äänimoottori - + Output Device: - + Input Device: - + Mute audio - + Volume: Äänenvoimakkuus: - + Mute audio when in background - + Multicore CPU Emulation Moni ydin prosessori emulaatio - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. - + Memory Layout - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - + Limit Speed Percent Rajoita nopeutta - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. - + Synchronize Core Speed - + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). Compatibility varies by game; many (especially older ones) may not respond well. Can help reduce stuttering at lower framerates. - + Accuracy: Tarkkuus: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. - - + + Backend: - + Fast CPU Time - + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + Unfuse FMA (improve performance on CPUs without FMA) Epävakaa FMA (parantaa CPU:n suorituskykyä ilman FMA:ta) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - + Faster FRSQRTE and FRECPE Nopeampi FRSQRTE ja FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - + Faster ASIMD instructions (32 bits only) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - + Inaccurate NaN handling - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. - + Disable address space checks - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. - + Ignore global monitor - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. - + API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. - + Device: - + This setting selects the GPU to use with the Vulkan backend. - + Shader Backend: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -728,86 +750,86 @@ SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - + Resolution: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. - + Window Adapting Filter: - + FSR Sharpness: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. - + Anti-Aliasing Method: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - + Fullscreen Mode: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use disk pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Optimize SPIRV output shader - + Runs an additional optimization pass over generated SPIRV shaders. Will increase time required for shader compilation. May slightly improve performance. @@ -815,35 +837,35 @@ This feature is experimental. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -852,33 +874,44 @@ stuttering at the cost of rendering issues while the texture is being decoded. - + ASTC Recompression Method: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - + VRAM Usage Mode: - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. - + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -886,1080 +919,1140 @@ Immediate (no synchronization) just presents whatever is available and can exhib - + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. - - Accuracy Level: + + GPU Accuracy: - - GPU emulation accuracy. + + Controls the GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. +Extreme should only be used as a last resort. - + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + Use asynchronous shader building (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. - + Fast GPU Time (Hack) - + Overclocks the emulated GPU to increase dynamic resolution and render distance. Use 128 for maximal performance and 512 for maximal graphics fidelity. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + Extended Dynamic State - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. - + Provoking Vertex - + Improves lighting and vertex handling in certain games. Only Vulkan 1.0+ devices support this extension. - + Descriptor Indexing - + Improves texture & buffer handling and the Maxwell translation layer. Some Vulkan 1.1+ and all 1.2+ devices support this extension. - + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + RNG Seed RNG siemen - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - + Device Name - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - + Note: this can be overridden when region setting is auto-select Huomio: tämä voidaan yliajaa kun alueasetus on automaattisella valinnalla - + Region: - + The region of the emulated Switch. - + Time Zone: - + The time zone of the emulated Switch. - + Sound Output Mode: - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user on game boot - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - + Pause emulation when in background - - This setting pauses eden when focusing other windows. + + This setting pauses Eden when focusing other windows. - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU (prosessori) - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - + OpenGL - + Vulkan - + Null - + GLSL - + GLASM (Assembly Shaders, NVIDIA Only) - + SPIR-V (Experimental, AMD/Mesa Only) - + Normal - + High - + Extreme - - Auto - - - - - Accurate - Tarkka - - - - Unsafe - Epävakaa - - - - Paranoid (disables most optimizations) - - - - - Dynarmic - - - - - NCE - - - - - Borderless Windowed - - - - - Exclusive Fullscreen - - - - - No Video Output - - - - - CPU Video Decoding - - - - - GPU Video Decoding (Default) - - - - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - - 0.5X (360p/540p) [EXPERIMENTAL] - - - - - 0.75X (540p/810p) [EXPERIMENTAL] - - - - - 1X (720p/1080p) - - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - - - - - 2X (1440p/2160p) - - - - - 3X (2160p/3240p) - - - - - 4X (2880p/4320p) - - - - - 5X (3600p/5400p) - - - - - 6X (4320p/6480p) - - - - - 7X (5040p/7560p) - - - - - 8X (5760p/8640p) - - - - - Nearest Neighbor - - - - - Bilinear - - - - - Bicubic - - - - - Gaussian - - - - - ScaleForce - - - - - AMD FidelityFX™️ Super Resolution - - - - - Area - - - - - None - None - - - - FXAA - - - - - SMAA - - - - - Default (16:9) - - - - - Force 4:3 - - - - - Force 21:9 - - - - - Force 16:10 - - - - - Stretch to Window - - - - - Automatic - - - - + + Default - + + Unsafe (fast) + + + + + Safe (stable) + + + + + Auto + + + + + Accurate + Tarkka + + + + Unsafe + Epävakaa + + + + Paranoid (disables most optimizations) + + + + + Dynarmic + + + + + NCE + + + + + Borderless Windowed + + + + + Exclusive Fullscreen + + + + + No Video Output + + + + + CPU Video Decoding + + + + + GPU Video Decoding (Default) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + 0.5X (360p/540p) [EXPERIMENTAL] + + + + + 0.75X (540p/810p) [EXPERIMENTAL] + + + + + 1X (720p/1080p) + + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + + + + + 2X (1440p/2160p) + + + + + 3X (2160p/3240p) + + + + + 4X (2880p/4320p) + + + + + 5X (3600p/5400p) + + + + + 6X (4320p/6480p) + + + + + 7X (5040p/7560p) + + + + + 8X (5760p/8640p) + + + + + Nearest Neighbor + + + + + Bilinear + + + + + Bicubic + + + + + Gaussian + + + + + ScaleForce + + + + + AMD FidelityFX™️ Super Resolution + + + + + Area + + + + + None + None + + + + FXAA + + + + + SMAA + + + + + Default (16:9) + + + + + Force 4:3 + + + + + Force 21:9 + + + + + Force 16:10 + + + + + Stretch to Window + + + + + Automatic + + + + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - - + + Serbian (српски) + + + + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld Käsikonsolimoodi - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Low (128) - + Medium (256) - + High (512) - + % % @@ -2334,17 +2427,17 @@ Ota sisäiset sivutaulukot käyttöön Lokitiedosto - + Global Log Filter Lokitiedoston filtteri - + Show Log in Console - + Open Log Location Avaa lokitiedoston sijainti @@ -2364,12 +2457,12 @@ Ota sisäiset sivutaulukot käyttöön Portti: - + When checked, the max size of the log increases from 100 MB to 1 GB - + Enable Extended Logging** @@ -2430,7 +2523,7 @@ Ota sisäiset sivutaulukot käyttöön - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2569,7 +2662,7 @@ Ota sisäiset sivutaulukot käyttöön - + Web applet not compiled @@ -2618,94 +2711,94 @@ Ota sisäiset sivutaulukot käyttöön yuzu asetukset - + Applets - - + + Audio Ääni - - + + CPU CPU (prosessori) - + Debug Debuggaus - + Filesystem Tietojärjestelmä - - + + General Yleiset - - + + Graphics Grafiikka - + GraphicsAdvanced Edistyneet grafiikka-asetukset - + GraphicsExtensions - + Hotkeys Pikanäppäimet - - + + Controls Ohjainmääritykset - + Profiles Profiilit - + Network - - + + System Järjestelmä - + Game List Pelilista - + Web Web - eden Configuration + Eden Configuration @@ -2807,51 +2900,37 @@ Ota sisäiset sivutaulukot käyttöön - - - Reset Metadata Cache - + Select Emulated NAND Directory... - + Select Emulated SD Directory... - + Select Gamecard Path... - + Select Dump Directory... - + Select Mod Load Directory... - - The metadata cache is already empty. - - - - The operation completed successfully. - Operaatio suoritettiin onnistuneesti. - - - - The metadata cache couldn't be deleted. It might be in use or non-existent. - + Operaatio suoritettiin onnistuneesti. @@ -2898,12 +2977,12 @@ Ota sisäiset sivutaulukot käyttöön yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? @@ -2940,33 +3019,33 @@ Ota sisäiset sivutaulukot käyttöön Taustan väri: - + % FSR sharpening percentage (e.g. 50%) % - + Off - + VSync Off - + Recommended - + On - + VSync On @@ -3003,14 +3082,18 @@ Ota sisäiset sivutaulukot käyttöön - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3042,75 +3125,75 @@ These settings are experimental, and may cause black screens. If your games fail Palauta oletukset - + Action Toiminto - + Hotkey Pikanäppäin - + Controller Hotkey - - - + + + Conflicting Key Sequence - - + + The entered key sequence is already assigned to: %1 - + [waiting] - + Invalid - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Palauta oletus - + Clear Tyhjennä - + Conflicting Button Sequence - + The default button sequence is already assigned to: %1 - + The default key sequence is already assigned to: %1 @@ -3426,13 +3509,6 @@ These settings are experimental, and may cause black screens. If your games fail Emulate Analog with Keyboard Input - - - - - Requires restarting eden - - Enable direct JoyCon driver @@ -3458,6 +3534,13 @@ These settings are experimental, and may cause black screens. If your games fail Enable XInput 8 player support (disables web applet) + + + + + Requires restarting Eden + + Enable UDP controllers (not needed for motion) @@ -3585,7 +3668,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Vasen joystick @@ -3689,14 +3772,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L - + ZL @@ -3715,7 +3798,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus @@ -3728,15 +3811,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R - + ZR @@ -3797,246 +3880,246 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Oikea joystick - - - - + + + + Clear Tyhjennä - - - - - + + + + + [not set] [ei asetettu] - - + + Toggle button - - - + + + Invert button - + Turbo button - - + + Invert axis - - - + + + Set threshold - - + + Choose a value between 0% and 100% - + Toggle axis - + Set gyro threshold - + Calibrate sensor - + Map Analog Stick - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. - + Center axis - - + + Deadzone: %1% - - + + Modifier Range: %1% - - + + Pro Controller - + Dual Joycons - + Left Joycon - + Right Joycon - + Handheld Käsikonsolimoodi - + GameCube Controller - + Poke Ball Plus - + NES Controller - + SNES Controller - + N64 Controller - + Sega Genesis - + Start / Pause - + Z - + Control Stick - + C-Stick - + Shake! - + [waiting] - + New Profile - + Enter a profile name: - - + + Create Input Profile - + The given profile name is not valid! - + Failed to create the input profile "%1" - + Delete Input Profile - + Failed to delete the input profile "%1" - + Load Input Profile - + Failed to load the input profile "%1" - + Save Input Profile - + Failed to save the input profile "%1" @@ -4093,7 +4176,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure Säädä @@ -4129,7 +4212,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test @@ -4144,7 +4227,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + %1:%2 @@ -4153,77 +4236,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 - + IP address is not valid - + This UDP server already exists - + Unable to add more than 8 servers - + Testing - + Configuring - + Test Successful - + Successfully received data from the server. - + Test Failed - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. @@ -4349,7 +4432,12 @@ Current values are %1% and %2% respectively. - + + Enable Airplane Mode + + + + None None @@ -4407,7 +4495,7 @@ Current values are %1% and %2% respectively. - + Add-Ons Lisäosat @@ -4416,47 +4504,47 @@ Current values are %1% and %2% respectively. Yleiset - + System Järjestelmä - + CPU CPU (prosessori) - + Graphics Grafiikat - + Adv. Graphics - + GPU Extensions - + Audio Ääni - + Input Profiles - + Linux - + Properties Ominaisuudet @@ -4474,12 +4562,12 @@ Current values are %1% and %2% respectively. Lisäosat - + Patch Name Päivityksen nimi - + Version Versio @@ -4517,27 +4605,32 @@ Current values are %1% and %2% respectively. Aseta kuva - + + Select Avatar + + + + Add Lisää - + Rename Nimeä uudelleen - + Remove Poista - + Profile management is available only when game is not running. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4545,22 +4638,22 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Syötä nimimerkki - + Users Käyttäjät - + Enter a username for the new user: Syötä nimimerkki uudelle käyttäjälle: - + Enter a new username: Syötä uusi nimikerkki @@ -4573,80 +4666,161 @@ Current values are %1% and %2% respectively. Olet poistamassa käyttäjän nimimerkillä "%1". Oletko varma? - + Select User Image Valitse käyttäjän kuva - JPEG Images (*.jpg *.jpeg) - JPEG kuvat (*.jpg *.jpeg) + JPEG kuvat (*.jpg *.jpeg) - + Error deleting image Virhe poistaessa kuvaa - + Error occurred attempting to overwrite previous image at: %1. Edellistä kuvaa korvatessa tapahtui virhe %1. - + Error deleting file Virhe poistaessa tiedostoa - + Unable to delete existing file: %1. Olemassa olevan tiedoston %1 ei onnistu - + Error creating user image directory Virhe luodessa käyttäjäkuvakansiota - + Unable to create directory %1 for storing user images. Kansiota %1 käyttäjäkuvien tallentamiseksi ei voitu luoda - - Error copying user image - Virhe kopioidessa käyttäjäkuvaa - - - - Unable to copy image from %1 to %2 - Kuvaa ei voitu kopioida sijainnista %1 sijaintiin %2 - - - - Error resizing user image + + Error saving user image - - Unable to resize image + + Unable to save image to file + + + + + Image Formats (*.jpg *.jpeg *.png *.bmp) + + + + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + Error copying user image + Virhe kopioidessa käyttäjäkuvaa + + + Unable to copy image from %1 to %2 + Kuvaa ei voitu kopioida sijainnista %1 sijaintiin %2 + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Peruuta + + + + Background Color + + + + + Select Firmware Avatar ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. - + Confirm Delete Vahvista poistaminen - + Name: %1 UUID: %2 @@ -4698,7 +4872,7 @@ UUID: %2 - + Enable @@ -4709,7 +4883,7 @@ UUID: %2 - + Not connected @@ -4719,63 +4893,63 @@ UUID: %2 Palauta oletukset - + Clear Tyhjennä - + [not set] [ei asetettu] - + Invert axis - - + + Deadzone: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] @@ -4873,7 +5047,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4925,12 +5099,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration - + Select TAS Load Directory... @@ -5039,7 +5213,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5359,6 +5533,16 @@ Drag points to change position, or double-click table cells to edit values.Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Web palvelu @@ -5368,42 +5552,29 @@ Drag points to change position, or double-click table cells to edit values.Antamalla nimimerkkisi ja tokenin, annat yuzu:lle luvan kerätä muita tietoja, jotka saattavat sisältää käyttäjän tunnistetietoja. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Varmista + Varmista - Sign up - Rekisteröidy + Rekisteröidy - + Token: Tokeni: - + Username: Nimimerkki: - What is my token? - Mikä on tokeni? + Mikä on tokeni? - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5428,12 +5599,12 @@ Drag points to change position, or double-click table cells to edit values.Luo uudelleen - + Discord Presence Discord näkyvyys - + Show Current Game in your Discord Status Näytä tämänhetkinen peli Discordin tilanäkymässä @@ -5442,30 +5613,12 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Lue lisää</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Rekisteröidy</span></a> + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Rekisteröidy</span></a> - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Unverified, please click Verify before saving configuration - Tooltip - - - - Warning - Varoitus - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + Varoitus <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5499,20 +5652,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Vahvistus epäonnistui. Tarkista, että olet syöttänyt tunnuksesi oikein ja nettiyhteytesi toimii. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 - + &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versio + + DirectConnect @@ -5618,7 +5818,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5626,11 +5831,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5690,44 +5890,44 @@ Please go to Configure -> System -> Network and make a selection. Telemetria - + Loading Web Applet... Ladataan Web-applettia... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built Tällä hetkellä ladattujen shadereiden määrä - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Tämänhetkinen emulointinopeus. Arvot yli tai alle 100% kertovat emuloinnin tapahtuvan nopeammin tai hitaammin kuin Switchillä: - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Kuinka monta kuvaruutua sekunnissa peli tällä hetkellä näyttää. Tämä vaihtelee pelistä ja pelikohtauksesta toiseen. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Aika, joka kuluu yhden kuvaruudun emulointiin huomioimatta päivitysnopeuden rajoituksia tai v-synciä. Täysnopeuksista emulointia varten tämä saa olla enintään 16,67 ms. @@ -5744,24 +5944,23 @@ Please go to Configure -> System -> Network and make a selection. OPENGL - + &Clear Recent Files - + &Continue - + &Pause &Pysäytä - Warning Outdated Game Format - Varoitus vanhentunut peliformaatti + Varoitus vanhentunut peliformaatti You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. @@ -5769,78 +5968,72 @@ Please go to Configure -> System -> Network and make a selection. Tätä viestiä ei näytetä uudelleen. - - + + Error while loading ROM! Virhe ladatessa ROMia! - + The ROM format is not supported. ROM-formaattia ei tueta. - + An error occurred initializing the video core. Videoydintä käynnistäessä tapahtui virhe - + Error while loading ROM! %1 %1 signifies a numeric error code. - + An unknown error occurred. Please see the log for more details. Tuntematon virhe. Tarkista lokitiedosto lisätietoja varten. - + (64-bit) - + (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Save Data Tallennus - + Mod Data Modin data - + Error Opening %1 Folder Virhe avatessa kansiota %1 - - + + Folder does not exist! Kansiota ei ole olemassa! - Error Opening Transferable Shader Cache - Virhe avattaessa siirrettävää Shader Cachea - - - - Failed to create the shader cache directory for this title. - + Virhe avattaessa siirrettävää Shader Cachea Contents @@ -5855,7 +6048,7 @@ Tätä viestiä ei näytetä uudelleen. DLC - + Remove Entry Poista merkintä @@ -5864,349 +6057,245 @@ Tätä viestiä ei näytetä uudelleen. Poistataanko asennettu peli %1? - - - - - - Successfully Removed - Onnistuneesti poistettu + Onnistuneesti poistettu - Successfully removed the installed base game. - Asennettu pohjapeli poistettiin onnistuneesti. + Asennettu pohjapeli poistettiin onnistuneesti. Error Removing %1 Virhe poistaessa %1 - The base game is not installed in the NAND and cannot be removed. - Pohjapeliä ei ole asennettu NAND-muistiin eikä sitä voida poistaa. + Pohjapeliä ei ole asennettu NAND-muistiin eikä sitä voida poistaa. - Successfully removed the installed update. - Asennettu päivitys poistettiin onnistuneesti. + Asennettu päivitys poistettiin onnistuneesti. - There is no update installed for this title. - Tähän sovellukseen ei ole asennettu päivitystä. + Tähän sovellukseen ei ole asennettu päivitystä. - There are no DLC installed for this title. - Tähän sovellukseen ei ole asennettu DLC:tä. + Tähän sovellukseen ei ole asennettu DLC:tä. - Successfully removed %1 installed DLC. - Asennettu DLC poistettu onnistuneesti %1  + Asennettu DLC poistettu onnistuneesti %1  - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? Poistataanko pelin mukautettu määritys? - + Remove Cache Storage? - + Remove File Poista tiedosto - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Virhe poistettaessa siirrettävää Shader Cachea + Virhe poistettaessa siirrettävää Shader Cachea - - A shader cache for this title does not exist. - Shader cachea tälle sovellukselle ei ole olemassa. + Shader cachea tälle sovellukselle ei ole olemassa. - Successfully removed the transferable shader cache. - Siirrettävä Shadet Cache poistettiin onnistuneesti. + Siirrettävä Shadet Cache poistettiin onnistuneesti. - Failed to remove the transferable shader cache. - Siirrettävän Shader Cachen poisto epäonnistui. + Siirrettävän Shader Cachen poisto epäonnistui. - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - Error Removing Custom Configuration - Virhe poistaessa mukautettua määritystä. + Virhe poistaessa mukautettua määritystä. - A custom configuration for this title does not exist. - Mukautettua määritystä tälle sovellukselle ei ole olemassa. + Mukautettua määritystä tälle sovellukselle ei ole olemassa. - Successfully removed the custom game configuration. - Pelin mukautettu määritys poistettiin onnistuneesti. + Pelin mukautettu määritys poistettiin onnistuneesti. - Failed to remove the custom game configuration. - Pelin mukautetun määrityksen poistaminen epäonnistui. + Pelin mukautetun määrityksen poistaminen epäonnistui. - - + + RomFS Extraction Failed! RomFS purkaminen epäonnistui - + There was an error copying the RomFS files or the user cancelled the operation. RomFS tiedostoja kopioidessa tapahtui virhe, tai käyttäjä perui operaation. - + Full Täysi - + Skeleton Luuranko - + Select RomFS Dump Mode Valitse RomFS dumppausmoodi - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Valitse kuinka haluat dumpata RomFS:n. <br>Täysi kopioi kaikki tiedostot uuteen kansioon kun taas <br>luuranko luo ainoastaan kansiorakenteen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Puretaan RomFS:ää - - - - - + + Cancel Peruuta - + RomFS Extraction Succeeded! RomFs purettiin onnistuneesti! - - - + The operation completed successfully. Operaatio suoritettiin onnistuneesti. - - Integrity verification couldn't be performed! + + Warning: Outdated Game Format - - File contents were not checked for validity. + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - Verifying integrity... + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - Integrity verification succeeded! + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - - Create Shortcut - - - - - Do you want to launch the game in fullscreen? - - - - - Successfully created a shortcut to %1 - - - - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - - Create Icon - - - - - Cannot create icon file. Path "%1" does not exist and cannot be created. - - - - + Error Opening %1 Virhe avatessa %1 - + Select Directory Valitse kansio - + Properties Ominaisuudet - + The game properties could not be loaded. Pelin asetuksia ei saatu ladattua. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch tiedosto (%1);;Kaikki tiedostot (*.*) - + Load File Lataa tiedosto - + Open Extracted ROM Directory Avaa puretun ROMin kansio - + Invalid Directory Selected Virheellinen kansio valittu - + The directory you have selected does not contain a 'main' file. Valitsemasi kansio ei sisällä "main"-tiedostoa. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Asennettava Switch tiedosto (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submissions Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Asenna tiedostoja - + %n file(s) remaining @@ -6214,24 +6303,24 @@ Tätä viestiä ei näytetä uudelleen. - + Installing file "%1"... Asennetaan tiedostoa "%1"... - - + + Install Results Asennustulokset - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed @@ -6240,7 +6329,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten @@ -6249,7 +6338,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install @@ -6258,531 +6347,439 @@ Please, only use this feature to install updates and DLC. - + System Application Järjestelmäohjelma - + System Archive Järjestelmätiedosto - + System Application Update Järjestelmäohjelman päivitys - + Firmware Package (Type A) Firmware-paketti (A tyyppi) - + Firmware Package (Type B) Firmware-paketti (B tyyppi) - + Game Peli - + Game Update Pelin päivitys - + Game DLC Pelin DLC - + Delta Title Delta nimike - + Select NCA Install Type... Valitse NCA asennustyyppi... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Valitse asennettavan NCA-nimikkeen tyyppi: (Useimmissa tapauksissa oletustyyppi "Peli" toimii oikein) - + Failed to Install Asennus epäonnistui - + The title type you selected for the NCA is invalid. Valitsemasi nimiketyyppi on virheellinen - + File not found Tiedostoa ei löytynyt - + File "%1" not found Tiedostoa "%1" ei löytynyt - + OK OK - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account yuzu-tili puuttuu - + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + + + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - - - Verification failed for the following files: - -%1 + + + Install decryption keys and restart Eden before attempting to install firmware. - + + Select Dumped Firmware ZIP + + + + + Zipped Archives (*.zip) + + + + + Firmware cleanup failed + + + + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 + + + + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. + +Would you like to bypass this and exit anyway? + + + + + Keys not installed - - Install decryption keys and restart eden before attempting to install firmware. - - - - + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + %1 %2 - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Encryption keys are missing. - - - Are you sure you want to close eden? - - - - - - - eden - - - - - The currently running application has requested eden to not exit. - -Would you like to bypass this and exit anyway? - - In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Lähettääksesi pelin toimivuusraportin sinun tulee yhdistää yuzu-tilisi. <br><br/> Liittääksesi yuzu-tilin valitse Emulaatio &gt; Asetukset &gt; Web. - + Error opening URL Virhe avatessa URL-osoitetta - + Unable to open the URL "%1". URL-osoitetta "%1". ei voitu avata - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - + Error - - + + The current game is not looking for amiibos - - + + Amiibo - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Unmute - + Mute - + Reset Volume - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + Closing software... - - Error Removing Contents - - - - - Error Removing Update - - - - - Error Removing DLC - - - - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - - - - + + The current amiibo has been removed - + Amiibo File (%1);; All Files (*.*) Amiibo tiedosto (%1);; Kaikki tiedostot (*.*) - + Load Amiibo Lataa Amiibo @@ -6803,7 +6800,7 @@ Would you like to bypass this and exit anyway? Amiibon lukeminen epäonnistui. Ohjelma odotti lukevansa %1 tavua mutta onnistui lukemaan vain %2 tavua. - + Error loading Amiibo data Virhe luettaessa Amiibo-dataa @@ -6812,68 +6809,68 @@ Would you like to bypass this and exit anyway? Amiibon dataa ei voitu lukea. - + Capture Screenshot Tallenna kuvakaappaus - + PNG Image (*.png) PNG-kuva (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + &Start &Käynnistä - + Stop R&ecording - + R&ecord - + Building: %n shader(s) @@ -6881,142 +6878,142 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% Nopeus: %1% / %2% - + Speed: %1% Nopeus: %1% - + Game: %1 FPS Peli: %1 FPS - + Frame: %1 ms Ruutuaika: %1 ms - + None None - + + FXAA + + + + SMAA - + Nearest - + Bilinear - + Bicubic - + Gaussian - + ScaleForce - - + + FSR - + Area - + Docked - + Handheld Käsikonsolimoodi - + Normal - + High - + Extreme - + Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV - + NO AA - - - FXAA - - The game you are trying to load requires additional files from your Switch to be dumped before playing.<br/><br/>For more information on dumping these files, please see the following wiki page: <a href='https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/'>Dumping System Archives and the Shared Fonts from a Switch Console</a>.<br/><br/>Would you like to quit back to the game list? Continuing emulation may result in crashes, corrupted save data, or other bugs. Peli, jota yrität ladata vaatii, että dumppaat lisätiedostoja Switchistäsi ennen pelaamista. <br/><br/>Lue ohjeet näiden tiedostojen dumppaamiseen tältä wiki-sivulta: <a href='https://yuzu-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-switch-console/'>Dumping System Archives and the Shared Fonts from a Switch Console</a>.<br/><br/>Haluatko palata pelivalikkoon? Jatkaminen voi johtaa pelin kaatumiseen, tallennustiedostojen korruptoitumiseen tai muihin bugeihin. @@ -7097,7 +7094,7 @@ Tämä poistaa automaattisesti generoidut avaimet ja ajaa avainten laskentamoduu - PRODINFO puuttuu - + Derivation Components Missing Johdantokomponentit puuttuvat @@ -7114,12 +7111,12 @@ riippuen laitteesi suorituskyvystä. Lasketaan avaimia - + Select RomFS Dump Target Valitse RomFS dumppauskohde - + Please select which RomFS you would like to dump. Valitse minkä RomFS:n haluat dumpata. @@ -7132,7 +7129,7 @@ riippuen laitteesi suorituskyvystä. yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Haluatko varmasti lopettaa emuloinnin? Kaikki tallentamaton tiedo menetetään. @@ -7148,8 +7145,8 @@ Haluatko silti ohittaa tämän ja sulkea? GRenderWindow - - + + OpenGL not available! openGL ei ole saatavilla! @@ -7158,38 +7155,38 @@ Haluatko silti ohittaa tämän ja sulkea? Yuzua ei ole koottu OpenGL-yhteensopivuuden kanssa. - + OpenGL shared contexts are not supported. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Virhe käynnistäessä OpenGL ydintä! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 @@ -7197,158 +7194,158 @@ Haluatko silti ohittaa tämän ja sulkea? GameList - + Name Nimi - + Compatibility Yhteensopivuus - + Add-ons Lisäosat - + File type Tiedostotyyppi - + Size Koko - + Favorite - + Start Game - + Start Game without Custom Configuration - + Open Save Data Location Avaa tallennuskansio - + Open Mod Data Location Avaa modien tallennuskansio - + Open Transferable Pipeline Cache - + Remove Poista - + Remove Installed Update Poista asennettu päivitys - + Remove All Installed DLC Poista kaikki asennetut DLC:t - + Remove Custom Configuration Poista mukautettu määritys - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches - + Remove All Installed Contents Poista kaikki asennettu sisältö - + Dump RomFS Dumppaa RomFS - + Dump RomFS to SDMC - + Verify Integrity - + Copy Title ID to Clipboard Kopioi nimike ID leikepöydälle - + Navigate to GameDB entry Siirry GameDB merkintään - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + Configure Game - + Play time @@ -7357,32 +7354,32 @@ Haluatko silti ohittaa tämän ja sulkea? Ominaisuudet - + Scan Subfolders Skannaa alakansiot - + Remove Game Directory Poista pelikansio - + ▲ Move Up ▲ Liiku ylös - + ▼ Move Down ▼ Liiku alas - + Open Directory Location Avaa hakemisto - + Clear Tyhjennä @@ -7390,7 +7387,7 @@ Haluatko silti ohittaa tämän ja sulkea? GameListItemCompat - + Perfect Täydellinen @@ -7427,7 +7424,7 @@ even with workarounds. Peli toimii mutta siinä esiintyy merkittäviä ääni- ja grafiikkaongelmia. Peli ei ole pelattavissa alusta loppuun ongelmien vuoksi. - + Intro/Menu Intro/Valikko @@ -7437,52 +7434,52 @@ Screen. Peliä ei voi pelata merkittävien ääni- ja grafiikkaongelmien vuoksi. Pelissä ei pääse aloitusvalikko pidemmälle. - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Game can be played without issues. - + Playable - + Game functions with minor graphical or audio glitches and is playable from start to finish. - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot Ei käynnisty - + The game crashes when attempting to startup. Peli kaatuu käynnistettäessä. - + Not Tested Ei testattu - + The game has not yet been tested. Peliä ei ole vielä testattu @@ -7490,7 +7487,7 @@ Screen. GameListPlaceholder - + Double-click to add a new folder to the game list Tuplaklikkaa lisätäksesi uusi kansio pelilistaan. @@ -7498,7 +7495,7 @@ Screen. GameListSearchField - + %1 of %n result(s) @@ -7506,12 +7503,12 @@ Screen. - + Filter: Suodatin: - + Enter pattern to filter Syötä suodatettava tekstipätkä @@ -7593,7 +7590,7 @@ Screen. - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7601,186 +7598,186 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Tallenna kuvakaappaus - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy - + Configure Säädä - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen - - Exit eden + + Exit Eden - + Fullscreen - + Load File Lataa tiedosto - + Load/Remove Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation - + Stop Emulation - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar @@ -7788,22 +7785,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Vahvista, että nämä ovat tiedostot jotka haluat asentaa. - + Installing an Update or DLC will overwrite the previously installed one. Päivityksen tai DLC:n asentaminen korvaa aiemmin asennetut. - + Install Asenna - + Install Files to NAND Asenna tiedosto NAND-muistiin @@ -7811,7 +7808,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 @@ -7957,349 +7954,412 @@ Debug Message: - + &Emulation &Emulaatio - + &View &Katso - + &Reset Window Size - + &Debugging - + Reset Window Size to &720p - + Reset Window Size to 720p - + Reset Window Size to &900p - + Reset Window Size to 900p - + Reset Window Size to &1080p - + Reset Window Size to 1080p - + &Multiplayer - + &Tools - + &Amiibo - + &TAS - + &Create Home Menu Shortcut - + &Help &Apu - + &Install Files to NAND... - + L&oad File... - + Load &Folder... - + E&xit P&oistu - + &Pause &Pysäytä - + &Stop &Lopeta - + &Verify Installed Contents - - &About eden - - - - - Open &eden Folder - - - - + Open &Controller Menu - + Install Firmware - + Install Decryption Keys - + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu - + Single &Window Mode - + + Open &Eden Folders + + + + + &About Eden + + + + Con&figure... - + Ctrl+, - + Display D&ock Widget Headers - + Show &Filter Bar - + Show &Status Bar - + Show Status Bar Näytä statuspalkki - + &Browse Public Game Lobby - + &Create Room - + &Leave Room - + &Direct Connect to Room - + &Show Current Room - + F&ullscreen - + &Restart - + Load/Remove &Amiibo... - + &Report Compatibility - + Open &Mods Page - + Open &Quickstart Guide - + &FAQ - + &Capture Screenshot - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - + &Start &Käynnistä - + &Reset - + R&ecord - - - MicroProfileDialog - - &MicroProfile + + &Root Data Folder + + + + + &NAND Folder + + + + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8359,37 +8419,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! - + Not Connected - + Connected - + New Messages Received - + Error - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8469,56 +8529,56 @@ p, li { white-space: pre-wrap; } QObject - + Installed SD Titles Asennetut SD-sovellukset - + Installed NAND Titles Asennetut NAND-sovellukset - + System Titles Järjestelmäsovellukset - + Add New Game Directory Lisää uusi pelikansio - + Favorites - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [ei asetettu] @@ -8529,14 +8589,14 @@ p, li { white-space: pre-wrap; } Hattu %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Akseli %1%2 @@ -8547,321 +8607,321 @@ p, li { white-space: pre-wrap; } Näppäin %1 - - - - - - + + + + + + [unknown] [tuntematon] - - - + + + Left - - - + + + Right - - - + + + Down - - - + + + Up - - + + Z - - + + R - - + + L - + ZR - + ZL - + SR - + SL - + Stick L - + Stick R - - + + A - - + + B - - + + X - - + + Y - - + + Start Käynnistä - + Plus - + Minus - + Capture - - + + L1 - - + + L2 - - + + L3 - - + + R1 - - + + R2 - - + + R3 - - + + Circle - - + + Cross - - + + Square - - + + Triangle - - + + Share - - + + Options - - + + %1%2%3Button %4 - - + + Home - + Touch - + Wheel Indicates the mouse wheel - + Backward - + Forward - + Task - + Extra - - + + [undefined] - - + + [invalid] - + %1%2 - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2Motion %3 - - + + %1%2Button %3 - - + + [unused] [ei käytössä] @@ -8882,37 +8942,37 @@ p, li { white-space: pre-wrap; } - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -9030,6 +9090,298 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Peruuta + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + Operaatio suoritettiin onnistuneesti. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + + + + + Error Removing Update + + + + + Error Removing DLC + + + + + The base game is not installed in the NAND and cannot be removed. + Pohjapeliä ei ole asennettu NAND-muistiin eikä sitä voida poistaa. + + + + There is no update installed for this title. + Tähän sovellukseen ei ole asennettu päivitystä. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Onnistuneesti poistettu + + + + Successfully removed %1 installed DLC. + Asennettu DLC poistettu onnistuneesti %1  + + + + + Error Removing Transferable Shader Cache + Virhe poistettaessa siirrettävää Shader Cachea + + + + + A shader cache for this title does not exist. + Shader cachea tälle sovellukselle ei ole olemassa. + + + + Successfully removed the transferable shader cache. + Siirrettävä Shadet Cache poistettiin onnistuneesti. + + + + Failed to remove the transferable shader cache. + Siirrettävän Shader Cachen poisto epäonnistui. + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + Virhe poistaessa mukautettua määritystä. + + + + A custom configuration for this title does not exist. + Mukautettua määritystä tälle sovellukselle ei ole olemassa. + + + + Successfully removed the custom game configuration. + Pelin mukautettu määritys poistettiin onnistuneesti. + + + + Failed to remove the custom game configuration. + Pelin mukautetun määrityksen poistaminen epäonnistui. + + + + Reset Metadata Cache + + + + + The metadata cache is already empty. + + + + + The operation completed successfully. + Operaatio suoritettiin onnistuneesti. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9319,7 +9671,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9392,7 +9744,7 @@ Please try again or contact the developer of the software. Valitse käyttäjä: - + Users Käyttäjät @@ -9447,7 +9799,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Call stack @@ -9481,12 +9833,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread waited by no thread @@ -9494,82 +9846,82 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable - + paused pysäytetty - + sleeping lepää - + waiting for IPC reply odotetaan IPC-vastausta - + waiting for objects Odotetaan objekteja - + waiting for condition variable odotetaan condition variable - + waiting for address arbiter odotetaan addres arbiter - + waiting for suspend resume - + waiting - + initialized - + terminated - + unknown - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ihanteellinen - + core %1 ydin %1 - + processor = %1 prosessori = %1 @@ -9578,22 +9930,22 @@ p, li { white-space: pre-wrap; } ihanteellinen ydin = %1 - + affinity mask = %1 affinity mask = %1 - + thread id = %1 thread id = %1 - + priority = %1(current) / %2(normal) prioriteetti = %1(tämänhetkinen) / %2(normaali) - + last running ticks = %1 viimeisimmät suoritetut tikit = %1 @@ -9605,7 +9957,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread odotus by thread @@ -9613,7 +9965,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index a7443f8bd2..0b1d784a5a 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Communication avec le serveur... - + Cancel Annuler - + Touch the top left corner <br>of your touchpad. Touchez le coin supérieur gauche<br>de votre pavé tactile. - + Now touch the bottom right corner <br>of your touchpad. Touchez le coin supérieur gauche<br> de votre pavé tactile. - + Configuration completed! Configuration terminée ! - + OK OK @@ -398,134 +398,134 @@ Cela bannirait à la fois son nom d'utilisateur du forum et son adresse IP. ConfigurationShared - + % % - + Amiibo editor Éditeur d'Amiibo - + Controller configuration Configuration des manettes - + Data erase Effacement des données - + Error Erreur - + Net connect Connexion Internet - + Player select Sélection du joueur - + Software keyboard Clavier virtuel - + Mii Edit Édition de Mii - + Online web Web en ligne - + Shop Boutique - + Photo viewer Visionneuse de photos - + Offline web Web hors ligne - + Login share Partage d'identification - + Wifi web auth Authentification Wifi Web - + My page Ma page - + Output Engine: Moteur de Sortie : - + Output Device: Périphérique de sortie : - + Input Device: Périphérique d'entrée : - + Mute audio Couper le son - + Volume: Volume : - + Mute audio when in background Couper le son en arrière-plan - + Multicore CPU Emulation Émulation CPU Multicœur - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Cette option augmente l'utilisation du thread d'émulation CPU de 1 au maximum de 4 sur la Nintendo Switch. Il s'agit principalement d'une option de débogage et ne devrait pas être désactivée. - + Memory Layout Disposition de la mémoire - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -534,12 +534,12 @@ Cela n'améliore ni la stabilité ni les performances et est destiné à pe L'activer augmentera l'utilisation de la mémoire. Il n'est pas recommandé de l'activer à moins qu'un jeu spécifique avec un mod de texture en ait besoin. - + Limit Speed Percent Limiter la vitesse en pourcentage - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -548,141 +548,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Précision: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Ce paramètre contrôle la précision du CPU émulé. Ne le changez pas à moins de savoir ce que vous faites. - - + + Backend: Backend : - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Désactivation du FMA (améliore les performances des CPU sans FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Cette option améliore la vitesse en réduisant la précision des instructions de multiplication et addition fusionnées sur les processeurs qui ne prennent pas en charge nativement FMA. - + Faster FRSQRTE and FRECPE FRSQRTE et FRECPE plus rapides - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Cette option améliore la vitesse de certaines fonctions à virgule flottante approximatives en utilisant des approximations natives moins précises. - + Faster ASIMD instructions (32 bits only) Instructions ASIMD plus rapides (32 bits seulement) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Cette option améliore la vitesse des fonctions à virgule flottante ASIMD sur 32 bits en utilisant des modes d'arrondi incorrects. - + Inaccurate NaN handling Traitement NaN imprécis - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Cette option améliore la vitesse en supprimant la vérification des NaN. Veuillez noter que cela réduit également la précision de certaines instructions en virgule flottante. - + Disable address space checks Désactiver les vérifications de l'espace d'adresse - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Cette option améliore la vitesse en éliminant une vérification de sécurité avant chaque lecture/écriture en mémoire dans l'invité. La désactivation de cette option peut permettre à un jeu de lire/écrire dans la mémoire de l'émulateur. - + Ignore global monitor Ignorer le moniteur global - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. Cette option améliore la vitesse en se basant uniquement sur la sémantique de cmpxchg pour garantir la sécurité des instructions d'accès exclusif. Veuillez noter que cela peut entraîner des blocages et d'autres conditions de concurrence. - + API: API : - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Permet de basculer entre les API graphiques disponibles. Vulkan est recommandé dans la plupart des cas. - + Device: Appareil : - + This setting selects the GPU to use with the Vulkan backend. Ce paramètre sélectionne le GPU à utiliser avec le backend Vulkan. - + Shader Backend: Back-end des Shaders : - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -693,12 +670,12 @@ GLASM est un backend obsolète réservé à NVIDIA qui offre de bien meilleures SPIR-V compile le plus rapidement, mais donne de mauvais résultats sur la plupart des pilotes de GPU. - + Resolution: Résolution : - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -707,27 +684,27 @@ Les résolutions plus élevées nécessitent beaucoup plus de VRAM et de bande p Les options inférieures à 1X peuvent causer des problèmes de rendu. - + Window Adapting Filter: Filtre de fenêtre adaptatif - + FSR Sharpness: Netteté FSR : - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Détermine à quel point l'image sera affinée lors de l'utilisation du contraste dynamique FSR. - + Anti-Aliasing Method: Méthode d'anticrénelage : - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -736,12 +713,12 @@ SMAA offre la meilleure qualité. FXAA a un impact sur les performances plus faible et peut produire une image meilleure et plus stable sous des résolutions très basses. - + Fullscreen Mode: Mode Plein écran : - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -750,12 +727,12 @@ Sans bordure offre la meilleure compatibilité avec le clavier à l'écran Le mode plein écran exclusif peut offrir de meilleures performances et un meilleur support Freesync/Gsync. - + Aspect Ratio: Format : - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -764,49 +741,36 @@ Les jeux de la Switch ne prennent en charge que le format 16:9, donc des mods pe Contrôle également le rapport d'aspect des captures d'écran. - + Use disk pipeline cache Utiliser la cache de pipeline sur disque - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permet de sauvegarder les shaders sur le stockage pour un chargement plus rapide lors des démarrages ultérieurs du jeu. Le désactiver est uniquement destiné au débogage. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Utiliser l'émulation GPU asynchrone - + Uses an extra CPU thread for rendering. This option should always remain enabled. Utilise un thread CPU supplémentaire pour le rendu. Cette option doit toujours rester activée. - + NVDEC emulation: Émulation NVDEC - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -815,12 +779,12 @@ Elles peuvent être décodées soit par le CPU, soit par le GPU, ou pas du tout Dans la plupart des cas, le décodage GPU offre les meilleures performances. - + ASTC Decoding Method: Méthode de décodage ASTC : - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -832,34 +796,33 @@ GPU : Utilise les shaders de calcul du GPU pour décoder les textures ASTC, reco CPU de manière asynchrone : Utilise le CPU pour décoder les textures ASTC au fur et à mesure de leur arrivée. Élimine complètement le bégaiement du décodage ASTC au détriment de problèmes de rendu pendant que la texture est en cours de décodage. - + ASTC Recompression Method: Méthode de recompression ASTC : - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Presque toutes les cartes graphiques dédiées pour ordinateurs de bureau et portables ne prennent pas en charge les textures ASTC, obligeant l'émulateur à décompresser vers un format intermédiaire que toutes les cartes prennent en charge, RGBA8. Cette option recomprime le RGBA8 en format BC1 ou BC3, économisant ainsi la VRAM mais affectant négativement la qualité de l'image. - + VRAM Usage Mode: Mode d'utilisation de la VRAM : - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - Sélectionne si l'émulateur doit privilégier la conservation de la mémoire ou utiliser au maximum la mémoire vidéo disponible pour les performances. N'a aucun effet sur les graphiques intégrés. Le mode agressif peut avoir un impact sévère sur les performances d'autres applications telles que les logiciels d'enregistrement. + Sélectionne si l'émulateur doit privilégier la conservation de la mémoire ou utiliser au maximum la mémoire vidéo disponible pour les performances. N'a aucun effet sur les graphiques intégrés. Le mode agressif peut avoir un impact sévère sur les performances d'autres applications telles que les logiciels d'enregistrement. - + VSync Mode: Mode VSync : - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -870,51 +833,49 @@ Mailbox peut avoir une latence plus faible que FIFO et ne présente pas de déch Immédiat (sans synchronisation) présente simplement ce qui est disponible et peut présenter des déchirures. - + Enable asynchronous presentation (Vulkan only) Activer la présentation asynchrone (uniquement pour Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Améliore légèrement les performances en déplaçant la présentation vers un thread CPU séparé. - + Force maximum clocks (Vulkan only) Forcer la fréquence d'horloge maximale (Vulkan uniquement) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Les exécutions fonctionnent en arrière-plan en attendant les commandes graphiques pour empêcher le GPU de réduire sa vitesse de fréquence d'horloge. - + Anisotropic Filtering: Filtrage anisotropique : - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. Contrôle la qualité du rendu des textures à des angles obliques. C'est un paramètre léger et il est sûr de le régler à 16x sur la plupart des GPU. - Accuracy Level: - Niveau de Précision : + Niveau de Précision : - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - Précision de l'émulation du GPU. + Précision de l'émulation du GPU. La plupart des jeux rendent bien avec "Normal", mais "High" est encore nécessaire pour certains. Les particules ont tendance à ne rendre correctement qu'avec une précision élevée. "Extreme" ne doit être utilisé que pour le débogage. @@ -922,12 +883,12 @@ Cette option peut être modifiée pendant le jeu. Certains jeux peuvent nécessiter un démarrage en "High" pour rendre correctement. - + Use asynchronous shader building (Hack) Utiliser la compilation asynchrone des shaders (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Active la compilation asynchrone des shaders, ce qui peut réduire les saccades dues aux shaders. @@ -942,24 +903,24 @@ Cette fonctionnalité est expérimentale. Active le Temps GPU Rapide. Cette option forcera la plupart des jeux à utiliser leur plus grande résolution native. - + Use Vulkan pipeline cache Utiliser le cache de pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Active le cache de pipeline spécifique au fournisseur de GPU. Cette option peut améliorer considérablement le temps de chargement des shaders dans les cas où le pilote Vulkan ne stocke pas les fichiers de cache de pipeline en interne. - + Enable Compute Pipelines (Intel Vulkan Only) Activer les pipelines de calcul (uniquement pour Vulkan sur Intel) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -968,111 +929,111 @@ Ce paramètre existe uniquement pour les pilotes propriétaires d'Intel et Les pipelines de calcul sont toujours activés sur tous les autres pilotes. - + Enable Reactive Flushing Activer le Vidage Réactif - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilise une purge réactive au lieu d'une purge prédictive, permettant une synchronisation de la mémoire plus précise. - + Sync to framerate of video playback Synchro la fréquence d'image de la relecture du vidéo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Éxécuter le jeu à une vitesse normale pendant la relecture du vidéo, même-ci la fréquence d'image est dévérouillée. - + Barrier feedback loops Boucles de rétroaction de barrière - + Improves rendering of transparency effects in specific games. Améliore le rendu des effets de transparence dans des jeux spécifiques. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. Contrôle le seed du générateur de nombres aléatoires. Principalement utilisé à des fins de speedrunning. - + Device Name Nom de l'appareil - + The name of the emulated Switch. Le nom de la Nintendo Switch émulée. - + Custom RTC Date: Date RTC personnalisée : - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Cette option permet de changer l'horloge émulée de la Switch. Elle peut être utilisée pour manipuler le temps dans les jeux. - + Language: Langue : - + Note: this can be overridden when region setting is auto-select Note : ceci peut être remplacé quand le paramètre de région est réglé sur automatique - + Region: Région : - + The region of the emulated Switch. La région de la Nintendo Switch émulée. - + Time Zone: Fuseau horaire : - + The time zone of the emulated Switch. Le fuseau horaire de la Nintendo Switch émulée. - + Sound Output Mode: Mode de sortie sonore : - + Console Mode: Mode console : - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1081,7 +1042,7 @@ Les jeux changeront leur résolution, leurs détails et les contrôleurs pris en Le réglage sur Portable peut aider à améliorer les performances pour les systèmes peu performants. - + Prompt for user on game boot Demander un utilisateur au lancement d'un jeu @@ -1090,7 +1051,7 @@ Le réglage sur Portable peut aider à améliorer les performances pour les syst Demander de sélectionner un profil utilisateur à chaque démarrage, utile si plusieurs personnes utilisent yuzu sur le même PC. - + Pause emulation when in background Mettre en pause l’émulation lorsque mis en arrière-plan @@ -1099,843 +1060,992 @@ Le réglage sur Portable peut aider à améliorer les performances pour les syst Ce paramètre met en pause yuzu lorsque d'autres fenêtres sont au premier plan. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Confirmer avant d'arrêter l'émulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Ce paramètre remplace les invitations du jeu demandant de confirmer l'arrêt du jeu. En l'activant, cela contourne de telles invitations et quitte directement l'émulation. - + Hide mouse on inactivity Cacher la souris en cas d'inactivité - + This setting hides the mouse after 2.5s of inactivity. Ce paramètre masque la souris après 2,5 secondes d'inactivité. - + Disable controller applet Désactiver l'applet du contrôleur - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Désactive de force l'utilisation de l'applet de contrôleur par les invités. Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est immédiatement fermé. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Activer le mode jeu - + Custom frontend Interface personnalisée - + Real applet Applet réel - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - + Conservative Conservateur - + Aggressive Agressif - + OpenGL OpenGL - + Vulkan Vulkan - + Null Nul - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (Shaders en Assembleur, NVIDIA Seulement) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (Expérimental, AMD/Mesa uniquement) - + Normal Normal - + High Haut - + Extreme Extême - + Auto Auto - + Accurate Précis - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolution - - Area - - - - + None Aucune - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + + Default Par défaut - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1944,37 +2054,37 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est 8 GB DRAM (Risqué) - + Docked Mode TV - + Handheld Mode Portable - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander @@ -2329,27 +2439,27 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est S'enregistrer - + Open Log Location Ouvrir l'emplacement du journal de logs - + Global Log Filter Filtre de log global - + When checked, the max size of the log increases from 100 MB to 1 GB Lorsque la case est cochée, la taille maximum du relevé d'événements augmente de 100 Mo à 1 Go - + Enable Extended Logging** Activer la journalisation étendue** - + Show Log in Console Afficher le relevé d'événements dans la console @@ -2495,7 +2605,7 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2557,7 +2667,7 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est **Ces options seront réinitialisées automatiquement lorsque yuzu fermera. - + Web applet not compiled Applet Web non compilé @@ -2607,7 +2717,7 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est - eden Configuration + Eden Configuration @@ -2616,88 +2726,88 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est Certains paramètres ne sont disponibles que lorsqu'un jeu n'est pas en cours d'exécution. - + Applets Applets - - + + Audio Son - - + + CPU CPU - + Debug Débogage - + Filesystem Système de fichiers - - + + General Général - - + + Graphics Vidéo - + GraphicsAdvanced Graphismes avancés - + GraphicsExtensions - + Hotkeys Raccourcis clavier - - + + Controls Contrôles - + Profiles Profils - + Network Réseau - - + + System Système - + Game List Liste des jeux - + Web Web @@ -2795,51 +2905,45 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est - - - Reset Metadata Cache Mettre à zéro le cache des métadonnées - + Select Emulated NAND Directory... Sélectionner le répertoire NAND émulé... - + Select Emulated SD Directory... Sélectionner le répertoire SD émulé... - + Select Gamecard Path... Sélectionner le chemin de la cartouche de jeu... - + Select Dump Directory... Sélectionner le répertoire d'extraction... - + Select Mod Load Directory... Sélectionner le répertoire de mod... - The metadata cache is already empty. - Le cache des métadonnées est déjà vide. + Le cache des métadonnées est déjà vide. - The operation completed successfully. - L'opération s'est terminée avec succès. + L'opération s'est terminée avec succès. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Le cache des métadonnées n'a pas pu être supprimé. Il pourrait être utilisé ou non-existant. + Le cache des métadonnées n'a pas pu être supprimé. Il pourrait être utilisé ou non-existant. @@ -2870,12 +2974,12 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Ceci réinitialise tout les paramètres et supprime toutes les configurations par jeu. Cela ne va pas supprimer les répertoires de jeu, les profils, ou les profils d'entrée. Continuer ? @@ -2908,33 +3012,33 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est Couleur de l’arrière plan : - + % FSR sharpening percentage (e.g. 50%) % - + Off Désactivé - + VSync Off VSync Désactivée - + Recommended Recommandé - + On Activé - + VSync On VSync Activée @@ -2971,14 +3075,18 @@ Lorsqu'un invité tente d'ouvrir l'applet de contrôleur, il est - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3010,75 +3118,75 @@ These settings are experimental, and may cause black screens. If your games fail Restaurer les paramètres par défaut - + Action Action - + Hotkey Raccourci clavier - + Controller Hotkey Raccourci Manette - - - + + + Conflicting Key Sequence Séquence de touches conflictuelle - - + + The entered key sequence is already assigned to: %1 La séquence de touches entrée est déjà attribuée à : %1 - + [waiting] [en attente] - + Invalid Invalide - + Invalid hotkey settings Paramètres de raccourci invalides - + An error occurred. Please report this issue on github. Une erreur s'est produite. Veuillez signaler ce problème sur GitHub. - + Restore Default Restaurer les paramètres par défaut - + Clear Effacer - + Conflicting Button Sequence Séquence de bouton conflictuelle - + The default button sequence is already assigned to: %1 La séquence de bouton par défaut est déjà assignée à : %1 - + The default key sequence is already assigned to: %1 La séquence de touches par défaut est déjà attribuée à : %1 @@ -3398,7 +3506,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3553,7 +3661,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Stick Gauche @@ -3663,14 +3771,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3689,7 +3797,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plus @@ -3702,15 +3810,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3755,7 +3863,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Stick Droit @@ -3770,242 +3878,242 @@ These settings are experimental, and may cause black screens. If your games fail Configurer - - - - + + + + Clear Effacer - - - - - + + + + + [not set] [non défini] - - - + + + Invert button Inverser les boutons - - + + Toggle button Bouton d'activation - + Turbo button Bouton Turbo - - + + Invert axis Inverser l'axe - - - + + + Set threshold Définir le seuil - - + + Choose a value between 0% and 100% Choisissez une valeur entre 0% et 100% - + Toggle axis Basculer les axes - + Set gyro threshold Définir le seuil du gyroscope - + Calibrate sensor Calibrer le capteur - + Map Analog Stick Mapper le stick analogique - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Après avoir appuyé sur OK, bougez d'abord votre joystick horizontalement, puis verticalement. Pour inverser les axes, bougez d'abord votre joystick verticalement, puis horizontalement. - + Center axis Axe central - - + + Deadzone: %1% Zone morte : %1% - - + + Modifier Range: %1% Modification de la course : %1% - - + + Pro Controller Manette Switch Pro - + Dual Joycons Deux Joycons - + Left Joycon Joycon gauche - + Right Joycon Joycon droit - + Handheld Mode Portable - + GameCube Controller Manette GameCube - + Poke Ball Plus Poké Ball Plus - + NES Controller Manette NES - + SNES Controller Manette SNES - + N64 Controller Manette N64 - + Sega Genesis Sega Genesis - + Start / Pause Start / Pause - + Z Z - + Control Stick Stick de contrôle - + C-Stick C-Stick - + Shake! Secouez ! - + [waiting] [en attente] - + New Profile Nouveau Profil - + Enter a profile name: Entrez un nom de profil : - - + + Create Input Profile Créer un profil d'entrée - + The given profile name is not valid! Le nom de profil donné est invalide ! - + Failed to create the input profile "%1" Échec de la création du profil d'entrée "%1" - + Delete Input Profile Supprimer le profil d'entrée - + Failed to delete the input profile "%1" Échec de la suppression du profil d'entrée "%1" - + Load Input Profile Charger le profil d'entrée - + Failed to load the input profile "%1" Échec du chargement du profil d'entrée "%1" - + Save Input Profile Sauvegarder le profil d'entrée - + Failed to save the input profile "%1" Échec de la sauvegarde du profil d'entrée "%1" @@ -4062,7 +4170,7 @@ Pour inverser les axes, bougez d'abord votre joystick verticalement, puis h - + Configure Configurer @@ -4098,7 +4206,7 @@ Pour inverser les axes, bougez d'abord votre joystick verticalement, puis h - + Test Tester @@ -4117,7 +4225,7 @@ Pour inverser les axes, bougez d'abord votre joystick verticalement, puis h <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Plus d'informations</span></a> - + %1:%2 %1:%2 @@ -4126,77 +4234,77 @@ Pour inverser les axes, bougez d'abord votre joystick verticalement, puis h yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Le numéro de port contient des caractères invalides - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Le port doit être entre 0 et 65353 - + IP address is not valid L'adresse IP n'est pas valide - + This UDP server already exists Ce serveur UDP existe déjà - + Unable to add more than 8 servers Impossible d'ajouter plus de 8 serveurs - + Testing Essai - + Configuring Configuration - + Test Successful Test réussi - + Successfully received data from the server. Données reçues du serveur avec succès. - + Test Failed Test échoué - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Impossible de recevoir des données valides du serveur.<br>Veuillez vérifier que le serveur est correctement configuré et que l'adresse et le port sont corrects. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Le test UDP ou la configuration de l'étalonnage est en cours.<br>Veuillez attendre qu'ils se terminent. @@ -4323,7 +4431,12 @@ Les valeurs actuelles sont respectivement de %1% et %2%. Interface Réseau - + + Enable Airplane Mode + + + + None Aucun @@ -4381,52 +4494,52 @@ Les valeurs actuelles sont respectivement de %1% et %2%. Certains paramètres ne sont disponibles que lorsqu'un jeu n'est pas en cours d'exécution. - + Add-Ons Extensions - + System Système - + CPU CPU - + Graphics Graphiques - + Adv. Graphics Adv. Graphiques - + GPU Extensions - + Audio Audio - + Input Profiles Profils d'entrée - + Linux Linux - + Properties Propriétés @@ -4444,12 +4557,12 @@ Les valeurs actuelles sont respectivement de %1% et %2%. Extensions - + Patch Name Nom du patch - + Version Version @@ -4487,27 +4600,32 @@ Les valeurs actuelles sont respectivement de %1% et %2%. Mettre une image - + + Select Avatar + + + + Add Ajouter - + Rename Renommer - + Remove Supprimer - + Profile management is available only when game is not running. La gestion de profil est disponible que lorsqu'un jeu n'est pas en cours d'exécution. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4515,100 +4633,189 @@ Les valeurs actuelles sont respectivement de %1% et %2%. %2 - + Enter Username Entrez un nom d'utilisateur - + Users Utilisateurs - + Enter a username for the new user: Entrez un nom d'utilisateur pour le nouvel utilisateur : - + Enter a new username: Entrez un nouveau nom d'utilisateur : - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Sélectionner l'image de l'utilisateur - - JPEG Images (*.jpg *.jpeg) - Images JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Pas de firmware disponible + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Images JPEG (*.jpg *.jpeg) + + + Error deleting image Erreur dans la suppression de l'image - + Error occurred attempting to overwrite previous image at: %1. Une erreur est survenue en essayant de changer l'image précédente à : %1. - + Error deleting file Erreur dans la suppression du fichier - + Unable to delete existing file: %1. Impossible de supprimer le fichier existant : %1. - + Error creating user image directory Erreur dans la création du répertoire d'image de l'utilisateur - + Unable to create directory %1 for storing user images. Impossible de créer le répertoire %1 pour stocker les images de l'utilisateur. - Error copying user image - Erreur dans la copie de l'image de l'utilisateur + Erreur dans la copie de l'image de l'utilisateur - Unable to copy image from %1 to %2 - Impossible de copier l'image de %1 à %2 + Impossible de copier l'image de %1 à %2 - Error resizing user image - Erreur de redimensionnement de l'image utilisateur + Erreur de redimensionnement de l'image utilisateur - Unable to resize image - Impossible de redimensionner l'image + Impossible de redimensionner l'image + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Annuler + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Supprimer cet utilisateur ? Toutes les données de l'utilisateur vont être supprimées. - + Confirm Delete Confirmer la suppression - + Name: %1 UUID: %2 Nom : %1 @@ -4661,7 +4868,7 @@ UUID : %2 - + Enable Activer @@ -4672,7 +4879,7 @@ UUID : %2 - + Not connected Non connecté @@ -4682,63 +4889,63 @@ UUID : %2 Restaurer les défauts - + Clear Effacer - + [not set] [non défini] - + Invert axis Inverser l'axe - - + + Deadzone: %1% Zone morte : %1% - + Error enabling ring input Erreur lors de l'activation de la saisie de l'anneau - + Direct Joycon driver is not enabled Le pilote direct Joycon n'est pas activé - + Configuring Configuration - + The current mapped device doesn't support the ring controller Le périphérique mappé actuel ne prend pas en charge le contrôleur en anneau - + The current mapped device doesn't have a ring attached L'appareil actuellement mappé n'a pas d'anneau attaché - + The current mapped device is not connected L'appareil actuellement mappé n'est pas connecté - + Unexpected driver result %1 Résultat de pilote inattendu %1 - + [waiting] [en attente] @@ -4780,7 +4987,7 @@ UUID : %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4832,12 +5039,12 @@ UUID : %2 ConfigureTasDialog - + TAS Configuration Configuration du TAS - + Select TAS Load Directory... Sélectionner le dossier de chargement du TAS... @@ -4947,7 +5154,7 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5267,6 +5474,16 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Service Web yuzu @@ -5276,42 +5493,29 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce En fournissant votre surnom et token, vous acceptez de permettre à yuzu de collecter des données d'utilisation supplémentaires, qui peuvent contenir des informations d'identification de l'utilisateur. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Vérifier + Vérifier - Sign up - Se connecter + Se connecter - + Token: Token : - + Username: Pseudonyme : - What is my token? - Qu'est ce que mon token ? + Qu'est ce que mon token ? - + Web Service configuration can only be changed when a public room isn't being hosted. La configuration du service Web ne peut être modifiée que lorsqu'un salon publique n'est pas hébergée. @@ -5336,12 +5540,12 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce Regénérer - + Discord Presence Statut Discord - + Show Current Game in your Discord Status Afficher le jeu en cours dans le Statut Discord @@ -5350,24 +5554,8 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">En savoir plus</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Se connecter</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Se connecter</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5390,10 +5578,9 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce Le token n'a pas été vérifié. Le changement à votre token n'a pas été enregistré. - Unverified, please click Verify before saving configuration Tooltip - Non-verifié, veuillez clicker Verifier avant de sauvergarder la configuration + Non-verifié, veuillez clicker Verifier avant de sauvergarder la configuration Verifying... @@ -5417,20 +5604,67 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Échec de la vérification. Vérifiez si vous avez correctement entrez votre token, et que votre connection internet fonctionne. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Contrôleur joueur 1 - + &Controller P1 &Contrôleur joueur 1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Version + + DirectConnect @@ -5536,7 +5770,12 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5544,11 +5783,6 @@ Faites glisser les points pour modifier la position ou double-cliquez sur les ce The host of the room has banned you. Speak with the host to unban you or try a different room. L'hôte du salon vous a banni. Parlez à l'hôte pour vous débannir ou essayez un autre salon. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5610,7 +5844,7 @@ Veuillez aller dans Configurer -> Système -> Réseau et faites un choix.< Télémétrie - + Broken Vulkan Installation Detected Détection d'une installation Vulkan endommagée @@ -5619,106 +5853,105 @@ Veuillez aller dans Configurer -> Système -> Réseau et faites un choix.< L'initialisation de Vulkan a échoué lors du démarrage.<br><br>Cliquez <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>ici pour obtenir des instructions pour résoudre le problème</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Exécution d'un jeu - + Loading Web Applet... Chargement de l'applet web... - - + + Disable Web Applet Désactiver l'applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) La désactivation de l'applet Web peut entraîner un comportement indéfini et ne doit être utilisée qu'avec Super Mario 3D All-Stars. Voulez-vous vraiment désactiver l'applet Web ? (Cela peut être réactivé dans les paramètres de débogage.) - + The amount of shaders currently being built La quantité de shaders en cours de construction - + The current selected resolution scaling multiplier. Le multiplicateur de mise à l'échelle de résolution actuellement sélectionné. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Valeur actuelle de la vitesse de l'émulation. Des valeurs plus hautes ou plus basses que 100% indique que l'émulation fonctionne plus vite ou plus lentement qu'une véritable Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Combien d'image par seconde le jeu est en train d'afficher. Ceci vas varier de jeu en jeu et de scènes en scènes. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Temps pris pour émuler une image par seconde de la switch, sans compter le limiteur d'image par seconde ou la synchronisation verticale. Pour une émulation à pleine vitesse, ceci devrait être au maximum à 16.67 ms. - + Unmute Remettre le son - + Mute Couper le son - + Reset Volume Réinitialiser le volume - + &Clear Recent Files &Effacer les fichiers récents - + &Continue &Continuer - + &Pause &Pause - Warning Outdated Game Format - Avertissement : Le Format de jeu est dépassé + Avertissement : Le Format de jeu est dépassé You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Vous utilisez le format de répertoire ROM déconstruit pour ce jeu, qui est un format obsolète remplacé par d'autres tels que NCA, NAX, XCI ou NSP. Les répertoires de ROM déconstruits ne contiennent pas d'icônes, de métadonnées ni de prise en charge des mises à jour.<br><br>Pour obtenir des explications sur les différents formats pris en charge par yuzu, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>consultez notre wiki</a>. Ce message ne s'affichera plus. - - + + Error while loading ROM! Erreur lors du chargement de la ROM ! - + The ROM format is not supported. Le format de la ROM n'est pas supporté. - + An error occurred initializing the video core. Une erreur s'est produite lors de l'initialisation du noyau dédié à la vidéo. @@ -5727,7 +5960,7 @@ Veuillez aller dans Configurer -> Système -> Réseau et faites un choix.< yuzu a rencontré une erreur en exécutant le cœur vidéo. Cela est généralement causé par des pilotes graphiques trop anciens. Veuillez consulter les logs pour plus d'informations. Pour savoir comment accéder aux logs, veuillez vous référer à la page suivante : <a href='https://yuzu-emu.org/help/reference/log-files/'>Comment partager un fichier de log </a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Erreur lors du chargement de la ROM ! %1 @@ -5738,473 +5971,405 @@ Veuillez aller dans Configurer -> Système -> Réseau et faites un choix.< %1<br>Veuillez suivre <a href='https://yuzu-emu.org/help/quickstart/'>le guide de démarrage rapide yuzu</a> pour retransférer vos fichiers.<br>Vous pouvez vous référer au wiki yuzu</a> ou le Discord yuzu</a> pour de l'assistance. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Une erreur inconnue est survenue. Veuillez consulter le journal des logs pour plus de détails. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Fermeture du logiciel... - + Save Data Enregistrer les données - + Mod Data Donnés du Mod - + Error Opening %1 Folder Erreur dans l'ouverture du dossier %1. - - + + Folder does not exist! Le dossier n'existe pas ! - Error Opening Transferable Shader Cache - Erreur lors de l'ouverture des Shader Cache Transferable + Erreur lors de l'ouverture des Shader Cache Transferable - Failed to create the shader cache directory for this title. - Impossible de créer le dossier de cache du shader pour ce jeu. + Impossible de créer le dossier de cache du shader pour ce jeu. - Error Removing Contents - Erreur en enlevant le contenu + Erreur en enlevant le contenu - Error Removing Update - Erreur en enlevant la Mise à Jour + Erreur en enlevant la Mise à Jour - Error Removing DLC - Erreur en enlevant le DLC + Erreur en enlevant le DLC - + Remove Installed Game Contents? Enlever les données du jeu installé ? - + Remove Installed Game Update? Enlever la mise à jour du jeu installé ? - + Remove Installed Game DLC? Enlever le DLC du jeu installé ? - + Remove Entry Supprimer l'entrée - - - - - - Successfully Removed - Supprimé avec succès + Supprimé avec succès - Successfully removed the installed base game. - Suppression du jeu de base installé avec succès. + Suppression du jeu de base installé avec succès. - The base game is not installed in the NAND and cannot be removed. - Le jeu de base n'est pas installé dans la NAND et ne peut pas être supprimé. + Le jeu de base n'est pas installé dans la NAND et ne peut pas être supprimé. - Successfully removed the installed update. - Suppression de la mise à jour installée avec succès. + Suppression de la mise à jour installée avec succès. - There is no update installed for this title. - Il n'y a pas de mise à jour installée pour ce titre. + Il n'y a pas de mise à jour installée pour ce titre. - There are no DLC installed for this title. - Il n'y a pas de DLC installé pour ce titre. + Il n'y a pas de DLC installé pour ce titre. - Successfully removed %1 installed DLC. - Suppression de %1 DLC installé(s) avec succès. + Suppression de %1 DLC installé(s) avec succès. - + Delete OpenGL Transferable Shader Cache? Supprimer la Cache OpenGL de Shader Transférable? - + Delete Vulkan Transferable Shader Cache? Supprimer la Cache Vulkan de Shader Transférable? - + Delete All Transferable Shader Caches? Supprimer Toutes les Caches de Shader Transférable? - + Remove Custom Game Configuration? Supprimer la configuration personnalisée du jeu? - + Remove Cache Storage? Supprimer le stockage du cache ? - + Remove File Supprimer fichier - + Remove Play Time Data Supprimer les données de temps de jeu - + Reset play time? Réinitialiser le temps de jeu ? - - Error Removing Transferable Shader Cache - Erreur lors de la suppression du cache de shader transférable + Erreur lors de la suppression du cache de shader transférable - - A shader cache for this title does not exist. - Un shader cache pour ce titre n'existe pas. + Un shader cache pour ce titre n'existe pas. - Successfully removed the transferable shader cache. - Suppression du cache de shader transférable avec succès. + Suppression du cache de shader transférable avec succès. - Failed to remove the transferable shader cache. - Échec de la suppression du cache de shader transférable. + Échec de la suppression du cache de shader transférable. - Error Removing Vulkan Driver Pipeline Cache - Erreur lors de la suppression du cache de pipeline de pilotes Vulkan + Erreur lors de la suppression du cache de pipeline de pilotes Vulkan - Failed to remove the driver pipeline cache. - Échec de la suppression du cache de pipeline de pilotes. + Échec de la suppression du cache de pipeline de pilotes. - - Error Removing Transferable Shader Caches - Erreur durant la Suppression des Caches de Shader Transférable + Erreur durant la Suppression des Caches de Shader Transférable - Successfully removed the transferable shader caches. - Suppression des caches de shader transférable effectuée avec succès. + Suppression des caches de shader transférable effectuée avec succès. - Failed to remove the transferable shader cache directory. - Impossible de supprimer le dossier de la cache de shader transférable. + Impossible de supprimer le dossier de la cache de shader transférable. - - Error Removing Custom Configuration - Erreur lors de la suppression de la configuration personnalisée + Erreur lors de la suppression de la configuration personnalisée - A custom configuration for this title does not exist. - Il n'existe pas de configuration personnalisée pour ce titre. + Il n'existe pas de configuration personnalisée pour ce titre. - Successfully removed the custom game configuration. - Suppression de la configuration de jeu personnalisée avec succès. + Suppression de la configuration de jeu personnalisée avec succès. - Failed to remove the custom game configuration. - Échec de la suppression de la configuration personnalisée du jeu. + Échec de la suppression de la configuration personnalisée du jeu. - - + + RomFS Extraction Failed! L'extraction de la RomFS a échoué ! - + There was an error copying the RomFS files or the user cancelled the operation. Une erreur s'est produite lors de la copie des fichiers RomFS ou l'utilisateur a annulé l'opération. - + Full Plein - + Skeleton Squelette - + Select RomFS Dump Mode Sélectionnez le mode d'extraction de la RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Veuillez sélectionner la manière dont vous souhaitez que le fichier RomFS soit extrait.<br>Full copiera tous les fichiers dans le nouveau répertoire, tandis que<br>skeleton créera uniquement la structure de répertoires. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Il n'y a pas assez d'espace libre dans %1 pour extraire la RomFS. Veuillez libérer de l'espace ou sélectionner un autre dossier d'extraction dans Émulation > Configurer > Système > Système de fichiers > Extraire la racine - + Extracting RomFS... Extraction de la RomFS ... - - - - - + + Cancel Annuler - + RomFS Extraction Succeeded! Extraction de la RomFS réussi ! - - - + The operation completed successfully. L'opération s'est déroulée avec succès. - Integrity verification couldn't be performed! - La vérification de l'intégrité n'a pas pu être effectuée ! + La vérification de l'intégrité n'a pas pu être effectuée ! - File contents were not checked for validity. - La validité du contenu du fichier n'a pas été vérifiée. + La validité du contenu du fichier n'a pas été vérifiée. - - Verifying integrity... - Vérification de l'intégrité... + Vérification de l'intégrité... - - Integrity verification succeeded! - La vérification de l'intégrité a réussi ! + La vérification de l'intégrité a réussi ! - - Integrity verification failed! - La vérification de l'intégrité a échoué ! + La vérification de l'intégrité a échoué ! - File contents may be corrupt. - Le contenu du fichier pourrait être corrompu. + Le contenu du fichier pourrait être corrompu. - - - - Create Shortcut - Créer un raccourci + Créer un raccourci - Do you want to launch the game in fullscreen? - Voulez-vous lancer le jeu en plein écran ? + Voulez-vous lancer le jeu en plein écran ? - Successfully created a shortcut to %1 - Création réussie d'un raccourci vers %1 + Création réussie d'un raccourci vers %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Cela créera un raccourci vers l'AppImage actuelle. Cela peut ne pas fonctionner correctement si vous mettez à jour. Continuer ? + Cela créera un raccourci vers l'AppImage actuelle. Cela peut ne pas fonctionner correctement si vous mettez à jour. Continuer ? - Failed to create a shortcut to %1 - Impossible de créer un raccourci vers %1 + Impossible de créer un raccourci vers %1 - Create Icon - Créer une icône + Créer une icône - Cannot create icon file. Path "%1" does not exist and cannot be created. - Impossible de créer le fichier d'icône. Le chemin "%1" n'existe pas et ne peut pas être créé. + Impossible de créer le fichier d'icône. Le chemin "%1" n'existe pas et ne peut pas être créé. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Erreur lors de l'ouverture %1 - + Select Directory Sélectionner un répertoire - + Properties Propriétés - + The game properties could not be loaded. Les propriétés du jeu n'ont pas pu être chargées. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Exécutable Switch (%1);;Tous les fichiers (*.*) - + Load File Charger un fichier - + Open Extracted ROM Directory Ouvrir le dossier des ROM extraites - + Invalid Directory Selected Destination sélectionnée invalide - + The directory you have selected does not contain a 'main' file. Le répertoire que vous avez sélectionné ne contient pas de fichier "main". - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Fichier Switch installable (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installer les fichiers - + %n file(s) remaining %n fichier restant @@ -6212,25 +6377,25 @@ Veuillez aller dans Configurer -> Système -> Réseau et faites un choix.< - + Installing file "%1"... Installation du fichier "%1" ... - - + + Install Results Résultats d'installation - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Pour éviter d'éventuels conflits, nous déconseillons aux utilisateurs d'installer des jeux de base sur la NAND. Veuillez n'utiliser cette fonctionnalité que pour installer des mises à jour et des DLC. - + %n file(s) were newly installed @@ -6239,7 +6404,7 @@ Veuillez n'utiliser cette fonctionnalité que pour installer des mises à j - + %n file(s) were overwritten @@ -6248,7 +6413,7 @@ Veuillez n'utiliser cette fonctionnalité que pour installer des mises à j - + %n file(s) failed to install @@ -6257,242 +6422,310 @@ Veuillez n'utiliser cette fonctionnalité que pour installer des mises à j - + System Application Application Système - + System Archive Archive Système - + System Application Update Mise à jour de l'application système - + Firmware Package (Type A) Paquet micrologiciel (Type A) - + Firmware Package (Type B) Paquet micrologiciel (Type B) - + Game Jeu - + Game Update Mise à jour de jeu - + Game DLC DLC de jeu - + Delta Title Titre Delta - + Select NCA Install Type... Sélectionner le type d'installation du NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Veuillez sélectionner le type de titre auquel vous voulez installer ce NCA : (Dans la plupart des cas, le titre par défaut : 'Jeu' est correct.) - + Failed to Install Échec de l'installation - + The title type you selected for the NCA is invalid. Le type de titre que vous avez sélectionné pour le NCA n'est pas valide. - + File not found Fichier non trouvé - + File "%1" not found Fichier "%1" non trouvé - + OK OK - - + + Hardware requirements not met Éxigences matérielles non respectées - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Votre système ne correspond pas aux éxigences matérielles. Les rapports de comptabilité ont été désactivés. - + Missing yuzu Account Compte yuzu manquant - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Pour soumettre un test de compatibilité pour un jeu, vous devez lier votre compte yuzu.<br><br/>Pour lier votre compte yuzu, aller à Emulation &gt; Configuration&gt; Web. - + Error opening URL Erreur lors de l'ouverture de l'URL - + Unable to open the URL "%1". Impossible d'ouvrir l'URL "%1". - + TAS Recording Enregistrement TAS - + Overwrite file of player 1? Écraser le fichier du joueur 1 ? - + Invalid config detected Configuration invalide détectée - + Handheld controller can't be used on docked mode. Pro controller will be selected. Le contrôleur portable ne peut pas être utilisé en mode TV. La manette pro sera sélectionné. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'amiibo actuel a été retiré - + Error Erreur - - + + The current game is not looking for amiibos Le jeu actuel ne cherche pas d'amiibos. - + Amiibo File (%1);; All Files (*.*) Fichier Amiibo (%1);; Tous les fichiers (*.*) - + Load Amiibo Charger un Amiibo - + Error loading Amiibo data Erreur lors du chargement des données Amiibo - + The selected file is not a valid amiibo Le fichier choisi n'est pas un amiibo valide - + The selected file is already on use Le fichier sélectionné est déjà utilisé - + An unknown error occurred Une erreur inconnue s'est produite - - Verification failed for the following files: %1 - La vérification a échoué pour les fichiers suivants : + La vérification a échoué pour les fichiers suivants : %1 - + + Keys not installed Clés non installées @@ -6501,255 +6734,215 @@ Would you like to bypass this and exit anyway? Installez les clés de décryptage et redémarrez yuzu avant d'essayer d'installer le firmware. - + Select Dumped Firmware Source Location Sélectionnez l'emplacement de la source du firmware extrait - Installing Firmware... - Installation du firmware... + Installation du firmware... - - - - Firmware install failed - L'installation du firmware a échoué + L'installation du firmware a échoué - Unable to locate potential firmware NCA files - Impossible de localiser les fichiers NCA du potentiel firmware + Impossible de localiser les fichiers NCA du potentiel firmware - Failed to delete one or more firmware file. - Échec de la suppression d'un ou plusieurs fichiers du firmware. + Échec de la suppression d'un ou plusieurs fichiers du firmware. Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. L'installation du firmware a été annulée, le firmware peut être dans un état défectueux. Redémarrez yuzu ou réinstallez le firmware. - One or more firmware files failed to copy into NAND. - Un ou plusieurs fichiers du firmware n'ont pas pu être copiés dans la NAND. + Un ou plusieurs fichiers du firmware n'ont pas pu être copiés dans la NAND. - Firmware integrity verification failed! - La vérification de l'intégrité du firmware a échoué ! + La vérification de l'intégrité du firmware a échoué ! - Select Dumped Keys Location - Sélectionner l'emplacement des clés extraites + Sélectionner l'emplacement des clés extraites - - - Decryption Keys install failed - L'installation des clés de décryptage a échoué + L'installation des clés de décryptage a échoué - prod.keys is a required decryption key file. - prod.keys est un fichier de clés de décryptage requis + prod.keys est un fichier de clés de décryptage requis - One or more keys failed to copy. - Une ou plusieurs clés n'ont pas pu être copiées. + Une ou plusieurs clés n'ont pas pu être copiées. - Decryption Keys install succeeded - L'installation des clés de décryptage a réussi + L'installation des clés de décryptage a réussi - Decryption Keys were successfully installed - Les clés de décryptage ont été installées avec succès + Les clés de décryptage ont été installées avec succès - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - L'initialisation des clés de décryptage a échoué. Vérifiez que vos outils de dump sont à jour et re-dumpez les clés. + L'initialisation des clés de décryptage a échoué. Vérifiez que vos outils de dump sont à jour et re-dumpez les clés. - - - - - - - + + + + + + No firmware available Pas de firmware disponible - Please install the firmware to use the Album applet. - Veuillez installer le firmware pour utiliser l'applet de l'album. + Veuillez installer le firmware pour utiliser l'applet de l'album. - + Album Applet Applet de l'album - + Album applet is not available. Please reinstall firmware. L'applet de l'album n'est pas disponible. Veuillez réinstaller le firmware. - Please install the firmware to use the Cabinet applet. - Veuillez installer le firmware pour utiliser l'applet du cabinet. + Veuillez installer le firmware pour utiliser l'applet du cabinet. - + Cabinet Applet Applet du cabinet - + Cabinet applet is not available. Please reinstall firmware. L'applet du cabinet n'est pas disponible. Veuillez réinstaller le firmware. - Please install the firmware to use the Mii editor. - Veuillez installer le firmware pour utiliser l'éditeur Mii. + Veuillez installer le firmware pour utiliser l'éditeur Mii. - + Mii Edit Applet Applet de l'éditeur Mii - + Mii editor is not available. Please reinstall firmware. L'éditeur Mii n'est pas disponible. Veuillez réinstaller le firmware. - Please install the firmware to use the Controller Menu. - Veuillez installer le firmware pour utiliser le menu des manettes. + Veuillez installer le firmware pour utiliser le menu des manettes. - + Controller Applet Applet Contrôleur - + Controller Menu is not available. Please reinstall firmware. Le menu des manettes n'est pas disponible. Veuillez réinstaller le firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Capture d'écran - + PNG Image (*.png) Image PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 État du TAS : En cours d'exécution %1/%2 - + TAS state: Recording %1 État du TAS : Enregistrement %1 - + TAS state: Idle %1/%2 État du TAS : Inactif %1:%2 - + TAS State: Invalid État du TAS : Invalide - + &Stop Running &Stopper l'exécution - + &Start &Start - + Stop R&ecording Stopper l'en&registrement - + R&ecord En&registrer - + Building: %n shader(s) Compilation: %n shader @@ -6757,18 +6950,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Échelle : %1x - + Speed: %1% / %2% Vitesse : %1% / %2% - + Speed: %1% Vitesse : %1% @@ -6777,44 +6970,44 @@ Would you like to download it? Jeu : %1 IPS (Débloqué) - + Game: %1 FPS Jeu : %1 FPS - + Frame: %1 ms Frame : %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA AUCUN AA - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME : %1% - + Derivation Components Missing Composants de dérivation manquants @@ -6823,12 +7016,12 @@ Would you like to download it? Les clés de chiffrement sont manquantes. <br>Veuillez suivre <a href='https://yuzu-emu.org/help/quickstart/'>le guide de démarrage rapide yuzu</a> pour obtenir toutes vos clés, firmware et jeux. - + Select RomFS Dump Target Sélectionner la cible d'extraction du RomFS - + Please select which RomFS you would like to dump. Veuillez sélectionner quel RomFS vous voulez extraire. @@ -6841,7 +7034,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Êtes-vous sûr d'arrêter l'émulation ? Tout progrès non enregistré sera perdu. @@ -6854,102 +7047,102 @@ Would you like to bypass this and exit anyway? Voulez-vous ignorer ceci and quitter quand même ? - + None Aucune - + FXAA FXAA - + SMAA SMAA - + Nearest Le plus proche - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + ScaleForce ScaleForce - + Area - + Docked Mode TV - + Handheld Mode Portable - + Normal Normal - + High Haut - + Extreme Extême - + Vulkan Vulkan - + OpenGL OpenGL - + Null Nul - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6957,13 +7150,13 @@ Voulez-vous ignorer ceci and quitter quand même ? GRenderWindow - - + + OpenGL not available! OpenGL n'est pas disponible ! - + OpenGL shared contexts are not supported. Les contextes OpenGL partagés ne sont pas pris en charge. @@ -6972,33 +7165,33 @@ Voulez-vous ignorer ceci and quitter quand même ? yuzu n'a pas été compilé avec le support OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Erreur lors de l'initialisation d'OpenGL ! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Votre GPU peut ne pas prendre en charge OpenGL, ou vous n'avez pas les derniers pilotes graphiques. - + Error while initializing OpenGL 4.6! Erreur lors de l'initialisation d'OpenGL 4.6 ! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Votre GPU peut ne pas prendre en charge OpenGL 4.6 ou vous ne disposez pas du dernier pilote graphique: %1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Votre GPU peut ne pas prendre en charge une ou plusieurs extensions OpenGL requises. Veuillez vous assurer que vous disposez du dernier pilote graphique.<br><br>GL Renderer :<br>%1<br><br>Extensions non prises en charge :<br>%2 @@ -7006,128 +7199,128 @@ Voulez-vous ignorer ceci and quitter quand même ? GameList - + Favorite Préférer - + Start Game Démarrer le jeu - + Start Game without Custom Configuration Démarrer le jeu sans configuration personnalisée - + Open Save Data Location Ouvrir l'emplacement des données de sauvegarde - + Open Mod Data Location Ouvrir l'emplacement des données des mods - + Open Transferable Pipeline Cache Ouvrir le cache de pipelines transférable - + Remove Supprimer - + Remove Installed Update Supprimer mise à jour installée - + Remove All Installed DLC Supprimer tous les DLC installés - + Remove Custom Configuration Supprimer la configuration personnalisée - + Remove Play Time Data Supprimer les données de temps de jeu - + Remove Cache Storage Supprimer le stockage du cache - + Remove OpenGL Pipeline Cache Supprimer le cache de pipelines OpenGL - + Remove Vulkan Pipeline Cache Supprimer le cache de pipelines Vulkan - + Remove All Pipeline Caches Supprimer tous les caches de pipelines - + Remove All Installed Contents Supprimer tout le contenu installé - + Dump RomFS Extraire la RomFS - + Dump RomFS to SDMC Décharger RomFS vers SDMC - + Verify Integrity Vérifier l'intégrité - + Copy Title ID to Clipboard Copier l'ID du titre dans le Presse-papiers - + Navigate to GameDB entry Accédez à l'entrée GameDB - + Create Shortcut Créer un raccourci - + Add to Desktop Ajouter au bureau - + Add to Applications Menu Ajouter au menu des applications - + Configure Game @@ -7136,62 +7329,62 @@ Voulez-vous ignorer ceci and quitter quand même ? Propriétés - + Scan Subfolders Scanner les sous-dossiers - + Remove Game Directory Supprimer le répertoire du jeu - + ▲ Move Up ▲ Monter - + ▼ Move Down ▼ Descendre - + Open Directory Location Ouvrir l'emplacement du répertoire - + Clear Effacer - + Name Nom - + Compatibility Compatibilité - + Add-ons Extensions - + File type Type de fichier - + Size Taille - + Play time Temps de jeu @@ -7199,62 +7392,62 @@ Voulez-vous ignorer ceci and quitter quand même ? GameListItemCompat - + Ingame En jeu - + Game starts, but crashes or major glitches prevent it from being completed. Le jeu se lance, mais crash ou des bugs majeurs l'empêchent d'être complété. - + Perfect Parfait - + Game can be played without issues. Le jeu peut être joué sans problèmes. - + Playable Jouable - + Game functions with minor graphical or audio glitches and is playable from start to finish. Le jeu fonctionne avec des glitchs graphiques ou audio mineurs et est jouable du début à la fin. - + Intro/Menu Intro/Menu - + Game loads, but is unable to progress past the Start Screen. Le jeu charge, mais ne peut pas progresser après le menu de démarrage. - + Won't Boot Ne démarre pas - + The game crashes when attempting to startup. Le jeu crash au lancement. - + Not Tested Non testé - + The game has not yet been tested. Le jeu n'a pas encore été testé. @@ -7262,7 +7455,7 @@ Voulez-vous ignorer ceci and quitter quand même ? GameListPlaceholder - + Double-click to add a new folder to the game list Double-cliquez pour ajouter un nouveau dossier à la liste de jeux @@ -7270,7 +7463,7 @@ Voulez-vous ignorer ceci and quitter quand même ? GameListSearchField - + %1 of %n result(s) %1 sur %n résultat @@ -7278,12 +7471,12 @@ Voulez-vous ignorer ceci and quitter quand même ? - + Filter: Filtre : - + Enter pattern to filter Entrez un motif à filtrer @@ -7365,7 +7558,7 @@ Voulez-vous ignorer ceci and quitter quand même ? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7379,91 +7572,91 @@ Message de débogage : Hotkeys - + Audio Mute/Unmute Désactiver/Activer le son - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Fenêtre Principale - + Audio Volume Down Baisser le volume audio - + Audio Volume Up Augmenter le volume audio - + Capture Screenshot Prendre une capture d'ecran - + Change Adapting Filter Modifier le filtre d'adaptation - + Change Docked Mode Changer le mode de la station d'accueil - + Change GPU Accuracy Modifier la précision du GPU - + Configure Configurer - + Configure Current Game - + Continue/Pause Emulation Continuer/Suspendre l'Émulation - + Exit Fullscreen Quitter le plein écran @@ -7472,97 +7665,97 @@ Message de débogage : Quitter yuzu - - Exit eden + + Exit Eden - + Fullscreen Plein écran - + Load File Charger un fichier - + Load/Remove Amiibo Charger/Supprimer un Amiibo - + Multiplayer Browse Public Game Lobby Multijoueur parcourir le menu des jeux publics - + Multiplayer Create Room Multijoueur créer un salon - + Multiplayer Direct Connect to Room Multijoueur connexion directe au salon - + Multiplayer Leave Room Multijoueur quitter le salon - + Multiplayer Show Current Room Multijoueur afficher le salon actuel - + Restart Emulation Redémarrer l'Émulation - + Stop Emulation Arrêter l'Émulation - + TAS Record Enregistrement TAS - + TAS Reset Réinitialiser le TAS - + TAS Start/Stop Démarrer/Arrêter le TAS - + Toggle Filter Bar Activer la barre de filtre - + Toggle Framerate Limit Activer la limite de fréquence d'images - + Toggle Mouse Panning Activer le panoramique de la souris - + Toggle Renderdoc Capture Activer la capture renderdoc - + Toggle Status Bar Activer la barre d'état @@ -7570,22 +7763,22 @@ Message de débogage : InstallDialog - + Please confirm these are the files you wish to install. Veuillez confirmer que ce sont les fichiers que vous souhaitez installer. - + Installing an Update or DLC will overwrite the previously installed one. L'installation d'une mise à jour ou d'un DLC écrasera celle précédemment installée. - + Install Installer - + Install Files to NAND Installer des fichiers sur la NAND @@ -7593,7 +7786,7 @@ Message de débogage : LimitableInputDialog - + The text can't contain any of the following characters: %1 Le texte ne peut contenir aucun des caractères suivants : @@ -7740,152 +7933,207 @@ Message de débogage : &Fichiers récents - + + Open &Eden Folders + + + + &Emulation &Émulation - + &View &Vue - + &Reset Window Size &Réinitialiser la taille de la fenêtre - + &Debugging &Débogage - + Reset Window Size to &720p &Réinitialiser la taille de la fenêtre à 720p - + Reset Window Size to 720p Réinitialiser la taille de la fenêtre à 720p - + Reset Window Size to &900p Réinitialiser la taille de la fenêtre à &900p - + Reset Window Size to 900p Réinitialiser la taille de la fenêtre à 900p - + Reset Window Size to &1080p Réinitialiser la taille de la fenêtre à &1080p - + Reset Window Size to 1080p Réinitialiser la taille de la fenêtre à 1080p - + &Multiplayer &Multijoueur - + &Tools &Outils - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Aide - + &Install Files to NAND... &Installer des fichiers sur la NAND... - + L&oad File... &Charger un fichier... - + Load &Folder... &Charger un dossier - + E&xit Q&uitter - + &Pause &Pause - + &Stop &Arrêter - + &Verify Installed Contents &Vérifier les contenus installés - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7894,97 +8142,97 @@ Message de débogage : &À propos de yuzu - + Single &Window Mode &Mode fenêtre unique - + Con&figure... &Configurer... - + Ctrl+, - + Display D&ock Widget Headers &Afficher les en-têtes du widget Dock - + Show &Filter Bar &Afficher la barre de filtre - + Show &Status Bar &Afficher la barre d'état - + Show Status Bar Afficher la barre d'état - + &Browse Public Game Lobby &Parcourir le menu des jeux publics - + &Create Room &Créer un salon - + &Leave Room &Quitter le salon - + &Direct Connect to Room &Connexion directe au salon - + &Show Current Room &Afficher le salon actuel - + F&ullscreen P&lein écran - + &Restart &Redémarrer - + Load/Remove &Amiibo... Charger/Retirer un &Amiibo… - + &Report Compatibility &Signaler la compatibilité - + Open &Mods Page Ouvrir la &page des mods - + Open &Quickstart Guide Ouvrir le &guide de démarrage rapide - + &FAQ &FAQ @@ -7993,77 +8241,82 @@ Message de débogage : Ouvrir le &dossier de Yuzu - + &Capture Screenshot &Capture d'écran - + Open &Album Ouvrir l'&album - + &Set Nickname and Owner &Définir le surnom et le propriétaire - + &Delete Game Data &Supprimer les données du jeu - + &Restore Amiibo &Restaurer l'amiibo - + &Format Amiibo &Formater l'amiibo - + Open &Mii Editor Ouvrir l'&éditeur Mii - + &Configure TAS... &Configurer TAS... - + Configure C&urrent Game... Configurer le j&eu actuel... - + &Start &Démarrer - + &Reset &Réinitialiser - + R&ecord En&registrer - + Open &Controller Menu Ouvrir le &menu des manettes - + Install Firmware Installer le firmware - + + &About Eden + + + + Install Decryption Keys Installer les clés de décryptage @@ -8071,26 +8324,36 @@ Message de débogage : MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8150,37 +8413,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status État actuel de la connexion - + Not Connected. Click here to find a room! Pas connecté. Cliquez ici pour trouver un salon ! - + Not Connected Non Connecté - + Connected Connecté - + New Messages Received Nouveaux messages reçus - + Error Erreur - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Impossible de mettre à jour les informations du salon. Veuillez vérifier votre connexion internet et d'héberger le salon à nouveau. @@ -8372,56 +8635,56 @@ p, li { white-space: pre-wrap; } Ne joue pas à un jeu - + Installed SD Titles Titres installés sur la SD - + Installed NAND Titles Titres installés sur la NAND - + System Titles Titres Système - + Add New Game Directory Ajouter un nouveau répertoire de jeu - + Favorites Favoris - - + + Shift Maj - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [non défini] @@ -8432,14 +8695,14 @@ p, li { white-space: pre-wrap; } Chapeau %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Axe %1%2 @@ -8450,357 +8713,357 @@ p, li { white-space: pre-wrap; } Bouton %1 - - - - - - + + + + + + [unknown] [inconnu] - - - + + + Left Gauche - - - + + + Right Droite - - - + + + Down Bas - - - + + + Up Haut - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Cercle - - + + Cross Croix - - + + Square Carré - - + + Triangle Triangle - - + + Share Partager - - + + Options Options - - + + [undefined] [non défini] - + %1%2 %1%2 - - + + [invalid] [invalide] - - + + %1%2Hat %3 %1%2Chapeau %3 - - - + + + %1%2Axis %3 %1%2Axe %3 - - + + %1%2Axis %3,%4,%5 %1%2Axe %3,%4,%5 - - + + %1%2Motion %3 %1%2Mouvement %3 - - + + %1%2Button %3 %1%2Bouton %3 - - + + [unused] [inutilisé] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Stick Gauche - + Stick R Stick Droit - + Plus Plus - + Minus Moins - - + + Home Home - + Capture Capture - + Touch Tactile - + Wheel Indicates the mouse wheel Molette - + Backward Reculer - + Forward Avancer - + Task Tâche - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Chapeau %4 - - + + %1%2%3Axis %4 %1%2%3Axe %4 - - + + %1%2%3Button %4 %1%2%3Bouton %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8918,6 +9181,300 @@ p, li { white-space: pre-wrap; } Voulez-vous restaurer cet Amiibo ? + + QtCommon::Content + + + Installing Firmware... + Installation du firmware... + + + + + + Cancel + Annuler + + + + Firmware integrity verification failed! + La vérification de l'intégrité du firmware a échoué ! + + + + + Verification failed for the following files: + +%1 + La vérification a échoué pour les fichiers suivants : + +%1 + + + + + Verifying integrity... + Vérification de l'intégrité... + + + + + Integrity verification succeeded! + La vérification de l'intégrité a réussi ! + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + La vérification de l'intégrité a échoué ! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + Sélectionner l'emplacement des clés extraites + + + + Decryption Keys install succeeded + L'installation des clés de décryptage a réussi + + + + Decryption Keys were successfully installed + Les clés de décryptage ont été installées avec succès + + + + Decryption Keys install failed + L'installation des clés de décryptage a échoué + + + + QtCommon::Game + + + Error Removing Contents + Erreur en enlevant le contenu + + + + Error Removing Update + Erreur en enlevant la Mise à Jour + + + + Error Removing DLC + Erreur en enlevant le DLC + + + + The base game is not installed in the NAND and cannot be removed. + Le jeu de base n'est pas installé dans la NAND et ne peut pas être supprimé. + + + + There is no update installed for this title. + Il n'y a pas de mise à jour installée pour ce titre. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Supprimé avec succès + + + + Successfully removed %1 installed DLC. + Suppression de %1 DLC installé(s) avec succès. + + + + + Error Removing Transferable Shader Cache + Erreur lors de la suppression du cache de shader transférable + + + + + A shader cache for this title does not exist. + Un shader cache pour ce titre n'existe pas. + + + + Successfully removed the transferable shader cache. + Suppression du cache de shader transférable avec succès. + + + + Failed to remove the transferable shader cache. + Échec de la suppression du cache de shader transférable. + + + + Error Removing Vulkan Driver Pipeline Cache + Erreur lors de la suppression du cache de pipeline de pilotes Vulkan + + + + Failed to remove the driver pipeline cache. + Échec de la suppression du cache de pipeline de pilotes. + + + + + Error Removing Transferable Shader Caches + Erreur durant la Suppression des Caches de Shader Transférable + + + + Successfully removed the transferable shader caches. + Suppression des caches de shader transférable effectuée avec succès. + + + + Failed to remove the transferable shader cache directory. + Impossible de supprimer le dossier de la cache de shader transférable. + + + + + Error Removing Custom Configuration + Erreur lors de la suppression de la configuration personnalisée + + + + A custom configuration for this title does not exist. + Il n'existe pas de configuration personnalisée pour ce titre. + + + + Successfully removed the custom game configuration. + Suppression de la configuration de jeu personnalisée avec succès. + + + + Failed to remove the custom game configuration. + Échec de la suppression de la configuration personnalisée du jeu. + + + + Reset Metadata Cache + Mettre à zéro le cache des métadonnées + + + + The metadata cache is already empty. + Le cache des métadonnées est déjà vide. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Le cache des métadonnées n'a pas pu être supprimé. Il pourrait être utilisé ou non-existant. + + + + Create Shortcut + Créer un raccourci + + + + Do you want to launch the game in fullscreen? + Voulez-vous lancer le jeu en plein écran ? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Création réussie d'un raccourci vers %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Cela créera un raccourci vers l'AppImage actuelle. Cela peut ne pas fonctionner correctement si vous mettez à jour. Continuer ? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Impossible de créer un raccourci vers %1 + + + + Create Icon + Créer une icône + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Impossible de créer le fichier d'icône. Le chemin "%1" n'existe pas et ne peut pas être créé. + + + + No firmware available + Pas de firmware disponible + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9213,7 +9770,7 @@ Veuillez essayer à nouveau ou contactez le développeur du logiciel. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9221,7 +9778,7 @@ Veuillez essayer à nouveau ou contactez le développeur du logiciel. - + Users Utilisateurs @@ -9345,7 +9902,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Pile d'exécution @@ -9353,12 +9910,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread attendu par aucun thread @@ -9366,102 +9923,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable runnable - + paused en pause - + sleeping en veille - + waiting for IPC reply en attente de réponse IPC - + waiting for objects En attente d'objets - + waiting for condition variable en attente de la variable conditionnelle - + waiting for address arbiter En attente de l'adresse arbitre - + waiting for suspend resume waiting for suspend resume - + waiting en attente - + initialized initialisé - + terminated terminated - + unknown inconnu - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal idéal - + core %1 cœur %1 - + processor = %1 Processeur = %1 - + affinity mask = %1 masque d'affinité = %1 - + thread id = %1 id du fil = %1 - + priority = %1(current) / %2(normal) priorité = %1(courant) / %2(normal) - + last running ticks = %1 dernier tick en cours = %1 @@ -9469,7 +10026,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread attendu par un fil @@ -9477,7 +10034,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 42922c3ea1..f7cf3ce32a 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Kommunikálás a szerverrel... - + Cancel Mégse - + Touch the top left corner <br>of your touchpad. Nyomd meg a bal felső sarkot <br>a touchpaden. - + Now touch the bottom right corner <br>of your touchpad. Most pedig nyomd meg a jobb alsó sarkot <br>a touchpaden. - + Configuration completed! Beállitás befejezve! - + OK OK @@ -397,134 +397,124 @@ Ez kitiltaná a fórum felhasználóneve és az IP címe alapján. ConfigurationShared - + % % - + Amiibo editor Amiibo szerkesztő - + Controller configuration Vezérlő konfiguráció - + Data erase Adat törlése - + Error Hiba - - Net connect - - - - + Player select Játékos kiválasztása - + Software keyboard Szoftver billenytűzet - + Mii Edit Mii szerkesztés - + Online web Online web - + Shop Bolt - + Photo viewer Képnézegető - + Offline web Offline web - + Login share Bejelentkezés megosztása - - Wifi web auth - - - - + My page Az oldalam - + Output Engine: Kimeneti motor: - + Output Device: Kimeneti eszköz: - + Input Device: Bemeneti eszköz: - + Mute audio Hang némítása - + Volume: Hangerő: - + Mute audio when in background Hang némítása, amikor háttérben van - + Multicore CPU Emulation Többmagos CPU emuláció - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Ez az opció növeli a CPU emulációs szál használatát 1-ről a Switch maximális értékére, ami 4. Ez főként egy hibakeresési opció, és nem javasolt letiltani. - + Memory Layout Memóriaelrendezés - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +523,12 @@ Nem javítja a stabilitást vagy a teljesítményt, kizárólag arra szolgál, h Az engedélyezése megnövelt memóriahasználattal jár. Nem ajánlott engedélyezni, kivéve ha egy adott játék textúra modja nem igényli. - + Limit Speed Percent Sebesség korlátozása - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,140 +537,111 @@ A 200% egy 30 FPS-el futó játéknál 60 FPS-t jelent, egy 60 FPS-es játékná Ennek kikapcsolása feloldja a képkocka korlátozását. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Pontosság: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Ez a beállítás szabályozza az emulált CPU pontosságát. Ne változtasd meg, kivéve ha tudod mit csinálsz. - - + + Backend: Backend: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) FMA kikapcsolása (javítja a teljesítményt FMA nélküli CPU-kon) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Ez az opció a fused-multiply-add utasítások pontosságának csökkentésével javítja a sebességet olyan CPU-k esetén, amelyek nem rendelkeznek natív FMA támogatással. - + Faster FRSQRTE and FRECPE Gyorsabb FRSQRTE és FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Ez az opció javítja néhány közelítő lebegőpontos függvény sebességét azáltal, hogy kevésbé pontos natív megközelítést használ. - + Faster ASIMD instructions (32 bits only) Gyorsabb ASIMD utasítások (csak 32 bit) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Ez az opció növeli a 32 bites ASIMD lebegőpontos függvények sebességét a helytelen kerekítési módok használatával. - + Inaccurate NaN handling Pontatlan NaN kezelés - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Ez az opció növeli a sebességet a NaN ellenőrzés kihagyásával. Kérjük, vedd figyelembe, hogy ez bizonyos lebegőpontos utasítások pontosságát is csökkenti. - + Disable address space checks Címtartomány-ellenőrzések kikapcsolása - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Ez az opció javítja a sebességet azáltal, hogy kiiktatja a biztonsági ellenőrzést minden memóriaolvasás/írás előtt a vendégben. A letiltása lehetővé teheti, hogy egy játék olvassa/írja az emulátor memóriáját. - + Ignore global monitor Globális monitorozás mellőzése - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Váltás az elérhető grafikai API-k között. A Vulkan a legtöbb esetben ajánlott. - + Device: Eszköz: - + This setting selects the GPU to use with the Vulkan backend. Ez a beállítás kiválasztja a Vulkan backendhez használandó GPU-t. - + Shader Backend: Árnyékoló Backend: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -691,12 +652,12 @@ A GLASM egy elavult NVIDIA-specifikus backend, amely sokkal jobb árnyékoló é Az SPIR-V fordít leggyorsabban, de gyenge eredményeket produkál a legtöbb GPU illesztőprogramon. - + Resolution: Felbontás: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -705,27 +666,27 @@ A magasabb felbontások sokkal több VRAM-ot és sávszélességet igényelnek. Az 1X-esnél alacsonyabb beállítások renderelési problémákat okozhatnak. - + Window Adapting Filter: Ablakadaptív szűrő: - + FSR Sharpness: FSR élesség: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Meghatározza, milyen éles lesz a kép az FSR dinamikus kontraszt használata közben. - + Anti-Aliasing Method: Élsimítási módszer: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -734,12 +695,12 @@ SMAA nyútja a legjobb minőséget. FXAA kisebb hatással van a teljesítményre, és nagyon alacsony felbontások esetén jobb és stabilabb képet eredményezhet. - + Fullscreen Mode: Teljes képernyős mód: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -748,12 +709,12 @@ A borderless (szegély nélküli) biztosítja a legjobb kompatibilitást a képe Az exkluzív teljes képernyő jobb teljesítményt és jobb Freesync/Gsync támogatást kínálhat. - + Aspect Ratio: Képarány: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -762,49 +723,36 @@ A Switch játékok csak a 16:9 képarányt támogatják, így más arányokhoz e Szabályozza a rögzített képernyőképek képarányát is. - + Use disk pipeline cache Lemez pipeline gyorsítótár használata - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Lehetővé teszi az árnyékolók tárolását a gyorsabb betöltés érdekében a következő játékindításokkor. Kikapcsolása csak hibakeresésre szolgál. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Aszinkron GPU-emuláció használata - + Uses an extra CPU thread for rendering. This option should always remain enabled. Egy extra CPU szálat használ a rendereléshez. Az opció bekapcsolva tartása erősen javasolt. - + NVDEC emulation: NVDEC emuláció: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -813,12 +761,12 @@ A dekódoláshoz használhatja a CPU-t vagy a GPU-t, vagy egyáltalán nem vége A legtöbb esetben a GPU dekódolás nyújtja a legjobb teljesítményt. - + ASTC Decoding Method: ASTC dekódoló módszer: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -831,34 +779,33 @@ CPU Aszinkron: A CPU-t használja az ASTC textúrák dekódolásához, amint meg akadozását, de a textúra dekódolása közben renderelési problémákat okozhat. - + ASTC Recompression Method: ASTC újraszűrési módszer: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Szinte egyik asztali és laptop dedikált GPU sem támogatja az ASTC textúrákat, ezért az emulátornak köztes formátumba kell dekompresszálnia, amit bármelyik kártya támogat, RGBA8 formátumba. Ez az opció az RGBA8-at BC1 vagy BC3 formátumra tömöríti vissza, ami VRAM-ot takarít meg, de negatívan befolyásolja a képminőséget. - + VRAM Usage Mode: VRAM használati mód: - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - Kiválasztja, hogy az emulátor a teljesítmény érdekében inkább takarékoskodjon a memóriával, vagy maximálisan kihasználja a rendelkezésre álló videomemóriát. Integrált grafikára nincs hatással. Az agresszív üzemmód jelentősen befolyásolhatja más alkalmazások, például a rögzítő szoftverek teljesítményét. + Kiválasztja, hogy az emulátor a teljesítmény érdekében inkább takarékoskodjon a memóriával, vagy maximálisan kihasználja a rendelkezésre álló videomemóriát. Integrált grafikára nincs hatással. Az agresszív üzemmód jelentősen befolyásolhatja más alkalmazások, például a rögzítő szoftverek teljesítményét. - + VSync Mode: VSync mód: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -869,51 +816,49 @@ A Mailboxnak a FIFO-nál kisebb lehet a késleltetése és nem jelentkezik képs Az azonnali (nincs szinkronizálás) azt jeleníti meg, ami éppen elérhető, ezért előfordulhat képszakadás. - + Enable asynchronous presentation (Vulkan only) Aszinkron prezentálás engedélyezése (csak Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Kicsit javítja a teljesítményt azáltal, hogy a megjelenítést külön CPU szálra helyezi át. - + Force maximum clocks (Vulkan only) Maximális órajelek kényszerítése (csak Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. A háttérben fut, miközben várja a grafikai parancsokat, hogy a GPU ne csökkentse az órajelét. - + Anisotropic Filtering: Anizotropikus szűrés: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. A textúra megjelenítés minőségét szabályozza ferde szögeknél. Ez egy könnyű beállítás és a legtöbb GPU-n biztonságos 16x-osra állítani. - Accuracy Level: - Pontossági szint: + Pontossági szint: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - GPU emuláció pontossága. + GPU emuláció pontossága. A legtöbb játék Normál módban jól renderel, de néhányhoz még mindig szükséges a Magas pontosság. A részecskék általában csak Magas pontossággal renderelnek helyesen. Az Extrém csak hibakereséshez használandó. @@ -921,12 +866,12 @@ Ez az opció játék közben is megváltoztatható. Néhány játékhoz szükséges lehet a Magas beállításon való indítás a megfelelő rendereléshez. - + Use asynchronous shader building (Hack) Aszinkron árnyékoló építés használata (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Engedélyezi az aszinkron árnyékoló fordítást, ami csökkentheti az akadást. @@ -941,134 +886,106 @@ Ez a funkció kísérleti jellegű. Engedélyezi a gyors GPU-időt. Ez az opció arra kényszeríti a legtöbb játékot, hogy a legnagyobb natív felbontásban fusson. - + Use Vulkan pipeline cache Vulkan pipeline gyorsítótár használata. - - Enables GPU vendor-specific pipeline cache. -This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - - - - - Enable Compute Pipelines (Intel Vulkan Only) - - - - - Enable compute pipelines, required by some games. -This setting only exists for Intel proprietary drivers, and may crash if enabled. -Compute pipelines are always enabled on all other drivers. - - - - + Enable Reactive Flushing Reaktív ürítés használata - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Reaktív ürítést használ a prediktív ürítés helyett, ami pontosabb memóriaszinkronizálást tesz lehetővé. - + Sync to framerate of video playback Szinkronizálás a videolejátszás képkockasebességéhez - + Run the game at normal speed during video playback, even when the framerate is unlocked. A játék futtatása normál sebességgel videolejátszás közben, még akkor is, ha a képkockasebesség fel van oldva. - - Barrier feedback loops - - - - + Improves rendering of transparency effects in specific games. Javítja az átlátszósági effektek megjelenítését bizonyos játékokban. - - RNG Seed - - - - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. A véletlenszám-generátor magját vezérli. Főként speedrunning célokra használatos. - + Device Name Eszköznév - + The name of the emulated Switch. Az emulált Switch neve. - + Custom RTC Date: Egyéni RTC dátum: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Ez az opció lehetővé teszi a Switch emulált órájának megváltoztatását. Használható idő manipulálására játékokban. - + Language: Nyelv: - + Note: this can be overridden when region setting is auto-select Megjegyzés: ez felülírható, ha a régióbeállítás automatikus kiválasztású. - + Region: Régió: - + The region of the emulated Switch. Az emulált Switch régiója. - + Time Zone: Időzóna: - + The time zone of the emulated Switch. Az emulált Switch időzónája. - + Sound Output Mode: Hangkimeneti mód: - + Console Mode: Konzol mód: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1077,7 +994,7 @@ A játékok felbontása, részletei és támogatott vezérlői ennek a beállít A Kézi beállítás segíthet javítani a teljesítményt az alacsony teljesítményű rendszerek esetében. - + Prompt for user on game boot Felhasználói kérelem a játék indításakor @@ -1086,7 +1003,7 @@ A Kézi beállítás segíthet javítani a teljesítményt az alacsony teljesít Minden induláskor kérdezze meg a használni kívánt profilt, ez akkor lehet hasznos, ha több ember használja ugyanazt a számítógépet. - + Pause emulation when in background Emuláció szüneteltetése a háttérben @@ -1095,843 +1012,1036 @@ A Kézi beállítás segíthet javítani a teljesítményt az alacsony teljesít Ez a beállítás szünetelteti a yuzu-t, amíg más ablak van fókuszban. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Emuláció leállításának megerősítése - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Ez a beállítás felülbírálja a játék utasításait, amelyek megerősítést kérnek a játék leállításához. Az engedélyezése megkerüli az ilyen jellegű utasításokat, és közvetlenül kilép az emulációból. - + Hide mouse on inactivity Egér elrejtése inaktivitáskor - + This setting hides the mouse after 2.5s of inactivity. Ez a beállítás 2.5 másodperc inaktivitás után elrejti az egérmutatót. - + Disable controller applet Vezérlő applet letiltása - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Kényszeresen letiltja a vezérlő applet használatát a vendégek számára. Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Játékmód engedélyezése - + Custom frontend Egyéni frontend - + Real applet Valódi applet - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - + Conservative Takarékos - + Aggressive Aggresszív - + OpenGL OpenGL - + Vulkan Vulkan - + Null Null - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (Assembly Shaders, csak NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (kísérleti, csak AMD/Mesa) - + Normal Normál - + High Magas - + Extreme Extrém - + Auto Automatikus - + Accurate Pontos - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolution - - Area - - - - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + + Default Alapértelmezett - + + Net connect + + + + + Wifi web auth + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + Enables GPU vendor-specific pipeline cache. +This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. + + + + + Enable Compute Pipelines (Intel Vulkan Only) + + + + + Enable compute pipelines, required by some games. +This setting only exists for Intel proprietary drivers, and may crash if enabled. +Compute pipelines are always enabled on all other drivers. + + + + + Barrier feedback loops + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + RNG Seed + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1940,37 +2050,37 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul 8GB DRAM (Nem biztonságos) - + Docked Dokkolt - + Handheld Kézi - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá @@ -2298,27 +2408,27 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul Naplózás - + Open Log Location Naplózási hely megnyitása - + Global Log Filter Globális naplózási szűrő - + When checked, the max size of the log increases from 100 MB to 1 GB Ha be van jelölve, a napló maximális mérete 100 MB-ról 1 GB-ra nő. - + Enable Extended Logging** Bővített naplózás engedélyezése - + Show Log in Console Napló mutatása a Konzolban @@ -2464,7 +2574,7 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2526,7 +2636,7 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul **Ez automatikusan visszaáll, amikor a yuzu leáll. - + Web applet not compiled @@ -2576,7 +2686,7 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul - eden Configuration + Eden Configuration @@ -2585,88 +2695,88 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul Néhány beállítás csak akkor érhető el, amikor nem fut játék. - + Applets Appletek - - + + Audio Hang - - + + CPU CPU - + Debug Hibakeresés - + Filesystem Fájlrendszer - - + + General Általános - - + + Graphics Grafika - + GraphicsAdvanced Haladó grafika - + GraphicsExtensions - + Hotkeys Gyorsgombok - - + + Controls Irányítás - + Profiles Profilok - + Network Hálózat - - + + System Rendszer - + Game List Játéklista - + Web Web @@ -2764,51 +2874,45 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul - - - Reset Metadata Cache Metaadat gyorsítótár visszaállítása - + Select Emulated NAND Directory... Emulált NAND könyvtár kiválasztása... - + Select Emulated SD Directory... Emulált SD könyvtár kiválasztása... - + Select Gamecard Path... Játékkártya könyvtár kiválasztása... - + Select Dump Directory... Kimentési mappa kiválasztása... - + Select Mod Load Directory... Mod betöltő könyvtár kiválasztása... - The metadata cache is already empty. - A metaadat gyórsítótár már üres. + A metaadat gyórsítótár már üres. - The operation completed successfully. - A művelet sikeresen végrehajtva. + A művelet sikeresen végrehajtva. - The metadata cache couldn't be deleted. It might be in use or non-existent. - A metaadat gyórsítótárat nem lehetett törölni. Lehetséges, hogy használatban van, vagy nem létezik. + A metaadat gyórsítótárat nem lehetett törölni. Lehetséges, hogy használatban van, vagy nem létezik. @@ -2839,12 +2943,12 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Ez visszaállítja az összes beállítást és törli az összes játékonkénti konfigurációkat. Ez nem fogja kitörölni a játék könyvtárakat, profilokat, se a beviteli profilokat. Folytatja? @@ -2877,33 +2981,33 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul Háttérszín: - + % FSR sharpening percentage (e.g. 50%) % - + Off Ki - + VSync Off VSync Ki - + Recommended Ajánlott - + On Be - + VSync On VSync Be @@ -2940,14 +3044,18 @@ Ha egy vendég megpróbálja megnyitni a vezérlő appletet, az azonnal bezárul - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2979,75 +3087,75 @@ These settings are experimental, and may cause black screens. If your games fail Visszaállítás - + Action Akció - + Hotkey Gyorsgomb - + Controller Hotkey Vezérlő gyorsgomb - - - + + + Conflicting Key Sequence Ütköző kulcssorozat - - + + The entered key sequence is already assigned to: %1 A megadott kulcssorozat már hozzá van rendelve ehhez: %1 - + [waiting] [várakozás] - + Invalid Érvénytelen - + Invalid hotkey settings Érvénytelen gyorsbillentyű beállítások - + An error occurred. Please report this issue on github. Hiba történt. Kérjük, jelentsd ezt a problémát a GitHubon. - + Restore Default Alapértelmezés - + Clear Törlés - + Conflicting Button Sequence Ütköző gombsor - + The default button sequence is already assigned to: %1 Az alapértelmezett gombsor már hozzá van rendelve ehhez: %1 - + The default key sequence is already assigned to: %1 Az alapértelmezett kulcssorozat már hozzá van rendelve ehhez: %1 @@ -3367,7 +3475,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3522,7 +3630,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Bal kar @@ -3632,14 +3740,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3658,7 +3766,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plusz @@ -3671,15 +3779,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3724,7 +3832,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Jobb kar @@ -3739,242 +3847,242 @@ These settings are experimental, and may cause black screens. If your games fail Konfigurálás - - - - + + + + Clear Törlés - - - - - + + + + + [not set] [nincs beáll.] - - - + + + Invert button Fordított gomb - - + + Toggle button Gomb váltása - + Turbo button Turbó gomb - - + + Invert axis Fordított tengely - - - + + + Set threshold Küszöbérték beállítása - - + + Choose a value between 0% and 100% Válassz egy 0% és 100% közötti értéket - + Toggle axis Tengely váltása - + Set gyro threshold Gyro küszöbérték beállítása - + Calibrate sensor Szenzor kalibrálása - + Map Analog Stick - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Az OK megnyomása után először mozgasd a kart vízszintesen, majd függőlegesen. A tengely megfordításához mozgasd a kart először függőlegesen, majd vízszintesen. - + Center axis Középtengely - - + + Deadzone: %1% Holttér: %1% - - + + Modifier Range: %1% Módosító tartomány: %1% - - + + Pro Controller Pro kontroller - + Dual Joycons Dual Joycon - + Left Joycon Bal Joycon - + Right Joycon Jobb Joycon - + Handheld Kézi - + GameCube Controller GameCube kontroller - + Poke Ball Plus Poke Ball Plus - + NES Controller NES kontroller - + SNES Controller SNES kontroller - + N64 Controller N64 kontroller - + Sega Genesis Sega Genesis - + Start / Pause Indítás / Szünet - + Z Z - + Control Stick - + C-Stick - + Shake! Rázd! - + [waiting] [várakozás] - + New Profile Új profil - + Enter a profile name: Add meg a profil nevét: - - + + Create Input Profile Beviteli profil létrehozása - + The given profile name is not valid! A megadott profilnév érvénytelen! - + Failed to create the input profile "%1" A "%1" beviteli profilt nem sikerült létrehozni - + Delete Input Profile Beviteli profil törlése - + Failed to delete the input profile "%1" A "%1" beviteli profilt nem sikerült eltávolítani - + Load Input Profile Beviteli profil betöltése - + Failed to load the input profile "%1" A "%1" beviteli profilt nem sikerült betölteni - + Save Input Profile Beviteli profil mentése - + Failed to save the input profile "%1" A "%1" beviteli profilt nem sikerült elmenteni @@ -4031,7 +4139,7 @@ A tengely megfordításához mozgasd a kart először függőlegesen, majd vízs - + Configure Konfigurálás @@ -4067,7 +4175,7 @@ A tengely megfordításához mozgasd a kart először függőlegesen, majd vízs - + Test Teszt @@ -4086,7 +4194,7 @@ A tengely megfordításához mozgasd a kart először függőlegesen, majd vízs <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Tudj meg többet</span></a> - + %1:%2 %1:%2 @@ -4095,77 +4203,77 @@ A tengely megfordításához mozgasd a kart először függőlegesen, majd vízs yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters A port érvénytelen karaktereket tartalmaz - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 A portnak 0 és 65353 közötti tartományban kell lennie. - + IP address is not valid Érvénytelen IP-cím - + This UDP server already exists Ez az UDP szerver már létezik - + Unable to add more than 8 servers 8-nál több kiszolgálót nem lehet hozzáadni - + Testing Tesztelés - + Configuring Konfigurálás - + Test Successful Sikeres teszt - + Successfully received data from the server. Az adatok sikeresen beérkeztek a kiszolgálótól. - + Test Failed Sikertelen teszt - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nem lehetett érvényes adatot fogadni a szervertől. <br>Ellenőrizd, hogy a szerver megfelelően van-e beállítva, valamint a cím és a port helyes. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP tesztelés vagy a kalibrálás konfigurálása folyamatban van.<br>Kérjük, várj, amíg befejeződik. @@ -4292,7 +4400,12 @@ A jelenlegi érték %1% és %2%. Hálózati adapter - + + Enable Airplane Mode + + + + None Nincs @@ -4350,52 +4463,52 @@ A jelenlegi érték %1% és %2%. Néhány beállítás csak akkor érhető el, amikor nem fut játék. - + Add-Ons Kiegészítők - + System Rendszer - + CPU CPU - + Graphics Grafika - + Adv. Graphics Haladó graf. - + GPU Extensions - + Audio Hang - + Input Profiles Beviteli profilok - + Linux Linux - + Properties Tulajdonságok @@ -4413,12 +4526,12 @@ A jelenlegi érték %1% és %2%. Kiegészítők - + Patch Name Patch név - + Version Verzió @@ -4456,27 +4569,32 @@ A jelenlegi érték %1% és %2%. Kép beállítása - + + Select Avatar + + + + Add Hozzáadás - + Rename Átnevezés - + Remove Eltávolítás - + Profile management is available only when game is not running. A profilkezelés játék közben nem érhető el. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4484,100 +4602,189 @@ A jelenlegi érték %1% és %2%. %2 - + Enter Username Felhasználónév megadása - + Users Felhasználók - + Enter a username for the new user: Add meg az új felhasználó nevét: - + Enter a new username: Add meg az új felhasználóneved: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Felhasználói kép kiválasztása - - JPEG Images (*.jpg *.jpeg) - JPEG képek (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Nincs elérhető firmware + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG képek (*.jpg *.jpeg) + + + Error deleting image Hiba történt a kép törlése során - + Error occurred attempting to overwrite previous image at: %1. Hiba történt az előző kép felülírása során: %1. - + Error deleting file Hiba történt a fájl törlés során - + Unable to delete existing file: %1. A meglévő fájl törlése nem lehetséges: %1. - + Error creating user image directory Hiba történt a felhasználó kép könyvtárának létrehozásakor - + Unable to create directory %1 for storing user images. Nem sikerült létrehozni a(z) %1 könyvtárat a felhasználó képeinek tárolásához. - Error copying user image - Hiba történt a felhasználói kép másolásakor + Hiba történt a felhasználói kép másolásakor - Unable to copy image from %1 to %2 - Nem sikerült kimásolni a képet innen %1 ide %2 + Nem sikerült kimásolni a képet innen %1 ide %2 - Error resizing user image - Hiba történt a felhasználói kép átméretezésekor + Hiba történt a felhasználói kép átméretezésekor - Unable to resize image - A kép nem méretezhető át + A kép nem méretezhető át + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Mégse + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Törlöd a felhasználót? Minden felhasználói adat törölve lesz. - + Confirm Delete Törlés megerősítése - + Name: %1 UUID: %2 Név: %1 @@ -4630,7 +4837,7 @@ UUID: %2 - + Enable Engedélyezés @@ -4641,7 +4848,7 @@ UUID: %2 - + Not connected Nincs csatlakoztatva @@ -4651,63 +4858,63 @@ UUID: %2 Visszaállítás - + Clear Törlés - + [not set] [nincs beáll.] - + Invert axis Fordított tengely - - + + Deadzone: %1% Holttér: %1% - + Error enabling ring input Hiba a ring bemenet engedélyezésekor - + Direct Joycon driver is not enabled Direct Joycon illesztő nincs engedélyezve - + Configuring Konfigurálás - + The current mapped device doesn't support the ring controller A jelenleg hozzárendelt eszköz nem támogatja a ring vezérlőt. - + The current mapped device doesn't have a ring attached A jelenleg hozzárendelt eszközhöz nincs ring csatolva. - + The current mapped device is not connected A jelenleg hozzárendelt eszköz nincs csatlakoztatva - + Unexpected driver result %1 Váratlan illesztőprogram eredmény %1 - + [waiting] [várakozás] @@ -4749,7 +4956,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4801,12 +5008,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS konfigurálása - + Select TAS Load Directory... TAS betöltési könyvtár kiválasztása... @@ -4916,7 +5123,7 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5236,6 +5443,16 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu webszolgáltatás @@ -5245,42 +5462,29 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb A felhasználóneved és tokened megadásával hozzájárulsz ahhoz, hogy a yuzu további felhasználási adatokat gyűjtsön, melyek felhasználói azonosításra alkalmas információkat tartalmazhatnak. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Megerősítés + Megerősítés - Sign up - Regisztráció + Regisztráció - + Token: Token: - + Username: Felhasználónév: - What is my token? - Mi a tokenem? + Mi a tokenem? - + Web Service configuration can only be changed when a public room isn't being hosted. A webes szolgáltatás konfigurációja csak akkor módosítható, ha nincs nyilvános szoba megnyitva. @@ -5305,12 +5509,12 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb Helyreállítás - + Discord Presence Discord jelenlét - + Show Current Game in your Discord Status Jelenlegi játék megjelenítése a Discord állapotodban @@ -5319,24 +5523,8 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Tudj meg többet</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Regisztráció</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Regisztráció</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5359,10 +5547,9 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb Token nincs megerősítve. A változtatások nem lettek elmentve. - Unverified, please click Verify before saving configuration Tooltip - Nincs megerősítve, kattints a Megerősítés gombra mielőtt elmentenéd a konfigurációt + Nincs megerősítve, kattints a Megerősítés gombra mielőtt elmentenéd a konfigurációt Verifying... @@ -5386,20 +5573,67 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Sikertelen megerősítés. Győződj meg róla, hogy helyesen írtad be a tokened, és van internetkapcsolatod. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Kontroller P1 - + &Controller P1 &Kontroller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Verzió + + DirectConnect @@ -5505,7 +5739,12 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5513,11 +5752,6 @@ Húzd a pontokat a pozíció megváltoztatásához, vagy kattints duplán a táb The host of the room has banned you. Speak with the host to unban you or try a different room. A szoba házigazdája kitiltott téged. Beszélj a házigazdával, hogy feloldjon téged, vagy csatlakozz másik szobához. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5579,7 +5813,7 @@ Látogasd meg a Konfigurálás -> Rendszer -> Hálózat menüpontokat a be Telemetria - + Broken Vulkan Installation Detected Hibás Vulkan telepítés észlelve @@ -5588,869 +5822,866 @@ Látogasd meg a Konfigurálás -> Rendszer -> Hálózat menüpontokat a be A Vulkan inicializálása sikertelen volt az indulás során. <br><br>Kattints ide<a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>a probléma megoldásához szükséges instrukciókhoz</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Játék közben - + Loading Web Applet... Web applet betöltése... - - + + Disable Web Applet Web applet letiltása - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) A web applet letiltása nem kívánt viselkedéshez vezethet, és csak a Super Mario 3D All-Stars játékhoz ajánlott. Biztosan szeretnéd letiltani a web appletet? (Ezt újra engedélyezheted a Hibakeresés beállításokban.) - + The amount of shaders currently being built A jelenleg készülő árnyékolók mennyisége - + The current selected resolution scaling multiplier. A jelenleg kiválasztott felbontás skálázási aránya. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Jelenlegi emuláció sebessége. 100%-nál magasabb vagy alacsonyabb érték azt jelzi, hogy mennyivel gyorsabb vagy lassabb a Switch-nél. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. A másodpercenként megjelenített képkockák számát mutatja. Ez játékonként és jelenetenként eltérő lehet. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Egy Switch-kép emulálásához szükséges idő, képkockaszám-korlátozás és v-sync nélkül. Teljes sebességű emulálás esetén ennek legfeljebb 16.67 ms-nak kell lennie. - + Unmute Némítás feloldása - + Mute Némítás - + Reset Volume Hangerő visszaállítása - + &Clear Recent Files &Legutóbbi fájlok törlése - + &Continue &Folytatás - + &Pause &Szünet - Warning Outdated Game Format - Figyelmeztetés: Elavult játékformátum + Figyelmeztetés: Elavult játékformátum You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. A dekonstruált ROM könyvtár formátumot használod ehhez a játékhoz, ami egy elavult formátum, melyet már felváltottak más formátumok, mint pl. NCA, NAX, XCI vagy NSP. A dekonstruált ROM könyvtárak nem tartalmaznak ikonokat, metaadatokat és frissítési támogatást.<br><br>A yuzu által támogatott Switch formátumok ismertetéséhez <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>látogasd meg wikinket</a>. Ez az üzenet nem jelenik meg újra. - - + + Error while loading ROM! Hiba történt a ROM betöltése során! - + The ROM format is not supported. A ROM formátum nem támogatott. - + An error occurred initializing the video core. Hiba történt a videómag inicializálásakor. - + Error while loading ROM! %1 %1 signifies a numeric error code. Hiba történt a ROM betöltése során! %1 - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Ismeretlen hiba történt. Nyisd meg a logot a részletekért. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Szoftver bezárása... - + Save Data Mentett adat - + Mod Data Modolt adat - + Error Opening %1 Folder Hiba törént a(z) %1 mappa megnyitása során - - + + Folder does not exist! A mappa nem létezik! - Error Opening Transferable Shader Cache - Hiba az áthelyezhető árnyékoló gyorsítótár megnyitásakor + Hiba az áthelyezhető árnyékoló gyorsítótár megnyitásakor - Failed to create the shader cache directory for this title. - Nem sikerült létrehozni az árnyékoló gyorsítótár könyvtárat ehhez a játékhoz. + Nem sikerült létrehozni az árnyékoló gyorsítótár könyvtárat ehhez a játékhoz. - Error Removing Contents - Hiba történt a játéktartalom eltávolítása során + Hiba történt a játéktartalom eltávolítása során - Error Removing Update - Hiba történt a frissítés eltávolítása során + Hiba történt a frissítés eltávolítása során - Error Removing DLC - Hiba történt a DLC eltávolítása során + Hiba történt a DLC eltávolítása során - + Remove Installed Game Contents? Törlöd a telepített játéktartalmat? - + Remove Installed Game Update? Törlöd a telepített játékfrissítést? - + Remove Installed Game DLC? Törlöd a telepített DLC-t? - + Remove Entry Bejegyzés törlése - - - - - - Successfully Removed - Sikeresen eltávolítva + Sikeresen eltávolítva - Successfully removed the installed base game. - A telepített alapjáték sikeresen el lett távolítva. + A telepített alapjáték sikeresen el lett távolítva. - The base game is not installed in the NAND and cannot be removed. - Az alapjáték nincs telepítve a NAND-ra, ezért nem törölhető. + Az alapjáték nincs telepítve a NAND-ra, ezért nem törölhető. - Successfully removed the installed update. - A telepített frissítés sikeresen el lett távolítva. + A telepített frissítés sikeresen el lett távolítva. - There is no update installed for this title. - Nincs telepítve frissítés ehhez a játékhoz. + Nincs telepítve frissítés ehhez a játékhoz. - There are no DLC installed for this title. - Nincs telepítve DLC ehhez a játékhoz. + Nincs telepítve DLC ehhez a játékhoz. - Successfully removed %1 installed DLC. - %1 telepített DLC sikeresen eltávolítva. + %1 telepített DLC sikeresen eltávolítva. - + Delete OpenGL Transferable Shader Cache? Törlöd az OpenGL áthelyezhető shader gyorsítótárat? - + Delete Vulkan Transferable Shader Cache? Törlöd a Vulkan áthelyezhető shader gyorsítótárat? - + Delete All Transferable Shader Caches? Törlöd az összes áthelyezhető árnyékoló gyorsítótárat? - + Remove Custom Game Configuration? Törlöd az egyéni játék konfigurációt? - + Remove Cache Storage? Törlöd a gyorsítótárat? - + Remove File Fájl eltávolítása - + Remove Play Time Data Játékidő törlése - + Reset play time? Visszaállítod a játékidőt? - - Error Removing Transferable Shader Cache - Hiba az áthelyezhető árnyékoló gyorsítótár eltávolításakor + Hiba az áthelyezhető árnyékoló gyorsítótár eltávolításakor - - A shader cache for this title does not exist. - Ehhez a játékhoz nem létezik árnyékoló gyorsítótár. + Ehhez a játékhoz nem létezik árnyékoló gyorsítótár. - Successfully removed the transferable shader cache. - Az áthelyezhető árnyékoló gyorsítótár sikeresen eltávolítva. + Az áthelyezhető árnyékoló gyorsítótár sikeresen eltávolítva. - Failed to remove the transferable shader cache. - Nem sikerült eltávolítani az áthelyezhető árnyékoló gyorsítótárat. + Nem sikerült eltávolítani az áthelyezhető árnyékoló gyorsítótárat. - Error Removing Vulkan Driver Pipeline Cache - Hiba a Vulkan driver pipeline gyorsítótár eltávolításakor + Hiba a Vulkan driver pipeline gyorsítótár eltávolításakor - - Failed to remove the driver pipeline cache. - - - - - Error Removing Transferable Shader Caches - Hiba az áthelyezhető árnyékoló gyorsítótár eltávolításakor + Hiba az áthelyezhető árnyékoló gyorsítótár eltávolításakor - Successfully removed the transferable shader caches. - Az áthelyezhető shader gyorsítótár sikeresen eltávolítva. + Az áthelyezhető shader gyorsítótár sikeresen eltávolítva. - Failed to remove the transferable shader cache directory. - Nem sikerült eltávolítani az áthelyezhető árnyékoló gyorsítótár könyvtárat. + Nem sikerült eltávolítani az áthelyezhető árnyékoló gyorsítótár könyvtárat. - - Error Removing Custom Configuration - Hiba történt az egyéni konfiguráció törlése során + Hiba történt az egyéni konfiguráció törlése során - A custom configuration for this title does not exist. - Nem létezik egyéni konfiguráció ehhez a játékhoz. + Nem létezik egyéni konfiguráció ehhez a játékhoz. - Successfully removed the custom game configuration. - Egyéni játék konfiguráció sikeresen eltávolítva. + Egyéni játék konfiguráció sikeresen eltávolítva. - Failed to remove the custom game configuration. - Nem sikerült eltávolítani az egyéni játék konfigurációt. + Nem sikerült eltávolítani az egyéni játék konfigurációt. - - + + RomFS Extraction Failed! RomFS kicsomagolása sikertelen! - + There was an error copying the RomFS files or the user cancelled the operation. Hiba történt a RomFS fájlok másolása közben, vagy a felhasználó megszakította a műveletet. - + Full Teljes - + Skeleton Szerkezet - + Select RomFS Dump Mode RomFS kimentési mód kiválasztása - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Nincs elég hely a RomFS kibontásához itt: %1. Szabadítsd fel helyet, vagy válassz egy másik kimentési könyvtárat az Emuláció > Konfigurálás > Rendszer > Fájlrendszer > Kimentési gyökér menüpontban. - + Extracting RomFS... RomFS kicsomagolása... - - - - - + + Cancel Mégse - + RomFS Extraction Succeeded! RomFS kibontása sikeres volt! - - - + The operation completed successfully. A művelet sikeresen végrehajtva. - Integrity verification couldn't be performed! - Az integritás ellenőrzését nem lehetett elvégezni! + Az integritás ellenőrzését nem lehetett elvégezni! - File contents were not checked for validity. - A fájl tartalmának érvényessége nem lett ellenőrizve. + A fájl tartalmának érvényessége nem lett ellenőrizve. - - Verifying integrity... - Integritás ellenőrzése... + Integritás ellenőrzése... - - Integrity verification succeeded! - Integritás ellenőrzése sikeres! + Integritás ellenőrzése sikeres! - - Integrity verification failed! - Az integritás ellenőrzése sikertelen! + Az integritás ellenőrzése sikertelen! - File contents may be corrupt. - A fájl tartalma sérült lehet. + A fájl tartalma sérült lehet. - - - - Create Shortcut - Parancsikon létrehozása + Parancsikon létrehozása - Do you want to launch the game in fullscreen? - Szeretnéd teljes képernyőn elindítani a játékot? + Szeretnéd teljes képernyőn elindítani a játékot? - Successfully created a shortcut to %1 - Parancsikon sikeresen létrehozva ide %1 + Parancsikon sikeresen létrehozva ide %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Ez létrehoz egy parancsikont az aktuális AppImage-hez. Frissítés után nem garantált a helyes működése. Folytatod? + Ez létrehoz egy parancsikont az aktuális AppImage-hez. Frissítés után nem garantált a helyes működése. Folytatod? - Failed to create a shortcut to %1 - Nem sikerült létrehozni a parancsikont: %1 + Nem sikerült létrehozni a parancsikont: %1 - Create Icon - Ikon létrehozása + Ikon létrehozása - Cannot create icon file. Path "%1" does not exist and cannot be created. - Nem hozható létre az ikonfájl. Az útvonal "%1" nem létezik és nem is hozható létre. + Nem hozható létre az ikonfájl. Az útvonal "%1" nem létezik és nem is hozható létre. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Hiba a %1 megnyitásakor - + Select Directory Könyvtár kiválasztása - + Properties Tulajdonságok - + The game properties could not be loaded. A játék tulajdonságait nem sikerült betölteni. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch állományok(%1);;Minden fájl (*.*) - + Load File Fájl betöltése - + Open Extracted ROM Directory Kicsomagolt ROM könyvár megnyitása - + Invalid Directory Selected Érvénytelen könyvtár kiválasztva - + The directory you have selected does not contain a 'main' file. A kiválasztott könyvtár nem tartalmaz 'main' fájlt. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Telepíthető Switch fájl (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Fájlok telepítése - + %n file(s) remaining %n fájl van hátra + %n fájl van hátra - + Installing file "%1"... "%1" fájl telepítése... - - + + Install Results Telepítés eredménye - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. A lehetséges konfliktusok elkerülése érdekében nem javasoljuk a felhasználóknak, hogy a NAND-ra telepítsék az alapjátékokat. Kérjük, csak frissítések és DLC-k telepítéséhez használd ezt a funkciót. - + %n file(s) were newly installed - %n fájl lett frissen telepítve - + %n fájl lett frissen telepítve + %n fájl lett frissen telepítve - + %n file(s) were overwritten - %n fájl lett felülírva - + %n fájl lett felülírva + %n fájl lett felülírva - + %n file(s) failed to install %n fájl telepítése sikertelen + %n fájl telepítése sikertelen - + System Application Rendszeralkalmazás - + System Archive Rendszerarchívum - + System Application Update Rendszeralkalmazás frissítés - + Firmware Package (Type A) Firmware csomag (A típus) - + Firmware Package (Type B) Firmware csomag (B típus) - + Game Játék - + Game Update Játékfrissítés - + Game DLC Játék DLC - + Delta Title - + Select NCA Install Type... NCA telepítési típus kiválasztása... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Kérjük, válaszd ki, hogy milyen típusú címként szeretnéd telepíteni ezt az NCA-t: (A legtöbb esetben az alapértelmezett "Játék" megfelelő.) - + Failed to Install Nem sikerült telepíteni - + The title type you selected for the NCA is invalid. Az NCA-hoz kiválasztott címtípus érvénytelen. - + File not found Fájl nem található - + File "%1" not found "%1" fájl nem található - + OK OK - - + + Hardware requirements not met A hardverkövetelmények nem teljesülnek - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Az eszközöd nem felel meg az ajánlott hardverkövetelményeknek. A kompatibilitás jelentése letiltásra került. - + Missing yuzu Account Hiányzó yuzu fiók - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. A játék kompatibilitási teszteset beküldéséhez csatolnod kell a yuzu fiókodat.<br><br/>A yuzu fiókod csatolásához menj az Emuláció &gt; Konfigurálás &gt; Web menüpontra. - + Error opening URL Hiba történt az URL megnyitása során - + Unable to open the URL "%1". Hiba történt az URL megnyitása során: "%1". - + TAS Recording TAS felvétel - + Overwrite file of player 1? Felülírod az 1. játékos fájlját? - + Invalid config detected Érvénytelen konfig észlelve - + Handheld controller can't be used on docked mode. Pro controller will be selected. A kézi vezérlés nem használható dokkolt módban. Helyette a Pro kontroller lesz kiválasztva. - - + + Amiibo Amiibo - - + + The current amiibo has been removed A jelenlegi amiibo el lett távolítva - + Error Hiba - - + + The current game is not looking for amiibos A jelenlegi játék nem keres amiibo-kat - + Amiibo File (%1);; All Files (*.*) Amiibo fájl (%1);; Minden fájl (*.*) - + Load Amiibo Amiibo betöltése - + Error loading Amiibo data Amiibo adatok betöltése sikertelen - + The selected file is not a valid amiibo A kiválasztott fájl nem érvényes amiibo - + The selected file is already on use A kiválasztott fájl már használatban van - + An unknown error occurred Ismeretlen hiba történt - - Verification failed for the following files: %1 - Az alábbi fájlok ellenőrzése sikertelen volt: + Az alábbi fájlok ellenőrzése sikertelen volt: %1 - + + Keys not installed Nincsenek telepítve kulcsok @@ -6459,273 +6690,234 @@ Would you like to bypass this and exit anyway? Telepítsd a visszafejtési kulcsokat, majd indítsd újra a yuzut, mielőtt megpróbálnád telepíteni a firmware-t. - + Select Dumped Firmware Source Location Kimentett Firmware célhelyének kiválasztása - Installing Firmware... - Firmware telepítése... + Firmware telepítése... - - - - Firmware install failed - Firmware telepítése sikertelen + Firmware telepítése sikertelen - Unable to locate potential firmware NCA files - Nem találhatóak potenciális firmware NCA fájlok + Nem találhatóak potenciális firmware NCA fájlok - Failed to delete one or more firmware file. - Nem sikerült törölni egy vagy több firmware fájlt. + Nem sikerült törölni egy vagy több firmware fájlt. Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. A firmware telepítése megszakadt, előfordulhat, hogy a firmware hibás. Indítsd újra a yuzu-t vagy telepítsd újra a firmware-t. - One or more firmware files failed to copy into NAND. - Egy vagy több firmware fájlt nem sikerült átmásolni a NAND-ba. + Egy vagy több firmware fájlt nem sikerült átmásolni a NAND-ba. - Firmware integrity verification failed! - Firmware integritás ellenőrzése sikertelen! + Firmware integritás ellenőrzése sikertelen! - Select Dumped Keys Location - Kimentett kulcsok helyének kiválasztása + Kimentett kulcsok helyének kiválasztása - - - Decryption Keys install failed - A visszafejtési kulcsok telepítése sikertelen volt + A visszafejtési kulcsok telepítése sikertelen volt - prod.keys is a required decryption key file. - A prod.keys egy szükséges dekódoló kulcsfájl. + A prod.keys egy szükséges dekódoló kulcsfájl. - One or more keys failed to copy. - Egy vagy több kulcs másolása sikertelen. + Egy vagy több kulcs másolása sikertelen. - Decryption Keys install succeeded - A visszafejtési kulcsok telepítése sikeres volt. + A visszafejtési kulcsok telepítése sikeres volt. - Decryption Keys were successfully installed - A visszafejtési kulcsok sikeresen telepítve lettek + A visszafejtési kulcsok sikeresen telepítve lettek - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - A visszafejtési kulcsok inicializálása sikertelen. Ellenőrizd, hogy a kimentési eszközeid (dumping tools) naprakészek, és mentsd ki a kulcsokat újra. + A visszafejtési kulcsok inicializálása sikertelen. Ellenőrizd, hogy a kimentési eszközeid (dumping tools) naprakészek, és mentsd ki a kulcsokat újra. - - - - - - - + + + + + + No firmware available Nincs elérhető firmware - Please install the firmware to use the Album applet. - Kérjük, telepítsd a firmware-t az Album applet használatához. + Kérjük, telepítsd a firmware-t az Album applet használatához. - + Album Applet Album applet - + Album applet is not available. Please reinstall firmware. Album applet nem elérhető. Kérjük, telepítsd újra a firmware-t. - Please install the firmware to use the Cabinet applet. - Kérjük, telepítsd a firmware-t a kabinet applet használatához. + Kérjük, telepítsd a firmware-t a kabinet applet használatához. - + Cabinet Applet Kabinet applet - + Cabinet applet is not available. Please reinstall firmware. Kabinet applet nem elérhető. Kérjük, telepítsd újra a firmware-t. - Please install the firmware to use the Mii editor. - Kérjük, telepítsd a firmware-t a Mii-szerkesztő használatához. + Kérjük, telepítsd a firmware-t a Mii-szerkesztő használatához. - + Mii Edit Applet Mii szerkesztő applet - + Mii editor is not available. Please reinstall firmware. A Mii szerkesztő nem elérhető. Kérjük, telepítsd újra a firmware-t. - Please install the firmware to use the Controller Menu. - Kérjük, telepítsd a firmware-t a vezérlő menü használatához. + Kérjük, telepítsd a firmware-t a vezérlő menü használatához. - + Controller Applet Vezérlő applet - + Controller Menu is not available. Please reinstall firmware. A vezérlő menü nem érhető el. Kérjük, telepítsd újra a firmware-t. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Képernyőkép készítése - + PNG Image (*.png) PNG kép (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS állapot: %1/%2 futtatása - + TAS state: Recording %1 TAS állapot: %1 felvétele - + TAS state: Idle %1/%2 TAS állapot: Tétlen %1/%2 - + TAS State: Invalid TAS állapot: Érvénytelen - + &Stop Running &Futás leállítása - + &Start &Indítás - + Stop R&ecording F&elvétel leállítása - + R&ecord F&elvétel - + Building: %n shader(s) Létrehozás: %n árnyékoló + Létrehozás: %n árnyékoló - + Scale: %1x %1 is the resolution scaling factor Skálázás: %1x - + Speed: %1% / %2% Sebesség: %1% / %2% - + Speed: %1% Sebesség: %1% @@ -6734,44 +6926,44 @@ Would you like to download it? Játék: %1 FPS (Feloldva) - + Game: %1 FPS Játék: %1 FPS - + Frame: %1 ms Képkocka: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA Nincs élsimítás - + VOLUME: MUTE HANGERŐ: NÉMÍTVA - + VOLUME: %1% Volume percentage (e.g. 50%) HANGERŐ: %1% - + Derivation Components Missing @@ -6780,12 +6972,12 @@ Would you like to download it? Hiányzó titkosítókulcsok.<br>Kérjük, kövesd <a href='https://yuzu-emu.org/help/quickstart/'>a yuzu gyorstájékoztatót</a>a kulcsok, firmware és játékok beszerzéséhez. - + Select RomFS Dump Target RomFS kimentési cél kiválasztása - + Please select which RomFS you would like to dump. Kérjük, válaszd ki melyik RomFS-t szeretnéd kimenteni. @@ -6798,7 +6990,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Biztos le akarod állítani az emulációt? Minden nem mentett adat el fog veszni. @@ -6811,102 +7003,102 @@ Would you like to bypass this and exit anyway? Mégis ki szeretnél lépni? - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Nearest Legközelebbi - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + ScaleForce ScaleForce - + Area - + Docked Dokkolt - + Handheld Kézi - + Normal Normál - + High Magas - + Extreme Extrém - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6914,44 +7106,44 @@ Mégis ki szeretnél lépni? GRenderWindow - - + + OpenGL not available! OpenGL nem elérhető! - + OpenGL shared contexts are not supported. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Hiba történt az OpenGL inicializálása során! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Lehetséges, hogy a GPU-d nem támogatja az OpenGL-t, vagy nem a legfrissebb grafikus illesztőprogram van telepítve. - + Error while initializing OpenGL 4.6! Hiba történt az OpenGL 4.6 inicializálása során! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Lehetséges, hogy a GPU-d nem támogatja az OpenGL 4.6-ot, vagy nem a legfrissebb grafikus illesztőprogram van telepítve.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Előfordulhat, hogy a GPU-d nem támogat egy vagy több szükséges OpenGL kiterjesztést. Győződj meg róla, hogy a legújabb videokártya-illesztőprogramot használod.<br><br>GL Renderer:<br>%1<br><br>Nem támogatott kiterjesztések:<br>%2 @@ -6959,128 +7151,128 @@ Mégis ki szeretnél lépni? GameList - + Favorite Kedvenc - + Start Game Játék indítása - + Start Game without Custom Configuration Játék indítása egyéni konfiguráció nélkül - + Open Save Data Location Mentett adatok helyének megnyitása - + Open Mod Data Location Modadatok helyének megnyitása - + Open Transferable Pipeline Cache Áthelyezhető pipeline gyorsítótár megnyitása - + Remove Eltávolítás - + Remove Installed Update Telepített frissítés eltávolítása - + Remove All Installed DLC Összes telepített DLC eltávolítása - + Remove Custom Configuration Egyéni konfiguráció eltávolítása - + Remove Play Time Data Játékidő törlése - + Remove Cache Storage Gyorsítótár ürítése - + Remove OpenGL Pipeline Cache OpenGL Pipeline gyorsítótár eltávolítása - + Remove Vulkan Pipeline Cache Vulkan pipeline gyorsítótár eltávolítása - + Remove All Pipeline Caches Az összes Pipeline gyorsítótár törlése - + Remove All Installed Contents Összes telepített tartalom törlése - + Dump RomFS RomFS kimentése - + Dump RomFS to SDMC RomFS kimentése SDMC-re - + Verify Integrity Integritás ellenőrzése - + Copy Title ID to Clipboard Játék címének vágólapra másolása - + Navigate to GameDB entry GameDB bejegyzéshez navigálás - + Create Shortcut Parancsikon létrehozása - + Add to Desktop Asztalhoz adás - + Add to Applications Menu Alkalmazások menühöz adás - + Configure Game @@ -7089,62 +7281,62 @@ Mégis ki szeretnél lépni? Tulajdonságok - + Scan Subfolders Almappák szkennelése - + Remove Game Directory Játékkönyvtár eltávolítása - + ▲ Move Up ▲ Feljebb mozgatás - + ▼ Move Down ▼ Lejjebb mozgatás - + Open Directory Location Könyvtár helyének megnyitása - + Clear Törlés - + Name Név - + Compatibility Kompatibilitás - + Add-ons Kiegészítők - + File type Fájltípus - + Size Méret - + Play time Játékidő @@ -7152,62 +7344,62 @@ Mégis ki szeretnél lépni? GameListItemCompat - + Ingame Játékban - + Game starts, but crashes or major glitches prevent it from being completed. A játék elindul, de összeomlik, vagy súlyos hibák miatt nem fejezhető be. - + Perfect Tökéletes - + Game can be played without issues. A játék problémamentesen játszható. - + Playable Játszható - + Game functions with minor graphical or audio glitches and is playable from start to finish. A játék kisebb grafikai- és hanghibákkal végigjátszható. - + Intro/Menu Bevezető/Menü - + Game loads, but is unable to progress past the Start Screen. A játék betölt, de nem jut tovább a Kezdőképernyőn. - + Won't Boot Nem indul - + The game crashes when attempting to startup. A játék összeomlik indításkor. - + Not Tested Nem tesztelt - + The game has not yet been tested. Ez a játék még nem lett tesztelve. @@ -7215,7 +7407,7 @@ Mégis ki szeretnél lépni? GameListPlaceholder - + Double-click to add a new folder to the game list Dupla kattintással új mappát adhatsz hozzá a játéklistához. @@ -7223,19 +7415,20 @@ Mégis ki szeretnél lépni? GameListSearchField - + %1 of %n result(s) %1 a(z) %n találatból + %1 a(z) %n találatból - + Filter: Szűrés: - + Enter pattern to filter Adj meg egy mintát a szűréshez @@ -7317,7 +7510,7 @@ Mégis ki szeretnél lépni? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7331,91 +7524,91 @@ Hibakereső üzenet: Hotkeys - + Audio Mute/Unmute Hang némítása/feloldása - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Főablak - + Audio Volume Down Hangerő csökkentése - + Audio Volume Up Hangerő növelése - + Capture Screenshot Képernyőkép készítése - + Change Adapting Filter Ablakadaptív szűrő módosítása - + Change Docked Mode Dokkolt mód módosítása - + Change GPU Accuracy GPU pontosság módosítása - + Configure Konfigurálás - + Configure Current Game - + Continue/Pause Emulation Emuláció folytatása/szüneteltetése - + Exit Fullscreen Kilépés a teljes képernyőből @@ -7424,97 +7617,97 @@ Hibakereső üzenet: Kilépés a yuzuból - - Exit eden + + Exit Eden - + Fullscreen Teljes képernyő - + Load File Fájl betöltése - + Load/Remove Amiibo Amiibo betöltése/törlése - + Multiplayer Browse Public Game Lobby Multiplayer nyilvános játéklobbi böngészése - + Multiplayer Create Room Multiplayer szoba létrehozása - + Multiplayer Direct Connect to Room Multiplayer közvetlen kapcsolódás szobához - + Multiplayer Leave Room Multiplayer szoba elhagyása - + Multiplayer Show Current Room Multiplayer jelenlegi szoba megjelenítése - + Restart Emulation Emuláció újraindítása - + Stop Emulation Emulácíó leállítása - + TAS Record TAS felvétel - + TAS Reset TAS visszaállítása - + TAS Start/Stop TAS indítása/leállítása - + Toggle Filter Bar Szűrősáv kapcsoló - + Toggle Framerate Limit Képfrissítési korlát kapcsoló - + Toggle Mouse Panning Egérpásztázás kapcsoló - + Toggle Renderdoc Capture Renderdoc felvétel kapcsoló - + Toggle Status Bar Állapotsáv kapcsoló @@ -7522,22 +7715,22 @@ Hibakereső üzenet: InstallDialog - + Please confirm these are the files you wish to install. Kérjük, erősítsd meg, hogy ezeket a fájlokat szeretnéd telepíteni. - + Installing an Update or DLC will overwrite the previously installed one. Egy frissítés vagy DLC telepítése felülírja a korábban telepítettet. - + Install Telepítés - + Install Files to NAND Fájlok telepítése a NAND-ra @@ -7545,7 +7738,7 @@ Hibakereső üzenet: LimitableInputDialog - + The text can't contain any of the following characters: %1 A szöveg nem tartalmazhatja a következő karakterek egyikét sem: @@ -7692,152 +7885,207 @@ Hibakereső üzenet: &Legutóbbi fájlok - + + Open &Eden Folders + + + + &Emulation &Emuláció - + &View &Nézet - + &Reset Window Size &Ablakméret visszaállítása - + &Debugging &Hibakeresés - + Reset Window Size to &720p Ablakfelbontás visszaállítása erre: &720p - + Reset Window Size to 720p Ablakfelbontás visszaállítása 720p-re - + Reset Window Size to &900p Ablakfelbontás visszaállítása erre: &900p - + Reset Window Size to 900p Ablakfelbontás visszaállítása 900p-re - + Reset Window Size to &1080p Ablakfelbontás visszaállítása erre: &1080p - + Reset Window Size to 1080p Ablakfelbontás visszaállítása 1080p-re - + &Multiplayer &Multiplayer - + &Tools &Eszközök - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Segítség - + &Install Files to NAND... &Fájlok telepítése a NAND-ra... - + L&oad File... F&ájl betöltése... - + Load &Folder... &Mappa betöltése... - + E&xit K&ilépés - + &Pause &Szünet - + &Stop &Leállítás - + &Verify Installed Contents &Telepített tartalom ellenőrzése - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7846,97 +8094,97 @@ Hibakereső üzenet: &A yuzuról - + Single &Window Mode &Egyablakos mód - + Con&figure... Kon&figurálás... - + Ctrl+, - + Display D&ock Widget Headers D&ock Widget fejlécek megjelenítése - + Show &Filter Bar &Szűrősáv mutatása - + Show &Status Bar &Állapotsáv mutatása - + Show Status Bar Állapotsáv mutatása - + &Browse Public Game Lobby &Nyilvános játéklobbi böngészése - + &Create Room &Szoba létrehozása - + &Leave Room &Szoba elhagyása - + &Direct Connect to Room &Közvetlen csatlakozás szobához - + &Show Current Room &Jelenlegi szoba megjelenítése - + F&ullscreen T&eljes képernyő - + &Restart &Újraindítás - + Load/Remove &Amiibo... &Amiibo betöltése/törlése... - + &Report Compatibility &Kompatibilitás jelentése - + Open &Mods Page &Modok oldal megnyitása - + Open &Quickstart Guide &Gyorstájékoztató megnyitása - + &FAQ &GYIK @@ -7945,77 +8193,82 @@ Hibakereső üzenet: &yuzu mappa megnyitása - + &Capture Screenshot &Képernyőkép készítése - + Open &Album &Album megnyitása - + &Set Nickname and Owner &Becenév és tulajdonos beállítása - + &Delete Game Data &Játékadatok törlése - + &Restore Amiibo &Amiibo helyreállítása - + &Format Amiibo &Amiibo formázása - + Open &Mii Editor &Mii szerkesztő megnyitása - + &Configure TAS... &TAS konfigurálása... - + Configure C&urrent Game... J&elenlegi játék konfigurálása... - + &Start &Indítás - + &Reset &Visszaállítás - + R&ecord F&elvétel - + Open &Controller Menu &Vezérlő menü megnyitása - + Install Firmware Firmware telepítése - + + &About Eden + + + + Install Decryption Keys Visszafejtési kulcsok telepítése @@ -8023,26 +8276,36 @@ Hibakereső üzenet: MicroProfileDialog - &MicroProfile - &Mikroprofil + &Mikroprofil MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8102,37 +8365,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Jelenlegi kapcsolat állapota - + Not Connected. Click here to find a room! Nincs csatlakozva. Kattints ide a szobák kereséséhez. - + Not Connected Nincs csatlakozva - + Connected Csatlakozva - + New Messages Received Új üzenetek érkeztek - + Error Hiba - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Nem sikerült frissíteni a szoba adatait. Kérjük, ellenőrizd az internetkapcsolatod, és próbáld újra a szoba létrehozását. @@ -8324,56 +8587,56 @@ p, li { white-space: pre-wrap; } Nincs játékban - + Installed SD Titles Telepített SD játékok - + Installed NAND Titles Telepített NAND játékok - + System Titles Rendszercímek - + Add New Game Directory Új játékkönyvtár hozzáadása - + Favorites Kedvencek - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [nincs beáll.] @@ -8384,14 +8647,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + Axis %1%2 Tengely %1%2 @@ -8402,357 +8665,357 @@ p, li { white-space: pre-wrap; } Gomb %1 - - - - - - + + + + + + [unknown] [ismeretlen] - - - + + + Left Balra - - - + + + Right Jobbra - - - + + + Down Le - - - + + + Up Fel - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Kör - - + + Cross Kereszt - - + + Square Négyzet - - + + Triangle Háromszög - - + + Share Megosztás - - + + Options Opciók - - + + [undefined] [nem definiált] - + %1%2 %1%2 - - + + [invalid] [érvénytelen] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 %1%2Tengely %3 - - + + %1%2Axis %3,%4,%5 %1%2Tengely %3,%4,%5 - - + + %1%2Motion %3 - - + + %1%2Button %3 %1%2Gomb %3 - - + + [unused] [nem használt] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Kar L - + Stick R Kar R - + Plus Plusz - + Minus Mínusz - - + + Home Home - + Capture Rögzítés - + Touch Érintés - + Wheel Indicates the mouse wheel - + Backward Hátra - + Forward Előre - + Task Feladat - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 %1%2%3Tengely %4 - - + + %1%2%3Button %4 %1%2%3Gomb %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8870,6 +9133,300 @@ p, li { white-space: pre-wrap; } Szeretnéd visszaállítani ezt az amiibót? + + QtCommon::Content + + + Installing Firmware... + Firmware telepítése... + + + + + + Cancel + Mégse + + + + Firmware integrity verification failed! + Firmware integritás ellenőrzése sikertelen! + + + + + Verification failed for the following files: + +%1 + Az alábbi fájlok ellenőrzése sikertelen volt: + +%1 + + + + + Verifying integrity... + Integritás ellenőrzése... + + + + + Integrity verification succeeded! + Integritás ellenőrzése sikeres! + + + + + The operation completed successfully. + A művelet sikeresen végrehajtva. + + + + + Integrity verification failed! + Az integritás ellenőrzése sikertelen! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + Kimentett kulcsok helyének kiválasztása + + + + Decryption Keys install succeeded + A visszafejtési kulcsok telepítése sikeres volt. + + + + Decryption Keys were successfully installed + A visszafejtési kulcsok sikeresen telepítve lettek + + + + Decryption Keys install failed + A visszafejtési kulcsok telepítése sikertelen volt + + + + QtCommon::Game + + + Error Removing Contents + Hiba történt a játéktartalom eltávolítása során + + + + Error Removing Update + Hiba történt a frissítés eltávolítása során + + + + Error Removing DLC + Hiba történt a DLC eltávolítása során + + + + The base game is not installed in the NAND and cannot be removed. + Az alapjáték nincs telepítve a NAND-ra, ezért nem törölhető. + + + + There is no update installed for this title. + Nincs telepítve frissítés ehhez a játékhoz. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Sikeresen eltávolítva + + + + Successfully removed %1 installed DLC. + %1 telepített DLC sikeresen eltávolítva. + + + + + Error Removing Transferable Shader Cache + Hiba az áthelyezhető árnyékoló gyorsítótár eltávolításakor + + + + + A shader cache for this title does not exist. + Ehhez a játékhoz nem létezik árnyékoló gyorsítótár. + + + + Successfully removed the transferable shader cache. + Az áthelyezhető árnyékoló gyorsítótár sikeresen eltávolítva. + + + + Failed to remove the transferable shader cache. + Nem sikerült eltávolítani az áthelyezhető árnyékoló gyorsítótárat. + + + + Error Removing Vulkan Driver Pipeline Cache + Hiba a Vulkan driver pipeline gyorsítótár eltávolításakor + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + Hiba az áthelyezhető árnyékoló gyorsítótár eltávolításakor + + + + Successfully removed the transferable shader caches. + Az áthelyezhető shader gyorsítótár sikeresen eltávolítva. + + + + Failed to remove the transferable shader cache directory. + Nem sikerült eltávolítani az áthelyezhető árnyékoló gyorsítótár könyvtárat. + + + + + Error Removing Custom Configuration + Hiba történt az egyéni konfiguráció törlése során + + + + A custom configuration for this title does not exist. + Nem létezik egyéni konfiguráció ehhez a játékhoz. + + + + Successfully removed the custom game configuration. + Egyéni játék konfiguráció sikeresen eltávolítva. + + + + Failed to remove the custom game configuration. + Nem sikerült eltávolítani az egyéni játék konfigurációt. + + + + Reset Metadata Cache + Metaadat gyorsítótár visszaállítása + + + + The metadata cache is already empty. + A metaadat gyórsítótár már üres. + + + + The operation completed successfully. + A művelet sikeresen végrehajtva. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + A metaadat gyórsítótárat nem lehetett törölni. Lehetséges, hogy használatban van, vagy nem létezik. + + + + Create Shortcut + Parancsikon létrehozása + + + + Do you want to launch the game in fullscreen? + Szeretnéd teljes képernyőn elindítani a játékot? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Parancsikon sikeresen létrehozva ide %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Ez létrehoz egy parancsikont az aktuális AppImage-hez. Frissítés után nem garantált a helyes működése. Folytatod? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Nem sikerült létrehozni a parancsikont: %1 + + + + Create Icon + Ikon létrehozása + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Nem hozható létre az ikonfájl. Az útvonal "%1" nem létezik és nem is hozható létre. + + + + No firmware available + Nincs elérhető firmware + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9165,7 +9722,7 @@ Kérjük, próbáld újra, vagy lépj kapcsolatba a szoftver fejlesztőjével. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9173,7 +9730,7 @@ Kérjük, próbáld újra, vagy lépj kapcsolatba a szoftver fejlesztőjével. - + Users Felhasználók @@ -9297,7 +9854,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack @@ -9305,12 +9862,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread nem vár egy szálra sem @@ -9318,102 +9875,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable futtatható - + paused szünetel - + sleeping alszik - + waiting for IPC reply IPC válaszra várakozás - + waiting for objects várakozás objektumokra - + waiting for condition variable várakozás állapotváltozóra - + waiting for address arbiter várakozás címkiosztásra - + waiting for suspend resume várakozás felfüggesztés folytatására - + waiting várakozás - + initialized inicializált - + terminated megszakítva - + unknown ismeretlen - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideális - + core %1 mag %1 - + processor = %1 processzor = %1 - + affinity mask = %1 affinitás maszk = %1 - + thread id = %1 szál azonosító = %1 - + priority = %1(current) / %2(normal) prioritás = %1(jelenleg) / %2(normál) - + last running ticks = %1 utolsó futó tickek = %1 @@ -9421,7 +9978,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread szálra várakozás @@ -9429,7 +9986,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Várófa diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 18bfadbf91..e70c012897 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Menghubungkan ke server... - + Cancel Batalkan - + Touch the top left corner <br>of your touchpad. Sentuh pojok kiri atas <br>dari touchpad kamu. - + Now touch the bottom right corner <br>of your touchpad. Sekarang sentuh pojok kanan bawah <br>dari touchpad kamu. - + Configuration completed! Konfigurasi selesai! - + OK OK @@ -397,134 +397,134 @@ Ini akan melarang nama pengguna forum mereka dan alamat IP mereka. ConfigurationShared - + % % - + Amiibo editor Pengubah Amiibo - + Controller configuration Konfigurasi pengontrol - + Data erase Hapus data - + Error Kesalahan - + Net connect Koneksi Terhubung - + Player select Pemain pilih - + Software keyboard Papan Ketik Perangkat Lunak - + Mii Edit Ubah Mii - + Online web Online web - + Shop Belanja - + Photo viewer Pemutar foto - + Offline web Offline web - + Login share Login berbagi - + Wifi web auth Otentikasi web Wifi - + My page Halaman saya - + Output Engine: Mesin Keluaran: - + Output Device: Perangkat Output: - + Input Device: Perangkat Masukan. - + Mute audio Matikan audio - + Volume: Volume: - + Mute audio when in background Bisukan audio saat berada di background - + Multicore CPU Emulation Emulasi CPU Multicore - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Opsi ini meningkatkan penggunaan utas emulasi CPU dari 1 menjadi maksimum Switch yaitu 4. Ini terutama merupakan opsi debug dan sebaiknya tidak dinonaktifkan. - + Memory Layout Tata Letak Memori - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ Ini tidak meningkatkan stabilitas atau performa dan dimaksudkan untuk memungkink Mengaktifkannya akan meningkatkan penggunaan memori. Tidak disarankan untuk mengaktifkannya kecuali ada game tertentu dengan mod tekstur yang membutuhkannya. - + Limit Speed Percent Persen Batas Kecepatan - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,141 +547,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Akurasi: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Pengaturan ini mengontrol akurasi CPU yang diemulasikan. Jangan mengubah ini kecuali Anda tahu apa yang Anda lakukan. - - + + Backend: Backend: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Pisahkan FMA (meningkatkan performa pada CPU tanpa FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Opsi ini meningkatkan kecepatan dengan mengurangi akurasi instruksi fused-multiply-add pada CPU tanpa dukungan FMA asli. - + Faster FRSQRTE and FRECPE FRSQRTE dan FRECPE lebih cepat - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Opsi ini meningkatkan kecepatan beberapa fungsi titik mengambang perkiraan dengan menggunakan perkiraan asli yang kurang akurat. - + Faster ASIMD instructions (32 bits only) Instruksi ASIMD lebih cepat (hanya untuk 32 bits) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Opsi ini meningkatkan kecepatan fungsi floating-point ASIMD 32 bit dengan menjalankannya dengan mode pembulatan yang salah. - + Inaccurate NaN handling Penanganan NaN tidak akurat - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Opsi ini meningkatkan kecepatan dengan menghilangkan pemeriksaan NaN. Harap dicatat ini juga mengurangi akurasi instruksi titik mengambang tertentu. - + Disable address space checks Matikan pengecekan adress space - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Opsi ini meningkatkan kecepatan dengan menghilangkan pemeriksaan keamanan sebelum setiap pembacaan/tulisan memori di dalam tamu. Menonaktifkannya dapat memungkinkan sebuah permainan untuk membaca/menulis memori emulator. - + Ignore global monitor Abaikan monitor global - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. Opsi ini meningkatkan kecepatan dengan hanya mengandalkan semantik cmpxchg untuk memastikan keamanan instruksi akses eksklusif. Harap dicatat ini dapat menyebabkan deadlock dan kondisi perlombaan lainnya. - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Beralih antara API grafis yang tersedia. Vulkan direkomendasikan dalam kebanyakan kasus. - + Device: Perangkat: - + This setting selects the GPU to use with the Vulkan backend. Pengaturan ini memilih GPU yang akan digunakan dengan backend Vulkan. - + Shader Backend: Backend Shader: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -692,12 +669,12 @@ GLASM adalah backend NVIDIA yang sudah tidak digunakan lagi yang menawarkan kine SPIR-V mengompilasi yang tercepat, tetapi menghasilkan hasil yang buruk pada sebagian besar driver GPU. - + Resolution: Resolusi: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -706,27 +683,27 @@ Resolusi yang lebih tinggi membutuhkan VRAM dan bandwidth yang lebih banyak. Opsi yang lebih rendah dari 1X dapat menyebabkan masalah rendering. - + Window Adapting Filter: Filter Menyelaraskan dengan Layar: - + FSR Sharpness: Ketajaman FSR - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Menentukan seberapa tajam gambar akan terlihat saat menggunakan kontras dinamis FSR. - + Anti-Aliasing Method: Metode Anti-Aliasing: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -735,12 +712,12 @@ SMAA menawarkan kualitas terbaik. FXAA memiliki dampak kinerja yang lebih rendah dan dapat menghasilkan gambar yang lebih baik dan lebih stabil pada resolusi yang sangat rendah. - + Fullscreen Mode: Mode Layar Penuh: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -749,12 +726,12 @@ Borderless menawarkan kompatibilitas terbaik dengan keyboard di layar yang dimin Layar penuh eksklusif mungkin menawarkan performa yang lebih baik dan dukungan Freesync/Gsync yang lebih baik. - + Aspect Ratio: Rasio Aspek: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -763,49 +740,36 @@ Permainan Switch hanya mendukung 16:9, jadi mod permainan kustom diperlukan untu Juga mengontrol rasio aspek tangkapan layar yang diambil. - + Use disk pipeline cache Gunakan pipeline cache diska - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Memungkinkan penyimpanan shader untuk mempercepat pengambilan pada saat game berikutnya dimulai. Menonaktifkannya hanya dimaksudkan untuk debugging. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Gunakan pengemulasian GPU yang asinkron - + Uses an extra CPU thread for rendering. This option should always remain enabled. Menggunakan satu benang CPU tambahan untuk merender. Opsi ini harus tetap diaktifkan. - + NVDEC emulation: Emulasi NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -814,12 +778,12 @@ Ini dapat menggunakan CPU atau GPU untuk dekode, atau tidak melakukan dekode sam Dalam kebanyakan kasus, dekode GPU memberikan kinerja terbaik. - + ASTC Decoding Method: ASTC Metode Dekoding: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -831,34 +795,24 @@ GPU: Gunakan compute shaders GPU untuk dekode tekstur ASTC, direkomendasikan unt CPU Asynchronous: Gunakan CPU untuk dekode tekstur ASTC saat tiba. Sepenuhnya menghilangkan stuttering dekode ASTC dengan biaya masalah rendering saat tekstur sedang didekode. - + ASTC Recompression Method: ASTC Metode Pemampatan Ulang: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Hampir semua GPU desktop dan laptop tidak mendukung tekstur ASTC, memaksa emulator untuk mendekompres ke format intermediate yang didukung oleh kartu apa pun, RGBA8. Opsi ini merekompres RGBA8 ke format BC1 atau BC3, menghemat VRAM tetapi mempengaruhi kualitas gambar secara negatif. - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Mode Sinkronisasi Vertikal - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -869,51 +823,49 @@ Mailbox dapat memiliki laten yang lebih rendah daripada FIFO dan tidak merobek t Immediate (tanpa sinkronisasi) hanya menampilkan apa pun yang tersedia dan dapat menunjukkan tearing. - + Enable asynchronous presentation (Vulkan only) Aktifkan presentasi asinkron (hanya Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Meningkatkan kinerja sedikit dengan memindahkan presentasi ke thread CPU terpisah. - + Force maximum clocks (Vulkan only) Paksa jam maximum (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Berjalan bekerja di latar belakang sambil menunggu perintah grafis untuk mencegah GPU agar tidak menurunkan kecepatan jamnya. - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. Mengontrol kualitas rendering tekstur pada sudut miring. Ini adalah pengaturan yang ringan dan aman untuk diatur pada 16x pada sebagian besar GPU. - Accuracy Level: - Tingkat Akurasi: + Tingkat Akurasi: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - Emulasi GPU yang akurat. + Emulasi GPU yang akurat. Sebagian besar game dirender dengan baik dengan pengaturan Normal, namun pengaturan High masih diperlukan untuk beberapa game. Partikel cenderung hanya dirender dengan benar dengan akurasi High. Pengaturan Extreme hanya digunakan untuk debugging. @@ -921,12 +873,12 @@ Opsi ini dapat diubah saat bermain. Beberapa game mungkin memerlukan pengaturan High untuk dirender dengan baik. - + Use asynchronous shader building (Hack) Gunakan pembangunan shader asinkron (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Memungkinkan kompilasi shader asinkron, yang dapat mengurangi stutter shader. @@ -941,24 +893,24 @@ Fitur ini bersifat eksperimental. Memungkinkan Waktu GPU Cepat. Opsi ini akan memaksa sebagian besar game berjalan pada resolusi asli tertinggi mereka. - + Use Vulkan pipeline cache Gunakan pipeline cache Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Memungkinkan cache pipeline spesifik vendor GPU. Opsi ini dapat meningkatkan waktu pemuatan shader secara signifikan dalam kasus di mana driver Vulkan tidak menyimpan file cache pipeline secara internal. - + Enable Compute Pipelines (Intel Vulkan Only) Aktifkan Pipa Komputasi (Hanya Intel Vulkan) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -967,111 +919,111 @@ Pengaturan ini hanya ada untuk driver milik Intel, dan mungkin menyebabkan crash Pipeline komputasi selalu aktif pada semua driver lainnya. - + Enable Reactive Flushing Aktifkan Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Menggunakan pemadatan reaktif alih-alih pemadatan prediktif, memungkinkan sinkronisasi memori yang lebih akurat. - + Sync to framerate of video playback Sinkronkan dengan kecepatan pemutaran video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Jalankan permainan dengan kecepatan normal selama pemutaran video, bahkan ketika framerate tidak terkunci. - + Barrier feedback loops Loop umpan balik penghalang - + Improves rendering of transparency effects in specific games. Meningkatkan rendering efek transparansi dalam game tertentu. - + RNG Seed Benih RNG - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. Mengontrol benih dari generator angka acak. Biasanya digunakan untuk tujuan speedrunning. - + Device Name Nama Perangkat - + The name of the emulated Switch. Nama dari Switch yang diemulasikan. - + Custom RTC Date: Tanggal RTC Kustom: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Opsi ini memungkinkan untuk mengubah jam yang ditiru pada Switch. Dapat digunakan untuk memanipulasi waktu dalam permainan. - + Language: Bahasa - + Note: this can be overridden when region setting is auto-select Catatan: ini dapat diubah ketika pengaturan wilayah diotomatiskan - + Region: Wilayah: - + The region of the emulated Switch. Wilayah dari Switch yang diemulasikan. - + Time Zone: Zona Waktu: - + The time zone of the emulated Switch. Zona waktu dari Switch yang diemulasikan. - + Sound Output Mode: Mode keluaran suara. - + Console Mode: Mode Konsol - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1080,7 +1032,7 @@ Permainan akan mengubah resolusi, detail, dan pengontrol yang didukung tergantun Mengatur ke Handheld dapat membantu meningkatkan performa untuk sistem dengan spesifikasi rendah. - + Prompt for user on game boot Tanyakan pengguna ketika memulai permainan @@ -1089,7 +1041,7 @@ Mengatur ke Handheld dapat membantu meningkatkan performa untuk sistem dengan sp Meminta untuk memilih profil pengguna setiap kali boot, berguna jika beberapa orang menggunakan yuzu pada PC yang sama. - + Pause emulation when in background Jeda pengemulasian ketika berada di latar @@ -1098,843 +1050,997 @@ Mengatur ke Handheld dapat membantu meningkatkan performa untuk sistem dengan sp Pengaturan ini menjeda yuzu saat fokus ke jendela lain. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Konfirmasi sebelum menghentikan emulasi - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Pengaturan ini mengesampingkan perintah permainan yang meminta konfirmasi untuk menghentikan permainan. Mengaktifkannya akan melewati peringatan tersebut dan langsung keluar dari emulasi. - + Hide mouse on inactivity Sembunyikan mouse saat tidak aktif - + This setting hides the mouse after 2.5s of inactivity. Pengaturan ini menyembunyikan kursor setelah 2.5 detik tidak aktif. - + Disable controller applet Nonaktifkan aplikasi pengontrol - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Mematikan paksa penggunaan aplikasi pengendali oleh tamu. Ketika seorang tamu mencoba membuka aplikasi pengendali, aplikasi tersebut langsung ditutup. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Aktifkan Mode Permainan - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - Conservative - - - - - Aggressive - - - - + OpenGL OpenGL - + Vulkan Vulkan - + Null Null - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (Shader perakit, hanya NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (Eksperimental, Hanya AMD/Mesa) - + Normal Normal - + High Tinggi - + Extreme Ekstrim - + Auto Otomatis - + Accurate Akurat - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolusi - - Area - - - - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + + Default Bawaan - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Conservative + + + + + Aggressive + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - - + + Serbian (српски) + + + + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1943,37 +2049,37 @@ Ketika seorang tamu mencoba membuka aplikasi pengendali, aplikasi tersebut langs 8GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya @@ -2327,27 +2433,27 @@ Memungkinkan berbagai macam optimasi IR. Pencatatan - + Open Log Location Buka Lokasi Catatan - + Global Log Filter Catatan Penyaring Global - + When checked, the max size of the log increases from 100 MB to 1 GB Saat dicentang, ukuran maksimum log meningkat dari 100 MB menjadi 1 GB - + Enable Extended Logging** Aktifkan Pencatatan Yang Diperluas** - + Show Log in Console Tampilkan Catatan Di Konsol @@ -2493,7 +2599,7 @@ Memungkinkan berbagai macam optimasi IR. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2555,7 +2661,7 @@ Memungkinkan berbagai macam optimasi IR. **Ini akan diatur ulang secara otomatis ketika yuzu ditutup. - + Web applet not compiled Web applet tidak dikompilasi @@ -2605,7 +2711,7 @@ Memungkinkan berbagai macam optimasi IR. - eden Configuration + Eden Configuration @@ -2614,88 +2720,88 @@ Memungkinkan berbagai macam optimasi IR. Beberapa pengaturan hanya tersedia ketika permainan tidak sedang berjalan. - + Applets Applet - - + + Audio Audio - - + + CPU CPU - + Debug Awakutu - + Filesystem Sistem berkas - - + + General Umum - - + + Graphics Grafis - + GraphicsAdvanced GrafisLanjutan - + GraphicsExtensions - + Hotkeys Pintasan - - + + Controls Kendali - + Profiles Profil - + Network Jaringan - - + + System Sistem - + Game List Daftar Permainan - + Web Jejaring @@ -2793,51 +2899,45 @@ Memungkinkan berbagai macam optimasi IR. - - - Reset Metadata Cache Atur Ulang Cache Metadata - + Select Emulated NAND Directory... Pilih Direktori NAND yang Diemulasikan... - + Select Emulated SD Directory... Pilih Direktori SD yang Diemulasikan... - + Select Gamecard Path... Pilih Jalur Kartu Permainan... - + Select Dump Directory... Pilih Jalur Dump... - + Select Mod Load Directory... Pilih Direktori Pemuatan Mod... - The metadata cache is already empty. - Cache metadata sudah kosong. + Cache metadata sudah kosong. - The operation completed successfully. - Operasi selesai dengan sukses. + Operasi selesai dengan sukses. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Cache metadata tidak dapat dihapus. Mungkin sedang dipakai atau memang tidak ada. + Cache metadata tidak dapat dihapus. Mungkin sedang dipakai atau memang tidak ada. @@ -2868,12 +2968,12 @@ Memungkinkan berbagai macam optimasi IR. yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Ini mengatur ulang semua pengaturan dan menghapus semua konfigurasi permainan. Ini tidak akan menghapus direktori permainan, profil, atau profil input. Lanjutkan? @@ -2906,33 +3006,33 @@ Memungkinkan berbagai macam optimasi IR. Warna Latar: - + % FSR sharpening percentage (e.g. 50%) % - + Off Mati - + VSync Off VSync Mati - + Recommended Direkomendasikan - + On Nyala - + VSync On VSync Aktif @@ -2969,14 +3069,18 @@ Memungkinkan berbagai macam optimasi IR. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3008,75 +3112,75 @@ These settings are experimental, and may cause black screens. If your games fail Kembalikan ke Semula - + Action Tindakan - + Hotkey Pintasan - + Controller Hotkey Pemetaan Tombol Pemantau - - - + + + Conflicting Key Sequence Urutan Tombol yang Konflik - - + + The entered key sequence is already assigned to: %1 Urutan tombol yang dimasukkan sudah menerap ke: %1 - + [waiting] [menunggu] - + Invalid Tidak valid - + Invalid hotkey settings Pengaturan hotkey tidak valid - + An error occurred. Please report this issue on github. Terjadi kesalahan. Harap laporkan masalah ini di github. - + Restore Default Kembalikan ke Semula - + Clear Bersihkan - + Conflicting Button Sequence Sekuensi Tombol yang Bertentangan - + The default button sequence is already assigned to: %1 Urutan tombol bawaan sudah diterapkan ke: %1 - + The default key sequence is already assigned to: %1 Urutan tombol bawaan sudah diterapkan ke: %1 @@ -3396,7 +3500,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3551,7 +3655,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Stik Kiri @@ -3661,14 +3765,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3687,7 +3791,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Tambah @@ -3700,15 +3804,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3753,7 +3857,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Stik Kanan @@ -3768,242 +3872,242 @@ These settings are experimental, and may cause black screens. If your games fail Konfigurasi - - - - + + + + Clear Bersihkan - - - - - + + + + + [not set] [belum diatur] - - - + + + Invert button Balikkan tombol - - + + Toggle button Atur tombol - + Turbo button Tombol turbo - - + + Invert axis Balikkan poros - - - + + + Set threshold Atur batasan - - + + Choose a value between 0% and 100% Pilih sebuah angka diantara 0% dan 100% - + Toggle axis - + Set gyro threshold - + Calibrate sensor Kalibrasi sensor - + Map Analog Stick Petakan Stik Analog - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Setelah menekan OK, pertama gerakkan joystik secara mendatar, lalu tegak lurus. Untuk membalikkan sumbu, pertama gerakkan joystik secara tegak lurus, lalu mendatar. - + Center axis - - + + Deadzone: %1% Titik Mati: %1% - - + + Modifier Range: %1% Rentang Pengubah: %1% - - + + Pro Controller Kontroler Pro - + Dual Joycons Joycon Dual - + Left Joycon Joycon Kiri - + Right Joycon Joycon Kanan - + Handheld Jinjing - + GameCube Controller Kontroler GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Kontroler NES - + SNES Controller Kontroler SNES - + N64 Controller Kontroler N64 - + Sega Genesis Sega Genesis - + Start / Pause Mulai / Jeda - + Z Z - + Control Stick Stik Kendali - + C-Stick C-Stick - + Shake! Getarkan! - + [waiting] [menunggu] - + New Profile Profil Baru - + Enter a profile name: Masukkan nama profil: - - + + Create Input Profile Ciptakan Profil Masukan - + The given profile name is not valid! Nama profil yang diberi tidak sah! - + Failed to create the input profile "%1" Gagal membuat profil masukan "%1" - + Delete Input Profile Hapus Profil Masukan - + Failed to delete the input profile "%1" Gagal menghapus profil masukan "%1" - + Load Input Profile Muat Profil Masukan - + Failed to load the input profile "%1" Gagal memuat profil masukan "%1" - + Save Input Profile Simpat Profil Masukan - + Failed to save the input profile "%1" Gagal menyimpan profil masukan "%1" @@ -4060,7 +4164,7 @@ Untuk membalikkan sumbu, pertama gerakkan joystik secara tegak lurus, lalu menda - + Configure Konfigurasi @@ -4096,7 +4200,7 @@ Untuk membalikkan sumbu, pertama gerakkan joystik secara tegak lurus, lalu menda - + Test Uji coba @@ -4115,7 +4219,7 @@ Untuk membalikkan sumbu, pertama gerakkan joystik secara tegak lurus, lalu menda <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Pelajari lebih lanjut</span></a> - + %1:%2 %1:%2 @@ -4124,77 +4228,77 @@ Untuk membalikkan sumbu, pertama gerakkan joystik secara tegak lurus, lalu menda yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Terdapat karakter tidak sah di angka port - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Port harus berada dalam jangkauan 0 dan 65353 - + IP address is not valid Alamat IP tidak sah - + This UDP server already exists Server UDP ini sudah ada - + Unable to add more than 8 servers Tidak dapat menambah lebih dari 8 server - + Testing Menguji - + Configuring Mengkonfigur - + Test Successful Tes Berhasil - + Successfully received data from the server. Berhasil menerima data dari server. - + Test Failed Uji coba Gagal - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Tidak dapat menerima data yang sah dari server.<br>Mohon periksa bahwa server telah diatur dengan benar dan alamat dan port sudah sesuai. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Uji coba UDP atau kalibrasi konfigurasi sedang berjalan.<br>Mohon tunggu hingga selesai. @@ -4320,7 +4424,12 @@ Current values are %1% and %2% respectively. Antarmuka Jaringan - + + Enable Airplane Mode + + + + None Tak ada @@ -4378,52 +4487,52 @@ Current values are %1% and %2% respectively. Beberapa pengaturan hanya tersedia ketika permainan tidak sedang berjalan. - + Add-Ons Pengaya (Add-On) - + System Sistem - + CPU CPU - + Graphics Grafis - + Adv. Graphics Ljtan. Grafik - + GPU Extensions - + Audio Audio - + Input Profiles Profil Masukan - + Linux Linux - + Properties Properti @@ -4441,12 +4550,12 @@ Current values are %1% and %2% respectively. Pengaya (Add-On) - + Patch Name Nama Tambalan - + Version Versi @@ -4484,27 +4593,32 @@ Current values are %1% and %2% respectively. Atur Gambar - + + Select Avatar + + + + Add Tambahkan - + Rename Ubah Nama - + Remove Singkirkan - + Profile management is available only when game is not running. Pengelolaan profil hanya tersedia saat permainan tidak dijalankan. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4512,100 +4626,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Masukkan Nama Pengguna - + Users Pengguna - + Enter a username for the new user: Masukkan nama pengguna untuk pengguna baru: - + Enter a new username: Masukkan nama pengguna baru: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Pilih Gambar Pengguna - - JPEG Images (*.jpg *.jpeg) - Gambar JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Gambar JPEG (*.jpg *.jpeg) + + + Error deleting image Kesalahan ketika menghapus gambar - + Error occurred attempting to overwrite previous image at: %1. Kesalahan saat mencoba menimpa gambar sebelumnya di: %1. - + Error deleting file Kesalahan saat menghapus berkas - + Unable to delete existing file: %1. Tak dapat menghapus berkas yang ada: %1. - + Error creating user image directory Kesalahan saat menciptakan direktori pengguna - + Unable to create directory %1 for storing user images. Tidak bisa menciptakan direktori %1 untuk menyimpan gambar pengguna. - Error copying user image - Kesalahan ketika menyalin gambar pengguna + Kesalahan ketika menyalin gambar pengguna - Unable to copy image from %1 to %2 - Gagal menyalin berkas dari %1 ke %2 + Gagal menyalin berkas dari %1 ke %2 - Error resizing user image - Kesalahan ketika mengubah ukuran gambar pengguna + Kesalahan ketika mengubah ukuran gambar pengguna - Unable to resize image - Tidak dapat mengubah ukuran gambar + Tidak dapat mengubah ukuran gambar + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. - + Confirm Delete Konfirmasi Penghapusan - + Name: %1 UUID: %2 @@ -4657,7 +4860,7 @@ UUID: %2 - + Enable @@ -4668,7 +4871,7 @@ UUID: %2 - + Not connected Tidak terkoneksi @@ -4678,63 +4881,63 @@ UUID: %2 Kembalikan ke Semula - + Clear Bersihkan - + [not set] [belum diatur] - + Invert axis Balikkan poros - - + + Deadzone: %1% Titik Mati: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Mengkonfigur - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [menunggu] @@ -4772,7 +4975,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4824,12 +5027,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration - + Select TAS Load Directory... @@ -4938,7 +5141,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5258,6 +5461,16 @@ Drag points to change position, or double-click table cells to edit values.Web Jejaring + + + Eden Web Service + + + + + Generate + + yuzu Web Service Layanan Web yuzu @@ -5267,42 +5480,29 @@ Drag points to change position, or double-click table cells to edit values.Dengan menyertakan nama pengguna dan token, Anda menyetujui untuk mengizinkan yuzu mengumpulkan data penggunaan tambahan, yang mungkin termasuk informasi pengenalan pengguna. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verifikasi + Verifikasi - Sign up - Daftar + Daftar - + Token: Token: - + Username: Nama Pengguna: - What is my token? - Berapa token saya? + Berapa token saya? - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5327,12 +5527,12 @@ Drag points to change position, or double-click table cells to edit values.Hasilkan Ulang - + Discord Presence Kehadiran Discord - + Show Current Game in your Discord Status Tampilkan Permainan Saat ini pada Status Discord Anda @@ -5341,24 +5541,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Pelajari lebih lanjut</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Daftar</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Daftar</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5380,12 +5564,6 @@ Drag points to change position, or double-click table cells to edit values.Token was not verified. The change to your token has not been saved. Token tidak terverifikasi. Perubahan ke token Anda tak tersimpan - - - Unverified, please click Verify before saving configuration - Tooltip - - Verifying... Memverifikasi... @@ -5408,20 +5586,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Pemverifikasian gagal. Periksa apakah token yang dimasukkan sudah benar dan apakah koneksi internet Anda berjalan. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Kontroler P1 - + &Controller P1 %Kontroler P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versi + + DirectConnect @@ -5527,7 +5752,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5535,11 +5765,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5599,110 +5824,109 @@ Please go to Configure -> System -> Network and make a selection. Telemetri - + Broken Vulkan Installation Detected - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Memuat Applet Web... - - + + Disable Web Applet Matikan Applet Web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built Jumlah shader yang sedang dibuat - + The current selected resolution scaling multiplier. Pengali skala resolusi yang terpilih. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Kecepatan emulasi saat ini. Nilai yang lebih tinggi atau rendah dari 100% menandakan pengemulasian berjalan lebih cepat atau lambat dibanding Switch aslinya. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Berapa banyak frame per second (bingkai per detik) permainan akan ditampilkan. Ini akan berubah dari berbagai permainan dan pemandangan. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Waktu yang diperlukan untuk mengemulasikan bingkai Switch, tak menghitung pembatas bingkai atau v-sync. Agar emulasi berkecepatan penuh, ini harus 16.67 mdtk. - + Unmute Membunyikan - + Mute Bisukan - + Reset Volume Atur ulang tingkat suara - + &Clear Recent Files &Bersihkan Berkas Baru-baru Ini - + &Continue &Lanjutkan - + &Pause &Jeda - Warning Outdated Game Format - Peringatan Format Permainan yang Usang + Peringatan Format Permainan yang Usang You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Anda menggunakan format direktori ROM yang sudah didekonstruksi untuk permainan ini, yang mana itu merupakan format lawas yang sudah tergantikan oleh yang lain seperti NCA, NAX, XCI, atau NSP. Direktori ROM yang sudah didekonstruksi kekurangan ikon, metadata, dan dukungan pembaruan.<br><br>Untuk penjelasan berbagai format Switch yang didukung yuzu, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>periksa wiki kami</a>. Pesan ini tidak akan ditampilkan lagi. - - + + Error while loading ROM! Kesalahan ketika memuat ROM! - + The ROM format is not supported. Format ROM tak didukung. - + An error occurred initializing the video core. Terjadi kesalahan ketika menginisialisasi inti video. @@ -5711,1082 +5935,870 @@ Please go to Configure -> System -> Network and make a selection. yuzu telah mengalami error saat menjalankan inti video. Ini biasanya disebabkan oleh pemicu piranti (driver) GPU yang usang, termasuk yang terintegrasi. Mohon lihat catatan untuk informasi lebih rinci. Untuk informasi cara mengakses catatan, mohon lihat halaman berikut: <a href='https://yuzu-emu.org/help/reference/log-files/'>Cara Mengupload Berkas Catatan</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Terjadi kesalahan yang tak diketahui. Mohon lihat catatan untuk informasi lebih rinci. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... - + Save Data Simpan Data - + Mod Data Mod Data - + Error Opening %1 Folder Gagal Membuka Folder %1 - - + + Folder does not exist! Folder tak ada! - Error Opening Transferable Shader Cache - Gagal Ketika Membuka Tembolok Shader yang Dapat Ditransfer + Gagal Ketika Membuka Tembolok Shader yang Dapat Ditransfer - - Failed to create the shader cache directory for this title. - - - - Error Removing Contents - Error saat menghapus konten + Error saat menghapus konten - Error Removing Update - Error saat menghapus Update + Error saat menghapus Update - Error Removing DLC - Error saat menghapus DLC + Error saat menghapus DLC - + Remove Installed Game Contents? Hapus Konten Game yang terinstall? - + Remove Installed Game Update? Hapus Update Game yang terinstall? - + Remove Installed Game DLC? Hapus DLC Game yang terinstall? - + Remove Entry Hapus Masukan - - - - - - Successfully Removed - Berhasil menghapus + Berhasil menghapus - - Successfully removed the installed base game. - - - - - The base game is not installed in the NAND and cannot be removed. - - - - - Successfully removed the installed update. - - - - - There is no update installed for this title. - - - - There are no DLC installed for this title. - Tidak ada DLC yang terinstall untuk judul ini. + Tidak ada DLC yang terinstall untuk judul ini. - - Successfully removed %1 installed DLC. - - - - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File Hapus File - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Kesalahan Menghapus Transferable Shader Cache + Kesalahan Menghapus Transferable Shader Cache - - A shader cache for this title does not exist. - Cache shader bagi judul ini tidak ada + Cache shader bagi judul ini tidak ada - - Successfully removed the transferable shader cache. - - - - - Failed to remove the transferable shader cache. - - - - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - Error Removing Custom Configuration - Kesalahan Menghapus Konfigurasi Buatan + Kesalahan Menghapus Konfigurasi Buatan - - A custom configuration for this title does not exist. - - - - - Successfully removed the custom game configuration. - - - - - Failed to remove the custom game configuration. - - - - - + + RomFS Extraction Failed! Pengekstrakan RomFS Gagal! - + There was an error copying the RomFS files or the user cancelled the operation. Terjadi kesalahan ketika menyalin berkas RomFS atau dibatalkan oleh pengguna. - + Full Penuh - + Skeleton Skeleton - + Select RomFS Dump Mode Pilih Mode Dump RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Mohon pilih cara RomFS akan di-dump.<br>FPenuh akan menyalin seluruh berkas ke dalam direktori baru sementara <br>jerangkong hanya akan menciptakan struktur direktorinya saja. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Mengekstrak RomFS... - - - - - + + Cancel Batal - + RomFS Extraction Succeeded! Pengekstrakan RomFS Berhasil! - - - + The operation completed successfully. Operasi selesai dengan sukses, - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - - Verifying integrity... - - - - - Integrity verification succeeded! - Berhasil + Berhasil - - Integrity verification failed! - Gagal + Gagal - - File contents may be corrupt. - - - - - - - Create Shortcut - Buat Pintasan + Buat Pintasan - - Do you want to launch the game in fullscreen? - - - - - Successfully created a shortcut to %1 - - - - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - Create Icon - Buat ikon + Buat ikon - - Cannot create icon file. Path "%1" does not exist and cannot be created. + + Warning: Outdated Game Format - + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Gagal membuka %1 - + Select Directory Pilih Direktori - + Properties Properti - + The game properties could not be loaded. Properti permainan tak dapat dimuat. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Eksekutabel Switch (%1);;Semua Berkas (*.*) - + Load File Muat Berkas - + Open Extracted ROM Directory Buka Direktori ROM Terekstrak - + Invalid Directory Selected Direktori Terpilih Tidak Sah - + The directory you have selected does not contain a 'main' file. Direktori yang Anda pilih tak memiliki berkas 'utama.' - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Install File - + %n file(s) remaining + - + Installing file "%1"... Memasang berkas "%1"... - - + + Install Results Hasil Install - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - %n file(s) baru diinstall - + %n file(s) baru diinstall + %n file(s) baru diinstall - + %n file(s) were overwritten - %n file(s) telah ditimpa - + %n file(s) telah ditimpa + %n file(s) telah ditimpa - + %n file(s) failed to install - %n file(s) gagal di install - + %n file(s) gagal di install + %n file(s) gagal di install - + System Application Aplikasi Sistem - + System Archive Arsip Sistem - + System Application Update Pembaruan Aplikasi Sistem - + Firmware Package (Type A) Paket Perangkat Tegar (Tipe A) - + Firmware Package (Type B) Paket Perangkat Tegar (Tipe B) - + Game Permainan - + Game Update Pembaruan Permainan - + Game DLC DLC Permainan - + Delta Title Judul Delta - + Select NCA Install Type... Pilih Tipe Pemasangan NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Mohon pilih jenis judul yang Anda ingin pasang sebagai NCA ini: (Dalam kebanyakan kasus, pilihan bawaan 'Permainan' tidak apa-apa`.) - + Failed to Install Gagal Memasang - + The title type you selected for the NCA is invalid. Jenis judul yang Anda pilih untuk NCA tidak sah. - + File not found Berkas tak ditemukan - + File "%1" not found Berkas "%1" tak ditemukan - + OK OK - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account Akun yuzu Hilang - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Agar dapat mengirimkan berkas uju kompatibilitas permainan, Anda harus menautkan akun yuzu Anda.<br><br/>TUntuk mennautkan akun yuzu Anda, pergi ke Emulasi &gt; Konfigurasi &gt; Web. - + Error opening URL Kesalahan saat membuka URL - + Unable to open the URL "%1". Tidak dapat membuka URL "%1". - + TAS Recording Rekaman TAS - + Overwrite file of player 1? Timpa file pemain 1? - + Invalid config detected Konfigurasi tidak sah terdeteksi - + Handheld controller can't be used on docked mode. Pro controller will be selected. Kontroller jinjing tidak bisa digunakan dalam mode dock. Kontroller Pro akan dipilih - - + + Amiibo - - + + The current amiibo has been removed - + Error Kesalahan - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) Berkas Amiibo (%1);; Semua Berkas (*.*) - + Load Amiibo Muat Amiibo - + Error loading Amiibo data Gagal memuat data Amiibo - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Tangkapan Layar - + PNG Image (*.png) Berkas PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Status TAS: Berjalan %1/%2 - + TAS state: Recording %1 Status TAS: Merekam %1 - + TAS state: Idle %1/%2 Status TAS: Diam %1/%2 - + TAS State: Invalid Status TAS: Tidak Valid - + &Stop Running &Matikan - + &Start &Mulai - + Stop R&ecording Berhenti Mer&ekam - + R&ecord R&ekam - + Building: %n shader(s) Membangun: %n shader(s) + Membangun: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Kecepatan: %1% / %2% - + Speed: %1% Kecepatan: %1% - + Game: %1 FPS Permainan: %1 FPS - + Frame: %1 ms Frame: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA TANPA AA - + VOLUME: MUTE VOLUME : SENYAP - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Select RomFS Dump Target Pilih Target Dump RomFS - + Please select which RomFS you would like to dump. Silahkan pilih jenis RomFS yang ingin Anda buang. @@ -6799,107 +6811,107 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Apakah Anda yakin untuk menghentikan emulasi? Setiap progres yang tidak tersimpan akan hilang. - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Nearest Terdekat - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked Terpasang - + Handheld Jinjing - + Normal Normal - + High Tinggi - + Extreme Ekstrim - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM - + SPIRV @@ -6907,44 +6919,44 @@ Would you like to download it? GRenderWindow - - + + OpenGL not available! OpenGL tidak tersedia! - + OpenGL shared contexts are not supported. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Terjadi kesalahan menginisialisasi OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. VGA anda mungkin tidak mendukung OpenGL, atau anda tidak memiliki pemacu piranti (driver) grafis terbaharu. - + Error while initializing OpenGL 4.6! Terjadi kesalahan menginisialisasi OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 VGA anda mungkin tidak mendukung OpenGL 4.6, atau anda tidak memiliki pemacu piranti (driver) grafis terbaharu.<br><br>Pemuat GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 VGA anda mungkin tidak mendukung satu atau lebih ekstensi OpenGL. Mohon pastikan bahwa anda memiliki pemacu piranti (driver) grafis terbaharu.<br><br>Pemuat GL:<br>%1<br><br>Ekstensi yang tidak didukung:<br>%2 @@ -6952,128 +6964,128 @@ Would you like to download it? GameList - + Favorite Favorit - + Start Game Mulai permainan - + Start Game without Custom Configuration - + Open Save Data Location Buka Lokasi Data Penyimpanan - + Open Mod Data Location Buka Lokasi Data Mod - + Open Transferable Pipeline Cache - + Remove Singkirkan - + Remove Installed Update - + Remove All Installed DLC - + Remove Custom Configuration - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches - + Remove All Installed Contents Hapus semua konten terinstall. - + Dump RomFS Dump RomFS - + Dump RomFS to SDMC - + Verify Integrity - + Copy Title ID to Clipboard Salin Judul ID ke Clipboard. - + Navigate to GameDB entry Pindah ke tampilan GameDB - + Create Shortcut Buat pintasan - + Add to Desktop Menambahkan ke Desktop - + Add to Applications Menu - + Configure Game @@ -7082,62 +7094,62 @@ Would you like to download it? Properti - + Scan Subfolders Memindai subfolder - + Remove Game Directory - + ▲ Move Up - + ▼ Move Down - + Open Directory Location Buka Lokasi Direktori - + Clear Bersihkan - + Name Nama - + Compatibility Kompatibilitas - + Add-ons Pengaya (Add-On) - + File type Tipe berkas - + Size Ukuran - + Play time @@ -7145,62 +7157,62 @@ Would you like to download it? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Perfect Sempurna - + Game can be played without issues. Permainan dapat dimainkan tanpa kendala. - + Playable - + Game functions with minor graphical or audio glitches and is playable from start to finish. - + Intro/Menu Awal/Menu - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot Tidak Akan Berjalan - + The game crashes when attempting to startup. Gim rusak saat mencoba untuk memulai. - + Not Tested Belum dites - + The game has not yet been tested. Gim belum pernah dites. @@ -7208,7 +7220,7 @@ Would you like to download it? GameListPlaceholder - + Double-click to add a new folder to the game list Klik dua kali untuk menambahkan folder sebagai daftar permainan. @@ -7216,19 +7228,20 @@ Would you like to download it? GameListSearchField - + %1 of %n result(s) + - + Filter: - + Enter pattern to filter Masukkan pola untuk memfilter @@ -7310,7 +7323,7 @@ Would you like to download it? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7318,186 +7331,186 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Tangkapan Layar - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy - + Configure Konfigurasi - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen - - Exit eden + + Exit Eden - + Fullscreen - + Load File Muat Berkas - + Load/Remove Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation - + Stop Emulation - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar @@ -7505,22 +7518,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. - + Installing an Update or DLC will overwrite the previously installed one. - + Install Install - + Install Files to NAND Install File ke NAND @@ -7528,7 +7541,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 @@ -7674,349 +7687,412 @@ Debug Message: - + &Emulation &Emulasi - + &View - + &Reset Window Size - + &Debugging - + Reset Window Size to &720p Atur ulang ukuran bingkai ke &720p - + Reset Window Size to 720p Atur ulang ukuran bingkai ke 720p - + Reset Window Size to &900p Atur ulang ukuran bingkai ke &900p - + Reset Window Size to 900p Atur ulang ukuran bingkai ke 900p - + Reset Window Size to &1080p - + Reset Window Size to 1080p - + &Multiplayer - + &Tools - + &Amiibo - + &TAS - + &Create Home Menu Shortcut - + &Help - + &Install Files to NAND... - + L&oad File... - + Load &Folder... - + E&xit - + &Pause &Jeda - + &Stop - + &Verify Installed Contents - - &About eden - - - - - Open &eden Folder - - - - + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu - + Single &Window Mode - + + Open &Eden Folders + + + + + &About Eden + + + + Con&figure... - + Ctrl+, - + Display D&ock Widget Headers - + Show &Filter Bar - + Show &Status Bar - + Show Status Bar Munculkan Status Bar - + &Browse Public Game Lobby - + &Create Room - + &Leave Room - + &Direct Connect to Room - + &Show Current Room - + F&ullscreen - + &Restart - + Load/Remove &Amiibo... - + &Report Compatibility - + Open &Mods Page - + Open &Quickstart Guide Buka %Panduan cepat - + &FAQ - + &Capture Screenshot - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - + &Start &Mulai - + &Reset - + R&ecord R&ekam - + Open &Controller Menu - + + &Root Data Folder + + + + + &NAND Folder + + + + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Install Firmware - + Install Decryption Keys - - MicroProfileDialog - - - &MicroProfile - - - MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8076,37 +8152,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! - + Not Connected - + Connected Terhubung - + New Messages Received Pesan baru diterima - + Error Kesalahan - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8208,56 +8284,56 @@ p, li { white-space: pre-wrap; } - + Installed SD Titles - + Installed NAND Titles - + System Titles - + Add New Game Directory Tambahkan direktori permainan - + Favorites - - + + Shift Ubah - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [belum diatur] @@ -8268,14 +8344,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + Axis %1%2 @@ -8286,357 +8362,357 @@ p, li { white-space: pre-wrap; } - - - - - - + + + + + + [unknown] [tidak diketahui] - - - + + + Left Kiri - - - + + + Right Kanan - - - + + + Down Bawah - - - + + + Up Atas - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Mulai - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle O - - + + Cross X - - + + Square - - + + Triangle - - + + Share - - + + Options Opsi - - + + [undefined] - + %1%2 - - + + [invalid] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 - - + + %1%2Motion %3 %1%2Gerakan %3 - - + + %1%2Button %3 - - + + [unused] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Stik Analog Kiri - + Stick R Stik Analog Kanan - + Plus Tambah - + Minus Kurang - - + + Home Home - + Capture Tangkapan - + Touch Sentuh - + Wheel Indicates the mouse wheel - + Backward - + Forward - + Task - + Extra - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8754,6 +8830,298 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + Berhasil + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + Gagal + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Error saat menghapus konten + + + + Error Removing Update + Error saat menghapus Update + + + + Error Removing DLC + Error saat menghapus DLC + + + + The base game is not installed in the NAND and cannot be removed. + + + + + There is no update installed for this title. + + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Berhasil menghapus + + + + Successfully removed %1 installed DLC. + + + + + + Error Removing Transferable Shader Cache + Kesalahan Menghapus Transferable Shader Cache + + + + + A shader cache for this title does not exist. + Cache shader bagi judul ini tidak ada + + + + Successfully removed the transferable shader cache. + + + + + Failed to remove the transferable shader cache. + + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + Kesalahan Menghapus Konfigurasi Buatan + + + + A custom configuration for this title does not exist. + + + + + Successfully removed the custom game configuration. + + + + + Failed to remove the custom game configuration. + + + + + Reset Metadata Cache + Atur Ulang Cache Metadata + + + + The metadata cache is already empty. + Cache metadata sudah kosong. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Cache metadata tidak dapat dihapus. Mungkin sedang dipakai atau memang tidak ada. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Buat ikon + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9043,7 +9411,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9051,7 +9419,7 @@ Please try again or contact the developer of the software. %2 - + Users Pengguna @@ -9171,7 +9539,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack @@ -9179,12 +9547,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread @@ -9192,102 +9560,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable - + paused dijeda - + sleeping - + waiting for IPC reply menunggu respon IPC - + waiting for objects Menunggu objek - + waiting for condition variable - + waiting for address arbiter - + waiting for suspend resume - + waiting - + initialized - + terminated - + unknown - + PC = 0x%1 LR = 0x%2 - + ideal - + core %1 - + processor = %1 - + affinity mask = %1 - + thread id = %1 - + priority = %1(current) / %2(normal) - + last running ticks = %1 @@ -9295,7 +9663,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread @@ -9303,7 +9671,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 50ac83af4c..9e9daa8a0d 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Comunicazione con il server in corso... - + Cancel Annulla - + Touch the top left corner <br>of your touchpad. Tocca l'angolo in alto a sinistra <br>del touchpad. - + Now touch the bottom right corner <br>of your touchpad. Ora tocca l'angolo in basso a destra <br>del touchpad. - + Configuration completed! Configurazione completata! - + OK OK @@ -397,439 +397,198 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Errore - - Net connect - - - - - Player select - - - - + Software keyboard Tastiera Software - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Motore di output: - + Output Device: Dispositivo di output: - + Input Device: Dispositivo di input: - + Mute audio Silenzia l'audio - + Volume: Volume: - + Mute audio when in background Silenzia l'audio quando la finestra è in background - + Multicore CPU Emulation Emulazione CPU multi-core - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - + Memory Layout Layout di memoria - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Percentuale di limite della velocità - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Accuratezza: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - + + Backend: Back-end: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Non fondere FMA (migliora le prestazioni della CPU senza FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Questa opzione migliora la velocità riducendo la precisione delle istruzioni fused-multiply-add (FMA) sulle CPU senza il supporto nativo a FMA. - + Faster FRSQRTE and FRECPE FRSQRTE e FRECPE più veloci - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Questa opzione migliora la velocità di alcune funzioni in virgola mobile approssimate utilizzando delle approssimazioni native meno accurate. - + Faster ASIMD instructions (32 bits only) Istruzioni ASIMD più veloci (solo 32 bit) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Questa opzione migliora la velocità delle funzioni in virgola mobile ASIMD a 32 bit eseguendole con modalità di arrotondamento non corrette. - + Inaccurate NaN handling Gestione inaccurata NaN - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Disattiva i controlli dello spazio degli indirizzi - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Ignora il monitor globale - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Dispositivo: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Back-end degli shader: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Risoluzione: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Filtro di adattamento alla finestra: - + FSR Sharpness: Nitidezza FSR: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Metodo di anti-aliasing: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Modalità schermo intero: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Rapporto d'aspetto: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Utilizza la cache delle pipeline su disco - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Utilizza l'emulazione asincrona della GPU - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Emulazione NVDEC: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - + ASTC Decoding Method: Metodo di decodifica ASTC: - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - + ASTC Recompression Method: Metodo di ricompressione ASTC: - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Modalità VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +599,34 @@ Mailbox può avere una latenza minore del FIFO, senza presentare alcun tearing, Immediato migliora la latenza ma causa tearing. - + Enable asynchronous presentation (Vulkan only) Abilita la presentazione asincrona (solo Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Forza clock massimi (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Esegue del lavoro in background durante l'attesa dei comandi grafici per evitare che la GPU diminuisca la sua velocità di clock. - + Anisotropic Filtering: Filtro anisotropico: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Livello di accuratezza: + Livello di accuratezza: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Utilizza la compilazione asincrona degli shader (espediente) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Utilizza il Fast GPU Time (espediente) @@ -905,23 +636,17 @@ This feature is experimental. Abilita il Fast GPU Time. Questa opzione forzerà la maggior parte dei giochi ad essere eseguiti alla loro massima risoluzione nativa. - + Use Vulkan pipeline cache Utilizza la cache delle pipeline di Vulkan - - Enables GPU vendor-specific pipeline cache. -This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - - - - + Enable Compute Pipelines (Intel Vulkan Only) Abilita le compute pipeline (solo per Vulkan su Intel) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -930,960 +655,1332 @@ Questa opzione può causare crash ed è compatibile solo con i driver proprietar Le compute pipeline sono sempre abilitate su tutti gli altri driver. - + Enable Reactive Flushing Abilita il flushing reattivo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilizza il flushing reattivo invece di quello predittivo, al fine di ottenere una sincronizzazione della memoria più accurata. - + Sync to framerate of video playback Sincronizza il framerate a quello del video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Esegue il gioco a velocità normale durante le cutscene, anche quando il framerate è sbloccato. - + Barrier feedback loops Barrier feedback loops - + Improves rendering of transparency effects in specific games. Migliora il rendering degli effetti di trasparenza in alcuni giochi. - + RNG Seed Seed RNG - + + Device Name + Nome del dispositivo + + + + Language: + Lingua: + + + + Note: this can be overridden when region setting is auto-select + Nota: Può essere rimpiazzato se il fuso orario della Regione è impostato su Auto + + + + Region: + Regione: + + + + Time Zone: + Fuso orario: + + + + Sound Output Mode: + Modalità di output del suono: + + + + Console Mode: + Modalità console: + + + + Prompt for user on game boot + Richiedi utente all'avvio di un gioco + + + + Pause emulation when in background + Metti in pausa l'emulazione quando la finestra è in background + + + + Confirm before stopping emulation + Chiedi conferma prima di arrestare l'emulazione + + + + Hide mouse on inactivity + Nascondi il puntatore del mouse se inattivo + + + + Disable controller applet + Disabilita l'applet controller + + + + Enable Gamemode + Abilita Gamemode + + + + CPU + CPU + + + + GPU + GPU + + + + CPU Asynchronous + CPU (Asincrono) + + + + Uncompressed (Best quality) + Nessuna compressione (qualità migliore) + + + + BC1 (Low quality) + BC1 (qualità bassa) + + + + BC3 (Medium quality) + BC3 (qualità media) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Nullo + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (shader assembly, solo NVIDIA) + + + + SPIR-V (Experimental, AMD/Mesa Only) + SPIR-V (SPERIMENTALE, solo AMD/MESA) + + + + Normal + Normale + + + + High + Alta + + + + Extreme + Estrema + + + + Auto + Automatico + + + + Accurate + Accurata + + + + Unsafe + Non sicura + + + + Paranoid (disables most optimizations) + Paranoica (disabilita la maggior parte delle ottimizzazioni) + + + + Dynarmic + Dynarmic + + + + NCE + NCE + + + + Borderless Windowed + Finestra senza bordi + + + + Exclusive Fullscreen + Esclusivamente a schermo intero + + + + No Video Output + Nessun output video + + + + CPU Video Decoding + Decodifica video CPU + + + + GPU Video Decoding (Default) + Decodifica video GPU (predefinita) + + + + 0.5X (360p/540p) [EXPERIMENTAL] + 0.5X (360p/540p) [SPERIMENTALE] + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [SPERIMENTALE] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [SPERIMENTALE] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest neighbor + + + + Bilinear + Bilineare + + + + Bicubic + Bicubico + + + + Gaussian + Gaussiano + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Nessuna + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Predefinito (16:9) + + + + Force 4:3 + Forza 4:3 + + + + Force 21:9 + Forza 21:9 + + + + Force 16:10 + Forza 16:10 + + + + Stretch to Window + Allunga a finestra + + + + Automatic + Automatico + + + + + Default + Predefinito + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + Enables GPU vendor-specific pipeline cache. +This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Nome del dispositivo - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - - Language: - Lingua: - - - - Note: this can be overridden when region setting is auto-select - Nota: Può essere rimpiazzato se il fuso orario della Regione è impostato su Auto - - - - Region: - Regione: - - - + The region of the emulated Switch. - - Time Zone: - Fuso orario: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Modalità di output del suono: - - - - Console Mode: - Modalità console: - - - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Richiedi utente all'avvio di un gioco - - - - Pause emulation when in background - Metti in pausa l'emulazione quando la finestra è in background - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - - Confirm before stopping emulation - Chiedi conferma prima di arrestare l'emulazione - - - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Nascondi il puntatore del mouse se inattivo - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - Disabilita l'applet controller - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - - Enable Gamemode - Abilita Gamemode - - - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - - GPU - GPU - - - - CPU Asynchronous - CPU (Asincrono) - - - - Uncompressed (Best quality) - Nessuna compressione (qualità migliore) - - - - BC1 (Low quality) - BC1 (qualità bassa) - - - - BC3 (Medium quality) - BC3 (qualità media) - - - + Conservative - + Aggressive - - OpenGL - OpenGL + + Unsafe (fast) + - - Vulkan - Vulkan + + Safe (stable) + - - Null - Nullo - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (shader assembly, solo NVIDIA) - - - - SPIR-V (Experimental, AMD/Mesa Only) - SPIR-V (SPERIMENTALE, solo AMD/MESA) - - - - Normal - Normale - - - - High - Alta - - - - Extreme - Estrema - - - - Auto - Automatico - - - - Accurate - Accurata - - - - Unsafe - Non sicura - - - - Paranoid (disables most optimizations) - Paranoica (disabilita la maggior parte delle ottimizzazioni) - - - - Dynarmic - Dynarmic - - - - NCE - NCE - - - - Borderless Windowed - Finestra senza bordi - - - - Exclusive Fullscreen - Esclusivamente a schermo intero - - - - No Video Output - Nessun output video - - - - CPU Video Decoding - Decodifica video CPU - - - - GPU Video Decoding (Default) - Decodifica video GPU (predefinita) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - - 0.5X (360p/540p) [EXPERIMENTAL] - 0.5X (360p/540p) [SPERIMENTALE] - - - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [SPERIMENTALE] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [SPERIMENTALE] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest neighbor - - - - Bilinear - Bilineare - - - - Bicubic - Bicubico - - - - Gaussian - Gaussiano - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Nessuna - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Predefinito (16:9) - - - - Force 4:3 - Forza 4:3 - - - - Force 21:9 - Forza 21:9 - - - - Force 16:10 - Forza 16:10 - - - - Stretch to Window - Allunga a finestra - - - - Automatic - Automatico - - - - Default - Predefinito - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - - + + Serbian (српски) + + + + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1892,37 +1989,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai @@ -2275,27 +2372,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Logging - + Open Log Location Apri cartella dei log - + Global Log Filter Filtro log globale - + When checked, the max size of the log increases from 100 MB to 1 GB Quando l'opzione è selezionata, la dimensione massima del log aumenterà da 100 MB a 1 GB - + Enable Extended Logging** Abilita il log esteso** - + Show Log in Console Mostra i log nella console @@ -2441,7 +2538,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2503,7 +2600,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**L'opzione verrà automaticamente ripristinata alla chiusura di yuzu. - + Web applet not compiled Applet web non compilato @@ -2553,7 +2650,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2562,88 +2659,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Alcune impostazioni sono disponibili soltanto quando un gioco non è in esecuzione. - + Applets - - + + Audio Audio - - + + CPU CPU - + Debug Debug - + Filesystem Filesystem - - + + General Generale - - + + Graphics Grafica - + GraphicsAdvanced Grafica avanzata - + GraphicsExtensions - + Hotkeys Scorciatoie - - + + Controls Comandi - + Profiles Profili - + Network Rete - - + + System Sistema - + Game List Lista dei giochi - + Web Web @@ -2741,51 +2838,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Elimina cache dei metadati - + Select Emulated NAND Directory... Seleziona la cartella della NAND emulata... - + Select Emulated SD Directory... Seleziona la cartella della scheda SD emulata... - + Select Gamecard Path... Seleziona il percorso della cartuccia di gioco... - + Select Dump Directory... Seleziona la cartella di estrazione... - + Select Mod Load Directory... Seleziona la cartella per il caricamento delle mod... - The metadata cache is already empty. - La cache dei metadati è già vuota. + La cache dei metadati è già vuota. - The operation completed successfully. - L'operazione è stata completata con successo. + L'operazione è stata completata con successo. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Impossibile eliminare la cache dei metadati. Potrebbe essere in uso o inesistente. + Impossibile eliminare la cache dei metadati. Potrebbe essere in uso o inesistente. @@ -2816,12 +2907,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Tutte le impostazioni verranno ripristinate e tutte le configurazioni dei giochi verranno rimosse. Le cartelle di gioco, i profili e i profili di input non saranno cancellati. Vuoi procedere? @@ -2854,33 +2945,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Colore dello sfondo: - + % FSR sharpening percentage (e.g. 50%) % - + Off Disattivato - + VSync Off VSync disattivato - + Recommended Consigliata - + On Attivato - + VSync On VSync attivato @@ -2917,14 +3008,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2956,75 +3051,75 @@ These settings are experimental, and may cause black screens. If your games fail Ripristina predefinite - + Action Azione - + Hotkey Scorciatoia - + Controller Hotkey Scorciatoia del controller - - - + + + Conflicting Key Sequence Sequenza di tasti in conflitto - - + + The entered key sequence is already assigned to: %1 La sequenza di tasti inserita è già assegnata a: %1 - + [waiting] [in attesa] - + Invalid Non valido - + Invalid hotkey settings Impostazioni delle scorciatoie non valide - + An error occurred. Please report this issue on github. Errore durante la configurazione. Segnala quest'errore alla pagina Github di Yuzu. - + Restore Default Ripristina predefinita - + Clear Cancella - + Conflicting Button Sequence Sequenza di pulsanti in conflitto - + The default button sequence is already assigned to: %1 La sequenza di pulsanti predefinita è già assegnata a: %1 - + The default key sequence is already assigned to: %1 La sequenza di tasti predefinita è già assegnata a: %1 @@ -3344,7 +3439,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3499,7 +3594,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Levetta sinistra @@ -3609,14 +3704,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3635,7 +3730,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Più @@ -3648,15 +3743,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3701,7 +3796,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Levetta destra @@ -3716,242 +3811,242 @@ These settings are experimental, and may cause black screens. If your games fail Configura - - - - + + + + Clear Cancella - - - - - + + + + + [not set] [non impost.] - - - + + + Invert button Inverti pulsante - - + + Toggle button Premi il pulsante - + Turbo button Modalità Turbo - - + + Invert axis Inverti asse - - - + + + Set threshold Imposta soglia - - + + Choose a value between 0% and 100% Scegli un valore compreso tra 0% e 100% - + Toggle axis Cancella asse - + Set gyro threshold Imposta soglia del giroscopio - + Calibrate sensor Calibra sensore - + Map Analog Stick Mappa la levetta analogica - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Dopo aver premuto OK, prima muovi la levetta orizzontalmente, e poi verticalmente. Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalmente. - + Center axis Centra asse - - + + Deadzone: %1% Zona morta: %1% - - + + Modifier Range: %1% Modifica raggio: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Due Joycon - + Left Joycon Joycon sinistro - + Right Joycon Joycon destro - + Handheld Portatile - + GameCube Controller Controller GameCube - + Poke Ball Plus Poké Ball Plus - + NES Controller Controller NES - + SNES Controller Controller SNES - + N64 Controller Controller N64 - + Sega Genesis Sega Genesis - + Start / Pause Avvia / Metti in pausa - + Z Z - + Control Stick Levetta di Controllo - + C-Stick Levetta C - + Shake! Scuoti! - + [waiting] [in attesa] - + New Profile Nuovo profilo - + Enter a profile name: Inserisci un nome profilo: - - + + Create Input Profile Crea un profilo di input - + The given profile name is not valid! Il nome profilo inserito non è valido! - + Failed to create the input profile "%1" Impossibile creare il profilo di input "%1" - + Delete Input Profile Elimina un profilo di input - + Failed to delete the input profile "%1" Impossibile eliminare il profilo di input "%1" - + Load Input Profile Carica un profilo di input - + Failed to load the input profile "%1" Impossibile caricare il profilo di input "%1" - + Save Input Profile Salva un profilo di Input - + Failed to save the input profile "%1" Impossibile creare il profilo di input "%1" @@ -4008,7 +4103,7 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme - + Configure Configura @@ -4044,7 +4139,7 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme - + Test Test @@ -4063,7 +4158,7 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Per saperne di più</span></a> - + %1:%2 %1:%2 @@ -4072,77 +4167,77 @@ Per invertire gli assi, prima muovi la levetta verticalmente, e poi orizzontalme yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Il numero di porta contiene caratteri non validi - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 La valore della porta deve essere compreso tra 0 e 65353 inclusi - + IP address is not valid Indirizzo IP non valido - + This UDP server already exists Questo server UDP esiste già - + Unable to add more than 8 servers Impossibile aggiungere più di 8 server - + Testing Testando - + Configuring Configurando - + Test Successful Test riuscito - + Successfully received data from the server. Ricevuti con successo dati dal server. - + Test Failed Test fallito - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Impossibile ricevere dati validi dal server.<br> Verificare che il server sia impostato correttamente e che indirizzo e porta siano corretti. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. È in corso il test UDP o la configurazione della calibrazione,<br> attendere che finiscano. @@ -4273,7 +4368,12 @@ Per attivarlo, disattiva il mouse emulato. Interfaccia di rete - + + Enable Airplane Mode + + + + None Nessuna @@ -4331,52 +4431,52 @@ Per attivarlo, disattiva il mouse emulato. Alcune impostazioni sono disponibili soltanto quando un gioco non è in esecuzione. - + Add-Ons Add-on - + System Sistema - + CPU CPU - + Graphics Grafica - + Adv. Graphics Grafica (Avanzate) - + GPU Extensions - + Audio Audio - + Input Profiles Profili di input - + Linux Linux - + Properties Proprietà @@ -4394,12 +4494,12 @@ Per attivarlo, disattiva il mouse emulato. Add-on - + Patch Name Nome della patch - + Version Versione @@ -4437,27 +4537,32 @@ Per attivarlo, disattiva il mouse emulato. Imposta immagine - + + Select Avatar + + + + Add Aggiungi - + Rename Rinomina - + Remove Rimuovi - + Profile management is available only when game is not running. La gestione dei profili è disponibile solamente quando il gioco non è in esecuzione. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4465,100 +4570,189 @@ Per attivarlo, disattiva il mouse emulato. %2 - + Enter Username Inserisci il nome utente - + Users Utenti - + Enter a username for the new user: Inserisci un nome utente per il nuovo utente: - + Enter a new username: Inserisci un nuovo nome utente: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Seleziona immagine utente - - JPEG Images (*.jpg *.jpeg) - Immagini JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Nessun firmware disponibile + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Immagini JPEG (*.jpg *.jpeg) + + + Error deleting image Impossibile eliminare l'immagine - + Error occurred attempting to overwrite previous image at: %1. Impossibile sovrascrivere l'immagine precedente in: %1. - + Error deleting file Impossibile eliminare il file - + Unable to delete existing file: %1. Impossibile eliminare il file già esistente: %1. - + Error creating user image directory Impossibile creare la cartella delle immagini dell'utente - + Unable to create directory %1 for storing user images. Impossibile creare la cartella %1 per archiviare le immagini dell'utente. - Error copying user image - Impossibile copiare l'immagine utente + Impossibile copiare l'immagine utente - Unable to copy image from %1 to %2 - Impossibile copiare l'immagine da %1 a %2 + Impossibile copiare l'immagine da %1 a %2 - Error resizing user image - Impossibile ridimensionare l'immagine utente + Impossibile ridimensionare l'immagine utente - Unable to resize image - Impossibile ridimensionare l'immagine + Impossibile ridimensionare l'immagine + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Annulla + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Eliminare questo utente? Tutti i suoi dati di salvataggio verranno rimossi. - + Confirm Delete Conferma eliminazione - + Name: %1 UUID: %2 Nome: %1 @@ -4611,7 +4805,7 @@ UUID: %2 - + Enable Abilita @@ -4622,7 +4816,7 @@ UUID: %2 - + Not connected Non connesso @@ -4632,63 +4826,63 @@ UUID: %2 Ripristina valori predefiniti - + Clear Cancella - + [not set] [non impost.] - + Invert axis Inverti asse - - + + Deadzone: %1% Zona morta: %1% - + Error enabling ring input Impossibile abilitare il Ring-Con - + Direct Joycon driver is not enabled Il driver Joycon diretto non è abilitato - + Configuring Configurando - + The current mapped device doesn't support the ring controller L'attuale dispositivo mappato non supporta il Ring-Con - + The current mapped device doesn't have a ring attached L'attuale dispositivo mappato non è collegato a un Ring-Con - + The current mapped device is not connected L'attuale dispositivo mappato non è connesso. - + Unexpected driver result %1 Risultato imprevisto del driver: %1 - + [waiting] [in attesa] @@ -4730,7 +4924,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4782,12 +4976,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Configurazione TAS - + Select TAS Load Directory... Seleziona la cartella di caricamento TAS... @@ -4897,7 +5091,7 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5217,6 +5411,16 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Servizio web di yuzu @@ -5226,42 +5430,29 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Fornendo i tuoi nome utente e token, permetti a yuzu di raccogliere dati di utilizzo aggiuntivi, che potrebbero contenere informazioni identificative dell'utente. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verifica + Verifica - Sign up - Registrati + Registrati - + Token: Token: - + Username: Nome utente: - What is my token? - Qual è il mio token? + Qual è il mio token? - + Web Service configuration can only be changed when a public room isn't being hosted. La configurazione del servizio web può essere cambiata solo quando non si sta ospitando una stanza pubblica. @@ -5286,12 +5477,12 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Rigenera - + Discord Presence Discord Presence - + Show Current Game in your Discord Status Mostra il gioco in uso nel tuo stato di Discord @@ -5300,24 +5491,8 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Per saperne di più</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrati</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrati</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5340,10 +5515,9 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Il token non è stato verificato. La modifica al token non è stata salvata. - Unverified, please click Verify before saving configuration Tooltip - Non verificato, clicca su "Verifica" prima di salvare la configurazione + Non verificato, clicca su "Verifica" prima di salvare la configurazione Verifying... @@ -5367,20 +5541,67 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Verifica fallita. Controlla di aver inserito il token correttamente, e che la tua connessione a internet sia funzionante. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controller G1 - + &Controller P1 &Controller G1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versione + + DirectConnect @@ -5486,7 +5707,12 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5494,11 +5720,6 @@ Trascina i punti per cambiare posizione, oppure clicca due volte la cella in tab The host of the room has banned you. Speak with the host to unban you or try a different room. L'host della stanza ti ha bannato. Chiedi all'host di revocare il ban o trova un'altra stanza. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5560,7 +5781,7 @@ Vai su Configura -> Sistema -> Rete e selezionane una. Telemetria - + Broken Vulkan Installation Detected Rilevata installazione di Vulkan non funzionante @@ -5569,24 +5790,24 @@ Vai su Configura -> Sistema -> Rete e selezionane una. L'inizializzazione di Vulkan è fallita durante l'avvio.<br><br>Clicca <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>qui per istruzioni su come risolvere il problema</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gioco in esecuzione - + Loading Web Applet... Caricamento dell'applet web... - - + + Disable Web Applet Disabilita l'applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Disabilitare l'applet web potrebbe causare dei comportamenti indesiderati. @@ -5594,82 +5815,81 @@ Da usare solo con Super Mario 3D All-Stars. Sei sicuro di voler procedere? (Puoi riabilitarlo quando vuoi nelle impostazioni di Debug.) - + The amount of shaders currently being built Il numero di shader in fase di compilazione - + The current selected resolution scaling multiplier. Il moltiplicatore corrente dello scaling della risoluzione. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocità corrente dell'emulazione. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente rispetto a una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Il numero di fotogrammi al secondo che il gioco visualizza attualmente. Può variare in base al gioco e alla situazione. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma della Switch, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + Unmute Riattiva - + Mute Silenzia - + Reset Volume Reimposta volume - + &Clear Recent Files &Cancella i file recenti - + &Continue &Continua - + &Pause &Pausa - Warning Outdated Game Format - Formato del gioco obsoleto + Formato del gioco obsoleto You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Stai usando una cartella contenente una ROM decostruita per avviare questo gioco, che è un formato obsoleto e sostituito da NCA, NAX, XCI o NSP. Le ROM decostruite non hanno icone, metadati e non supportano gli aggiornamenti. <br><br>Per una spiegazione sui vari formati della Switch supportati da yuzu, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>consulta la nostra wiki (in inglese)</a>. Non riceverai di nuovo questo avviso. - - + + Error while loading ROM! Errore nel caricamento della ROM! - + The ROM format is not supported. Il formato della ROM non è supportato. - + An error occurred initializing the video core. È stato riscontrato un errore nell'inizializzazione del core video. @@ -5679,7 +5899,7 @@ Da usare solo con Super Mario 3D All-Stars. Sei sicuro di voler procedere? Consulta il log per maggiori dettagli. Se hai bisogno di aiuto per accedere ai log, consulta questa pagina (in inglese): <a href='https://yuzu-emu.org/help/reference/log-files/'>Come caricare i file di log</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Errore nel caricamento della ROM! %1 @@ -5690,473 +5910,405 @@ Consulta il log per maggiori dettagli. Se hai bisogno di aiuto per accedere ai l %1<br>Segui <a href='https://yuzu-emu.org/help/quickstart/'>la guida introduttiva di yuzu</a> per rifare il dump dei file.<br>Puoi dare un occhiata alla wiki di yuzu (in inglese)</a> o al server Discord di yuzu</a> per assistenza. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Visualizza il log per maggiori dettagli. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Chiusura del software in corso... - + Save Data Dati di salvataggio - + Mod Data Dati delle mod - + Error Opening %1 Folder Impossibile aprire la cartella %1 - - + + Folder does not exist! La cartella non esiste! - Error Opening Transferable Shader Cache - Impossibile aprire la cache trasferibile degli shader + Impossibile aprire la cache trasferibile degli shader - Failed to create the shader cache directory for this title. - Impossibile creare la cartella della cache degli shader per questo titolo. + Impossibile creare la cartella della cache degli shader per questo titolo. - Error Removing Contents - Impossibile rimuovere il contentuto + Impossibile rimuovere il contentuto - Error Removing Update - Impossibile rimuovere l'aggiornamento + Impossibile rimuovere l'aggiornamento - Error Removing DLC - Impossibile rimuovere il DLC + Impossibile rimuovere il DLC - + Remove Installed Game Contents? Rimuovere il contenuto del gioco installato? - + Remove Installed Game Update? Rimuovere l'aggiornamento installato? - + Remove Installed Game DLC? Rimuovere il DLC installato? - + Remove Entry Rimuovi voce - - - - - - Successfully Removed - Rimozione completata + Rimozione completata - Successfully removed the installed base game. - Il gioco base installato è stato rimosso con successo. + Il gioco base installato è stato rimosso con successo. - The base game is not installed in the NAND and cannot be removed. - Il gioco base non è installato su NAND e non può essere rimosso. + Il gioco base non è installato su NAND e non può essere rimosso. - Successfully removed the installed update. - Aggiornamento rimosso con successo. + Aggiornamento rimosso con successo. - There is no update installed for this title. - Non c'è alcun aggiornamento installato per questo gioco. + Non c'è alcun aggiornamento installato per questo gioco. - There are no DLC installed for this title. - Non c'è alcun DLC installato per questo gioco. + Non c'è alcun DLC installato per questo gioco. - Successfully removed %1 installed DLC. - %1 DLC rimossi con successo. + %1 DLC rimossi con successo. - + Delete OpenGL Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader OpenGL? - + Delete Vulkan Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader Vulkan? - + Delete All Transferable Shader Caches? Vuoi rimuovere tutte le cache trasferibili degli shader? - + Remove Custom Game Configuration? Rimuovere la configurazione personalizzata del gioco? - + Remove Cache Storage? Rimuovere la Storage Cache? - + Remove File Rimuovi file - + Remove Play Time Data Reimposta il tempo di gioco - + Reset play time? Vuoi reimpostare il tempo di gioco? - - Error Removing Transferable Shader Cache - Impossibile rimuovere la cache trasferibile degli shader + Impossibile rimuovere la cache trasferibile degli shader - - A shader cache for this title does not exist. - Per questo titolo non esiste una cache degli shader. + Per questo titolo non esiste una cache degli shader. - Successfully removed the transferable shader cache. - La cache trasferibile degli shader è stata rimossa con successo. + La cache trasferibile degli shader è stata rimossa con successo. - Failed to remove the transferable shader cache. - Impossibile rimuovere la cache trasferibile degli shader. + Impossibile rimuovere la cache trasferibile degli shader. - Error Removing Vulkan Driver Pipeline Cache - Impossibile rimuovere la cache delle pipeline del driver Vulkan + Impossibile rimuovere la cache delle pipeline del driver Vulkan - Failed to remove the driver pipeline cache. - Impossibile rimuovere la cache delle pipeline del driver. + Impossibile rimuovere la cache delle pipeline del driver. - - Error Removing Transferable Shader Caches - Impossibile rimuovere le cache trasferibili degli shader + Impossibile rimuovere le cache trasferibili degli shader - Successfully removed the transferable shader caches. - Le cache trasferibili degli shader sono state rimosse con successo. + Le cache trasferibili degli shader sono state rimosse con successo. - Failed to remove the transferable shader cache directory. - Impossibile rimuovere la cartella della cache trasferibile degli shader. + Impossibile rimuovere la cartella della cache trasferibile degli shader. - - Error Removing Custom Configuration - Impossibile rimuovere la configurazione personalizzata + Impossibile rimuovere la configurazione personalizzata - A custom configuration for this title does not exist. - Non esiste una configurazione personalizzata per questo gioco. + Non esiste una configurazione personalizzata per questo gioco. - Successfully removed the custom game configuration. - La configurazione personalizzata del gioco è stata rimossa con successo. + La configurazione personalizzata del gioco è stata rimossa con successo. - Failed to remove the custom game configuration. - Impossibile rimuovere la configurazione personalizzata del gioco. + Impossibile rimuovere la configurazione personalizzata del gioco. - - + + RomFS Extraction Failed! Estrazione RomFS fallita! - + There was an error copying the RomFS files or the user cancelled the operation. C'è stato un errore nella copia dei file del RomFS o l'operazione è stata annullata dall'utente. - + Full Completa - + Skeleton Cartelle - + Select RomFS Dump Mode Seleziona la modalità di estrazione della RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Seleziona come vorresti estrarre la RomFS. <br>La modalità Completa copierà tutti i file in una nuova cartella mentre<br>la modalità Cartelle creerà solamente le cartelle e le sottocartelle. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Non c'è abbastanza spazio disponibile nel disco %1 per estrarre la RomFS. Libera lo spazio o seleziona una cartella di estrazione diversa in Emulazione > Configura > Sistema > File system > Cartella di estrazione - + Extracting RomFS... Estrazione RomFS in corso... - - - - - + + Cancel Annulla - + RomFS Extraction Succeeded! Estrazione RomFS riuscita! - - - + The operation completed successfully. L'operazione è stata completata con successo. - Integrity verification couldn't be performed! - Impossibile verificare l'integrità dei file. + Impossibile verificare l'integrità dei file. - File contents were not checked for validity. - I contenuti di questo file non sono stati verificati. + I contenuti di questo file non sono stati verificati. - - Verifying integrity... - Verifica dell'integrità della ROM in corso... + Verifica dell'integrità della ROM in corso... - - Integrity verification succeeded! - Verifica dell'integrità completata con successo! + Verifica dell'integrità completata con successo! - - Integrity verification failed! - Verifica dell'integrità fallita! + Verifica dell'integrità fallita! - File contents may be corrupt. - I contenuti del file potrebbero essere corrotti. + I contenuti del file potrebbero essere corrotti. - - - - Create Shortcut - Crea scorciatoia + Crea scorciatoia - Do you want to launch the game in fullscreen? - Vuoi avviare il gioco a schermo intero? + Vuoi avviare il gioco a schermo intero? - Successfully created a shortcut to %1 - Scorciatoia creata con successo in %1 + Scorciatoia creata con successo in %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Verrà creata una scorciatoia all'AppImage attuale. Potrebbe non funzionare correttamente se effettui un aggiornamento. Vuoi continuare? + Verrà creata una scorciatoia all'AppImage attuale. Potrebbe non funzionare correttamente se effettui un aggiornamento. Vuoi continuare? - Failed to create a shortcut to %1 - Impossibile creare la scorciatoia in %1 + Impossibile creare la scorciatoia in %1 - Create Icon - Crea icona + Crea icona - Cannot create icon file. Path "%1" does not exist and cannot be created. - Impossibile creare il file dell'icona. Il percorso "%1" non esiste e non può essere creato. + Impossibile creare il file dell'icona. Il percorso "%1" non esiste e non può essere creato. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Impossibile aprire %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The game properties could not be loaded. Non è stato possibile caricare le proprietà del gioco. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Eseguibile Switch (%1);;Tutti i file (*.*) - + Load File Carica file - + Open Extracted ROM Directory Apri cartella ROM estratta - + Invalid Directory Selected Cartella selezionata non valida - + The directory you have selected does not contain a 'main' file. La cartella che hai selezionato non contiene un file "main". - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) File installabili Switch (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installa file - + %n file(s) remaining %n file rimanente @@ -6164,25 +6316,25 @@ Consulta il log per maggiori dettagli. Se hai bisogno di aiuto per accedere ai l - + Installing file "%1"... Installazione del file "%1"... - - + + Install Results Risultati dell'installazione - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Per evitare possibli conflitti, sconsigliamo di installare i giochi base su NAND. Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were newly installed @@ -6193,7 +6345,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were overwritten @@ -6204,7 +6356,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) failed to install @@ -6215,492 +6367,468 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + System Application Applicazione di sistema - + System Archive Archivio di sistema - + System Application Update Aggiornamento di un'applicazione di sistema - + Firmware Package (Type A) Pacchetto firmware (tipo A) - + Firmware Package (Type B) Pacchetto firmware (tipo B) - + Game Gioco - + Game Update Aggiornamento di gioco - + Game DLC DLC - + Delta Title Titolo delta - + Select NCA Install Type... Seleziona il tipo di installazione NCA - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleziona il tipo del file NCA da installare: (Nella maggior parte dei casi, il valore predefinito 'Gioco' va bene.) - + Failed to Install Installazione fallita - + The title type you selected for the NCA is invalid. Il tipo che hai selezionato per l'NCA non è valido. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + OK OK - - + + Hardware requirements not met Requisiti hardware non soddisfatti - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Il tuo sistema non soddisfa i requisiti hardware consigliati. La funzionalità di segnalazione della compatibilità è stata disattivata. - + Missing yuzu Account Account di yuzu non trovato - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Per segnalare la compatibilità di un gioco, devi collegare il tuo account yuzu. <br><br/>Per collegare il tuo account yuzu, vai su Emulazione &gt; Configurazione &gt; Web. - + Error opening URL Impossibile aprire l'URL - + Unable to open the URL "%1". Non è stato possibile aprire l'URL "%1". - + TAS Recording Registrazione TAS - + Overwrite file of player 1? Vuoi sovrascrivere il file del giocatore 1? - + Invalid config detected Rilevata configurazione non valida - + Handheld controller can't be used on docked mode. Pro controller will be selected. Il controller portatile non può essere utilizzato in modalità dock. Verrà selezionato il controller Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'Amiibo corrente è stato rimosso - + Error Errore - - + + The current game is not looking for amiibos Il gioco in uso non è alla ricerca di Amiibo - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Error loading Amiibo data Impossibile caricare i dati dell'Amiibo - + The selected file is not a valid amiibo Il file selezionato non è un Amiibo valido - + The selected file is already on use Il file selezionato è già in uso - + An unknown error occurred Si è verificato un errore sconosciuto - - Verification failed for the following files: %1 - La verifica sui seguenti file è fallita: + La verifica sui seguenti file è fallita: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available Nessun firmware disponibile - Please install the firmware to use the Album applet. - Devi installare il firmware per usare l'applet dell'album. + Devi installare il firmware per usare l'applet dell'album. - + Album Applet Applet Album - + Album applet is not available. Please reinstall firmware. L'applet dell'album non è disponibile. Reinstalla il firmware. - Please install the firmware to use the Cabinet applet. - Devi installare il firmware per usare l'applet Cabinet. + Devi installare il firmware per usare l'applet Cabinet. - + Cabinet Applet Applet Cabinet - + Cabinet applet is not available. Please reinstall firmware. L'applet del Cabinet non è disponibile. Reinstalla il firmware. - Please install the firmware to use the Mii editor. - Devi installare il firmware per usare l'editor dei Mii. + Devi installare il firmware per usare l'editor dei Mii. - + Mii Edit Applet Editor dei Mii - + Mii editor is not available. Please reinstall firmware. L'editor dei Mii non è disponibile. Reinstalla il firmware. - Please install the firmware to use the Controller Menu. - Devi installare il firmware per usare il menù dei controller. + Devi installare il firmware per usare il menù dei controller. - + Controller Applet Applet controller - + Controller Menu is not available. Please reinstall firmware. Il menù dei controller non è disponibile. Reinstalla il firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Cattura screenshot - + PNG Image (*.png) Immagine PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Stato TAS: In esecuzione (%1/%2) - + TAS state: Recording %1 Stato TAS: Registrazione in corso (%1) - + TAS state: Idle %1/%2 Stato TAS: In attesa (%1/%2) - + TAS State: Invalid Stato TAS: Non valido - + &Stop Running &Interrompi - + &Start &Avvia - + Stop R&ecording Interrompi r&egistrazione - + R&ecord R&egistra - + Building: %n shader(s) Compilazione di %n shader @@ -6708,18 +6836,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Risoluzione: %1x - + Speed: %1% / %2% Velocità: %1% / %2% - + Speed: %1% Velocità: %1% @@ -6728,54 +6856,54 @@ Would you like to download it? Gioco: %1 FPS (Sbloccati) - + Game: %1 FPS Gioco: %1 FPS - + Frame: %1 ms Frame: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA NO AA - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Componenti di derivazione mancanti - + Select RomFS Dump Target Seleziona Target dell'Estrazione del RomFS - + Please select which RomFS you would like to dump. Seleziona quale RomFS vorresti estrarre. @@ -6788,7 +6916,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Sei sicuro di voler arrestare l'emulazione? Tutti i progressi non salvati verranno perduti. @@ -6801,102 +6929,102 @@ Would you like to bypass this and exit anyway? Vuoi forzare l'arresto? - + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + Area - + Docked Dock - + Handheld Portatile - + Normal Normale - + High Alta - + Extreme Estrema - + Vulkan Vulkan - + OpenGL OpenGL - + Null Nullo - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6904,13 +7032,13 @@ Vuoi forzare l'arresto? GRenderWindow - - + + OpenGL not available! OpenGL non disponibile! - + OpenGL shared contexts are not supported. Gli shared context di OpenGL non sono supportati. @@ -6919,33 +7047,33 @@ Vuoi forzare l'arresto? yuzu è stato compilato senza il supporto a OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Errore durante l'inizializzazione di OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. La tua GPU potrebbe non supportare OpenGL, o non hai installato l'ultima versione dei driver video. - + Error while initializing OpenGL 4.6! Errore durante l'inizializzazione di OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 La tua GPU potrebbe non supportare OpenGL 4.6, o non hai installato l'ultima versione dei driver video.<br><br>Renderer GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 La tua GPU potrebbe non supportare una o più estensioni OpenGL richieste. Assicurati di aver installato i driver video più recenti.<br><br>Renderer GL:<br>%1<br><br>Estensioni non supportate:<br>%2 @@ -6953,128 +7081,128 @@ Vuoi forzare l'arresto? GameList - + Favorite Preferito - + Start Game Avvia gioco - + Start Game without Custom Configuration Avvia gioco senza la configurazione personalizzata - + Open Save Data Location Apri la cartella dei dati di salvataggio - + Open Mod Data Location Apri la cartella delle mod - + Open Transferable Pipeline Cache Apri la cartella della cache trasferibile delle pipeline - + Remove Rimuovi - + Remove Installed Update Rimuovi l'aggiornamento installato - + Remove All Installed DLC Rimuovi tutti i DLC installati - + Remove Custom Configuration Rimuovi la configurazione personalizzata - + Remove Play Time Data Reimposta il tempo di gioco - + Remove Cache Storage Rimuovi Storage Cache - + Remove OpenGL Pipeline Cache Rimuovi la cache delle pipeline OpenGL - + Remove Vulkan Pipeline Cache Rimuovi la cache delle pipeline Vulkan - + Remove All Pipeline Caches Rimuovi tutte le cache delle pipeline - + Remove All Installed Contents Rimuovi tutti i contenuti installati - + Dump RomFS Estrai RomFS - + Dump RomFS to SDMC Estrai RomFS su SDMC - + Verify Integrity Verifica Integrità - + Copy Title ID to Clipboard Copia il Title ID negli Appunti - + Navigate to GameDB entry Vai alla pagina di GameDB - + Create Shortcut Crea scorciatoia - + Add to Desktop Aggiungi al desktop - + Add to Applications Menu Aggiungi al menù delle applicazioni - + Configure Game @@ -7083,62 +7211,62 @@ Vuoi forzare l'arresto? Proprietà - + Scan Subfolders Scansiona le sottocartelle - + Remove Game Directory Rimuovi cartella dei giochi - + ▲ Move Up ▲ Sposta in alto - + ▼ Move Down ▼ Sposta in basso - + Open Directory Location Apri cartella - + Clear Cancella - + Name Nome - + Compatibility Compatibilità - + Add-ons Add-on - + File type Tipo di file - + Size Dimensione - + Play time Tempo di gioco @@ -7146,62 +7274,62 @@ Vuoi forzare l'arresto? GameListItemCompat - + Ingame In-game - + Game starts, but crashes or major glitches prevent it from being completed. Il gioco parte, ma non può essere completato a causa di arresti anomali o di glitch importanti. - + Perfect Perfetto - + Game can be played without issues. Il gioco funziona senza problemi. - + Playable Giocabile - + Game functions with minor graphical or audio glitches and is playable from start to finish. Il gioco presenta alcuni glitch audio o video minori ed è possibile giocare dall'inizio alla fine. - + Intro/Menu Intro/Menù - + Game loads, but is unable to progress past the Start Screen. Il gioco si avvia, ma è impossibile proseguire oltre la schermata iniziale. - + Won't Boot Non si avvia - + The game crashes when attempting to startup. Il gioco si blocca quando viene avviato. - + Not Tested Non testato - + The game has not yet been tested. Il gioco non è ancora stato testato. @@ -7209,7 +7337,7 @@ Vuoi forzare l'arresto? GameListPlaceholder - + Double-click to add a new folder to the game list Clicca due volte per aggiungere una nuova cartella alla lista dei giochi @@ -7217,7 +7345,7 @@ Vuoi forzare l'arresto? GameListSearchField - + %1 of %n result(s) %1 di %n risultato @@ -7225,12 +7353,12 @@ Vuoi forzare l'arresto? - + Filter: Filtro: - + Enter pattern to filter Inserisci pattern per filtrare @@ -7312,7 +7440,7 @@ Vuoi forzare l'arresto? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7326,190 +7454,190 @@ Messaggio di debug: Hotkeys - + Audio Mute/Unmute Attiva/disattiva l'audio - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Finestra principale - + Audio Volume Down Abbassa il volume dell'audio - + Audio Volume Up Alza il volume dell'audio - + Capture Screenshot Cattura screenshot - + Change Adapting Filter Cambia filtro di adattamento - + Change Docked Mode Cambia modalità console - + Change GPU Accuracy Cambia accuratezza GPU - + Configure Configura - + Configure Current Game - + Continue/Pause Emulation Continua/Metti in pausa l'emulazione - + Exit Fullscreen Esci dalla modalità schermo intero + + + Exit Eden + + Exit yuzu Esci da yuzu - - Exit eden - - - - + Fullscreen Schermo intero - + Load File Carica file - + Load/Remove Amiibo Carica/Rimuovi Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Riavvia l'emulazione - + Stop Emulation Arresta l'emulazione - + TAS Record Registra TAS - + TAS Reset Reimposta TAS - + TAS Start/Stop Avvia/interrompi TAS - + Toggle Filter Bar Mostra/nascondi la barra del filtro - + Toggle Framerate Limit Attiva/disattiva il limite del framerate - + Toggle Mouse Panning Attiva/disattiva il mouse panning - + Toggle Renderdoc Capture - + Toggle Status Bar Mostra/nascondi la barra di stato @@ -7517,22 +7645,22 @@ Messaggio di debug: InstallDialog - + Please confirm these are the files you wish to install. Conferma che questi sono i file che vuoi installare. - + Installing an Update or DLC will overwrite the previously installed one. Installare un aggiornamento o un DLC sostituirà quello precedente. - + Install Installa - + Install Files to NAND Installa file su NAND @@ -7540,7 +7668,7 @@ Messaggio di debug: LimitableInputDialog - + The text can't contain any of the following characters: %1 Il testo non può contenere i seguenti caratteri: @@ -7687,152 +7815,207 @@ Messaggio di debug: File &recenti - + + Open &Eden Folders + + + + &Emulation &Emulazione - + &View &Visualizza - + &Reset Window Size &Ripristina dimensioni della finestra - + &Debugging &Debug - + Reset Window Size to &720p Ripristina le dimensioni della finestra a &720p - + Reset Window Size to 720p Ripristina le dimensioni della finestra a 720p - + Reset Window Size to &900p Ripristina le dimensioni della finestra a &900p - + Reset Window Size to 900p Ripristina le dimensioni della finestra a 900p - + Reset Window Size to &1080p Ripristina le dimensioni della finestra a &1080p - + Reset Window Size to 1080p Ripristina le dimensioni della finestra a 1080p - + &Multiplayer &Multigiocatore - + &Tools &Strumenti - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Aiuto - + &Install Files to NAND... &Installa file su NAND... - + L&oad File... Carica &file... - + Load &Folder... Carica &cartella... - + E&xit &Esci - + &Pause &Pausa - + &Stop Arre&sta - + &Verify Installed Contents &Verifica i contenuti installati - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7841,97 +8024,97 @@ Messaggio di debug: &Informazioni su yuzu - + Single &Window Mode &Modalità finestra singola - + Con&figure... Configura... - + Ctrl+, - + Display D&ock Widget Headers Visualizza le intestazioni del dock dei widget - + Show &Filter Bar Mostra barra del &filtro - + Show &Status Bar Mostra barra di &stato - + Show Status Bar Mostra barra di stato - + &Browse Public Game Lobby &Sfoglia lobby di gioco pubblica - + &Create Room &Crea stanza - + &Leave Room &Esci dalla stanza - + &Direct Connect to Room Collegamento &diretto alla stanza - + &Show Current Room &Mostra stanza attuale - + F&ullscreen Schermo intero - + &Restart &Riavvia - + Load/Remove &Amiibo... Carica/Rimuovi &Amiibo... - + &Report Compatibility &Segnala la compatibilità - + Open &Mods Page Apri la pagina delle &mod - + Open &Quickstart Guide Apri la &guida introduttiva - + &FAQ &Domande frequenti @@ -7940,77 +8123,82 @@ Messaggio di debug: Apri la cartella di yuzu - + &Capture Screenshot Cattura schermo - + Open &Album Apri l'&album - + &Set Nickname and Owner &Imposta nickname e proprietario - + &Delete Game Data &Rimuovi i dati di gioco - + &Restore Amiibo &Ripristina gli Amiibo - + &Format Amiibo &Formatta gli Amiibo - + Open &Mii Editor Apri l'&editor dei Mii - + &Configure TAS... &Configura TAS... - + Configure C&urrent Game... Configura il gioco in uso... - + &Start &Avvia - + &Reset &Reimposta - + R&ecord R&egistra - + Open &Controller Menu Apri il menù dei &controller - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -8018,26 +8206,36 @@ Messaggio di debug: MicroProfileDialog - &MicroProfile - MicroProfile + MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8097,37 +8295,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Stato connessione attuale - + Not Connected. Click here to find a room! Non connesso. Clicca qui per trovare una stanza! - + Not Connected Non connesso - + Connected Connesso - + New Messages Received Nuovi messaggi ricevuti - + Error Errore - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Impossibile aggiornare le informazioni della stanza. Controlla la tua connessione a internet e prova a ospitare la stanza di nuovo. @@ -8319,56 +8517,56 @@ p, li { white-space: pre-wrap; } Non in gioco - + Installed SD Titles Titoli SD installati - + Installed NAND Titles Titoli NAND installati - + System Titles Titoli di sistema - + Add New Game Directory Aggiungi nuova cartella dei giochi - + Favorites Preferiti - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [non impost.] @@ -8379,14 +8577,14 @@ p, li { white-space: pre-wrap; } Hat %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Asse %1%2 @@ -8397,357 +8595,357 @@ p, li { white-space: pre-wrap; } Pulsante %1 - - - - - - + + + + + + [unknown] [sconosciuto] - - - + + + Left Sinistra - - - + + + Right Destra - - - + + + Down Giù - - - + + + Up Su - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Cerchio - - + + Cross Croce - - + + Square Quadrato - - + + Triangle Triangolo - - + + Share Condividi - - + + Options Opzioni - - + + [undefined] [indefinito] - + %1%2 %1%2 - - + + [invalid] [non valido] - - + + %1%2Hat %3 %1%2Freccia %3 - - - + + + %1%2Axis %3 %1%2Asse %3 - - + + %1%2Axis %3,%4,%5 %1%2Asse %3,%4,%5 - - + + %1%2Motion %3 %1%2Movimento %3 - - + + %1%2Button %3 %1%2Pulsante %3 - - + + [unused] [inutilizzato] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Levetta L - + Stick R Levetta R - + Plus Più - + Minus Meno - - + + Home Home - + Capture Cattura - + Touch Touch - + Wheel Indicates the mouse wheel Rotella - + Backward Indietro - + Forward Avanti - + Task Comando - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Freccia %4 - - + + %1%2%3Axis %4 %1%2%3Asse %4 - - + + %1%2%3Button %4 %1%2%3Pulsante %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8865,6 +9063,300 @@ p, li { white-space: pre-wrap; } Vuoi ripristinare questo Amiibo? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Annulla + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + La verifica sui seguenti file è fallita: + +%1 + + + + + Verifying integrity... + Verifica dell'integrità della ROM in corso... + + + + + Integrity verification succeeded! + Verifica dell'integrità completata con successo! + + + + + The operation completed successfully. + L'operazione è stata completata con successo. + + + + + Integrity verification failed! + Verifica dell'integrità fallita! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Impossibile rimuovere il contentuto + + + + Error Removing Update + Impossibile rimuovere l'aggiornamento + + + + Error Removing DLC + Impossibile rimuovere il DLC + + + + The base game is not installed in the NAND and cannot be removed. + Il gioco base non è installato su NAND e non può essere rimosso. + + + + There is no update installed for this title. + Non c'è alcun aggiornamento installato per questo gioco. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Rimozione completata + + + + Successfully removed %1 installed DLC. + %1 DLC rimossi con successo. + + + + + Error Removing Transferable Shader Cache + Impossibile rimuovere la cache trasferibile degli shader + + + + + A shader cache for this title does not exist. + Per questo titolo non esiste una cache degli shader. + + + + Successfully removed the transferable shader cache. + La cache trasferibile degli shader è stata rimossa con successo. + + + + Failed to remove the transferable shader cache. + Impossibile rimuovere la cache trasferibile degli shader. + + + + Error Removing Vulkan Driver Pipeline Cache + Impossibile rimuovere la cache delle pipeline del driver Vulkan + + + + Failed to remove the driver pipeline cache. + Impossibile rimuovere la cache delle pipeline del driver. + + + + + Error Removing Transferable Shader Caches + Impossibile rimuovere le cache trasferibili degli shader + + + + Successfully removed the transferable shader caches. + Le cache trasferibili degli shader sono state rimosse con successo. + + + + Failed to remove the transferable shader cache directory. + Impossibile rimuovere la cartella della cache trasferibile degli shader. + + + + + Error Removing Custom Configuration + Impossibile rimuovere la configurazione personalizzata + + + + A custom configuration for this title does not exist. + Non esiste una configurazione personalizzata per questo gioco. + + + + Successfully removed the custom game configuration. + La configurazione personalizzata del gioco è stata rimossa con successo. + + + + Failed to remove the custom game configuration. + Impossibile rimuovere la configurazione personalizzata del gioco. + + + + Reset Metadata Cache + Elimina cache dei metadati + + + + The metadata cache is already empty. + La cache dei metadati è già vuota. + + + + The operation completed successfully. + L'operazione è stata completata con successo. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Impossibile eliminare la cache dei metadati. Potrebbe essere in uso o inesistente. + + + + Create Shortcut + Crea scorciatoia + + + + Do you want to launch the game in fullscreen? + Vuoi avviare il gioco a schermo intero? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Scorciatoia creata con successo in %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Verrà creata una scorciatoia all'AppImage attuale. Potrebbe non funzionare correttamente se effettui un aggiornamento. Vuoi continuare? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Impossibile creare la scorciatoia in %1 + + + + Create Icon + Crea icona + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Impossibile creare il file dell'icona. Il percorso "%1" non esiste e non può essere creato. + + + + No firmware available + Nessun firmware disponibile + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9160,7 +9652,7 @@ Riprova o contatta gli sviluppatori del programma. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9168,7 +9660,7 @@ Riprova o contatta gli sviluppatori del programma. %2 - + Users Utenti @@ -9292,7 +9784,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Stack chiamata @@ -9300,12 +9792,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread atteso da nessun thread @@ -9313,102 +9805,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable eseguibile - + paused In Pausa - + sleeping Attende... - + waiting for IPC reply attende una risposta dell'IPC - + waiting for objects Attendendo gli Oggetti... - + waiting for condition variable aspettando la condition variable - + waiting for address arbiter attende un indirizzo arbitrio - + waiting for suspend resume in attesa di riprendere la sospensione - + waiting attendere - + initialized inizializzato - + terminated terminato - + unknown sconosciuto - + PC = 0x%1 LR = 0x%2 Program Counter = 0x%1 LR = 0x%2 - + ideal ideale - + core %1 core %1 - + processor = %1 CPU = %1 - + affinity mask = %1 Maschera Affinità = %1 - + thread id = %1 ID Thread: %1 - + priority = %1(current) / %2(normal) priorità = %1(corrente) / %2(normale) - + last running ticks = %1 Ultimi ticks in esecuzione = %1. @@ -9416,7 +9908,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread atteso dal thread @@ -9424,7 +9916,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 7420497aa6..cca7121405 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... サーバーと通信中... - + Cancel キャンセル - + Touch the top left corner <br>of your touchpad. タッチパッドの左上を<br>タッチして下さい。 - + Now touch the bottom right corner <br>of your touchpad. 次にタッチパッドの右下を<br>タッチして下さい。 - + Configuration completed! 設定完了! - + OK OK @@ -397,439 +397,188 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error エラー - - Net connect - - - - - Player select - - - - + Software keyboard ソフトウェアキーボード - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: 出力エンジン: - + Output Device: 出力デバイス: - + Input Device: 入力デバイス: - - Mute audio - - - - + Volume: 音量: - + Mute audio when in background 非アクティブ時にサウンドをミュート - + Multicore CPU Emulation マルチコアCPUエミュレーション - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - + Memory Layout メモリレイアウト - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent エミュレーション速度の制限 - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: エミュレーション精度: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - + + Backend: バックエンド: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) FMAの融合を解除 (FMAに対応していないCPUのパフォーマンスを向上させる) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. このオプションは, ネイティブのFMAサポートがないCPU上で, 融合積和(fused-multiply-add)命令の精度を下げて高速化します. - + Faster FRSQRTE and FRECPE Faster FRSQRTE and FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. このオプションは、より精度の低い近似値を使用することで、近似浮動小数点関数の速度を向上させます。 - + Faster ASIMD instructions (32 bits only) 高速なASIMD命令 (32bitのみ) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. このオプションは、不正確な丸めモードで実行することにより、32ビットASIMD浮動小数点関数の速度を向上させます。 - + Inaccurate NaN handling 不正確な非数値の取り扱い - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks アドレス空間チェックの無効化 - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - - Ignore global monitor - - - - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: 使用デバイス: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: シェーダーバックエンド: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: 解像度: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: ウィンドウ適応フィルター: - + FSR Sharpness: FSR シャープネス: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: アンチエイリアス方式: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: フルスクリーンモード: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: アスペクト比: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache ディスクパイプラインキャッシュを使用 - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation 非同期GPUエミュレーションを使用する - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC エミュレーション: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - + ASTC Decoding Method: ASTC デコード方式: - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - + ASTC Recompression Method: ASTC 再圧縮方式: - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: 垂直同期: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +589,34 @@ Mailbox は FIFO よりも遅延が小さくティアリングがありません Immediate (no synchronization) は利用可能なものを何でも利用し, ティアリング発生の可能性があります. - + Enable asynchronous presentation (Vulkan only) 非同期プレゼンテーション (Vulkan のみ) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) 最大クロック強制 (Vulkan のみ) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. GPUのクロックスピードを下げないように、グラフィックコマンドを待っている間、バックグラウンドで作業を実行させます。 - + Anisotropic Filtering: 異方性フィルタリング: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - 精度: + 精度: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) 非同期でのシェーダー構築を使用 (ハック) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) 高速なGPUタイミング(ハック) @@ -905,983 +626,1359 @@ This feature is experimental. 高速なGPUタイミングを有効にします。このオプションは、ほとんどのゲームをその最高のネイティブ解像度で実行することを強制します。 - + Use Vulkan pipeline cache Vulkan パイプラインキャッシュを使用 - + + Enable Compute Pipelines (Intel Vulkan Only) + コンピュート・パイプラインの有効化(インテル Vulkan のみ) + + + + Sync to framerate of video playback + ビデオ再生のフレームレートに同期する + + + + Improves rendering of transparency effects in specific games. + 特定のゲームにおける透明エフェクトのレンダリングを改善します。 + + + + RNG Seed + 乱数シード値の変更 + + + + Device Name + デバイス名 + + + + Language: + 言語: + + + + Note: this can be overridden when region setting is auto-select + 注意:地域が自動選択の場合、設定が上書きされる可能性があります。 + + + + Region: + 地域: + + + + Time Zone: + タイムゾーン: + + + + Sound Output Mode: + 音声出力モード: + + + + Prompt for user on game boot + ゲーム起動時に確認を表示 + + + + Pause emulation when in background + 非アクティブ時にエミュレーションを一時停止 + + + + Confirm before stopping emulation + エミュレーションを停止する前に確認する + + + + Hide mouse on inactivity + 非アクティブ時にマウスカーソルを隠す + + + + Disable controller applet + コントローラーアプレットの無効化 + + + + CPU + CPU + + + + GPU + GPU + + + + CPU Asynchronous + CPU 非同期 + + + + Uncompressed (Best quality) + 圧縮しない (最高品質) + + + + BC1 (Low quality) + BC1 (低品質) + + + + BC3 (Medium quality) + BC3 (中品質) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (アセンブリシェーダー、NVIDIA のみ) + + + + SPIR-V (Experimental, AMD/Mesa Only) + SPIR-V(実験的、AMD/Mesaのみ) + + + + Normal + 標準 + + + + High + + + + + Auto + 自動 + + + + Accurate + 正確 + + + + Unsafe + 不安定 + + + + Paranoid (disables most optimizations) + パラノイド (ほとんどの最適化を無効化) + + + + Dynarmic + Dynarmic + + + + NCE + NCE + + + + Borderless Windowed + ボーダーレスウィンドウ + + + + Exclusive Fullscreen + 排他的フルスクリーン + + + + No Video Output + ビデオ出力しない + + + + CPU Video Decoding + ビデオをCPUでデコード + + + + GPU Video Decoding (Default) + ビデオをGPUでデコード (デフォルト) + + + + 0.5X (360p/540p) [EXPERIMENTAL] + 0.5X (360p/540p) [実験的] + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [実験的] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [実験的] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest Neighbor + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + Gaussian + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + なし + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + デフォルト (16:9) + + + + Force 4:3 + 強制 4:3 + + + + Force 21:9 + 強制 21:9 + + + + Force 16:10 + 強制 16:10 + + + + Stretch to Window + ウィンドウに合わせる + + + + Automatic + 自動 + + + + + Default + デフォルト + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + Ignore global monitor + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - - Enable Compute Pipelines (Intel Vulkan Only) - コンピュート・パイプラインの有効化(インテル Vulkan のみ) - - - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - - Sync to framerate of video playback - ビデオ再生のフレームレートに同期する - - - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - - Improves rendering of transparency effects in specific games. - 特定のゲームにおける透明エフェクトのレンダリングを改善します。 + + RAII + - - RNG Seed - 乱数シード値の変更 + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + - + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - デバイス名 - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - - Language: - 言語: - - - - Note: this can be overridden when region setting is auto-select - 注意:地域が自動選択の場合、設定が上書きされる可能性があります。 - - - - Region: - 地域: - - - + The region of the emulated Switch. - - Time Zone: - タイムゾーン: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - 音声出力モード: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - ゲーム起動時に確認を表示 - - - - Pause emulation when in background - 非アクティブ時にエミュレーションを一時停止 - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - - Confirm before stopping emulation - エミュレーションを停止する前に確認する - - - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - 非アクティブ時にマウスカーソルを隠す - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - コントローラーアプレットの無効化 - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - - GPU - GPU - - - - CPU Asynchronous - CPU 非同期 - - - - Uncompressed (Best quality) - 圧縮しない (最高品質) - - - - BC1 (Low quality) - BC1 (低品質) - - - - BC3 (Medium quality) - BC3 (中品質) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - + Null - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (アセンブリシェーダー、NVIDIA のみ) - - - - SPIR-V (Experimental, AMD/Mesa Only) - SPIR-V(実験的、AMD/Mesaのみ) - - - - Normal - 標準 - - - - High - - - - + Extreme - - Auto - 自動 + + Unsafe (fast) + - - Accurate - 正確 + + Safe (stable) + - - Unsafe - 不安定 - - - - Paranoid (disables most optimizations) - パラノイド (ほとんどの最適化を無効化) - - - - Dynarmic - Dynarmic - - - - NCE - NCE - - - - Borderless Windowed - ボーダーレスウィンドウ - - - - Exclusive Fullscreen - 排他的フルスクリーン - - - - No Video Output - ビデオ出力しない - - - - CPU Video Decoding - ビデオをCPUでデコード - - - - GPU Video Decoding (Default) - ビデオをGPUでデコード (デフォルト) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - - 0.5X (360p/540p) [EXPERIMENTAL] - 0.5X (360p/540p) [実験的] - - - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [実験的] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [実験的] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest Neighbor - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - Gaussian - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - なし - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - デフォルト (16:9) - - - - Force 4:3 - 強制 4:3 - - - - Force 21:9 - 強制 21:9 - - - - Force 16:10 - 強制 16:10 - - - - Stretch to Window - ウィンドウに合わせる - - - - Automatic - 自動 - - - - Default - デフォルト - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - - + + Serbian (српски) + + + + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1890,37 +1987,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB DRAM (不安定) - + Docked Docked - + Handheld 携帯モード - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない @@ -2275,27 +2372,27 @@ When a guest attempts to open the controller applet, it is immediately closed.ログ - + Open Log Location ログ出力フォルダを開く - + Global Log Filter グローバルログフィルター - + When checked, the max size of the log increases from 100 MB to 1 GB チェックすると、ログの最大サイズが100MBから1GBに増加します。 - + Enable Extended Logging** 拡張ログの有効化** - + Show Log in Console コンソールにログを表示 @@ -2441,7 +2538,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2503,7 +2600,7 @@ When a guest attempts to open the controller applet, it is immediately closed.** yuzuを終了したときに自動的にリセットされます。 - + Web applet not compiled ウェブアプレットがコンパイルされていません @@ -2553,7 +2650,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2562,88 +2659,88 @@ When a guest attempts to open the controller applet, it is immediately closed.いくつかの設定はゲームが実行中でないときのみ設定できます - + Applets - - + + Audio サウンド - - + + CPU CPU - + Debug デバッグ - + Filesystem ファイルシステム - - + + General 全般 - - + + Graphics グラフィック - + GraphicsAdvanced 拡張グラフィック - + GraphicsExtensions - + Hotkeys ホットキー - - + + Controls 操作 - + Profiles プロファイル - + Network ネットワーク - - + + System システム - + Game List ゲームリスト - + Web Web @@ -2741,51 +2838,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache メタデータのキャッシュをクリア - + Select Emulated NAND Directory... NANDディレクトリを選択... - + Select Emulated SD Directory... SDカードディレクトリを選択... - + Select Gamecard Path... ゲームカードのパスを選択... - + Select Dump Directory... ダンプディレクトリを選択... - + Select Mod Load Directory... Mod読込元ディレクトリを選択... - The metadata cache is already empty. - メタデータのキャッシュはすでに空です。 + メタデータのキャッシュはすでに空です。 - The operation completed successfully. - 処理に成功しました。 + 処理に成功しました。 - The metadata cache couldn't be deleted. It might be in use or non-existent. - メタデータのキャッシュを削除できませんでした。使用中か存在していない可能性があります。 + メタデータのキャッシュを削除できませんでした。使用中か存在していない可能性があります。 @@ -2816,12 +2907,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? すべての設定がリセットされ、ゲームごとの設定もすべて削除されます。ゲームディレクトリ、プロファイル、入力プロファイルは削除されません。続行しますか? @@ -2854,33 +2945,33 @@ When a guest attempts to open the controller applet, it is immediately closed.背景色: - + % FSR sharpening percentage (e.g. 50%) % - + Off オフ - + VSync Off VSync オフ - + Recommended 推奨 - + On オン - + VSync On VSync オン @@ -2917,14 +3008,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2956,75 +3051,75 @@ These settings are experimental, and may cause black screens. If your games fail デフォルトに戻す - + Action 操作 - + Hotkey ホットキー - + Controller Hotkey コントローラー ホットキー - - - + + + Conflicting Key Sequence 入力された組合せの衝突 - - + + The entered key sequence is already assigned to: %1 入力された組合せは既に次の操作に割り当てられています:%1 - + [waiting] [入力待ち] - + Invalid 無効 - + Invalid hotkey settings 無効なホットキー設定 - + An error occurred. Please report this issue on github. エラーが発生しました。この問題をgithubで報告してください。 - + Restore Default デフォルトに戻す - + Clear 消去 - + Conflicting Button Sequence ボタンが競合しています - + The default button sequence is already assigned to: %1 デフォルトのボタン配列はすでに %1 に割り当てられています。 - + The default key sequence is already assigned to: %1 デフォルトの組合せはすでに %1 に割り当てられています。 @@ -3344,7 +3439,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3499,7 +3594,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Lスティック @@ -3609,14 +3704,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3635,7 +3730,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus + @@ -3648,15 +3743,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3701,7 +3796,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Rスティック @@ -3716,242 +3811,242 @@ These settings are experimental, and may cause black screens. If your games fail 設定 - - - - + + + + Clear クリア - - - - - + + + + + [not set] [未設定] - - - + + + Invert button ボタンを反転 - - + + Toggle button - + Turbo button ターボボタン - - + + Invert axis 軸を反転 - - - + + + Set threshold しきい値を設定 - - + + Choose a value between 0% and 100% 0%から100%の間の値を選択してください - + Toggle axis - + Set gyro threshold ジャイロのしきい値を設定 - + Calibrate sensor センサーを補正 - + Map Analog Stick アナログスティックをマップ - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. OKを押した後、スティックを水平方向に動かし、次に垂直方向に動かしてください。 軸を反転させる場合、 最初に垂直方向に動かし、次に水平方向に動かしてください。 - + Center axis - - + + Deadzone: %1% 遊び:%1% - - + + Modifier Range: %1% 変更範囲:%1% - - + + Pro Controller Proコントローラー - + Dual Joycons Joy-Con(L/R) - + Left Joycon Joy-Con(L) - + Right Joycon Joy-Con(R) - + Handheld 携帯コントローラー - + GameCube Controller ゲームキューブコントローラー - + Poke Ball Plus モンスターボールプラス - + NES Controller ファミコン・コントローラー - + SNES Controller スーパーファミコン・コントローラー - + N64 Controller ニンテンドウ64・コントローラー - + Sega Genesis メガドライブ - + Start / Pause スタート/ ポーズ - + Z Z - + Control Stick - + C-Stick Cスティック - + Shake! 振ってください - + [waiting] [待機中] - + New Profile 新規プロファイル - + Enter a profile name: プロファイル名を入力: - - + + Create Input Profile 入力プロファイルを作成 - + The given profile name is not valid! プロファイル名が無効です! - + Failed to create the input profile "%1" 入力プロファイル "%1" の作成に失敗しました - + Delete Input Profile 入力プロファイルを削除 - + Failed to delete the input profile "%1" 入力プロファイル "%1" の削除に失敗しました - + Load Input Profile 入力プロファイルをロード - + Failed to load the input profile "%1" 入力プロファイル "%1" のロードに失敗しました - + Save Input Profile 入力プロファイルをセーブ - + Failed to save the input profile "%1" 入力プロファイル "%1" のセーブに失敗しました @@ -4008,7 +4103,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure 設定 @@ -4044,7 +4139,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test テスト @@ -4063,7 +4158,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">さらに詳しく</span></a> - + %1:%2 %1:%2 @@ -4072,77 +4167,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters ポート番号に無効な文字が含まれています - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 ポート番号は0から65353の間で設定してください - + IP address is not valid IPアドレスが無効です - + This UDP server already exists このUDPサーバーはすでに存在してます - + Unable to add more than 8 servers 8個以上のサーバーを追加することはできません - + Testing テスト中 - + Configuring 設定中 - + Test Successful テスト成功 - + Successfully received data from the server. サーバーからのデータ受信に成功しました。 - + Test Failed テスト失敗 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 有効なデータを受信できませんでした。<br>サーバーが正しくセットアップされ、アドレスとポートが正しいことを確認してください。 - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDPテストまたはキャリブレーション実行中です。<br>完了までお待ちください。 @@ -4268,7 +4363,12 @@ Current values are %1% and %2% respectively. ネットワークインタフェース - + + Enable Airplane Mode + + + + None なし @@ -4326,52 +4426,52 @@ Current values are %1% and %2% respectively. いくつかの設定はゲームが実行中でないときのみ設定できます - + Add-Ons アドオン - + System システム - + CPU CPU - + Graphics グラフィック - + Adv. Graphics 高度なグラフィック - + GPU Extensions - + Audio サウンド - + Input Profiles 入力プロファイル - + Linux Linux - + Properties プロパティ @@ -4389,12 +4489,12 @@ Current values are %1% and %2% respectively. アドオン - + Patch Name 名称 - + Version バージョン @@ -4432,27 +4532,32 @@ Current values are %1% and %2% respectively. ユーザー画像を設定 - + + Select Avatar + + + + Add 追加 - + Rename 名前変更 - + Remove 削除 - + Profile management is available only when game is not running. プロファイル管理はゲーム未実行時にのみ行えます。 - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4460,100 +4565,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username ユーザ名 - + Users ユーザ - + Enter a username for the new user: 新しいユーザのユーザ名を入力: - + Enter a new username: 新しいユーザ名を入力: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image ユーザ画像を選択 - - JPEG Images (*.jpg *.jpeg) - JPEG画像 (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + ファームウェアがありません + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG画像 (*.jpg *.jpeg) + + + Error deleting image 画像削除エラー - + Error occurred attempting to overwrite previous image at: %1. 既存画像の上書き時にエラーが発生しました: %1 - + Error deleting file ファイル削除エラー - + Unable to delete existing file: %1. ファイルを削除できませんでした: %1 - + Error creating user image directory ユーザー画像ディレクトリ作成失敗 - + Unable to create directory %1 for storing user images. ユーザー画像保存ディレクトリ”%1”を作成できませんでした。 - Error copying user image - ユーザー画像コピーエラー + ユーザー画像コピーエラー - Unable to copy image from %1 to %2 - 画像を”%1”から”%2”へコピー出来ませんでした。 + 画像を”%1”から”%2”へコピー出来ませんでした。 - Error resizing user image - ユーザ画像のリサイズエラー + ユーザ画像のリサイズエラー - Unable to resize image - 画像をリサイズできません + 画像をリサイズできません + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + キャンセル + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. このユーザを削除しますか? このユーザのすべてのセーブデータが削除されます. - + Confirm Delete ユーザの削除 - + Name: %1 UUID: %2 名称: %1 @@ -4606,7 +4800,7 @@ UUID: %2 - + Enable 有効 @@ -4617,7 +4811,7 @@ UUID: %2 - + Not connected 接続なし @@ -4627,63 +4821,63 @@ UUID: %2 デフォルトに戻す - + Clear クリア - + [not set] [未設定] - + Invert axis 軸を反転 - - + + Deadzone: %1% 遊び:%1% - + Error enabling ring input リングコン入力の有効化エラー - + Direct Joycon driver is not enabled - + Configuring 設定中 - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [入力待ち] @@ -4725,7 +4919,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4777,12 +4971,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS 設定 - + Select TAS Load Directory... TAS ロードディレクトリを選択... @@ -4892,7 +5086,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5212,6 +5406,16 @@ Drag points to change position, or double-click table cells to edit values.Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Webサービス @@ -5221,42 +5425,29 @@ Drag points to change position, or double-click table cells to edit values.ユーザー名とトークンを入力した時点で、ユーザー識別情報を含む可能性がある追加の統計情報データをyuzuが収集することに同意したと見なされます。 - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - 検証 + 検証 - Sign up - ユーザー登録 + ユーザー登録 - + Token: トークン: - + Username: ユーザー名: - What is my token? - 自分のトークンを確認する方法 + 自分のトークンを確認する方法 - + Web Service configuration can only be changed when a public room isn't being hosted. Webサービスの設定は、公開ルームがホストされていない時にのみ変更することができます。 @@ -5281,12 +5472,12 @@ Drag points to change position, or double-click table cells to edit values.IDの再作成 - + Discord Presence Discord 連携 - + Show Current Game in your Discord Status Discordのステータスに実行中のゲームを表示 @@ -5295,24 +5486,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">詳細情報</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">ユーザー登録</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">ユーザー登録</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5334,12 +5509,6 @@ Drag points to change position, or double-click table cells to edit values.Token was not verified. The change to your token has not been saved. トークンは検証されていません。トークンの変更はまだ保存されていません。 - - - Unverified, please click Verify before saving configuration - Tooltip - - Verifying... 検証中... @@ -5357,20 +5526,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. 検証に失敗しました。トークンが正しく入力されていること、およびインターネット接続が機能していることを確認してください。 + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controller P1 - + &Controller P1 &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + バージョン + + DirectConnect @@ -5476,7 +5692,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5484,11 +5705,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. このルームのホストはあなたを入室禁止にしています。ホストと話をしてアクセス禁止を解除してもらうか、他のルームを試してみてください。 - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5549,7 +5765,7 @@ Please go to Configure -> System -> Network and make a selection. テレメトリ - + Broken Vulkan Installation Detected 壊れたVulkanのインストールが検出されました。 @@ -5558,106 +5774,105 @@ Please go to Configure -> System -> Network and make a selection. 起動時にVulkanの初期化に失敗しました。<br><br>この問題を解決するための手順は<a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>こちら</a>。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Webアプレットをロード中... - - + + Disable Web Applet Webアプレットの無効化 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Webアプレットを無効にすると、未定義の動作になる可能性があるため、スーパーマリオ3Dオールスターズでのみ使用するようにしてください。本当にWebアプレットを無効化しますか? (デバッグ設定で再度有効にすることができます)。 - + The amount of shaders currently being built ビルド中のシェーダー数 - + The current selected resolution scaling multiplier. 現在選択されている解像度の倍率。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 現在のエミュレーション速度。値が100%より高いか低い場合、エミュレーション速度がSwitchより速いか遅いことを示します。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. ゲームが現在表示している1秒あたりのフレーム数。これはゲームごと、シーンごとに異なります。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Switchフレームをエミュレートするのにかかる時間で、フレームリミットやV-Syncは含まれません。フルスピードエミュレーションの場合、最大で16.67ミリ秒になります。 - + Unmute 消音解除 - + Mute 消音 - + Reset Volume 音量をリセット - + &Clear Recent Files 最近のファイルをクリア(&C) - + &Continue 再開(&C) - + &Pause 中断(&P) - Warning Outdated Game Format - 古いゲームフォーマットの警告 + 古いゲームフォーマットの警告 You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. このゲームでは、分解されたROMディレクトリフォーマットを使用しています。これは、NCA、NAX、XCI、またはNSPなどに取って代わられた古いフォーマットです。分解されたROMディレクトリには、アイコン、メタデータ、およびアップデートサポートがありません。<br><br>yuzuがサポートするSwitchフォーマットの説明については、<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>wikiをチェックしてください</a>。このメッセージは二度と表示されません。 - - + + Error while loading ROM! ROMロード中にエラーが発生しました! - + The ROM format is not supported. このROMフォーマットはサポートされていません。 - + An error occurred initializing the video core. ビデオコア初期化中にエラーが発生しました。 @@ -5666,7 +5881,7 @@ Please go to Configure -> System -> Network and make a selection. yuzuは、ビデオコアの実行中にエラーが発生しました。これは通常、内蔵GPUも含め、古いGPUドライバが原因です。詳しくはログをご覧ください。ログへのアクセス方法については、以下のページをご覧ください:<a href='https://yuzu-emu.org/help/reference/log-files/'>ログファイルのアップロード方法について</a>。 - + Error while loading ROM! %1 %1 signifies a numeric error code. ROMのロード中にエラー! %1 @@ -5677,1027 +5892,921 @@ Please go to Configure -> System -> Network and make a selection. %1<br><a href='https://yuzu-emu.org/help/quickstart/'>yuzuクイックスタートガイド</a>を参照してファイルを再ダンプしてください。<br>またはyuzu wiki及び</a>yuzu Discord</a>を参照するとよいでしょう。 - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. 不明なエラーが発生しました。詳細はログを確認して下さい。 - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... ソフトウェアを終了中... - + Save Data データのセーブ - + Mod Data Modデータ - + Error Opening %1 Folder ”%1”フォルダを開けませんでした - - + + Folder does not exist! フォルダが存在しません! - Error Opening Transferable Shader Cache - シェーダーキャッシュを開けませんでした + シェーダーキャッシュを開けませんでした - Failed to create the shader cache directory for this title. - このタイトル用のシェーダーキャッシュディレクトリの作成に失敗しました + このタイトル用のシェーダーキャッシュディレクトリの作成に失敗しました - Error Removing Contents - コンテンツの削除エラー + コンテンツの削除エラー - Error Removing Update - アップデートの削除エラー + アップデートの削除エラー - Error Removing DLC - DLC の削除エラー + DLC の削除エラー - + Remove Installed Game Contents? インストールされたゲームのコンテンツを削除しますか? - + Remove Installed Game Update? インストールされたゲームのアップデートを削除しますか? - + Remove Installed Game DLC? インストールされたゲームの DLC を削除しますか? - + Remove Entry エントリ削除 - - - - - - Successfully Removed - 削除しました + 削除しました - Successfully removed the installed base game. - インストールされたゲームを正常に削除しました。 + インストールされたゲームを正常に削除しました。 - The base game is not installed in the NAND and cannot be removed. - ゲームはNANDにインストールされていないため、削除できません。 + ゲームはNANDにインストールされていないため、削除できません。 - Successfully removed the installed update. - インストールされたアップデートを正常に削除しました。 + インストールされたアップデートを正常に削除しました。 - There is no update installed for this title. - このタイトルのアップデートはインストールされていません。 + このタイトルのアップデートはインストールされていません。 - There are no DLC installed for this title. - このタイトルにはDLCがインストールされていません。 + このタイトルにはDLCがインストールされていません。 - Successfully removed %1 installed DLC. - %1にインストールされたDLCを正常に削除しました。 + %1にインストールされたDLCを正常に削除しました。 - + Delete OpenGL Transferable Shader Cache? OpenGLシェーダーキャッシュを削除しますか? - + Delete Vulkan Transferable Shader Cache? Vulkanシェーダーキャッシュを削除しますか? - + Delete All Transferable Shader Caches? すべてのシェーダーキャッシュを削除しますか? - + Remove Custom Game Configuration? このタイトルのカスタム設定を削除しますか? - + Remove Cache Storage? キャッシュストレージを削除しますか? - + Remove File ファイル削除 - + Remove Play Time Data プレイ時間情報を削除 - + Reset play time? プレイ時間をリセットしますか? - - Error Removing Transferable Shader Cache - シェーダーキャッシュの削除エラー + シェーダーキャッシュの削除エラー - - A shader cache for this title does not exist. - このタイトル用のシェーダーキャッシュは存在しません。 + このタイトル用のシェーダーキャッシュは存在しません。 - Successfully removed the transferable shader cache. - シェーダーキャッシュを正常に削除しました。 + シェーダーキャッシュを正常に削除しました。 - Failed to remove the transferable shader cache. - シェーダーキャッシュの削除に失敗しました。 + シェーダーキャッシュの削除に失敗しました。 - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - Error Removing Transferable Shader Caches - シェーダーキャッシュの削除エラー + シェーダーキャッシュの削除エラー - Successfully removed the transferable shader caches. - シェーダーキャッシュを正常に削除しました。 + シェーダーキャッシュを正常に削除しました。 - Failed to remove the transferable shader cache directory. - シェーダーキャッシュディレクトリの削除に失敗しました。 + シェーダーキャッシュディレクトリの削除に失敗しました。 - - Error Removing Custom Configuration - カスタム設定の削除エラー + カスタム設定の削除エラー - A custom configuration for this title does not exist. - このタイトルのカスタム設定は存在しません。 + このタイトルのカスタム設定は存在しません。 - Successfully removed the custom game configuration. - カスタム設定を正常に削除しました。 + カスタム設定を正常に削除しました。 - Failed to remove the custom game configuration. - カスタム設定の削除に失敗しました。 + カスタム設定の削除に失敗しました。 - - + + RomFS Extraction Failed! RomFSの抽出に失敗しました! - + There was an error copying the RomFS files or the user cancelled the operation. RomFSファイルをコピー中にエラーが発生したか、ユーザー操作によりキャンセルされました。 - + Full フル - + Skeleton スケルトン - + Select RomFS Dump Mode RomFSダンプモードの選択 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. RomFSのダンプ方法を選択してください。<br>”完全”はすべてのファイルが新しいディレクトリにコピーされます。<br>”スケルトン”はディレクトリ構造を作成するだけです。 - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 に RomFS を展開するための十分な空き領域がありません。Emulation > Configure > System > Filesystem > Dump Root で、空き容量を確保するか、別のダンプディレクトリを選択してください。 - + Extracting RomFS... RomFSを抽出中... - - - - - + + Cancel キャンセル - + RomFS Extraction Succeeded! RomFS抽出成功! - - - + The operation completed successfully. 操作は成功しました。 - Integrity verification couldn't be performed! - 整合性の確認を実行できませんでした! + 整合性の確認を実行できませんでした! - File contents were not checked for validity. - ファイルの妥当性は確認されませんでした. + ファイルの妥当性は確認されませんでした. - - Verifying integrity... - 整合性を確認中... + 整合性を確認中... - - Integrity verification succeeded! - 整合性の確認に成功しました! + 整合性の確認に成功しました! - - Integrity verification failed! - 整合性の確認に失敗しました! + 整合性の確認に失敗しました! - File contents may be corrupt. - ファイルが破損しているかもしれません。 + ファイルが破損しているかもしれません。 - - - - Create Shortcut - ショートカットを作成 + ショートカットを作成 - Do you want to launch the game in fullscreen? - フルスクリーンでゲームを起動しますか? + フルスクリーンでゲームを起動しますか? - Successfully created a shortcut to %1 - %1 へのショートカット作成に成功しました + %1 へのショートカット作成に成功しました - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - これにより、現在のAppImageへのショートカットが作成されます。アップデートした場合、うまく動作しなくなる可能性があります。続行しますか? + これにより、現在のAppImageへのショートカットが作成されます。アップデートした場合、うまく動作しなくなる可能性があります。続行しますか? - Failed to create a shortcut to %1 - %1 へのショートカット作成に失敗しました + %1 へのショートカット作成に失敗しました - Create Icon - アイコンを作成 + アイコンを作成 - - Cannot create icon file. Path "%1" does not exist and cannot be created. + + Warning: Outdated Game Format - + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 ”%1”を開けませんでした - + Select Directory ディレクトリの選択 - + Properties プロパティ - + The game properties could not be loaded. ゲームプロパティをロード出来ませんでした。 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch実行ファイル (%1);;すべてのファイル (*.*) - + Load File ファイルのロード - + Open Extracted ROM Directory 展開されているROMディレクトリを開く - + Invalid Directory Selected 無効なディレクトリが選択されました - + The directory you have selected does not contain a 'main' file. 選択されたディレクトリに”main”ファイルが見つかりませんでした。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) インストール可能なスイッチファイル (*.nca *.nsp *.xci);;任天堂コンテンツアーカイブ (*.nca);;任天堂サブミッションパッケージ (*.nsp);;NXカートリッジイメージ (*.xci) - + Install Files ファイルのインストール - + %n file(s) remaining 残り %n ファイル + 残り %n ファイル - + Installing file "%1"... "%1"ファイルをインストールしています・・・ - - + + Install Results インストール結果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 競合を避けるため、NANDにゲーム本体をインストールすることはお勧めしません。 この機能は、アップデートやDLCのインストールにのみ使用してください。 - + %n file(s) were newly installed - %n ファイルが新たにインストールされました - + %n ファイルが新たにインストールされました + %n ファイルが新たにインストールされました - + %n file(s) were overwritten - %n ファイルが上書きされました - + %n ファイルが上書きされました + %n ファイルが上書きされました - + %n file(s) failed to install - %n ファイルのインストールに失敗しました - + %n ファイルのインストールに失敗しました + %n ファイルのインストールに失敗しました - + System Application システムアプリケーション - + System Archive システムアーカイブ - + System Application Update システムアプリケーションアップデート - + Firmware Package (Type A) ファームウェアパッケージ(Type A) - + Firmware Package (Type B) ファームウェアパッケージ(Type B) - + Game ゲーム - + Game Update ゲームアップデート - + Game DLC ゲームDLC - + Delta Title 差分タイトル - + Select NCA Install Type... NCAインストール種別を選択・・・ - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) インストールするNCAタイトル種別を選択して下さい: (ほとんどの場合、デフォルトの”ゲーム”で問題ありません。) - + Failed to Install インストール失敗 - + The title type you selected for the NCA is invalid. 選択されたNCAのタイトル種別が無効です。 - + File not found ファイルが存在しません - + File "%1" not found ファイル”%1”が存在しません - + OK OK - - + + Hardware requirements not met - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. お使いのシステムは推奨ハードウェア要件を満たしていません。互換性レポートは無効になっています。 - + Missing yuzu Account yuzuアカウントが存在しません - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. ゲームの互換性テストケースを送信するには、yuzuアカウントをリンクする必要があります。<br><br/>yuzuアカウントをリンクするには、エミュレーション > 設定 > Web から行います。 - + Error opening URL URLオープンエラー - + Unable to open the URL "%1". URL"%1"を開けません。 - + TAS Recording TAS 記録中 - + Overwrite file of player 1? プレイヤー1のファイルを上書きしますか? - + Invalid config detected 無効な設定を検出しました - + Handheld controller can't be used on docked mode. Pro controller will be selected. 携帯コントローラはドックモードで使用できないため、Proコントローラが選択されます。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 現在の amiibo は削除されました - + Error エラー - - + + The current game is not looking for amiibos 現在のゲームはamiiboを要求しません - + Amiibo File (%1);; All Files (*.*) amiiboファイル (%1);;すべてのファイル (*.*) - + Load Amiibo amiiboのロード - + Error loading Amiibo data amiiboデータ読み込み中にエラーが発生しました - + The selected file is not a valid amiibo 選択されたファイルは有効な amiibo ではありません - + The selected file is already on use 選択されたファイルはすでに使用中です - + An unknown error occurred 不明なエラーが発生しました - - Verification failed for the following files: %1 - 以下のファイルの確認に失敗しました: + 以下のファイルの確認に失敗しました: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available ファームウェアがありません - Please install the firmware to use the Album applet. - アルバム アプレットを使用するにはファームウェアをインストールしてください. + アルバム アプレットを使用するにはファームウェアをインストールしてください. - + Album Applet アルバムアプレット - + Album applet is not available. Please reinstall firmware. アルバムアプレットは利用可能ではありません. ファームウェアを再インストールしてください. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet キャビネットアプレット - + Cabinet applet is not available. Please reinstall firmware. キャビネットアプレットは利用可能ではありません. ファームウェアを再インストールしてください. - Please install the firmware to use the Mii editor. - Mii エディタを使用するにはファームウェアをインストールしてください. + Mii エディタを使用するにはファームウェアをインストールしてください. - + Mii Edit Applet Mii 編集アプレット - + Mii editor is not available. Please reinstall firmware. Mii エディタは利用可能ではありません. ファームウェアを再インストールしてください. - Please install the firmware to use the Controller Menu. - コントローラーメニューを使用するにはファームウェアをインストールしてください. + コントローラーメニューを使用するにはファームウェアをインストールしてください. - + Controller Applet コントローラー アプレット - + Controller Menu is not available. Please reinstall firmware. コントローラーメニューは利用可能ではありません. ファームウェアを再インストールしてください. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot スクリーンショットのキャプチャ - + PNG Image (*.png) PNG画像 (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS 状態: 実行中 %1/%2 - + TAS state: Recording %1 TAS 状態: 記録中 %1 - + TAS state: Idle %1/%2 TAS 状態: アイドル %1/%2 - + TAS State: Invalid TAS 状態: 無効 - + &Stop Running 実行停止(&S) - + &Start 実行(&S) - + Stop R&ecording 記録停止(&R) - + R&ecord 記録(&R) - + Building: %n shader(s) 構築中: %n 個のシェーダー + 構築中: %n 個のシェーダー - + Scale: %1x %1 is the resolution scaling factor 拡大率: %1x - + Speed: %1% / %2% 速度:%1% / %2% - + Speed: %1% 速度:%1% @@ -6706,54 +6815,54 @@ Would you like to download it? Game: %1 FPS(制限解除) - + Game: %1 FPS ゲーム:%1 FPS - + Frame: %1 ms フレーム:%1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA NO AA - + VOLUME: MUTE 音量: ミュート - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + Derivation Components Missing 派生コンポーネントがありません - + Select RomFS Dump Target RomFSダンプターゲットの選択 - + Please select which RomFS you would like to dump. ダンプしたいRomFSを選択して下さい。 @@ -6766,7 +6875,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. エミュレーションを停止しますか?セーブされていない進行状況は失われます。 @@ -6779,102 +6888,102 @@ Would you like to bypass this and exit anyway? 無視してとにかく終了しますか? - + None なし - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked Docked - + Handheld 携帯モード - + Normal 標準 - + High 高い - + Extreme - + Vulkan Vulkan - + OpenGL OpenGL - + Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6882,13 +6991,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! OpenGLは使用できません! - + OpenGL shared contexts are not supported. @@ -6897,33 +7006,33 @@ Would you like to bypass this and exit anyway? yuzuはOpenGLサポート付きでコンパイルされていません。 - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! OpenGL初期化エラー - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPUがOpenGLをサポートしていないか、グラフィックスドライバーが最新ではありません。 - + Error while initializing OpenGL 4.6! OpenGL4.6初期化エラー! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPUがOpenGL4.6をサポートしていないか、グラフィックスドライバーが最新ではありません。<br><br>GL レンダラ:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPUが1つ以上の必要なOpenGL拡張機能をサポートしていない可能性があります。最新のグラフィックドライバを使用していることを確認してください。<br><br>GL レンダラ:<br>%1<br><br>サポートされていない拡張機能:<br>%2 @@ -6931,128 +7040,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite お気に入り - + Start Game ゲームを開始 - + Start Game without Custom Configuration カスタム設定なしでゲームを開始 - + Open Save Data Location セーブデータディレクトリを開く - + Open Mod Data Location Modデータディレクトリを開く - + Open Transferable Pipeline Cache パイプラインキャッシュを開く - + Remove 削除 - + Remove Installed Update インストールされているアップデートを削除 - + Remove All Installed DLC 全てのインストールされているDLCを削除 - + Remove Custom Configuration カスタム設定を削除 - + Remove Play Time Data プレイ時間情報を削除 - + Remove Cache Storage キャッシュストレージを削除 - + Remove OpenGL Pipeline Cache OpenGLパイプラインキャッシュを削除 - + Remove Vulkan Pipeline Cache Vulkanパイプラインキャッシュを削除 - + Remove All Pipeline Caches すべてのパイプラインキャッシュを削除 - + Remove All Installed Contents 全てのインストールされているコンテンツを削除 - + Dump RomFS RomFSをダンプ - + Dump RomFS to SDMC RomFSをSDMCにダンプ - + Verify Integrity 整合性を確認 - + Copy Title ID to Clipboard タイトルIDをクリップボードへコピー - + Navigate to GameDB entry GameDBエントリを表示 - + Create Shortcut ショートカットを作成 - + Add to Desktop デスクトップに追加 - + Add to Applications Menu アプリケーションメニューに追加 - + Configure Game @@ -7061,62 +7170,62 @@ Would you like to bypass this and exit anyway? プロパティ - + Scan Subfolders サブフォルダをスキャンする - + Remove Game Directory ゲームディレクトリを削除する - + ▲ Move Up ▲ 上へ移動 - + ▼ Move Down ▼ 下へ移動 - + Open Directory Location ディレクトリの場所を開く - + Clear クリア - + Name ゲーム名 - + Compatibility 互換性 - + Add-ons アドオン - + File type ファイル種別 - + Size ファイルサイズ - + Play time プレイ時間 @@ -7124,62 +7233,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. ゲームは始まるが、クラッシュや大きな不具合でクリアできない。 - + Perfect カンペキ - + Game can be played without issues. ゲームは問題なくプレイできる。 - + Playable プレイ可 - + Game functions with minor graphical or audio glitches and is playable from start to finish. ゲームは、グラフィックやオーディオに小さな不具合はあるが、最初から最後までプレイできる。 - + Intro/Menu イントロ - + Game loads, but is unable to progress past the Start Screen. ゲームはロードされるが、スタート画面から先に進めない。 - + Won't Boot 起動不可 - + The game crashes when attempting to startup. ゲームは起動時にクラッシュしました。 - + Not Tested 未テスト - + The game has not yet been tested. このゲームはまだテストされていません。 @@ -7187,7 +7296,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list 新しいゲームリストフォルダを追加するにはダブルクリックしてください。 @@ -7195,19 +7304,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) + - + Filter: フィルター: - + Enter pattern to filter フィルターパターンを入力 @@ -7289,7 +7399,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7303,190 +7413,190 @@ Debug Message: Hotkeys - + Audio Mute/Unmute 音声ミュート/解除 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window メイン画面 - + Audio Volume Down 音量を下げる - + Audio Volume Up 音量を上げる - + Capture Screenshot スクリーンショットを撮る - + Change Adapting Filter 適応フィルターの変更 - + Change Docked Mode ドックモードを変更 - + Change GPU Accuracy GPU精度を変更 - + Configure 設定 - + Configure Current Game - + Continue/Pause Emulation エミュレーションの一時停止/再開 - + Exit Fullscreen フルスクリーンをやめる + + + Exit Eden + + Exit yuzu yuzuを終了 - - Exit eden - - - - + Fullscreen フルスクリーン - + Load File ファイルのロード - + Load/Remove Amiibo 読み込み/解除 Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation エミュレーションをリスタート - + Stop Emulation エミュレーションをやめる - + TAS Record TAS 記録 - + TAS Reset TAS リセット - + TAS Start/Stop TAS 開始/停止 - + Toggle Filter Bar フィルターバー切り替え - + Toggle Framerate Limit フレームレート制限切り替え - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar ステータスバー切り替え @@ -7494,22 +7604,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. これらがインストールするファイルであることを確認してください。 - + Installing an Update or DLC will overwrite the previously installed one. アップデート、またはDLCをインストールすると、以前にインストールしたものが上書きされます。 - + Install インストール - + Install Files to NAND ファイルをNANDへインストール @@ -7517,7 +7627,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 テキストに以下の文字を含めることはできません: @@ -7664,152 +7774,207 @@ Debug Message: 最近のファイル(&R) - + + Open &Eden Folders + + + + &Emulation エミュレーション(&E) - + &View 表示(&V) - + &Reset Window Size ウィンドウサイズのリセット(&R) - + &Debugging デバッグ(&D) - + Reset Window Size to &720p &720P - + Reset Window Size to 720p ウィンドウサイズを720Pにリセット - + Reset Window Size to &900p &900P - + Reset Window Size to 900p ウィンドウサイズを900Pにリセット - + Reset Window Size to &1080p &1080P - + Reset Window Size to 1080p ウィンドウサイズを1080Pにリセット - + &Multiplayer マルチプレイヤー (&M) - + &Tools ツール(&T) - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help ヘルプ(&H) - + &Install Files to NAND... ファイルをNANDにインストール...(&I) - + L&oad File... ファイルをロード...(&L) - + Load &Folder... フォルダをロード...(&F) - + E&xit 終了(&E) - + &Pause 中断(&P) - + &Stop 停止(&S) - + &Verify Installed Contents インストールされたコンテンツを確認(&V) - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7818,97 +7983,97 @@ Debug Message: yuzuについて(&A) - + Single &Window Mode シングルウィンドウモード(&W) - + Con&figure... 設定...(&F) - + Ctrl+, - + Display D&ock Widget Headers ドックウィジェットヘッダ(&O) - + Show &Filter Bar フィルターバーを表示 (&F) - + Show &Status Bar ステータスバー(&S) - + Show Status Bar ステータスバーの表示 - + &Browse Public Game Lobby 公開ゲームロビーを参照 (&B) - + &Create Room ルームを作成 (&C) - + &Leave Room ルームを退出 (&L) - + &Direct Connect to Room ルームに直接接続 (&D) - + &Show Current Room 現在のルームを表示 (&S) - + F&ullscreen 全画面表示(&F) - + &Restart 再実行(&R) - + Load/Remove &Amiibo... &Amiibo をロード/削除... - + &Report Compatibility 互換性を報告(&R) - + Open &Mods Page &Modページを開く - + Open &Quickstart Guide クイックスタートガイドを開く(&Q) - + &FAQ &FAQ @@ -7917,77 +8082,82 @@ Debug Message: &yuzuフォルダを開く - + &Capture Screenshot スクリーンショットをキャプチャ(&C) - + Open &Album アルバムを開く (&A) - + &Set Nickname and Owner オーナーとニックネームを設定 (&S) - + &Delete Game Data ゲームデータの消去 (&D) - + &Restore Amiibo Amiibo を復旧 (&R) - + &Format Amiibo Amiibo を初期化(&F) - + Open &Mii Editor &Mii エディタを開く - + &Configure TAS... TASを設定... (&C) - + Configure C&urrent Game... 現在のゲームを設定...(&U) - + &Start 実行(&S) - + &Reset リセット(&R) - + R&ecord 記録(&R) - + Open &Controller Menu コントローラーメニューを開く (&C) - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7995,26 +8165,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8074,37 +8254,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status 現在の接続状態 - + Not Connected. Click here to find a room! 接続されていません。ここをクリックしてルームを見つけてください。 - + Not Connected 未接続 - + Connected 接続の状態 - + New Messages Received 新たなメッセージを受信しました - + Error エラー - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: ルーム情報の更新に失敗しました。インターネット接続を確認し、再度ルームのホストをお試しください。 @@ -8290,56 +8470,56 @@ p, li { white-space: pre-wrap; } - + Installed SD Titles インストール済みSDタイトル - + Installed NAND Titles インストール済みNANDタイトル - + System Titles システムタイトル - + Add New Game Directory 新しいゲームディレクトリを追加する - + Favorites お気に入り - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [未設定] @@ -8350,14 +8530,14 @@ p, li { white-space: pre-wrap; } 十字キー %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 スティック %1%2 @@ -8368,357 +8548,357 @@ p, li { white-space: pre-wrap; } ボタン %1 - - - - - - + + + + + + [unknown] [不明] - - - + + + Left - - - + + + Right - - - + + + Down - - - + + + Up - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start 開始 - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle マル - - + + Cross バツ - - + + Square 四角 - - + + Triangle 三角 - - + + Share Share - - + + Options Options - - + + [undefined] [未定義] - + %1%2 %1%2 - - + + [invalid] [無効] - - + + %1%2Hat %3 - - - + + + %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 - - + + %1%2Motion %3 %1%2モーション %3 - - + + %1%2Button %3 %1%2ボタン %3 - - + + [unused] [未使用] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L L スティック - + Stick R R スティック - + Plus + - + Minus - - - + + Home HOME - + Capture キャプチャ - + Touch タッチの設定 - + Wheel Indicates the mouse wheel ホイール - + Backward 後ろ - + Forward - + Task タスク - + Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 %1%2%3ボタン %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8836,6 +9016,300 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + キャンセル + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + 以下のファイルの確認に失敗しました: + +%1 + + + + + Verifying integrity... + 整合性を確認中... + + + + + Integrity verification succeeded! + 整合性の確認に成功しました! + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + 整合性の確認に失敗しました! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + コンテンツの削除エラー + + + + Error Removing Update + アップデートの削除エラー + + + + Error Removing DLC + DLC の削除エラー + + + + The base game is not installed in the NAND and cannot be removed. + ゲームはNANDにインストールされていないため、削除できません。 + + + + There is no update installed for this title. + このタイトルのアップデートはインストールされていません。 + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + 削除しました + + + + Successfully removed %1 installed DLC. + %1にインストールされたDLCを正常に削除しました。 + + + + + Error Removing Transferable Shader Cache + シェーダーキャッシュの削除エラー + + + + + A shader cache for this title does not exist. + このタイトル用のシェーダーキャッシュは存在しません。 + + + + Successfully removed the transferable shader cache. + シェーダーキャッシュを正常に削除しました。 + + + + Failed to remove the transferable shader cache. + シェーダーキャッシュの削除に失敗しました。 + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + シェーダーキャッシュの削除エラー + + + + Successfully removed the transferable shader caches. + シェーダーキャッシュを正常に削除しました。 + + + + Failed to remove the transferable shader cache directory. + シェーダーキャッシュディレクトリの削除に失敗しました。 + + + + + Error Removing Custom Configuration + カスタム設定の削除エラー + + + + A custom configuration for this title does not exist. + このタイトルのカスタム設定は存在しません。 + + + + Successfully removed the custom game configuration. + カスタム設定を正常に削除しました。 + + + + Failed to remove the custom game configuration. + カスタム設定の削除に失敗しました。 + + + + Reset Metadata Cache + メタデータのキャッシュをクリア + + + + The metadata cache is already empty. + メタデータのキャッシュはすでに空です。 + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + メタデータのキャッシュを削除できませんでした。使用中か存在していない可能性があります。 + + + + Create Shortcut + ショートカットを作成 + + + + Do you want to launch the game in fullscreen? + フルスクリーンでゲームを起動しますか? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + %1 へのショートカット作成に成功しました + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + これにより、現在のAppImageへのショートカットが作成されます。アップデートした場合、うまく動作しなくなる可能性があります。続行しますか? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + %1 へのショートカット作成に失敗しました + + + + Create Icon + アイコンを作成 + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + ファームウェアがありません + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9131,7 +9605,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9139,7 +9613,7 @@ Please try again or contact the developer of the software. %2 - + Users ユーザー @@ -9263,7 +9737,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Call stack @@ -9271,12 +9745,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread waited by no thread @@ -9284,102 +9758,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable runnable - + paused paused - + sleeping sleeping - + waiting for IPC reply waiting for IPC reply - + waiting for objects waiting for objects - + waiting for condition variable waiting for condition variable - + waiting for address arbiter waiting for address arbiter - + waiting for suspend resume waiting for suspend resume - + waiting waiting - + initialized initialized - + terminated terminated - + unknown unknown - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 core %1 - + processor = %1 processor = %1 - + affinity mask = %1 affinity mask = %1 - + thread id = %1 thread id = %1 - + priority = %1(current) / %2(normal) priority = %1(current) / %2(normal) - + last running ticks = %1 last running ticks = %1 @@ -9387,7 +9861,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread waited by thread @@ -9395,7 +9869,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 554d4cf9fc..149c9af049 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... 서버와 통신하는 중... - + Cancel 취소 - + Touch the top left corner <br>of your touchpad. 터치패드의 <br> 상단 좌측 모서리를 눌러주세요. - + Now touch the bottom right corner <br>of your touchpad. 이제 터치패드의 <br> 하단 우측 모서리를 눌러주세요. - + Configuration completed! 설정 완료! - + OK 확인 @@ -397,439 +397,157 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error 오류 - - Net connect - - - - - Player select - - - - + Software keyboard 소프트웨어 키보드 - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: 출력 엔진: - + Output Device: 출력 장치: - + Input Device: 입력 장치: - - Mute audio - - - - + Volume: 볼륨: - + Mute audio when in background 백그라운드에서 오디오 음소거 - + Multicore CPU Emulation 멀티 코어 CPU 에뮬레이션 - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent 속도 퍼센트 제한 - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: 정확도: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) FMA 분리 (FMA를 지원하지 않는 CPU에서의 성능을 향상시킵니다) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE 더 빠른 FRSQRTE와 FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) 더 빠른 ASIMD 명령어(32비트 전용) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling 부정확한 NaN 처리 - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks 주소 공간 검사 비활성화 - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor 글로벌 모니터 무시 - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: 장치: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: 셰이더 백엔드: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: 해상도: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: 윈도우 적응형 필터: - + FSR Sharpness: FSR 선명도: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: 안티에일리어싱 방식: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: 전체 화면 모드: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: 화면비: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache 디스크 파이프라인 캐시 사용 - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation 비동기 GPU 에뮬레이션 사용 - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC 에뮬레이션: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: VSync 모드: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +558,34 @@ FIFO 릴랙스드는 FIFO와 유사하지만 속도가 느려진 후 복구할 즉시 (동기화 없음)는 사용 가능한 모든 것을 표시하며 티어링이 나타날 수 있습니다. - + Enable asynchronous presentation (Vulkan only) 비동기 프레젠테이션 활성화(Vulkan만 해당) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) 강제 최대 클록 (Vulkan 전용) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 실행은 GPU가 클럭 속도를 낮추지 않도록 그래픽 명령을 기다리는 동안 백그라운드에서 작동합니다. - + Anisotropic Filtering: 비등방성 필터링: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - 정확도 수준: + 정확도 수준: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) 비동기식 셰이더 빌드 사용(Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) 빠른 GPU 시간 사용(Hack) @@ -905,1021 +595,1428 @@ This feature is experimental. 빠른 GPU 시간을 활성화합니다. 이 옵션을 사용하면 대부분의 게임이 가장 높은 기본 해상도에서 실행됩니다. - + Use Vulkan pipeline cache Vulkan 파이프라인 캐시 사용 - + + Enable Reactive Flushing + 반응형 플러싱 활성화 + + + + Sync to framerate of video playback + 동영상 재생 프레임 속도에 동기화 + + + + Run the game at normal speed during video playback, even when the framerate is unlocked. + 프레임 속도가 잠금 해제된 상태에서도 동영상 재생 중에 일반 속도로 게임을 실행합니다. + + + + Barrier feedback loops + 차단 피드백 루프 + + + + Improves rendering of transparency effects in specific games. + 특정 게임에서 투명도 효과의 렌더링을 개선합니다. + + + + RNG Seed + RNG 시드 + + + + Device Name + 장치 이름 + + + + Note: this can be overridden when region setting is auto-select + 참고 : 이 설정은 지역 설정이 '자동 선택'일 때 무시될 수 있습니다. + + + + Region: + 국가: + + + + Time Zone: + 시계: + + + + Sound Output Mode: + 소리 출력 모드: + + + + Prompt for user on game boot + 게임 부팅시 유저 선택 화면 표시 + + + + Pause emulation when in background + 백그라운드에 있을 시 에뮬레이션 일시중지 + + + + Hide mouse on inactivity + 비활성 상태일 때 마우스 숨기기 + + + + Disable controller applet + 컨트롤러 애플릿 비활성화 + + + + CPU + CPU + + + + GPU + GPU + + + + Uncompressed (Best quality) + 비압축(최고 품질) + + + + BC1 (Low quality) + BC1(저품질) + + + + BC3 (Medium quality) + BC3(중간 품질) + + + + OpenGL + OpenGL + + + + Vulkan + Vulcan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM(어셈블리 셰이더, NVIDIA 전용) + + + + Normal + 보통 + + + + High + 높음 + + + + Extreme + 익스트림 + + + + Auto + 자동 + + + + Accurate + 정확함 + + + + Unsafe + 최적화 (안전하지 않음) + + + + Paranoid (disables most optimizations) + 편집증(대부분의 최적화 비활성화) + + + + Borderless Windowed + 경계 없는 창 모드 + + + + Exclusive Fullscreen + 독점 전체화면 모드 + + + + No Video Output + 비디오 출력 없음 + + + + CPU Video Decoding + CPU 비디오 디코딩 + + + + GPU Video Decoding (Default) + GPU 비디오 디코딩(기본값) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [실험적] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [실험적] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + 최근접 보간 + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + 가우시안 + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + 없음 + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + 기본 (16:9) + + + + Force 4:3 + 강제 4:3 + + + + Force 21:9 + 강제 21:9 + + + + Force 16:10 + 강제 16:10 + + + + Stretch to Window + 창에 맞게 늘림 + + + + Automatic + 자동 + + + + + Default + 기본값 + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - 반응형 플러싱 활성화 - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - - Sync to framerate of video playback - 동영상 재생 프레임 속도에 동기화 + + RAII + - - Run the game at normal speed during video playback, even when the framerate is unlocked. - 프레임 속도가 잠금 해제된 상태에서도 동영상 재생 중에 일반 속도로 게임을 실행합니다. + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + - - Barrier feedback loops - 차단 피드백 루프 + + Extended Dynamic State + - - Improves rendering of transparency effects in specific games. - 특정 게임에서 투명도 효과의 렌더링을 개선합니다. + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + - - RNG Seed - RNG 시드 + + Provoking Vertex + - + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - 장치 이름 - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - 참고 : 이 설정은 지역 설정이 '자동 선택'일 때 무시될 수 있습니다. - - - - Region: - 국가: - - - + The region of the emulated Switch. - - Time Zone: - 시계: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - 소리 출력 모드: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - 게임 부팅시 유저 선택 화면 표시 - - - - Pause emulation when in background - 백그라운드에 있을 시 에뮬레이션 일시중지 - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - 비활성 상태일 때 마우스 숨기기 - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - 컨트롤러 애플릿 비활성화 - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - - GPU - GPU - - - + CPU Asynchronous - - Uncompressed (Best quality) - 비압축(최고 품질) - - - - BC1 (Low quality) - BC1(저품질) - - - - BC3 (Medium quality) - BC3(중간 품질) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulcan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM(어셈블리 셰이더, NVIDIA 전용) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - 보통 + + Unsafe (fast) + - - High - 높음 + + Safe (stable) + - - Extreme - 익스트림 - - - - Auto - 자동 - - - - Accurate - 정확함 - - - - Unsafe - 최적화 (안전하지 않음) - - - - Paranoid (disables most optimizations) - 편집증(대부분의 최적화 비활성화) - - - + Dynarmic - + NCE - - Borderless Windowed - 경계 없는 창 모드 - - - - Exclusive Fullscreen - 독점 전체화면 모드 - - - - No Video Output - 비디오 출력 없음 - - - - CPU Video Decoding - CPU 비디오 디코딩 - - - - GPU Video Decoding (Default) - GPU 비디오 디코딩(기본값) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [실험적] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [실험적] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - 최근접 보간 - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - 가우시안 - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - 없음 - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - 기본 (16:9) - - - - Force 4:3 - 강제 4:3 - - - - Force 21:9 - 강제 21:9 - - - - Force 16:10 - 강제 16:10 - - - - Stretch to Window - 창에 맞게 늘림 - - - - Automatic - 자동 - - - - Default - 기본값 - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 일본어 (日本語) - + American English 미국 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어 (Korean) - + Dutch (Nederlands) 네덜란드어 (Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어 (Русский) - + Taiwanese 대만어 - + British English 영어 (British English) - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴 아메리카 스페인어 - + Simplified Chinese 간체 - + Traditional Chinese (正體中文) 중국어 번체 (正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - - + + Serbian (српски) + + + + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동 (%1) - + Default (%1) Default time zone 기본 (%1) - + CET 중앙유럽 표준시(CET) - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET 동유럽 표준시(EET) - + Egypt 이집트 - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB 영국 하계 표준시(GB) - + GB-Eire GB-Eire - + GMT 그리니치 표준시(GMT) - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST 하와이-알류샨 표준시(HST) - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 크와잘린 - + Libya 리비아 - + MET 중앙유럽 표준시(MET) - + MST 산악 표준시(MST) - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 표준시(NZ) - + NZ-CHAT 채텀 표준시(NZ-CHAT) - + Poland 폴란드 - + Portugal 포르투갈 - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK 북한 표준시(ROK) - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal Universal - + UTC 협정 세계시(UTC) - + W-SU 유럽/모스크바(W-SU) - + WET 서유럽 - + Zulu 줄루 - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked 거치 모드 - + Handheld 휴대 모드 - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2272,27 +2369,27 @@ When a guest attempts to open the controller applet, it is immediately closed.로깅 - + Open Log Location 로그 경로 열기 - + Global Log Filter 전역 로그 필터 - + When checked, the max size of the log increases from 100 MB to 1 GB 이 옵션을 활성화 시, 로그 파일의 최대 용량이 100MB에서 1GB로 증가합니다. - + Enable Extended Logging** 확장된 로깅 활성화** - + Show Log in Console 콘솔에 로그 표시 @@ -2438,7 +2535,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2500,7 +2597,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Yuzu가 종료되면 자동으로 재설정됩니다. - + Web applet not compiled 웹 애플릿이 컴파일되지 않음 @@ -2550,7 +2647,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2559,88 +2656,88 @@ When a guest attempts to open the controller applet, it is immediately closed.일부 설정은 게임이 실행 중이 아닐 때만 사용할 수 있습니다. - + Applets - - + + Audio 오디오 - - + + CPU CPU - + Debug 디버그 - + Filesystem 파일 시스템 - - + + General 일반 - - + + Graphics 그래픽 - + GraphicsAdvanced 그래픽 고급 - + GraphicsExtensions - + Hotkeys 단축키 - - + + Controls 조작 - + Profiles 프로필 - + Network 네트워크 - - + + System 시스템 - + Game List 게임 목록 - + Web @@ -2738,51 +2835,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache 메타 데이터 캐시 초기화 - + Select Emulated NAND Directory... 가상 NAND 경로 선택 - + Select Emulated SD Directory... 가상 SD 경로 선택 - + Select Gamecard Path... 게임카드 경로 설정 - + Select Dump Directory... 덤프 경로 설정 - + Select Mod Load Directory... 모드 불러오기 경로 설정 - The metadata cache is already empty. - 메타 데이터 캐시가 이미 비어있습니다. + 메타 데이터 캐시가 이미 비어있습니다. - The operation completed successfully. - 작업이 성공적으로 끝났습니다. + 작업이 성공적으로 끝났습니다. - The metadata cache couldn't be deleted. It might be in use or non-existent. - 메타 데이터 캐시 삭제를 삭제할 수 없습니다. 해당 파일이 이미 사용 중이거나 존재하지 않을 수 있습니다. + 메타 데이터 캐시 삭제를 삭제할 수 없습니다. 해당 파일이 이미 사용 중이거나 존재하지 않을 수 있습니다. @@ -2813,12 +2904,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? 모든 환경 설정과 게임별 맞춤 설정이 초기화됩니다. 게임 디렉토리나 프로필, 또는 입력 프로필은 삭제되지 않습니다. 진행하시겠습니까? @@ -2851,33 +2942,33 @@ When a guest attempts to open the controller applet, it is immediately closed.배경색: - + % FSR sharpening percentage (e.g. 50%) % - + Off - + VSync Off 수직동기화 끔 - + Recommended 추천 - + On - + VSync On 수직동기화 켬 @@ -2914,14 +3005,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2953,75 +3048,75 @@ These settings are experimental, and may cause black screens. If your games fail 초기화 - + Action 액션 - + Hotkey 단축키 - + Controller Hotkey 컨트롤러 단축키 - - - + + + Conflicting Key Sequence 키 시퀀스 충돌 - - + + The entered key sequence is already assigned to: %1 입력한 키 시퀀스가 %1에 이미 할당되었습니다. - + [waiting] [대기중] - + Invalid 유효하지않음 - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default 초기화 - + Clear 비우기 - + Conflicting Button Sequence 키 시퀀스 충돌 - + The default button sequence is already assigned to: %1 기본 키 시퀀스가 %1에 이미 할당되었습니다. - + The default key sequence is already assigned to: %1 기본 키 시퀀스가 %1에 이미 할당되었습니다. @@ -3341,7 +3436,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3496,7 +3591,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick L 스틱 @@ -3606,14 +3701,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3632,7 +3727,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus + @@ -3645,15 +3740,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3698,7 +3793,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick R 스틱 @@ -3713,242 +3808,242 @@ These settings are experimental, and may cause black screens. If your games fail 설정 - - - - + + + + Clear 초기화 - - - - - + + + + + [not set] [설정 안 됨] - - - + + + Invert button 버튼 반전 - - + + Toggle button 토글 버튼 - + Turbo button 터보 버튼 - - + + Invert axis 축 뒤집기 - - - + + + Set threshold 임계값 설정 - - + + Choose a value between 0% and 100% 0%에서 100% 안의 값을 고르세요 - + Toggle axis axis 토글 - + Set gyro threshold 자이로 임계값 설정 - + Calibrate sensor 센서 보정 - + Map Analog Stick 아날로그 스틱 맵핑 - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. OK 버튼을 누른 후에 먼저 조이스틱을 수평으로 움직이고, 그 다음 수직으로 움직이세요. 축을 뒤집으려면 수직으로 먼저 움직인 뒤에 수평으로 움직이세요. - + Center axis 중심축 - - + + Deadzone: %1% 데드존: %1% - - + + Modifier Range: %1% 수정자 범위: %1% - - + + Pro Controller 프로 컨트롤러 - + Dual Joycons 듀얼 조이콘 - + Left Joycon 왼쪽 조이콘 - + Right Joycon 오른쪽 조이콘 - + Handheld 휴대 모드 - + GameCube Controller GameCube 컨트롤러 - + Poke Ball Plus 몬스터볼 Plus - + NES Controller NES 컨트롤러 - + SNES Controller SNES 컨트롤러 - + N64 Controller N64 컨트롤러 - + Sega Genesis 세가 제네시스 - + Start / Pause 시작 / 일시중지 - + Z Z - + Control Stick 컨트롤 스틱 - + C-Stick C-Stick - + Shake! 흔드세요! - + [waiting] [대기중] - + New Profile 새 프로필 - + Enter a profile name: 프로필 이름을 입력하세요: - - + + Create Input Profile 입력 프로필 생성 - + The given profile name is not valid! 해당 프로필 이름은 사용할 수 없습니다! - + Failed to create the input profile "%1" "%1" 입력 프로필 생성 실패 - + Delete Input Profile 입력 프로필 삭제 - + Failed to delete the input profile "%1" "%1" 입력 프로필 삭제 실패 - + Load Input Profile 입력 프로필 불러오기 - + Failed to load the input profile "%1" "%1" 입력 프로필 불러오기 실패 - + Save Input Profile 입력 프로필 저장 - + Failed to save the input profile "%1" "%1" 입력 프로필 저장 실패 @@ -4005,7 +4100,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure 설정 @@ -4041,7 +4136,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test 테스트 @@ -4060,7 +4155,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">자세히 알아보기</span></a> - + %1:%2 %1:%2 @@ -4069,77 +4164,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters 포트 번호에 유효하지 않은 글자가 있습니다. - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 포트 번호는 0부터 65353까지이어야 합니다. - + IP address is not valid IP 주소가 유효하지 않습니다. - + This UDP server already exists 해당 UDP 서버는 이미 존재합니다. - + Unable to add more than 8 servers 8개보다 많은 서버를 추가하실 수는 없습니다. - + Testing 테스트 중 - + Configuring 설정 중 - + Test Successful 테스트 성공 - + Successfully received data from the server. 서버에서 성공적으로 데이터를 받았습니다. - + Test Failed 테스트 실패 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 서버에서 유효한 데이터를 수신할 수 없습니다.<br>서버가 올바르게 설정되어 있고 주소와 포트가 올바른지 확인하십시오. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP 테스트와 교정 설정이 진행 중입니다.<br>끝날 때까지 기다려주세요. @@ -4265,7 +4360,12 @@ Current values are %1% and %2% respectively. 네트워크 인터페이스 - + + Enable Airplane Mode + + + + None 없음 @@ -4323,52 +4423,52 @@ Current values are %1% and %2% respectively. 일부 설정은 게임이 실행 중이 아닐 때만 사용할 수 있습니다. - + Add-Ons 부가 기능 - + System 시스템 - + CPU CPU - + Graphics 그래픽 - + Adv. Graphics 고급 그래픽 - + GPU Extensions - + Audio 오디오 - + Input Profiles 입력 프로파일 - + Linux - + Properties 속성 @@ -4386,12 +4486,12 @@ Current values are %1% and %2% respectively. 애드온 - + Patch Name 패치 이름 - + Version 버전 @@ -4429,27 +4529,32 @@ Current values are %1% and %2% respectively. 이미지 설정 - + + Select Avatar + + + + Add 추가 - + Rename 이름 변경 - + Remove 제거 - + Profile management is available only when game is not running. 프로필 관리자는 게임이 작동 중이지 않을 때만 사용 가능합니다. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4457,100 +4562,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username 유저 이름을 입력하세요 - + Users 유저 - + Enter a username for the new user: 새로운 유저를 위한 유저 이름을 입력하세요: - + Enter a new username: 새로운 유저 이름을 입력하세요: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image 유저 이미지 선택 - - JPEG Images (*.jpg *.jpeg) - JPEG 이미지 (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG 이미지 (*.jpg *.jpeg) + + + Error deleting image 이미지 삭제 오류 - + Error occurred attempting to overwrite previous image at: %1. %1에서 이전 이미지를 덮어쓰는 중 오류가 발생했습니다. - + Error deleting file 파일 삭제 오류 - + Unable to delete existing file: %1. 기존 파일을 삭제할 수 없음: %1. - + Error creating user image directory 사용자 이미지 디렉토리 생성 오류 - + Unable to create directory %1 for storing user images. 사용자 이미지를 저장하기 위한 %1 디렉토리를 만들 수 없습니다. - Error copying user image - 사용자 이미지 복사 오류 + 사용자 이미지 복사 오류 - Unable to copy image from %1 to %2 - 이미지를 %1에서 %2로 복사할 수 없습니다 + 이미지를 %1에서 %2로 복사할 수 없습니다 - Error resizing user image - 사용자 이미지 크기 조정 오류 + 사용자 이미지 크기 조정 오류 - Unable to resize image - 이미지 크기를 조정할 수 없습니다 + 이미지 크기를 조정할 수 없습니다 + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + 취소 + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. 이 사용자를 삭제하시겠습니까? 사용자의 저장 데이터가 모두 삭제됩니다. - + Confirm Delete 삭제 확인 - + Name: %1 UUID: %2 이름: %1 @@ -4603,7 +4797,7 @@ UUID: %2 - + Enable 활성화 @@ -4614,7 +4808,7 @@ UUID: %2 - + Not connected 연결되지 않음 @@ -4624,63 +4818,63 @@ UUID: %2 기본값으로 초기화 - + Clear 초기화 - + [not set] [설정 안 됨] - + Invert axis 축 뒤집기 - - + + Deadzone: %1% 데드존: %1% - + Error enabling ring input 링 입력 활성화 오류 - + Direct Joycon driver is not enabled 다이렉트 조이콘 드라이버가 활성화되지 않았음 - + Configuring 설정 중 - + The current mapped device doesn't support the ring controller 현재 매핑된 장치가 링 컨트롤러를 지원하지 않음 - + The current mapped device doesn't have a ring attached 현재 매핑된 장치에 링이 연결되어 있지 않음 - + The current mapped device is not connected 현재 매핑된 장치가 연결되지 않았습니다. - + Unexpected driver result %1 예기치 않은 드라이버 결과 %1 - + [waiting] [대기중] @@ -4722,7 +4916,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4774,12 +4968,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS 설정 - + Select TAS Load Directory... TAS 로드 디렉토리 선택... @@ -4889,7 +5083,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5209,6 +5403,16 @@ Drag points to change position, or double-click table cells to edit values.Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu 웹 서비스 @@ -5218,42 +5422,29 @@ Drag points to change position, or double-click table cells to edit values.사용자 이름과 토큰을 제공함으로써 귀하는 yuzu가 사용자 식별 정보를 포함한 추가 사용 데이터 수집 허용에 동의한 것으로 간주됩니다. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - 인증 + 인증 - Sign up - 가입 + 가입 - + Token: 토큰: - + Username: 유저 이름: - What is my token? - 나의 토큰이 무엇인가요? + 나의 토큰이 무엇인가요? - + Web Service configuration can only be changed when a public room isn't being hosted. 웹 서비스 구성은 공개 방이 호스팅되지 않을 때만 변경할 수 있습니다. @@ -5278,12 +5469,12 @@ Drag points to change position, or double-click table cells to edit values.재생성 - + Discord Presence Discord 알림 - + Show Current Game in your Discord Status 디스코드에 실행중인 게임을 나타낼 수 있습니다. @@ -5292,24 +5483,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">자세히 알아보기</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">회원 가입</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">회원 가입</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5332,10 +5507,9 @@ Drag points to change position, or double-click table cells to edit values.토큰이 확인되지 않았습니다. 토큰 변경 사항이 저장되지 않을 것입니다. - Unverified, please click Verify before saving configuration Tooltip - 인증되지 않음, 구성을 저장하기 전에 인증을 클릭하십시오. + 인증되지 않음, 구성을 저장하기 전에 인증을 클릭하십시오. Verifying... @@ -5359,20 +5533,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. 인증 실패. 토큰을 올바르게 입력했는지, 그리고 인터넷이 연결되어 있는지 확인하십시오. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 컨트롤러 P1 - + &Controller P1 컨트롤러 P1(&C) + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + 버전 + + DirectConnect @@ -5478,7 +5699,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5486,11 +5712,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. 방 호스트가 당신을 차단했습니다. 호스트와 대화하여 차단을 해제하거나 다른 방을 사용해 보세요. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5552,7 +5773,7 @@ Please go to Configure -> System -> Network and make a selection. 원격 측정 - + Broken Vulkan Installation Detected 깨진 Vulkan 설치 감지됨 @@ -5561,106 +5782,105 @@ Please go to Configure -> System -> Network and make a selection. 부팅하는 동안 Vulkan 초기화에 실패했습니다.<br><br>문제 해결 지침을 보려면 <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>여기</a>를 클릭하세요. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 게임 실행중 - + Loading Web Applet... 웹 애플릿을 로드하는 중... - - + + Disable Web Applet 웹 애플릿 비활성화 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 웹 애플릿을 비활성화하면 정의되지 않은 동작이 발생할 수 있으며 Super Mario 3D All-Stars에서만 사용해야 합니다. 웹 애플릿을 비활성화하시겠습니까? (디버그 설정에서 다시 활성화할 수 있습니다.) - + The amount of shaders currently being built 현재 생성중인 셰이더의 양 - + The current selected resolution scaling multiplier. 현재 선택된 해상도 배율입니다. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 현재 에뮬레이션 속도. 100%보다 높거나 낮은 값은 에뮬레이션이 Switch보다 빠르거나 느린 것을 나타냅니다. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 게임이 현재 표시하고 있는 초당 프레임 수입니다. 이것은 게임마다 다르고 장면마다 다릅니다. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 프레임 제한이나 수직 동기화를 계산하지 않고 Switch 프레임을 에뮬레이션 하는 데 걸린 시간. 최대 속도로 에뮬레이트 중일 때에는 대부분 16.67 ms 근처입니다. - + Unmute 음소거 해제 - + Mute 음소거 - + Reset Volume 볼륨 재설정 - + &Clear Recent Files Clear Recent Files(&C) - + &Continue 재개(&C) - + &Pause 일시중지(&P) - Warning Outdated Game Format - 오래된 게임 포맷 경고 + 오래된 게임 포맷 경고 You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. 이 게임 파일은 '분해된 ROM 디렉토리'라는 오래된 포맷을 사용하고 있습니다. 해당 포맷은 NCA, NAX, XCI 또는 NSP와 같은 다른 포맷으로 대체되었으며 분해된 ROM 디렉토리에는 아이콘, 메타 데이터 및 업데이트가 지원되지 않습니다.<br><br>yuzu가 지원하는 다양한 Switch 포맷에 대한 설명은 <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>위키를 확인하세요.</a> 이 메시지는 다시 표시되지 않습니다. - - + + Error while loading ROM! ROM 로드 중 오류 발생! - + The ROM format is not supported. 지원되지 않는 롬 포맷입니다. - + An error occurred initializing the video core. 비디오 코어를 초기화하는 동안 오류가 발생했습니다. @@ -5669,7 +5889,7 @@ Please go to Configure -> System -> Network and make a selection. 비디오 코어를 실행하는 동안 yuzu에 오류가 발생했습니다. 이것은 일반적으로 통합 드라이버를 포함하여 오래된 GPU 드라이버로 인해 발생합니다. 자세한 내용은 로그를 참조하십시오. 로그 액세스에 대한 자세한 내용은 <a href='https://yuzu-emu.org/help/reference/log-files/'>로그 파일 업로드 방법</a> 페이지를 참조하세요. - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM 불러오는 중 오류 발생! %1 @@ -5680,1025 +5900,889 @@ Please go to Configure -> System -> Network and make a selection. %1<br>파일들을 다시 덤프하기 위해<a href='https://yuzu-emu.org/help/quickstart/'>yuzu 빠른 시작 가이드</a> 를 따라주세요.<br>도움이 필요할 시 yuzu 위키</a> 를 참고하거나 yuzu 디스코드</a> 를 이용해보세요. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참고하십시오. - + (64-bit) (64비트) - + (32-bit) (32비트) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 소프트웨어를 닫는 중... - + Save Data 세이브 데이터 - + Mod Data 모드 데이터 - + Error Opening %1 Folder %1 폴더 열기 오류 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - Error Opening Transferable Shader Cache - 전송 가능한 셰이더 캐시 열기 오류 + 전송 가능한 셰이더 캐시 열기 오류 - Failed to create the shader cache directory for this title. - 이 타이틀에 대한 셰이더 캐시 디렉토리를 생성하지 못했습니다. + 이 타이틀에 대한 셰이더 캐시 디렉토리를 생성하지 못했습니다. - Error Removing Contents - 콘텐츠 제거 중 오류 발생 + 콘텐츠 제거 중 오류 발생 - Error Removing Update - 업데이트 제거 오류 + 업데이트 제거 오류 - Error Removing DLC - DLC 제거 오류 + DLC 제거 오류 - + Remove Installed Game Contents? 설치된 게임 콘텐츠를 제거하겠습니까? - + Remove Installed Game Update? 설치된 게임 업데이트를 제거하겠습니까? - + Remove Installed Game DLC? 설치된 게임 DLC를 제거하겠습니까? - + Remove Entry 항목 제거 - - - - - - Successfully Removed - 삭제 완료 + 삭제 완료 - Successfully removed the installed base game. - 설치된 기본 게임을 성공적으로 제거했습니다. + 설치된 기본 게임을 성공적으로 제거했습니다. - The base game is not installed in the NAND and cannot be removed. - 기본 게임은 NAND에 설치되어 있지 않으며 제거 할 수 없습니다. + 기본 게임은 NAND에 설치되어 있지 않으며 제거 할 수 없습니다. - Successfully removed the installed update. - 설치된 업데이트를 성공적으로 제거했습니다. + 설치된 업데이트를 성공적으로 제거했습니다. - There is no update installed for this title. - 이 타이틀에 대해 설치된 업데이트가 없습니다. + 이 타이틀에 대해 설치된 업데이트가 없습니다. - There are no DLC installed for this title. - 이 타이틀에 설치된 DLC가 없습니다. + 이 타이틀에 설치된 DLC가 없습니다. - Successfully removed %1 installed DLC. - 설치된 %1 DLC를 성공적으로 제거했습니다. + 설치된 %1 DLC를 성공적으로 제거했습니다. - + Delete OpenGL Transferable Shader Cache? OpenGL 전송 가능한 셰이더 캐시를 삭제하시겠습니까? - + Delete Vulkan Transferable Shader Cache? Vulkan 전송 가능한 셰이더 캐시를 삭제하시겠습니까? - + Delete All Transferable Shader Caches? 모든 전송 가능한 셰이더 캐시를 삭제하시겠습니까? - + Remove Custom Game Configuration? 사용자 지정 게임 구성을 제거 하시겠습니까? - + Remove Cache Storage? 캐시 저장소를 제거하겠습니까? - + Remove File 파일 제거 - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - 전송 가능한 셰이더 캐시 제거 오류 + 전송 가능한 셰이더 캐시 제거 오류 - - A shader cache for this title does not exist. - 이 타이틀에 대한 셰이더 캐시가 존재하지 않습니다. + 이 타이틀에 대한 셰이더 캐시가 존재하지 않습니다. - Successfully removed the transferable shader cache. - 전송 가능한 셰이더 캐시를 성공적으로 제거했습니다. + 전송 가능한 셰이더 캐시를 성공적으로 제거했습니다. - Failed to remove the transferable shader cache. - 전송 가능한 셰이더 캐시를 제거하지 못했습니다. + 전송 가능한 셰이더 캐시를 제거하지 못했습니다. - Error Removing Vulkan Driver Pipeline Cache - Vulkan 드라이버 파이프라인 캐시 제거 오류 + Vulkan 드라이버 파이프라인 캐시 제거 오류 - Failed to remove the driver pipeline cache. - 드라이버 파이프라인 캐시를 제거하지 못했습니다. + 드라이버 파이프라인 캐시를 제거하지 못했습니다. - - Error Removing Transferable Shader Caches - 전송 가능한 셰이더 캐시 제거 오류 + 전송 가능한 셰이더 캐시 제거 오류 - Successfully removed the transferable shader caches. - 전송 가능한 셰이더 캐시를 성공적으로 제거했습니다. + 전송 가능한 셰이더 캐시를 성공적으로 제거했습니다. - Failed to remove the transferable shader cache directory. - 전송 가능한 셰이더 캐시 디렉토리를 제거하지 못했습니다. + 전송 가능한 셰이더 캐시 디렉토리를 제거하지 못했습니다. - - Error Removing Custom Configuration - 사용자 지정 구성 제거 오류 + 사용자 지정 구성 제거 오류 - A custom configuration for this title does not exist. - 이 타이틀에 대한 사용자 지정 구성이 존재하지 않습니다. + 이 타이틀에 대한 사용자 지정 구성이 존재하지 않습니다. - Successfully removed the custom game configuration. - 사용자 지정 게임 구성을 성공적으로 제거했습니다. + 사용자 지정 게임 구성을 성공적으로 제거했습니다. - Failed to remove the custom game configuration. - 사용자 지정 게임 구성을 제거하지 못했습니다. + 사용자 지정 게임 구성을 제거하지 못했습니다. - - + + RomFS Extraction Failed! RomFS 추출 실패! - + There was an error copying the RomFS files or the user cancelled the operation. RomFS 파일을 복사하는 중에 오류가 발생했거나 사용자가 작업을 취소했습니다. - + Full 전체 - + Skeleton 뼈대 - + Select RomFS Dump Mode RomFS 덤프 모드 선택 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. RomFS 덤프 방법을 선택하십시오.<br>전체는 모든 파일을 새 디렉토리에 복사하고<br>뼈대는 디렉토리 구조 만 생성합니다. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1에 RomFS를 추출하기에 충분한 여유 공간이 없습니다. 공간을 확보하거나 에뮬레이견 > 설정 > 시스템 > 파일시스템 > 덤프 경로에서 다른 덤프 디렉토리를 선택하십시오. - + Extracting RomFS... RomFS 추출 중... - - - - - + + Cancel 취소 - + RomFS Extraction Succeeded! RomFS 추출이 성공했습니다! - - - + The operation completed successfully. 작업이 성공적으로 완료되었습니다. - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - - Verifying integrity... - - - - - Integrity verification succeeded! - 무결성 검증에 성공했습니다. + 무결성 검증에 성공했습니다. - - Integrity verification failed! - 무결성 검증에 실패했습니다. + 무결성 검증에 실패했습니다. - - File contents may be corrupt. - - - - - - - Create Shortcut - 바로가기 만들기 + 바로가기 만들기 - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - %1 바로가기를 성공적으로 만듬 + %1 바로가기를 성공적으로 만듬 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - 현재 AppImage에 대한 바로 가기가 생성됩니다. 업데이트하면 제대로 작동하지 않을 수 있습니다. 계속합니까? + 현재 AppImage에 대한 바로 가기가 생성됩니다. 업데이트하면 제대로 작동하지 않을 수 있습니다. 계속합니까? - - Failed to create a shortcut to %1 + Create Icon + 아이콘 만들기 + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + 아이콘 파일을 만들 수 없습니다. 경로 "%1"이(가) 존재하지 않으며 생성할 수 없습니다. + + + + Warning: Outdated Game Format - - Create Icon - 아이콘 만들기 + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - 아이콘 파일을 만들 수 없습니다. 경로 "%1"이(가) 존재하지 않으며 생성할 수 없습니다. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 %1 열기 오류 - + Select Directory 경로 선택 - + Properties 속성 - + The game properties could not be loaded. 게임 속성을 로드 할 수 없습니다. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 실행파일 (%1);;모든 파일 (*.*) - + Load File 파일 로드 - + Open Extracted ROM Directory 추출된 ROM 디렉토리 열기 - + Invalid Directory Selected 잘못된 디렉토리 선택 - + The directory you have selected does not contain a 'main' file. 선택한 디렉토리에 'main'파일이 없습니다. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 설치 가능한 Switch 파일 (*.nca *.nsp *.xci);;Nintendo 컨텐츠 아카이브 (*.nca);;Nintendo 서브미션 패키지 (*.nsp);;NX 카트리지 이미지 (*.xci) - + Install Files 파일 설치 - + %n file(s) remaining %n개의 파일이 남음 + %n개의 파일이 남음 - + Installing file "%1"... 파일 "%1" 설치 중... - - + + Install Results 설치 결과 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 충돌을 피하기 위해, 낸드에 베이스 게임을 설치하는 것을 권장하지 않습니다. 이 기능은 업데이트나 DLC를 설치할 때에만 사용해주세요. - + %n file(s) were newly installed - %n개의 파일이 새로 설치되었습니다. - + %n개의 파일이 새로 설치되었습니다. + %n개의 파일이 새로 설치되었습니다. - + %n file(s) were overwritten - %n개의 파일을 덮어썼습니다. - + %n개의 파일을 덮어썼습니다. + %n개의 파일을 덮어썼습니다. - + %n file(s) failed to install - %n개의 파일을 설치하지 못했습니다. - + %n개의 파일을 설치하지 못했습니다. + %n개의 파일을 설치하지 못했습니다. - + System Application 시스템 애플리케이션 - + System Archive 시스템 아카이브 - + System Application Update 시스템 애플리케이션 업데이트 - + Firmware Package (Type A) 펌웨어 패키지 (A타입) - + Firmware Package (Type B) 펌웨어 패키지 (B타입) - + Game 게임 - + Game Update 게임 업데이트 - + Game DLC 게임 DLC - + Delta Title 델타 타이틀 - + Select NCA Install Type... NCA 설치 유형 선택... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 이 NCA를 설치할 타이틀 유형을 선택하세요: (대부분의 경우 기본값인 '게임'이 괜찮습니다.) - + Failed to Install 설치 실패 - + The title type you selected for the NCA is invalid. NCA 타이틀 유형이 유효하지 않습니다. - + File not found 파일을 찾을 수 없음 - + File "%1" not found 파일 "%1"을 찾을 수 없습니다 - + OK OK - - + + Hardware requirements not met 하드웨어 요구 사항이 충족되지 않음 - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. 시스템이 권장 하드웨어 요구 사항을 충족하지 않습니다. 호환성 보고가 비활성화되었습니다. - + Missing yuzu Account yuzu 계정 누락 - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. 게임 호환성 테스트 결과를 제출하려면 yuzu 계정을 연결해야합니다.<br><br/>yuzu 계정을 연결하려면 에뮬레이션 &gt; 설정 &gt; 웹으로 가세요. - + Error opening URL URL 열기 오류 - + Unable to open the URL "%1". URL "%1"을 열 수 없습니다. - + TAS Recording TAS 레코딩 - + Overwrite file of player 1? 플레이어 1의 파일을 덮어쓰시겠습니까? - + Invalid config detected 유효하지 않은 설정 감지 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 휴대 모드용 컨트롤러는 거치 모드에서 사용할 수 없습니다. 프로 컨트롤러로 대신 선택됩니다. - - + + Amiibo Amiibo - - + + The current amiibo has been removed 현재 amiibo가 제거되었습니다. - + Error 오류 - - + + The current game is not looking for amiibos 현재 게임은 amiibo를 찾고 있지 않습니다 - + Amiibo File (%1);; All Files (*.*) Amiibo 파일 (%1);; 모든 파일 (*.*) - + Load Amiibo Amiibo 로드 - + Error loading Amiibo data Amiibo 데이터 로드 오류 - + The selected file is not a valid amiibo 선택한 파일은 유효한 amiibo가 아닙니다 - + The selected file is already on use 선택한 파일은 이미 사용 중입니다 - + An unknown error occurred 알수없는 오류가 발생했습니다 - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet 컨트롤러 애플릿 - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot 스크린샷 캡처 - + PNG Image (*.png) PNG 이미지 (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS 상태: %1/%2 실행 중 - + TAS state: Recording %1 TAS 상태: 레코딩 %1 - + TAS state: Idle %1/%2 TAS 상태: 유휴 %1/%2 - + TAS State: Invalid TAS 상태: 유효하지 않음 - + &Stop Running 실행 중지(&S) - + &Start 시작(&S) - + Stop R&ecording 레코딩 중지(&e) - + R&ecord 레코드(&R) - + Building: %n shader(s) 빌드중: %n개 셰이더 + 빌드중: %n개 셰이더 - + Scale: %1x %1 is the resolution scaling factor 스케일: %1x - + Speed: %1% / %2% 속도: %1% / %2% - + Speed: %1% 속도: %1% @@ -6707,54 +6791,54 @@ Would you like to download it? 게임: %1 FPS (제한없음) - + Game: %1 FPS 게임: %1 FPS - + Frame: %1 ms 프레임: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA AA 없음 - + VOLUME: MUTE 볼륨: 음소거 - + VOLUME: %1% Volume percentage (e.g. 50%) 볼륨: %1% - + Derivation Components Missing 파생 구성 요소 누락 - + Select RomFS Dump Target RomFS 덤프 대상 선택 - + Please select which RomFS you would like to dump. 덤프할 RomFS를 선택하십시오. @@ -6767,7 +6851,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 에뮬레이션을 중지하시겠습니까? 모든 저장되지 않은 진행 상황은 사라집니다. @@ -6780,102 +6864,102 @@ Would you like to bypass this and exit anyway? 이를 무시하고 나가시겠습니까? - + None 없음 - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian 가우시안 - + ScaleForce 스케일포스 - + Area - + Docked 거치 모드 - + Handheld 휴대 모드 - + Normal 보통 - + High 높음 - + Extreme 익스트림 - + Vulkan 불칸 - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6883,13 +6967,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! OpenGL을 사용할 수 없습니다! - + OpenGL shared contexts are not supported. OpenGL 공유 컨텍스트는 지원되지 않습니다. @@ -6898,33 +6982,33 @@ Would you like to bypass this and exit anyway? yuzu는 OpenGL 지원으로 컴파일되지 않았습니다. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! OpenGL을 초기화하는 동안 오류가 발생했습니다! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. 사용하시는 GPU가 OpenGL을 지원하지 않거나, 최신 그래픽 드라이버가 설치되어 있지 않습니다. - + Error while initializing OpenGL 4.6! OpenGL 4.6 초기화 중 오류 발생! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 사용하시는 GPU가 OpenGL 4.6을 지원하지 않거나 최신 그래픽 드라이버가 설치되어 있지 않습니다. <br><br>GL 렌더링 장치:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 사용하시는 GPU가 1개 이상의 OpenGL 확장 기능을 지원하지 않습니다. 최신 그래픽 드라이버가 설치되어 있는지 확인하세요. <br><br>GL 렌더링 장치:<br>%1<br><br>지원하지 않는 확장 기능:<br>%2 @@ -6932,128 +7016,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite 선호하는 게임 - + Start Game 게임 시작 - + Start Game without Custom Configuration 맞춤 설정 없이 게임 시작 - + Open Save Data Location 세이브 데이터 경로 열기 - + Open Mod Data Location MOD 데이터 경로 열기 - + Open Transferable Pipeline Cache 전송 가능한 파이프라인 캐시 열기 - + Remove 제거 - + Remove Installed Update 설치된 업데이트 삭제 - + Remove All Installed DLC 설치된 모든 DLC 삭제 - + Remove Custom Configuration 사용자 지정 구성 제거 - + Remove Play Time Data - + Remove Cache Storage 캐시 스토리지 제거 - + Remove OpenGL Pipeline Cache OpenGL 파이프라인 캐시 제거 - + Remove Vulkan Pipeline Cache Vulkan 파이프라인 캐시 제거 - + Remove All Pipeline Caches 모든 파이프라인 캐시 제거 - + Remove All Installed Contents 설치된 모든 컨텐츠 제거 - + Dump RomFS RomFS를 덤프 - + Dump RomFS to SDMC RomFS를 SDMC로 덤프 - + Verify Integrity - + Copy Title ID to Clipboard 클립보드에 타이틀 ID 복사 - + Navigate to GameDB entry GameDB 항목으로 이동 - + Create Shortcut 바로가기 만들기 - + Add to Desktop 데스크톱에 추가 - + Add to Applications Menu 애플리케이션 메뉴에 추가 - + Configure Game @@ -7062,62 +7146,62 @@ Would you like to bypass this and exit anyway? 속성 - + Scan Subfolders 하위 폴더 스캔 - + Remove Game Directory 게임 디렉토리 제거 - + ▲ Move Up ▲ 위로 이동 - + ▼ Move Down ▼ 아래로 이동 - + Open Directory Location 디렉토리 위치 열기 - + Clear 초기화 - + Name 이름 - + Compatibility 호환성 - + Add-ons 부가 기능 - + File type 파일 형식 - + Size 크기 - + Play time @@ -7125,62 +7209,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame 게임 내 - + Game starts, but crashes or major glitches prevent it from being completed. 게임이 시작되지만, 충돌이나 주요 결함으로 인해 게임이 완료되지 않습니다. - + Perfect 완벽함 - + Game can be played without issues. 문제 없이 게임 플레이가 가능합니다. - + Playable 재생 가능 - + Game functions with minor graphical or audio glitches and is playable from start to finish. 약간의 그래픽 또는 오디오 결함이 있는 게임 기능이 있으며 처음부터 끝까지 플레이할 수 있습니다. - + Intro/Menu 인트로/메뉴 - + Game loads, but is unable to progress past the Start Screen. 게임이 로드되지만 시작 화면을 지나서 진행할 수 없습니다. - + Won't Boot 실행 불가 - + The game crashes when attempting to startup. 게임 실행 시 크래시가 일어납니다. - + Not Tested 테스트되지 않음 - + The game has not yet been tested. 이 게임은 아직 테스트되지 않았습니다. @@ -7188,7 +7272,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list 더블 클릭하여 게임 목록에 새 폴더 추가 @@ -7196,19 +7280,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) %1 중의 %n 결과 + %1 중의 %n 결과 - + Filter: 필터: - + Enter pattern to filter 검색 필터 입력 @@ -7290,7 +7375,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7304,190 +7389,190 @@ Debug Message: Hotkeys - + Audio Mute/Unmute 오디오 음소거/음소거 해제 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window 메인 윈도우 - + Audio Volume Down 오디오 볼륨 낮추기 - + Audio Volume Up 오디오 볼륨 키우기 - + Capture Screenshot 스크린샷 캡처 - + Change Adapting Filter 적응형 필터 변경 - + Change Docked Mode 독 모드 변경 - + Change GPU Accuracy GPU 정확성 변경 - + Configure 설정 - + Configure Current Game - + Continue/Pause Emulation 재개/에뮬레이션 일시중지 - + Exit Fullscreen 전체화면 종료 + + + Exit Eden + + Exit yuzu yuzu 종료 - - Exit eden - - - - + Fullscreen 전체화면 - + Load File 파일 로드 - + Load/Remove Amiibo Amiibo 로드/제거 - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation 에뮬레이션 재시작 - + Stop Emulation 에뮬레이션 중단 - + TAS Record TAS 기록 - + TAS Reset TAS 리셋 - + TAS Start/Stop TAS 시작/멈춤 - + Toggle Filter Bar 상태 표시줄 전환 - + Toggle Framerate Limit 프레임속도 제한 토글 - + Toggle Mouse Panning 마우스 패닝 활성화 - + Toggle Renderdoc Capture - + Toggle Status Bar 상태 표시줄 전환 @@ -7495,22 +7580,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. 설치하려는 파일이 맞는지 확인하십시오. - + Installing an Update or DLC will overwrite the previously installed one. 업데이트 또는 DLC를 설치하면 이전에 설치된 업데이트를 덮어 씁니다. - + Install 설치 - + Install Files to NAND NAND에 파일 설치 @@ -7518,7 +7603,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 텍스트는 다음 문자를 포함할 수 없습니다: @@ -7665,152 +7750,207 @@ Debug Message: 최근 파일(&R) - + + Open &Eden Folders + + + + &Emulation 에뮬레이션(&E) - + &View 보기(&V) - + &Reset Window Size 창 크기 초기화 (&R) - + &Debugging 디버깅(&D) - + Reset Window Size to &720p 창 크기를 720p로 맞추기(&7) - + Reset Window Size to 720p 창 크기를 720p로 맞추기 - + Reset Window Size to &900p 창 크기를 900p로 맞추기(&9) - + Reset Window Size to 900p 창 크기를 900p로 맞추기 - + Reset Window Size to &1080p 창 크기를 1080p로 맞추기(&1) - + Reset Window Size to 1080p 창 크기를 1080p로 맞추기 - + &Multiplayer 멀티플레이어(&M) - + &Tools 도구(&T) - + &Amiibo - + &TAS TAS(&T) - + &Create Home Menu Shortcut - + &Help 도움말(&H) - + &Install Files to NAND... 낸드에 파일 설치(&I) - + L&oad File... 파일 불러오기...(&L) - + Load &Folder... 폴더 불러오기...(&F) - + E&xit 종료(&X) - + &Pause 일시중지(&P) - + &Stop 정지(&S) - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7819,97 +7959,97 @@ Debug Message: yuzu 정보(&A) - + Single &Window Mode 싱글 창 모드(&W) - + Con&figure... 설정(&f) - + Ctrl+, - + Display D&ock Widget Headers 독 위젯 헤더 표시(&o) - + Show &Filter Bar 필터링 바 표시(&F) - + Show &Status Bar 상태 표시줄 보이기(&S) - + Show Status Bar 상태 표시줄 보이기 - + &Browse Public Game Lobby 공개 게임 로비 찾아보기(&B) - + &Create Room 방 만들기(&C) - + &Leave Room 방에서 나가기(&L) - + &Direct Connect to Room 방에 직접 연결(&D) - + &Show Current Room 현재 방 표시(&S) - + F&ullscreen 전체 화면(&u) - + &Restart 재시작(&R) - + Load/Remove &Amiibo... Amiibo 로드/제거(&A)... - + &Report Compatibility 호환성 보고(&R) - + Open &Mods Page 게임 모드 페이지 열기(&M) - + Open &Quickstart Guide 빠른 시작 가이드 열기(&Q) - + &FAQ FAQ(&F) @@ -7918,77 +8058,82 @@ Debug Message: yuzu 폴더 열기(&y) - + &Capture Screenshot 스크린샷 찍기(&C) - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... TAS설정...(&C) - + Configure C&urrent Game... 실행중인 게임 맞춤 설정...(&u) - + &Start 시작(&S) - + &Reset 리셋(&R) - + R&ecord 레코드(&e) - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7996,26 +8141,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - 마이크로 프로파일(&M) + 마이크로 프로파일(&M) MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8075,37 +8230,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status 현재 연결 상태 - + Not Connected. Click here to find a room! 연결되지 않았습니다. 방을 찾으려면 여기를 클릭하세요! - + Not Connected 연결되지 않음 - + Connected 연결됨 - + New Messages Received 수신된 새 메시지 - + Error 오류 - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: 방 정보를 업데이트하지 못했습니다. 인터넷 연결을 확인하고 방을 다시 호스팅해 보세요. @@ -8297,56 +8452,56 @@ p, li { white-space: pre-wrap; } 게임을 하지 않음 - + Installed SD Titles 설치된 SD 타이틀 - + Installed NAND Titles 설치된 NAND 타이틀 - + System Titles 시스템 타이틀 - + Add New Game Directory 새 게임 디렉토리 추가 - + Favorites 선호하는 게임 - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [설정 안 됨] @@ -8357,14 +8512,14 @@ p, li { white-space: pre-wrap; } 방향키 %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 축 %1%2 @@ -8375,357 +8530,357 @@ p, li { white-space: pre-wrap; } %1 버튼 - - - - - - + + + + + + [unknown] [알 수 없음] - - - + + + Left 왼쪽 - - - + + + Right 오른쪽 - - - + + + Down 아래 - - - + + + Up - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle 동그라미 - - + + Cross 엑스 - - + + Square 네모 - - + + Triangle 세모 - - + + Share Share - - + + Options Options - - + + [undefined] [설정안됨] - + %1%2 %1%2 - - + + [invalid] [유효하지않음] - - + + %1%2Hat %3 %1%2방향키 %3 - - - + + + %1%2Axis %3 %1%2Axis %3 - - + + %1%2Axis %3,%4,%5 %1%2Axis %3,%4,%5 - - + + %1%2Motion %3 %1%2모션 %3 - - + + %1%2Button %3 %1%2버튼 %3 - - + + [unused] [미사용] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L L 스틱 - + Stick R R 스틱 - + Plus + - + Minus - - - + + Home - + Capture 캡쳐 - + Touch 터치 - + Wheel Indicates the mouse wheel - + Backward 뒤로가기 - + Forward 앞으로가기 - + Task Task - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3방향키%4 - - + + %1%2%3Axis %4 %1%2%3Axis %4 - - + + %1%2%3Button %4 %1%2%3버튼%4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8843,6 +8998,298 @@ p, li { white-space: pre-wrap; } 이 amiibo를 복원하겠습니까? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + 취소 + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + 무결성 검증에 성공했습니다. + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + 무결성 검증에 실패했습니다. + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + 콘텐츠 제거 중 오류 발생 + + + + Error Removing Update + 업데이트 제거 오류 + + + + Error Removing DLC + DLC 제거 오류 + + + + The base game is not installed in the NAND and cannot be removed. + 기본 게임은 NAND에 설치되어 있지 않으며 제거 할 수 없습니다. + + + + There is no update installed for this title. + 이 타이틀에 대해 설치된 업데이트가 없습니다. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + 삭제 완료 + + + + Successfully removed %1 installed DLC. + 설치된 %1 DLC를 성공적으로 제거했습니다. + + + + + Error Removing Transferable Shader Cache + 전송 가능한 셰이더 캐시 제거 오류 + + + + + A shader cache for this title does not exist. + 이 타이틀에 대한 셰이더 캐시가 존재하지 않습니다. + + + + Successfully removed the transferable shader cache. + 전송 가능한 셰이더 캐시를 성공적으로 제거했습니다. + + + + Failed to remove the transferable shader cache. + 전송 가능한 셰이더 캐시를 제거하지 못했습니다. + + + + Error Removing Vulkan Driver Pipeline Cache + Vulkan 드라이버 파이프라인 캐시 제거 오류 + + + + Failed to remove the driver pipeline cache. + 드라이버 파이프라인 캐시를 제거하지 못했습니다. + + + + + Error Removing Transferable Shader Caches + 전송 가능한 셰이더 캐시 제거 오류 + + + + Successfully removed the transferable shader caches. + 전송 가능한 셰이더 캐시를 성공적으로 제거했습니다. + + + + Failed to remove the transferable shader cache directory. + 전송 가능한 셰이더 캐시 디렉토리를 제거하지 못했습니다. + + + + + Error Removing Custom Configuration + 사용자 지정 구성 제거 오류 + + + + A custom configuration for this title does not exist. + 이 타이틀에 대한 사용자 지정 구성이 존재하지 않습니다. + + + + Successfully removed the custom game configuration. + 사용자 지정 게임 구성을 성공적으로 제거했습니다. + + + + Failed to remove the custom game configuration. + 사용자 지정 게임 구성을 제거하지 못했습니다. + + + + Reset Metadata Cache + 메타 데이터 캐시 초기화 + + + + The metadata cache is already empty. + 메타 데이터 캐시가 이미 비어있습니다. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + 메타 데이터 캐시 삭제를 삭제할 수 없습니다. 해당 파일이 이미 사용 중이거나 존재하지 않을 수 있습니다. + + + + Create Shortcut + 바로가기 만들기 + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + %1 바로가기를 성공적으로 만듬 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + 현재 AppImage에 대한 바로 가기가 생성됩니다. 업데이트하면 제대로 작동하지 않을 수 있습니다. 계속합니까? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + 아이콘 만들기 + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + 아이콘 파일을 만들 수 없습니다. 경로 "%1"이(가) 존재하지 않으며 생성할 수 없습니다. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9138,7 +9585,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9146,7 +9593,7 @@ Please try again or contact the developer of the software. %2 - + Users 사용자 @@ -9270,7 +9717,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack 콜 스택 @@ -9278,12 +9725,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread 스레드를 기다리고 있지 않습니다 @@ -9291,102 +9738,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable 실행 가능 - + paused 일시중지 - + sleeping 수면중 - + waiting for IPC reply IPC 회신을 기다립니다 - + waiting for objects 개체를 기다립니다 - + waiting for condition variable 조건 변수를 기다립니다 - + waiting for address arbiter 주소 결정인을 기다립니다 - + waiting for suspend resume 보류 재개를 기다리는 중 - + waiting 기다리는 중 - + initialized 초기화됨 - + terminated 종료됨 - + unknown 알 수 없음 - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal 이상적 - + core %1 코어 %1 - + processor = %1 프로세서 = %1 - + affinity mask = %1 선호도 마스크 = %1 - + thread id = %1 스레드 아이디 = %1 - + priority = %1(current) / %2(normal) 우선순위 = %1(현재) / %2(일반) - + last running ticks = %1 마지막 실행 틱 = %1 @@ -9394,7 +9841,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread 스레드에서 기다림 @@ -9402,7 +9849,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree 대기 트리(&W) diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 5a3e000a21..854615b3ed 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Kommuniserer med serveren... - + Cancel Avbryt - + Touch the top left corner <br>of your touchpad. Berør øverste venstre hjørne <br>på styreplaten. - + Now touch the bottom right corner <br>of your touchpad. Berør så nederste venstre hjørne <br>på styreplaten. - + Configuration completed! Konfigurasjon ferdig! - + OK OK @@ -397,439 +397,157 @@ Dette vil bannlyse både deres forum brukernavn og deres IP adresse. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Feil - - Net connect - - - - - Player select - - - - + Software keyboard Programvaretastatur - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Utgangsmotor - + Output Device: Utgangsenhet: - + Input Device: Inngangsenhet: - - Mute audio - - - - + Volume: Volum: - + Mute audio when in background Demp lyden når yuzu kjører i bakgrunnen - + Multicore CPU Emulation Fjerkjernes prosessoremulering - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Begrens Farts-Prosent - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Nøyaktighet: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Del opp FMA (forbedre ytelsen på prosessorer uten FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Raskere FRSQRTE og FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Raskere ASIMD-instruksjoner (kun 32-bit) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Unøyaktig NaN-håndtering - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Slå av adresseromskontroller - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Ignorer global overvåkning - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Enhet: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Shader-backend: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Oppløsning: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Vindustilpasningsfilter: - + FSR Sharpness: FSR Skarphet: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Anti-aliasing–metode: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Fullskjermmodus: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Størrelsesforhold: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Bruk diskens rørledningsmellomlagring - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Bruk asynkron GPU-emulering - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC-emulering: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: VSync Modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +558,34 @@ Mailbox kan ha lavere ventetid enn FIFO og river ikke, men kan slippe rammer. Umiddelbar (ingen synkronisering) presenterer bare det som er tilgjengelig og kan vise riving. - + Enable asynchronous presentation (Vulkan only) Aktiver asynkron presentasjon (kun Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Tving maksikal klokkehastighet (kun Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Kjører arbeid i bakgrunnen mens den venter på grafikkommandoer for å forhindre at GPU-en senker klokkehastigheten. - + Anisotropic Filtering: Anisotropisk filtrering: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Nøyaktighetsnivå: + Nøyaktighetsnivå: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Bruk asynkron shader-bygging (hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Bruk Rask GPU-Tid (Hack) @@ -905,1021 +595,1428 @@ This feature is experimental. Aktiverer rask GPU-tid. Dette alternativet vil tvinge de fleste spill til å kjøre med sin høyeste opprinnelige oppløsning. - + Use Vulkan pipeline cache Bruk Vulkan rørledningsbuffer - + + Enable Reactive Flushing + Aktiver Reaktiv Tømming + + + + Sync to framerate of video playback + Synkroniser med bildefrekvensen for videoavspilling + + + + Run the game at normal speed during video playback, even when the framerate is unlocked. + Kjør spillet i normal hastighet under videoavspilling, selv når bildefrekvensen er låst opp. + + + + Barrier feedback loops + Tilbakekoblingssløyfer for barrierer + + + + Improves rendering of transparency effects in specific games. + Forbedrer gjengivelsen av transparenseffekter i spesifikke spill. + + + + RNG Seed + Frø For Tilfeldig Nummergenerering + + + + Device Name + Enhetsnavn + + + + Note: this can be overridden when region setting is auto-select + NB: dette kan bli overstyrt når regionsinnstillingen er satt til auto-valg + + + + Region: + Region: + + + + Time Zone: + Tidssone: + + + + Sound Output Mode: + Lydutgangsmodus: + + + + Prompt for user on game boot + Spør om bruker når et spill starter + + + + Pause emulation when in background + Paus emulering når yuzu kjører i bakgrunnen + + + + Hide mouse on inactivity + Gjem mus under inaktivitet + + + + Disable controller applet + Deaktiver kontroller-appleten + + + + CPU + CPU + + + + Uncompressed (Best quality) + Ukomprimert (beste kvalitet) + + + + BC1 (Low quality) + BC1 (Lav kvalitet) + + + + BC3 (Medium quality) + BC3 (Medium kvalitet) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (assembly-shader-e, kun med NVIDIA) + + + + Normal + Normal + + + + High + Høy + + + + Extreme + Ekstrem + + + + Auto + Auto + + + + Accurate + Nøyaktig + + + + Unsafe + Utrygt + + + + Paranoid (disables most optimizations) + Paranoid (deaktiverer de fleste optimaliseringer) + + + + Borderless Windowed + Rammeløst vindu + + + + Exclusive Fullscreen + Eksklusiv fullskjerm + + + + No Video Output + Ingen videoutdata + + + + CPU Video Decoding + Prosessorvideodekoding + + + + GPU Video Decoding (Default) + GPU-videodekoding (standard) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [EKSPERIMENTELL] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [EXPERIMENTELL] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nærmeste nabo + + + + Bilinear + Bilineær + + + + Bicubic + Bikubisk + + + + Gaussian + Gaussisk + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Ingen + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Standard (16:9) + + + + Force 4:3 + Tving 4:3 + + + + Force 21:9 + Tving 21:9 + + + + Force 16:10 + Tving 16:10 + + + + Stretch to Window + Strekk til Vindu + + + + Automatic + Automatisk + + + + + Default + Standard + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - Aktiver Reaktiv Tømming - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - - Sync to framerate of video playback - Synkroniser med bildefrekvensen for videoavspilling + + RAII + - - Run the game at normal speed during video playback, even when the framerate is unlocked. - Kjør spillet i normal hastighet under videoavspilling, selv når bildefrekvensen er låst opp. + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + - - Barrier feedback loops - Tilbakekoblingssløyfer for barrierer + + Extended Dynamic State + - - Improves rendering of transparency effects in specific games. - Forbedrer gjengivelsen av transparenseffekter i spesifikke spill. + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + - - RNG Seed - Frø For Tilfeldig Nummergenerering + + Provoking Vertex + - + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Enhetsnavn - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - NB: dette kan bli overstyrt når regionsinnstillingen er satt til auto-valg - - - - Region: - Region: - - - + The region of the emulated Switch. - - Time Zone: - Tidssone: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Lydutgangsmodus: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Spør om bruker når et spill starter - - - - Pause emulation when in background - Paus emulering når yuzu kjører i bakgrunnen - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Gjem mus under inaktivitet - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - Deaktiver kontroller-appleten - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - - Uncompressed (Best quality) - Ukomprimert (beste kvalitet) - - - - BC1 (Low quality) - BC1 (Lav kvalitet) - - - - BC3 (Medium quality) - BC3 (Medium kvalitet) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (assembly-shader-e, kun med NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Normal + + Unsafe (fast) + - - High - Høy + + Safe (stable) + - - Extreme - Ekstrem - - - - Auto - Auto - - - - Accurate - Nøyaktig - - - - Unsafe - Utrygt - - - - Paranoid (disables most optimizations) - Paranoid (deaktiverer de fleste optimaliseringer) - - - + Dynarmic - + NCE - - Borderless Windowed - Rammeløst vindu - - - - Exclusive Fullscreen - Eksklusiv fullskjerm - - - - No Video Output - Ingen videoutdata - - - - CPU Video Decoding - Prosessorvideodekoding - - - - GPU Video Decoding (Default) - GPU-videodekoding (standard) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [EKSPERIMENTELL] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [EXPERIMENTELL] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nærmeste nabo - - - - Bilinear - Bilineær - - - - Bicubic - Bikubisk - - - - Gaussian - Gaussisk - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Ingen - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Standard (16:9) - - - - Force 4:3 - Tving 4:3 - - - - Force 21:9 - Tving 21:9 - - - - Force 16:10 - Tving 16:10 - - - - Stretch to Window - Strekk til Vindu - - - - Automatic - Automatisk - - - - Default - Standard - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japansk (日本語) - + American English Amerikans Engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk Engelsk - + Canadian French Kanadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Tradisjonell Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Normalverdi (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Dokket - + Handheld Håndholdt - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2271,27 +2368,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Loggføring - + Open Log Location Åpne Logg-Plassering - + Global Log Filter Global Loggfilter - + When checked, the max size of the log increases from 100 MB to 1 GB Når dette er på øker maksstørrelsen til loggen fra 100 MB til 1 GB - + Enable Extended Logging** Slå på utvidet loggføring** - + Show Log in Console Vis logg i konsollen @@ -2437,7 +2534,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2499,7 +2596,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Dette blir automatisk tilbakestilt når yuzu lukkes. - + Web applet not compiled Web-applet ikke kompilert @@ -2549,7 +2646,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2558,88 +2655,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Noen innstillinger er bare tilgjengelige når spillet ikke er i gang. - + Applets - - + + Audio Lyd - - + + CPU CPU - + Debug Feilsøk - + Filesystem Filsystem - - + + General Generelt - - + + Graphics Grafikk - + GraphicsAdvanced AvnsertGrafikk - + GraphicsExtensions - + Hotkeys Hurtigtaster - - + + Controls Kontrollere - + Profiles Profiler - + Network Nettverk - - + + System System - + Game List Spill Liste - + Web Nett @@ -2737,51 +2834,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Tilbakestill Mellomlagringen for Metadata - + Select Emulated NAND Directory... Velg Emulert NAND-Mappe... - + Select Emulated SD Directory... Velg Emulert SD-Mappe... - + Select Gamecard Path... Velg Spillkortbane... - + Select Dump Directory... Velg Dump-Katalog - + Select Mod Load Directory... Velg Mod-Lastingsmappe... - The metadata cache is already empty. - Mellomlagringen for metadata er allerede tom. + Mellomlagringen for metadata er allerede tom. - The operation completed successfully. - Operasjonen ble fullført vellykket. + Operasjonen ble fullført vellykket. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Mellomlagringen for metadata kunne ikke slettes. Den kan være i bruk eller ikke-eksisterende. + Mellomlagringen for metadata kunne ikke slettes. Den kan være i bruk eller ikke-eksisterende. @@ -2812,12 +2903,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Dette tilbakestiller alle innstillinger og fjerner alle spillinnstillinger. Spillmapper, profiler og inndataprofiler blir ikke slettet. Fortsett? @@ -2850,33 +2941,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Bakgrunnsfarge: - + % FSR sharpening percentage (e.g. 50%) % - + Off Av - + VSync Off VSync Av - + Recommended Anbefalt - + On - + VSync On VSync På @@ -2913,14 +3004,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2952,75 +3047,75 @@ These settings are experimental, and may cause black screens. If your games fail Gjenopprett Standardverdier - + Action Handling - + Hotkey Hurtigtast - + Controller Hotkey Kontrollerhurtigtast - - - + + + Conflicting Key Sequence Mostridende tastesekvens - - + + The entered key sequence is already assigned to: %1 Den inntastede tastesekvensen er allerede tildelt til: %1 - + [waiting] [venter] - + Invalid Ugyldig - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Gjenopprett Standardverdi - + Clear Fjern - + Conflicting Button Sequence Motstridende knappesekvens - + The default button sequence is already assigned to: %1 Standardknappesekvensen er allerede tildelt til: %1 - + The default key sequence is already assigned to: %1 Standardtastesekvensen er allerede tildelt til: %1 @@ -3340,7 +3435,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3495,7 +3590,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Venstre Pinne @@ -3605,14 +3700,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3631,7 +3726,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Pluss @@ -3644,15 +3739,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3697,7 +3792,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Høyre Pinne @@ -3712,242 +3807,242 @@ These settings are experimental, and may cause black screens. If your games fail Konfigurer - - - - + + + + Clear Fjern - - - - - + + + + + [not set] [ikke satt] - - - + + + Invert button Inverter knapp - - + + Toggle button Veksle knapp - + Turbo button Turbo-Knapp - - + + Invert axis Inverter akse - - - + + + Set threshold Set grense - - + + Choose a value between 0% and 100% Velg en verdi mellom 0% og 100% - + Toggle axis veksle akse - + Set gyro threshold Angi gyroterskel - + Calibrate sensor Kalibrer sensor - + Map Analog Stick Kartlegg Analog Spak - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Etter du har trykker på OK, flytt først stikken horisontalt, og så vertikalt. For å invertere aksene, flytt først stikken vertikalt, og så horistonalt. - + Center axis Senterakse - - + + Deadzone: %1% Dødsone: %1% - - + + Modifier Range: %1% Modifikatorområde: %1% - - + + Pro Controller Pro-Kontroller - + Dual Joycons Doble Joycons - + Left Joycon Venstre Joycon - + Right Joycon Høyre Joycon - + Handheld Håndholdt - + GameCube Controller GameCube-kontroller - + Poke Ball Plus Poke Ball Plus - + NES Controller NES-kontroller - + SNES Controller SNES-kontroller - + N64 Controller N64-kontroller - + Sega Genesis Sega Genesis - + Start / Pause Start / paus - + Z Z - + Control Stick Kontrollstikke - + C-Stick C-stikke - + Shake! Rist! - + [waiting] [venter] - + New Profile Ny Profil - + Enter a profile name: Skriv inn et profilnavn: - - + + Create Input Profile Lag inndataprofil - + The given profile name is not valid! Det oppgitte profilenavnet er ugyldig! - + Failed to create the input profile "%1" Klarte ikke lage inndataprofil "%1" - + Delete Input Profile Slett inndataprofil - + Failed to delete the input profile "%1" Klarte ikke slette inndataprofil "%1" - + Load Input Profile Last inn inndataprofil - + Failed to load the input profile "%1" Klarte ikke laste inn inndataprofil "%1" - + Save Input Profile Lagre inndataprofil - + Failed to save the input profile "%1" Klarte ikke lagre inndataprofil "%1" @@ -4004,7 +4099,7 @@ For å invertere aksene, flytt først stikken vertikalt, og så horistonalt. - + Configure Konfigurer @@ -4040,7 +4135,7 @@ For å invertere aksene, flytt først stikken vertikalt, og så horistonalt. - + Test Test @@ -4059,7 +4154,7 @@ For å invertere aksene, flytt først stikken vertikalt, og så horistonalt.<a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Lær Mer</span></a> - + %1:%2 %1:%2 @@ -4068,77 +4163,77 @@ For å invertere aksene, flytt først stikken vertikalt, og så horistonalt.yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Portnummeret har ugyldige tegn - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Porten må være i intervallet 0 til 65353 - + IP address is not valid IP-adressen er ugyldig - + This UDP server already exists Denne UDP-tjeneren eksisterer allerede - + Unable to add more than 8 servers Kan ikke legge til mer enn 8 tjenere - + Testing Testing - + Configuring Konfigurering - + Test Successful Test Vellykket - + Successfully received data from the server. Mottatt data fra serveren vellykket. - + Test Failed Test Feilet - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kunne ikke motta gyldig data fra serveren.<br>Vennligst bekreft at serveren er satt opp riktig og at adressen og porten er riktige. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-Test eller kalibrasjonskonfigurering er i fremgang.<br>Vennligst vent for dem til å bli ferdig. @@ -4265,7 +4360,12 @@ Gjeldende verdier er henholdsvis %1% og %2%. Nettverksgrensesnitt - + + Enable Airplane Mode + + + + None Ingen @@ -4323,52 +4423,52 @@ Gjeldende verdier er henholdsvis %1% og %2%. Noen innstillinger er bare tilgjengelige når spillet ikke er i gang. - + Add-Ons Tillegg - + System System - + CPU CPU - + Graphics Grafikk - + Adv. Graphics Avn. Grafikk - + GPU Extensions - + Audio Lyd - + Input Profiles Inndataprofiler - + Linux - + Properties Egenskaper @@ -4386,12 +4486,12 @@ Gjeldende verdier er henholdsvis %1% og %2%. Tillegg - + Patch Name Oppdateringsnavn - + Version Versjon @@ -4429,27 +4529,32 @@ Gjeldende verdier er henholdsvis %1% og %2%. Sett Bilde - + + Select Avatar + + + + Add Legg til - + Rename Gi nytt navn - + Remove Fjern - + Profile management is available only when game is not running. Profil-administrering er bare tilgjengelig når ingen spill kjører. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4457,100 +4562,189 @@ Gjeldende verdier er henholdsvis %1% og %2%. %2 - + Enter Username Skriv inn Brukernavn - + Users Brukere - + Enter a username for the new user: Tast inn et brukernavn for den nye brukeren: - + Enter a new username: Skriv inn et nytt brukernavn - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Sett Bruker Bilde - - JPEG Images (*.jpg *.jpeg) - JPEG Bilder (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG Bilder (*.jpg *.jpeg) + + + Error deleting image Feil ved sletting av bilde - + Error occurred attempting to overwrite previous image at: %1. En feil oppstod under overskrivelse av det forrige bildet på: %1. - + Error deleting file Feil ved sletting av fil - + Unable to delete existing file: %1. Kunne ikke slette eksisterende fil: %1. - + Error creating user image directory Feil under opprettelse av profilbildemappe - + Unable to create directory %1 for storing user images. Kunne ikke opprette mappe %1 for å lagre profilbilder. - Error copying user image - Feil under kopiering av profilbilde + Feil under kopiering av profilbilde - Unable to copy image from %1 to %2 - Kunne ikke kopiere bilde fra %1 til %2 + Kunne ikke kopiere bilde fra %1 til %2 - Error resizing user image - Feil under endring av størrelse på brukerbilde + Feil under endring av størrelse på brukerbilde - Unable to resize image - Klarte ikke endre bildestørrelse + Klarte ikke endre bildestørrelse + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Avbryt + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Slett denne brukeren? Alle brukerens lagrede data vil bli slettet. - + Confirm Delete Bekreft Sletting - + Name: %1 UUID: %2 Navn: %1 @@ -4603,7 +4797,7 @@ UUID: %2 - + Enable Aktiver @@ -4614,7 +4808,7 @@ UUID: %2 - + Not connected Ikke Tilkoblet @@ -4624,63 +4818,63 @@ UUID: %2 Gjenopprett Standardverdier - + Clear Fjern - + [not set] [ikke satt] - + Invert axis Inverter akse - - + + Deadzone: %1% Dødsone: %1% - + Error enabling ring input Feil ved aktivering av ringinndata - + Direct Joycon driver is not enabled Driver for direkte JoyCon tilkobling er ikke aktivert - + Configuring Konfigurering - + The current mapped device doesn't support the ring controller Den gjeldende tilordnede enheten støtter ikke ringkontrolleren. - + The current mapped device doesn't have a ring attached Den gjeldende kartlagte enheten har ikke en ring festet - + The current mapped device is not connected Den tilordnede enheten er ikke tilkoblet - + Unexpected driver result %1 Uventet driverresultat %1 - + [waiting] [venter] @@ -4722,7 +4916,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4774,12 +4968,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS-konfigurasjon - + Select TAS Load Directory... Velg TAS-lastemappe... @@ -4889,7 +5083,7 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5209,6 +5403,16 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re Web Nett + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Nettservice @@ -5218,42 +5422,29 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re Ved å gi ditt brukernavn og token, sier du deg enig til å la yuzu samle inn ytterlige brukerdataer, som kan inkludere brukeridentifiserende informasjon. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verifiser + Verifiser - Sign up - Registrer deg + Registrer deg - + Token: Token: - + Username: Brukernavn: - What is my token? - Hva er min token? + Hva er min token? - + Web Service configuration can only be changed when a public room isn't being hosted. Webtjenestekonfigurasjonen kan bare endres når et offentlig rom ikke blir arangert. @@ -5278,12 +5469,12 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re Regenerer - + Discord Presence Discord Nærvær - + Show Current Game in your Discord Status Vis Gjeldene Spill på din Discord Status @@ -5292,24 +5483,8 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Lær mer</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrer deg</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrer deg</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5332,10 +5507,9 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re Token ble ikke bekreftet. Endringen av tokenet ditt er ikke lagret. - Unverified, please click Verify before saving configuration Tooltip - Ubekreftet, klikk på Bekreft før du lagrer konfigurasjonen. + Ubekreftet, klikk på Bekreft før du lagrer konfigurasjonen. Verifying... @@ -5359,20 +5533,67 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Bekreftelsen mislyktes. Kontroller at du har tastet inn tokenet ditt riktig, og at internettforbindelsen din fungerer. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Kontroller P1 - + &Controller P1 &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versjon + + DirectConnect @@ -5478,7 +5699,12 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5486,11 +5712,6 @@ Dra punkter for å endre posisjon, eller dobbelttrykk på tabellfelter for å re The host of the room has banned you. Speak with the host to unban you or try a different room. Verten for rommet har utestengt deg. Snakk med verten for å oppheve utestengingen eller prøv et annet rom. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5552,7 +5773,7 @@ Gå til Konfigurer -> System -> Nettverk og gjør et valg. Telemetri - + Broken Vulkan Installation Detected Ødelagt Vulkan-installasjon oppdaget @@ -5561,106 +5782,105 @@ Gå til Konfigurer -> System -> Nettverk og gjør et valg. Vulkan-initialisering mislyktes under oppstart.<br><br>Klikk<a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>her for instruksjoner for å løse problemet</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kjører et spill - + Loading Web Applet... Laster web-applet... - - + + Disable Web Applet Slå av web-applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Deaktivering av webappleten kan føre til udefinert oppførsel og bør bare brukes med Super Mario 3D All-Stars. Er du sikker på at du vil deaktivere webappleten? (Dette kan aktiveres på nytt i feilsøkingsinnstillingene). - + The amount of shaders currently being built Antall shader-e som bygges for øyeblikket - + The current selected resolution scaling multiplier. Den valgte oppløsningsskaleringsfaktoren. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Nåværende emuleringshastighet. Verdier høyere eller lavere en 100% indikerer at emuleringen kjører raskere eller tregere enn en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hvor mange bilder per sekund spiller viser. Dette vil variere fra spill til spill og scene til scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid det tar for å emulere et Switch bilde. Teller ikke med bildebegrensing eller v-sync. For full-hastighet emulering burde dette være 16.67 ms. på det høyeste. - + Unmute Slå på lyden - + Mute Lydløs - + Reset Volume Tilbakestill volum - + &Clear Recent Files &Tøm Nylige Filer - + &Continue &Fortsett - + &Pause &Paus - Warning Outdated Game Format - Advarsel: Utdatert Spillformat + Advarsel: Utdatert Spillformat You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Du bruker en dekonstruert ROM-mappe for dette spillet, som er et utdatert format som har blitt erstattet av andre formater som NCA, NAX, XCI, eller NSP. Dekonstruerte ROM-mapper mangler ikoner, metadata, og oppdateringsstøtte.<br><br>For en forklaring på diverse Switch-formater som yuzu støtter,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>sjekk vår wiki</a>. Denne meldingen vil ikke bli vist igjen. - - + + Error while loading ROM! Feil under innlasting av ROM! - + The ROM format is not supported. Dette ROM-formatet er ikke støttet. - + An error occurred initializing the video core. En feil oppstod under initialisering av videokjernen. @@ -5669,7 +5889,7 @@ Gå til Konfigurer -> System -> Nettverk og gjør et valg. yuzu har oppdaget en feil under kjøring av videokjernen. Dette er vanligvis forårsaket av utdaterte GPU-drivere, inkludert for integrert grafikk. Vennligst sjekk loggen for flere detaljer. For mer informasjon om å finne loggen, besøk følgende side: <a href='https://yuzu-emu.org/help/reference/log-files/'>How to Uploadd the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Feil under lasting av ROM! %1 @@ -5680,473 +5900,397 @@ Gå til Konfigurer -> System -> Nettverk og gjør et valg. %1<br>Vennligst følg <a href='https://yuzu-emu.org/help/quickstart/'>hurtigstartsguiden</a> for å redumpe filene dine. <br>Du kan henvise til yuzu wikien</a> eller yuzu Discorden</a> for hjelp. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. En ukjent feil oppstod. Se loggen for flere detaljer. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Lukker programvare... - + Save Data Lagre Data - + Mod Data Mod Data - + Error Opening %1 Folder Feil Under Åpning av %1 Mappen - - + + Folder does not exist! Mappen eksisterer ikke! - Error Opening Transferable Shader Cache - Feil ved åpning av overførbar shaderbuffer + Feil ved åpning av overførbar shaderbuffer - Failed to create the shader cache directory for this title. - Kunne ikke opprette shader cache-katalogen for denne tittelen. + Kunne ikke opprette shader cache-katalogen for denne tittelen. - Error Removing Contents - Feil ved fjerning av innhold + Feil ved fjerning av innhold - Error Removing Update - Feil ved fjerning av oppdatering + Feil ved fjerning av oppdatering - Error Removing DLC - Feil ved fjerning av DLC + Feil ved fjerning av DLC - + Remove Installed Game Contents? Fjern Innstallert Spillinnhold? - + Remove Installed Game Update? Fjern Installert Spilloppdatering? - + Remove Installed Game DLC? Fjern Installert Spill DLC? - + Remove Entry Fjern oppføring - - - - - - Successfully Removed - Fjerning lykkes + Fjerning lykkes - Successfully removed the installed base game. - Vellykket fjerning av det installerte basisspillet. + Vellykket fjerning av det installerte basisspillet. - The base game is not installed in the NAND and cannot be removed. - Grunnspillet er ikke installert i NAND og kan ikke bli fjernet. + Grunnspillet er ikke installert i NAND og kan ikke bli fjernet. - Successfully removed the installed update. - Fjernet vellykket den installerte oppdateringen. + Fjernet vellykket den installerte oppdateringen. - There is no update installed for this title. - Det er ingen oppdatering installert for denne tittelen. + Det er ingen oppdatering installert for denne tittelen. - There are no DLC installed for this title. - Det er ingen DLC installert for denne tittelen. + Det er ingen DLC installert for denne tittelen. - Successfully removed %1 installed DLC. - Fjernet vellykket %1 installerte DLC-er. + Fjernet vellykket %1 installerte DLC-er. - + Delete OpenGL Transferable Shader Cache? Slette OpenGL Overførbar Shaderbuffer? - + Delete Vulkan Transferable Shader Cache? Slette Vulkan Overførbar Shaderbuffer? - + Delete All Transferable Shader Caches? Slette Alle Overførbare Shaderbuffere? - + Remove Custom Game Configuration? Fjern Tilpasset Spillkonfigurasjon? - + Remove Cache Storage? Fjerne Hurtiglagringen? - + Remove File Fjern Fil - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Feil under fjerning av overførbar shader cache + Feil under fjerning av overførbar shader cache - - A shader cache for this title does not exist. - En shaderbuffer for denne tittelen eksisterer ikke. + En shaderbuffer for denne tittelen eksisterer ikke. - Successfully removed the transferable shader cache. - Lykkes i å fjerne den overførbare shader cachen. + Lykkes i å fjerne den overførbare shader cachen. - Failed to remove the transferable shader cache. - Feil under fjerning av den overførbare shader cachen. + Feil under fjerning av den overførbare shader cachen. - Error Removing Vulkan Driver Pipeline Cache - Feil ved fjerning av Vulkan Driver-Rørledningsbuffer + Feil ved fjerning av Vulkan Driver-Rørledningsbuffer - Failed to remove the driver pipeline cache. - Kunne ikke fjerne driverens rørledningsbuffer. + Kunne ikke fjerne driverens rørledningsbuffer. - - Error Removing Transferable Shader Caches - Feil ved fjerning av overførbare shaderbuffere + Feil ved fjerning av overførbare shaderbuffere - Successfully removed the transferable shader caches. - Vellykket fjerning av overførbare shaderbuffere. + Vellykket fjerning av overførbare shaderbuffere. - Failed to remove the transferable shader cache directory. - Feil ved fjerning av overførbar shaderbuffer katalog. + Feil ved fjerning av overførbar shaderbuffer katalog. - - Error Removing Custom Configuration - Feil Under Fjerning Av Tilpasset Konfigurasjon + Feil Under Fjerning Av Tilpasset Konfigurasjon - A custom configuration for this title does not exist. - En tilpasset konfigurasjon for denne tittelen finnes ikke. + En tilpasset konfigurasjon for denne tittelen finnes ikke. - Successfully removed the custom game configuration. - Fjernet vellykket den tilpassede spillkonfigurasjonen. + Fjernet vellykket den tilpassede spillkonfigurasjonen. - Failed to remove the custom game configuration. - Feil under fjerning av den tilpassede spillkonfigurasjonen. + Feil under fjerning av den tilpassede spillkonfigurasjonen. - - + + RomFS Extraction Failed! Utvinning av RomFS Feilet! - + There was an error copying the RomFS files or the user cancelled the operation. Det oppstod en feil under kopiering av RomFS filene eller så kansellerte brukeren operasjonen. - + Full Fullstendig - + Skeleton Skjelett - + Select RomFS Dump Mode Velg RomFS Dump Modus - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Velg hvordan du vil dumpe RomFS.<br>Fullstendig vil kopiere alle filene til en ny mappe mens <br>skjelett vil bare skape mappestrukturen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Det er ikke nok ledig plass på %1 til å pakke ut RomFS. Vennligst frigjør plass eller velg en annen dump-katalog under Emulering > Konfigurer > System > Filsystem > Dump Root. - + Extracting RomFS... Utvinner RomFS... - - - - - + + Cancel Avbryt - + RomFS Extraction Succeeded! RomFS Utpakking lyktes! - - - + The operation completed successfully. Operasjonen fullført vellykket. - Integrity verification couldn't be performed! - Integritetsverifisering kunne ikke utføres! + Integritetsverifisering kunne ikke utføres! - File contents were not checked for validity. - Filinnholdet ble ikke kontrollert for gyldighet. + Filinnholdet ble ikke kontrollert for gyldighet. - - Verifying integrity... - Verifiserer integritet... + Verifiserer integritet... - - Integrity verification succeeded! - Integritetsverifisering vellykket! + Integritetsverifisering vellykket! - - Integrity verification failed! - Integritetsverifisering mislyktes! + Integritetsverifisering mislyktes! - File contents may be corrupt. - Filinnholdet kan være skadet. + Filinnholdet kan være skadet. - - - - Create Shortcut - Lag Snarvei + Lag Snarvei - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Opprettet en snarvei til %1 + Opprettet en snarvei til %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Dette vil opprette en snarvei til gjeldende AppImage. Dette fungerer kanskje ikke bra hvis du oppdaterer. Fortsette? + Dette vil opprette en snarvei til gjeldende AppImage. Dette fungerer kanskje ikke bra hvis du oppdaterer. Fortsette? - - Failed to create a shortcut to %1 + Create Icon + Lag Ikon + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Kan ikke opprette ikonfil. Stien "%1" finnes ikke og kan ikke opprettes. + + + + Warning: Outdated Game Format - - Create Icon - Lag Ikon + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Kan ikke opprette ikonfil. Stien "%1" finnes ikke og kan ikke opprettes. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Feil ved åpning av %1 - + Select Directory Velg Mappe - + Properties Egenskaper - + The game properties could not be loaded. Spillets egenskaper kunne ikke bli lastet inn. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch Kjørbar Fil (%1);;Alle Filer (*.*) - + Load File Last inn Fil - + Open Extracted ROM Directory Åpne Utpakket ROM Mappe - + Invalid Directory Selected Ugyldig Mappe Valgt - + The directory you have selected does not contain a 'main' file. Mappen du valgte inneholder ikke en 'main' fil. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installerbar Switch-Fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xcI) - + Install Files Installer Filer - + %n file(s) remaining %n fil gjenstår @@ -6154,25 +6298,25 @@ Gå til Konfigurer -> System -> Nettverk og gjør et valg. - + Installing file "%1"... Installerer fil "%1"... - - + + Install Results Insallasjonsresultater - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. For å unngå mulige konflikter fraråder vi brukere å installere basisspill på NAND. Bruk kun denne funksjonen til å installere oppdateringer og DLC. - + %n file(s) were newly installed @@ -6183,7 +6327,7 @@ Bruk kun denne funksjonen til å installere oppdateringer og DLC. - + %n file(s) were overwritten @@ -6194,7 +6338,7 @@ Bruk kun denne funksjonen til å installere oppdateringer og DLC. - + %n file(s) failed to install @@ -6205,491 +6349,451 @@ Bruk kun denne funksjonen til å installere oppdateringer og DLC. - + System Application Systemapplikasjon - + System Archive Systemarkiv - + System Application Update Systemapplikasjonsoppdatering - + Firmware Package (Type A) Firmware Pakke (Type A) - + Firmware Package (Type B) Firmware-Pakke (Type B) - + Game Spill - + Game Update Spilloppdatering - + Game DLC Spill tilleggspakke - + Delta Title Delta Tittel - + Select NCA Install Type... Velg NCA Installasjonstype... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Vennligst velg typen tittel du vil installere denne NCA-en som: (I de fleste tilfellene, standarden 'Spill' fungerer.) - + Failed to Install Feil under Installasjon - + The title type you selected for the NCA is invalid. Titteltypen du valgte for NCA-en er ugyldig. - + File not found Fil ikke funnet - + File "%1" not found Filen "%1" ikke funnet - + OK OK - - + + Hardware requirements not met Krav til maskinvare ikke oppfylt - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Systemet ditt oppfyller ikke de anbefalte maskinvarekravene. Kompatibilitetsrapportering er deaktivert. - + Missing yuzu Account Mangler yuzu Bruker - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. For å sende inn et testtilfelle for spillkompatibilitet, må du linke yuzu-brukeren din.<br><br/>For å linke yuzu-brukeren din, gå til Emulasjon &gt; Konfigurasjon &gt; Nett. - + Error opening URL Feil under åpning av URL - + Unable to open the URL "%1". Kunne ikke åpne URL "%1". - + TAS Recording TAS-innspilling - + Overwrite file of player 1? Overskriv filen til spiller 1? - + Invalid config detected Ugyldig konfigurasjon oppdaget - + Handheld controller can't be used on docked mode. Pro controller will be selected. Håndholdt kontroller kan ikke brukes i dokket modus. Pro-kontroller vil bli valgt. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Den valgte amiibo-en har blitt fjernet - + Error Feil - - + + The current game is not looking for amiibos Det kjørende spillet sjekker ikke for amiibo-er - + Amiibo File (%1);; All Files (*.*) Amiibo-Fil (%1);; Alle Filer (*.*) - + Load Amiibo Last inn Amiibo - + Error loading Amiibo data Feil ved lasting av Amiibo data - + The selected file is not a valid amiibo Den valgte filen er ikke en gyldig amiibo - + The selected file is already on use Den valgte filen er allerede i bruk - + An unknown error occurred En ukjent feil oppso - - Verification failed for the following files: %1 - Verifisering mislyktes for følgende filer: + Verifisering mislyktes for følgende filer: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Applet for kontroller - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Ta Skjermbilde - + PNG Image (*.png) PNG Bilde (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS-tilstand: Kjører %1/%2 - + TAS state: Recording %1 TAS-tilstand: Spiller inn %1 - + TAS state: Idle %1/%2 TAS-tilstand: Venter %1%2 - + TAS State: Invalid TAS-tilstand: Ugyldig - + &Stop Running &Stopp kjøring - + &Start &Start - + Stop R&ecording Stopp innspilling (&E) - + R&ecord Spill inn (%E) - + Building: %n shader(s) Bygger: %n shader @@ -6697,18 +6801,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% @@ -6717,54 +6821,54 @@ Would you like to download it? Spill: %1 FPS (ubegrenset) - + Game: %1 FPS Spill: %1 FPS - + Frame: %1 ms Ramme: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA INGEN AA - + VOLUME: MUTE VOLUM: DEMPET - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + Derivation Components Missing Derivasjonskomponenter Mangler - + Select RomFS Dump Target Velg RomFS Dump-Mål - + Please select which RomFS you would like to dump. Vennligst velg hvilken RomFS du vil dumpe. @@ -6777,7 +6881,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Er du sikker på at du vil stoppe emulasjonen? All ulagret fremgang vil bli tapt. @@ -6790,102 +6894,102 @@ Would you like to bypass this and exit anyway? Vil du overstyre dette og lukke likevel? - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Nearest Nærmest - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + ScaleForce ScaleForce - + Area - + Docked Dokket - + Handheld Håndholdt - + Normal Normal - + High Høy - + Extreme Ekstrem - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6893,13 +6997,13 @@ Vil du overstyre dette og lukke likevel? GRenderWindow - - + + OpenGL not available! OpenGL ikke tilgjengelig! - + OpenGL shared contexts are not supported. Delte OpenGL-kontekster støttes ikke. @@ -6908,33 +7012,33 @@ Vil du overstyre dette og lukke likevel? yuzu har ikke blitt kompilert med OpenGL-støtte. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Feil under initialisering av OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Det kan hende at GPU-en din ikke støtter OpenGL, eller at du ikke har den nyeste grafikkdriveren. - + Error while initializing OpenGL 4.6! Feil under initialisering av OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Det kan hende at GPU-en din ikke støtter OpenGL 4.6, eller at du ikke har den nyeste grafikkdriveren.<br><br>GL-renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Det kan hende at GPU-en din ikke støtter én eller flere nødvendige OpenGL-utvidelser. Vennligst sørg for at du har den nyeste grafikkdriveren.<br><br>GL-renderer: <br>%1<br><br>Ikke-støttede utvidelser:<br>%2 @@ -6942,128 +7046,128 @@ Vil du overstyre dette og lukke likevel? GameList - + Favorite Legg til som favoritt - + Start Game Start Spill - + Start Game without Custom Configuration Star Spill Uten Tilpasset Konfigurasjon - + Open Save Data Location Åpne Lagret Data plassering - + Open Mod Data Location Åpne Mod Data plassering - + Open Transferable Pipeline Cache Åpne Overførbar Rørledningsbuffer - + Remove Fjern - + Remove Installed Update Fjern Installert Oppdatering - + Remove All Installed DLC Fjern All Installert DLC - + Remove Custom Configuration Fjern Tilpasset Konfigurasjon - + Remove Play Time Data - + Remove Cache Storage Fjern Hurtiglagring - + Remove OpenGL Pipeline Cache Fjer OpenGL Rørledningsbuffer - + Remove Vulkan Pipeline Cache Fjern Vulkan Rørledningsbuffer - + Remove All Pipeline Caches Fjern Alle Rørledningsbuffere - + Remove All Installed Contents Fjern All Installert Innhold - + Dump RomFS Dump RomFS - + Dump RomFS to SDMC Dump RomFS til SDMC - + Verify Integrity Verifiser integritet - + Copy Title ID to Clipboard Kopier Tittel-ID til Utklippstavle - + Navigate to GameDB entry Naviger til GameDB-oppføring - + Create Shortcut lag Snarvei - + Add to Desktop Legg Til På Skrivebordet - + Add to Applications Menu Legg Til Applikasjonsmenyen - + Configure Game @@ -7072,62 +7176,62 @@ Vil du overstyre dette og lukke likevel? Egenskaper - + Scan Subfolders Skann Undermapper - + Remove Game Directory Fjern Spillmappe - + ▲ Move Up ▲ Flytt Opp - + ▼ Move Down ▼ Flytt Ned - + Open Directory Location Åpne Spillmappe - + Clear Fjern - + Name Navn - + Compatibility Kompatibilitet - + Add-ons Tilleggsprogrammer - + File type Fil Type - + Size Størrelse - + Play time @@ -7135,62 +7239,62 @@ Vil du overstyre dette og lukke likevel? GameListItemCompat - + Ingame i Spillet - + Game starts, but crashes or major glitches prevent it from being completed. Spillet starter, men krasjer eller større feil gjør at det ikke kan fullføres. - + Perfect Perfekt - + Game can be played without issues. Spillet kan spilles uten problemer. - + Playable Spillbart - + Game functions with minor graphical or audio glitches and is playable from start to finish. Spillet fungerer med mindre grafiske eller lydfeil og kan spilles fra start til slutt. - + Intro/Menu Intro/Meny - + Game loads, but is unable to progress past the Start Screen. Spillet lastes inn, men kan ikke gå videre forbi startskjermen. - + Won't Boot Vil ikke starte - + The game crashes when attempting to startup. Spillet krasjer under oppstart. - + Not Tested Ikke testet - + The game has not yet been tested. Spillet har ikke blitt testet ennå. @@ -7198,7 +7302,7 @@ Vil du overstyre dette og lukke likevel? GameListPlaceholder - + Double-click to add a new folder to the game list Dobbeltrykk for å legge til en ny mappe i spillisten @@ -7206,7 +7310,7 @@ Vil du overstyre dette og lukke likevel? GameListSearchField - + %1 of %n result(s) %1 of %n resultat @@ -7214,12 +7318,12 @@ Vil du overstyre dette og lukke likevel? - + Filter: Filter: - + Enter pattern to filter Angi mønster for å filtrere @@ -7301,7 +7405,7 @@ Vil du overstyre dette og lukke likevel? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7315,190 +7419,190 @@ Feilmelding: Hotkeys - + Audio Mute/Unmute Lyd av/på - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Hovedvindu - + Audio Volume Down Lydvolum Ned - + Audio Volume Up Lydvolum Opp - + Capture Screenshot Ta Skjermbilde - + Change Adapting Filter Endre tilpasningsfilter - + Change Docked Mode Endre forankret modus - + Change GPU Accuracy Endre GPU-nøyaktighet - + Configure Konfigurer - + Configure Current Game - + Continue/Pause Emulation Fortsett/Pause Emuleringen - + Exit Fullscreen Avslutt fullskjerm + + + Exit Eden + + Exit yuzu Avslutt yuzu - - Exit eden - - - - + Fullscreen Fullskjerm - + Load File Last inn Fil - + Load/Remove Amiibo Last/Fjern Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Omstart Emuleringen - + Stop Emulation Stopp Emuleringen - + TAS Record Spill inn TAS - + TAS Reset Tilbakestill TAS - + TAS Start/Stop Start/Stopp TAS - + Toggle Filter Bar Veksle Filterlinje - + Toggle Framerate Limit Veksle Bildefrekvensgrense - + Toggle Mouse Panning Veksle Muspanorering - + Toggle Renderdoc Capture - + Toggle Status Bar Veksle Statuslinje @@ -7506,22 +7610,22 @@ Feilmelding: InstallDialog - + Please confirm these are the files you wish to install. Vennligst bekreft at dette er filene du ønsker å installere. - + Installing an Update or DLC will overwrite the previously installed one. Installering av en oppdatering eller DLC vil overskrive den tidligere installerte. - + Install Installer - + Install Files to NAND Installer filer til NAND @@ -7529,7 +7633,7 @@ Feilmelding: LimitableInputDialog - + The text can't contain any of the following characters: %1 Teksten kan ikke inneholde noen av de følgende tegnene: @@ -7676,152 +7780,207 @@ Feilmelding: Nylige file&r - + + Open &Eden Folders + + + + &Emulation &Emulering - + &View &Vis - + &Reset Window Size Nullstill vindusstø&rrelse - + &Debugging Feilsøking (&D) - + Reset Window Size to &720p Tilbakestill vindusstørrelse til &720p - + Reset Window Size to 720p Tilbakestill vindusstørrelse til 720p - + Reset Window Size to &900p Tilbakestill vindusstørrelse til &900p - + Reset Window Size to 900p Tilbakestill vindusstørrelse til 900p - + Reset Window Size to &1080p Tilbakestill vindusstørrelse til &1080p - + Reset Window Size to 1080p Tilbakestill vindusstørrelse til 1080p - + &Multiplayer Flerspiller (&M) - + &Tools Verk&tøy - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Hjelp - + &Install Files to NAND... &Installer filer til NAND... - + L&oad File... Last inn fil... (&O) - + Load &Folder... Last inn mappe (&F) - + E&xit &Avslutt - + &Pause &Paus - + &Stop &Stop - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7830,97 +7989,97 @@ Feilmelding: Om yuzu (&A) - + Single &Window Mode Énvindusmodus (&W) - + Con&figure... Kon&figurer... - + Ctrl+, - + Display D&ock Widget Headers Vis Overskrifter for Dock Widget (&O) - + Show &Filter Bar Vis &filterlinje - + Show &Status Bar Vis &statuslinje - + Show Status Bar Vis statuslinje - + &Browse Public Game Lobby Bla gjennom den offentlige spillobbyen (&B) - + &Create Room Opprett Rom (&C) - + &Leave Room Forlat Rommet (&L) - + &Direct Connect to Room Direkte Tilkobling Til Rommet (&D) - + &Show Current Room Vis nåværende rom (&S) - + F&ullscreen F&ullskjerm - + &Restart Omstart (&R) - + Load/Remove &Amiibo... Last/Fjern Amiibo (&A) - + &Report Compatibility Rapporter kompatibilitet (&R) - + Open &Mods Page Åpne Modifikasjonssiden (&M) - + Open &Quickstart Guide Åpne Hurtigstartsguiden (&Q) - + &FAQ &FAQ @@ -7929,77 +8088,82 @@ Feilmelding: Åpne &yuzu Mappen - + &Capture Screenshot Ta Skjermbilde (&C) - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... Konfigurer TAS (&C) - + Configure C&urrent Game... Konfigurer Gjeldende Spill (&U) - + &Start &Start - + &Reset Tilbakestill (&R) - + R&ecord Spill inn (%E) - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -8007,26 +8171,36 @@ Feilmelding: MicroProfileDialog - &MicroProfile - Mikroprofil (&M) + Mikroprofil (&M) MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8086,37 +8260,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Gjeldende tilkoblingsstatus - + Not Connected. Click here to find a room! Ikke tilkoblet. Klikk her for å finne et rom! - + Not Connected Ikke Tilkoblet - + Connected Tilkoblet - + New Messages Received Nye meldinger mottatt - + Error Feil - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Kunne ikke oppdatere rominformasjonen. Kontroller Internett-tilkoblingen din og prøv å være vert for rommet på nytt. @@ -8308,56 +8482,56 @@ p, li { white-space: pre-wrap; } Spiller ikke et spill - + Installed SD Titles Installerte SD-titler - + Installed NAND Titles Installerte NAND-titler - + System Titles System Titler - + Add New Game Directory Legg til ny spillmappe - + Favorites Favoritter - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [ikke satt] @@ -8368,14 +8542,14 @@ p, li { white-space: pre-wrap; } Hatt %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Akse %1%2 @@ -8386,357 +8560,357 @@ p, li { white-space: pre-wrap; } Knapp %1 - - - - - - + + + + + + [unknown] [ukjent] - - - + + + Left Venstre - - - + + + Right Høyre - - - + + + Down Ned - - - + + + Up Opp - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Sirkel - - + + Cross Kryss - - + + Square Firkant - - + + Triangle Trekant - - + + Share Del - - + + Options Instillinger - - + + [undefined] [udefinert] - + %1%2 %1%2 - - + + [invalid] [ugyldig] - - + + %1%2Hat %3 %1%2Hat %3 - - - + + + %1%2Axis %3 %1%2Akse %3 - - + + %1%2Axis %3,%4,%5 %1%2Akse %3,%4,%5 - - + + %1%2Motion %3 %1%2Bevegelse %3 - - + + %1%2Button %3 %1%2Knapp %3 - - + + [unused] [ubrukt] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Venstre Stikke - + Stick R Høyre Stikke - + Plus Pluss - + Minus Minus - - + + Home Hjem - + Capture Opptak - + Touch Touch - + Wheel Indicates the mouse wheel Hjul - + Backward Bakover - + Forward Fremover - + Task oppgave - + Extra Ekstra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Hat %4 - - + + %1%2%3Axis %4 %1%2%3Akse %4 - - + + %1%2%3Button %4 %1%2%3Knapp %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8854,6 +9028,300 @@ p, li { white-space: pre-wrap; } Ønsker du å gjenopprette denne amiiboen? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Avbryt + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + Verifisering mislyktes for følgende filer: + +%1 + + + + + Verifying integrity... + Verifiserer integritet... + + + + + Integrity verification succeeded! + Integritetsverifisering vellykket! + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + Integritetsverifisering mislyktes! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Feil ved fjerning av innhold + + + + Error Removing Update + Feil ved fjerning av oppdatering + + + + Error Removing DLC + Feil ved fjerning av DLC + + + + The base game is not installed in the NAND and cannot be removed. + Grunnspillet er ikke installert i NAND og kan ikke bli fjernet. + + + + There is no update installed for this title. + Det er ingen oppdatering installert for denne tittelen. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Fjerning lykkes + + + + Successfully removed %1 installed DLC. + Fjernet vellykket %1 installerte DLC-er. + + + + + Error Removing Transferable Shader Cache + Feil under fjerning av overførbar shader cache + + + + + A shader cache for this title does not exist. + En shaderbuffer for denne tittelen eksisterer ikke. + + + + Successfully removed the transferable shader cache. + Lykkes i å fjerne den overførbare shader cachen. + + + + Failed to remove the transferable shader cache. + Feil under fjerning av den overførbare shader cachen. + + + + Error Removing Vulkan Driver Pipeline Cache + Feil ved fjerning av Vulkan Driver-Rørledningsbuffer + + + + Failed to remove the driver pipeline cache. + Kunne ikke fjerne driverens rørledningsbuffer. + + + + + Error Removing Transferable Shader Caches + Feil ved fjerning av overførbare shaderbuffere + + + + Successfully removed the transferable shader caches. + Vellykket fjerning av overførbare shaderbuffere. + + + + Failed to remove the transferable shader cache directory. + Feil ved fjerning av overførbar shaderbuffer katalog. + + + + + Error Removing Custom Configuration + Feil Under Fjerning Av Tilpasset Konfigurasjon + + + + A custom configuration for this title does not exist. + En tilpasset konfigurasjon for denne tittelen finnes ikke. + + + + Successfully removed the custom game configuration. + Fjernet vellykket den tilpassede spillkonfigurasjonen. + + + + Failed to remove the custom game configuration. + Feil under fjerning av den tilpassede spillkonfigurasjonen. + + + + Reset Metadata Cache + Tilbakestill Mellomlagringen for Metadata + + + + The metadata cache is already empty. + Mellomlagringen for metadata er allerede tom. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Mellomlagringen for metadata kunne ikke slettes. Den kan være i bruk eller ikke-eksisterende. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Opprettet en snarvei til %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Dette vil opprette en snarvei til gjeldende AppImage. Dette fungerer kanskje ikke bra hvis du oppdaterer. Fortsette? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Lag Ikon + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Kan ikke opprette ikonfil. Stien "%1" finnes ikke og kan ikke opprettes. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9149,7 +9617,7 @@ Prøv igjen eller kontakt utvikleren av programvaren. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9157,7 +9625,7 @@ Prøv igjen eller kontakt utvikleren av programvaren. %2 - + Users Brukere @@ -9281,7 +9749,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Anropsstabel @@ -9289,12 +9757,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread ventet på ingen tråd @@ -9302,102 +9770,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable kjørbar - + paused pauset - + sleeping sover - + waiting for IPC reply venter på IPC-svar - + waiting for objects venter på objekter - + waiting for condition variable venter på tilstandsvariabel - + waiting for address arbiter venter på adresseforhandler - + waiting for suspend resume venter på gjenopptakelse av suspensjon - + waiting venter - + initialized initialisert - + terminated terminert - + unknown ukjent - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideell - + core %1 kjerne %1 - + processor = %1 prosessor = %1 - + affinity mask = %1 affinitetsmaske = %1 - + thread id = %1 tråd id = %1 - + priority = %1(current) / %2(normal) prioritet = %1(nåværende) / %2(normal) - + last running ticks = %1 siste løpende tick = %1 @@ -9405,7 +9873,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread ventet med tråd @@ -9413,7 +9881,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree Ventetre (&W) diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index e58b12429f..240a9b70a0 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Communiceren met de server... - + Cancel Annuleer - + Touch the top left corner <br>of your touchpad. Raak de linkerbovenhoek <br> van je touchpad aan. - + Now touch the bottom right corner <br>of your touchpad. Raak nu de rechterbenedenhoek <br>van je touchpad aan. - + Configuration completed! Configuratie compleet! - + OK OK @@ -397,439 +397,152 @@ Dit zou zowel hun forum gebruikersnaam als hun IP-adres verbannen. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Fout - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Uitvoer-engine: - + Output Device: Uitvoerapparaat: - + Input Device: Invoerapparaat: - - Mute audio - - - - + Volume: Volume: - + Mute audio when in background Demp audio op de achtergrond - + Multicore CPU Emulation Multicore CPU-emulatie - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Beperk Snelheidspercentage - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Nauwkeurigheid: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Ontbind FMA (verbeterd prestatie op CPU's zonder FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Snellere FRSRTE en FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Snellere ASIMD-instructies (alleen 32-bits) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Onnauwkeurige NaN-verwerking - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Schakel adresruimtecontroles uit - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Negeer globale monitor - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Apparaat: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Shader Backend: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Resolutie: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Window Adapting Filter: - + FSR Sharpness: FSR-scherpte: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Antialiasing-methode: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Volledig scherm modus: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Aspect Ratio: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Gebruik schijfpijplijn-cache - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Gebruik asynchrone GPU-emulatie - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC-emulatie: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +553,34 @@ Mailbox kan een lagere latentie hebben dan FIFO en scheurt niet, maar kan frames Immediate (geen synchronisatie) presenteert gewoon wat beschikbaar is en kan scheuren vertonen. - + Enable asynchronous presentation (Vulkan only) Schakel asynchrone presentatie in (alleen Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Forceer maximale klokken (alleen Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Werkt op de achtergrond terwijl er wordt gewacht op grafische opdrachten om te voorkomen dat de GPU zijn kloksnelheid verlaagt. - + Anisotropic Filtering: Anisotrope Filtering: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Nauwkeurigheidsniveau: + Nauwkeurigheidsniveau: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Gebruik asynchrone shaderbouw (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Gebruik Snelle GPU-tijd (Hack) @@ -905,1021 +590,1433 @@ This feature is experimental. Schakelt Snelle GPU-tijd in. Deze optie forceert de meeste games om op hun hoogste native resolutie te draaien. - + Use Vulkan pipeline cache Gebruik Vulkan-pijplijn-cache - + + Enable Reactive Flushing + Schakel Reactive Flushing In + + + + RNG Seed + RNG Seed + + + + Device Name + Apparaatnaam + + + + Note: this can be overridden when region setting is auto-select + Opmerking: dit kan worden overschreven wanneer de regio-instelling automatisch wordt geselecteerd + + + + Region: + Regio: + + + + Time Zone: + Tijdzone: + + + + Sound Output Mode: + Geluidsuitvoermodus: + + + + Prompt for user on game boot + Vraag aan gebruiker bij opstarten van het spel + + + + Pause emulation when in background + Emulatie onderbreken op de achtergrond + + + + Hide mouse on inactivity + Verberg muis wanneer inactief + + + + CPU + CPU + + + + BC1 (Low quality) + BC1 (Lage Kwaliteit) + + + + BC3 (Medium quality) + BC3 (Gemiddelde kwaliteit) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly Shaders, alleen NVIDIA) + + + + Normal + Normaal + + + + High + Hoog + + + + Extreme + Extreme + + + + Auto + Auto + + + + Accurate + Accuraat + + + + Unsafe + Onveilig + + + + Paranoid (disables most optimizations) + Paranoid (schakelt de meeste optimalisaties uit) + + + + Borderless Windowed + Randloos Venster + + + + Exclusive Fullscreen + Exclusief Volledig Scherm + + + + No Video Output + Geen Video-uitvoer + + + + CPU Video Decoding + CPU Videodecodering + + + + GPU Video Decoding (Default) + GPU Videodecodering (Standaard) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [EXPERIMENTEEL] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [EXPERIMENTEEL] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest Neighbor + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + Gaussian + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Geen + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Standaart (16:9) + + + + Force 4:3 + Forceer 4:3 + + + + Force 21:9 + Forceer 21:9 + + + + Force 16:10 + Forceer 16:10 + + + + Stretch to Window + Uitrekken naar Venster + + + + Automatic + Automatisch + + + + + Default + Standaard + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - Schakel Reactive Flushing In - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - RNG Seed + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Apparaatnaam - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Opmerking: dit kan worden overschreven wanneer de regio-instelling automatisch wordt geselecteerd - - - - Region: - Regio: - - - + The region of the emulated Switch. - - Time Zone: - Tijdzone: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Geluidsuitvoermodus: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Vraag aan gebruiker bij opstarten van het spel - - - - Pause emulation when in background - Emulatie onderbreken op de achtergrond - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Verberg muis wanneer inactief - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - - BC1 (Low quality) - BC1 (Lage Kwaliteit) - - - - BC3 (Medium quality) - BC3 (Gemiddelde kwaliteit) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly Shaders, alleen NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Normaal + + Unsafe (fast) + - - High - Hoog + + Safe (stable) + - - Extreme - Extreme - - - - Auto - Auto - - - - Accurate - Accuraat - - - - Unsafe - Onveilig - - - - Paranoid (disables most optimizations) - Paranoid (schakelt de meeste optimalisaties uit) - - - + Dynarmic - + NCE - - Borderless Windowed - Randloos Venster - - - - Exclusive Fullscreen - Exclusief Volledig Scherm - - - - No Video Output - Geen Video-uitvoer - - - - CPU Video Decoding - CPU Videodecodering - - - - GPU Video Decoding (Default) - GPU Videodecodering (Standaard) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [EXPERIMENTEEL] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [EXPERIMENTEEL] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest Neighbor - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - Gaussian - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Geen - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Standaart (16:9) - - - - Force 4:3 - Forceer 4:3 - - - - Force 21:9 - Forceer 21:9 - - - - Force 16:10 - Forceer 16:10 - - - - Stretch to Window - Uitrekken naar Venster - - - - Automatic - Automatisch - - - - Default - Standaard - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Docked - + Handheld Handheld - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2259,27 +2356,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Loggen - + Open Log Location Open Loglocatie - + Global Log Filter Globale Log Filter - + When checked, the max size of the log increases from 100 MB to 1 GB Indien aangevinkt, neemt de maximale grootte van de log toe van 100 MB tot 1 GB - + Enable Extended Logging** Schakel Uitgebreid Loggen** in - + Show Log in Console Toon Login-console @@ -2425,7 +2522,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2487,7 +2584,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Deze optie wordt automatisch gereset wanneer yuzu is gesloten. - + Web applet not compiled Webapplet niet gecompileerd @@ -2537,7 +2634,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2546,88 +2643,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Sommige instellingen zijn alleen beschikbaar als een spel niet actief is. - + Applets - - + + Audio Audio - - + + CPU CPU - + Debug Debug - + Filesystem Bestandssysteem - - + + General Algemeen - - + + Graphics Graphics - + GraphicsAdvanced Geavanceerde Graphics - + GraphicsExtensions - + Hotkeys Sneltoetsen - - + + Controls Bediening - + Profiles Profielen - + Network Netwerk - - + + System Systeem - + Game List Spellijst - + Web Web @@ -2725,51 +2822,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Herstel Metagegevenscache - + Select Emulated NAND Directory... Selecteer Geëmuleerde NAND-map... - + Select Emulated SD Directory... Selecteer Geëmuleerde SD-map... - + Select Gamecard Path... Selecteer Spelkaartpad... - + Select Dump Directory... Selecteer Dump-map... - + Select Mod Load Directory... Selecteer Mod-laadmap... - The metadata cache is already empty. - De metagegevenscache is al leeg. + De metagegevenscache is al leeg. - The operation completed successfully. - De operatie is succesvol voltooid. + De operatie is succesvol voltooid. - The metadata cache couldn't be deleted. It might be in use or non-existent. - De metagegevenscache kon niet worden verwijderd. Het wordt mogelijk gebruikt of bestaat niet. + De metagegevenscache kon niet worden verwijderd. Het wordt mogelijk gebruikt of bestaat niet. @@ -2800,12 +2891,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Hiermee worden alle instellingen gereset en alle configuraties per game verwijderd. Hiermee worden gamedirectory's, profielen of invoerprofielen niet verwijderd. Doorgaan? @@ -2838,33 +2929,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Achtergrondkleur: - + % FSR sharpening percentage (e.g. 50%) % - + Off Uit - + VSync Off VSync Uit - + Recommended Aanbevolen - + On Aan - + VSync On VSync Aan @@ -2901,14 +2992,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2940,75 +3035,75 @@ These settings are experimental, and may cause black screens. If your games fail Standaard Herstellen - + Action Actie - + Hotkey Sneltoets - + Controller Hotkey Controller-sneltoets - - - + + + Conflicting Key Sequence Ongeldige Toetsvolgorde - - + + The entered key sequence is already assigned to: %1 De ingevoerde toetsencombinatie is al in gebruik door: %1 - + [waiting] [aan het wachten] - + Invalid Ongeldig - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Standaard Herstellen - + Clear Wis - + Conflicting Button Sequence Conflicterende Knoppencombinatie - + The default button sequence is already assigned to: %1 De standaard knoppencombinatie is al toegewezen aan: %1 - + The default key sequence is already assigned to: %1 De ingevoerde toetsencombinatie is al in gebruik door: %1 @@ -3328,7 +3423,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3483,7 +3578,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Linker Stick @@ -3593,14 +3688,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3619,7 +3714,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plus @@ -3632,15 +3727,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3685,7 +3780,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Rechter Stick @@ -3700,242 +3795,242 @@ These settings are experimental, and may cause black screens. If your games fail Configureer - - - - + + + + Clear Wis - - - - - + + + + + [not set] [niet ingesteld] - - - + + + Invert button Knop omkeren - - + + Toggle button Schakel-knop - + Turbo button Turbo-knop - - + + Invert axis Spiegel as - - - + + + Set threshold Stel drempel in - - + + Choose a value between 0% and 100% Kies een waarde tussen 0% en 100% - + Toggle axis Schakel as - + Set gyro threshold Stel gyro-drempel in - + Calibrate sensor Kalibreer sensor - + Map Analog Stick Analoge Stick Toewijzen - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Nadat je op OK hebt gedrukt, beweeg je de joystick eerst horizontaal en vervolgens verticaal. Om de assen om te keren, beweeg je de joystick eerst verticaal en vervolgens horizontaal. - + Center axis Midden as - - + + Deadzone: %1% Deadzone: %1% - - + + Modifier Range: %1% Modificatorbereik: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Twee Joycons - + Left Joycon Linker Joycon - + Right Joycon Rechter Joycon - + Handheld Handheld - + GameCube Controller GameCube-controller - + Poke Ball Plus Poke Ball Plus - + NES Controller NES-controller - + SNES Controller SNES-controller - + N64 Controller N64-controller - + Sega Genesis Sega Genesis - + Start / Pause Begin / Onderbreken - + Z Z - + Control Stick Control Stick - + C-Stick C-Stick - + Shake! Schud! - + [waiting] [aan het wachten] - + New Profile Nieuw Profiel - + Enter a profile name: Voer een profielnaam in: - - + + Create Input Profile Maak Invoerprofiel - + The given profile name is not valid! De ingevoerde profielnaam is niet geldig! - + Failed to create the input profile "%1" Kon invoerprofiel "%1" niet maken - + Delete Input Profile Verwijder Invoerprofiel - + Failed to delete the input profile "%1" Kon invoerprofiel "%1" niet verwijderen - + Load Input Profile Laad Invoerprofiel - + Failed to load the input profile "%1" Kon invoerprofiel "%1" niet laden - + Save Input Profile Sla Invoerprofiel op - + Failed to save the input profile "%1" Kon invoerprofiel "%1" niet opslaan @@ -3992,7 +4087,7 @@ Om de assen om te keren, beweeg je de joystick eerst verticaal en vervolgens hor - + Configure Configureer @@ -4028,7 +4123,7 @@ Om de assen om te keren, beweeg je de joystick eerst verticaal en vervolgens hor - + Test Test @@ -4047,7 +4142,7 @@ Om de assen om te keren, beweeg je de joystick eerst verticaal en vervolgens hor <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Meer Info</span></a> - + %1:%2 %1:%2 @@ -4056,77 +4151,77 @@ Om de assen om te keren, beweeg je de joystick eerst verticaal en vervolgens hor yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Poortnummer bevat ongeldige tekens - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Poort moet in bereik 0 en 65353 zijn - + IP address is not valid IP-adress is niet geldig - + This UDP server already exists Deze UDP-server bestaat al - + Unable to add more than 8 servers Kan niet meer dan 8 servers toevoegen - + Testing Testen - + Configuring Configureren - + Test Successful Test Succesvol - + Successfully received data from the server. De data van de server is succesvol ontvangen. - + Test Failed Test Gefaald - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kan niet de juiste data van de server ontvangen.<br>Controleer of de server correct is ingesteld en of het adres en de poort correct zijn. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP-test of kalibratieconfiguratie is bezig.<br>Wacht tot ze klaar zijn. @@ -4253,7 +4348,12 @@ De huidige waarden zijn %1% en %2%. Netwerkinterface - + + Enable Airplane Mode + + + + None Geen @@ -4311,52 +4411,52 @@ De huidige waarden zijn %1% en %2%. Sommige instellingen zijn alleen beschikbaar als een spel niet actief is. - + Add-Ons Add-Ons - + System Systeem - + CPU CPU - + Graphics Graphics - + Adv. Graphics Adv. Graphics - + GPU Extensions - + Audio Audio - + Input Profiles Invoerprofielen - + Linux - + Properties Eigenschappen @@ -4374,12 +4474,12 @@ De huidige waarden zijn %1% en %2%. Add-Ons - + Patch Name Patch-naam - + Version Versie @@ -4417,27 +4517,32 @@ De huidige waarden zijn %1% en %2%. Stel Afbeelding In - + + Select Avatar + + + + Add Toevoegen - + Rename Hernoem - + Remove Verwijder - + Profile management is available only when game is not running. Profielbeheer is alleen beschikbaar wanneer het spel niet bezig is. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4445,100 +4550,189 @@ De huidige waarden zijn %1% en %2%. %2 - + Enter Username Voer Gebruikersnaam in - + Users Gebruikers - + Enter a username for the new user: Voer een gebruikersnaam in voor de nieuwe gebruiker: - + Enter a new username: Voer nieuwe gebruikersnaam in: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Selecteer Gebruikersfoto - - JPEG Images (*.jpg *.jpeg) - JPEG-foto's (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG-foto's (*.jpg *.jpeg) + + + Error deleting image Fout tijdens verwijderen afbeelding - + Error occurred attempting to overwrite previous image at: %1. Er is een fout opgetreden bij het overschrijven van de vorige afbeelding in: %1. - + Error deleting file Fout tijdens verwijderen bestand - + Unable to delete existing file: %1. Kan bestaand bestand niet verwijderen: %1. - + Error creating user image directory Fout tijdens het maken van de map met afbeeldingen van de gebruiker - + Unable to create directory %1 for storing user images. Fout tijdens het maken van map %1 om gebruikersafbeeldingen in te bewaren. - Error copying user image - Fout tijdens het kopiëren van de gebruiker afbeelding + Fout tijdens het kopiëren van de gebruiker afbeelding - Unable to copy image from %1 to %2 - Kan afbeelding niet kopiëren van %1 naar %2 + Kan afbeelding niet kopiëren van %1 naar %2 - Error resizing user image - Fout bij het aanpassen van grootte van gebruikersafbeelding + Fout bij het aanpassen van grootte van gebruikersafbeelding - Unable to resize image - Kon de grootte van de afbeelding niet wijzigen + Kon de grootte van de afbeelding niet wijzigen + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Deze gebruiker verwijderen? Alle opgeslagen gegevens van de gebruiker worden verwijderd. - + Confirm Delete Bevestig Verwijdering - + Name: %1 UUID: %2 Naam: %1 @@ -4591,7 +4785,7 @@ UUID: %2 - + Enable Inschakelen @@ -4602,7 +4796,7 @@ UUID: %2 - + Not connected Niet verbonden @@ -4612,63 +4806,63 @@ UUID: %2 Standaard Herstellen - + Clear Wis - + [not set] [niet ingesteld] - + Invert axis Spiegel as - - + + Deadzone: %1% Deadzone: %1% - + Error enabling ring input Fout tijdens inschakelen van ringinvoer - + Direct Joycon driver is not enabled Direct Joycon-driver niet ingeschakeld - + Configuring Configureren - + The current mapped device doesn't support the ring controller Het huidige apparaat ondersteunt de ringcontroller niet - + The current mapped device doesn't have a ring attached Het huidige apparaat heeft geen ring - + The current mapped device is not connected Het huidige toegewezen apparaat is niet aangesloten - + Unexpected driver result %1 Onverwacht driverresultaat %1 - + [waiting] [aan het wachten] @@ -4710,7 +4904,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4762,12 +4956,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS-configuratie - + Select TAS Load Directory... Selecteer TAS-laadmap... @@ -4877,7 +5071,7 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5197,6 +5391,16 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu-webservice @@ -5206,42 +5410,29 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa Door je gebruikersnaam en token op te geven, ga je ermee akkoord dat yuzu aanvullende gebruiksgegevens verzamelt, die informatie ter identificatie van de gebruiker kunnen bevatten. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verifieer + Verifieer - Sign up - Registreer + Registreer - + Token: Token: - + Username: Gebruikersnaam: - What is my token? - Wat is mijn token? + Wat is mijn token? - + Web Service configuration can only be changed when a public room isn't being hosted. De configuratie van de webservice kan alleen worden gewijzigd als er geen openbare ruimte wordt gehost. @@ -5266,12 +5457,12 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa Regenereer - + Discord Presence Aanwezigheid in Discord - + Show Current Game in your Discord Status Toon huidige game in uw Discord-status @@ -5280,24 +5471,8 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Meer info</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registreer</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registreer</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5320,10 +5495,9 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa Token is niet geverifieerd. De verandering aan uw token zijn niet opgeslagen. - Unverified, please click Verify before saving configuration Tooltip - Niet geverifieerd, klik op Verifiëren voordat je de configuratie opslaat + Niet geverifieerd, klik op Verifiëren voordat je de configuratie opslaat Verifying... @@ -5347,20 +5521,67 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Verificatie mislukt. Controleer of je je token correct hebt ingevoerd en of je internetverbinding werkt. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controller P1 - + &Controller P1 &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versie + + DirectConnect @@ -5466,7 +5687,12 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5474,11 +5700,6 @@ Versleep punten om de positie te veranderen, of dubbelklik op tabelcellen om waa The host of the room has banned you. Speak with the host to unban you or try a different room. De host van de kamer heeft je verbannen. Praat met de host om je ban op te heffen of probeer een andere kamer. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5540,7 +5761,7 @@ Ga naar Configuratie -> Systeem -> Netwerk en maak een selectie.Telemetrie - + Broken Vulkan Installation Detected Beschadigde Vulkan-installatie gedetecteerd @@ -5549,106 +5770,105 @@ Ga naar Configuratie -> Systeem -> Netwerk en maak een selectie.Vulkan-initialisatie mislukt tijdens het opstarten.<br><br>Klik <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>hier voor instructies om het probleem op te lossen</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Een spel uitvoeren - + Loading Web Applet... Web Applet Laden... - - + + Disable Web Applet Schakel Webapplet uit - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Het uitschakelen van de webapplet kan leiden tot ongedefinieerd gedrag en mag alleen gebruikt worden met Super Mario 3D All-Stars. Weet je zeker dat je de webapplet wilt uitschakelen? (Deze kan opnieuw worden ingeschakeld in de Debug-instellingen). - + The amount of shaders currently being built Het aantal shaders dat momenteel wordt gebouwd - + The current selected resolution scaling multiplier. De huidige geselecteerde resolutieschaalmultiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Huidige emulatiesnelheid. Waarden hoger of lager dan 100% geven aan dat de emulatie sneller of langzamer werkt dan een Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hoeveel beelden per seconde het spel momenteel weergeeft. Dit varieert van spel tot spel en van scène tot scène. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tijd die nodig is om een Switch-beeld te emuleren, beeldbeperking of v-sync niet meegerekend. Voor emulatie op volle snelheid mag dit maximaal 16,67 ms zijn. - + Unmute Dempen opheffen - + Mute Dempen - + Reset Volume Herstel Volume - + &Clear Recent Files &Wis Recente Bestanden - + &Continue &Doorgaan - + &Pause &Onderbreken - Warning Outdated Game Format - Waarschuwing Verouderd Spelformaat + Waarschuwing Verouderd Spelformaat You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Je gebruikt het gedeconstrueerde ROM-mapformaat voor dit spel, wat een verouderd formaat is dat vervangen is door andere zoals NCA, NAX, XCI, of NSP. Deconstructed ROM-mappen missen iconen, metadata, en update-ondersteuning.<br><br>Voor een uitleg van de verschillende Switch-formaten die yuzu ondersteunt,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'> bekijk onze wiki</a>. Dit bericht wordt niet meer getoond. - - + + Error while loading ROM! Fout tijdens het laden van een ROM! - + The ROM format is not supported. Het ROM-formaat wordt niet ondersteund. - + An error occurred initializing the video core. Er is een fout opgetreden tijdens het initialiseren van de videokern. @@ -5657,7 +5877,7 @@ Ga naar Configuratie -> Systeem -> Netwerk en maak een selectie.yuzu is een fout tegengekomen tijdens het uitvoeren van de videokern. Dit wordt meestal veroorzaakt door verouderde GPU-drivers, inclusief geïntegreerde. Zie het logboek voor meer details. Voor meer informatie over toegang tot het log, zie de volgende pagina: <a href='https://yuzu-emu.org/help/reference/log-files/'>Hoe upload je het logbestand</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fout tijdens het laden van ROM! %1 @@ -5668,473 +5888,397 @@ Ga naar Configuratie -> Systeem -> Netwerk en maak een selectie.%1<br>Volg de <a href='https://yuzu-emu.org/help/quickstart/'>yuzu snelstartgids</a> om je bestanden te redumpen.<br>Je kunt de yuzu-wiki</a>of de yuzu-Discord</a> raadplegen voor hulp. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Een onbekende fout heeft plaatsgevonden. Kijk in de log voor meer details. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Software sluiten... - + Save Data Save Data - + Mod Data Mod Data - + Error Opening %1 Folder Fout tijdens het openen van %1 map - - + + Folder does not exist! Map bestaat niet! - Error Opening Transferable Shader Cache - Fout bij het openen van overdraagbare shader-cache + Fout bij het openen van overdraagbare shader-cache - Failed to create the shader cache directory for this title. - Kon de shader-cache-map voor dit spel niet aanmaken. + Kon de shader-cache-map voor dit spel niet aanmaken. - Error Removing Contents - Fout bij het verwijderen van de inhoud + Fout bij het verwijderen van de inhoud - Error Removing Update - Fout bij het verwijderen van de update + Fout bij het verwijderen van de update - Error Removing DLC - Fout bij het verwijderen van DLC + Fout bij het verwijderen van DLC - + Remove Installed Game Contents? Geïnstalleerde Spelinhoud Verwijderen? - + Remove Installed Game Update? Geïnstalleerde Spel-update Verwijderen? - + Remove Installed Game DLC? Geïnstalleerde Spel-DLC Verwijderen? - + Remove Entry Verwijder Invoer - - - - - - Successfully Removed - Met Succes Verwijderd + Met Succes Verwijderd - Successfully removed the installed base game. - Het geïnstalleerde basisspel is succesvol verwijderd. + Het geïnstalleerde basisspel is succesvol verwijderd. - The base game is not installed in the NAND and cannot be removed. - Het basisspel is niet geïnstalleerd in de NAND en kan niet worden verwijderd. + Het basisspel is niet geïnstalleerd in de NAND en kan niet worden verwijderd. - Successfully removed the installed update. - De geïnstalleerde update is succesvol verwijderd. + De geïnstalleerde update is succesvol verwijderd. - There is no update installed for this title. - Er is geen update geïnstalleerd voor dit spel. + Er is geen update geïnstalleerd voor dit spel. - There are no DLC installed for this title. - Er is geen DLC geïnstalleerd voor dit spel. + Er is geen DLC geïnstalleerd voor dit spel. - Successfully removed %1 installed DLC. - %1 geïnstalleerde DLC met succes verwijderd. + %1 geïnstalleerde DLC met succes verwijderd. - + Delete OpenGL Transferable Shader Cache? Overdraagbare OpenGL-shader-cache Verwijderen? - + Delete Vulkan Transferable Shader Cache? Overdraagbare Vulkan-shader-cache Verwijderen? - + Delete All Transferable Shader Caches? Alle Overdraagbare Shader-caches Verwijderen? - + Remove Custom Game Configuration? Aangepaste Spelconfiguratie Verwijderen? - + Remove Cache Storage? Verwijder Cache-opslag? - + Remove File Verwijder Bestand - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Fout bij het verwijderen van Overdraagbare Shader-cache + Fout bij het verwijderen van Overdraagbare Shader-cache - - A shader cache for this title does not exist. - Er bestaat geen shader-cache voor dit spel. + Er bestaat geen shader-cache voor dit spel. - Successfully removed the transferable shader cache. - De overdraagbare shader-cache is verwijderd. + De overdraagbare shader-cache is verwijderd. - Failed to remove the transferable shader cache. - Kon de overdraagbare shader-cache niet verwijderen. + Kon de overdraagbare shader-cache niet verwijderen. - Error Removing Vulkan Driver Pipeline Cache - Fout bij het verwijderen van Pijplijn-cache van Vulkan-driver + Fout bij het verwijderen van Pijplijn-cache van Vulkan-driver - Failed to remove the driver pipeline cache. - Kon de pijplijn-cache van de driver niet verwijderen. + Kon de pijplijn-cache van de driver niet verwijderen. - - Error Removing Transferable Shader Caches - Fout bij het verwijderen van overdraagbare shader-caches + Fout bij het verwijderen van overdraagbare shader-caches - Successfully removed the transferable shader caches. - De overdraagbare shader-caches zijn verwijderd. + De overdraagbare shader-caches zijn verwijderd. - Failed to remove the transferable shader cache directory. - Kon de overdraagbare shader-cache-map niet verwijderen. + Kon de overdraagbare shader-cache-map niet verwijderen. - - Error Removing Custom Configuration - Fout bij het verwijderen van aangepaste configuratie + Fout bij het verwijderen van aangepaste configuratie - A custom configuration for this title does not exist. - Er bestaat geen aangepaste configuratie voor dit spel. + Er bestaat geen aangepaste configuratie voor dit spel. - Successfully removed the custom game configuration. - De aangepaste spelconfiguratie is verwijderd. + De aangepaste spelconfiguratie is verwijderd. - Failed to remove the custom game configuration. - Kon de aangepaste spelconfiguratie niet verwijderen. + Kon de aangepaste spelconfiguratie niet verwijderen. - - + + RomFS Extraction Failed! RomFS-extractie Mislukt! - + There was an error copying the RomFS files or the user cancelled the operation. Er is een fout opgetreden bij het kopiëren van de RomFS-bestanden of de gebruiker heeft de bewerking geannuleerd. - + Full Volledig - + Skeleton Skelet - + Select RomFS Dump Mode Selecteer RomFS-dumpmodus - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Selecteer hoe je de RomFS gedumpt wilt hebben.<br>Volledig zal alle bestanden naar de nieuwe map kopiëren, terwijl <br>Skelet alleen de mapstructuur zal aanmaken. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Er is niet genoeg vrije ruimte op %1 om de RomFS uit te pakken. Maak ruimte vrij of kies een andere dumpmap bij Emulatie > Configuratie > Systeem > Bestandssysteem > Dump Root. - + Extracting RomFS... RomFS uitpakken... - - - - - + + Cancel Annuleren - + RomFS Extraction Succeeded! RomFS-extractie Geslaagd! - - - + The operation completed successfully. De bewerking is succesvol voltooid. - Integrity verification couldn't be performed! - Integriteitsverificatie kon niet worden uitgevoerd! + Integriteitsverificatie kon niet worden uitgevoerd! - File contents were not checked for validity. - De inhoud van bestanden werd niet gecontroleerd op geldigheid. + De inhoud van bestanden werd niet gecontroleerd op geldigheid. - - Verifying integrity... - Integriteit verifiëren... + Integriteit verifiëren... - - Integrity verification succeeded! - Integriteitsverificatie geslaagd! + Integriteitsverificatie geslaagd! - - Integrity verification failed! - Integriteitsverificatie mislukt! + Integriteitsverificatie mislukt! - File contents may be corrupt. - Bestandsinhoud kan corrupt zijn. + Bestandsinhoud kan corrupt zijn. - - - - Create Shortcut - Maak Snelkoppeling + Maak Snelkoppeling - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Succesvol een snelkoppeling naar %1 gemaakt + Succesvol een snelkoppeling naar %1 gemaakt - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Dit maakt een snelkoppeling naar de huidige AppImage. Dit werkt mogelijk niet goed als je een update uitvoert. Doorgaan? + Dit maakt een snelkoppeling naar de huidige AppImage. Dit werkt mogelijk niet goed als je een update uitvoert. Doorgaan? - - Failed to create a shortcut to %1 + Create Icon + Maak Icoon + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Kan geen icoonbestand maken. Pad "%1" bestaat niet en kan niet worden aangemaakt. + + + + Warning: Outdated Game Format - - Create Icon - Maak Icoon + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Kan geen icoonbestand maken. Pad "%1" bestaat niet en kan niet worden aangemaakt. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Fout bij openen %1 - + Select Directory Selecteer Map - + Properties Eigenschappen - + The game properties could not be loaded. De speleigenschappen kunnen niet geladen worden. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch Executable (%1);;Alle Bestanden (*.*) - + Load File Laad Bestand - + Open Extracted ROM Directory Open Uitgepakte ROM-map - + Invalid Directory Selected Ongeldige Map Geselecteerd - + The directory you have selected does not contain a 'main' file. De map die je hebt geselecteerd bevat geen 'main'-bestand. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installeerbaar Switch-bestand (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installeer Bestanden - + %n file(s) remaining %n bestand(en) resterend @@ -6142,25 +6286,25 @@ Ga naar Configuratie -> Systeem -> Netwerk en maak een selectie. - + Installing file "%1"... Bestand "%1" Installeren... - - + + Install Results Installeerresultaten - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Om mogelijke conflicten te voorkomen, raden we gebruikers af om basisgames te installeren op de NAND. Gebruik deze functie alleen om updates en DLC te installeren. - + %n file(s) were newly installed @@ -6171,7 +6315,7 @@ Gebruik deze functie alleen om updates en DLC te installeren. - + %n file(s) were overwritten @@ -6182,7 +6326,7 @@ Gebruik deze functie alleen om updates en DLC te installeren. - + %n file(s) failed to install @@ -6193,491 +6337,451 @@ Gebruik deze functie alleen om updates en DLC te installeren. - + System Application Systeemapplicatie - + System Archive Systeemarchief - + System Application Update Systeemapplicatie-update - + Firmware Package (Type A) Filmware-pakket (Type A) - + Firmware Package (Type B) Filmware-pakket (Type B) - + Game Spel - + Game Update Spelupdate - + Game DLC Spel-DLC - + Delta Title Delta Titel - + Select NCA Install Type... Selecteer NCA-installatiesoort... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Selecteer het type titel waarin je deze NCA wilt installeren: (In de meeste gevallen is de standaard "Spel" prima). - + Failed to Install Installatie Mislukt - + The title type you selected for the NCA is invalid. Het soort title dat je hebt geselecteerd voor de NCA is ongeldig. - + File not found Bestand niet gevonden - + File "%1" not found Bestand "%1" niet gevonden - + OK OK - - + + Hardware requirements not met Er is niet voldaan aan de hardwarevereisten - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Je systeem voldoet niet aan de aanbevolen hardwarevereisten. Compatibiliteitsrapportage is uitgeschakeld. - + Missing yuzu Account yuzu-account Ontbreekt - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Om een spelcompatibiliteitstest in te dienen, moet je je yuzu-account koppelen.<br><br/>Om je yuzu-account te koppelen, ga naar Emulatie &gt; Configuratie &gt; Web. - + Error opening URL Fout bij het openen van URL - + Unable to open the URL "%1". Kan de URL "%1" niet openen. - + TAS Recording TAS-opname - + Overwrite file of player 1? Het bestand van speler 1 overschrijven? - + Invalid config detected Ongeldige configuratie gedetecteerd - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handheld-controller kan niet gebruikt worden in docked-modus. Pro controller wordt geselecteerd. - - + + Amiibo Amiibo - - + + The current amiibo has been removed De huidige amiibo is verwijderd - + Error Fout - - + + The current game is not looking for amiibos Het huidige spel is niet op zoek naar amiibo's - + Amiibo File (%1);; All Files (*.*) Amiibo-bestand (%1);; Alle Bestanden (*.*) - + Load Amiibo Laad Amiibo - + Error loading Amiibo data Fout tijdens het laden van de Amiibo-gegevens - + The selected file is not a valid amiibo Het geselecteerde bestand is geen geldige amiibo - + The selected file is already on use Het geselecteerde bestand is al in gebruik - + An unknown error occurred Er is een onbekende fout opgetreden - - Verification failed for the following files: %1 - Verificatie mislukt voor de volgende bestanden: + Verificatie mislukt voor de volgende bestanden: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Controller Applet - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Leg Schermafbeelding Vast - + PNG Image (*.png) PNG-afbeelding (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS-status: %1/%2 In werking - + TAS state: Recording %1 TAS-status: %1 Aan het opnemen - + TAS state: Idle %1/%2 TAS-status: %1/%2 Inactief - + TAS State: Invalid TAS-status: Ongeldig - + &Stop Running &Stop Uitvoering - + &Start &Start - + Stop R&ecording Stop Opname - + R&ecord Opnemen - + Building: %n shader(s) Bouwen: %n shader(s) @@ -6685,18 +6789,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Schaal: %1x - + Speed: %1% / %2% Snelheid: %1% / %2% - + Speed: %1% Snelheid: %1% @@ -6705,54 +6809,54 @@ Would you like to download it? Spel: %1 FPS (Ontgrendeld) - + Game: %1 FPS Game: %1 FPS - + Frame: %1 ms Frame: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA GEEN AA - + VOLUME: MUTE VOLUME: GEDEMPT - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Afleidingscomponenten ontbreken - + Select RomFS Dump Target Selecteer RomFS-dumpdoel - + Please select which RomFS you would like to dump. Selecteer welke RomFS je zou willen dumpen. @@ -6765,7 +6869,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Weet je zeker dat je de emulatie wilt stoppen? Alle niet opgeslagen voortgang zal verloren gaan. @@ -6778,102 +6882,102 @@ Would you like to bypass this and exit anyway? Wil je toch afsluiten? - + None Geen - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked Docked - + Handheld Handheld - + Normal Normaal - + High Hoog - + Extreme Extreme - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6881,13 +6985,13 @@ Wil je toch afsluiten? GRenderWindow - - + + OpenGL not available! OpenGL niet beschikbaar! - + OpenGL shared contexts are not supported. OpenGL gedeelde contexten worden niet ondersteund. @@ -6896,33 +7000,33 @@ Wil je toch afsluiten? yuzu is niet gecompileerd met OpenGL-ondersteuning. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Fout tijdens het initialiseren van OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Je GPU ondersteunt mogelijk geen OpenGL, of je hebt niet de laatste grafische stuurprogramma. - + Error while initializing OpenGL 4.6! Fout tijdens het initialiseren van OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Je GPU ondersteunt mogelijk OpenGL 4.6 niet, of je hebt niet het laatste grafische stuurprogramma.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Je GPU ondersteunt mogelijk een of meer vereiste OpenGL-extensies niet. Zorg ervoor dat je het laatste grafische stuurprogramma hebt.<br><br>GL Renderer:<br>%1<br><br>Ondersteunde extensies:<br>%2 @@ -6930,128 +7034,128 @@ Wil je toch afsluiten? GameList - + Favorite Favoriet - + Start Game Start Spel - + Start Game without Custom Configuration Start Spel zonder Aangepaste Configuratie - + Open Save Data Location Open Locatie van Save-data - + Open Mod Data Location Open Locatie van Mod-data - + Open Transferable Pipeline Cache Open Overdraagbare Pijplijn-cache - + Remove Verwijder - + Remove Installed Update Verwijder Geïnstalleerde Update - + Remove All Installed DLC Verwijder Alle Geïnstalleerde DLC's - + Remove Custom Configuration Verwijder Aangepaste Configuraties - + Remove Play Time Data - + Remove Cache Storage Verwijder Cache-opslag - + Remove OpenGL Pipeline Cache Verwijder OpenGL-pijplijn-cache - + Remove Vulkan Pipeline Cache Verwijder Vulkan-pijplijn-cache - + Remove All Pipeline Caches Verwijder Alle Pijplijn-caches - + Remove All Installed Contents Verwijder Alle Geïnstalleerde Inhoud - + Dump RomFS Dump RomFS - + Dump RomFS to SDMC Dump RomFS naar SDMC - + Verify Integrity Verifieer Integriteit - + Copy Title ID to Clipboard Kopiëer Titel-ID naar Klembord - + Navigate to GameDB entry Navigeer naar GameDB-invoer - + Create Shortcut Maak Snelkoppeling - + Add to Desktop Toevoegen aan Bureaublad - + Add to Applications Menu Toevoegen aan menu Toepassingen - + Configure Game @@ -7060,62 +7164,62 @@ Wil je toch afsluiten? Eigenschappen - + Scan Subfolders Scan Submappen - + Remove Game Directory Verwijder Spelmap - + ▲ Move Up ▲ Omhoog - + ▼ Move Down ▼ Omlaag - + Open Directory Location Open Maplocatie - + Clear Verwijder - + Name Naam - + Compatibility Compatibiliteit - + Add-ons Add-ons - + File type Bestandssoort - + Size Grootte - + Play time @@ -7123,62 +7227,62 @@ Wil je toch afsluiten? GameListItemCompat - + Ingame In het spel - + Game starts, but crashes or major glitches prevent it from being completed. Het spel start, maar crashes of grote glitches voorkomen dat het wordt voltooid. - + Perfect Perfect - + Game can be played without issues. Het spel kan zonder problemen gespeeld worden. - + Playable Speelbaar - + Game functions with minor graphical or audio glitches and is playable from start to finish. Het spel werkt met kleine grafische of audiofouten en is speelbaar van begin tot eind. - + Intro/Menu Intro/Menu - + Game loads, but is unable to progress past the Start Screen. Het spel wordt geladen, maar komt niet verder dan het startscherm. - + Won't Boot Start niet op - + The game crashes when attempting to startup. Het spel loopt vast bij het opstarten. - + Not Tested Niet Getest - + The game has not yet been tested. Het spel is nog niet getest. @@ -7186,7 +7290,7 @@ Wil je toch afsluiten? GameListPlaceholder - + Double-click to add a new folder to the game list Dubbel-klik om een ​​nieuwe map toe te voegen aan de spellijst @@ -7194,7 +7298,7 @@ Wil je toch afsluiten? GameListSearchField - + %1 of %n result(s) %1 van %n resultaat(en) @@ -7202,12 +7306,12 @@ Wil je toch afsluiten? - + Filter: Filter: - + Enter pattern to filter Voer patroon in om te filteren @@ -7289,7 +7393,7 @@ Wil je toch afsluiten? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7303,190 +7407,190 @@ Debug-bericht: Hotkeys - + Audio Mute/Unmute Audio Dempen/Dempen Opheffen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Hoofdvenster - + Audio Volume Down Audiovolume Omlaag - + Audio Volume Up Audiovolume Omhoog - + Capture Screenshot Leg Schermafbeelding Vast - + Change Adapting Filter Wijzig Aanpassingsfilter - + Change Docked Mode Wijzig Docked-modus - + Change GPU Accuracy Wijzig GPU-nauwkeurigheid - + Configure Configureer - + Configure Current Game - + Continue/Pause Emulation Emulatie Doorgaan/Onderbreken - + Exit Fullscreen Volledig Scherm Afsluiten + + + Exit Eden + + Exit yuzu yuzu afsluiten - - Exit eden - - - - + Fullscreen Volledig Scherm - + Load File Laad Bestand - + Load/Remove Amiibo Laad/Verwijder Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Herstart Emulatie - + Stop Emulation Stop Emulatie - + TAS Record TAS Opname - + TAS Reset TAS Reset - + TAS Start/Stop TAS Start/Stop - + Toggle Filter Bar Schakel Filterbalk - + Toggle Framerate Limit Schakel Frameratelimiet - + Toggle Mouse Panning Schakel Muispanning - + Toggle Renderdoc Capture - + Toggle Status Bar Schakel Statusbalk @@ -7494,22 +7598,22 @@ Debug-bericht: InstallDialog - + Please confirm these are the files you wish to install. Bevestig dat dit de bestanden zijn die je wilt installeren. - + Installing an Update or DLC will overwrite the previously installed one. Het installeren van een Update of DLC overschrijft de eerder geïnstalleerde. - + Install Installeer - + Install Files to NAND Installeer Bestanden naar NAND @@ -7517,7 +7621,7 @@ Debug-bericht: LimitableInputDialog - + The text can't contain any of the following characters: %1 De tekst kan geen van de volgende tekens bevatten: @@ -7664,152 +7768,207 @@ Debug-bericht: &Recente Bestanden - + + Open &Eden Folders + + + + &Emulation &Emulatie - + &View &Weergeven - + &Reset Window Size &Herstel Venstergrootte - + &Debugging &Debuggen - + Reset Window Size to &720p Herstel Venstergrootte naar &720p - + Reset Window Size to 720p Herstel Venstergrootte naar 720p - + Reset Window Size to &900p Herstel Venstergrootte naar &900p - + Reset Window Size to 900p Herstel Venstergrootte naar 900p - + Reset Window Size to &1080p Herstel Venstergrootte naar &1080p - + Reset Window Size to 1080p Herstel Venstergrootte naar 1080p - + &Multiplayer &Multiplayer - + &Tools &Tools - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Help - + &Install Files to NAND... &Installeer Bestanden naar NAND... - + L&oad File... L&aad Bestand... - + Load &Folder... Laad &Map... - + E&xit A&fsluiten - + &Pause &Onderbreken - + &Stop &Stop - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7818,97 +7977,97 @@ Debug-bericht: &Over yuzu - + Single &Window Mode Modus Enkel Venster - + Con&figure... Con&figureer... - + Ctrl+, - + Display D&ock Widget Headers Toon Dock Widget Kopteksten - + Show &Filter Bar Toon &Filterbalk - + Show &Status Bar Toon &Statusbalk - + Show Status Bar Toon Statusbalk - + &Browse Public Game Lobby &Bladeren door Openbare Spellobby - + &Create Room &Maak Kamer - + &Leave Room &Verlaat Kamer - + &Direct Connect to Room &Directe Verbinding met Kamer - + &Show Current Room &Toon Huidige Kamer - + F&ullscreen Volledig Scherm - + &Restart &Herstart - + Load/Remove &Amiibo... Laad/Verwijder &Amiibo... - + &Report Compatibility &Rapporteer Compatibiliteit - + Open &Mods Page Open &Mod-pagina - + Open &Quickstart Guide Open &Snelstartgids - + &FAQ &FAQ @@ -7917,77 +8076,82 @@ Debug-bericht: Open &yuzu-map - + &Capture Screenshot &Leg Schermafbeelding Vast - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... &Configureer TAS... - + Configure C&urrent Game... Configureer Huidig Spel... - + &Start &Start - + &Reset &Herstel - + R&ecord Opnemen - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7995,26 +8159,36 @@ Debug-bericht: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8074,37 +8248,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Huidige verbindingsstatus - + Not Connected. Click here to find a room! Niet Verbonden. Klik hier om een kamer te vinden! - + Not Connected Niet Verbonden - + Connected Verbonden - + New Messages Received Nieuwe Berichten Ontvangen - + Error Fout - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Het is niet gelukt om de kamerinformatie bij te werken. Controleer je internetverbinding en probeer de kamer opnieuw te hosten. @@ -8296,56 +8470,56 @@ p, li { white-space: pre-wrap; } Geen spel aan het spelen - + Installed SD Titles Geïnstalleerde SD-titels - + Installed NAND Titles Geïnstalleerde NAND-titels - + System Titles Systeemtitels - + Add New Game Directory Voeg Nieuwe Spelmap Toe - + Favorites Favorieten - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [niet aangegeven] @@ -8356,14 +8530,14 @@ p, li { white-space: pre-wrap; } Hat %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Axis %1%2 @@ -8374,357 +8548,357 @@ p, li { white-space: pre-wrap; } Knop %1 - - - - - - + + + + + + [unknown] [onbekend] - - - + + + Left Links - - - + + + Right Rechts - - - + + + Down Omlaag - - - + + + Up Omhoog - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Cirkel - - + + Cross Kruis - - + + Square Vierkant - - + + Triangle Driehoek - - + + Share Deel - - + + Options Opties - - + + [undefined] [ongedefinieerd] - + %1%2 %1%2 - - + + [invalid] [ongeldig] - - + + %1%2Hat %3 %1%2Hat %3 - - - + + + %1%2Axis %3 %1%2As %3 - - + + %1%2Axis %3,%4,%5 %1%2As %3,%4,%5 - - + + %1%2Motion %3 %1%2Beweging %3 - - + + %1%2Button %3 %1%2Knop %3 - - + + [unused] [ongebruikt] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Stick L - + Stick R Stick R - + Plus Plus - + Minus Min - - + + Home Home - + Capture Vastleggen - + Touch Touch - + Wheel Indicates the mouse wheel Wiel - + Backward Achteruit - + Forward Vooruit - + Task Taak - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Hat %4 - - + + %1%2%3Axis %4 %1%2%3As %4 - - + + %1%2%3Button %4 %1%2%3Knop %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8842,6 +9016,300 @@ p, li { white-space: pre-wrap; } Wil je deze amiibo herstellen? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + Verificatie mislukt voor de volgende bestanden: + +%1 + + + + + Verifying integrity... + Integriteit verifiëren... + + + + + Integrity verification succeeded! + Integriteitsverificatie geslaagd! + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + Integriteitsverificatie mislukt! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Fout bij het verwijderen van de inhoud + + + + Error Removing Update + Fout bij het verwijderen van de update + + + + Error Removing DLC + Fout bij het verwijderen van DLC + + + + The base game is not installed in the NAND and cannot be removed. + Het basisspel is niet geïnstalleerd in de NAND en kan niet worden verwijderd. + + + + There is no update installed for this title. + Er is geen update geïnstalleerd voor dit spel. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Met Succes Verwijderd + + + + Successfully removed %1 installed DLC. + %1 geïnstalleerde DLC met succes verwijderd. + + + + + Error Removing Transferable Shader Cache + Fout bij het verwijderen van Overdraagbare Shader-cache + + + + + A shader cache for this title does not exist. + Er bestaat geen shader-cache voor dit spel. + + + + Successfully removed the transferable shader cache. + De overdraagbare shader-cache is verwijderd. + + + + Failed to remove the transferable shader cache. + Kon de overdraagbare shader-cache niet verwijderen. + + + + Error Removing Vulkan Driver Pipeline Cache + Fout bij het verwijderen van Pijplijn-cache van Vulkan-driver + + + + Failed to remove the driver pipeline cache. + Kon de pijplijn-cache van de driver niet verwijderen. + + + + + Error Removing Transferable Shader Caches + Fout bij het verwijderen van overdraagbare shader-caches + + + + Successfully removed the transferable shader caches. + De overdraagbare shader-caches zijn verwijderd. + + + + Failed to remove the transferable shader cache directory. + Kon de overdraagbare shader-cache-map niet verwijderen. + + + + + Error Removing Custom Configuration + Fout bij het verwijderen van aangepaste configuratie + + + + A custom configuration for this title does not exist. + Er bestaat geen aangepaste configuratie voor dit spel. + + + + Successfully removed the custom game configuration. + De aangepaste spelconfiguratie is verwijderd. + + + + Failed to remove the custom game configuration. + Kon de aangepaste spelconfiguratie niet verwijderen. + + + + Reset Metadata Cache + Herstel Metagegevenscache + + + + The metadata cache is already empty. + De metagegevenscache is al leeg. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + De metagegevenscache kon niet worden verwijderd. Het wordt mogelijk gebruikt of bestaat niet. + + + + Create Shortcut + Maak Snelkoppeling + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Succesvol een snelkoppeling naar %1 gemaakt + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Dit maakt een snelkoppeling naar de huidige AppImage. Dit werkt mogelijk niet goed als je een update uitvoert. Doorgaan? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Maak Icoon + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Kan geen icoonbestand maken. Pad "%1" bestaat niet en kan niet worden aangemaakt. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9137,7 +9605,7 @@ Probeer het opnieuw of neem contact op met de software-ontwikkelaar. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9145,7 +9613,7 @@ Probeer het opnieuw of neem contact op met de software-ontwikkelaar. - + Users Gebruikers @@ -9269,7 +9737,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Call stack @@ -9277,12 +9745,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread wachtend door geen thread @@ -9290,102 +9758,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable uitvoerbaar - + paused onderbroken - + sleeping slapen - + waiting for IPC reply wachten op IPC-antwoord - + waiting for objects wachten op objecten - + waiting for condition variable wachten op conditie variabele - + waiting for address arbiter wachten op adres arbiter - + waiting for suspend resume wachtend op hervatten onderbreking - + waiting aan het wachten - + initialized geïnitialiseerd - + terminated beëindigd - + unknown onbekend - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideaal - + core %1 kern %1 - + processor = %1 processor = %1 - + affinity mask = %1 affiniteit masker = %1 - + thread id = %1 thread-id = %1 - + priority = %1(current) / %2(normal) prioriteit = %1(huidige) / %2(normaal) - + last running ticks = %1 laatste lopende ticks = %1 @@ -9393,7 +9861,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread wachtend door thread @@ -9401,7 +9869,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 07232eed27..5540e88048 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Łączenie z serwerem... - + Cancel Anuluj - + Touch the top left corner <br>of your touchpad. Dotknij lewy górny róg <br> swojego touchpada - + Now touch the bottom right corner <br>of your touchpad. Dotknij prawy dolny róg <br> swojego touchpada - + Configuration completed! Konfiguracja zakończona! - + OK OK @@ -397,502 +397,184 @@ To zbanuje jego/jej nick na forum, oraz jego/jej adres IP. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Błąd - - Net connect - - - - - Player select - - - - + Software keyboard Klawiatura programowa - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Silnik wyjściowy - + Output Device: Urządzenie wyjściowe: - + Input Device: Urządzenie wejściowe: - + Mute audio Wycisz dźwięk - + Volume: Głośność: - + Mute audio when in background Wyciszaj audio gdy yuzu działa w tle - + Multicore CPU Emulation Emulacja CPU Wielordzeniowa - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Procent limitu prędkości - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Precyzja: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Unfuse FMA (zwiększ wydajność na procesorach bez FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Szybsze FRSQRTE i FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Szybsze instrukcje ASIMD (Tylko 32-bit) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Niedokładna obsługa NaN - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Wyłącz sprawdzanie przestrzeni adresów - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Ignoruj ogólne monitorowanie - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Urządzenie: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Backend Shaderów: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Rozdzielczość: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Filtr Adaptującego Okna: - + FSR Sharpness: Ostrość FSR: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Metoda Anty-Aliasingu: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Tryb Pełnoekranowy: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Format obrazu: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Użyj Pamięci Podręcznej Pipeline z dysku - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Użyj asynchronicznej emulacji GPU - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Emulacja NVDEC: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Tryb synchronizacji pionowej: - - FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. -FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. -Mailbox can have lower latency than FIFO and does not tear but may drop frames. -Immediate (no synchronization) just presents whatever is available and can exhibit tearing. - - - - - Enable asynchronous presentation (Vulkan only) - - - - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Wymuś maksymalne zegary (Tylko Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Uruchamia pracę w tle podczas oczekiwania na komendy graficzne aby GPU nie obniżało taktowania. - + Anisotropic Filtering: Filtrowanie anizotropowe: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Precyzja: + Precyzja: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Użyj asynchronicznego budowania shaderów (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Użyj Szybszego Czasu GPU (Hack) @@ -902,1021 +584,1436 @@ This feature is experimental. Włącza Szybszy Czas GPU. Ta opcja zmusza większość gier do wyświetlania w swojej najwyższej natywnej rozdzielczości. - + Use Vulkan pipeline cache Użyj pamięci podręcznej strumienia dla Vulkana - + + RNG Seed + Ziarno RNG + + + + Device Name + Nazwa urządzenia + + + + Note: this can be overridden when region setting is auto-select + Uwaga: można to zmienić, gdy ustawienie regionu jest wybierane automatycznie + + + + Region: + Region: + + + + Time Zone: + Strefa czasowa: + + + + Sound Output Mode: + Tryb wyjścia dźwięku: + + + + Prompt for user on game boot + Pytaj o użytkownika podczas uruchamiania gry + + + + Pause emulation when in background + Wstrzymaj emulację w tle + + + + Hide mouse on inactivity + Ukryj mysz przy braku aktywności + + + + CPU + CPU + + + + Uncompressed (Best quality) + Brak (najlepsza jakość) + + + + BC1 (Low quality) + BC1 (niska jakość) + + + + BC3 (Medium quality) + BC3 (średnia jakość) + + + + Vulkan + Vulkan + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Zgromadzone Shadery, tylko NVIDIA) + + + + Normal + Normalny + + + + High + Wysoki + + + + Auto + Automatyczny + + + + Accurate + Dokładny + + + + Unsafe + Niebezpieczny + + + + Paranoid (disables most optimizations) + Paranoiczne (wyłącza większość optymalizacji) + + + + Borderless Windowed + W oknie (Bezramkowy) + + + + Exclusive Fullscreen + Exclusive Fullscreen + + + + No Video Output + Brak wyjścia wideo + + + + CPU Video Decoding + Dekodowanie Wideo przez CPU + + + + GPU Video Decoding (Default) + Dekodowanie Wideo przez GPU (Domyślne) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [EKSPERYMENTALNE] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [Ekperymentalnie] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Najbliższy sąsiadujący + + + + Bilinear + Bilinearny + + + + Bicubic + Bikubiczny + + + + Gaussian + Kulisty + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Żadna (wyłączony) + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Domyślne (16:9) + + + + Force 4:3 + Wymuś 4:3 + + + + Force 21:9 + Wymuś 21:9 + + + + Force 16:10 + Wymuś 16:10 + + + + Stretch to Window + Rozciągnij do Okna + + + + Automatic + Automatyczne + + + + + Default + Domyślny + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. +FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. +Mailbox can have lower latency than FIFO and does not tear but may drop frames. +Immediate (no synchronization) just presents whatever is available and can exhibit tearing. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Enable asynchronous presentation (Vulkan only) + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - Ziarno RNG + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Nazwa urządzenia - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Uwaga: można to zmienić, gdy ustawienie regionu jest wybierane automatycznie - - - - Region: - Region: - - - + The region of the emulated Switch. - - Time Zone: - Strefa czasowa: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Tryb wyjścia dźwięku: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Pytaj o użytkownika podczas uruchamiania gry - - - - Pause emulation when in background - Wstrzymaj emulację w tle - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Ukryj mysz przy braku aktywności - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - - Uncompressed (Best quality) - Brak (najlepsza jakość) - - - - BC1 (Low quality) - BC1 (niska jakość) - - - - BC3 (Medium quality) - BC3 (średnia jakość) - - - + Conservative - + Aggressive - + OpenGL - - Vulkan - Vulkan - - - + Null - + GLSL - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Zgromadzone Shadery, tylko NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Normalny - - - - High - Wysoki - - - + Extreme - - Auto - Automatyczny + + Unsafe (fast) + - - Accurate - Dokładny + + Safe (stable) + - - Unsafe - Niebezpieczny - - - - Paranoid (disables most optimizations) - Paranoiczne (wyłącza większość optymalizacji) - - - + Dynarmic - + NCE - - Borderless Windowed - W oknie (Bezramkowy) - - - - Exclusive Fullscreen - Exclusive Fullscreen - - - - No Video Output - Brak wyjścia wideo - - - - CPU Video Decoding - Dekodowanie Wideo przez CPU - - - - GPU Video Decoding (Default) - Dekodowanie Wideo przez GPU (Domyślne) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [EKSPERYMENTALNE] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [Ekperymentalnie] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Najbliższy sąsiadujący - - - - Bilinear - Bilinearny - - - - Bicubic - Bikubiczny - - - - Gaussian - Kulisty - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Żadna (wyłączony) - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Domyślne (16:9) - - - - Force 4:3 - Wymuś 4:3 - - - - Force 21:9 - Wymuś 21:9 - - - - Force 16:10 - Wymuś 16:10 - - - - Stretch to Window - Rozciągnij do Okna - - - - Automatic - Automatyczne - - - - Default - Domyślny - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Zadokowany - + Handheld Przenośnie - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2266,27 +2363,27 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d Logowanie - + Open Log Location Otwórz miejsce rejestrów - + Global Log Filter Globalny filtr rejestrów - + When checked, the max size of the log increases from 100 MB to 1 GB Kiedy zaznaczony, maksymalny rozmiar logu wzrasta ze 100 MB do 1 GB - + Enable Extended Logging** Włącz Przedłużony Logging** - + Show Log in Console Pokaż Log w konsoli @@ -2432,7 +2529,7 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2494,7 +2591,7 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d **To zresetuje się automatycznie po wyłączeniu yuzu. - + Web applet not compiled Aplet sieciowy nie został skompilowany @@ -2544,7 +2641,7 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d - eden Configuration + Eden Configuration @@ -2553,88 +2650,88 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d - + Applets - - + + Audio Dźwięk - - + + CPU CPU - + Debug Wyszukiwanie usterek - + Filesystem System plików - - + + General Ogólne - - + + Graphics Grafika - + GraphicsAdvanced Zaawansowana grafika - + GraphicsExtensions - + Hotkeys Skróty klawiszowe - - + + Controls Sterowanie - + Profiles Profile - + Network Sieć - - + + System System - + Game List Lista Gier - + Web Web @@ -2732,51 +2829,45 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d - - - Reset Metadata Cache Zresetuj pamięć podręczną metadanych - + Select Emulated NAND Directory... Wybierz emulowany katalog NAND... - + Select Emulated SD Directory... Wybierz Emulowany katalog SD... - + Select Gamecard Path... Wybierz Ścieżkę karty gry... - + Select Dump Directory... Wybierz katalog zrzutu... - + Select Mod Load Directory... Wybierz katalog ładowania modów... - The metadata cache is already empty. - Pamięć podręczna metadanych jest już pusta. + Pamięć podręczna metadanych jest już pusta. - The operation completed successfully. - Operacja zakończona sukcesem. + Operacja zakończona sukcesem. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Nie udało się usunąć pamięci podręcznej metadanych. Może być używana lub nie istnieje. + Nie udało się usunąć pamięci podręcznej metadanych. Może być używana lub nie istnieje. @@ -2807,12 +2898,12 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Spowoduje to zresetowanie wszystkich ustawień i usunięcie wszystkich konfiguracji gier. Nie spowoduje to usunięcia katalogów gier, profili ani profili wejściowych. Kontynuować? @@ -2845,33 +2936,33 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d Kolor tła - + % FSR sharpening percentage (e.g. 50%) % - + Off Wyłączone - + VSync Off VSync wyłączony - + Recommended Zalecane - + On Włączone - + VSync On VSync aktywny @@ -2908,14 +2999,18 @@ Gdy ta opcja jest włączona, niedopasowanie jest uruchamiane tylko wtedy, gdy d - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2947,75 +3042,75 @@ These settings are experimental, and may cause black screens. If your games fail Przywróć domyślne - + Action Akcja - + Hotkey Skrót klawiszowy - + Controller Hotkey Skrót Klawiszowy Kontrolera - - - + + + Conflicting Key Sequence Sprzeczna sekwencja klawiszy - - + + The entered key sequence is already assigned to: %1 Wprowadzona sekwencja klawiszy jest już przypisana do: %1 - + [waiting] [oczekiwanie] - + Invalid Nieprawidłowe - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Przywróć ustawienia domyślne - + Clear Wyczyść - + Conflicting Button Sequence Sprzeczna Sekwencja Przycisków - + The default button sequence is already assigned to: %1 Domyślna sekwencja przycisków już jest przypisana do: %1 - + The default key sequence is already assigned to: %1 Domyślna sekwencja klawiszy jest już przypisana do: %1 @@ -3335,7 +3430,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3490,7 +3585,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Lewa gałka @@ -3600,14 +3695,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3626,7 +3721,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Plus @@ -3639,15 +3734,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3692,7 +3787,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Prawa gałka @@ -3707,242 +3802,242 @@ These settings are experimental, and may cause black screens. If your games fail Konfiguruj - - - - + + + + Clear Wyczyść - - - - - + + + + + [not set] [nie ustawione] - - - + + + Invert button Odwróć przycisk - - + + Toggle button Przycisk Toggle - + Turbo button Przycisk TURBO - - + + Invert axis Odwróć oś - - - + + + Set threshold Ustaw próg - - + + Choose a value between 0% and 100% Wybierz wartość od 0% do 100% - + Toggle axis Przełącz oś - + Set gyro threshold Ustaw próg gyro - + Calibrate sensor Kalibracja sensora - + Map Analog Stick Przypisz Drążek Analogowy - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Po naciśnięciu OK, najpierw przesuń joystick w poziomie, a następnie w pionie. Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo. - + Center axis Środkowa oś - - + + Deadzone: %1% Martwa strefa: %1% - - + + Modifier Range: %1% Zasięg Modyfikatora: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Para Joyconów - + Left Joycon Lewy Joycon - + Right Joycon Prawy Joycon - + Handheld Handheld - + GameCube Controller Kontroler GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Kontroler NES/Pegasus - + SNES Controller Kontroler SNES - + N64 Controller Kontroler N64 - + Sega Genesis Sega Mega Drive - + Start / Pause Start / Pauza - + Z Z - + Control Stick Lewa gałka - + C-Stick C-gałka - + Shake! Potrząśnij! - + [waiting] [oczekiwanie] - + New Profile Nowy profil - + Enter a profile name: Wpisz nazwę profilu: - - + + Create Input Profile Utwórz profil wejściowy - + The given profile name is not valid! Podana nazwa profilu jest nieprawidłowa! - + Failed to create the input profile "%1" Nie udało się utworzyć profilu wejściowego "%1" - + Delete Input Profile Usuń profil wejściowy - + Failed to delete the input profile "%1" Nie udało się usunąć profilu wejściowego "%1" - + Load Input Profile Załaduj profil wejściowy - + Failed to load the input profile "%1" Nie udało się wczytać profilu wejściowego "%1" - + Save Input Profile Zapisz profil wejściowy - + Failed to save the input profile "%1" Nie udało się zapisać profilu wejściowego "%1" @@ -3999,7 +4094,7 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo. - + Configure Konfiguruj @@ -4035,7 +4130,7 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo. - + Test Test @@ -4054,7 +4149,7 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.<a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Dowiedz się więcej</span></a> - + %1:%2 %1:%2 @@ -4063,77 +4158,77 @@ Aby odwrócić osie, najpierw przesuń joystick pionowo, a następnie poziomo.yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Port zawiera nieprawidłowe znaki - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Port musi być w zakresie 0-65353 - + IP address is not valid Adres IP nie jest prawidłowy - + This UDP server already exists Ten serwer UDP już istnieje - + Unable to add more than 8 servers Nie można dodać więcej niż 8 serwerów - + Testing Testowanie - + Configuring Konfigurowanie - + Test Successful Test Udany - + Successfully received data from the server. Pomyślnie odebrano dane z serwera. - + Test Failed Test nieudany - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Nie można odebrać poprawnych danych z serwera.<br>Sprawdź, czy serwer jest poprawnie skonfigurowany, a adres i port są prawidłowe. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Trwa konfiguracja testu UDP lub kalibracji.<br>Poczekaj na zakończenie. @@ -4259,7 +4354,12 @@ Current values are %1% and %2% respectively. Interfejs Sieciowy - + + Enable Airplane Mode + + + + None Żadny @@ -4317,52 +4417,52 @@ Current values are %1% and %2% respectively. - + Add-Ons Dodatki - + System System - + CPU CPU - + Graphics Grafika - + Adv. Graphics Zaaw. Grafika - + GPU Extensions - + Audio Dźwięk - + Input Profiles Profil wejściowy - + Linux - + Properties Właściwości @@ -4380,12 +4480,12 @@ Current values are %1% and %2% respectively. Dodatki - + Patch Name Nazwa łatki - + Version Wersja @@ -4423,27 +4523,32 @@ Current values are %1% and %2% respectively. Ustaw zdjęcie - + + Select Avatar + + + + Add Dodaj - + Rename Zmień nazwę - + Remove Usuń - + Profile management is available only when game is not running. Menedżer Profili nie jest dostępny gdy gra jest uruchomiona. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4451,100 +4556,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Wpisz nazwę użytkownika - + Users Użytkownicy - + Enter a username for the new user: Wprowadź nazwę dla nowego użytkownika: - + Enter a new username: Wpisz nową nazwę użytkownika: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Ustaw zdjęcie użytkownika - - JPEG Images (*.jpg *.jpeg) - Obrazki JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Obrazki JPEG (*.jpg *.jpeg) + + + Error deleting image Bład usunięcia zdjęcia - + Error occurred attempting to overwrite previous image at: %1. Błąd podczas próby nadpisania poprzedniego zdjęcia dla: %1. - + Error deleting file Błąd usunięcia pliku - + Unable to delete existing file: %1. Nie można usunąć istniejącego pliku: %1 - + Error creating user image directory Błąd podczas tworzenia folderu ze zdjęciem użytkownika - + Unable to create directory %1 for storing user images. Nie można utworzyć ścieżki %1 do przechowywania zdjęć użytkownika. - Error copying user image - Błąd kopiowania zdjęcia użytkownika + Błąd kopiowania zdjęcia użytkownika - Unable to copy image from %1 to %2 - Nie można skopiować zdjęcia z %1 do %2 + Nie można skopiować zdjęcia z %1 do %2 - Error resizing user image - Błąd podczas zmieniania rozmiaru obrazu użytkownika + Błąd podczas zmieniania rozmiaru obrazu użytkownika - Unable to resize image - Nie można zmienić rozmiaru obrazu + Nie można zmienić rozmiaru obrazu + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Anuluj + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Czy usunąć tego użytkownika? Wszystkie dane zapisu użytkownika zostaną usunięte. - + Confirm Delete Potwierdź usunięcie - + Name: %1 UUID: %2 Nazwa: %1 @@ -4597,7 +4791,7 @@ UUID: %2 - + Enable @@ -4608,7 +4802,7 @@ UUID: %2 - + Not connected Niepodłączony @@ -4618,63 +4812,63 @@ UUID: %2 Przywróć domyślne - + Clear Wyczyść - + [not set] [nie ustawione] - + Invert axis Odwróć oś - - + + Deadzone: %1% Martwa strefa: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Konfigurowanie - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [oczekiwanie] @@ -4716,7 +4910,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4768,12 +4962,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Konfiguracja TAS - + Select TAS Load Directory... Wybierz Ścieżkę Załadowania TAS-a @@ -4883,7 +5077,7 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5203,6 +5397,16 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Usługa internetowa yuzu @@ -5212,42 +5416,29 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Podając swoją nazwę użytkownika i token, zgadzasz się na umożliwienie yuzu zbierania dodatkowych danych o użytkowaniu, które mogą zawierać informacje umożliwiające identyfikację użytkownika. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Zweryfikuj + Zweryfikuj - Sign up - Zaloguj się + Zaloguj się - + Token: Token: - + Username: Nazwa użytkownika: - What is my token? - Czym jest mój token? + Czym jest mój token? - + Web Service configuration can only be changed when a public room isn't being hosted. Konfigurację usług sieciowych można tylko zmienić kiedy pokój publiczny nie jest hostowany. @@ -5272,12 +5463,12 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Wygeneruj ponownie - + Discord Presence Obecność na discordzie - + Show Current Game in your Discord Status Pokazuj obecną grę w twoim statusie Discorda @@ -5286,24 +5477,8 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Dowiedz się więcej</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Zaloguj się</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Zaloguj się</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5326,10 +5501,9 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Token nie został zweryfikowany. Zmiana w Twoim tokenie nie została zapisana. - Unverified, please click Verify before saving configuration Tooltip - Niezweryfikowany, kliknij proszę przycisk Weryfikacji przed zapisaniem konfiguracji + Niezweryfikowany, kliknij proszę przycisk Weryfikacji przed zapisaniem konfiguracji Verifying... @@ -5353,20 +5527,67 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Weryfikacja nie powiodła się. Sprawdź, czy poprawnie podałeś swój token oraz czy działa twoje połączenie internetowe. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Kontroler P1 - + &Controller P1 &Kontroler P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Wersja + + DirectConnect @@ -5472,7 +5693,12 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5480,11 +5706,6 @@ Przeciągnij punkty, aby zmienić pozycję, lub kliknij dwukrotnie komórki tabe The host of the room has banned you. Speak with the host to unban you or try a different room. Host tego pokoju cię zbanował. Porozmawiaj z hostem, i poproś go, żeby cię odbanował, albo zagraj w innym pokoju. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5546,7 +5767,7 @@ Przejdź do Konfiguruj... -> System -> Sieć i dokonaj wyboru.Telemetria - + Broken Vulkan Installation Detected Wykryto uszkodzoną instalację Vulkana @@ -5555,106 +5776,105 @@ Przejdź do Konfiguruj... -> System -> Sieć i dokonaj wyboru.Inicjalizacja Vulkana nie powiodła się podczas uruchamiania.<br><br>Kliknij<a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>tutaj aby uzyskać instrukcje dotyczące rozwiązania tego problemu</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Ładowanie apletu internetowego... - - + + Disable Web Applet Wyłącz Aplet internetowy - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Wyłączanie web appletu może doprowadzić do nieokreślonych zachowań - wyłączyć applet należy jedynie grając w Super Mario 3D All-Stars. Na pewno chcesz wyłączyć web applet? (Można go ponownie włączyć w ustawieniach debug.) - + The amount of shaders currently being built Ilość budowanych shaderów - + The current selected resolution scaling multiplier. Obecnie wybrany mnożnik rozdzielczości. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktualna prędkość emulacji. Wartości większe lub niższe niż 100% wskazują, że emulacja działa szybciej lub wolniej niż Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Ile klatek na sekundę gra aktualnie wyświetla. To będzie się różnić w zależności od gry, od sceny do sceny. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny do emulacji klatki na sekundę Switcha, nie licząc ograniczania klatek ani v-sync. Dla emulacji pełnej szybkości powinno to wynosić co najwyżej 16,67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files &Usuń Ostatnie pliki - + &Continue &Kontynuuj - + &Pause &Pauza - Warning Outdated Game Format - OSTRZEŻENIE! Nieaktualny format gry + OSTRZEŻENIE! Nieaktualny format gry You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Używasz zdekonstruowanego formatu katalogu ROM dla tej gry, który jest przestarzałym formatem, który został zastąpiony przez inne, takie jak NCA, NAX, XCI lub NSP. W zdekonstruowanych katalogach ROM brakuje ikon, metadanych i obsługi aktualizacji.<br><br> Aby znaleźć wyjaśnienie różnych formatów Switch obsługiwanych przez yuzu,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'> sprawdź nasze wiki</a>. Ta wiadomość nie pojawi się ponownie. - - + + Error while loading ROM! Błąd podczas wczytywania ROMu! - + The ROM format is not supported. Ten format ROMu nie jest wspierany. - + An error occurred initializing the video core. Wystąpił błąd podczas inicjowania rdzenia wideo. @@ -5663,7 +5883,7 @@ Przejdź do Konfiguruj... -> System -> Sieć i dokonaj wyboru.yuzu napotkał błąd podczas uruchamiania rdzenia wideo. Jest to zwykle spowodowane przestarzałymi sterownikami GPU, w tym zintegrowanymi. Więcej szczegółów znajdziesz w pliku log. Więcej informacji na temat dostępu do log-u można znaleźć na następującej stronie: <a href='https://yuzu-emu.org/help/reference/log-files/'>Jak przesłać plik log</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Błąd podczas wczytywania ROMu! %1 @@ -5674,1036 +5894,884 @@ Przejdź do Konfiguruj... -> System -> Sieć i dokonaj wyboru.%1<br>Postępuj zgodnie z<a href='https://yuzu-emu.org/help/quickstart/'>yuzu quickstart guide</a> aby zrzucić ponownie swoje pliki.<br>Możesz odwołać się do wiki yuzu</a>lub discord yuzu </a> po pomoc. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w pliku log. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Zamykanie aplikacji... - + Save Data Zapis danych - + Mod Data Dane modów - + Error Opening %1 Folder Błąd podczas otwarcia folderu %1 - - + + Folder does not exist! Folder nie istnieje! - Error Opening Transferable Shader Cache - Błąd podczas otwierania przenośnej pamięci podręcznej Shaderów. + Błąd podczas otwierania przenośnej pamięci podręcznej Shaderów. - Failed to create the shader cache directory for this title. - Nie udało się stworzyć ścieżki shaderów dla tego tytułu. + Nie udało się stworzyć ścieżki shaderów dla tego tytułu. - Error Removing Contents - Błąd podczas usuwania zawartości + Błąd podczas usuwania zawartości - Error Removing Update - Błąd podczas usuwania aktualizacji + Błąd podczas usuwania aktualizacji - Error Removing DLC - Błąd podczas usuwania dodatków + Błąd podczas usuwania dodatków - + Remove Installed Game Contents? Czy usunąć zainstalowaną zawartość gry? - + Remove Installed Game Update? Czy usunąć zainstalowaną aktualizację gry? - + Remove Installed Game DLC? Czy usunąć zainstalowane dodatki gry? - + Remove Entry Usuń wpis - - - - - - Successfully Removed - Pomyślnie usunięto + Pomyślnie usunięto - Successfully removed the installed base game. - Pomyślnie usunięto zainstalowaną grę. + Pomyślnie usunięto zainstalowaną grę. - The base game is not installed in the NAND and cannot be removed. - Gra nie jest zainstalowana w NAND i nie może zostać usunięta. + Gra nie jest zainstalowana w NAND i nie może zostać usunięta. - Successfully removed the installed update. - Pomyślnie usunięto zainstalowaną łatkę. + Pomyślnie usunięto zainstalowaną łatkę. - There is no update installed for this title. - Brak zainstalowanych łatek dla tego tytułu. + Brak zainstalowanych łatek dla tego tytułu. - There are no DLC installed for this title. - Brak zainstalowanych DLC dla tego tytułu. + Brak zainstalowanych DLC dla tego tytułu. - Successfully removed %1 installed DLC. - Pomyślnie usunięto %1 zainstalowane DLC. + Pomyślnie usunięto %1 zainstalowane DLC. - + Delete OpenGL Transferable Shader Cache? Usunąć Transferowalne Shadery OpenGL? - + Delete Vulkan Transferable Shader Cache? Usunąć Transferowalne Shadery Vulkan? - + Delete All Transferable Shader Caches? Usunąć Wszystkie Transferowalne Shadery? - + Remove Custom Game Configuration? Usunąć niestandardową konfigurację gry? - + Remove Cache Storage? Usunąć pamięć podręczną? - + Remove File Usuń plik - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Błąd podczas usuwania przenośnej pamięci podręcznej Shaderów. + Błąd podczas usuwania przenośnej pamięci podręcznej Shaderów. - - A shader cache for this title does not exist. - Pamięć podręczna Shaderów dla tego tytułu nie istnieje. + Pamięć podręczna Shaderów dla tego tytułu nie istnieje. - Successfully removed the transferable shader cache. - Pomyślnie usunięto przenośną pamięć podręczną Shaderów. + Pomyślnie usunięto przenośną pamięć podręczną Shaderów. - Failed to remove the transferable shader cache. - Nie udało się usunąć przenośnej pamięci Shaderów. + Nie udało się usunąć przenośnej pamięci Shaderów. - Error Removing Vulkan Driver Pipeline Cache - Błąd podczas usuwania pamięci podręcznej strumienia sterownika Vulkana + Błąd podczas usuwania pamięci podręcznej strumienia sterownika Vulkana - Failed to remove the driver pipeline cache. - Błąd podczas usuwania pamięci podręcznej strumienia sterownika. + Błąd podczas usuwania pamięci podręcznej strumienia sterownika. - - Error Removing Transferable Shader Caches - Błąd podczas usuwania Transferowalnych Shaderów + Błąd podczas usuwania Transferowalnych Shaderów - Successfully removed the transferable shader caches. - Pomyślnie usunięto transferowalne shadery. + Pomyślnie usunięto transferowalne shadery. - Failed to remove the transferable shader cache directory. - Nie udało się usunąć ścieżki transferowalnych shaderów. + Nie udało się usunąć ścieżki transferowalnych shaderów. - - Error Removing Custom Configuration - Błąd podczas usuwania niestandardowej konfiguracji + Błąd podczas usuwania niestandardowej konfiguracji - A custom configuration for this title does not exist. - Niestandardowa konfiguracja nie istnieje dla tego tytułu. + Niestandardowa konfiguracja nie istnieje dla tego tytułu. - Successfully removed the custom game configuration. - Pomyślnie usunięto niestandardową konfiguracje gry. + Pomyślnie usunięto niestandardową konfiguracje gry. - Failed to remove the custom game configuration. - Nie udało się usunąć niestandardowej konfiguracji gry. + Nie udało się usunąć niestandardowej konfiguracji gry. - - + + RomFS Extraction Failed! Wypakowanie RomFS nieudane! - + There was an error copying the RomFS files or the user cancelled the operation. Wystąpił błąd podczas kopiowania plików RomFS lub użytkownik anulował operację. - + Full Pełny - + Skeleton Szkielet - + Select RomFS Dump Mode Wybierz tryb zrzutu RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Proszę wybrać w jaki sposób chcesz, aby zrzut pliku RomFS został wykonany. <br>Pełna kopia ze wszystkimi plikami do nowego folderu, gdy <br>skielet utworzy tylko strukturę folderu. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Nie ma wystarczająco miejsca w %1 aby wyodrębnić RomFS. Zwolnij trochę miejsca, albo zmień ścieżkę zrzutu RomFs w Emulacja> Konfiguruj> System> System Plików> Źródło Zrzutu - + Extracting RomFS... Wypakowywanie RomFS... - - - - - + + Cancel Anuluj - + RomFS Extraction Succeeded! Wypakowanie RomFS zakończone pomyślnie! - - - + The operation completed successfully. Operacja zakończona sukcesem. - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - - Verifying integrity... - - - - - - Integrity verification succeeded! - - - - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - Create Shortcut - Utwórz skrót + Utwórz skrót - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Pomyślnie utworzono skrót do %1 + Pomyślnie utworzono skrót do %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Utworzy to skrót do obecnego AppImage. Może nie działać dobrze po aktualizacji. Kontynuować? + Utworzy to skrót do obecnego AppImage. Może nie działać dobrze po aktualizacji. Kontynuować? - - Failed to create a shortcut to %1 + Create Icon + Utwórz ikonę + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Nie można utworzyć pliku ikony. Ścieżka "%1" nie istnieje oraz nie może być utworzona. + + + + Warning: Outdated Game Format - - Create Icon - Utwórz ikonę + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Nie można utworzyć pliku ikony. Ścieżka "%1" nie istnieje oraz nie może być utworzona. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz folder... - + Properties Właściwości - + The game properties could not be loaded. Właściwości tej gry nie mogły zostać załadowane. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Plik wykonywalny Switcha (%1);;Wszystkie pliki (*.*) - + Load File Załaduj plik... - + Open Extracted ROM Directory Otwórz folder wypakowanego ROMu - + Invalid Directory Selected Wybrano niewłaściwy folder - + The directory you have selected does not contain a 'main' file. Folder wybrany przez ciebie nie zawiera 'głownego' pliku. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Instalacyjne pliki Switch'a (*.nca *.nsp *.xci);;Archiwum zawartości Nintendo (*.nca);;Pakiet poddany Nintendo (*.nsp);;Obraz z kartridża NX (*.xci) - + Install Files Zainstaluj pliki - + %n file(s) remaining 1 plik został %n plików zostało - %n plików zostało - + Installing file "%1"... Instalowanie pliku "%1"... - - + + Install Results Wynik instalacji - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Aby uniknąć ewentualnych konfliktów, odradzamy użytkownikom instalowanie gier na NAND. Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were newly installed 1 nowy plik został zainstalowany %n nowych plików zostało zainstalowane - - %n nowych plików zostało zainstalowane - + %n file(s) were overwritten 1 plik został nadpisany %n plików zostało nadpisane - %n plików zostało nadpisane - + %n file(s) failed to install 1 pliku nie udało się zainstalować %n plików nie udało się zainstalować - %n plików nie udało się zainstalować - + System Application Aplikacja systemowa - + System Archive Archiwum systemu - + System Application Update Aktualizacja aplikacji systemowej - + Firmware Package (Type A) Paczka systemowa (Typ A) - + Firmware Package (Type B) Paczka systemowa (Typ B) - + Game Gra - + Game Update Aktualizacja gry - + Game DLC Dodatek do gry - + Delta Title Tytuł Delta - + Select NCA Install Type... Wybierz typ instalacji NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Wybierz typ tytułu, do którego chcesz zainstalować ten NCA, jako: (W większości przypadków domyślna "gra" jest w porządku.) - + Failed to Install Instalacja nieudana - + The title type you selected for the NCA is invalid. Typ tytułu wybrany dla NCA jest nieprawidłowy. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + OK OK - - + + Hardware requirements not met Wymagania sprzętowe nie są spełnione - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Twój system nie spełnia rekomendowanych wymagań sprzętowych. Raportowanie kompatybilności zostało wyłączone. - + Missing yuzu Account Brakuje konta Yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Aby przesłać test zgodności gry, musisz połączyć swoje konto yuzu.<br><br/> Aby połączyć swoje konto yuzu, przejdź do opcji Emulacja &gt; Konfiguracja &gt; Sieć. - + Error opening URL Błąd otwierania adresu URL - + Unable to open the URL "%1". Nie można otworzyć adresu URL "%1". - + TAS Recording Nagrywanie TAS - + Overwrite file of player 1? Nadpisać plik gracza 1? - + Invalid config detected Wykryto nieprawidłową konfigurację - + Handheld controller can't be used on docked mode. Pro controller will be selected. Nie można używać kontrolera handheld w trybie zadokowanym. Zostanie wybrany kontroler Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo zostało "zdjęte" - + Error Błąd - - + + The current game is not looking for amiibos Ta gra nie szuka amiibo - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);;Wszyskie pliki (*.*) - + Load Amiibo Załaduj Amiibo - + Error loading Amiibo data Błąd podczas ładowania pliku danych Amiibo - + The selected file is not a valid amiibo Wybrany plik nie jest poprawnym amiibo - + The selected file is already on use Wybrany plik jest już w użyciu - + An unknown error occurred Wystąpił nieznany błąd - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Aplet kontrolera - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Zrób zrzut ekranu - + PNG Image (*.png) Obrazek PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Status TAS: Działa %1%2 - + TAS state: Recording %1 Status TAS: Nagrywa %1 - + TAS state: Idle %1/%2 Status TAS: Bezczynny %1%2 - + TAS State: Invalid Status TAS: Niepoprawny - + &Stop Running &Wyłącz - + &Start &Start - + Stop R&ecording Przestań N&agrywać - + R&ecord N&agraj - + Building: %n shader(s) Budowanie shadera Budowanie: %n shaderów - Budowanie: %n shaderów - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Prędkość: %1% / %2% - + Speed: %1% Prędkość: %1% @@ -6712,54 +6780,54 @@ Would you like to download it? Gra: %1 FPS (Odblokowane) - + Game: %1 FPS Gra: %1 FPS - + Frame: %1 ms Klatka: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA BEZ AA - + VOLUME: MUTE Głośność: Wyciszony - + VOLUME: %1% Volume percentage (e.g. 50%) Głośność: %1% - + Derivation Components Missing Brak komponentów wyprowadzania - + Select RomFS Dump Target Wybierz cel zrzutu RomFS - + Please select which RomFS you would like to dump. Proszę wybrać RomFS, jakie chcesz zrzucić. @@ -6772,7 +6840,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Czy na pewno chcesz zatrzymać emulację? Wszystkie niezapisane postępy zostaną utracone. @@ -6785,102 +6853,102 @@ Would you like to bypass this and exit anyway? Czy chcesz to ominąć i mimo to wyjść? - + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Nearest - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + ScaleForce ScaleForce - + Area - + Docked Zadokowany - + Handheld Przenośnie - + Normal Normalny - + High Wysoki - + Extreme - + Vulkan Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6888,13 +6956,13 @@ Czy chcesz to ominąć i mimo to wyjść? GRenderWindow - - + + OpenGL not available! OpenGL niedostępny! - + OpenGL shared contexts are not supported. Współdzielone konteksty OpenGL nie są obsługiwane. @@ -6903,33 +6971,33 @@ Czy chcesz to ominąć i mimo to wyjść? yuzu nie zostało skompilowane z obsługą OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Błąd podczas inicjowania OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Twoja karta graficzna może nie obsługiwać OpenGL lub nie masz najnowszych sterowników karty graficznej. - + Error while initializing OpenGL 4.6! Błąd podczas inicjowania OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Twoja karta graficzna może nie obsługiwać OpenGL 4.6 lub nie masz najnowszych sterowników karty graficznej.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Twoja karta graficzna może nie obsługiwać co najmniej jednego wymaganego rozszerzenia OpenGL. Upewnij się, że masz najnowsze sterowniki karty graficznej<br><br>GL Renderer:<br>%1<br><br>Nieobsługiwane rozszerzenia:<br>%2 @@ -6937,128 +7005,128 @@ Czy chcesz to ominąć i mimo to wyjść? GameList - + Favorite Ulubione - + Start Game Uruchom grę - + Start Game without Custom Configuration Uruchom grę bez niestandardowej konfiguracji - + Open Save Data Location Otwórz lokalizację zapisów - + Open Mod Data Location Otwórz lokalizację modyfikacji - + Open Transferable Pipeline Cache Otwórz Transferowalną Pamięć Podręczną Pipeline - + Remove Usuń - + Remove Installed Update Usuń zainstalowaną łatkę - + Remove All Installed DLC Usuń wszystkie zainstalowane DLC - + Remove Custom Configuration Usuń niestandardową konfigurację - + Remove Play Time Data - + Remove Cache Storage Usuń pamięć podręczną - + Remove OpenGL Pipeline Cache Usuń Pamięć Podręczną Pipeline OpenGL - + Remove Vulkan Pipeline Cache Usuń Pamięć Podręczną Pipeline Vulkan - + Remove All Pipeline Caches Usuń całą pamięć podręczną Pipeline - + Remove All Installed Contents Usuń całą zainstalowaną zawartość - + Dump RomFS Zrzuć RomFS - + Dump RomFS to SDMC Zrzuć RomFS do SDMC - + Verify Integrity - + Copy Title ID to Clipboard Kopiuj identyfikator gry do schowka - + Navigate to GameDB entry Nawiguj do wpisu kompatybilności gry - + Create Shortcut Utwórz skrót - + Add to Desktop Dodaj do pulpitu - + Add to Applications Menu Dodaj do menu aplikacji - + Configure Game @@ -7067,62 +7135,62 @@ Czy chcesz to ominąć i mimo to wyjść? Właściwości - + Scan Subfolders Skanuj podfoldery - + Remove Game Directory Usuń katalog gier - + ▲ Move Up ▲ Przenieś w górę - + ▼ Move Down ▼ Przenieś w dół - + Open Directory Location Otwórz lokalizacje katalogu - + Clear Wyczyść - + Name Nazwa gry - + Compatibility Kompatybilność - + Add-ons Dodatki - + File type Typ pliku - + Size Rozmiar - + Play time @@ -7130,62 +7198,62 @@ Czy chcesz to ominąć i mimo to wyjść? GameListItemCompat - + Ingame W grze - + Game starts, but crashes or major glitches prevent it from being completed. Gra uruchamia się, ale awarie lub poważne błędy uniemożliwiają jej ukończenie. - + Perfect Perfekcyjnie - + Game can be played without issues. Można grać bez problemów. - + Playable Grywalna - + Game functions with minor graphical or audio glitches and is playable from start to finish. Gra działa z drobnymi błędami graficznymi lub dźwiękowymi oraz jest grywalna od początku aż do końca. - + Intro/Menu Intro/Menu - + Game loads, but is unable to progress past the Start Screen. Gra się ładuje, ale nie może przejść przez ekran początkowy. - + Won't Boot Nie uruchamia się - + The game crashes when attempting to startup. Ta gra się zawiesza przy próbie startu. - + Not Tested Nie testowane - + The game has not yet been tested. Ta gra nie została jeszcze przetestowana. @@ -7193,7 +7261,7 @@ Czy chcesz to ominąć i mimo to wyjść? GameListPlaceholder - + Double-click to add a new folder to the game list Kliknij podwójnie aby dodać folder do listy gier @@ -7201,21 +7269,20 @@ Czy chcesz to ominąć i mimo to wyjść? GameListSearchField - + %1 of %n result(s) 1 z %n rezultatów %1 z %n rezultatów - %1 z %n rezultatów - + Filter: Filter: - + Enter pattern to filter Wpisz typ do filtra @@ -7297,7 +7364,7 @@ Czy chcesz to ominąć i mimo to wyjść? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7311,190 +7378,190 @@ Komunikat debugowania: Hotkeys - + Audio Mute/Unmute Wycisz/Odcisz Audio - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Okno główne - + Audio Volume Down Zmniejsz głośność dźwięku - + Audio Volume Up Zwiększ głośność dźwięku - + Capture Screenshot Zrób zrzut ekranu - + Change Adapting Filter Zmień filtr adaptacyjny - + Change Docked Mode Zmień tryb dokowania - + Change GPU Accuracy Zmień dokładność GPU - + Configure - + Configure Current Game - + Continue/Pause Emulation Kontynuuj/Zatrzymaj Emulację - + Exit Fullscreen Wyłącz Pełny Ekran + + + Exit Eden + + Exit yuzu Wyjdź z yuzu - - Exit eden - - - - + Fullscreen Pełny ekran - + Load File Załaduj plik... - + Load/Remove Amiibo Załaduj/Usuń Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Zrestartuj Emulację - + Stop Emulation Zatrzymaj Emulację - + TAS Record Nagrywanie TAS - + TAS Reset Reset TAS - + TAS Start/Stop TAS Start/Stop - + Toggle Filter Bar Pokaż pasek filtrowania - + Toggle Framerate Limit Przełącz limit liczby klatek na sekundę - + Toggle Mouse Panning Włącz przesuwanie myszką - + Toggle Renderdoc Capture - + Toggle Status Bar Przełącz pasek stanu @@ -7502,22 +7569,22 @@ Komunikat debugowania: InstallDialog - + Please confirm these are the files you wish to install. Potwierdź, że są to pliki, które chcesz zainstalować. - + Installing an Update or DLC will overwrite the previously installed one. Zainstalowanie łatki lub DLC spowoduje nadpisanie poprzednio zainstalowanego. - + Install Zainstaluj - + Install Files to NAND Zainstaluj pliki na NAND @@ -7525,7 +7592,7 @@ Komunikat debugowania: LimitableInputDialog - + The text can't contain any of the following characters: %1 Tekst nie może zawierać tych znaków: @@ -7672,152 +7739,207 @@ Komunikat debugowania: &Ostatnie Pliki - + + Open &Eden Folders + + + + &Emulation &Emulacja - + &View &Widok - + &Reset Window Size &Zresetuj Rozmiar Okna - + &Debugging &Debugowanie - + Reset Window Size to &720p Zresetuj rozmiar okna do &720p - + Reset Window Size to 720p Zresetuj rozmiar okna do 720p - + Reset Window Size to &900p Zresetuj Rozmiar okna do &900p - + Reset Window Size to 900p Zresetuj Rozmiar okna do 900p - + Reset Window Size to &1080p Zresetuj rozmiar okna do &1080p - + Reset Window Size to 1080p Zresetuj rozmiar okna do 1080p - + &Multiplayer &Multiplayer - + &Tools &Narzędzia - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Pomoc - + &Install Files to NAND... &Zainstaluj pliki na NAND... - + L&oad File... Z&aładuj Plik... - + Load &Folder... Załaduj &Folder... - + E&xit &Wyjście - + &Pause &Pauza - + &Stop &Stop - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7826,97 +7948,97 @@ Komunikat debugowania: &O yuzu - + Single &Window Mode Tryb &Pojedyńczego Okna - + Con&figure... Kon&figuruj... - + Ctrl+, - + Display D&ock Widget Headers Wyłącz Nagłówek Widżetu Docku - + Show &Filter Bar Pokaż &Pasek Filtrów - + Show &Status Bar Pokaż &Pasek Statusu - + Show Status Bar Pokaż pasek statusu - + &Browse Public Game Lobby &Przeglądaj publiczne lobby gier - + &Create Room &Utwórz Pokój - + &Leave Room &Wyjdź z Pokoju - + &Direct Connect to Room &Bezpośrednie połączenie z pokojem - + &Show Current Room &Pokaż bieżący pokój - + F&ullscreen P&ełny Ekran - + &Restart &Restart - + Load/Remove &Amiibo... Załaduj/Usuń &Amiibo... - + &Report Compatibility &Zraportuj Kompatybilność - + Open &Mods Page Otwórz &Stronę z Modami - + Open &Quickstart Guide Otwórz &Poradnik Szybkiego Startu - + &FAQ &FAQ @@ -7925,77 +8047,82 @@ Komunikat debugowania: Otwórz &Folder yuzu - + &Capture Screenshot &Zrób Zdjęcie - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... &Skonfiguruj TAS - + Configure C&urrent Game... Skonfiguruj O&becną Grę... - + &Start &Start - + &Reset &Zresetuj - + R&ecord N&agraj - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -8003,26 +8130,36 @@ Komunikat debugowania: MicroProfileDialog - &MicroProfile - &MikroProfil + &MikroProfil MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8082,37 +8219,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Bieżący stan połączenia - + Not Connected. Click here to find a room! Nie połączono. Kliknij tutaj aby znaleźć pokój! - + Not Connected Nie połączono - + Connected Połączony - + New Messages Received Otrzymano nowe wiadomości - + Error Błąd - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Nie udało się zaktualizować informacji o pokoju. Sprawdź swoje połączenie internetowe i spróbuj ponownie zahostować pokój. @@ -8304,56 +8441,56 @@ p, li { white-space: pre-wrap; } Nie gra w żadną grę - + Installed SD Titles Zainstalowane tytuły SD - + Installed NAND Titles Zainstalowane tytuły NAND - + System Titles Tytuły systemu - + Add New Game Directory Dodaj nowy katalog gier - + Favorites Ulubione - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [nie ustawione] @@ -8364,14 +8501,14 @@ p, li { white-space: pre-wrap; } Krzyżak %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Oś %1%2 @@ -8382,357 +8519,357 @@ p, li { white-space: pre-wrap; } Przycisk %1 - - - - - - + + + + + + [unknown] [nieznane] - - - + + + Left Lewo - - - + + + Right Prawo - - - + + + Down Dół - - - + + + Up Góra - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Kółko - - + + Cross Krzyż - - + + Square Kwadrat - - + + Triangle Trójkąt - - + + Share Udostępnij - - + + Options Opcje - - + + [undefined] [niezdefiniowane] - + %1%2 %1%2 - - + + [invalid] [niepoprawne] - - + + %1%2Hat %3 %1%2Drążek %3 - - - + + + %1%2Axis %3 %1%2Oś %3 - - + + %1%2Axis %3,%4,%5 %1%2Oś %3,%4,%5 - - + + %1%2Motion %3 %1%2Ruch %3 - - + + %1%2Button %3 %1%2Przycisk %3 - - + + [unused] [nieużywane] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Lewa gałka - + Stick R Prawa gałka - + Plus Plus - + Minus Minus - - + + Home Home - + Capture Zrzut ekranu - + Touch Dotyk - + Wheel Indicates the mouse wheel Kółko - + Backward Do tyłu - + Forward Do przodu - + Task Zadanie - + Extra Dodatkowe - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Krzyżak %4 - - + + %1%2%3Axis %4 %1%2%3Oś %4 - - + + %1%2%3Button %4 %1%2%3Przycisk %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8850,6 +8987,298 @@ p, li { white-space: pre-wrap; } Czy chcesz odnowić to amiibo? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Anuluj + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + Operacja zakończona sukcesem. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Błąd podczas usuwania zawartości + + + + Error Removing Update + Błąd podczas usuwania aktualizacji + + + + Error Removing DLC + Błąd podczas usuwania dodatków + + + + The base game is not installed in the NAND and cannot be removed. + Gra nie jest zainstalowana w NAND i nie może zostać usunięta. + + + + There is no update installed for this title. + Brak zainstalowanych łatek dla tego tytułu. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Pomyślnie usunięto + + + + Successfully removed %1 installed DLC. + Pomyślnie usunięto %1 zainstalowane DLC. + + + + + Error Removing Transferable Shader Cache + Błąd podczas usuwania przenośnej pamięci podręcznej Shaderów. + + + + + A shader cache for this title does not exist. + Pamięć podręczna Shaderów dla tego tytułu nie istnieje. + + + + Successfully removed the transferable shader cache. + Pomyślnie usunięto przenośną pamięć podręczną Shaderów. + + + + Failed to remove the transferable shader cache. + Nie udało się usunąć przenośnej pamięci Shaderów. + + + + Error Removing Vulkan Driver Pipeline Cache + Błąd podczas usuwania pamięci podręcznej strumienia sterownika Vulkana + + + + Failed to remove the driver pipeline cache. + Błąd podczas usuwania pamięci podręcznej strumienia sterownika. + + + + + Error Removing Transferable Shader Caches + Błąd podczas usuwania Transferowalnych Shaderów + + + + Successfully removed the transferable shader caches. + Pomyślnie usunięto transferowalne shadery. + + + + Failed to remove the transferable shader cache directory. + Nie udało się usunąć ścieżki transferowalnych shaderów. + + + + + Error Removing Custom Configuration + Błąd podczas usuwania niestandardowej konfiguracji + + + + A custom configuration for this title does not exist. + Niestandardowa konfiguracja nie istnieje dla tego tytułu. + + + + Successfully removed the custom game configuration. + Pomyślnie usunięto niestandardową konfiguracje gry. + + + + Failed to remove the custom game configuration. + Nie udało się usunąć niestandardowej konfiguracji gry. + + + + Reset Metadata Cache + Zresetuj pamięć podręczną metadanych + + + + The metadata cache is already empty. + Pamięć podręczna metadanych jest już pusta. + + + + The operation completed successfully. + Operacja zakończona sukcesem. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Nie udało się usunąć pamięci podręcznej metadanych. Może być używana lub nie istnieje. + + + + Create Shortcut + Utwórz skrót + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Pomyślnie utworzono skrót do %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Utworzy to skrót do obecnego AppImage. Może nie działać dobrze po aktualizacji. Kontynuować? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Utwórz ikonę + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Nie można utworzyć pliku ikony. Ścieżka "%1" nie istnieje oraz nie może być utworzona. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9145,7 +9574,7 @@ Spróbuj ponownie lub skontaktuj się z twórcą oprogramowania. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9153,7 +9582,7 @@ Spróbuj ponownie lub skontaktuj się z twórcą oprogramowania. %2 - + Users Użytkownicy @@ -9277,7 +9706,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Stos wywołań @@ -9285,12 +9714,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread czekam bez żadnego wątku @@ -9298,102 +9727,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable Jakoś działa - + paused Spauzowana - + sleeping spanie - + waiting for IPC reply czekam na odpowiedź IPC - + waiting for objects oczekiwanie na obiekty - + waiting for condition variable oczekiwanie na zmienną warunkową - + waiting for address arbiter czekam na arbitra adresu - + waiting for suspend resume czekam na zawieszenie wznowienia - + waiting oczekiwanie - + initialized zainicjowano - + terminated zakończony - + unknown nieznany - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal Idealnie - + core %1 rdzeń %1 - + processor = %1 procesor = %1 - + affinity mask = %1 maska powinowactwa = %1 - + thread id = %1 identyfikator wątku = %1 - + priority = %1(current) / %2(normal) piorytet = %1(obecny) / %2(normalny) - + last running ticks = %1 ostatnie działające kleszcze = %1 @@ -9401,7 +9830,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread czekanie na wątek @@ -9409,7 +9838,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Drzewo Czekania diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 9fa987646b..79e88d1eb7 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Comunicando com o servidor... - + Cancel Cancelar - + Touch the top left corner <br>of your touchpad. Toque no canto superior esquerdo <br>do seu touchpad - + Now touch the bottom right corner <br>of your touchpad. Agora toque no canto inferior direito <br>do seu touchpad - + Configuration completed! Configuração concluída! - + OK OK @@ -397,134 +397,134 @@ Isto banirá tanto o nome de usuário do fórum como o endereço IP. ConfigurationShared - + % % - + Amiibo editor Editor de Amiibo - + Controller configuration Configuração de controles - + Data erase Apagamento de dados - + Error Erro - + Net connect Conectar à rede - + Player select Seleção de jogador - + Software keyboard Teclado do software - + Mii Edit Editar Mii - + Online web Rede online - + Shop Loja - + Photo viewer Visualizador de imagens - + Offline web Rede offline - + Login share Compartilhamento de Login - + Wifi web auth Autenticação web por Wifi - + My page Minha página - + Output Engine: Mecanismo de Saída: - + Output Device: Dispositivo de Saída - + Input Device: Dispositivo de Entrada - + Mute audio Mutar Áudio - + Volume: Volume: - + Mute audio when in background Silencia o áudio quando a janela ficar em segundo plano - + Multicore CPU Emulation Emulação de CPU multinúcleo - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Esta opção aumenta o uso de threads de emulação da CPU de 1 para o máximo de 4 do switch. Isso é prioritariamente uma opção de depuração e não deve ser desabilitada. - + Memory Layout Layout de Memória - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ Isso não melhora a estabilidade ou performance e só serve para comportar grand Habilitar essa opção aumentará o uso de memória. Não é recomendado habilitar isso a não ser que um jogo específico com um mod de textura precise. - + Limit Speed Percent Limitar percentual de velocidade - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,141 +547,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Precisão: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Esta configuração controla a precisão da CPU emulada. Não altere isso a menos que saiba o que está fazendo. - - + + Backend: Backend: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Não usar FMA (melhora o desempenho em CPUs sem FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Essa opção melhora a velocidade ao reduzir a precisão de instruções de fused-multiply-add em CPUs sem suporte nativo ao FMA. - + Faster FRSQRTE and FRECPE FRSQRTE e FRECPE mais rápidos - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Essa opção melhora a velocidade de algumas funções aproximadas de pontos flutuantes ao usar aproximações nativas menos precisas. - + Faster ASIMD instructions (32 bits only) Instruções ASIMD mais rápidas (apenas 32 bits) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Essa opção melhora a velocidade de funções de pontos flutuantes de 32 bits ASIMD ao executá-las com modos de arredondamento incorretos. - + Inaccurate NaN handling Tratamento impreciso de NaN - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Esta opção melhora a velocidade ao remover a checagem NaN. Por favor, note que isso também reduzirá a precisão de certas instruções de ponto flutuante. - + Disable address space checks Desativar a verificação do espaço de endereços - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Esta opção melhora a velocidade ao eliminar a checagem de segurança antes de cada leitura/escrita de memória no dispositivo convidado. Desabilitar essa opção pode permitir que um jogo leia/escreva na memória do emulador. - + Ignore global monitor Ignorar monitor global - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. Esta opção melhora a velocidade ao depender apenas das semânticas do cmpxchg pra garantir a segurança das instruções de acesso exclusivo. Por favor, note que isso pode resultar em travamentos e outras condições de execução. - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Alterna entre as APIs gráficas disponíveis. Vulkan é a recomendada na maioria dos casos. - + Device: Dispositivo: - + This setting selects the GPU to use with the Vulkan backend. Esta opção seleciona a GPU a ser usada com a Vulkan. - + Shader Backend: Backend de Shaders: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -692,12 +669,12 @@ GLASM é um backend exclusivo descontinuado da NVIDIA que oferece uma performanc SPIR-V é o mais rápido ao compilar shaders, mas produz resultados ruins na maioria dos drivers de GPU. - + Resolution: Resolução: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -706,27 +683,27 @@ Resoluções maiores requerem mais VRAM e largura de banda. Opções menores do que 1X podem causar problemas na renderização. - + Window Adapting Filter: Filtro de adaptação de janela: - + FSR Sharpness: Nitidez do FSR: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Determina a nitidez da imagem ao utilizar o contraste dinâmico do FSR. - + Anti-Aliasing Method: Método de Anti-Aliasing: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -735,12 +712,12 @@ SMAA oferece a melhor qualidade. FXAA tem um impacto menor na performance e pode produzir uma imagem melhor e mais estável em resoluções muito baixas. - + Fullscreen Mode: Modo de Tela Cheia: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -749,12 +726,12 @@ Sem borda oferece a melhor compatibilidade com o teclado na tela que alguns jogo Tela cheia exclusiva pode oferecer melhor performance e melhor suporte a Freesync/Gsync. - + Aspect Ratio: Proporção de Tela: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -763,49 +740,36 @@ Jogos do Switch somente suportam 16:9, por isso mods customizados por jogo são Isso também controla a proporção de aspecto de capturas de telas. - + Use disk pipeline cache Usar cache de pipeline em disco - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite guardar os shaders para carregar os jogos nas execuções seguintes. Desabiltar essa opção só serve para propósitos de depuração. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Usar emulação assíncrona da GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa uma thread de CPU extra para renderização. Esta opção deve estar sempre habilitada. - + NVDEC emulation: Emulação NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -814,12 +778,12 @@ Tanto a CPU quanto a GPU podem ser utilizadas para decodificação, ou não deco Na maioria dos casos, a decodificação pela GPU fornece uma melhor performance. - + ASTC Decoding Method: Método de Decodificação ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -832,34 +796,33 @@ CPU de Forma Assíncrona: Usa a CPU para decodificar texturas ASTC à medida que decodificação ASTC ao custo de problemas na renderização enquanto as texturas estão sendo decodificadas. - + ASTC Recompression Method: Método de Recompressão ASTC: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Quase todas as GPUs de desktop e laptop não possuem suporte para texturas ASTC, o que força o emulador a descompactá-las para um formato intermediário que qualquer placa suporta, o RGBA8. Esta opção recompacta o RGBA8 ou pro formato BC1 ou pro BC3, economizando VRAM mas afetando negativamente a qualidade da imagem. - + VRAM Usage Mode: Modo de Uso da VRAM: - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - Define se o emulador deve preferir conservar ou fazer o uso máximo da memória de vídeo disponível para melhorar a performance. Não tem efeito em gráficos integrados. O modo Agressivo pode impactar fortemente na performance de outras aplicações, tipo programas de gravação de tela. + Define se o emulador deve preferir conservar ou fazer o uso máximo da memória de vídeo disponível para melhorar a performance. Não tem efeito em gráficos integrados. O modo Agressivo pode impactar fortemente na performance de outras aplicações, tipo programas de gravação de tela. - + VSync Mode: Modo de VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -870,51 +833,49 @@ Caixa de entrada pode ter a latência mais baixa do que o FIFO e não causa tear Imediata (sem sincronização) simplesmente apresenta o que estiver disponível e pode exibir tearing. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar velocidade máxima (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir sua velocidade. - + Anisotropic Filtering: Filtragem anisotrópica: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. Controla a qualidade da renderização de texturas em ângulos oblíquos. É uma configuração leve, e é seguro deixar em 16x na maioria das GPUs. - Accuracy Level: - Nível de precisão: + Nível de precisão: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - Precisão da emulação da GPU. + Precisão da emulação da GPU. A maioria dos jogos renderiza bem na precisão Normal, mas a Alta ainda é obrigatória para alguns. Partículas tendem a renderizar corretamente somente com a precisão Alta. Extrema só deve ser utilizada para depuração. @@ -922,12 +883,12 @@ Esta opção pode ser alterada durante o jogo. Alguns jogos podem exigir serem iniciados na precisão alta pra renderizarem corretamente. - + Use asynchronous shader building (Hack) Usar compilação assíncrona de shaders (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Ativa a compilação de shaders assíncrona, o que pode reduzir engasgos. @@ -942,24 +903,24 @@ Esta opção é experimental. Ativa um tempo de resposta rápido da GPU. Esta opção forçará a maioria dos jogos a rodar em sua resolução nativa mais alta. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Ativa o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipelines de Computação (Somente Vulkan da Intel) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -968,111 +929,111 @@ Essa configuração só existe para drivers proprietários Intel, e pode travar Pipelines de computação estão sempre habilitadas em todos os outros drivers. - + Enable Reactive Flushing Ativar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + RNG Seed Semente RNG - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. Controla a semente do gerador de números aleatórios. Usado principalmente para propósitos de speedrunning. - + Device Name Nome do Dispositivo - + The name of the emulated Switch. O nome do Switch emulado. - + Custom RTC Date: Data personalizada do sistema: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Esta opção permite alterar o relógio do Switch emulado. Pode ser utilizada para manipular o tempo nos jogos. - + Language: Idioma: - + Note: this can be overridden when region setting is auto-select Nota: isso pode ser substituído caso a configuração de região automática esteja ativada - + Region: Região: - + The region of the emulated Switch. A região do Switch emulado. - + Time Zone: Fuso horário: - + The time zone of the emulated Switch. O fuso horário do Switch emulado. - + Sound Output Mode: Modo de Saída de Som: - + Console Mode: Modo Console: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1081,7 +1042,7 @@ Os jogos mudarão suas resoluções, detalhes e controles suportados de acordo c Configurar essa opção para o Modo Portátil pode ajudar a melhorar a performance em sistemas mais fracos. - + Prompt for user on game boot Escolher um usuário ao iniciar um jogo @@ -1090,7 +1051,7 @@ Configurar essa opção para o Modo Portátil pode ajudar a melhorar a performan Pede para selecionar um perfil de usuário a cada boot, útil se várias pessoas utilizam o yuzu no mesmo PC. - + Pause emulation when in background Pausar emulação quando a janela ficar em segundo plano @@ -1099,843 +1060,992 @@ Configurar essa opção para o Modo Portátil pode ajudar a melhorar a performan Esta opção pausa o yuzu quando outras janelas estão ativas. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Confirmar antes de parar a emulação - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Esta configuração desconsidera as solicitações dos jogos que pedem pra confirmarem a interrupção deles. Ativar essa configuração ignora essas solicitações e sai da emulação direto. - + Hide mouse on inactivity Esconder cursor do mouse enquanto ele estiver inativo - + This setting hides the mouse after 2.5s of inactivity. Esta configuração esconde o mouse após 2,5s de inatividade. - + Disable controller applet Desativar miniaplicativo dos controles - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Força a desativação do uso do miniaplicativo dos controles pelos dispositivos convidados. Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele é imediatamente fechado. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Ativar Gamemode - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - + Conservative Conservador - + Aggressive Agressivo - + OpenGL OpenGL - + Vulkan Vulkan - + Null Nenhuma (desativado) - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (Shaders Assembly, apenas NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (Experimental, Somente para AMD/Mesa) - + Normal Normal - + High Alta - + Extreme Extrema - + Auto Automática - + Accurate Precisa - + Unsafe Não segura - + Paranoid (disables most optimizations) Paranoica (desativa a maioria das otimizações) - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela em Tela Cheia - + Exclusive Fullscreen Tela Cheia Exclusiva - + No Video Output Sem Saída de Vídeo - + CPU Video Decoding Decodificação de Vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de Vídeo pela GPU (Padrão) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolution - - Area - - - - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à janela - + Automatic Automática - + + Default Padrão - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japônes (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico (British English) - + Canadian French Francês canadense (Canadian French) - + Latin American Spanish Espanhol latino-americano - + Simplified Chinese Chinês simplificado - + Traditional Chinese (正體中文) Chinês tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil - - + + Serbian (српски) + + + + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coréia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Ilhas Marshall - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1944,37 +2054,37 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele 8GB DRAM (Não seguro) - + Docked Modo TV - + Handheld Portátil - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar @@ -2329,27 +2439,27 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele Registros de depuração - + Open Log Location Abrir local dos registros - + Global Log Filter Filtro global de registros - + When checked, the max size of the log increases from 100 MB to 1 GB Quando ativado, o tamanho máximo do arquivo de registro aumenta de 100 MB para 1 GB - + Enable Extended Logging** Ativar registros avançados** - + Show Log in Console Mostrar registro no console @@ -2495,7 +2605,7 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2557,7 +2667,7 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele **Isto será restaurado automaticamente assim que o yuzu for fechado. - + Web applet not compiled Miniaplicativo Web não compilado @@ -2607,7 +2717,7 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele - eden Configuration + Eden Configuration @@ -2616,88 +2726,88 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele Algumas configurações estão disponíveis apenas quando não houver nenhum jogo em execução. - + Applets Miniaplicativos - - + + Audio Áudio - - + + CPU CPU - + Debug Depuração - + Filesystem Sistema de arquivos - - + + General Geral - - + + Graphics Gráficos - + GraphicsAdvanced GráficosAvançado - + GraphicsExtensions - + Hotkeys Teclas de atalho - - + + Controls Controles - + Profiles Perfis - + Network Rede - - + + System Sistema - + Game List Lista de jogos - + Web Rede @@ -2795,51 +2905,45 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele - - - Reset Metadata Cache Restaurar cache de metadados - + Select Emulated NAND Directory... Selecione a pasta da NAND emulada... - + Select Emulated SD Directory... Selecione a pasta do SD emulado... - + Select Gamecard Path... Selecione o local do Gamecard... - + Select Dump Directory... Selecione a pasta de extração... - + Select Mod Load Directory... Selecione a pasta de carregamento de mods... - The metadata cache is already empty. - O cache de metadados já está vazio. + O cache de metadados já está vazio. - The operation completed successfully. - A operação foi concluída com sucesso. + A operação foi concluída com sucesso. - The metadata cache couldn't be deleted. It might be in use or non-existent. - O cache de metadados não pôde ser excluído. Ele pode estar em uso no momento ou não existe. + O cache de metadados não pôde ser excluído. Ele pode estar em uso no momento ou não existe. @@ -2870,12 +2974,12 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Isto restaura todas as configurações e exclui as configurações individuais de todos os jogos. As pastas de jogos, perfis de jogos e perfis de controles não serão excluídos. Deseja prosseguir? @@ -2908,33 +3012,33 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele Cor de fundo: - + % FSR sharpening percentage (e.g. 50%) % - + Off Desligado - + VSync Off Desligar VSync - + Recommended Recomendado - + On Ligado - + VSync On Ligar VSync @@ -2971,14 +3075,18 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo dos controles, ele - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3010,75 +3118,75 @@ These settings are experimental, and may cause black screens. If your games fail Restaurar padrões - + Action Ação - + Hotkey Atalho - + Controller Hotkey Atalho do controle - - - + + + Conflicting Key Sequence Combinação de teclas já utilizada - - + + The entered key sequence is already assigned to: %1 A sequência de teclas pressionada já esta atribuída para: %1 - + [waiting] [aguardando] - + Invalid Inválido - + Invalid hotkey settings Configurações de atalho inválidas - + An error occurred. Please report this issue on github. Houve um erro. Por favor relate o problema no GitHub. - + Restore Default Restaurar padrão - + Clear Limpar - + Conflicting Button Sequence Sequência de botões conflitante - + The default button sequence is already assigned to: %1 A sequência de botões padrão já está vinculada a %1 - + The default key sequence is already assigned to: %1 A sequência de teclas padrão já esta atribuida para: %1 @@ -3398,7 +3506,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3553,7 +3661,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Analógico esquerdo @@ -3663,14 +3771,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3689,7 +3797,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Mais @@ -3702,15 +3810,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3755,7 +3863,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Analógico direito @@ -3770,242 +3878,242 @@ These settings are experimental, and may cause black screens. If your games fail Configurar - - - - + + + + Clear Limpar - - - - - + + + + + [not set] [não definido] - - - + + + Invert button Inverter botão - - + + Toggle button Alternar pressionamento do botão - + Turbo button Botão Turbo - - + + Invert axis Inverter eixo - - - + + + Set threshold Definir limite - - + + Choose a value between 0% and 100% Escolha um valor entre 0% e 100% - + Toggle axis Alternar eixos - + Set gyro threshold Definir limite do giroscópio - + Calibrate sensor Calibrar sensor - + Map Analog Stick Mapear analógico - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Após pressionar OK, mova o seu direcional analógico primeiro horizontalmente e depois verticalmente. Para inverter os eixos, mova seu analógico primeiro verticalmente e depois horizontalmente. - + Center axis Eixo central - - + + Deadzone: %1% Zona morta: %1% - - + + Modifier Range: %1% Alcance de modificador: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Par de Joycons - + Left Joycon Joycon Esquerdo - + Right Joycon Joycon Direito - + Handheld Portátil - + GameCube Controller Controle de GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Controle NES - + SNES Controller Controle SNES - + N64 Controller Controle N64 - + Sega Genesis Mega Drive - + Start / Pause Iniciar / Pausar - + Z Z - + Control Stick Direcional de controle - + C-Stick C-Stick - + Shake! Balance! - + [waiting] [esperando] - + New Profile Novo perfil - + Enter a profile name: Insira um nome para o perfil: - - + + Create Input Profile Criar perfil de controle - + The given profile name is not valid! O nome de perfil inserido não é válido! - + Failed to create the input profile "%1" Falha ao criar o perfil de controle "%1" - + Delete Input Profile Excluir perfil de controle - + Failed to delete the input profile "%1" Falha ao excluir o perfil de controle "%1" - + Load Input Profile Carregar perfil de controle - + Failed to load the input profile "%1" Falha ao carregar o perfil de controle "%1" - + Save Input Profile Salvar perfil de controle - + Failed to save the input profile "%1" Falha ao salvar o perfil de controle "%1" @@ -4062,7 +4170,7 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori - + Configure Configurar @@ -4098,7 +4206,7 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori - + Test Teste @@ -4117,7 +4225,7 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Saiba mais</span></a> - + %1:%2 %1:%2 @@ -4126,77 +4234,77 @@ Para inverter os eixos, mova seu analógico primeiro verticalmente e depois hori yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters O número da porta tem caracteres inválidos - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 A porta tem que estar entre 0 e 65353 - + IP address is not valid O endereço IP não é válido - + This UDP server already exists Este servidor UDP já existe - + Unable to add more than 8 servers Não é possível adicionar mais de 8 servidores - + Testing Testando - + Configuring Configurando - + Test Successful Teste bem-sucedido - + Successfully received data from the server. Dados foram recebidos do servidor com sucesso. - + Test Failed O teste falhou - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Não foi possível receber dados válidos do servidor.<br>Verifique se o servidor foi configurado corretamente e o endereço e porta estão corretos. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Um teste UDP ou configuração de calibração está em curso no momento.<br>Aguarde até a sua conclusão. @@ -4323,7 +4431,12 @@ Os valores atuais são %1% e %2% respectivamente. Interface de rede - + + Enable Airplane Mode + + + + None Nenhum @@ -4381,52 +4494,52 @@ Os valores atuais são %1% e %2% respectivamente. Algumas configurações estão disponíveis apenas quando não houver nenhum jogo em execução. - + Add-Ons Adicionais - + System Sistema - + CPU CPU - + Graphics Gráficos - + Adv. Graphics Gráf. avançados - + GPU Extensions - + Audio Áudio - + Input Profiles Perfis de Controle - + Linux Linux - + Properties Propriedades @@ -4444,12 +4557,12 @@ Os valores atuais são %1% e %2% respectivamente. Adicionais - + Patch Name Nome do patch - + Version Versão @@ -4487,27 +4600,32 @@ Os valores atuais são %1% e %2% respectivamente. Definir imagem - + + Select Avatar + + + + Add Adicionar - + Rename Renomear - + Remove Excluir - + Profile management is available only when game is not running. Esta tela só fica disponível apenas quando não houver nenhum jogo em execução. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4515,100 +4633,189 @@ Os valores atuais são %1% e %2% respectivamente. %2 - + Enter Username Escreva o nome de usuário - + Users Usuários - + Enter a username for the new user: Digite o nome do novo usuário: - + Enter a new username: Digite um novo nome de usuário: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Selecione a imagem do usuário - - JPEG Images (*.jpg *.jpeg) - Imagens JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Nenhum firmware disponível + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Imagens JPEG (*.jpg *.jpeg) + + + Error deleting image Erro ao excluir a imagem - + Error occurred attempting to overwrite previous image at: %1. Ocorreu um erro ao tentar substituir a imagem anterior em: %1. - + Error deleting file Erro ao excluir arquivo - + Unable to delete existing file: %1. Não foi possível excluir o arquivo existente: %1. - + Error creating user image directory Erro ao criar a pasta de imagens do usuário - + Unable to create directory %1 for storing user images. Não foi possível criar a pasta %1 para armazenar as imagens do usuário. - Error copying user image - Erro ao copiar a imagem do usuário + Erro ao copiar a imagem do usuário - Unable to copy image from %1 to %2 - Não foi possível copiar a imagem de %1 para %2 + Não foi possível copiar a imagem de %1 para %2 - Error resizing user image - Erro no redimensionamento da imagem do usuário + Erro no redimensionamento da imagem do usuário - Unable to resize image - Não foi possível redimensionar a imagem + Não foi possível redimensionar a imagem + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Cancelar + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Apagar esse usuário? Todos os dados salvos desse usuário serão removidos. - + Confirm Delete Confirmar exclusão - + Name: %1 UUID: %2 Nome: %1 @@ -4661,7 +4868,7 @@ UUID: %2 - + Enable Ativar @@ -4672,7 +4879,7 @@ UUID: %2 - + Not connected Não conectado @@ -4682,63 +4889,63 @@ UUID: %2 Restaurar padrões - + Clear Limpar - + [not set] [não definido] - + Invert axis Inverter eixo - - + + Deadzone: %1% Zona morta: %1% - + Error enabling ring input Erro ao ativar o comando do Ring-Con - + Direct Joycon driver is not enabled Driver direto do Joycon não está ativado - + Configuring Configurando - + The current mapped device doesn't support the ring controller O dispositivo atualmente mapeado não suporta o Ring-Con - + The current mapped device doesn't have a ring attached O dispositivo mapeado não tem um Ring-Con conectado - + The current mapped device is not connected O dispositivo atualmente mapeado não está conectado - + Unexpected driver result %1 Resultado inesperado do driver %1 - + [waiting] [aguardando] @@ -4780,7 +4987,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4832,12 +5039,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Configurar TAS - + Select TAS Load Directory... Selecionar diretório de carregamento TAS @@ -4947,7 +5154,7 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5267,6 +5474,16 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Web Service @@ -5276,42 +5493,29 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe Ao informar seu usuário e token, você concorda em permitir ao yuzu recolher dados de uso adicionais, que podem incluir informações de identificação de usuário. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verificar + Verificar - Sign up - Cadastrar-se + Cadastrar-se - + Token: Token: - + Username: Nome de usuário: - What is my token? - Qual é o meu token? + Qual é o meu token? - + Web Service configuration can only be changed when a public room isn't being hosted. A configuração do Serviço Web só pode ser alterada quando uma sala pública não está sendo hospedada. @@ -5336,12 +5540,12 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe Gerar um novo - + Discord Presence Presença no Discord - + Show Current Game in your Discord Status Mostrar o jogo atual no seu status do Discord @@ -5350,24 +5554,8 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Saiba mais</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Cadastrar-se</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Cadastrar-se</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5390,10 +5578,9 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe O token não foi verificado. A alteração no seu token não foi salva. - Unverified, please click Verify before saving configuration Tooltip - Não verificado, por favor clique sobre Verificar antes de salvar as configurações + Não verificado, por favor clique sobre Verificar antes de salvar as configurações Verifying... @@ -5417,20 +5604,67 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Falha na verificação. Verifique se o seu token foi inserido corretamente e se a sua conexão à internet está funcionando. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controle J1 - + &Controller P1 &Controle J1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versão + + DirectConnect @@ -5536,7 +5770,12 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5544,11 +5783,6 @@ Mova os pontos para mudar a posição, ou clique duas vezes nas células da tabe The host of the room has banned you. Speak with the host to unban you or try a different room. O anfitrião da sala baniu você. Fale com o anfitrião para que ele remova seu banimento ou tente uma sala diferente. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5610,7 +5844,7 @@ Vá para Configurar -> Sistema -> Rede e selecione uma. Telemetria - + Broken Vulkan Installation Detected Detectada Instalação Defeituosa do Vulkan @@ -5619,106 +5853,105 @@ Vá para Configurar -> Sistema -> Rede e selecione uma. A inicialização do Vulkan falhou durante a execução. <br><br>Clique <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>aqui para instruções de como resolver o problema</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Rodando um jogo - + Loading Web Applet... Carregando applet web... - - + + Disable Web Applet Desativar o applet da web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) A desativação do applet da web pode causar comportamento inesperado e deve apenas ser usada com Super Mario 3D All-Stars. Você deseja mesmo desativar o applet da web? (Ele pode ser reativado nas configurações de depuração.) - + The amount of shaders currently being built A quantidade de shaders sendo construídos - + The current selected resolution scaling multiplier. O atualmente multiplicador de escala de resolução selecionado. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidade atual de emulação. Valores maiores ou menores que 100% indicam que a emulação está rodando mais rápida ou lentamente que em um Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quantos quadros por segundo o jogo está exibindo atualmente. Isto irá variar de jogo para jogo e cena para cena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo que leva para emular um quadro do Switch, sem considerar o limitador de taxa de quadros ou a sincronização vertical. Um valor menor ou igual a 16.67 ms indica que a emulação está em velocidade plena. - + Unmute Tirar do mudo - + Mute Mudo - + Reset Volume Redefinir volume - + &Clear Recent Files &Limpar arquivos recentes - + &Continue &Continuar - + &Pause &Pausar - Warning Outdated Game Format - Aviso - formato de jogo desatualizado + Aviso - formato de jogo desatualizado You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Você está usando neste jogo o formato de ROM desconstruída e extraída em uma pasta, que é um formato desatualizado que foi substituído por outros, como NCA, NAX, XCI ou NSP. Pastas desconstruídas de ROMs não possuem ícones, metadados e suporte a atualizações.<br><br>Para saber mais sobre os vários formatos de ROMs de Switch compatíveis com o yuzu, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>confira a nossa wiki</a>. Esta mensagem não será exibida novamente. - - + + Error while loading ROM! Erro ao carregar a ROM! - + The ROM format is not supported. O formato da ROM não é suportado. - + An error occurred initializing the video core. Ocorreu um erro ao inicializar o núcleo de vídeo. @@ -5727,7 +5960,7 @@ Vá para Configurar -> Sistema -> Rede e selecione uma. yuzu encontrou um erro enquanto rodando o núcleo de vídeo. Normalmente isto é causado por drivers de GPU desatualizados, incluindo integrados. Por favor veja o registro para mais detalhes. Para mais informações em acesso ao registro por favor veja a seguinte página: <a href='https://yuzu-emu.org/help/reference/log-files/'>Como fazer envio de arquivo de registro</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Erro ao carregar a ROM! %1 @@ -5738,473 +5971,405 @@ Vá para Configurar -> Sistema -> Rede e selecione uma. %1<br>Por favor, siga <a href='https://yuzu-emu.org/help/quickstart/'>o guia de início rápido</a> para reextrair os seus arquivos.<br>Você pode consultar a wiki do yuzu</a> ou o Discord do yuzu</a> para obter ajuda. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Ocorreu um erro desconhecido. Consulte o registro para mais detalhes. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Encerrando software... - + Save Data Dados de jogos salvos - + Mod Data Dados de mods - + Error Opening %1 Folder Erro ao abrir a pasta %1 - - + + Folder does not exist! A pasta não existe! - Error Opening Transferable Shader Cache - Erro ao abrir o cache de shaders transferível + Erro ao abrir o cache de shaders transferível - Failed to create the shader cache directory for this title. - Falha ao criar o diretório de cache de shaders para este título. + Falha ao criar o diretório de cache de shaders para este título. - Error Removing Contents - Erro ao Remover Conteúdos + Erro ao Remover Conteúdos - Error Removing Update - Erro ao Remover Atualização + Erro ao Remover Atualização - Error Removing DLC - Erro ao Remover DLC + Erro ao Remover DLC - + Remove Installed Game Contents? Remover Conteúdo do Jogo Instalado? - + Remove Installed Game Update? Remover Atualização do Jogo Instalada? - + Remove Installed Game DLC? Remover DLC do Jogo Instalada? - + Remove Entry Remover item - - - - - - Successfully Removed - Removido com sucesso + Removido com sucesso - Successfully removed the installed base game. - O jogo base foi removido com sucesso. + O jogo base foi removido com sucesso. - The base game is not installed in the NAND and cannot be removed. - O jogo base não está instalado na NAND e não pode ser removido. + O jogo base não está instalado na NAND e não pode ser removido. - Successfully removed the installed update. - A atualização instalada foi removida com sucesso. + A atualização instalada foi removida com sucesso. - There is no update installed for this title. - Não há nenhuma atualização instalada para este título. + Não há nenhuma atualização instalada para este título. - There are no DLC installed for this title. - Não há nenhum DLC instalado para este título. + Não há nenhum DLC instalado para este título. - Successfully removed %1 installed DLC. - %1 DLC(s) instalados foram removidos com sucesso. + %1 DLC(s) instalados foram removidos com sucesso. - + Delete OpenGL Transferable Shader Cache? Apagar o cache de shaders transferível do OpenGL? - + Delete Vulkan Transferable Shader Cache? Apagar o cache de shaders transferível do Vulkan? - + Delete All Transferable Shader Caches? Apagar todos os caches de shaders transferíveis? - + Remove Custom Game Configuration? Remover configurações customizadas do jogo? - + Remove Cache Storage? Remover Armazenamento do Cache? - + Remove File Remover arquivo - + Remove Play Time Data Remover Dados de Tempo Jogado - + Reset play time? Deseja mesmo redefinir o tempo jogado? - - Error Removing Transferable Shader Cache - Erro ao remover cache de shaders transferível + Erro ao remover cache de shaders transferível - - A shader cache for this title does not exist. - Não existe um cache de shaders para este título. + Não existe um cache de shaders para este título. - Successfully removed the transferable shader cache. - O cache de shaders transferível foi removido com sucesso. + O cache de shaders transferível foi removido com sucesso. - Failed to remove the transferable shader cache. - Falha ao remover o cache de shaders transferível. + Falha ao remover o cache de shaders transferível. - Error Removing Vulkan Driver Pipeline Cache - Erro ao Remover Cache de Pipeline do Driver Vulkan + Erro ao Remover Cache de Pipeline do Driver Vulkan - Failed to remove the driver pipeline cache. - Falha ao remover o pipeline de cache do driver. + Falha ao remover o pipeline de cache do driver. - - Error Removing Transferable Shader Caches - Erro ao remover os caches de shaders transferíveis + Erro ao remover os caches de shaders transferíveis - Successfully removed the transferable shader caches. - Os caches de shaders transferíveis foram removidos com sucesso. + Os caches de shaders transferíveis foram removidos com sucesso. - Failed to remove the transferable shader cache directory. - Falha ao remover o diretório do cache de shaders transferível. + Falha ao remover o diretório do cache de shaders transferível. - - Error Removing Custom Configuration - Erro ao remover as configurações customizadas do jogo. + Erro ao remover as configurações customizadas do jogo. - A custom configuration for this title does not exist. - Não há uma configuração customizada para este título. + Não há uma configuração customizada para este título. - Successfully removed the custom game configuration. - As configurações customizadas do jogo foram removidas com sucesso. + As configurações customizadas do jogo foram removidas com sucesso. - Failed to remove the custom game configuration. - Falha ao remover as configurações customizadas do jogo. + Falha ao remover as configurações customizadas do jogo. - - + + RomFS Extraction Failed! Falha ao extrair RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Houve um erro ao copiar os arquivos RomFS ou o usuário cancelou a operação. - + Full Extração completa - + Skeleton Apenas estrutura - + Select RomFS Dump Mode Selecione o modo de extração do RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Selecione a forma como você gostaria que o RomFS seja extraído.<br>"Extração completa" copiará todos os arquivos para a nova pasta, enquanto que <br>"Apenas estrutura" criará apenas a estrutura de pastas. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Não há espaço suficiente em %1 para extrair o RomFS. Por favor abra espaço ou selecione um diretório diferente em Emulação > Configurar > Sistema > Sistema de arquivos > Extrair raiz - + Extracting RomFS... Extraindo RomFS... - - - - - + + Cancel Cancelar - + RomFS Extraction Succeeded! Extração do RomFS concluida! - - - + The operation completed successfully. A operação foi concluída com sucesso. - Integrity verification couldn't be performed! - A verificação de integridade não pôde ser realizada! + A verificação de integridade não pôde ser realizada! - File contents were not checked for validity. - Os conteúdos do arquivo não foram analisados. + Os conteúdos do arquivo não foram analisados. - - Verifying integrity... - Verificando integridade… + Verificando integridade… - - Integrity verification succeeded! - Verificação de integridade concluída! + Verificação de integridade concluída! - - Integrity verification failed! - Houve uma falha na verificação de integridade! + Houve uma falha na verificação de integridade! - File contents may be corrupt. - Os conteúdos do arquivo podem estar corrompidos. + Os conteúdos do arquivo podem estar corrompidos. - - - - Create Shortcut - Criar Atalho + Criar Atalho - Do you want to launch the game in fullscreen? - Gostaria de iniciar o jogo em tela cheia? + Gostaria de iniciar o jogo em tela cheia? - Successfully created a shortcut to %1 - Atalho criado em %1 com sucesso + Atalho criado em %1 com sucesso - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Isso irá criar um atalho para o AppImage atual. Isso pode não funcionar corretamente se você fizer uma atualização. Continuar? + Isso irá criar um atalho para o AppImage atual. Isso pode não funcionar corretamente se você fizer uma atualização. Continuar? - Failed to create a shortcut to %1 - Falha ao criar atalho em %1 + Falha ao criar atalho em %1 - Create Icon - Criar Ícone + Criar Ícone - Cannot create icon file. Path "%1" does not exist and cannot be created. - Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. + Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Erro ao abrir %1 - + Select Directory Selecionar pasta - + Properties Propriedades - + The game properties could not be loaded. As propriedades do jogo não puderam ser carregadas. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Executável do Switch (%1);;Todos os arquivos (*.*) - + Load File Carregar arquivo - + Open Extracted ROM Directory Abrir pasta da ROM extraída - + Invalid Directory Selected Pasta inválida selecionada - + The directory you have selected does not contain a 'main' file. A pasta que você selecionou não contém um arquivo 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Arquivo de Switch instalável (*.nca *.nsp *.xci);; Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Instalar arquivos - + %n file(s) remaining %n arquivo restante @@ -6212,25 +6377,25 @@ Vá para Configurar -> Sistema -> Rede e selecione uma. - + Installing file "%1"... Instalando arquivo "%1"... - - + + Install Results Resultados da instalação - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar possíveis conflitos, desencorajamos que os usuários instalem os jogos base na NAND. Por favor, use esse recurso apenas para instalar atualizações e DLCs. - + %n file(s) were newly installed @@ -6241,7 +6406,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLCs. - + %n file(s) were overwritten @@ -6252,7 +6417,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLCs. - + %n file(s) failed to install @@ -6263,242 +6428,310 @@ Por favor, use esse recurso apenas para instalar atualizações e DLCs. - + System Application Aplicativo do sistema - + System Archive Arquivo do sistema - + System Application Update Atualização de aplicativo do sistema - + Firmware Package (Type A) Pacote de firmware (tipo A) - + Firmware Package (Type B) Pacote de firmware (tipo B) - + Game Jogo - + Game Update Atualização de jogo - + Game DLC DLC de jogo - + Delta Title Título delta - + Select NCA Install Type... Selecione o tipo de instalação do NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Selecione o tipo de título como o qual você gostaria de instalar este NCA: (Na maioria dos casos, o padrão 'Jogo' serve bem.) - + Failed to Install Falha ao instalar - + The title type you selected for the NCA is invalid. O tipo de título que você selecionou para o NCA é inválido. - + File not found Arquivo não encontrado - + File "%1" not found Arquivo "%1" não encontrado - + OK OK - - + + Hardware requirements not met Requisitos de hardware não atendidos - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Seu sistema não atende os requisitos de harwdare. O relatório de compatibilidade foi desabilitado. - + Missing yuzu Account Conta do yuzu faltando - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Para enviar um caso de teste de compatibilidade de jogo, você precisa entrar com a sua conta do yuzu.<br><br/>Para isso, vá para Emulação &gt; Configurar... &gt; Rede. - + Error opening URL Erro ao abrir URL - + Unable to open the URL "%1". Não foi possível abrir o URL "%1". - + TAS Recording Gravando TAS - + Overwrite file of player 1? Sobrescrever arquivo do jogador 1? - + Invalid config detected Configuração inválida detectada - + Handheld controller can't be used on docked mode. Pro controller will be selected. O controle portátil não pode ser usado no modo encaixado na base. O Pro Controller será selecionado. - - + + Amiibo Amiibo - - + + The current amiibo has been removed O amiibo atual foi removido - + Error Erro - - + + The current game is not looking for amiibos O jogo atual não está procurando amiibos - + Amiibo File (%1);; All Files (*.*) Arquivo Amiibo (%1);; Todos os arquivos (*.*) - + Load Amiibo Carregar Amiibo - + Error loading Amiibo data Erro ao carregar dados do Amiibo - + The selected file is not a valid amiibo O arquivo selecionado não é um amiibo válido - + The selected file is already on use O arquivo selecionado já está em uso - + An unknown error occurred Ocorreu um erro desconhecido - - Verification failed for the following files: %1 - Houve uma falha na verificação dos seguintes arquivos: + Houve uma falha na verificação dos seguintes arquivos: %1 - + + Keys not installed Chaves não instaladas @@ -6507,255 +6740,215 @@ Would you like to bypass this and exit anyway? Instale as chaves de descriptografia e reinicie o yuzu antes de tentar instalar o firmware. - + Select Dumped Firmware Source Location Selecione o Local de Armazenamento do Firmware Extraído - Installing Firmware... - Instalando Firmware... + Instalando Firmware... - - - - Firmware install failed - A instalação do Firmware falhou + A instalação do Firmware falhou - Unable to locate potential firmware NCA files - Possíveis arquivos NCA do firmware não foram localizados + Possíveis arquivos NCA do firmware não foram localizados - Failed to delete one or more firmware file. - Falha ao deletar um ou mais arquivo de firmware. + Falha ao deletar um ou mais arquivo de firmware. Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. A instalação do firmware foi cancelada, o firmware pode estar danificado. Reinicie o yuzu ou reinstale o firmware. - One or more firmware files failed to copy into NAND. - Falha ao copiar um ou mais arquivos de firmware para a NAND. + Falha ao copiar um ou mais arquivos de firmware para a NAND. - Firmware integrity verification failed! - A verificação de integridade do Firmware falhou! + A verificação de integridade do Firmware falhou! - Select Dumped Keys Location - Selecione o Local das Chaves Extraídas + Selecione o Local das Chaves Extraídas - - - Decryption Keys install failed - Falha na instalação das Chaves de Descriptografia + Falha na instalação das Chaves de Descriptografia - prod.keys is a required decryption key file. - prod.keys é um arquivo de descriptografia obrigatório. + prod.keys é um arquivo de descriptografia obrigatório. - One or more keys failed to copy. - Falha ao copiar uma ou mais chaves. + Falha ao copiar uma ou mais chaves. - Decryption Keys install succeeded - Chaves de Descriptografia instaladas com sucesso + Chaves de Descriptografia instaladas com sucesso - Decryption Keys were successfully installed - As Chaves de Descriptografia foram instaladas com sucesso + As Chaves de Descriptografia foram instaladas com sucesso - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - Falha ao inicializar as Chaves de Descriptografia. Verifique se as suas ferramentas de extração estão atualizadas e extraia as chaves novamente. + Falha ao inicializar as Chaves de Descriptografia. Verifique se as suas ferramentas de extração estão atualizadas e extraia as chaves novamente. - - - - - - - + + + + + + No firmware available Nenhum firmware disponível - Please install the firmware to use the Album applet. - Por favor Instale o firmware para usar o miniaplicativo Álbum. + Por favor Instale o firmware para usar o miniaplicativo Álbum. - + Album Applet Miniaplicativo Álbum - + Album applet is not available. Please reinstall firmware. O miniaplicativo Álbum não está disponível. Por favor reinstale o firmware. - Please install the firmware to use the Cabinet applet. - Por favor Instale o firmware para usar o miniaplicativo Arquivo. + Por favor Instale o firmware para usar o miniaplicativo Arquivo. - + Cabinet Applet Miniaplicativo Arquivo - + Cabinet applet is not available. Please reinstall firmware. O miniaplicativo Arquivo não está disponível. Por favor reinstale o firmware. - Please install the firmware to use the Mii editor. - Por favor instale o firmware para usar o miniaplicativo Editor de Mii. + Por favor instale o firmware para usar o miniaplicativo Editor de Mii. - + Mii Edit Applet Miniaplicativo Editor de Mii - + Mii editor is not available. Please reinstall firmware. O miniaplicativo Editor de Mii não está disponível. Por favor reinstale o firmware. - Please install the firmware to use the Controller Menu. - Por favor instale o firmware para usar o Menu de Controles. + Por favor instale o firmware para usar o Menu de Controles. - + Controller Applet Miniaplicativo de Controle - + Controller Menu is not available. Please reinstall firmware. Menu de Controles não está disponível. Por favor reinstale o firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Capturar tela - + PNG Image (*.png) Imagem PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Situação TAS: Rodando %1%2 - + TAS state: Recording %1 Situação TAS: Gravando %1 - + TAS state: Idle %1/%2 Situação TAS: Repouso %1%2 - + TAS State: Invalid Situação TAS: Inválido - + &Stop Running &Parar de rodar - + &Start &Iniciar - + Stop R&ecording Parar G&ravação - + R&ecord G&ravação - + Building: %n shader(s) Compilando: %n shader(s) @@ -6763,18 +6956,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocidade: %1% / %2% - + Speed: %1% Velocidade: %1% @@ -6783,44 +6976,44 @@ Would you like to download it? Jogo: %1 FPS (Desbloqueado) - + Game: %1 FPS Jogo: %1 FPS - + Frame: %1 ms Quadro: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA Sem AA - + VOLUME: MUTE VOLUME: MUDO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Faltando componentes de derivação @@ -6829,12 +7022,12 @@ Would you like to download it? Faltando chaves de encriptação. <br>Por favor siga <a href='https://yuzu-emu.org/help/quickstart/'>o guia de início rápido do yuzu</a> para obter todas as suas chaves, firmware e jogos. - + Select RomFS Dump Target Selecionar alvo de extração do RomFS - + Please select which RomFS you would like to dump. Selecione qual RomFS você quer extrair. @@ -6847,7 +7040,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Deseja mesmo parar a emulação? Qualquer progresso não salvo será perdido. @@ -6860,102 +7053,102 @@ Would you like to bypass this and exit anyway? Deseja ignorar isso e sair mesmo assim? - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Nearest Mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + Area - + Docked Modo TV - + Handheld Portátil - + Normal Normal - + High Alto - + Extreme Extremo - + Vulkan Vulkan - + OpenGL OpenGL - + Null Nenhum (desativado) - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6963,13 +7156,13 @@ Deseja ignorar isso e sair mesmo assim? GRenderWindow - - + + OpenGL not available! OpenGL não disponível! - + OpenGL shared contexts are not supported. Shared contexts do OpenGL não são suportados. @@ -6978,33 +7171,33 @@ Deseja ignorar isso e sair mesmo assim? O yuzu não foi compilado com suporte para OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Erro ao inicializar o OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Sua GPU pode não suportar OpenGL, ou você não possui o driver gráfico mais recente. - + Error while initializing OpenGL 4.6! Erro ao inicializar o OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Sua GPU pode não suportar o OpenGL 4.6, ou você não possui os drivers gráficos mais recentes.<br><br>Renderizador GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Sua GPU pode não suportar uma ou mais extensões necessárias do OpenGL. Verifique se você possui a última versão dos drivers gráficos.<br><br>Renderizador GL:<br>%1<br><br>Extensões não suportadas:<br>%2 @@ -7012,128 +7205,128 @@ Deseja ignorar isso e sair mesmo assim? GameList - + Favorite Favorito - + Start Game Iniciar jogo - + Start Game without Custom Configuration Iniciar jogo sem configuração personalizada - + Open Save Data Location Abrir local dos jogos salvos - + Open Mod Data Location Abrir local dos dados de mods - + Open Transferable Pipeline Cache Abrir cache de pipeline transferível - + Remove Remover - + Remove Installed Update Remover atualização instalada - + Remove All Installed DLC Remover todos os DLCs instalados - + Remove Custom Configuration Remover configuração customizada - + Remove Play Time Data Remover Dados de Tempo Jogado - + Remove Cache Storage Remover Cache do Armazenamento - + Remove OpenGL Pipeline Cache Remover cache de pipeline do OpenGL - + Remove Vulkan Pipeline Cache Remover cache de pipeline do Vulkan - + Remove All Pipeline Caches Remover todos os caches de pipeline - + Remove All Installed Contents Remover todo o conteúdo instalado - + Dump RomFS Extrair RomFS - + Dump RomFS to SDMC Extrair RomFS para SDMC - + Verify Integrity Verificar integridade - + Copy Title ID to Clipboard Copiar ID do título para a área de transferência - + Navigate to GameDB entry Abrir artigo do jogo no GameDB - + Create Shortcut Criar atalho - + Add to Desktop Adicionar à Área de Trabalho - + Add to Applications Menu Adicionar ao Menu de Aplicativos - + Configure Game @@ -7142,62 +7335,62 @@ Deseja ignorar isso e sair mesmo assim? Propriedades - + Scan Subfolders Examinar subpastas - + Remove Game Directory Remover pasta de jogo - + ▲ Move Up ▲ Mover para cima - + ▼ Move Down ▼ Mover para baixo - + Open Directory Location Abrir local da pasta - + Clear Limpar - + Name Nome - + Compatibility Compatibilidade - + Add-ons Adicionais - + File type Tipo de arquivo - + Size Tamanho - + Play time Tempo jogado @@ -7205,62 +7398,62 @@ Deseja ignorar isso e sair mesmo assim? GameListItemCompat - + Ingame Inicializável - + Game starts, but crashes or major glitches prevent it from being completed. O jogo inicia, porém problemas ou grandes falhas impedem que ele seja concluído. - + Perfect Perfeito - + Game can be played without issues. O jogo pode ser jogado sem problemas. - + Playable Jogável - + Game functions with minor graphical or audio glitches and is playable from start to finish. O jogo funciona com pequenas falhas gráficas ou de áudio e é jogável do início ao fim. - + Intro/Menu Intro/menu - + Game loads, but is unable to progress past the Start Screen. O jogo carrega, porém não consegue passar da Tela Inicial. - + Won't Boot Não inicia - + The game crashes when attempting to startup. O jogo trava ou se encerra abruptamente ao se tentar iniciá-lo. - + Not Tested Não testado - + The game has not yet been tested. Esse jogo ainda não foi testado. @@ -7268,7 +7461,7 @@ Deseja ignorar isso e sair mesmo assim? GameListPlaceholder - + Double-click to add a new folder to the game list Clique duas vezes para adicionar uma pasta à lista de jogos @@ -7276,7 +7469,7 @@ Deseja ignorar isso e sair mesmo assim? GameListSearchField - + %1 of %n result(s) %1 de %n resultado(s) @@ -7284,12 +7477,12 @@ Deseja ignorar isso e sair mesmo assim? - + Filter: Filtro: - + Enter pattern to filter Digite o padrão para filtrar @@ -7371,7 +7564,7 @@ Deseja ignorar isso e sair mesmo assim? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7385,91 +7578,91 @@ Mensagem de depuração: Hotkeys - + Audio Mute/Unmute Mutar/Desmutar Áudio - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Janela Principal - + Audio Volume Down Abaixar volume - + Audio Volume Up Aumentar volume - + Capture Screenshot Capturar Tela - + Change Adapting Filter Alterar Filtro de Adaptação - + Change Docked Mode Alterar Modo TV - + Change GPU Accuracy Alterar Precisão da GPU - + Configure Configurar - + Configure Current Game - + Continue/Pause Emulation Continuar/Pausar emulação - + Exit Fullscreen Sair da Tela Cheia @@ -7478,97 +7671,97 @@ Mensagem de depuração: Sair do yuzu - - Exit eden + + Exit Eden - + Fullscreen Tela Cheia - + Load File Carregar Arquivo - + Load/Remove Amiibo Carregar/Remover Amiibo - + Multiplayer Browse Public Game Lobby Multiplayer Navegar no Lobby de Salas Públicas - + Multiplayer Create Room Multiplayer Criar Sala - + Multiplayer Direct Connect to Room Multiplayer Conectar Diretamente à Sala - + Multiplayer Leave Room Multiplayer Sair da Sala - + Multiplayer Show Current Room Multiplayer Mostrar a Sala Atual - + Restart Emulation Reiniciar emulação - + Stop Emulation Parar emulação - + TAS Record Gravar TAS - + TAS Reset Reiniciar TAS - + TAS Start/Stop Iniciar/Parar TAS - + Toggle Filter Bar Alternar Barra de Filtro - + Toggle Framerate Limit Alternar Limite de Quadros por Segundo - + Toggle Mouse Panning Alternar o Mouse Panorâmico - + Toggle Renderdoc Capture Alternar a Captura do Renderdoc - + Toggle Status Bar Alternar Barra de Status @@ -7576,22 +7769,22 @@ Mensagem de depuração: InstallDialog - + Please confirm these are the files you wish to install. Por favor, confirme que esses são os arquivos que deseja instalar. - + Installing an Update or DLC will overwrite the previously installed one. Instalar uma atualização ou DLC irá sobrescrever a instalada anteriormente. - + Install Instalar - + Install Files to NAND Instalar arquivos para a NAND @@ -7599,7 +7792,7 @@ Mensagem de depuração: LimitableInputDialog - + The text can't contain any of the following characters: %1 O texto não pode conter nenhum dos seguintes caracteres: @@ -7746,152 +7939,207 @@ Mensagem de depuração: &Arquivos recentes - + + Open &Eden Folders + + + + &Emulation &Emulação - + &View &Exibir - + &Reset Window Size &Restaurar tamanho da janela - + &Debugging &Depurar - + Reset Window Size to &720p Restaurar tamanho da janela para &720p - + Reset Window Size to 720p Restaurar tamanho da janela para 720p - + Reset Window Size to &900p Restaurar tamanho da janela para &900p - + Reset Window Size to 900p Restaurar tamanho da janela para 900p - + Reset Window Size to &1080p Restaurar tamanho da janela para &1080p - + Reset Window Size to 1080p Restaurar tamanho da janela para 1080p - + &Multiplayer &Multiplayer - + &Tools &Ferramentas - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Ajuda - + &Install Files to NAND... &Instalar arquivos para NAND... - + L&oad File... &Carregar arquivo... - + Load &Folder... Carregar &pasta... - + E&xit S&air - + &Pause &Pausar - + &Stop &Parar - + &Verify Installed Contents &Verificar Conteúdo Instalado - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7900,97 +8148,97 @@ Mensagem de depuração: &Sobre o yuzu - + Single &Window Mode Modo de &janela única - + Con&figure... Con&figurar... - + Ctrl+, - + Display D&ock Widget Headers Exibir barra de títul&os de widgets afixados - + Show &Filter Bar Exibir barra de &filtro - + Show &Status Bar Exibir barra de &status - + Show Status Bar Exibir barra de status - + &Browse Public Game Lobby &Navegar no Lobby de Salas Públicas - + &Create Room &Criar Sala - + &Leave Room &Sair da Sala - + &Direct Connect to Room &Entrar Diretamente numa Sala - + &Show Current Room &Mostrar Sala Atual - + F&ullscreen &Tela cheia - + &Restart &Reiniciar - + Load/Remove &Amiibo... Carregar/Remover &Amiibo... - + &Report Compatibility &Reportar compatibilidade - + Open &Mods Page Abrir página de &mods - + Open &Quickstart Guide Abrir &guia de início rápido - + &FAQ &Perguntas frequentes @@ -7999,77 +8247,82 @@ Mensagem de depuração: Abrir pasta do &yuzu - + &Capture Screenshot &Captura de tela - + Open &Album Abrir &Álbum - + &Set Nickname and Owner &Definir Apelido e Proprietário - + &Delete Game Data &Remover Dados do Jogo - + &Restore Amiibo &Recuperar Amiibo - + &Format Amiibo &Formatar Amiibo - + Open &Mii Editor Abrir &Editor de Mii - + &Configure TAS... &Configurar TAS - + Configure C&urrent Game... Configurar jogo &atual.. - + &Start &Iniciar - + &Reset &Restaurar - + R&ecord G&ravar - + Open &Controller Menu Menu Abrir &Controles - + Install Firmware Instalar Firmware - + + &About Eden + + + + Install Decryption Keys Instalar Chaves de Descriptografia @@ -8077,26 +8330,36 @@ Mensagem de depuração: MicroProfileDialog - &MicroProfile - &MicroPerfil + &MicroPerfil MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8156,37 +8419,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Estado atual da conexão - + Not Connected. Click here to find a room! Não conectado. Clique aqui para procurar uma sala! - + Not Connected Não conectado - + Connected Conectado - + New Messages Received Novas mensagens recebidas - + Error Erro - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Falha ao atualizar as informações da sala. Por favor verifique sua conexão com a internet e tente hospedar a sala novamente. @@ -8378,56 +8641,56 @@ p, li { white-space: pre-wrap; } Não está jogando um jogo - + Installed SD Titles Títulos instalados no SD - + Installed NAND Titles Títulos instalados na NAND - + System Titles Títulos do sistema - + Add New Game Directory Adicionar pasta de jogos - + Favorites Favoritos - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [não definido] @@ -8438,14 +8701,14 @@ p, li { white-space: pre-wrap; } Direcional %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Eixo %1%2 @@ -8456,357 +8719,357 @@ p, li { white-space: pre-wrap; } Botão %1 - - - - - - + + + + + + [unknown] [desconhecido] - - - + + + Left Esquerda - - - + + + Right Direita - - - + + + Down Baixo - - - + + + Up Cima - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Círculo - - + + Cross Cruz - - + + Square Quadrado - - + + Triangle Triângulo - - + + Share Compartilhar - - + + Options Opções - - + + [undefined] [indefinido] - + %1%2 %1%2 - - + + [invalid] [inválido] - - + + %1%2Hat %3 %1%2Direcional %3 - - - + + + %1%2Axis %3 %1%2Eixo %3 - - + + %1%2Axis %3,%4,%5 %1%2Eixo %3,%4,%5 - - + + %1%2Motion %3 %1%2Movimentação %3 - - + + %1%2Button %3 %1%2Botão %3 - - + + [unused] [não utilizado] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Analógico esquerdo - + Stick R Analógico direito - + Plus Mais - + Minus Menos - - + + Home Botão Home - + Capture Capturar - + Touch Toque - + Wheel Indicates the mouse wheel Volante - + Backward Para trás - + Forward Para a frente - + Task Tarefa - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Alavanca %4 - - + + %1%2%3Axis %4 %1%2%3Eixo %4 - - + + %1%2%3Button %4 %1%2%3Botão %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8924,6 +9187,300 @@ p, li { white-space: pre-wrap; } Deseja restaurar este amiibo? + + QtCommon::Content + + + Installing Firmware... + Instalando Firmware... + + + + + + Cancel + Cancelar + + + + Firmware integrity verification failed! + A verificação de integridade do Firmware falhou! + + + + + Verification failed for the following files: + +%1 + Houve uma falha na verificação dos seguintes arquivos: + +%1 + + + + + Verifying integrity... + Verificando integridade… + + + + + Integrity verification succeeded! + Verificação de integridade concluída! + + + + + The operation completed successfully. + A operação foi concluída com sucesso. + + + + + Integrity verification failed! + Houve uma falha na verificação de integridade! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + Selecione o Local das Chaves Extraídas + + + + Decryption Keys install succeeded + Chaves de Descriptografia instaladas com sucesso + + + + Decryption Keys were successfully installed + As Chaves de Descriptografia foram instaladas com sucesso + + + + Decryption Keys install failed + Falha na instalação das Chaves de Descriptografia + + + + QtCommon::Game + + + Error Removing Contents + Erro ao Remover Conteúdos + + + + Error Removing Update + Erro ao Remover Atualização + + + + Error Removing DLC + Erro ao Remover DLC + + + + The base game is not installed in the NAND and cannot be removed. + O jogo base não está instalado na NAND e não pode ser removido. + + + + There is no update installed for this title. + Não há nenhuma atualização instalada para este título. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Removido com sucesso + + + + Successfully removed %1 installed DLC. + %1 DLC(s) instalados foram removidos com sucesso. + + + + + Error Removing Transferable Shader Cache + Erro ao remover cache de shaders transferível + + + + + A shader cache for this title does not exist. + Não existe um cache de shaders para este título. + + + + Successfully removed the transferable shader cache. + O cache de shaders transferível foi removido com sucesso. + + + + Failed to remove the transferable shader cache. + Falha ao remover o cache de shaders transferível. + + + + Error Removing Vulkan Driver Pipeline Cache + Erro ao Remover Cache de Pipeline do Driver Vulkan + + + + Failed to remove the driver pipeline cache. + Falha ao remover o pipeline de cache do driver. + + + + + Error Removing Transferable Shader Caches + Erro ao remover os caches de shaders transferíveis + + + + Successfully removed the transferable shader caches. + Os caches de shaders transferíveis foram removidos com sucesso. + + + + Failed to remove the transferable shader cache directory. + Falha ao remover o diretório do cache de shaders transferível. + + + + + Error Removing Custom Configuration + Erro ao remover as configurações customizadas do jogo. + + + + A custom configuration for this title does not exist. + Não há uma configuração customizada para este título. + + + + Successfully removed the custom game configuration. + As configurações customizadas do jogo foram removidas com sucesso. + + + + Failed to remove the custom game configuration. + Falha ao remover as configurações customizadas do jogo. + + + + Reset Metadata Cache + Restaurar cache de metadados + + + + The metadata cache is already empty. + O cache de metadados já está vazio. + + + + The operation completed successfully. + A operação foi concluída com sucesso. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + O cache de metadados não pôde ser excluído. Ele pode estar em uso no momento ou não existe. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + Gostaria de iniciar o jogo em tela cheia? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Atalho criado em %1 com sucesso + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Isso irá criar um atalho para o AppImage atual. Isso pode não funcionar corretamente se você fizer uma atualização. Continuar? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Falha ao criar atalho em %1 + + + + Create Icon + Criar Ícone + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. + + + + No firmware available + Nenhum firmware disponível + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9219,7 +9776,7 @@ Tente novamente ou entre em contato com o desenvolvedor do software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9227,7 +9784,7 @@ Tente novamente ou entre em contato com o desenvolvedor do software. - + Users Usuários @@ -9351,7 +9908,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Pilha de chamadas @@ -9359,12 +9916,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread não aguardando pelo thread @@ -9372,102 +9929,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable rodável - + paused pausado - + sleeping dormindo - + waiting for IPC reply esperando para resposta do IPC - + waiting for objects esperando por objetos - + waiting for condition variable aguardando por variável da condição - + waiting for address arbiter esperando para endereção o árbitro - + waiting for suspend resume esperando pra suspender o resumo - + waiting aguardando - + initialized inicializado - + terminated terminado - + unknown desconhecido - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 núcleo %1 - + processor = %1 processador = %1 - + affinity mask = %1 máscara de afinidade = %1 - + thread id = %1 thread id = %1 - + priority = %1(current) / %2(normal) prioridade = %1(atual) / %2(normal) - + last running ticks = %1 últimos ticks executados = %1 @@ -9475,7 +10032,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread aguardado pelo thread @@ -9483,7 +10040,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Árvore de espera diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 2077c4be80..f38a8b113c 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... A comunicar com o servidor... - + Cancel Cancelar - + Touch the top left corner <br>of your touchpad. Toca no canto superior esquerdo <br>do teu touchpad. - + Now touch the bottom right corner <br>of your touchpad. Agora toca no canto inferior direito <br> do teu touchpad. - + Configuration completed! Configuração completa! - + OK OK @@ -397,134 +397,134 @@ Isto banirá tanto o nome de usuário do fórum como o endereço IP. ConfigurationShared - + % % - + Amiibo editor Editor de Amiibo - + Controller configuration Configuração de controles - + Data erase Apagamento de dados - + Error Erro - + Net connect Conectar à rede - + Player select Seleção de jogador - + Software keyboard Teclado de software - + Mii Edit Editar Mii - + Online web Serviço online - + Shop Loja - + Photo viewer Visualizador de imagens - + Offline web Rede offline - + Login share Compartilhamento de Login - + Wifi web auth Autenticação web por Wifi - + My page Minha página - + Output Engine: Motor de Saída: - + Output Device: Dispositivo de Saída - + Input Device: Dispositivo de Entrada - + Mute audio Mutar Áudio - + Volume: Volume: - + Mute audio when in background Silenciar audio quando a janela ficar em segundo plano - + Multicore CPU Emulation Emulação de CPU Multicore - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Esta opção aumenta o uso de threads de emulação da CPU de 1 para o máximo de 4 do switch. Isso é prioritariamente uma opção de depuração e não deve ser desabilitada. - + Memory Layout Layout de memória - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ Isso não melhora a estabilidade ou performance e só serve para comportar grand Habilitar essa opção aumentará o uso de memória. Não é recomendado habilitar isso a não ser que um jogo específico com um mod de textura precise. - + Limit Speed Percent Percentagem do limitador de velocidade - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,141 +547,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Precisão: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Esta configuração controla a precisão da CPU emulada. Não altere isso a menos que saiba o que está fazendo. - - + + Backend: Backend: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) FMA inseguro (Melhorar performance no CPU sem FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Essa opção melhora a velocidade ao reduzir a precisão de instruções de fused-multiply-add em CPUs sem suporte nativo ao FMA. - + Faster FRSQRTE and FRECPE FRSQRTE e FRECPE mais rápido - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Essa opção melhora a velocidade de algumas funções aproximadas de pontos flutuantes ao usar aproximações nativas precisas. - + Faster ASIMD instructions (32 bits only) Instruções ASIMD mais rápidas (apenas 32 bits) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Essa opção melhora a velocidade de funções de pontos flutuantes de 32 bits ASIMD ao executá-las com modos de arredondamento incorretos. - + Inaccurate NaN handling Tratamento impreciso de NaN - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Esta opção melhora a velocidade ao remover a checagem NaN. Por favor, note que isso também reduzirá a precisão de certas instruções de ponto flutuante. - + Disable address space checks Desativar a verificação do espaço de endereços - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Esta opção melhora a velocidade ao eliminar a checagem de segurança antes de cada leitura/escrita de memória no dispositivo convidado. Desabilitar essa opção pode permitir que um jogo leia/escreva na memória do emulador. - + Ignore global monitor Ignorar monitor global - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. Esta opção melhora a velocidade ao depender apenas das semânticas do cmpxchg pra garantir a segurança das instruções de acesso exclusivo. Por favor, note que isso pode resultar em travamentos e outras condições de execução. - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Alterna entre as APIs gráficas disponíveis. Vulkan é a recomendada na maioria dos casos. - + Device: Dispositivo: - + This setting selects the GPU to use with the Vulkan backend. Esta opção seleciona a GPU a ser usada com a Vulkan. - + Shader Backend: Suporte de shaders: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -692,12 +669,12 @@ GLASM é um backend exclusivo descontinuado da NVIDIA que oferece uma performanc SPIR-V é o mais rápido ao compilar shaders, mas produz resultados ruins na maioria dos drivers de GPU. - + Resolution: Resolução: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -706,27 +683,27 @@ Resoluções maiores requerem mais VRAM e largura de banda. Opções menores do que 1X podem causar problemas na renderização. - + Window Adapting Filter: Filtro de adaptação de janela: - + FSR Sharpness: FSR Sharpness: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Determina a nitidez da imagem ao utilizar contraste dinâmico do FSR. - + Anti-Aliasing Method: Método de Anti-Aliasing - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -735,12 +712,12 @@ SMAA oferece a melhor qualidade. FXAA tem um impacto menor na performance e pode produzir uma imagem melhor e mais estável em resoluções muito baixas. - + Fullscreen Mode: Tela Cheia - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -749,12 +726,12 @@ Sem borda oferece a melhor compatibilidade com o teclado na tela que alguns jogo Tela cheia exclusiva pode oferecer melhor performance e melhor suporte a Freesync/Gsync. - + Aspect Ratio: Proporção do Ecrã: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -763,49 +740,36 @@ Jogos do Switch somente suportam 16:9, por isso mods customizados por jogo são Isso também controla a proporção de aspecto de capturas de telas. - + Use disk pipeline cache Usar cache de pipeline em disco - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite guardar os shaders para carregar os jogos nas execuções seguintes. Desabiltar essa opção só serve para propósitos de depuração. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Usar emulação assíncrona de GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa uma thread de CPU extra para renderização. Esta opção deve estar sempre habilitada. - + NVDEC emulation: Emulação NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -814,12 +778,12 @@ Tanto a CPU quanto a GPU podem ser utilizadas para decodificação, ou não deco Na maioria dos casos, a decodificação pela GPU fornece uma melhor performance. - + ASTC Decoding Method: Método de Decodificação ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -832,34 +796,33 @@ CPU de Forma Assíncrona: Usa a CPU para decodificar texturas ASTC à medida que decodificação ASTC ao custo de problemas na renderização enquanto as texturas estão sendo decodificadas. - + ASTC Recompression Method: Método de Recompressão ASTC: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Quase todas as GPUs de desktop e laptop não possuem suporte para texturas ASTC, o que força o emulador a descompactá-las para um formato intermediário que qualquer placa suporta, o RGBA8. Esta opção recompacta o RGBA8 ou pro formato BC1 ou pro BC3, economizando VRAM mas afetando negativamente a qualidade da imagem. - + VRAM Usage Mode: Modo de Uso da VRAM: - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - Define se o emulador deve preferir conservar ou fazer o uso máximo da memória de vídeo disponível para melhorar a performance. Não tem efeito em gráficos integrados. O modo Agressivo pode impactar fortemente na performance de outras aplicações, tipo programas de gravação de tela. + Define se o emulador deve preferir conservar ou fazer o uso máximo da memória de vídeo disponível para melhorar a performance. Não tem efeito em gráficos integrados. O modo Agressivo pode impactar fortemente na performance de outras aplicações, tipo programas de gravação de tela. - + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -870,51 +833,49 @@ Caixa de entrada pode ter a latência mais baixa do que o FIFO e não causa tear Imediato (sem sincronização) simplesmente apresenta o que estiver disponível e pode exibir tearing. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. Controla a qualidade da renderização de texturas em ângulos oblíquos. É uma configuração leve, e é seguro deixar em 16x na maioria das GPUs. - Accuracy Level: - Nível de Precisão: + Nível de Precisão: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - Precisão da emulação da GPU. + Precisão da emulação da GPU. A maioria dos jogos renderiza bem na precisão Normal, mas a Alta ainda é obrigatória para alguns. Partículas tendem a render corretamente somente com a precisão Alta. Extrema só deve ser utilizada para depuração. @@ -922,12 +883,12 @@ Esta opção pode ser alterada durante o jogo. Alguns jogos podem exigir serem iniciados na precisão alta pra renderizarem corretamente. - + Use asynchronous shader building (Hack) Usar compilação assíncrona de shaders (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Habilita a compilação de shaders assíncrona, o que pode reduzir engasgos. @@ -942,24 +903,24 @@ Esta opção é experimental. Ativa um tempo de resposta rápido da GPU. Esta opção forçará a maioria dos jogos a rodar em sua resolução nativa mais alta. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -968,111 +929,111 @@ Essa configuração só existe para drivers proprietários Intel, e pode travar Pipelines de computação estão sempre habilitadas em todos os outros drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. Controla a semente do gerador de números aleatórios. Usado principalmente para propósitos de speedrunning. - + Device Name Nome do Dispositivo - + The name of the emulated Switch. O nome do Switch emulado. - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Esta opção permite alterar o relógio do Switch emulado. Pode ser utilizada para manipular o tempo nos jogos. - + Language: Idioma: - + Note: this can be overridden when region setting is auto-select Nota: isto pode ser substituído quando a configuração da região é de seleção automática - + Region: Região: - + The region of the emulated Switch. A região do Switch emulado. - + Time Zone: Fuso Horário: - + The time zone of the emulated Switch. O fuso horário do Switch emulado. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1081,7 +1042,7 @@ Os jogos mudarão suas resoluções, detalhes e controles suportados de acordo c Configurar essa opção para o Modo Portátil pode ajudar a melhorar a performance em sistemas mais fracos. - + Prompt for user on game boot Solicitar para o utilizador na inicialização do jogo @@ -1090,7 +1051,7 @@ Configurar essa opção para o Modo Portátil pode ajudar a melhorar a performan Pede para selecionar um perfil de usuário a cada boot, útil se várias pessoas utilizam o yuzu no mesmo PC. - + Pause emulation when in background Pausar o emulador quando estiver em segundo plano @@ -1099,843 +1060,992 @@ Configurar essa opção para o Modo Portátil pode ajudar a melhorar a performan Esta opção pausa o yuzu quando outras janelas estão ativas. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Confirmar antes de parar a emulação - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Esta configuração desconsidera as solicitações dos jogos que pedem pra confirmarem a interrupção deles. Habilitar essa configuração ignora essas solicitações e sai da emulação direto. - + Hide mouse on inactivity Esconder rato quando inactivo. - + This setting hides the mouse after 2.5s of inactivity. Esta configuração esconde o mouse após 2,5s de inativadade. - + Disable controller applet Desabilitar miniaplicativo de controle - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Força a desativação do uso do miniaplicativo de controle pelos dispositivos convidados. Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é imediatamente fechado. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Habilitar Gamemode - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - + Conservative Conservador - + Aggressive Agressivo - + OpenGL OpenGL - + Vulkan Vulcano - + Null Nenhum (desativado) - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (Shaders Assembly, apenas NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (Experimental, Somente AMD/Mesa) - + Normal Normal - + High Alto - + Extreme Extremo - + Auto Automático - + Accurate Preciso - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolution - - Area - - - - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + + Default Padrão - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - - + + Serbian (српски) + + + + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1944,37 +2054,37 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é 8GB DRAM (Não seguro) - + Docked Ancorado - + Handheld Portátil - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar @@ -2321,27 +2431,27 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é Entrando - + Open Log Location Abrir a localização do registro - + Global Log Filter Filtro de registro global - + When checked, the max size of the log increases from 100 MB to 1 GB Quando ativado, o tamanho máximo do registo aumenta de 100 MB para 1 GB - + Enable Extended Logging** Ativar registros avançados** - + Show Log in Console Mostrar Relatório na Consola @@ -2487,7 +2597,7 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2549,7 +2659,7 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é **Isto será restaurado automaticamente assim que o yuzu for fechado. - + Web applet not compiled Applet Web não compilado @@ -2599,7 +2709,7 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é - eden Configuration + Eden Configuration @@ -2608,88 +2718,88 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é Algumas configurações só estão disponíveis apenas quando não houver nenhum jogo em execução. - + Applets Miniaplicativos - - + + Audio Audio - - + + CPU CPU - + Debug Depurar - + Filesystem Sistema de Ficheiros - - + + General Geral - - + + Graphics Gráficos - + GraphicsAdvanced GráficosAvançados - + GraphicsExtensions - + Hotkeys Teclas de Atalhos - - + + Controls Controlos - + Profiles Perfis - + Network Rede - - + + System Sistema - + Game List Lista de Jogos - + Web Rede @@ -2787,51 +2897,45 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é - - - Reset Metadata Cache Resetar a Cache da Metadata - + Select Emulated NAND Directory... Selecione o Diretório NAND Emulado... - + Select Emulated SD Directory... Selecione o Diretório SD Emulado... - + Select Gamecard Path... Selecione o Diretório do Cartão de Jogo... - + Select Dump Directory... Selecionar o diretório do Dump... - + Select Mod Load Directory... Selecionar o Diretório do Mod Load ... - The metadata cache is already empty. - O cache de metadata já está vazio. + O cache de metadata já está vazio. - The operation completed successfully. - A operação foi completa com sucesso. + A operação foi completa com sucesso. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Não foi possível excluir o cache de metadata. Pode estar em uso ou inexistente. + Não foi possível excluir o cache de metadata. Pode estar em uso ou inexistente. @@ -2862,12 +2966,12 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Isto restaura todas as configurações e remove as configurações específicas de cada jogo. As pastas de jogos, perfis de jogos e perfis de controlo não serão removidos. Continuar? @@ -2900,33 +3004,33 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é Cor de fundo: - + % FSR sharpening percentage (e.g. 50%) % - + Off Desligado - + VSync Off Sincronização vertical desligada - + Recommended Recomendado - + On Ligado - + VSync On Sincronização vertical ligada @@ -2963,14 +3067,18 @@ Quando um dispositivo convidado tenta abrir o miniaplicativo do controle, ele é - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3002,75 +3110,75 @@ These settings are experimental, and may cause black screens. If your games fail Restaurar Padrões - + Action Ação - + Hotkey Tecla de Atalho - + Controller Hotkey Atalho do controle - - - + + + Conflicting Key Sequence Sequência de teclas em conflito - - + + The entered key sequence is already assigned to: %1 A sequência de teclas inserida já está atribuída a: %1 - + [waiting] [em espera] - + Invalid Inválido - + Invalid hotkey settings Configurações de atalho inválidas - + An error occurred. Please report this issue on github. Houve um erro. Relate o problema no GitHub. - + Restore Default Restaurar Padrão - + Clear Limpar - + Conflicting Button Sequence Sequência de botões conflitante - + The default button sequence is already assigned to: %1 A sequência de botões padrão já está vinculada a %1 - + The default key sequence is already assigned to: %1 A sequência de teclas padrão já está atribuída a: %1 @@ -3390,7 +3498,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3545,7 +3653,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Analógico Esquerdo @@ -3655,14 +3763,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3681,7 +3789,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Mais @@ -3694,15 +3802,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3747,7 +3855,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Analógico Direito @@ -3762,242 +3870,242 @@ These settings are experimental, and may cause black screens. If your games fail Configurar - - - - + + + + Clear Limpar - - - - - + + + + + [not set] [não definido] - - - + + + Invert button Inverter botão - - + + Toggle button Alternar pressionamento do botão - + Turbo button Botão Turbo - - + + Invert axis Inverter eixo - - - + + + Set threshold Definir limite - - + + Choose a value between 0% and 100% Escolha um valor entre 0% e 100% - + Toggle axis Alternar eixos - + Set gyro threshold Definir limite do giroscópio - + Calibrate sensor Calibrar sensor - + Map Analog Stick Mapear analógicos - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Após pressionar OK, mova o seu analógico primeiro horizontalmente e depois verticalmente. Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois horizontalmente. - + Center axis Eixo central - - + + Deadzone: %1% Ponto Morto: %1% - - + + Modifier Range: %1% Modificador de Alcance: %1% - - + + Pro Controller Comando Pro - + Dual Joycons Joycons Duplos - + Left Joycon Joycon Esquerdo - + Right Joycon Joycon Direito - + Handheld Portátil - + GameCube Controller Controlador de depuração - + Poke Ball Plus Poke Ball Plus - + NES Controller Controle NES - + SNES Controller Controle SNES - + N64 Controller Controle N64 - + Sega Genesis Mega Drive - + Start / Pause Iniciar / Pausar - + Z Z - + Control Stick Direcional de controle - + C-Stick C-Stick - + Shake! Abane! - + [waiting] [em espera] - + New Profile Novo Perfil - + Enter a profile name: Introduza um novo nome de perfil: - - + + Create Input Profile Criar perfil de controlo - + The given profile name is not valid! O nome de perfil dado não é válido! - + Failed to create the input profile "%1" Falha ao criar o perfil de controlo "%1" - + Delete Input Profile Apagar Perfil de Controlo - + Failed to delete the input profile "%1" Falha ao apagar o perfil de controlo "%1" - + Load Input Profile Carregar perfil de controlo - + Failed to load the input profile "%1" Falha ao carregar o perfil de controlo "%1" - + Save Input Profile Guardar perfil de controlo - + Failed to save the input profile "%1" Falha ao guardar o perfil de controlo "%1" @@ -4054,7 +4162,7 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho - + Configure Configurar @@ -4090,7 +4198,7 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho - + Test Testar @@ -4109,7 +4217,7 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Saber Mais</span></a> - + %1:%2 %1:%2 @@ -4118,77 +4226,77 @@ Para inverter os eixos, mova o seu analógico primeiro verticalmente e depois ho yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters O número da porta tem caracteres inválidos - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 A porta tem que estar entre 0 e 65353 - + IP address is not valid O endereço IP não é válido - + This UDP server already exists Este servidor UDP já existe - + Unable to add more than 8 servers Não é possível adicionar mais de 8 servidores - + Testing Testando - + Configuring Configurando - + Test Successful Teste Bem-Sucedido - + Successfully received data from the server. Dados recebidos do servidor com êxito. - + Test Failed Teste Falhou - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Não foi possível receber dados válidos do servidor.<br>Por favor verifica que o servidor está configurado correctamente e o endereço e porta estão correctos. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Teste UDP ou configuração de calibragem em progresso.<br> Por favor espera que termine. @@ -4315,7 +4423,12 @@ Os valores atuais são %1% e %2% respectivamente. Interface de rede - + + Enable Airplane Mode + + + + None Nenhum @@ -4373,52 +4486,52 @@ Os valores atuais são %1% e %2% respectivamente. Algumas configurações só estão disponíveis apenas quando não houver nenhum jogo em execução. - + Add-Ons Add-Ons - + System Sistema - + CPU CPU - + Graphics Gráficos - + Adv. Graphics Gráficos Avç. - + GPU Extensions - + Audio Audio - + Input Profiles Perfis de controle - + Linux Linux - + Properties Propriedades @@ -4436,12 +4549,12 @@ Os valores atuais são %1% e %2% respectivamente. Add-Ons - + Patch Name Nome da Patch - + Version Versão @@ -4479,27 +4592,32 @@ Os valores atuais são %1% e %2% respectivamente. Definir Imagem - + + Select Avatar + + + + Add Adicionar - + Rename Renomear - + Remove Remover - + Profile management is available only when game is not running. O gestor de perfis só está disponível apenas quando o jogo não está em execução. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4507,100 +4625,189 @@ Os valores atuais são %1% e %2% respectivamente. %2 - + Enter Username Introduza o Nome de Utilizador - + Users Utilizadores - + Enter a username for the new user: Introduza um nome de utilizador para o novo utilizador: - + Enter a new username: Introduza um novo nome de utilizador: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Definir Imagem de utilizador - - JPEG Images (*.jpg *.jpeg) - Imagens JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Nenhum firmware disponível + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Imagens JPEG (*.jpg *.jpeg) + + + Error deleting image Error ao eliminar a imagem - + Error occurred attempting to overwrite previous image at: %1. Ocorreu um erro ao tentar substituir imagem anterior em: %1. - + Error deleting file Erro ao eliminar o arquivo - + Unable to delete existing file: %1. Não é possível eliminar o arquivo existente: %1. - + Error creating user image directory Erro ao criar o diretório de imagens do utilizador - + Unable to create directory %1 for storing user images. Não é possível criar o diretório %1 para armazenar imagens do utilizador. - Error copying user image - Erro ao copiar a imagem do utilizador + Erro ao copiar a imagem do utilizador - Unable to copy image from %1 to %2 - Não é possível copiar a imagem de %1 para %2 + Não é possível copiar a imagem de %1 para %2 - Error resizing user image - Erro no redimensionamento da imagem do usuário + Erro no redimensionamento da imagem do usuário - Unable to resize image - Não foi possível redimensionar a imagem + Não foi possível redimensionar a imagem + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Cancelar + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Excluir esse usuário? Todos os dados salvos desse usuário serão removidos. - + Confirm Delete Confirmar para eliminar - + Name: %1 UUID: %2 Nome: %1 @@ -4653,7 +4860,7 @@ UUID: %2 - + Enable Habilitar @@ -4664,7 +4871,7 @@ UUID: %2 - + Not connected Não conectado @@ -4674,63 +4881,63 @@ UUID: %2 Restaurar Padrões - + Clear Limpar - + [not set] [não definido] - + Invert axis Inverter eixo - - + + Deadzone: %1% Ponto Morto: %1% - + Error enabling ring input Erro habilitando controle de anel - + Direct Joycon driver is not enabled Driver direto do Joycon não está habilitado - + Configuring Configurando - + The current mapped device doesn't support the ring controller O dispositivo atualmente mapeado não suporta o controle de anel - + The current mapped device doesn't have a ring attached O dispositivo mapeado não tem um anel conectado - + The current mapped device is not connected O dispositivo atualmente mapeado não está conectado - + Unexpected driver result %1 Resultado inesperado do driver %1 - + [waiting] [em espera] @@ -4772,7 +4979,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4824,12 +5031,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Configurar TAS - + Select TAS Load Directory... Selecionar diretório de carregamento TAS @@ -4939,7 +5146,7 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5259,6 +5466,16 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta Web Rede + + + Eden Web Service + + + + + Generate + + yuzu Web Service Serviço Web do Yuzu @@ -5268,42 +5485,29 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta Ao fornecer seu nome de usuário e token, você concorda em permitir que o yuzu colete dados de uso adicionais, que podem incluir informações de identificação do usuário. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verificar + Verificar - Sign up - Inscrever-se + Inscrever-se - + Token: Token: - + Username: Nome de usuário: - What is my token? - O que é o meu token? + O que é o meu token? - + Web Service configuration can only be changed when a public room isn't being hosted. Configuração de Serviço Web só podem ser alteradas quando uma sala pública não está sendo hospedada. @@ -5328,12 +5532,12 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta Regenerar - + Discord Presence Presença do Discord - + Show Current Game in your Discord Status Mostrar o Jogo Atual no seu Estado de Discord @@ -5342,24 +5546,8 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Saber mais</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Inscrever-se</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Inscrever-se</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5382,10 +5570,9 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta O token não foi verificado. A alteração do token não foi gravada. - Unverified, please click Verify before saving configuration Tooltip - Não verificado, por favor clique sobre Verificar antes de salvar as configurações + Não verificado, por favor clique sobre Verificar antes de salvar as configurações Verifying... @@ -5409,20 +5596,67 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Verificação Falhada. Verifique se introduziu seu nome de utilizador e o token correctamente e se a conexão com a Internet está operacional. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Comando J1 - + &Controller P1 &Comando J1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versão + + DirectConnect @@ -5528,7 +5762,12 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5536,11 +5775,6 @@ Arrasta os pontos para mudar a posição, ou dá duplo-clique nas células da ta The host of the room has banned you. Speak with the host to unban you or try a different room. O anfitrião da sala baniu você. Fale com o anfitrião para que ele remova seu banimento ou tente uma sala diferente. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5601,7 +5835,7 @@ Please go to Configure -> System -> Network and make a selection. Telemetria - + Broken Vulkan Installation Detected Detectada Instalação Defeituosa do Vulkan @@ -5610,106 +5844,105 @@ Please go to Configure -> System -> Network and make a selection. A inicialização do Vulkan falhou durante a carga do programa. <br><br>Clique <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>aqui para instruções de como resolver o problema</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Rodando um jogo - + Loading Web Applet... A Carregar o Web Applet ... - - + + Disable Web Applet Desativar Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) A desativação do applet da web pode causar comportamento inesperado e deve apenas ser usada com Super Mario 3D All-Stars. Você deseja mesmo desativar o applet da web? (Ele pode ser reativado nas configurações de depuração.) - + The amount of shaders currently being built Quantidade de shaders a serem construídos - + The current selected resolution scaling multiplier. O atualmente multiplicador de escala de resolução selecionado. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidade da emulação actual. Valores acima ou abaixo de 100% indicam que a emulação está sendo executada mais depressa ou mais devagar do que a Switch - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quantos quadros por segundo o jogo está exibindo de momento. Isto irá variar de jogo para jogo e de cena para cena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo gasto para emular um frame da Switch, sem contar o a limitação de quadros ou o v-sync. Para emulação de velocidade máxima, esta deve ser no máximo 16.67 ms. - + Unmute Unmute - + Mute Mute - + Reset Volume Redefinir volume - + &Clear Recent Files &Limpar arquivos recentes - + &Continue &Continuar - + &Pause &Pausa - Warning Outdated Game Format - Aviso de Formato de Jogo Desactualizado + Aviso de Formato de Jogo Desactualizado You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Você está usando o formato de directório ROM desconstruído para este jogo, que é um formato desactualizado que foi substituído por outros, como NCA, NAX, XCI ou NSP. Os directórios de ROM não construídos não possuem ícones, metadados e suporte de actualização.<br><br>Para uma explicação dos vários formatos de Switch que o yuzu suporta,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>Verifique a nossa Wiki</a>. Esta mensagem não será mostrada novamente. - - + + Error while loading ROM! Erro ao carregar o ROM! - + The ROM format is not supported. O formato do ROM não é suportado. - + An error occurred initializing the video core. Ocorreu um erro ao inicializar o núcleo do vídeo. @@ -5718,7 +5951,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu encontrou um erro enquanto rodando o núcleo de vídeo. Normalmente isto é causado por drivers de GPU desatualizados, incluindo integrados. Por favor veja o registro para mais detalhes. Para mais informações em acesso ao registro por favor veja a seguinte página: <a href='https://yuzu-emu.org/help/reference/log-files/'>Como fazer envio de arquivo de registro</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Erro ao carregar a ROM! %1 @@ -5729,473 +5962,405 @@ Please go to Configure -> System -> Network and make a selection. %1<br>Por favor, siga <a href='https://yuzu-emu.org/help/quickstart/'>a guia de início rápido do yuzu</a> para fazer o redespejo dos seus arquivos.<br>Você pode consultar a wiki do yuzu</a> ou o Discord do yuzu</a> para obter ajuda. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Ocorreu um erro desconhecido. Por favor, veja o log para mais detalhes. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Encerrando software... - + Save Data Save Data - + Mod Data Mod Data - + Error Opening %1 Folder Erro ao abrir a pasta %1 - - + + Folder does not exist! A Pasta não existe! - Error Opening Transferable Shader Cache - Erro ao abrir os Shader Cache transferíveis + Erro ao abrir os Shader Cache transferíveis - Failed to create the shader cache directory for this title. - Falha ao criar o diretório de cache de shaders para este título. + Falha ao criar o diretório de cache de shaders para este título. - Error Removing Contents - Erro Removendo Conteúdos + Erro Removendo Conteúdos - Error Removing Update - Erro ao Remover Atualização + Erro ao Remover Atualização - Error Removing DLC - Erro Removendo DLC + Erro Removendo DLC - + Remove Installed Game Contents? Remover Conteúdo Instalado do Jogo? - + Remove Installed Game Update? Remover Atualização Instalada do Jogo? - + Remove Installed Game DLC? Remover DLC Instalada do Jogo? - + Remove Entry Remover Entrada - - - - - - Successfully Removed - Removido com Sucesso + Removido com Sucesso - Successfully removed the installed base game. - Removida a instalação do jogo base com sucesso. + Removida a instalação do jogo base com sucesso. - The base game is not installed in the NAND and cannot be removed. - O jogo base não está instalado no NAND e não pode ser removido. + O jogo base não está instalado no NAND e não pode ser removido. - Successfully removed the installed update. - Removida a actualização instalada com sucesso. + Removida a actualização instalada com sucesso. - There is no update installed for this title. - Não há actualização instalada neste título. + Não há actualização instalada neste título. - There are no DLC installed for this title. - Não há DLC instalado neste título. + Não há DLC instalado neste título. - Successfully removed %1 installed DLC. - Removido DLC instalado %1 com sucesso. + Removido DLC instalado %1 com sucesso. - + Delete OpenGL Transferable Shader Cache? Apagar o cache de shaders transferível do OpenGL? - + Delete Vulkan Transferable Shader Cache? Apagar o cache de shaders transferível do Vulkan? - + Delete All Transferable Shader Caches? Apagar todos os caches de shaders transferíveis? - + Remove Custom Game Configuration? Remover Configuração Personalizada do Jogo? - + Remove Cache Storage? Remover Armazenamento da Cache? - + Remove File Remover Ficheiro - + Remove Play Time Data Remover dados de tempo jogado - + Reset play time? Deseja mesmo resetar o tempo jogado? - - Error Removing Transferable Shader Cache - Error ao Remover Cache de Shader Transferível + Error ao Remover Cache de Shader Transferível - - A shader cache for this title does not exist. - O Shader Cache para este titulo não existe. + O Shader Cache para este titulo não existe. - Successfully removed the transferable shader cache. - Removido a Cache de Shader Transferível com Sucesso. + Removido a Cache de Shader Transferível com Sucesso. - Failed to remove the transferable shader cache. - Falha ao remover a cache de shader transferível. + Falha ao remover a cache de shader transferível. - Error Removing Vulkan Driver Pipeline Cache - Erro ao Remover Cache de Pipeline do Driver Vulkan + Erro ao Remover Cache de Pipeline do Driver Vulkan - Failed to remove the driver pipeline cache. - Falha ao remover o pipeline de cache do driver. + Falha ao remover o pipeline de cache do driver. - - Error Removing Transferable Shader Caches - Erro ao remover os caches de shaders transferíveis + Erro ao remover os caches de shaders transferíveis - Successfully removed the transferable shader caches. - Os caches de shaders transferíveis foram removidos com sucesso. + Os caches de shaders transferíveis foram removidos com sucesso. - Failed to remove the transferable shader cache directory. - Falha ao remover o diretório do cache de shaders transferível. + Falha ao remover o diretório do cache de shaders transferível. - - Error Removing Custom Configuration - Erro ao Remover Configuração Personalizada + Erro ao Remover Configuração Personalizada - A custom configuration for this title does not exist. - Não existe uma configuração personalizada para este titúlo. + Não existe uma configuração personalizada para este titúlo. - Successfully removed the custom game configuration. - Removida a configuração personalizada do jogo com sucesso. + Removida a configuração personalizada do jogo com sucesso. - Failed to remove the custom game configuration. - Falha ao remover a configuração personalizada do jogo. + Falha ao remover a configuração personalizada do jogo. - - + + RomFS Extraction Failed! A Extração de RomFS falhou! - + There was an error copying the RomFS files or the user cancelled the operation. Houve um erro ao copiar os arquivos RomFS ou o usuário cancelou a operação. - + Full Cheio - + Skeleton Esqueleto - + Select RomFS Dump Mode Selecione o modo de despejo do RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Por favor, selecione a forma como você gostaria que o RomFS fosse despejado<br>Full irá copiar todos os arquivos para o novo diretório enquanto<br>skeleton criará apenas a estrutura de diretórios. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Não há espaço suficiente em %1 para extrair o RomFS. Por favor abra espaço ou selecione um diretório diferente em Emulação > Configurar > Sistema > Sistema de arquivos > Extrair raiz - + Extracting RomFS... Extraindo o RomFS ... - - - - - + + Cancel Cancelar - + RomFS Extraction Succeeded! Extração de RomFS Bem-Sucedida! - - - + The operation completed successfully. A operação foi completa com sucesso. - Integrity verification couldn't be performed! - A verificação de integridade não foi realizada. + A verificação de integridade não foi realizada. - File contents were not checked for validity. - O conteúdo do arquivo não foi analisado. + O conteúdo do arquivo não foi analisado. - - Verifying integrity... - Verificando integridade… + Verificando integridade… - - Integrity verification succeeded! - Verificação de integridade concluída! + Verificação de integridade concluída! - - Integrity verification failed! - Houve uma falha na verificação de integridade! + Houve uma falha na verificação de integridade! - File contents may be corrupt. - O conteúdo do arquivo pode estar corrompido. + O conteúdo do arquivo pode estar corrompido. - - - - Create Shortcut - Criar Atalho + Criar Atalho - Do you want to launch the game in fullscreen? - Gostaria de iniciar o jogo em tela cheia? + Gostaria de iniciar o jogo em tela cheia? - Successfully created a shortcut to %1 - Atalho criado com sucesso em %1 + Atalho criado com sucesso em %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Isso irá criar um atalho para o AppImage atual. Isso pode não funcionar corretamente se você fizer uma atualização. Continuar? + Isso irá criar um atalho para o AppImage atual. Isso pode não funcionar corretamente se você fizer uma atualização. Continuar? - Failed to create a shortcut to %1 - Falha ao criar atalho para %1 + Falha ao criar atalho para %1 - Create Icon - Criar Ícone + Criar Ícone - Cannot create icon file. Path "%1" does not exist and cannot be created. - Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. + Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Erro ao abrir %1 - + Select Directory Selecione o Diretório - + Properties Propriedades - + The game properties could not be loaded. As propriedades do jogo não puderam ser carregadas. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Executáveis Switch (%1);;Todos os Ficheiros (*.*) - + Load File Carregar Ficheiro - + Open Extracted ROM Directory Abrir o directório ROM extraído - + Invalid Directory Selected Diretório inválido selecionado - + The directory you have selected does not contain a 'main' file. O diretório que você selecionou não contém um arquivo 'Main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Ficheiro Switch Instalável (*.nca *.nsp *.xci);;Arquivo de Conteúdo Nintendo (*.nca);;Pacote de Envio Nintendo (*.nsp);;Imagem de Cartucho NX (*.xci) - + Install Files Instalar Ficheiros - + %n file(s) remaining %n arquivo restante @@ -6203,25 +6368,25 @@ Please go to Configure -> System -> Network and make a selection. - + Installing file "%1"... Instalando arquivo "%1"... - - + + Install Results Instalar Resultados - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar possíveis conflitos, desencorajamos que os utilizadores instalem os jogos base na NAND. Por favor, use esse recurso apenas para instalar atualizações e DLC. - + %n file(s) were newly installed @@ -6230,7 +6395,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLC. - + %n file(s) were overwritten @@ -6239,7 +6404,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLC. - + %n file(s) failed to install @@ -6248,242 +6413,310 @@ Por favor, use esse recurso apenas para instalar atualizações e DLC. - + System Application Aplicação do sistema - + System Archive Arquivo do sistema - + System Application Update Atualização do aplicativo do sistema - + Firmware Package (Type A) Pacote de Firmware (Tipo A) - + Firmware Package (Type B) Pacote de Firmware (Tipo B) - + Game Jogo - + Game Update Actualização do Jogo - + Game DLC DLC do Jogo - + Delta Title Título Delta - + Select NCA Install Type... Selecione o tipo de instalação do NCA ... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Por favor, selecione o tipo de título que você gostaria de instalar este NCA como: (Na maioria dos casos, o padrão 'Jogo' é suficiente). - + Failed to Install Falha na instalação - + The title type you selected for the NCA is invalid. O tipo de título que você selecionou para o NCA é inválido. - + File not found Arquivo não encontrado - + File "%1" not found Arquivo "%1" não encontrado - + OK OK - - + + Hardware requirements not met Requisitos de hardware não atendidos - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Seu sistema não atende os requisitos de harwdare. O relatório de compatibilidade foi desabilitado. - + Missing yuzu Account Conta Yuzu Ausente - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Para enviar um caso de teste de compatibilidade de jogos, você deve vincular sua conta yuzu.<br><br/>Para vincular sua conta yuzu, vá para Emulação &gt; Configuração &gt; Rede. - + Error opening URL Erro ao abrir URL - + Unable to open the URL "%1". Não foi possível abrir o URL "%1". - + TAS Recording Gravando TAS - + Overwrite file of player 1? Sobrescrever arquivo do jogador 1? - + Invalid config detected Configação inválida detectada - + Handheld controller can't be used on docked mode. Pro controller will be selected. O comando portátil não pode ser usado no modo encaixado na base. O Pro controller será selecionado. - - + + Amiibo Amiibo - - + + The current amiibo has been removed O amiibo atual foi removido - + Error Erro - - + + The current game is not looking for amiibos O jogo atual não está procurando amiibos - + Amiibo File (%1);; All Files (*.*) Arquivo Amiibo (%1);; Todos os Arquivos (*.*) - + Load Amiibo Carregar Amiibo - + Error loading Amiibo data Erro ao carregar dados do Amiibo - + The selected file is not a valid amiibo O arquivo selecionado não é um amiibo válido - + The selected file is already on use O arquivo selecionado já está em uso - + An unknown error occurred Ocorreu um erro desconhecido - - Verification failed for the following files: %1 - Houve uma falha na verificação dos seguintes arquivos: + Houve uma falha na verificação dos seguintes arquivos: %1 - + + Keys not installed Chaves não instaladas @@ -6492,255 +6725,215 @@ Would you like to bypass this and exit anyway? Instale as chaves de descriptografia e reinicie o yuzu antes de tentar instalar o firmware. - + Select Dumped Firmware Source Location Selecione o Local de Armazenamento do Firmware Extraído - Installing Firmware... - Instalando Firmware... + Instalando Firmware... - - - - Firmware install failed - A instalação do Firmware falhou + A instalação do Firmware falhou - Unable to locate potential firmware NCA files - Não foi possível localizar os possíveis arquivos NCA do firmware + Não foi possível localizar os possíveis arquivos NCA do firmware - Failed to delete one or more firmware file. - Falha ao deletar um ou mais arquivo de firmware. + Falha ao deletar um ou mais arquivo de firmware. Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. A instalação do firmware foi cancelada, o firmware pode estar danificado. Reinicie o yuzu ou reinstale o firmware. - One or more firmware files failed to copy into NAND. - Falha ao copiar um ou mais arquivos de firmware para a NAND. + Falha ao copiar um ou mais arquivos de firmware para a NAND. - Firmware integrity verification failed! - A verificação de integridade do Firmware falhou! + A verificação de integridade do Firmware falhou! - Select Dumped Keys Location - Selecione o Local das Chaves Extraídas + Selecione o Local das Chaves Extraídas - - - Decryption Keys install failed - Falha na instalação das Chaves de Decriptação + Falha na instalação das Chaves de Decriptação - prod.keys is a required decryption key file. - prod.keys é um arquivo de descriptografia obrigatório. + prod.keys é um arquivo de descriptografia obrigatório. - One or more keys failed to copy. - Falha ao copiar uma ou mais chaves. + Falha ao copiar uma ou mais chaves. - Decryption Keys install succeeded - Chaves de Descriptografia instaladas com sucesso + Chaves de Descriptografia instaladas com sucesso - Decryption Keys were successfully installed - As Chaves de Descriptografia foram instaladas com sucesso + As Chaves de Descriptografia foram instaladas com sucesso - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - Falha ao inicializar as Chaves de Descriptografia. Verifique se as suas ferramentas de extração estão atualizadas e extraia as chaves novamente. + Falha ao inicializar as Chaves de Descriptografia. Verifique se as suas ferramentas de extração estão atualizadas e extraia as chaves novamente. - - - - - - - + + + + + + No firmware available Nenhum firmware disponível - Please install the firmware to use the Album applet. - Instale o firmware para usar o applet Album. + Instale o firmware para usar o applet Album. - + Album Applet Applet Álbum - + Album applet is not available. Please reinstall firmware. O applet Álbum não está disponível. Reinstale o firmware. - Please install the firmware to use the Cabinet applet. - Instale o firmware para usar o applet Armário. + Instale o firmware para usar o applet Armário. - + Cabinet Applet Applet Armário - + Cabinet applet is not available. Please reinstall firmware. O applet Armário não está disponível. Reinstale o firmware. - Please install the firmware to use the Mii editor. - Instale o firmware para usar o applet Editor de Miis. + Instale o firmware para usar o applet Editor de Miis. - + Mii Edit Applet Applet Editor de Miis - + Mii editor is not available. Please reinstall firmware. O applet Editor de Miis não está disponível. Reinstale o firmware. - Please install the firmware to use the Controller Menu. - Por favor instale o firmware para usar o Menu de Controles. + Por favor instale o firmware para usar o Menu de Controles. - + Controller Applet Applet de controle - + Controller Menu is not available. Please reinstall firmware. Menu de Controles não está disponível. Por favor reinstale o firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Captura de Tela - + PNG Image (*.png) Imagem PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Situação TAS: Rodando %1%2 - + TAS state: Recording %1 Situação TAS: Gravando %1 - + TAS state: Idle %1/%2 Situação TAS: Repouso %1%2 - + TAS State: Invalid Situação TAS: Inválido - + &Stop Running &Parar de rodar - + &Start &Começar - + Stop R&ecording Parar G&ravação - + R&ecord G&ravação - + Building: %n shader(s) @@ -6748,18 +6941,18 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocidade: %1% / %2% - + Speed: %1% Velocidade: %1% @@ -6768,44 +6961,44 @@ Would you like to download it? Jogo: %1 FPS (Desbloqueado) - + Game: %1 FPS Jogo: %1 FPS - + Frame: %1 ms Quadro: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA Sem AA - + VOLUME: MUTE VOLUME: MUDO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Componentes de Derivação em Falta @@ -6814,12 +7007,12 @@ Would you like to download it? Faltando chaves de encriptação. <br>Por favor siga <a href='https://yuzu-emu.org/help/quickstart/'>o guia de início rápido do yuzu</a> para obter todas as suas chaves, firmware e jogos. - + Select RomFS Dump Target Selecione o destino de despejo do RomFS - + Please select which RomFS you would like to dump. Por favor, selecione qual o RomFS que você gostaria de despejar. @@ -6832,7 +7025,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Tem a certeza de que quer parar a emulação? Qualquer progresso não salvo será perdido. @@ -6845,102 +7038,102 @@ Would you like to bypass this and exit anyway? Deseja ignorar isso e sair mesmo assim? - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Nearest Mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + ScaleForce ScaleForce - + Area - + Docked Ancorado - + Handheld Portátil - + Normal Normal - + High Alto - + Extreme Extremo - + Vulkan Vulcano - + OpenGL OpenGL - + Null Nenhum (desativado) - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6948,13 +7141,13 @@ Deseja ignorar isso e sair mesmo assim? GRenderWindow - - + + OpenGL not available! OpenGL não está disponível! - + OpenGL shared contexts are not supported. Shared contexts do OpenGL não são suportados. @@ -6963,33 +7156,33 @@ Deseja ignorar isso e sair mesmo assim? yuzu não foi compilado com suporte OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Erro ao inicializar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. O seu GPU pode não suportar OpenGL, ou não tem os drivers gráficos mais recentes. - + Error while initializing OpenGL 4.6! Erro ao inicializar o OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 O teu GPU pode não suportar OpenGL 4.6, ou não tem os drivers gráficos mais recentes. - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Sua GPU pode não suportar uma ou mais extensões necessárias do OpenGL. Verifique se você possui a última versão dos drivers gráficos.<br><br>Renderizador GL:<br>%1<br><br>Extensões não suportadas:<br>%2 @@ -6997,128 +7190,128 @@ Deseja ignorar isso e sair mesmo assim? GameList - + Favorite Favorito - + Start Game Iniciar jogo - + Start Game without Custom Configuration Iniciar jogo sem configuração personalizada - + Open Save Data Location Abrir Localização de Dados Salvos - + Open Mod Data Location Abrir a Localização de Dados do Mod - + Open Transferable Pipeline Cache Abrir cache de pipeline transferível - + Remove Remover - + Remove Installed Update Remover Actualizações Instaladas - + Remove All Installed DLC Remover Todos os DLC Instalados - + Remove Custom Configuration Remover Configuração Personalizada - + Remove Play Time Data Remover dados de tempo jogado - + Remove Cache Storage Remove a Cache do Armazenamento - + Remove OpenGL Pipeline Cache Remover cache de pipeline do OpenGL - + Remove Vulkan Pipeline Cache Remover cache de pipeline do Vulkan - + Remove All Pipeline Caches Remover todos os caches de pipeline - + Remove All Installed Contents Remover Todos os Conteúdos Instalados - + Dump RomFS Despejar RomFS - + Dump RomFS to SDMC Extrair RomFS para SDMC - + Verify Integrity Verificar integridade - + Copy Title ID to Clipboard Copiar título de ID para a área de transferência - + Navigate to GameDB entry Navegue para a Entrada da Base de Dados de Jogos - + Create Shortcut Criar Atalho - + Add to Desktop Adicionar à Área de Trabalho - + Add to Applications Menu Adicionar ao Menu de Aplicativos - + Configure Game @@ -7127,62 +7320,62 @@ Deseja ignorar isso e sair mesmo assim? Propriedades - + Scan Subfolders Examinar Sub-pastas - + Remove Game Directory Remover diretório do Jogo - + ▲ Move Up ▲ Mover para Cima - + ▼ Move Down ▼ Mover para Baixo - + Open Directory Location Abrir Localização do diretório - + Clear Limpar - + Name Nome - + Compatibility Compatibilidade - + Add-ons Add-ons - + File type Tipo de Arquivo - + Size Tamanho - + Play time Tempo jogado @@ -7190,62 +7383,62 @@ Deseja ignorar isso e sair mesmo assim? GameListItemCompat - + Ingame Não Jogável - + Game starts, but crashes or major glitches prevent it from being completed. O jogo inicia, porém problemas ou grandes falhas impedem que ele seja concluído. - + Perfect Perfeito - + Game can be played without issues. O jogo pode ser jogado sem problemas. - + Playable Jogável - + Game functions with minor graphical or audio glitches and is playable from start to finish. O jogo funciona com pequenas falhas gráficas ou de áudio e pode ser reproduzido do início ao fim. - + Intro/Menu Introdução / Menu - + Game loads, but is unable to progress past the Start Screen. O jogo carrega, porém não consegue passar da tela inicial. - + Won't Boot Não Inicia - + The game crashes when attempting to startup. O jogo trava ao tentar iniciar. - + Not Tested Não Testado - + The game has not yet been tested. O jogo ainda não foi testado. @@ -7253,7 +7446,7 @@ Deseja ignorar isso e sair mesmo assim? GameListPlaceholder - + Double-click to add a new folder to the game list Clique duas vezes para adicionar uma nova pasta à lista de jogos @@ -7261,7 +7454,7 @@ Deseja ignorar isso e sair mesmo assim? GameListSearchField - + %1 of %n result(s) @@ -7269,12 +7462,12 @@ Deseja ignorar isso e sair mesmo assim? - + Filter: Filtro: - + Enter pattern to filter Digite o padrão para filtrar @@ -7356,7 +7549,7 @@ Deseja ignorar isso e sair mesmo assim? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7370,91 +7563,91 @@ Mensagem de depuração: Hotkeys - + Audio Mute/Unmute Mutar/Desmutar Áudio - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Janela Principal - + Audio Volume Down Volume Menos - + Audio Volume Up Volume Mais - + Capture Screenshot Captura de Tela - + Change Adapting Filter Alterar Filtro de Adaptação - + Change Docked Mode Alterar Modo de Ancoragem - + Change GPU Accuracy Alterar Precisão da GPU - + Configure Configurar - + Configure Current Game - + Continue/Pause Emulation Continuar/Pausar Emulação - + Exit Fullscreen Sair da Tela Cheia @@ -7463,97 +7656,97 @@ Mensagem de depuração: Sair do yuzu - - Exit eden + + Exit Eden - + Fullscreen Tela Cheia - + Load File Carregar Ficheiro - + Load/Remove Amiibo Carregar/Remover Amiibo - + Multiplayer Browse Public Game Lobby Multiplayer Navegar no Lobby de Salas Públicas - + Multiplayer Create Room Multiplayer Criar Sala - + Multiplayer Direct Connect to Room Multiplayer Conectar Diretamente à Sala - + Multiplayer Leave Room Multiplayer Sair da Sala - + Multiplayer Show Current Room Multiplayer Mostrar a Sala Atual - + Restart Emulation Reiniciar Emulação - + Stop Emulation Parar Emulação - + TAS Record Gravar TAS - + TAS Reset Reiniciar TAS - + TAS Start/Stop Iniciar/Parar TAS - + Toggle Filter Bar Alternar Barra de Filtro - + Toggle Framerate Limit Alternar Limite de Quadros por Segundo - + Toggle Mouse Panning Alternar o Giro do Mouse - + Toggle Renderdoc Capture Alternar a Captura do Renderdoc - + Toggle Status Bar Alternar Barra de Status @@ -7561,22 +7754,22 @@ Mensagem de depuração: InstallDialog - + Please confirm these are the files you wish to install. Por favor confirma que estes são os ficheiros que desejas instalar. - + Installing an Update or DLC will overwrite the previously installed one. Instalar uma Actualização ou DLC irá substituir a instalação anterior. - + Install Instalar - + Install Files to NAND Instalar Ficheiros no NAND @@ -7584,7 +7777,7 @@ Mensagem de depuração: LimitableInputDialog - + The text can't contain any of the following characters: %1 O texto não pode conter nenhum dos seguintes caracteres: @@ -7731,152 +7924,207 @@ Mensagem de depuração: &Arquivos recentes - + + Open &Eden Folders + + + + &Emulation &Emulação - + &View &Vista - + &Reset Window Size &Restaurar tamanho da janela - + &Debugging &Depurar - + Reset Window Size to &720p Restaurar tamanho da janela para &720p - + Reset Window Size to 720p Restaurar tamanho da janela para 720p - + Reset Window Size to &900p Restaurar tamanho da janela para &900p - + Reset Window Size to 900p Restaurar tamanho da janela para 900p - + Reset Window Size to &1080p Restaurar tamanho da janela para &1080p - + Reset Window Size to 1080p Restaurar tamanho da janela para 1080p - + &Multiplayer &Multijogador - + &Tools &Ferramentas - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Ajuda - + &Install Files to NAND... &Instalar arquivos na NAND... - + L&oad File... C&arregar arquivo... - + Load &Folder... Carregar &pasta... - + E&xit &Sair - + &Pause &Pausa - + &Stop &Parar - + &Verify Installed Contents &Verificar conteúdo instalado - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7885,97 +8133,97 @@ Mensagem de depuração: &Sobre o yuzu - + Single &Window Mode Modo de &janela única - + Con&figure... Con&figurar... - + Ctrl+, - + Display D&ock Widget Headers Exibir barra de títul&os de widgets afixados - + Show &Filter Bar Mostrar Barra de &Filtros - + Show &Status Bar Mostrar Barra de &Estado - + Show Status Bar Mostrar Barra de Estado - + &Browse Public Game Lobby &Navegar no Lobby de Salas Públicas - + &Create Room &Criar Sala - + &Leave Room &Sair da Sala - + &Direct Connect to Room Conectar &Diretamente Numa Sala - + &Show Current Room Exibir &Sala Atual - + F&ullscreen T&ela cheia - + &Restart &Reiniciar - + Load/Remove &Amiibo... Carregar/Remover &Amiibo... - + &Report Compatibility &Reportar compatibilidade - + Open &Mods Page Abrir Página de &Mods - + Open &Quickstart Guide Abrir &guia de início rápido - + &FAQ &Perguntas frequentes @@ -7984,77 +8232,82 @@ Mensagem de depuração: Abrir pasta &yuzu - + &Capture Screenshot &Captura de Tela - + Open &Album Abrir &Álbum - + &Set Nickname and Owner &Definir apelido e proprietário - + &Delete Game Data &Remover dados do jogo - + &Restore Amiibo &Recuperar Amiibo - + &Format Amiibo &Formatar Amiibo - + Open &Mii Editor Abrir &Editor de Miis - + &Configure TAS... &Configurar TAS - + Configure C&urrent Game... Configurar jogo atual... - + &Start &Começar - + &Reset &Restaurar - + R&ecord G&ravar - + Open &Controller Menu Menu Abrir &Controles - + Install Firmware Instalar Firmware - + + &About Eden + + + + Install Decryption Keys Instalar Chaves de Descriptografia @@ -8062,26 +8315,36 @@ Mensagem de depuração: MicroProfileDialog - &MicroProfile - &MicroPerfil + &MicroPerfil MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8141,37 +8404,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Status da conexão atual - + Not Connected. Click here to find a room! Não conectado. Clique aqui para procurar uma sala! - + Not Connected Não Conectado - + Connected Conectado - + New Messages Received Novas Mensagens Recebidas - + Error Erro - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Falha ao atualizar as informações da sala. Por favor verifique sua conexão com a internet e tente hospedar a sala novamente. @@ -8362,56 +8625,56 @@ p, li { white-space: pre-wrap; } Não está jogando um jogo - + Installed SD Titles Títulos SD instalados - + Installed NAND Titles Títulos NAND instalados - + System Titles Títulos do sistema - + Add New Game Directory Adicionar novo diretório de jogos - + Favorites Favoritos - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [não configurado] @@ -8422,14 +8685,14 @@ p, li { white-space: pre-wrap; } Hat %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Eixo %1%2 @@ -8440,357 +8703,357 @@ p, li { white-space: pre-wrap; } Botão %1 - - - - - - + + + + + + [unknown] [Desconhecido] - - - + + + Left Esquerda - - - + + + Right Direita - - - + + + Down Baixo - - - + + + Up Cima - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Começar - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Círculo - - + + Cross Cruz - - + + Square Quadrado - - + + Triangle Triângulo - - + + Share Compartilhar - - + + Options Opções - - + + [undefined] [indefinido] - + %1%2 %1%2 - - + + [invalid] [inválido] - - + + %1%2Hat %3 %1%2Direcional %3 - - - + + + %1%2Axis %3 %1%2Eixo %3 - - + + %1%2Axis %3,%4,%5 %1%2Eixo %3,%4,%5 - - + + %1%2Motion %3 %1%2Movimentação %3 - - + + %1%2Button %3 %1%2Botão %3 - - + + [unused] [sem uso] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Analógico esquerdo - + Stick R Analógico direito - + Plus Mais - + Minus Menos - - + + Home Home - + Capture Capturar - + Touch Toque - + Wheel Indicates the mouse wheel Volante - + Backward Para trás - + Forward Para a frente - + Task Tarefa - + Extra Extra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Alavanca %4 - - + + %1%2%3Axis %4 %1%2%3Eixo %4 - - + + %1%2%3Button %4 %1%2%3Botão %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8908,6 +9171,300 @@ p, li { white-space: pre-wrap; } Deseja restaurar este amiibo? + + QtCommon::Content + + + Installing Firmware... + Instalando Firmware... + + + + + + Cancel + Cancelar + + + + Firmware integrity verification failed! + A verificação de integridade do Firmware falhou! + + + + + Verification failed for the following files: + +%1 + Houve uma falha na verificação dos seguintes arquivos: + +%1 + + + + + Verifying integrity... + Verificando integridade… + + + + + Integrity verification succeeded! + Verificação de integridade concluída! + + + + + The operation completed successfully. + A operação foi completa com sucesso. + + + + + Integrity verification failed! + Houve uma falha na verificação de integridade! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + Selecione o Local das Chaves Extraídas + + + + Decryption Keys install succeeded + Chaves de Descriptografia instaladas com sucesso + + + + Decryption Keys were successfully installed + As Chaves de Descriptografia foram instaladas com sucesso + + + + Decryption Keys install failed + Falha na instalação das Chaves de Decriptação + + + + QtCommon::Game + + + Error Removing Contents + Erro Removendo Conteúdos + + + + Error Removing Update + Erro ao Remover Atualização + + + + Error Removing DLC + Erro Removendo DLC + + + + The base game is not installed in the NAND and cannot be removed. + O jogo base não está instalado no NAND e não pode ser removido. + + + + There is no update installed for this title. + Não há actualização instalada neste título. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Removido com Sucesso + + + + Successfully removed %1 installed DLC. + Removido DLC instalado %1 com sucesso. + + + + + Error Removing Transferable Shader Cache + Error ao Remover Cache de Shader Transferível + + + + + A shader cache for this title does not exist. + O Shader Cache para este titulo não existe. + + + + Successfully removed the transferable shader cache. + Removido a Cache de Shader Transferível com Sucesso. + + + + Failed to remove the transferable shader cache. + Falha ao remover a cache de shader transferível. + + + + Error Removing Vulkan Driver Pipeline Cache + Erro ao Remover Cache de Pipeline do Driver Vulkan + + + + Failed to remove the driver pipeline cache. + Falha ao remover o pipeline de cache do driver. + + + + + Error Removing Transferable Shader Caches + Erro ao remover os caches de shaders transferíveis + + + + Successfully removed the transferable shader caches. + Os caches de shaders transferíveis foram removidos com sucesso. + + + + Failed to remove the transferable shader cache directory. + Falha ao remover o diretório do cache de shaders transferível. + + + + + Error Removing Custom Configuration + Erro ao Remover Configuração Personalizada + + + + A custom configuration for this title does not exist. + Não existe uma configuração personalizada para este titúlo. + + + + Successfully removed the custom game configuration. + Removida a configuração personalizada do jogo com sucesso. + + + + Failed to remove the custom game configuration. + Falha ao remover a configuração personalizada do jogo. + + + + Reset Metadata Cache + Resetar a Cache da Metadata + + + + The metadata cache is already empty. + O cache de metadata já está vazio. + + + + The operation completed successfully. + A operação foi completa com sucesso. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Não foi possível excluir o cache de metadata. Pode estar em uso ou inexistente. + + + + Create Shortcut + Criar Atalho + + + + Do you want to launch the game in fullscreen? + Gostaria de iniciar o jogo em tela cheia? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Atalho criado com sucesso em %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Isso irá criar um atalho para o AppImage atual. Isso pode não funcionar corretamente se você fizer uma atualização. Continuar? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Falha ao criar atalho para %1 + + + + Create Icon + Criar Ícone + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Não foi possível criar o arquivo de ícone. O caminho "%1" não existe e não pode ser criado. + + + + No firmware available + Nenhum firmware disponível + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9203,7 +9760,7 @@ Tente novamente ou entre em contato com o desenvolvedor do software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9211,7 +9768,7 @@ Tente novamente ou entre em contato com o desenvolvedor do software. - + Users Utilizadores @@ -9335,7 +9892,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Pilha de Chamadas @@ -9343,12 +9900,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread esperado por nenhuma thread @@ -9356,102 +9913,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable executável - + paused pausado - + sleeping dormindo - + waiting for IPC reply aguardando resposta do IPC - + waiting for objects esperando por objectos - + waiting for condition variable A espera da variável de condição - + waiting for address arbiter esperando pelo árbitro de endereço - + waiting for suspend resume esperando pra suspender o resumo - + waiting aguardando - + initialized inicializado - + terminated terminado - + unknown desconhecido - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 núcleo %1 - + processor = %1 processador = %1 - + affinity mask = %1 máscara de afinidade =% 1 - + thread id = %1 id do segmento =% 1 - + priority = %1(current) / %2(normal) prioridade =%1(atual) / %2(normal) - + last running ticks = %1 últimos tiques em execução =%1 @@ -9459,7 +10016,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread esperado por thread @@ -9467,7 +10024,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Árvore de espera diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 9ff0c1bbd7..2b0b3755a7 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Подключение к серверу... - + Cancel Отмена - + Touch the top left corner <br>of your touchpad. Коснитесь левого верхнего угла<br>вашего тачпада. - + Now touch the bottom right corner <br>of your touchpad. Теперь коснитесь правого нижнего угла <br> вашего тачпада. - + Configuration completed! Настройка завершена! - + OK ОК @@ -397,134 +397,134 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - + Amiibo editor Amiibo редактор - + Controller configuration Конфигурация контроллера - + Data erase Стирание данных - + Error Ошибка - + Net connect Соединение по сети - + Player select Выбор игрока - + Software keyboard Виртуальная клавиатура - + Mii Edit Mii редактор - + Online web Онлайн веб - + Shop Магазин - + Photo viewer Просмотр фотографий - + Offline web Оффлайн веб - + Login share Поделиться логином - + Wifi web auth Веб вход в wi-fi - + My page Моя страница - + Output Engine: Движок вывода: - + Output Device: Устройство вывода: - + Input Device: Устройство ввода: - + Mute audio Отключить звук - + Volume: Громкость: - + Mute audio when in background Заглушить звук в фоновом режиме - + Multicore CPU Emulation Многоядерная эмуляция ЦП - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. Этот параметр увеличивает использование потоков эмуляции ЦП с 1 до 4. Это в основном параметр отладки и не должен быть отключен. - + Memory Layout Схема памяти - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ Enabling it will increase memory use. It is not recommended to enable unless a s Включение этой функции увеличит использование памяти. Рекомендуется включать только в случае необходимости для конкретной игры с модом текстур. - + Limit Speed Percent Ограничение процента cкорости - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,139 +547,116 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Точность: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. Эта настройка контролирует точность эмулции процессора. Не изменяйте ее, если не знаете, что делаете. - - + + Backend: Бэкэнд: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Отключить FMA (улучшает производительность на ЦП без FMA) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. Этот вариант улучшает скорость путем снижения точности инструкций слияния-умножения-сложения на процессорах без поддержки нативной FMA. - + Faster FRSQRTE and FRECPE Ускоренные FRSQRTE и FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. Этот вариант улучшает скорость некоторых приближенных функций с плавающей запятой за счет использования менее точных встроенных приближений. - + Faster ASIMD instructions (32 bits only) Ускоренные инструкции ASIMD (только 32 бит) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. Этот вариант улучшает скорость 32-битных функций с плавающей запятой ASIMD путем выполнения с неправильными режимами округления. - + Inaccurate NaN handling Неточная обработка NaN - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. Этот вариант улучшает скорость отключая проверки на NaN. Обратите внимание, что это также снижает точность некоторых операций с плавающей запятой. - + Disable address space checks Отключить проверку адресного пространства - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. Эта опция повышает скорость за счет исключения проверки безопасности перед каждым чтением/записью памяти в гостевом режиме. Отключение этой опции может позволить игре читать/записывать память эмулятора. - + Ignore global monitor Игнорировать глобальный мониторинг - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. Эта опция повышает скорость, полагаясь только на семантику cmpxchg для обеспечения безопасности инструкций исключительного доступа. Обратите внимание, что это может привести к дедлокам и race condition. - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. Переключение между доступными графическими API. В большинстве случаев рекомендуется использовать Vulkan. - + Device: Устройство: - + This setting selects the GPU to use with the Vulkan backend. Эта настройка выбирает GPU для Vulkan. - + Shader Backend: Бэкенд шейдеров: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -690,12 +667,12 @@ GLASM - устаревший бэкэнд, доступный только дл SPIR-V компилирует быстрее всего, но дает плохие результаты на большинстве драйверов GPU. - + Resolution: Разрешение: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -704,27 +681,27 @@ Options lower than 1X can cause rendering issues. Опции ниже 1X могут вызывать проблемы с отображением. - + Window Adapting Filter: Фильтр адаптации окна: - + FSR Sharpness: Резкость FSR: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. Определяет, насколько чётким будет изображение при использовании динамического контраста FSR. - + Anti-Aliasing Method: Метод сглаживания: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -733,12 +710,12 @@ SMAA предлагает лучшее качество. FXAA имеет меньшее влияние на производительность и может создавать лучшую и более стабильную картинку на очень низком разрешении. - + Fullscreen Mode: Полноэкранный режим: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -747,12 +724,12 @@ Borderless более совместим с экранной клавиатур Эксклюзивный полноэкранный режим может иметь лучшую производительность и лучшую поддержку Freesync/Gsync. - + Aspect Ratio: Соотношение сторон: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -761,48 +738,35 @@ Also controls the aspect ratio of captured screenshots. Также контролирует соотношение сторон захваченных скриншотов. - + Use disk pipeline cache Использовать кэш конвейера на диске - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Позволяет сохранять шейдеры на диск для более быстрой загрузки при последующем запуске игры. Отключение этой функции предназначено только для отладки. - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Использовать асинхронную эмуляцию ГП - + Uses an extra CPU thread for rendering. This option should always remain enabled. Использует дополнительный поток ЦП для рендеринга. Эта опция всегда должна оставаться включенной. - + NVDEC emulation: Эмуляция NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -811,12 +775,12 @@ In most cases, GPU decoding provides the best performance. В большинстве случаев декодирование с использованием ГП обеспечивает лучшую производительность. - + ASTC Decoding Method: Метод декодирования ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -828,34 +792,24 @@ GPU: Использовать вычислительные шейдеры ГП CPU Асинхронно: Использовать ЦП для декодирования текстур ASTC по мере их поступления. Полностью устраняет заикание при декодировании ASTC, но вызывает артефакты во время декодирования текстуры. - + ASTC Recompression Method: Метод пересжатия ASTC: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. Почти все выделенные графические процессоры для настольных и портативных компьютеров не поддерживают текстуры ASTC, что заставляет эмулятор распаковывать их в промежуточный формат, поддерживаемый любой картой, RGBA8. Эта опция повторно сжимает RGBA8 в формат BC1 или BC3, экономя видеопамять, но негативно влияя на качество изображения. - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Режим верт. синхронизации: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -866,51 +820,49 @@ Mailbox может иметь меньшую задержку, чем FIFO, и Моментальная (без синхронизации) просто показывает все кадры и может иметь разрывы. - + Enable asynchronous presentation (Vulkan only) Включите асинхронное отображение (только для Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Немного улучшает производительность, перемещая презентацию на отдельный поток ЦП. - + Force maximum clocks (Vulkan only) Принудительно заставить максимальную тактовую частоту (только для Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Выполняет работу в фоновом режиме в ожидании графических команд, не позволяя ГП снижать тактовую частоту. - + Anisotropic Filtering: Анизотропная фильтрация: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. Контролирует качество отображения текстур под наклонными углами. Это нетребовательная настройка, можно выбрать 16x на большинстве графических процессоров. - Accuracy Level: - Уровень точности: + Уровень точности: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - Точность эмуляции GPU. + Точность эмуляции GPU. Большинство игр отображаются нормально с настройкой "Нормальная", но для некоторых требуется "Высокая". Частицы обычно отображаются правильно только с высокой точностью. "Экстремальная" следует использовать только для отладки. @@ -918,12 +870,12 @@ Some games may require booting on high to render properly. Некоторые игры могут требовать запуска с высокой точностью для правильного отображения. - + Use asynchronous shader building (Hack) Использовать асинхронное построение шейдеров (Хак) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. Включает асинхронную компиляцию шейдеров, что уменьшит зависания из-за шейдеров. Функция является экспериментальной. @@ -937,24 +889,24 @@ This feature is experimental. Включает функцию Fast GPU Time. Этот параметр заставит большинство игр работать в максимальном родном разрешении. - + Use Vulkan pipeline cache Использовать конвейерный кэш Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Включает кэш конвейера, специфичный для производителя ГП. Эта опция может значительно улучшить время загрузки шейдеров в тех случаях, когда драйвер Vulkan не хранит внутренние файлы кэша конвейера. - + Enable Compute Pipelines (Intel Vulkan Only) Включить вычислительные конвейеры (только для Intel Vulkan) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -963,110 +915,110 @@ Compute pipelines are always enabled on all other drivers. Вычислительные конвейеры включены по умолчанию во всех остальных драйверах. - + Enable Reactive Flushing Включить реактивную очистку - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Вместо прогнозирующей очистки используется реактивная очистка, что обеспечивает более точную синхронизацию памяти. - + Sync to framerate of video playback Привязать к фреймрейту видео. - + Run the game at normal speed during video playback, even when the framerate is unlocked. Обычная скорость игры во время видео, даже если фреймрейт разблокирован. - + Barrier feedback loops Обратная связь с барьерами. - + Improves rendering of transparency effects in specific games. Улучшает эффекты прозрачности в некоторых играх. - + RNG Seed Сид RNG - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. Управляет начальным значением генератора случайных чисел. В основном используется для спидранов. - + Device Name Название устройства - + The name of the emulated Switch. Имя эмулируемого Switch. - + Custom RTC Date: Пользовательская RTC-дата: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. Этот параметр позволяет изменить эмулируемые часы на Switch. Может использоваться для манипуляции временем в играх. - + Language: Язык: - + Note: this can be overridden when region setting is auto-select Примечание: может быть перезаписано если регион выбирается автоматически - + Region: Регион: - + The region of the emulated Switch. Регион эмулируемого Switch. - + Time Zone: Часовой пояс: - + The time zone of the emulated Switch. Часовой пояс эмулируемого Switch. - + Sound Output Mode: Режим вывода звука: - + Console Mode: Консольный режим: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1075,7 +1027,7 @@ Setting to Handheld can help improve performance for low end systems. Установка в режим портативной консоли может помочь улучшить производительность для слабых устройств. - + Prompt for user on game boot Спрашивать пользователя при запуске игры @@ -1084,7 +1036,7 @@ Setting to Handheld can help improve performance for low end systems. Спрашивать выбрать профиль пользователя при каждой загрузке - полезно, если несколько людей используют yuzu на одном компьютере. - + Pause emulation when in background Приостанавливать эмуляцию в фоновом режиме @@ -1093,842 +1045,996 @@ Setting to Handheld can help improve performance for low end systems. Эта настройка приостанавливает работу yuzu при переключении на другие окна. - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation Подтвердите перед остановкой эмуляции - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. Эта настройка переопределяет запросы игры, запрашивающие подтверждение остановки игры. Включение этой настройки обходит такие запросы и непосредственно завершает эмуляцию. - + Hide mouse on inactivity Спрятать мышь при неактивности - + This setting hides the mouse after 2.5s of inactivity. Эта настройка скрывает указатель мыши после 2,5 секунды бездействия. - + Disable controller applet Отключить веб-апплет - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. Принудительно отключает использование приложения контроллера гостями. При попытке гостя открыть приложение контроллера оно немедленно закрывается. - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode Включить режим игры - + Custom frontend Свой фронтенд - + Real applet Реальное приложение - - Never - - - - - On Load - - - - - Always - - - - + CPU ЦП - + GPU графический процессор - + CPU Asynchronous Асинхронный ГП - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - Conservative - - - - - Aggressive - - - - + OpenGL OpenGL - + Vulkan Vulkan - + Null Null - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (ассемблерные шейдеры, только для NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (Экспериментальный, только для AMD/Mesa) - + Normal Нормальная - + High Высокая - + Extreme Экстрим - + Auto Авто - + Accurate Точно - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Окно без границ - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на ЦП - + GPU Video Decoding (Default) Декодирование видео на ГП (по умолчанию) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЭКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЭКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЭКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian Гаусс - + ScaleForce ScaleForce - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ Super Resolution - - Area - - - - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Заставить 4:3 - + Force 21:9 Заставить 21:9 - + Force 16:10 Заставить 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + + Default По умолчанию - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Conservative + + + + + Aggressive + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - - + + Serbian (српски) + + + + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египт - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулусы - + Mono Моно - + Stereo Стерео - + Surround Объёмный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (по умолчанию) - + 6GB DRAM (Unsafe) 6GB ОЗУ (Небезопасно) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1937,37 +2043,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливаться - + Never ask Никогда не спрашивать @@ -2322,27 +2428,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Журналирование - + Open Log Location Открыть папку для журналов - + Global Log Filter Глобальный фильтр журналов - + When checked, the max size of the log increases from 100 MB to 1 GB Если включено, максимальный размер журнала увеличивается со 100 МБ до 1 ГБ - + Enable Extended Logging** Включить расширенное ведение журнала** - + Show Log in Console Показывать журнал в консоли @@ -2488,7 +2594,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2550,7 +2656,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Это будет автоматически сброшено после закрытия yuzu. - + Web applet not compiled Веб-апплет не скомпилирован @@ -2600,7 +2706,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2609,88 +2715,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Некоторые настройки доступны только тогда, когда игра не запущена. - + Applets Апплеты - - + + Audio Звук - - + + CPU ЦП - + Debug Отладка - + Filesystem Файловая система - - + + General Общие - - + + Graphics Графика - + GraphicsAdvanced ГрафикаРасширенные - + GraphicsExtensions - + Hotkeys Горячие клавиши - - + + Controls Управление - + Profiles Профили - + Network Сеть - - + + System Система - + Game List Список игр - + Web Сеть @@ -2788,51 +2894,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Сбросить кэш метаданных - + Select Emulated NAND Directory... Выберите папку для эмулируемого NAND... - + Select Emulated SD Directory... Выберите папку для эмулируемого SD... - + Select Gamecard Path... Выберите папку для картриджей... - + Select Dump Directory... Выберите папку для дампов... - + Select Mod Load Directory... Выберите папку для модов... - The metadata cache is already empty. - Кэш метаданных уже пустой. + Кэш метаданных уже пустой. - The operation completed successfully. - Операция выполнена успешно. + Операция выполнена успешно. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Кэш метаданных не может быть удален. Возможно, он используется или отсутствует. + Кэш метаданных не может быть удален. Возможно, он используется или отсутствует. @@ -2863,12 +2963,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Это сбросит все настройки и удалит все конфигурации под отдельные игры. При этом не будут удалены пути для игр, профили или профили ввода. Продолжить? @@ -2901,33 +3001,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Фоновый цвет: - + % FSR sharpening percentage (e.g. 50%) % - + Off Отключена - + VSync Off Верт. синхронизация отключена - + Recommended Рекомендуется - + On Включена - + VSync On Верт. синхронизация включена @@ -2964,14 +3064,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3003,75 +3107,75 @@ These settings are experimental, and may cause black screens. If your games fail Ввостановить значения по умолчанию. - + Action Действие - + Hotkey Горячая клавиша - + Controller Hotkey Горячая клавиша контроллера - - - + + + Conflicting Key Sequence Конфликтующее сочетание клавиш - - + + The entered key sequence is already assigned to: %1 Введенное сочетание уже назначено на: %1 - + [waiting] [ожидание] - + Invalid Недопустимо - + Invalid hotkey settings Неверные настройки горячих клавиш - + An error occurred. Please report this issue on github. Произошла ошибка. Пожалуйста, сообщите об этой проблеме на github. - + Restore Default Ввостановить значение по умолчанию - + Clear Очистить - + Conflicting Button Sequence Конфликтующее сочетание кнопок - + The default button sequence is already assigned to: %1 Сочетание кнопок по умолчанию уже назначено на: %1 - + The default key sequence is already assigned to: %1 Сочетание клавиш по умолчанию уже назначено на: %1 @@ -3391,7 +3495,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3546,7 +3650,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Левый мини-джойстик @@ -3656,14 +3760,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3682,7 +3786,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Плюс @@ -3695,15 +3799,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3748,7 +3852,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Правый мини-джойстик @@ -3763,242 +3867,242 @@ These settings are experimental, and may cause black screens. If your games fail Настроить - - - - + + + + Clear Очистить - - - - - + + + + + [not set] [не задано] - - - + + + Invert button Инвертировать кнопку - - + + Toggle button Переключить кнопку - + Turbo button Турбо кнопка - - + + Invert axis Инвертировать оси - - - + + + Set threshold Установить порог - - + + Choose a value between 0% and 100% Выберите значение между 0% и 100% - + Toggle axis Переключить оси - + Set gyro threshold Установить порог гироскопа - + Calibrate sensor Калибровка датчика - + Map Analog Stick Задать аналоговый мини-джойстик - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. После нажатия на ОК, двигайте ваш мини-джойстик горизонтально, а затем вертикально. Чтобы инвертировать оси, сначала двигайте ваш мини-джойстик вертикально, а затем горизонтально. - + Center axis Центрировать оси - - + + Deadzone: %1% Мёртвая зона: %1% - - + + Modifier Range: %1% Диапазон модификатора: %1% - - + + Pro Controller Контроллер Pro - + Dual Joycons Двойные Joy-Con'ы - + Left Joycon Левый Joy-Сon - + Right Joycon Правый Joy-Сon - + Handheld Портативный - + GameCube Controller Контроллер GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Контроллер NES - + SNES Controller Контроллер SNES - + N64 Controller Контроллер N64 - + Sega Genesis Sega Genesis - + Start / Pause Старт / Пауза - + Z Z - + Control Stick Мини-джойстик управления - + C-Stick C-Джойстик - + Shake! Встряхните! - + [waiting] [ожидание] - + New Profile Новый профиль - + Enter a profile name: Введите имя профиля: - - + + Create Input Profile Создать профиль управления - + The given profile name is not valid! Заданное имя профиля недействительно! - + Failed to create the input profile "%1" Не удалось создать профиль управления "%1" - + Delete Input Profile Удалить профиль управления - + Failed to delete the input profile "%1" Не удалось удалить профиль управления "%1" - + Load Input Profile Загрузить профиль управления - + Failed to load the input profile "%1" Не удалось загрузить профиль управления "%1" - + Save Input Profile Сохранить профиль управления - + Failed to save the input profile "%1" Не удалось сохранить профиль управления "%1" @@ -4055,7 +4159,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure Настроить @@ -4091,7 +4195,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test Тест @@ -4110,7 +4214,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Узнать больше</span></a> - + %1:%2 %1:%2 @@ -4119,77 +4223,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Номер порта содержит недопустимые символы - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Порт должен быть в районе от 0 до 65353 - + IP address is not valid IP-адрес недействителен - + This UDP server already exists Этот UDP сервер уже существует - + Unable to add more than 8 servers Невозможно добавить более 8 серверов - + Testing Тестирование - + Configuring Настройка - + Test Successful Тест успешен - + Successfully received data from the server. Успешно получена информация с сервера - + Test Failed Тест провален - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Не удалось получить действительные данные с сервера.<br>Убедитесь, что сервер правильно настроен, а также проверьте адрес и порт. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Тест UDP или калибрация в процессе.<br>Пожалуйста, подождите завершения. @@ -4316,7 +4420,12 @@ Current values are %1% and %2% respectively. Интерфейс сети - + + Enable Airplane Mode + + + + None Нет @@ -4374,52 +4483,52 @@ Current values are %1% and %2% respectively. Некоторые настройки доступны только тогда, когда игра не запущена. - + Add-Ons Дополнения - + System Система - + CPU ЦП - + Graphics Графика - + Adv. Graphics Расш. Графика - + GPU Extensions - + Audio Звук - + Input Profiles Профили управления - + Linux Linux - + Properties Свойства @@ -4437,12 +4546,12 @@ Current values are %1% and %2% respectively. Дополнения - + Patch Name Название патча - + Version Версия @@ -4480,27 +4589,32 @@ Current values are %1% and %2% respectively. Выбрать изображение - + + Select Avatar + + + + Add Добавить - + Rename Переименовать - + Remove Удалить - + Profile management is available only when game is not running. Управление профилями недоступно пока запущена игра. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4508,100 +4622,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Введите имя пользователя - + Users Пользователи - + Enter a username for the new user: Введите имя пользователя для нового профиля: - + Enter a new username: Введите новое имя пользователя: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Выберите изображение пользователя - - JPEG Images (*.jpg *.jpeg) - Изображения JPEG (*.jpg, *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + Нет доступной прошивки + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Изображения JPEG (*.jpg, *.jpeg) + + + Error deleting image Ошибка при удалении изображения - + Error occurred attempting to overwrite previous image at: %1. Ошибка при попытке перезаписи предыдущего изображения в: %1. - + Error deleting file Ошибка при удалении файла - + Unable to delete existing file: %1. Не удалось удалить существующий файл: %1. - + Error creating user image directory Ошибка при создании папки пользовательских изображений - + Unable to create directory %1 for storing user images. Не получилось создать папку %1 для хранения изображений пользователя. - Error copying user image - Ошибка при копировании изображения пользователя + Ошибка при копировании изображения пользователя - Unable to copy image from %1 to %2 - Не получилось скопировать изображение из %1 в %2 + Не получилось скопировать изображение из %1 в %2 - Error resizing user image - Ошибка при изменении размера изображения пользователя + Ошибка при изменении размера изображения пользователя - Unable to resize image - Невозможно изменить размер изображения + Невозможно изменить размер изображения + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Отмена + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Удалить этого пользователя? Все сохраненные данные пользователя будут удалены. - + Confirm Delete Подтвердите удаление - + Name: %1 UUID: %2 Имя: %1 @@ -4654,7 +4857,7 @@ UUID: %2 - + Enable Включить @@ -4665,7 +4868,7 @@ UUID: %2 - + Not connected Не подключено @@ -4675,63 +4878,63 @@ UUID: %2 По умолчанию - + Clear Очистить - + [not set] [не задано] - + Invert axis Инвертировать оси - - + + Deadzone: %1% Мёртвая зона: %1% - + Error enabling ring input Ошибка при включении ввода кольца - + Direct Joycon driver is not enabled Прямой драйвер Joycon не активен - + Configuring Настройка - + The current mapped device doesn't support the ring controller Текущее выбранное устройство не поддерживает контроллер Ring - + The current mapped device doesn't have a ring attached К текущему устройству не прикреплено кольцо - + The current mapped device is not connected Текущее устройство не подключено - + Unexpected driver result %1 Неожиданный результат драйвера %1 - + [waiting] [ожидание] @@ -4773,7 +4976,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4825,12 +5028,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Настройка TAS - + Select TAS Load Directory... Выбрать папку загрузки TAS... @@ -4940,7 +5143,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5260,6 +5463,16 @@ Drag points to change position, or double-click table cells to edit values.Web Сеть + + + Eden Web Service + + + + + Generate + + yuzu Web Service Веб-сервис yuzu @@ -5269,42 +5482,29 @@ Drag points to change position, or double-click table cells to edit values.Предоставляя свое имя пользователя и токен, вы соглашаетесь разрешить yuzu собирать дополнительные данные об использовании, которые могут включать информацию, идентифицирующую пользователя. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Подтвердить + Подтвердить - Sign up - Регистрация + Регистрация - + Token: Токен: - + Username: Имя пользователя: - What is my token? - Что такое токен и где его найти? + Что такое токен и где его найти? - + Web Service configuration can only be changed when a public room isn't being hosted. Настройки веб-службы могут быть изменены только в том случае, когда не хостится публичная комната. @@ -5329,12 +5529,12 @@ Drag points to change position, or double-click table cells to edit values.Перегенерировать - + Discord Presence Discord Presence - + Show Current Game in your Discord Status Показывать текущую игру в вашем статусе Discord @@ -5343,24 +5543,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Узнать больше</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Регистрация</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Регистрация</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5383,10 +5567,9 @@ Drag points to change position, or double-click table cells to edit values.Токен не был подтвержден. Изменение вашего токена не было сохранено. - Unverified, please click Verify before saving configuration Tooltip - Не подтверждено, пожалуйста нажмите кнопку Подтвердить прежде чем сохранять конфигурацию. + Не подтверждено, пожалуйста нажмите кнопку Подтвердить прежде чем сохранять конфигурацию. Verifying... @@ -5410,20 +5593,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Ошибка подтверждения. Убедитесь, что вы правильно ввели свой токен и что ваше подключение к Интернету работает. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Контроллер P1 - + &Controller P1 [&C] Контроллер P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Версия + + DirectConnect @@ -5529,7 +5759,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5537,11 +5772,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. Хост комнаты забанил вас. Поговорите с хостом, чтобы он разбанил вас, или попробуйте другую комнату. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5603,7 +5833,7 @@ Please go to Configure -> System -> Network and make a selection. Телеметрия - + Broken Vulkan Installation Detected Обнаружена поврежденная установка Vulkan @@ -5612,106 +5842,105 @@ Please go to Configure -> System -> Network and make a selection. Не удалось выполнить инициализацию Vulkan во время загрузки.<br><br>Нажмите <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>здесь для получения инструкций по устранению проблемы</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущена игра - + Loading Web Applet... Загрузка веб-апплета... - - + + Disable Web Applet Отключить веб-апплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Отключение веб-апплета может привести к неожиданному поведению и должно использоваться только с Super Mario 3D All-Stars. Вы уверены, что хотите отключить веб-апплет? (Его можно снова включить в настройках отладки.) - + The amount of shaders currently being built Количество создаваемых шейдеров на данный момент - + The current selected resolution scaling multiplier. Текущий выбранный множитель масштабирования разрешения. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция идет быстрее или медленнее, чем на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Количество кадров в секунду в данный момент. Значение будет меняться между играми и сценами. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, которое нужно для эмуляции 1 кадра Switch, не принимая во внимание ограничение FPS или вертикальную синхронизацию. Для эмуляции в полной скорости значение должно быть не больше 16,67 мс. - + Unmute Включить звук - + Mute Выключить звук - + Reset Volume Сбросить громкость - + &Clear Recent Files [&C] Очистить недавние файлы - + &Continue [&C] Продолжить - + &Pause [&P] Пауза - Warning Outdated Game Format - Предупреждение устаревший формат игры + Предупреждение устаревший формат игры You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Для этой игры вы используете разархивированный формат ROM'а, который является устаревшим и был заменен другими, такими как NCA, NAX, XCI или NSP. В разархивированных каталогах ROM'а отсутствуют иконки, метаданные и поддержка обновлений. <br><br>Для получения информации о различных форматах Switch, поддерживаемых yuzu, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>просмотрите нашу вики</a>. Это сообщение больше не будет отображаться. - - + + Error while loading ROM! Ошибка при загрузке ROM'а! - + The ROM format is not supported. Формат ROM'а не поддерживается. - + An error occurred initializing the video core. Произошла ошибка при инициализации видеоядра. @@ -5720,7 +5949,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu столкнулся с ошибкой при запуске видеоядра. Обычно это вызвано устаревшими драйверами ГП, включая интегрированные. Проверьте журнал для получения более подробной информации. Дополнительную информацию о доступе к журналу смотрите на следующей странице: <a href='https://yuzu-emu.org/help/reference/log-files/'>Как загрузить файл журнала</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Ошибка при загрузке ROM'а! %1 @@ -5731,774 +5960,767 @@ Please go to Configure -> System -> Network and make a selection. %1<br>Пожалуйста, следуйте <a href='https://yuzu-emu.org/help/quickstart/'>краткому руководству пользователя yuzu</a> чтобы пере-дампить ваши файлы<br>Вы можете обратиться к вики yuzu</a> или Discord yuzu</a> для помощи. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Пожалуйста, проверьте журнал для подробностей. - + (64-bit) (64-х битный) - + (32-bit) (32-х битный) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закрываем программу... - + Save Data Сохранения - + Mod Data Данные модов - + Error Opening %1 Folder Ошибка при открытии папки %1 - - + + Folder does not exist! Папка не существует! - Error Opening Transferable Shader Cache - Ошибка при открытии переносного кэша шейдеров + Ошибка при открытии переносного кэша шейдеров - Failed to create the shader cache directory for this title. - Не удалось создать папку кэша шейдеров для этой игры. + Не удалось создать папку кэша шейдеров для этой игры. - Error Removing Contents - Ошибка при удалении содержимого + Ошибка при удалении содержимого - Error Removing Update - Ошибка при удалении обновлений + Ошибка при удалении обновлений - Error Removing DLC - Ошибка при удалении DLC + Ошибка при удалении DLC - + Remove Installed Game Contents? Удалить установленное содержимое игр? - + Remove Installed Game Update? Удалить установленные обновления игры? - + Remove Installed Game DLC? Удалить установленные DLC игры? - + Remove Entry Удалить запись - - - - - - Successfully Removed - Успешно удалено + Успешно удалено - Successfully removed the installed base game. - Установленная игра успешно удалена. + Установленная игра успешно удалена. - The base game is not installed in the NAND and cannot be removed. - Игра не установлена в NAND и не может быть удалена. + Игра не установлена в NAND и не может быть удалена. - Successfully removed the installed update. - Установленное обновление успешно удалено. + Установленное обновление успешно удалено. - There is no update installed for this title. - Для этой игры не было установлено обновление. + Для этой игры не было установлено обновление. - There are no DLC installed for this title. - Для этой игры не были установлены DLC. + Для этой игры не были установлены DLC. - Successfully removed %1 installed DLC. - Установленное DLC %1 было успешно удалено + Установленное DLC %1 было успешно удалено - + Delete OpenGL Transferable Shader Cache? Удалить переносной кэш шейдеров OpenGL? - + Delete Vulkan Transferable Shader Cache? Удалить переносной кэш шейдеров Vulkan? - + Delete All Transferable Shader Caches? Удалить весь переносной кэш шейдеров? - + Remove Custom Game Configuration? Удалить пользовательскую настройку игры? - + Remove Cache Storage? Удалить кэш-хранилище? - + Remove File Удалить файл - + Remove Play Time Data Удалить данные о времени игры - + Reset play time? Сбросить время игры? - - Error Removing Transferable Shader Cache - Ошибка при удалении переносного кэша шейдеров + Ошибка при удалении переносного кэша шейдеров - - A shader cache for this title does not exist. - Кэш шейдеров для этой игры не существует. + Кэш шейдеров для этой игры не существует. - Successfully removed the transferable shader cache. - Переносной кэш шейдеров успешно удалён. + Переносной кэш шейдеров успешно удалён. - Failed to remove the transferable shader cache. - Не удалось удалить переносной кэш шейдеров. + Не удалось удалить переносной кэш шейдеров. - Error Removing Vulkan Driver Pipeline Cache - Ошибка при удалении конвейерного кэша Vulkan + Ошибка при удалении конвейерного кэша Vulkan - Failed to remove the driver pipeline cache. - Не удалось удалить конвейерный кэш шейдеров. + Не удалось удалить конвейерный кэш шейдеров. - - Error Removing Transferable Shader Caches - Ошибка при удалении переносного кэша шейдеров + Ошибка при удалении переносного кэша шейдеров - Successfully removed the transferable shader caches. - Переносной кэш шейдеров успешно удален. + Переносной кэш шейдеров успешно удален. - Failed to remove the transferable shader cache directory. - Ошибка при удалении папки переносного кэша шейдеров. + Ошибка при удалении папки переносного кэша шейдеров. - - Error Removing Custom Configuration - Ошибка при удалении пользовательской настройки + Ошибка при удалении пользовательской настройки - A custom configuration for this title does not exist. - Пользовательская настройка для этой игры не существует. + Пользовательская настройка для этой игры не существует. - Successfully removed the custom game configuration. - Пользовательская настройка игры успешно удалена. + Пользовательская настройка игры успешно удалена. - Failed to remove the custom game configuration. - Не удалось удалить пользовательскую настройку игры. + Не удалось удалить пользовательскую настройку игры. - - + + RomFS Extraction Failed! Не удалось извлечь RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Произошла ошибка при копировании файлов RomFS или пользователь отменил операцию. - + Full Полный - + Skeleton Скелет - + Select RomFS Dump Mode Выберите режим дампа RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Пожалуйста, выберите, как вы хотите выполнить дамп RomFS. <br>Полный скопирует все файлы в новую папку, в то время как <br>скелет создаст только структуру папок. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root В %1 недостаточно свободного места для извлечения RomFS. Пожалуйста, освободите место или выберите другую папку для дампа в Эмуляция > Настройка > Система > Файловая система > Корень дампа - + Extracting RomFS... Извлечение RomFS... - - - - - + + Cancel Отмена - + RomFS Extraction Succeeded! Извлечение RomFS прошло успешно! - - - + The operation completed successfully. Операция выполнена. - Integrity verification couldn't be performed! - Проверка целостности не может быть выполнена! + Проверка целостности не может быть выполнена! - File contents were not checked for validity. - Файл не проверялся на корректность. + Файл не проверялся на корректность. - - Verifying integrity... - Проверка целостности... + Проверка целостности... - - Integrity verification succeeded! - Проверка целостности прошла успешно! + Проверка целостности прошла успешно! - - Integrity verification failed! - Проверка целостности не удалась! + Проверка целостности не удалась! - File contents may be corrupt. - Файл может быть поврежден. + Файл может быть поврежден. - - - - Create Shortcut - Создать ярлык + Создать ярлык - Do you want to launch the game in fullscreen? - Вы хотите запустить игру в полноэкранном режиме? + Вы хотите запустить игру в полноэкранном режиме? - Successfully created a shortcut to %1 - Успешно создан ярлык в %1 + Успешно создан ярлык в %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Это создаст ярлык для текущего AppImage. Он может не работать после обновлений. Продолжить? + Это создаст ярлык для текущего AppImage. Он может не работать после обновлений. Продолжить? - Failed to create a shortcut to %1 - Не удалось создать ярлык для %1 + Не удалось создать ярлык для %1 - Create Icon - Создать иконку + Создать иконку - Cannot create icon file. Path "%1" does not exist and cannot be created. - Невозможно создать файл иконки. Путь "%1" не существует и не может быть создан. + Невозможно создать файл иконки. Путь "%1" не существует и не может быть создан. - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Ошибка открытия %1 - + Select Directory Выбрать папку - + Properties Свойства - + The game properties could not be loaded. Не удалось загрузить свойства игры. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Исполняемый файл Switch (%1);;Все файлы (*.*) - + Load File Загрузить файл - + Open Extracted ROM Directory Открыть папку извлечённого ROM'а - + Invalid Directory Selected Выбрана недопустимая папка - + The directory you have selected does not contain a 'main' file. Папка, которую вы выбрали, не содержит файла 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Устанавливаемый файл Switch (*.nca, *.nsp, *.xci);;Архив контента Nintendo (*.nca);;Пакет подачи Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Установить файлы - + %n file(s) remaining Остался %n файл Осталось %n файл(ов) - Осталось %n файл(ов) - + Installing file "%1"... Установка файла "%1"... - - + + Install Results Результаты установки - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Чтобы избежать возможных конфликтов, мы не рекомендуем пользователям устанавливать игры в NAND. Пожалуйста, используйте эту функцию только для установки обновлений и DLC. - + %n file(s) were newly installed %n файл был недавно установлен %n файл(ов) было недавно установлено - - %n файл(ов) было недавно установлено - + %n file(s) were overwritten %n файл был перезаписан %n файл(ов) было перезаписано - - %n файл(ов) было перезаписано - + %n file(s) failed to install %n файл не удалось установить %n файл(ов) не удалось установить - - %n файл(ов) не удалось установить - + System Application Системное приложение - + System Archive Системный архив - + System Application Update Обновление системного приложения - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Игра - + Game Update Обновление игры - + Game DLC DLC игры - + Delta Title Дельта-титул - + Select NCA Install Type... Выберите тип установки NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Пожалуйста, выберите тип приложения, который вы хотите установить для этого NCA: (В большинстве случаев, подходит стандартный выбор «Игра».) - + Failed to Install Ошибка установки - + The title type you selected for the NCA is invalid. Тип приложения, который вы выбрали для NCA, недействителен. - + File not found Файл не найден - + File "%1" not found Файл "%1" не найден - + OK ОК - - + + Hardware requirements not met Не удовлетворены системные требования - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Ваша система не соответствует рекомендуемым системным требованиям. Отчеты о совместимости были отключены. - + Missing yuzu Account Отсутствует аккаунт yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Чтобы отправить отчет о совместимости игры, необходимо привязать свою учетную запись yuzu.<br><br/>Чтобы привязать свою учетную запись yuzu, перейдите в раздел Эмуляция &gt; Параметры &gt; Сеть. - + Error opening URL Ошибка при открытии URL - + Unable to open the URL "%1". Не удалось открыть URL: "%1". - + TAS Recording Запись TAS - + Overwrite file of player 1? Перезаписать файл игрока 1? - + Invalid config detected Обнаружена недопустимая конфигурация - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативный контроллер не может быть использован в режиме док-станции. Будет выбран контроллер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Текущий amiibo был убран - + Error Ошибка - - + + The current game is not looking for amiibos Текущая игра не ищет amiibo - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все Файлы (*.*) - + Load Amiibo Загрузить Amiibo - + Error loading Amiibo data Ошибка загрузки данных Amiibo - + The selected file is not a valid amiibo Выбранный файл не является допустимым amiibo - + The selected file is already on use Выбранный файл уже используется - + An unknown error occurred Произошла неизвестная ошибка - - Verification failed for the following files: %1 - Проверка не удалась для следующих файлов: + Проверка не удалась для следующих файлов: %1 - + + Keys not installed Ключи не установлены @@ -6507,275 +6729,234 @@ Would you like to bypass this and exit anyway? Установите ключи дешифрования и перезапустите yuzu перед попыткой установки прошивки. - + Select Dumped Firmware Source Location Выберите местоположение прошивки. - Installing Firmware... - Установка прошивки... + Установка прошивки... - - - - Firmware install failed - Не удалось установить прошивку + Не удалось установить прошивку - Unable to locate potential firmware NCA files - Не удалось найти возможные NCA файлы прошивки . + Не удалось найти возможные NCA файлы прошивки . - Failed to delete one or more firmware file. - Не удалось удалить один или несколько файлов прошивки. + Не удалось удалить один или несколько файлов прошивки. Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. Установка прошивки отменена, прошивка может быть в плохом состоянии, перезапустите yuzu или переустановите прошивку. - One or more firmware files failed to copy into NAND. - Один или несколько файлов прошивки не удалось скопировать в NAND. + Один или несколько файлов прошивки не удалось скопировать в NAND. - Firmware integrity verification failed! - Сбой проверки целостности прошивки! + Сбой проверки целостности прошивки! - Select Dumped Keys Location - Выберите местоположение сохранения ключей. + Выберите местоположение сохранения ключей. - - - Decryption Keys install failed - Ошибка установки ключей дешифровки + Ошибка установки ключей дешифровки - prod.keys is a required decryption key file. - prod.keys - это обязательный файл ключа для дешифровки. + prod.keys - это обязательный файл ключа для дешифровки. - One or more keys failed to copy. - Один или несколько ключей не удалось скопировать. + Один или несколько ключей не удалось скопировать. - Decryption Keys install succeeded - Установка ключей дешифровки прошла успешно. + Установка ключей дешифровки прошла успешно. - Decryption Keys were successfully installed - Установка ключей для дешифровки прошла успешно. + Установка ключей для дешифровки прошла успешно. - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - Ошибка инициализации ключей дешифровки. Проверьте, что ваши инструменты для дампа обновлены и повторно выполните дамп ключей. + Ошибка инициализации ключей дешифровки. Проверьте, что ваши инструменты для дампа обновлены и повторно выполните дамп ключей. - - - - - - - + + + + + + No firmware available Нет доступной прошивки - Please install the firmware to use the Album applet. - Пожалуйста, установите прошивку, чтобы использовать приложение Альбом. + Пожалуйста, установите прошивку, чтобы использовать приложение Альбом. - + Album Applet Апплет Альбом - + Album applet is not available. Please reinstall firmware. Апплет Альбом недоступен. Пожалуйста, переустановите прошивку. - Please install the firmware to use the Cabinet applet. - Пожалуйста, установите прошивку, чтобы использовать приложение Кабинет. + Пожалуйста, установите прошивку, чтобы использовать приложение Кабинет. - + Cabinet Applet Кабинет - + Cabinet applet is not available. Please reinstall firmware. Приложение Кабинет недоступно. Пожалуйста, переустановите прошивку. - Please install the firmware to use the Mii editor. - Пожалуйста, установите прошивку, чтобы использовать редактор Mii. + Пожалуйста, установите прошивку, чтобы использовать редактор Mii. - + Mii Edit Applet Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. Mii редактор недоступен. Пожалуйста, переустановите прошивку. - Please install the firmware to use the Controller Menu. - Пожалуйста, установите прошивку, чтобы использовать меню контроллера. + Пожалуйста, установите прошивку, чтобы использовать меню контроллера. - + Controller Applet Апплет контроллера - + Controller Menu is not available. Please reinstall firmware. Меню контроллера недоступно. Пожалуйста, переустановите прошивку. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Сделать скриншот - + PNG Image (*.png) Изображение PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Состояние TAS: Выполняется %1/%2 - + TAS state: Recording %1 Состояние TAS: Записывается %1 - + TAS state: Idle %1/%2 Состояние TAS: Простой %1/%2 - + TAS State: Invalid Состояние TAS: Неверное - + &Stop Running [&S] Остановка - + &Start [&S] Начать - + Stop R&ecording [&E] Закончить запись - + R&ecord [&E] Запись - + Building: %n shader(s) Постройка: %n шейдер Постройка: %n шейдер(ов) - Постройка: %n шейдер(ов) - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Скорость: %1% / %2% - + Speed: %1% Скорость: %1% @@ -6784,44 +6965,44 @@ Would you like to download it? Игра: %1 FPS (Неограниченно) - + Game: %1 FPS Игра: %1 FPS - + Frame: %1 ms Кадр: %1 мс - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA БЕЗ СГЛАЖИВАНИЯ - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНА - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + Derivation Components Missing Компоненты расчета отсутствуют @@ -6830,12 +7011,12 @@ Would you like to download it? Ключи шифрования отсутствуют. <br>Пожалуйста, следуйте <a href='https://yuzu-emu.org/help/quickstart/'>краткому руководству пользователя yuzu</a>, чтобы получить все ваши ключи, прошивку и игры. - + Select RomFS Dump Target Выберите цель для дампа RomFS - + Please select which RomFS you would like to dump. Пожалуйста, выберите, какой RomFS вы хотите сдампить. @@ -6848,7 +7029,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Вы уверены, что хотите остановить эмуляцию? Любой несохраненный прогресс будет потерян. @@ -6861,102 +7042,102 @@ Would you like to bypass this and exit anyway? Хотите ли вы обойти это и выйти в любом случае? - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Nearest Ближайший - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian Гаусс - + ScaleForce ScaleForce - + Area - + Docked В док-станции - + Handheld Портативный - + Normal Нормальная - + High Высокая - + Extreme Экстрим - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6964,13 +7145,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! OpenGL не доступен! - + OpenGL shared contexts are not supported. Общие контексты OpenGL не поддерживаются. @@ -6979,33 +7160,33 @@ Would you like to bypass this and exit anyway? yuzu не был скомпилирован с поддержкой OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Ошибка при инициализации OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Ваш ГП может не поддерживать OpenGL, или у вас установлен устаревший графический драйвер. - + Error while initializing OpenGL 4.6! Ошибка при инициализации OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Ваш ГП может не поддерживать OpenGL 4.6, или у вас установлен устаревший графический драйвер.<br><br>Рендерер GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Ваш ГП может не поддерживать одно или несколько требуемых расширений OpenGL. Пожалуйста, убедитесь в том, что у вас установлен последний графический драйвер.<br><br>Рендерер GL:<br>%1<br><br>Неподдерживаемые расширения:<br>%2 @@ -7013,128 +7194,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite Избранное - + Start Game Запустить игру - + Start Game without Custom Configuration Запустить игру без пользовательской настройки - + Open Save Data Location Открыть папку для сохранений - + Open Mod Data Location Открыть папку для модов - + Open Transferable Pipeline Cache Открыть переносной кэш конвейера - + Remove Удалить - + Remove Installed Update Удалить установленное обновление - + Remove All Installed DLC Удалить все установленные DLC - + Remove Custom Configuration Удалить пользовательскую настройку - + Remove Play Time Data Удалить данные о времени игры - + Remove Cache Storage Удалить кэш-хранилище? - + Remove OpenGL Pipeline Cache Удалить кэш конвейера OpenGL - + Remove Vulkan Pipeline Cache Удалить кэш конвейера Vulkan - + Remove All Pipeline Caches Удалить весь кэш конвейеров - + Remove All Installed Contents Удалить все установленное содержимое - + Dump RomFS Дамп RomFS - + Dump RomFS to SDMC Сдампить RomFS в SDMC - + Verify Integrity Проверить целостность - + Copy Title ID to Clipboard Скопировать ID приложения в буфер обмена - + Navigate to GameDB entry Перейти к странице GameDB - + Create Shortcut Создать ярлык - + Add to Desktop Добавить на Рабочий стол - + Add to Applications Menu Добавить в меню приложений - + Configure Game @@ -7143,62 +7324,62 @@ Would you like to bypass this and exit anyway? Свойства - + Scan Subfolders Сканировать подпапки - + Remove Game Directory Удалить папку с играми - + ▲ Move Up ▲ Переместить вверх - + ▼ Move Down ▼ Переместить вниз - + Open Directory Location Открыть расположение папки - + Clear Очистить - + Name Имя - + Compatibility Совместимость - + Add-ons Дополнения - + File type Тип файла - + Size Размер - + Play time Время игры @@ -7206,62 +7387,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame Запускается - + Game starts, but crashes or major glitches prevent it from being completed. Игра запускается, но вылеты или серьезные баги не позволяют ее завершить. - + Perfect Идеально - + Game can be played without issues. В игру можно играть без проблем. - + Playable Играбельно - + Game functions with minor graphical or audio glitches and is playable from start to finish. Игра работает с незначительными графическими и/или звуковыми ошибками и проходима от начала до конца. - + Intro/Menu Вступление/Меню - + Game loads, but is unable to progress past the Start Screen. Игра загружается, но не проходит дальше стартового экрана. - + Won't Boot Не запускается - + The game crashes when attempting to startup. Игра вылетает при запуске. - + Not Tested Не проверено - + The game has not yet been tested. Игру ещё не проверяли на совместимость. @@ -7269,7 +7450,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list Нажмите дважды, чтобы добавить новую папку в список игр @@ -7277,21 +7458,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) %1 из %n результат(ов) %1 из %n результат(ов) - %1 из %n результат(ов) - + Filter: Поиск: - + Enter pattern to filter Введите текст для поиска @@ -7373,7 +7553,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7387,91 +7567,91 @@ Debug Message: Hotkeys - + Audio Mute/Unmute Включение/отключение звука - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Основное окно - + Audio Volume Down Уменьшить громкость звука - + Audio Volume Up Повысить громкость звука - + Capture Screenshot Сделать скриншот - + Change Adapting Filter Изменить адаптирующий фильтр - + Change Docked Mode Изменить режим консоли - + Change GPU Accuracy Изменить точность ГП - + Configure Настроить - + Configure Current Game - + Continue/Pause Emulation Продолжение/Пауза эмуляции - + Exit Fullscreen Выйти из полноэкранного режима @@ -7480,97 +7660,97 @@ Debug Message: Выйти из yuzu - - Exit eden + + Exit Eden - + Fullscreen Полный экран - + Load File Загрузить файл - + Load/Remove Amiibo Загрузить/удалить Amiibo - + Multiplayer Browse Public Game Lobby Мультиплеер - просмотр общего игрового лобби - + Multiplayer Create Room Мультиплеер - создать лобби - + Multiplayer Direct Connect to Room Мультилеер - прямое подключение к комнате - + Multiplayer Leave Room Мультиплеер - покинуть лобби - + Multiplayer Show Current Room Мультиплеер - показать текущую комнату - + Restart Emulation Перезапустить эмуляцию - + Stop Emulation Остановить эмуляцию - + TAS Record Запись TAS - + TAS Reset Сброс TAS - + TAS Start/Stop Старт/Стоп TAS - + Toggle Filter Bar Переключить панель поиска - + Toggle Framerate Limit Переключить ограничение частоты кадров - + Toggle Mouse Panning Переключить панорамирование мыши - + Toggle Renderdoc Capture Переключить захват Renderdoc - + Toggle Status Bar Переключить панель состояния @@ -7578,22 +7758,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Пожалуйста, убедитесь что это те файлы, что вы хотите установить. - + Installing an Update or DLC will overwrite the previously installed one. Установка обновления или DLC перезапишет ранее установленное. - + Install Установить - + Install Files to NAND Установить файлы в NAND @@ -7601,7 +7781,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 В тексте недопустимы следующие символы: @@ -7748,152 +7928,207 @@ Debug Message: [&R] Недавние файлы - + + Open &Eden Folders + + + + &Emulation [&E] Эмуляция - + &View [&V] Вид - + &Reset Window Size [&R] Сбросить размер окна - + &Debugging [&D] Отладка - + Reset Window Size to &720p Сбросить размер окна до &720p - + Reset Window Size to 720p Сбросить размер окна до 720p - + Reset Window Size to &900p Сбросить размер окна до &900p - + Reset Window Size to 900p Сбросить размер окна до 900p - + Reset Window Size to &1080p Сбросить размер окна до &1080p - + Reset Window Size to 1080p Сбросить размер окна до 1080p - + &Multiplayer [&M] Мультиплеер - + &Tools [&T] Инструменты - + &Amiibo &Amiibo - + &TAS [&T] TAS - + &Create Home Menu Shortcut - + &Help [&H] Помощь - + &Install Files to NAND... [&I] Установить файлы в NAND... - + L&oad File... [&O] Загрузить файл... - + Load &Folder... [&F] Загрузить папку... - + E&xit [&X] Выход - + &Pause [&P] Пауза - + &Stop [&S] Стоп - + &Verify Installed Contents &Проверить установленное содержимое - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7902,97 +8137,97 @@ Debug Message: [&A] О yuzu - + Single &Window Mode [&W] Режим одного окна - + Con&figure... [&F] Параметры... - + Ctrl+, - + Display D&ock Widget Headers [&O] Отображать заголовки виджетов дока - + Show &Filter Bar [&F] Показать панель поиска - + Show &Status Bar [&S] Показать панель статуса - + Show Status Bar Показать панель статуса - + &Browse Public Game Lobby [&B] Просмотреть публичные игровые лобби - + &Create Room [&C] Создать комнату - + &Leave Room [&L] Покинуть комнату - + &Direct Connect to Room [&D] Прямое подключение к комнате - + &Show Current Room [&S] Показать текущую комнату - + F&ullscreen [&U] Полноэкранный - + &Restart [&R] Перезапустить - + Load/Remove &Amiibo... [&A] Загрузить/Удалить Amiibo... - + &Report Compatibility [&R] Сообщить о совместимости - + Open &Mods Page [&M] Открыть страницу модов - + Open &Quickstart Guide [&Q] Открыть руководство пользователя - + &FAQ [&F] ЧАВО @@ -8001,77 +8236,82 @@ Debug Message: [&Y] Открыть папку yuzu - + &Capture Screenshot [&C] Сделать скриншот - + Open &Album Открыть &Album - + &Set Nickname and Owner &Установить никнейм и владельца - + &Delete Game Data &Удалить данные игры - + &Restore Amiibo &Восстановить Amiibo - + &Format Amiibo &Форматировать Amiibo - + Open &Mii Editor Открыть &Mii Editor - + &Configure TAS... [&C] Настройка TAS... - + Configure C&urrent Game... [&U] Настроить текущую игру... - + &Start [&S] Запустить - + &Reset [&S] Сбросить - + R&ecord [&E] Запись - + Open &Controller Menu Открыть &меню контроллера - + Install Firmware Установить прошивку - + + &About Eden + + + + Install Decryption Keys Установите ключи дешифровки @@ -8079,26 +8319,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - [&M] MicroProfile + [&M] MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8158,37 +8408,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Текущий статус подключения - + Not Connected. Click here to find a room! Не подключено. Нажмите здесь, чтобы найти комнату! - + Not Connected Не подключено - + Connected Подключено - + New Messages Received Получены новые сообщения - + Error Ошибка - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Не удалось обновить информацию о комнате. Пожалуйста, проверьте подключение к Интернету и попробуйте снова захостить комнату. @@ -8380,56 +8630,56 @@ p, li { white-space: pre-wrap; } Не играет в игру - + Installed SD Titles Установленные SD игры - + Installed NAND Titles Установленные NAND игры - + System Titles Системные игры - + Add New Game Directory Добавить новую папку с играми - + Favorites Избранные - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [не задано] @@ -8440,14 +8690,14 @@ p, li { white-space: pre-wrap; } Крестовина %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Ось %1%2 @@ -8458,357 +8708,357 @@ p, li { white-space: pre-wrap; } Кнопка %1 - - - - - - + + + + + + [unknown] [неизвестно] - - - + + + Left Влево - - - + + + Right Вправо - - - + + + Down Вниз - - - + + + Up Вверх - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Круг - - + + Cross Крестик - - + + Square Квадрат - - + + Triangle Треугольник - - + + Share Share - - + + Options Options - - + + [undefined] [не определено] - + %1%2 %1%2 - - + + [invalid] [недопустимо] - - + + %1%2Hat %3 %1%2Крест. %3 - - - + + + %1%2Axis %3 %1%2Ось %3 - - + + %1%2Axis %3,%4,%5 %1%2Ось %3,%4,%5 - - + + %1%2Motion %3 %1%2Движение %3 - - + + %1%2Button %3 %1%2Кнопка %3 - - + + [unused] [не используется] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Левый стик - + Stick R Правый стик - + Plus Плюс - + Minus Минус - - + + Home Home - + Capture Захват - + Touch Сенсор - + Wheel Indicates the mouse wheel Колёсико - + Backward Назад - + Forward Вперёд - + Task Задача - + Extra Дополнительная - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Крест. %4 - - + + %1%2%3Axis %4 %1%2%3Ось %4 - - + + %1%2%3Button %4 %1%2%3Кнопка %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8926,6 +9176,300 @@ p, li { white-space: pre-wrap; } Хотите ли вы восстановить эту amiibo? + + QtCommon::Content + + + Installing Firmware... + Установка прошивки... + + + + + + Cancel + Отмена + + + + Firmware integrity verification failed! + Сбой проверки целостности прошивки! + + + + + Verification failed for the following files: + +%1 + Проверка не удалась для следующих файлов: + +%1 + + + + + Verifying integrity... + Проверка целостности... + + + + + Integrity verification succeeded! + Проверка целостности прошла успешно! + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + Проверка целостности не удалась! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + Выберите местоположение сохранения ключей. + + + + Decryption Keys install succeeded + Установка ключей дешифровки прошла успешно. + + + + Decryption Keys were successfully installed + Установка ключей для дешифровки прошла успешно. + + + + Decryption Keys install failed + Ошибка установки ключей дешифровки + + + + QtCommon::Game + + + Error Removing Contents + Ошибка при удалении содержимого + + + + Error Removing Update + Ошибка при удалении обновлений + + + + Error Removing DLC + Ошибка при удалении DLC + + + + The base game is not installed in the NAND and cannot be removed. + Игра не установлена в NAND и не может быть удалена. + + + + There is no update installed for this title. + Для этой игры не было установлено обновление. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Успешно удалено + + + + Successfully removed %1 installed DLC. + Установленное DLC %1 было успешно удалено + + + + + Error Removing Transferable Shader Cache + Ошибка при удалении переносного кэша шейдеров + + + + + A shader cache for this title does not exist. + Кэш шейдеров для этой игры не существует. + + + + Successfully removed the transferable shader cache. + Переносной кэш шейдеров успешно удалён. + + + + Failed to remove the transferable shader cache. + Не удалось удалить переносной кэш шейдеров. + + + + Error Removing Vulkan Driver Pipeline Cache + Ошибка при удалении конвейерного кэша Vulkan + + + + Failed to remove the driver pipeline cache. + Не удалось удалить конвейерный кэш шейдеров. + + + + + Error Removing Transferable Shader Caches + Ошибка при удалении переносного кэша шейдеров + + + + Successfully removed the transferable shader caches. + Переносной кэш шейдеров успешно удален. + + + + Failed to remove the transferable shader cache directory. + Ошибка при удалении папки переносного кэша шейдеров. + + + + + Error Removing Custom Configuration + Ошибка при удалении пользовательской настройки + + + + A custom configuration for this title does not exist. + Пользовательская настройка для этой игры не существует. + + + + Successfully removed the custom game configuration. + Пользовательская настройка игры успешно удалена. + + + + Failed to remove the custom game configuration. + Не удалось удалить пользовательскую настройку игры. + + + + Reset Metadata Cache + Сбросить кэш метаданных + + + + The metadata cache is already empty. + Кэш метаданных уже пустой. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Кэш метаданных не может быть удален. Возможно, он используется или отсутствует. + + + + Create Shortcut + Создать ярлык + + + + Do you want to launch the game in fullscreen? + Вы хотите запустить игру в полноэкранном режиме? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Успешно создан ярлык в %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Это создаст ярлык для текущего AppImage. Он может не работать после обновлений. Продолжить? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + Не удалось создать ярлык для %1 + + + + Create Icon + Создать иконку + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Невозможно создать файл иконки. Путь "%1" не существует и не может быть создан. + + + + No firmware available + Нет доступной прошивки + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9221,7 +9765,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9229,7 +9773,7 @@ Please try again or contact the developer of the software. %2 - + Users Пользователи @@ -9353,7 +9897,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Стэк вызовов @@ -9361,12 +9905,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread не ожидается ни одним потоком @@ -9374,102 +9918,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable runnable - + paused paused - + sleeping sleeping - + waiting for IPC reply ожидание ответа IPC - + waiting for objects ожидание объектов - + waiting for condition variable waiting for condition variable - + waiting for address arbiter waiting for address arbiter - + waiting for suspend resume waiting for suspend resume - + waiting waiting - + initialized initialized - + terminated terminated - + unknown неизвестно - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 ядро %1 - + processor = %1 процессор = %1 - + affinity mask = %1 маска сходства = %1 - + thread id = %1 идентификатор потока = %1 - + priority = %1(current) / %2(normal) приоритет = %1(текущий) / %2(обычный) - + last running ticks = %1 last running ticks = %1 @@ -9477,7 +10021,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread ожидается потоком @@ -9485,7 +10029,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree [&W] Дерево ожидания diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index c09132e468..2260c87cec 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Kommunicerar med servern... - + Cancel Avbryt - + Touch the top left corner <br>of your touchpad. Tryck på det övre vänstra hörnet <br>på pekplattan. - + Now touch the bottom right corner <br>of your touchpad. Tryck nu på det nedre högra hörnet <br> på pekplattan - + Configuration completed! Konfiguration slutförd! - + OK OK @@ -397,281 +397,413 @@ Detta kommer bannlysa både dennes användarnamn på forum samt IP-adress. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Fel - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Utgångsmotor: - - Output Device: - - - - - Input Device: - - - - - Mute audio - - - - + Volume: Volym: - - Mute audio when in background - - - - + Multicore CPU Emulation Flerkärnig CPU-emulering - + + Limit Speed Percent + Begränsa hastighetsprocent + + + + Accuracy: + Noggrannhet: + + + + Unfuse FMA (improve performance on CPUs without FMA) + Sära FMA (förbättra prestanda på CPU:er utan FMA) + + + + Faster FRSQRTE and FRECPE + Snabbare FRSQRTE och FRECPE + + + + Faster ASIMD instructions (32 bits only) + Snabbare ASIMD instruktioner (enbart 32-bitars) + + + + API: + API: + + + + Device: + Enhet: + + + + Aspect Ratio: + Bildförhållande: + + + + Use asynchronous GPU emulation + Använd asynkron GPU-emulering + + + + Anisotropic Filtering: + Anisotropisk filtrering: + + + Accuracy Level: + Noggranhetsnivå: + + + + RNG Seed + RNG Seed + + + + Note: this can be overridden when region setting is auto-select + Notera: detta kan bli överskritt medans regionsinställningarna är satta till auto-select + + + + Region: + Region: + + + + Time Zone: + Tidszon: + + + + Prompt for user on game boot + Fråga efter användare vid spelstart + + + + Pause emulation when in background + Pausa emulationen när fönstret är i bakgrunden + + + + Hide mouse on inactivity + Göm mus när inaktiv + + + + CPU + CPU + + + + Auto + Auto + + + + Accurate + Noggrann + + + + Unsafe + Osäker + + + + Paranoid (disables most optimizations) + Paranoid (stänger av de flesta optimeringar) + + + + None + Ingen + + + + Default (16:9) + Standard (16:9) + + + + Force 4:3 + Tvinga 4:3 + + + + Force 21:9 + Tvinga 21:9 + + + + Stretch to Window + Tänj över fönster + + + + + Default + Standard + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Output Device: + + + + + Input Device: + + + + + Mute audio + + + + + Mute audio when in background + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. - + Memory Layout - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - Limit Speed Percent - Begränsa hastighetsprocent - - - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. - + Synchronize Core Speed - + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). Compatibility varies by game; many (especially older ones) may not respond well. Can help reduce stuttering at lower framerates. - - Accuracy: - Noggrannhet: - - - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. - - + + Backend: - + Fast CPU Time - + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - Unfuse FMA (improve performance on CPUs without FMA) - Sära FMA (förbättra prestanda på CPU:er utan FMA) + + Custom CPU Ticks + - + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - Faster FRSQRTE and FRECPE - Snabbare FRSQRTE och FRECPE - - - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - Faster ASIMD instructions (32 bits only) - Snabbare ASIMD instruktioner (enbart 32-bitars) - - - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - + Inaccurate NaN handling - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. - + Disable address space checks - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. - + Ignore global monitor - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. - - API: - API: - - - + Switches between the available graphics APIs. Vulkan is recommended in most cases. - - Device: - Enhet: - - - + This setting selects the GPU to use with the Vulkan backend. - + Shader Backend: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -679,86 +811,81 @@ SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - + Resolution: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. - + Window Adapting Filter: - + FSR Sharpness: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. - + Anti-Aliasing Method: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - + Fullscreen Mode: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - Aspect Ratio: - Bildförhållande: - - - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use disk pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Optimize SPIRV output shader - + Runs an additional optimization pass over generated SPIRV shaders. Will increase time required for shader compilation. May slightly improve performance. @@ -766,35 +893,30 @@ This feature is experimental. - - Use asynchronous GPU emulation - Använd asynkron GPU-emulering - - - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -803,33 +925,44 @@ stuttering at the cost of rendering issues while the texture is being decoded. - + ASTC Recompression Method: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - + VRAM Usage Mode: - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. - + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -837,1078 +970,1042 @@ Immediate (no synchronization) just presents whatever is available and can exhib - + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - - Anisotropic Filtering: - Anisotropisk filtrering: - - - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. - - Accuracy Level: - Noggranhetsnivå: - - - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. + + GPU Accuracy: - + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + Use asynchronous shader building (Hack) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. - + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - RNG Seed + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - + Device Name - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Notera: detta kan bli överskritt medans regionsinställningarna är satta till auto-select - - - - Region: - Region: - - - + The region of the emulated Switch. - - Time Zone: - Tidszon: - - - + The time zone of the emulated Switch. - + Sound Output Mode: - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Fråga efter användare vid spelstart - - - - Pause emulation when in background - Pausa emulationen när fönstret är i bakgrunden - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Göm mus när inaktiv - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - + OpenGL - + Vulkan - + Null - + GLSL - + GLASM (Assembly Shaders, NVIDIA Only) - + SPIR-V (Experimental, AMD/Mesa Only) - + Normal - + High - + Extreme - - Auto - Auto + + Unsafe (fast) + - - Accurate - Noggrann + + Safe (stable) + - - Unsafe - Osäker - - - - Paranoid (disables most optimizations) - Paranoid (stänger av de flesta optimeringar) - - - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + ScaleForce - + AMD FidelityFX™️ Super Resolution - + Area - - None - Ingen - - - + FXAA - + SMAA - - Default (16:9) - Standard (16:9) - - - - Force 4:3 - Tvinga 4:3 - - - - Force 21:9 - Tvinga 21:9 - - - + Force 16:10 - - Stretch to Window - Tänj över fönster - - - + Automatic - - Default - Standard - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanska (日本語) - + American English - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Holländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk Engelska - + Canadian French Kanadensisk Franska - + Latin American Spanish Latinamerikansk Spanska - + Simplified Chinese Förenklad Kinesiska - + Traditional Chinese (正體中文) Traditionell Kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japan - + USA USA - + Europe Europe - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Dockad - + Handheld Handheld - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2246,27 +2343,27 @@ avgjord kod.</div> Loggning - + Open Log Location Öppna Logg-Destination - + Global Log Filter Globalt Loggfilter - + When checked, the max size of the log increases from 100 MB to 1 GB När ibockad, ökar maxstorleken för loggen från 100 MB till 1 GB - + Enable Extended Logging** Slå på Utökad Loggning** - + Show Log in Console Visa Logg i Terminal @@ -2412,7 +2509,7 @@ avgjord kod.</div> - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2466,7 +2563,7 @@ avgjord kod.</div> - + Web applet not compiled @@ -2516,7 +2613,7 @@ avgjord kod.</div> - eden Configuration + Eden Configuration @@ -2525,88 +2622,88 @@ avgjord kod.</div> - + Applets - - + + Audio Ljud - - + + CPU CPU - + Debug Debug - + Filesystem Filsystem - - + + General Allmänt - - + + Graphics Grafik - + GraphicsAdvanced Avancerade grafikinställningar - + GraphicsExtensions - + Hotkeys Snabbknappar - - + + Controls Kontroller - + Profiles Profiler - + Network Nätverk - - + + System System - + Game List Spellista - + Web Webb @@ -2704,51 +2801,45 @@ avgjord kod.</div> - - - Reset Metadata Cache Återställ metadatasparning - + Select Emulated NAND Directory... Välj emulerad NAND-katalog... - + Select Emulated SD Directory... Välj emulerad SD katalog... - + Select Gamecard Path... Välj Spelkortssökväg... - + Select Dump Directory... Välj dumpsökväg... - + Select Mod Load Directory... Välj modladdningssökväg - The metadata cache is already empty. - Metadata cachen är redan tom. + Metadata cachen är redan tom. - The operation completed successfully. - Operationen slutfördes utan problem + Operationen slutfördes utan problem - The metadata cache couldn't be deleted. It might be in use or non-existent. - Metadata cachen kunde inte tas bort. Den kan vara under användning eller icke-existerande. + Metadata cachen kunde inte tas bort. Den kan vara under användning eller icke-existerande. @@ -2779,12 +2870,12 @@ avgjord kod.</div> yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? @@ -2817,33 +2908,33 @@ avgjord kod.</div> Bakgrundsfärg: - + % FSR sharpening percentage (e.g. 50%) % - + Off - + VSync Off - + Recommended - + On - + VSync On @@ -2880,14 +2971,18 @@ avgjord kod.</div> - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2919,75 +3014,75 @@ These settings are experimental, and may cause black screens. If your games fail Återställ till standard - + Action Handling - + Hotkey Snabbtangent - + Controller Hotkey - - - + + + Conflicting Key Sequence Motstridig Tangentsekvens - - + + The entered key sequence is already assigned to: %1 Den valda tangentsekvensen är redan tilldelad: %1 - + [waiting] [väntar] - + Invalid - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Återställ standard - + Clear Rensa - + Conflicting Button Sequence - + The default button sequence is already assigned to: %1 - + The default key sequence is already assigned to: %1 Standardtangentsekvensen är redan tilldelad: %1 @@ -3307,7 +3402,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3458,7 +3553,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Vänster Spak @@ -3568,14 +3663,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3594,7 +3689,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Pluss @@ -3607,15 +3702,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3660,7 +3755,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Höger Spak @@ -3675,241 +3770,241 @@ These settings are experimental, and may cause black screens. If your games fail Konfigurera - - - - + + + + Clear Rensa - - - - - + + + + + [not set] [ej angett] - - - + + + Invert button - - + + Toggle button - + Turbo button - - + + Invert axis - - - + + + Set threshold - - + + Choose a value between 0% and 100% - + Toggle axis - + Set gyro threshold - + Calibrate sensor - + Map Analog Stick - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. - + Center axis - - + + Deadzone: %1% Dödzon: %1% - - + + Modifier Range: %1% Modifieringsräckvidd: %1% - - + + Pro Controller Prokontroller - + Dual Joycons Dubbla Joycons - + Left Joycon Vänster Joycon - + Right Joycon Höger Joycon - + Handheld Handhållen - + GameCube Controller GameCube-kontroll - + Poke Ball Plus Poke Ball Plus - + NES Controller NES-kontroll - + SNES Controller SNES-kontroll - + N64 Controller N64-kontroll - + Sega Genesis Sega Genesis - + Start / Pause - + Z Z - + Control Stick - + C-Stick - + Shake! - + [waiting] [väntar] - + New Profile Ny profil - + Enter a profile name: - - + + Create Input Profile - + The given profile name is not valid! - + Failed to create the input profile "%1" - + Delete Input Profile - + Failed to delete the input profile "%1" - + Load Input Profile - + Failed to load the input profile "%1" - + Save Input Profile - + Failed to save the input profile "%1" @@ -3966,7 +4061,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure Konfigurera @@ -4002,7 +4097,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test Test @@ -4021,7 +4116,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Lär dig mer</span></a> - + %1:%2 @@ -4030,77 +4125,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 - + IP address is not valid - + This UDP server already exists - + Unable to add more than 8 servers - + Testing Testar - + Configuring Konfigurerar - + Test Successful Test framgångsrikt - + Successfully received data from the server. Tog emot data från servern framgångsrikt - + Test Failed Test misslyckades - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Kunde inte ta emot giltig data från servern.<br>Var vänlig verifiera att servern är korrekt uppsatt och att adressen och porten är korrekta. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP Test eller kalibreringskonfiguration är igång.<br>Var vänlig vänta för dem att slutföras. @@ -4226,7 +4321,12 @@ Current values are %1% and %2% respectively. - + + Enable Airplane Mode + + + + None Ingen @@ -4284,52 +4384,52 @@ Current values are %1% and %2% respectively. - + Add-Ons Tillägg - + System System - + CPU CPU - + Graphics Grafik - + Adv. Graphics Avancerade Grafikinställningar - + GPU Extensions - + Audio Ljud - + Input Profiles - + Linux - + Properties egenskaper @@ -4347,12 +4447,12 @@ Current values are %1% and %2% respectively. Tillägg - + Patch Name Patch namn - + Version Version @@ -4390,27 +4490,32 @@ Current values are %1% and %2% respectively. Välj bild - + + Select Avatar + + + + Add Lägg till - + Rename Döp om - + Remove Ta bort - + Profile management is available only when game is not running. Profilhantering är endast tillgänglig när spelet inte körs. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4418,100 +4523,181 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Skriv in användarnamn - + Users Användare - + Enter a username for the new user: Skriv in användarnamn för den nya användaren: - + Enter a new username: Skriv in ett nytt användarnamn: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Välj Användarbild - - JPEG Images (*.jpg *.jpeg) - JPEG-bilder (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG-bilder (*.jpg *.jpeg) + + + Error deleting image Fel när bilden raderades - + Error occurred attempting to overwrite previous image at: %1. Fel uppstod när man försökte överskriva föregående bild vid: %1. - + Error deleting file Fel när fil raderades - + Unable to delete existing file: %1. Kan inte radera existerande fil: %1. - + Error creating user image directory Fel när användarbild skapades - + Unable to create directory %1 for storing user images. Oförmögen att skapa katalog %1 för att spara användarbilder. - Error copying user image - Fel under kopiering av användarbild + Fel under kopiering av användarbild - Unable to copy image from %1 to %2 - Oförmögen att kopiera bild från %1 till %2 + Oförmögen att kopiera bild från %1 till %2 + + + ConfigureProfileManagerAvatarDialog - - Error resizing user image + + Select - - Unable to resize image + + Cancel + Avbryt + + + + Background Color + + + + + Select Firmware Avatar ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. - + Confirm Delete Bekräfta Radering - + Name: %1 UUID: %2 @@ -4563,7 +4749,7 @@ UUID: %2 - + Enable Aktivera @@ -4574,7 +4760,7 @@ UUID: %2 - + Not connected @@ -4584,63 +4770,63 @@ UUID: %2 Återställ till standard - + Clear Rensa - + [not set] [ej angett] - + Invert axis - - + + Deadzone: %1% Dödzon: %1% - + Error enabling ring input - + Direct Joycon driver is not enabled - + Configuring Konfigurerar - + The current mapped device doesn't support the ring controller - + The current mapped device doesn't have a ring attached - + The current mapped device is not connected - + Unexpected driver result %1 - + [waiting] [väntar] @@ -4678,7 +4864,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4730,12 +4916,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration - + Select TAS Load Directory... @@ -4845,7 +5031,7 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5165,6 +5351,16 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r Web Webb + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Webb-Service @@ -5174,42 +5370,29 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r Genom att ge användarnamn och nyckel så godkänner du att yuzu tar användarstatistik, vilket kan inkludera identifierande användarinformation. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Verifiera + Verifiera - Sign up - Registrera + Registrera - + Token: Pollett: - + Username: Användarnamn: - What is my token? - Vad är min pollett? + Vad är min pollett? - + Web Service configuration can only be changed when a public room isn't being hosted. @@ -5234,12 +5417,12 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r Regenerera - + Discord Presence Discord Närvaro - + Show Current Game in your Discord Status Visa Nuvarande Spel i din Discord Status @@ -5248,24 +5431,8 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Lär dig mer</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrera</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Registrera</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5287,12 +5454,6 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r Token was not verified. The change to your token has not been saved. Polletten verifierades inte. Ändringen till din pollett har inte sparats. - - - Unverified, please click Verify before saving configuration - Tooltip - - Verifying... Verifierar... @@ -5310,20 +5471,67 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Verifiering misslyckad. Kontrollera att du har skrivit in din pollett korrekt, och att din internetuppkoppling fungerar. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 - + &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Version + + DirectConnect @@ -5429,7 +5637,12 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5437,11 +5650,6 @@ Dra punkter för att ändra position, eller dubbelklicka tabellceller för att r The host of the room has banned you. Speak with the host to unban you or try a different room. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5501,587 +5709,430 @@ Please go to Configure -> System -> Network and make a selection. Telemetri - + Broken Vulkan Installation Detected Felaktig Vulkaninstallation Upptäckt - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Laddar WebApplet... - - + + Disable Web Applet Avaktivera Webbappletten - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built Mängden shaders som just nu byggs - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Nuvarande emuleringshastighet. Värden över eller under 100% indikerar på att emulationen körs snabbare eller långsammare än en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hur många bilder per sekund som spelet just nu visar. Detta varierar från spel till spel och scen till scen. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid det tar att emulera en Switch bild, utan att räkna med framelimiting eller v-sync. För emulering på full hastighet så ska det vara som mest 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + &Pause &Paus - Warning Outdated Game Format - Varning Föråldrat Spelformat + Varning Föråldrat Spelformat You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Du använder det dekonstruerade ROM-formatet för det här spelet. Det är ett föråldrat format som har överträffats av andra som NCA, NAX, XCI eller NSP. Dekonstruerade ROM-kataloger saknar ikoner, metadata och uppdatering.<br><br>För en förklaring av de olika format som yuzu stöder, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>kolla in vår wiki</a>. Det här meddelandet visas inte igen. - - + + Error while loading ROM! Fel vid laddning av ROM! - + The ROM format is not supported. ROM-formatet stöds inte. - + An error occurred initializing the video core. Ett fel inträffade vid initiering av videokärnan. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Ett okänt fel har uppstått. Se loggen för mer information. - + (64-bit) - + (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data Spardata - + Mod Data Mod-data - + Error Opening %1 Folder Fel Öppnar %1 Mappen - - + + Folder does not exist! Mappen finns inte! - Error Opening Transferable Shader Cache - Fel Under Öppning Av Överförbar Shadercache + Fel Under Öppning Av Överförbar Shadercache - - Failed to create the shader cache directory for this title. - - - - - Error Removing Contents - - - - - Error Removing Update - - - - - Error Removing DLC - - - - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry Ta bort katalog - - - - - - Successfully Removed - Framgångsrikt borttagen + Framgångsrikt borttagen - Successfully removed the installed base game. - Tog bort det installerade basspelet framgångsrikt. + Tog bort det installerade basspelet framgångsrikt. - The base game is not installed in the NAND and cannot be removed. - Basspelet är inte installerat i NAND och kan inte tas bort. + Basspelet är inte installerat i NAND och kan inte tas bort. - Successfully removed the installed update. - Tog bort den installerade uppdateringen framgångsrikt. + Tog bort den installerade uppdateringen framgångsrikt. - There is no update installed for this title. - Det finns ingen uppdatering installerad för denna titel. + Det finns ingen uppdatering installerad för denna titel. - There are no DLC installed for this title. - Det finns inga DLC installerade för denna titel. + Det finns inga DLC installerade för denna titel. - Successfully removed %1 installed DLC. - Tog framgångsrikt bort den %1 installerade DLCn. + Tog framgångsrikt bort den %1 installerade DLCn. - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? Ta Bort Anpassad Spelkonfiguration? - + Remove Cache Storage? - + Remove File Radera fil - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Fel När Överförbar Shader Cache Raderades + Fel När Överförbar Shader Cache Raderades - - A shader cache for this title does not exist. - En shader cache för denna titel existerar inte. + En shader cache för denna titel existerar inte. - Successfully removed the transferable shader cache. - Raderade den överförbara shadercachen framgångsrikt. + Raderade den överförbara shadercachen framgångsrikt. - Failed to remove the transferable shader cache. - Misslyckades att ta bort den överförbara shadercache + Misslyckades att ta bort den överförbara shadercache - - Error Removing Vulkan Driver Pipeline Cache - - - - - Failed to remove the driver pipeline cache. - - - - - - Error Removing Transferable Shader Caches - - - - - Successfully removed the transferable shader caches. - - - - - Failed to remove the transferable shader cache directory. - - - - - Error Removing Custom Configuration - Fel När Anpassad Konfiguration Raderades + Fel När Anpassad Konfiguration Raderades - A custom configuration for this title does not exist. - En anpassad konfiguration för denna titel existerar inte. + En anpassad konfiguration för denna titel existerar inte. - Successfully removed the custom game configuration. - Tog bort den anpassade spelkonfigurationen framgångsrikt. + Tog bort den anpassade spelkonfigurationen framgångsrikt. - Failed to remove the custom game configuration. - Misslyckades att ta bort den anpassade spelkonfigurationen. + Misslyckades att ta bort den anpassade spelkonfigurationen. - - + + RomFS Extraction Failed! RomFS Extraktion Misslyckades! - + There was an error copying the RomFS files or the user cancelled the operation. Det uppstod ett fel vid kopiering av RomFS filer eller användaren avbröt operationen. - + Full Full - + Skeleton Skelett - + Select RomFS Dump Mode Välj RomFS Dump-Läge - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Välj hur du vill att RomFS ska dumpas. <br>Full kommer att kopiera alla filer i den nya katalogen medan <br>skelett bara skapar katalogstrukturen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Extraherar RomFS... - - - - - + + Cancel Avbryt - + RomFS Extraction Succeeded! RomFS Extraktion Lyckades! - - - + The operation completed successfully. Operationen var lyckad. - - Integrity verification couldn't be performed! + + Warning: Outdated Game Format - - File contents were not checked for validity. + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - Verifying integrity... + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - Integrity verification succeeded! + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - - Create Shortcut - - - - - Do you want to launch the game in fullscreen? - - - - - Successfully created a shortcut to %1 - - - - - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - - - - - Failed to create a shortcut to %1 - - - - - Create Icon - - - - - Cannot create icon file. Path "%1" does not exist and cannot be created. - - - - + Error Opening %1 Fel under öppning av %1 - + Select Directory Välj Katalog - + Properties Egenskaper - + The game properties could not be loaded. Spelegenskaperna kunde inte laddas. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch Körbar (%1);;Alla Filer (*.*) - + Load File Ladda Fil - + Open Extracted ROM Directory Öppna Extraherad ROM-Katalog - + Invalid Directory Selected Ogiltig Katalog Vald - + The directory you have selected does not contain a 'main' file. Katalogen du har valt innehåller inte en 'main'-fil. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installerbar Switch-fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installera filer - + %n file(s) remaining @@ -6089,24 +6140,24 @@ Please go to Configure -> System -> Network and make a selection. - + Installing file "%1"... Installerar Fil "%1"... - - + + Install Results Installera resultat - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed @@ -6115,7 +6166,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten @@ -6124,7 +6175,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install @@ -6133,489 +6184,443 @@ Please, only use this feature to install updates and DLC. - + System Application Systemapplikation - + System Archive Systemarkiv - + System Application Update Systemapplikationsuppdatering - + Firmware Package (Type A) Firmwarepaket (Typ A) - + Firmware Package (Type B) Firmwarepaket (Typ B) - + Game Spel - + Game Update Speluppdatering - + Game DLC Spel DLC - + Delta Title Delta Titel - + Select NCA Install Type... Välj NCA-Installationsläge... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Välj vilken typ av titel du vill installera som: (I de flesta fallen, standard 'Spel' är bra.) - + Failed to Install Misslyckades med Installationen - + The title type you selected for the NCA is invalid. Den titeltyp du valt för NCA är ogiltig. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + OK OK - - + + Hardware requirements not met Hårdvarukraven uppfylls ej - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. - + Missing yuzu Account yuzu Konto hittades inte - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. För att skicka ett spelkompatibilitetstest, du måste länka ditt yuzu-konto.<br><br/>För att länka ditt yuzu-konto, gå till Emulering &gt, Konfigurering &gt, Web. - + Error opening URL Fel när URL öppnades - + Unable to open the URL "%1". Oförmögen att öppna URL:en "%1". - + TAS Recording TAS Inspelning - + Overwrite file of player 1? Överskriv spelare 1:s fil? - + Invalid config detected Ogiltig konfiguration upptäckt - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Den aktuella amiibon har avlägsnats - + Error Fel - - + + The current game is not looking for amiibos Det aktuella spelet letar ej efter amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo Fil (%1);; Alla Filer (*.*) - + Load Amiibo Ladda Amiibo - + Error loading Amiibo data Fel vid laddning av Amiibodata - + The selected file is not a valid amiibo Den valda filen är inte en giltig amiibo - + The selected file is already on use Den valda filen är redan använd - + An unknown error occurred Ett okänt fel har inträffat - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Kontroll-Applet - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Skärmdump - + PNG Image (*.png) PNG Bild (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAStillstånd: pågående %1/%2 - + TAS state: Recording %1 TAStillstånd: spelar in %1 - + TAS state: Idle %1/%2 TAStillstånd: inaktiv %1/%2 - + TAS State: Invalid TAStillstånd: ogiltigt - + &Stop Running - + &Start &Start - + Stop R&ecording - + R&ecord - + Building: %n shader(s) @@ -6623,70 +6628,70 @@ Would you like to download it? - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spel: %1 FPS - + Frame: %1 ms Ruta: %1 ms - + %1 %2 - - + + FSR - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing Deriveringsdelar saknas - + Select RomFS Dump Target Välj RomFS Dumpa Mål - + Please select which RomFS you would like to dump. Välj vilken RomFS du vill dumpa. @@ -6699,7 +6704,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Är du säker på att du vill stoppa emuleringen? Du kommer att förlora osparade framsteg. @@ -6712,102 +6717,102 @@ Would you like to bypass this and exit anyway? Vill du strunta i detta och avsluta ändå? - + None Ingen - + FXAA - + SMAA - + Nearest - + Bilinear - + Bicubic - + Gaussian - + ScaleForce - + Area - + Docked Dockad - + Handheld Handheld - + Normal - + High - + Extreme - + Vulkan - + OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6815,13 +6820,13 @@ Vill du strunta i detta och avsluta ändå? GRenderWindow - - + + OpenGL not available! OpenGL inte tillgängligt! - + OpenGL shared contexts are not supported. @@ -6830,33 +6835,33 @@ Vill du strunta i detta och avsluta ändå? yuzu har inte komilerats med OpenGL support. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Fel under initialisering av OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 @@ -6864,128 +6869,128 @@ Vill du strunta i detta och avsluta ändå? GameList - + Favorite - + Start Game - + Start Game without Custom Configuration - + Open Save Data Location Öppna Spara Data Destination - + Open Mod Data Location Öppna Mod Data Destination - + Open Transferable Pipeline Cache - + Remove Ta Bort - + Remove Installed Update Ta Bort Installerad Uppdatering - + Remove All Installed DLC Ta Bort Alla Installerade DLC - + Remove Custom Configuration Ta Bort Anpassad Konfiguration - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache - + Remove All Pipeline Caches - + Remove All Installed Contents Ta Bort Allt Installerat Innehåll - + Dump RomFS Dumpa RomFS - + Dump RomFS to SDMC - + Verify Integrity - + Copy Title ID to Clipboard Kopiera Titel ID till Urklipp - + Navigate to GameDB entry Navigera till GameDB-sida - + Create Shortcut - + Add to Desktop - + Add to Applications Menu - + Configure Game @@ -6994,62 +6999,62 @@ Vill du strunta i detta och avsluta ändå? Egenskaper - + Scan Subfolders Skanna Underkataloger - + Remove Game Directory Radera Spelkatalog - + ▲ Move Up ▲ Flytta upp - + ▼ Move Down ▼ Flytta ner - + Open Directory Location Öppna Sökvägsplats - + Clear Rensa - + Name Namn - + Compatibility Kompatibilitet - + Add-ons Add-Ons - + File type Filtyp - + Size Storlek - + Play time @@ -7057,62 +7062,62 @@ Vill du strunta i detta och avsluta ändå? GameListItemCompat - + Ingame - + Game starts, but crashes or major glitches prevent it from being completed. - + Perfect Perfekt - + Game can be played without issues. - + Playable - + Game functions with minor graphical or audio glitches and is playable from start to finish. - + Intro/Menu Intro/Meny - + Game loads, but is unable to progress past the Start Screen. - + Won't Boot Startar Inte - + The game crashes when attempting to startup. Spelet kraschar när man försöker starta det. - + Not Tested Inte Testad - + The game has not yet been tested. Spelet har ännu inte testats. @@ -7120,7 +7125,7 @@ Vill du strunta i detta och avsluta ändå? GameListPlaceholder - + Double-click to add a new folder to the game list Dubbelklicka för att lägga till en ny mapp i spellistan. @@ -7128,7 +7133,7 @@ Vill du strunta i detta och avsluta ändå? GameListSearchField - + %1 of %n result(s) @@ -7136,12 +7141,12 @@ Vill du strunta i detta och avsluta ändå? - + Filter: Filter: - + Enter pattern to filter Ange mönster för att filtrera @@ -7223,7 +7228,7 @@ Vill du strunta i detta och avsluta ändå? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7231,186 +7236,186 @@ Debug Message: Hotkeys - + Audio Mute/Unmute - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window - + Audio Volume Down - + Audio Volume Up - + Capture Screenshot Skärmdump - + Change Adapting Filter - + Change Docked Mode - + Change GPU Accuracy - + Configure Konfigurera - + Configure Current Game - + Continue/Pause Emulation - + Exit Fullscreen - - Exit eden + + Exit Eden - + Fullscreen Fullskärm - + Load File Ladda Fil - + Load/Remove Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation - + Stop Emulation - + TAS Record - + TAS Reset - + TAS Start/Stop - + Toggle Filter Bar - + Toggle Framerate Limit - + Toggle Mouse Panning - + Toggle Renderdoc Capture - + Toggle Status Bar @@ -7418,22 +7423,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Var vänlig bekräfta att detta är filerna du önskar installera. - + Installing an Update or DLC will overwrite the previously installed one. Att installera en uppdatering eller DLC kommer överskriva den före detta installerade DLC:n eller uppdateringen. - + Install Installera - + Install Files to NAND Installera filer till NAND @@ -7441,7 +7446,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 @@ -7587,349 +7592,412 @@ Debug Message: - + &Emulation &Emulering - + &View &Vyn - + &Reset Window Size - + &Debugging - + Reset Window Size to &720p - + Reset Window Size to 720p - + Reset Window Size to &900p - + Reset Window Size to 900p - + Reset Window Size to &1080p - + Reset Window Size to 1080p - + &Multiplayer - + &Tools - + &Amiibo - + &TAS - + &Create Home Menu Shortcut - + &Help &Hjälp - + &Install Files to NAND... - + L&oad File... - + Load &Folder... - + E&xit A&vsluta - + &Pause &Paus - + &Stop &Sluta - + &Verify Installed Contents - - &About eden - - - - - Open &eden Folder - - - - + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu - + Single &Window Mode - + + Open &Eden Folders + + + + + &About Eden + + + + Con&figure... - + Ctrl+, - + Display D&ock Widget Headers - + Show &Filter Bar - + Show &Status Bar - + Show Status Bar Visa Statusfält - + &Browse Public Game Lobby - + &Create Room - + &Leave Room - + &Direct Connect to Room - + &Show Current Room - + F&ullscreen - + &Restart - + Load/Remove &Amiibo... - + &Report Compatibility - + Open &Mods Page - + Open &Quickstart Guide - + &FAQ - + &Capture Screenshot - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - + &Start &Start - + &Reset - + R&ecord - + Open &Controller Menu - + + &Root Data Folder + + + + + &NAND Folder + + + + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Install Firmware - + Install Decryption Keys - - MicroProfileDialog - - - &MicroProfile - - - MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -7989,37 +8057,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status - + Not Connected. Click here to find a room! - + Not Connected Nedkopplad - + Connected Uppkopplad - + New Messages Received - + Error Fel - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: @@ -8121,56 +8189,56 @@ p, li { white-space: pre-wrap; } Spelar inte något spel - + Installed SD Titles Installerade SD-titlar - + Installed NAND Titles Installerade NAND-titlar - + System Titles Systemtitlar - + Add New Game Directory Lägg till ny spelkatalog - + Favorites Favoriter - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [inte inställd] @@ -8181,14 +8249,14 @@ p, li { white-space: pre-wrap; } Hatt %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Axel %1%2 @@ -8199,357 +8267,357 @@ p, li { white-space: pre-wrap; } Knapp %1 - - - - - - + + + + + + [unknown] [okänd] - - - + + + Left Vänster - - - + + + Right Höger - - - + + + Down Ner - - - + + + Up Upp - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Cirkel - - + + Cross Kors - - + + Square Fyrkant - - + + Triangle Triangel - - + + Share Dela - - + + Options Val - - + + [undefined] [odefinerad] - + %1%2 %1%2 - - + + [invalid] [felaktig] - - + + %1%2Hat %3 %1%2Hatt %3 - - - + + + %1%2Axis %3 %1%2Axel %3 - - + + %1%2Axis %3,%4,%5 %1%2Axel %3,%4%5 - - + + %1%2Motion %3 %1%2Rörelse %3 - - + + %1%2Button %3 %1%2Knapp %3 - - + + [unused] [oanvänd] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L - + Stick R - + Plus Pluss - + Minus Minus - - + + Home Hem - + Capture Fånga - + Touch Touch - + Wheel Indicates the mouse wheel Hjul - + Backward Bakåt - + Forward Framåt - + Task Åtgärd - + Extra Extra - + %1%2%3%4 - - + + %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8667,6 +8735,298 @@ p, li { white-space: pre-wrap; } + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Avbryt + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + + + + + Error Removing Update + + + + + Error Removing DLC + + + + + The base game is not installed in the NAND and cannot be removed. + Basspelet är inte installerat i NAND och kan inte tas bort. + + + + There is no update installed for this title. + Det finns ingen uppdatering installerad för denna titel. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Framgångsrikt borttagen + + + + Successfully removed %1 installed DLC. + Tog framgångsrikt bort den %1 installerade DLCn. + + + + + Error Removing Transferable Shader Cache + Fel När Överförbar Shader Cache Raderades + + + + + A shader cache for this title does not exist. + En shader cache för denna titel existerar inte. + + + + Successfully removed the transferable shader cache. + Raderade den överförbara shadercachen framgångsrikt. + + + + Failed to remove the transferable shader cache. + Misslyckades att ta bort den överförbara shadercache + + + + Error Removing Vulkan Driver Pipeline Cache + + + + + Failed to remove the driver pipeline cache. + + + + + + Error Removing Transferable Shader Caches + + + + + Successfully removed the transferable shader caches. + + + + + Failed to remove the transferable shader cache directory. + + + + + + Error Removing Custom Configuration + Fel När Anpassad Konfiguration Raderades + + + + A custom configuration for this title does not exist. + En anpassad konfiguration för denna titel existerar inte. + + + + Successfully removed the custom game configuration. + Tog bort den anpassade spelkonfigurationen framgångsrikt. + + + + Failed to remove the custom game configuration. + Misslyckades att ta bort den anpassade spelkonfigurationen. + + + + Reset Metadata Cache + Återställ metadatasparning + + + + The metadata cache is already empty. + Metadata cachen är redan tom. + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Metadata cachen kunde inte tas bort. Den kan vara under användning eller icke-existerande. + + + + Create Shortcut + + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -8962,7 +9322,7 @@ Vänligen försök igen eller kontakta utvecklaren av programvaran. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -8970,7 +9330,7 @@ Vänligen försök igen eller kontakta utvecklaren av programvaran. - + Users Användare @@ -9090,7 +9450,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Samtal stack @@ -9098,12 +9458,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 - + waited by no thread Ej väntad av någon tråd @@ -9111,102 +9471,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable - + paused pausad - + sleeping sovande - + waiting for IPC reply väntar på IPC svar - + waiting for objects väntar på föremål - + waiting for condition variable väntar för skickvariabel - + waiting for address arbiter väntar på adressbryter - + waiting for suspend resume - + waiting väntar - + initialized initialiserad - + terminated avslutad - + unknown okänd - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 kärna %1 - + processor = %1 processor = %1 - + affinity mask = %1 affinitetsmask = %1 - + thread id = %1 tråd-id = %1 - + priority = %1(current) / %2(normal) prioritet = %1(nuvarande) / %2(normal) - + last running ticks = %1 sista springande fästingar = %1 @@ -9214,7 +9574,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread väntade med tråd @@ -9222,7 +9582,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 939e88dea0..1f35d08eca 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Sunucuyla iletişim kuruluyor... - + Cancel İptal Et - + Touch the top left corner <br>of your touchpad. Touchpad'inizin sol üst köşesine<br> dokunun. - + Now touch the bottom right corner <br>of your touchpad. Şimdi touchpad'inizin sağ alt köşesine<br> dokunun. - + Configuration completed! Yapılandırma Tamamlandı! - + OK Tamam @@ -397,502 +397,179 @@ Bu işlem onların hem forum kullanıcı adını hem de IP adresini banlar. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Hata - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Çıkış Motoru: - + Output Device: Çıkış Cihazı: - + Input Device: Giriş Cihazı: - + Mute audio Sesi kapat - + Volume: Ses: - + Mute audio when in background Arka plandayken sesi kapat - + Multicore CPU Emulation Çok Çekirdekli CPU Emülasyonu - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Hız Yüzdesini Sınırlandır - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Doğruluk: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) FMA'yı Ayır (FMA olmayan CPU'larda performansı artırır) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Daha hızlı FRSQRTE ve FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Daha hızlı ASIMD komutları (yalnızca 32 bit) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Uygunsuz NaN kullanımı - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Adres boşluğu kontrolünü kapatır. - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Global monitörü görmezden gel - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Cihaz: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Shader Backend: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Çözünürlük: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Pencereye Uyarlı Filtre: - + FSR Sharpness: FSR Keskinliği: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Kenar Yumuşatma Yöntemi: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Tam Ekran Modu: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: En-Boy Oranı: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Disk pipeline cache'ini kullan - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Asenkronize GPU emülasyonu kullan - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: NVDEC emülasyonu: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: VSync Modu: - - FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. -FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. -Mailbox can have lower latency than FIFO and does not tear but may drop frames. -Immediate (no synchronization) just presents whatever is available and can exhibit tearing. - - - - - Enable asynchronous presentation (Vulkan only) - - - - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) En yüksek hızı zorla (Yalnızca Vulkan için) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Grafik komutlarını beklerken GPU'nun hızının düşmesini engellemek için arka planda görev yürütür - + Anisotropic Filtering: Anisotropic Filtering: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Kesinlik Düzeyi: + Kesinlik Düzeyi: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Asenkronize shader derlemesini kullan (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Hızlı GPU Saati Kullan (Hack) @@ -902,1021 +579,1441 @@ This feature is experimental. Hızlı GPU Saati'ni etkinleştir. Bu seçenek çoğu oyunu en yüksek gerçek çözünürlükte çalıştırır. - + Use Vulkan pipeline cache Vulkan pipeline önbelleği kullan - + + RNG Seed + RNG çekirdeği + + + + Device Name + Cihaz İsmi + + + + Language: + Dil: + + + + Note: this can be overridden when region setting is auto-select + Not: bu ayar bölge ayarı otomatiğe alındığında yok sayılabilir. + + + + Region: + Bölge: + + + + Time Zone: + Saat Dilimi: + + + + Sound Output Mode: + Ses Çıkış Modu: + + + + Console Mode: + Konsol Modu: + + + + Prompt for user on game boot + Oyun başlatılırken kullanıcı verisi iste + + + + Pause emulation when in background + Arka plana alındığında emülasyonu duraklat + + + + Hide mouse on inactivity + Hareketsizlik durumunda imleci gizle + + + + CPU + CPU + + + + GPU + GPU + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly Shaderları, Yalnızca NVIDIA için) + + + + Normal + Normal + + + + High + Yüksek + + + + Extreme + Ekstrem + + + + Auto + Otomatik + + + + Accurate + Doğru + + + + Unsafe + Güvensiz + + + + Paranoid (disables most optimizations) + Paranoya (çoğu optimizasyonu kapatır) + + + + Dynarmic + Dinamik + + + + Borderless Windowed + Kenarlıksız Tam Ekran + + + + Exclusive Fullscreen + Ayrılmış Tam Ekran + + + + No Video Output + Video Çıkışı Yok + + + + CPU Video Decoding + CPU Video Decoding + + + + GPU Video Decoding (Default) + GPU Video Decoding (Varsayılan) + + + + 0.5X (360p/540p) [EXPERIMENTAL] + 0.5X (360p/540p) [DENEYSEL] + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [DENEYSEL] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [DENEYSEL] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + En Yakın Komşu Algoritması + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + Gausyen + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Süper Çözünürlük + + + + None + Yok + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Varsayılan (16:9) + + + + Force 4:3 + 4:3'e Zorla + + + + Force 21:9 + 21:9'a Zorla + + + + Force 16:10 + 16:10'a Zorla + + + + Stretch to Window + Ekrana Sığdır + + + + Automatic + Otomatik + + + + + Default + Varsayılan + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. +FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. +Mailbox can have lower latency than FIFO and does not tear but may drop frames. +Immediate (no synchronization) just presents whatever is available and can exhibit tearing. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Enable asynchronous presentation (Vulkan only) + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - RNG çekirdeği + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Cihaz İsmi - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - - Language: - Dil: - - - - Note: this can be overridden when region setting is auto-select - Not: bu ayar bölge ayarı otomatiğe alındığında yok sayılabilir. - - - - Region: - Bölge: - - - + The region of the emulated Switch. - - Time Zone: - Saat Dilimi: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Ses Çıkış Modu: - - - - Console Mode: - Konsol Modu: - - - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Oyun başlatılırken kullanıcı verisi iste - - - - Pause emulation when in background - Arka plana alındığında emülasyonu duraklat - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Hareketsizlik durumunda imleci gizle - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - - GPU - GPU - - - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - + Null - + GLSL - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly Shaderları, Yalnızca NVIDIA için) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Normal + + Unsafe (fast) + - - High - Yüksek + + Safe (stable) + - - Extreme - Ekstrem - - - - Auto - Otomatik - - - - Accurate - Doğru - - - - Unsafe - Güvensiz - - - - Paranoid (disables most optimizations) - Paranoya (çoğu optimizasyonu kapatır) - - - - Dynarmic - Dinamik - - - + NCE - - Borderless Windowed - Kenarlıksız Tam Ekran - - - - Exclusive Fullscreen - Ayrılmış Tam Ekran - - - - No Video Output - Video Çıkışı Yok - - - - CPU Video Decoding - CPU Video Decoding - - - - GPU Video Decoding (Default) - GPU Video Decoding (Varsayılan) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - - 0.5X (360p/540p) [EXPERIMENTAL] - 0.5X (360p/540p) [DENEYSEL] - - - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [DENEYSEL] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [DENEYSEL] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - En Yakın Komşu Algoritması - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - Gausyen - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Süper Çözünürlük - - - + Area - - None - Yok - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Varsayılan (16:9) - - - - Force 4:3 - 4:3'e Zorla - - - - Force 21:9 - 21:9'a Zorla - - - - Force 16:10 - 16:10'a Zorla - - - - Stretch to Window - Ekrana Sığdır - - - - Automatic - Otomatik - - - - Default - Varsayılan - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - - + + Serbian (српски) + + + + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Dock Modu Aktif - + Handheld Taşınabilir - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop - + Never ask Asla sorma + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2266,27 +2363,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Kütük Tutma - + Open Log Location Kütük Konumunu Aç - + Global Log Filter Evrensel Kütük Filtresi - + When checked, the max size of the log increases from 100 MB to 1 GB Etkinleştirildiğinde log'un boyut sınırı 100 MB'tan 1 GB'a çıkar - + Enable Extended Logging** Uzatılmış Hata Kaydını Etkinleştir. - + Show Log in Console Konsolda Log'u Göster @@ -2432,7 +2529,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2494,7 +2591,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Bu yuzu kapandığında otomatik olarak eski haline dönecektir. - + Web applet not compiled Web uygulaması derlenmemiş @@ -2544,7 +2641,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2553,88 +2650,88 @@ When a guest attempts to open the controller applet, it is immediately closed. - + Applets - - + + Audio Ses - - + + CPU CPU - + Debug Hata Ayıklama - + Filesystem Dosya sistemi - - + + General Genel - - + + Graphics Grafikler - + GraphicsAdvanced Gelişmiş Grafik Ayarları - + GraphicsExtensions - + Hotkeys Kısayollar - - + + Controls Kontroller - + Profiles Profiller - + Network - - + + System Sistem - + Game List Oyun Listesi - + Web Web @@ -2732,51 +2829,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Üstveri Cache'ini Sıfırla - + Select Emulated NAND Directory... NAND Konumunu Seç... - + Select Emulated SD Directory... Emüle Edilmiş SD Kart Konumunu Seç... - + Select Gamecard Path... Oyun Kartuşu Konumunu Seç... - + Select Dump Directory... Dump Konumunu Seç... - + Select Mod Load Directory... Mod Yükleme Konumunu Seç... - The metadata cache is already empty. - Metadata Cache'i zaten boş. + Metadata Cache'i zaten boş. - The operation completed successfully. - İşlem başarıyla tamamlandı. + İşlem başarıyla tamamlandı. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Metadata Cache'i silinemedi. Kullanımda ya da oluşturulmamış olabilir. + Metadata Cache'i silinemedi. Kullanımda ya da oluşturulmamış olabilir. @@ -2807,12 +2898,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Bu seçenek tüm genel ve oyuna özgü ayarları silecektir. Oyun dizinleri, profiller ve giriş profilleri silinmeyecektir. Devam etmek istiyor musunuz? @@ -2845,33 +2936,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Arkaplan Rengi: - + % FSR sharpening percentage (e.g. 50%) % - + Off Kapalı - + VSync Off VSync Kapalı - + Recommended Önerilen - + On Açık - + VSync On Vsync Açık @@ -2908,14 +2999,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2947,75 +3042,75 @@ These settings are experimental, and may cause black screens. If your games fail Varsayılana Döndür - + Action İşlem - + Hotkey Kısayol - + Controller Hotkey Kontrolcü Kısayolu - - - + + + Conflicting Key Sequence Tutarsız Anahtar Dizisi - - + + The entered key sequence is already assigned to: %1 Girilen anahtar dizisi zaten %1'e atanmış. - + [waiting] [bekleniyor] - + Invalid Geçersiz - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Varsayılana Döndür - + Clear Temizle - + Conflicting Button Sequence Tutarsız Tuş Dizisi - + The default button sequence is already assigned to: %1 Varsayılan buton dizisi zaten %1'e atanmış. - + The default key sequence is already assigned to: %1 Varsayılan anahtar dizisi zaten %1'e atanmış. @@ -3335,7 +3430,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3490,7 +3585,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Sol Analog @@ -3600,14 +3695,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3626,7 +3721,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Artı @@ -3639,15 +3734,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3692,7 +3787,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Sağ Analog @@ -3707,242 +3802,242 @@ These settings are experimental, and may cause black screens. If your games fail Yapılandır - - - - + + + + Clear Temizle - - - - - + + + + + [not set] [belirlenmedi] - - - + + + Invert button Tuşları ters çevir - - + + Toggle button Tuşu Aç/Kapa - + Turbo button Turbo tuşu - - + + Invert axis Ekseni ters çevir - - - + + + Set threshold Alt sınır ayarla - - + + Choose a value between 0% and 100% %0 ve %100 arasında bir değer seçin - + Toggle axis Ekseni aç/kapa - + Set gyro threshold Gyro alt sınırı ayarla - + Calibrate sensor - + Map Analog Stick Analog Çubuğu Ayarla - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Tamama bastıktan sonra, joystikinizi önce yatay sonra dikey olarak hareket ettirin. Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak hareket ettirin. - + Center axis Ekseni merkezle - - + + Deadzone: %1% Ölü Bölge: %1% - - + + Modifier Range: %1% Düzenleyici Aralığı: %1% - - + + Pro Controller Pro Controller - + Dual Joycons İkili Joyconlar - + Left Joycon Sol Joycon - + Right Joycon Sağ Joycon - + Handheld Handheld - + GameCube Controller GameCube Kontrolcüsü - + Poke Ball Plus Poke Ball Plus - + NES Controller NES Kontrolcüsü - + SNES Controller SNES Kontrolcüsü - + N64 Controller N64 Kontrolcüsü - + Sega Genesis Sega Genesis - + Start / Pause Başlat / Duraklat - + Z Z - + Control Stick Kontrol Çubuğu - + C-Stick C-Çubuğu - + Shake! Salla! - + [waiting] [bekleniyor] - + New Profile Yeni Profil - + Enter a profile name: Bir profil ismi girin: - - + + Create Input Profile Kontrol Profili Oluştur - + The given profile name is not valid! Girilen profil ismi geçerli değil! - + Failed to create the input profile "%1" "%1" kontrol profili oluşturulamadı - + Delete Input Profile Kontrol Profilini Kaldır - + Failed to delete the input profile "%1" "%1" kontrol profili kaldırılamadı - + Load Input Profile Kontrol Profilini Yükle - + Failed to load the input profile "%1" "%1" kontrol profili yüklenemedi - + Save Input Profile Kontrol Profilini Kaydet - + Failed to save the input profile "%1" "%1" kontrol profili kaydedilemedi @@ -3999,7 +4094,7 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har - + Configure Yapılandır @@ -4035,7 +4130,7 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har - + Test Test @@ -4054,7 +4149,7 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Daha Fazlası</span></a> - + %1:%2 %1:%2 @@ -4063,77 +4158,77 @@ Eksenleri ters çevirmek için, önce joystickinizi dikey sonra yatay olarak har yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Port numarasında geçersiz karakterler var - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Port 0 ila 65353 aralığında olmalıdır - + IP address is not valid IP adresi geçerli değil - + This UDP server already exists Bu UDP sunucusu zaten var - + Unable to add more than 8 servers 8'den fazla server eklenemez - + Testing Test Ediliyor - + Configuring Yapılandırılıyor - + Test Successful Test Başarılı - + Successfully received data from the server. Bilgi başarıyla sunucudan kaldırıldı. - + Test Failed Test Başarısız - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Serverdan geçerli veri alınamadı.<br>Lütfen sunucunun doğru ayarlandığını ya da adres ve portun doğru olduğunu kontrol edin. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP testi ya da yapılandırılması devrede.<br>Lütfen bitmesini bekleyin. @@ -4259,7 +4354,12 @@ Current values are %1% and %2% respectively. Ağ Arayüzü - + + Enable Airplane Mode + + + + None Hiçbiri @@ -4317,52 +4417,52 @@ Current values are %1% and %2% respectively. - + Add-Ons Eklentiler - + System Sistem - + CPU CPU - + Graphics Grafikler - + Adv. Graphics Gelişmiş Grafikler - + GPU Extensions - + Audio Ses - + Input Profiles Kontrol Profilleri - + Linux Linux - + Properties Özellikler @@ -4380,12 +4480,12 @@ Current values are %1% and %2% respectively. Eklentiler - + Patch Name Yama Adı - + Version Versiyon @@ -4423,27 +4523,32 @@ Current values are %1% and %2% respectively. Resim Belirle - + + Select Avatar + + + + Add Ekle - + Rename Yeniden Adlandır - + Remove Kaldır - + Profile management is available only when game is not running. Profil ayarlarına sadece oyun çalışmıyorken erişilebilir. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4451,100 +4556,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Kullanıcı Adınızı girin - + Users Kullanıcılar - + Enter a username for the new user: Yeni kullanıcı için yeni bir kullanıcı adı giriniz: - + Enter a new username: Yeni bir kullanıcı adı giriniz: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Kullanıcı Resmi Seçin - - JPEG Images (*.jpg *.jpeg) - JPEG Görüntüler (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG Görüntüler (*.jpg *.jpeg) + + + Error deleting image Resim silinirken hata oluştu - + Error occurred attempting to overwrite previous image at: %1. Eski resmin üzerine yazılmaya çalışırken hata oluştu: %1. - + Error deleting file Dosyayı silerken hata oluştu - + Unable to delete existing file: %1. Mevcut %1 dosyası silinemedi - + Error creating user image directory Kullanıcı görüntü klasörünü oluştururken hata - + Unable to create directory %1 for storing user images. Kullanıcı görüntülerini depolamak için %1 klasörü oluşturulamadı. - Error copying user image - Kullanıcı görüntüsünü kopyalarken hata + Kullanıcı görüntüsünü kopyalarken hata - Unable to copy image from %1 to %2 - Görüntü %1'den %2'ye kopyalanamadı + Görüntü %1'den %2'ye kopyalanamadı - Error resizing user image - Kullanıcı görüntüsünü yeniden boyutlandırma hatası + Kullanıcı görüntüsünü yeniden boyutlandırma hatası - Unable to resize image - Görüntü yeniden boyutlandırılamıyor + Görüntü yeniden boyutlandırılamıyor + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Kullanıcıyı silmek istediğinize emin misiniz? Kayıtlı oyun verileri de birlikte silinecek. - + Confirm Delete Silmeyi Onayla - + Name: %1 UUID: %2 İsim: %1 @@ -4597,7 +4791,7 @@ UUID: %2 - + Enable @@ -4608,7 +4802,7 @@ UUID: %2 - + Not connected Bağlantı yok @@ -4618,63 +4812,63 @@ UUID: %2 Varsayılana Döndür - + Clear Temizle - + [not set] [belirlenmedi] - + Invert axis Ekseni ters çevir - - + + Deadzone: %1% Ölü Bölge: %1% - + Error enabling ring input Ring giriş hatası - + Direct Joycon driver is not enabled Direkt Joycon sürücüsü açık değil - + Configuring Yapılandırılıyor - + The current mapped device doesn't support the ring controller Atanmış cihaz ring kontrolünü desteklemiyor - + The current mapped device doesn't have a ring attached Atanmış cihaza ring takılı değil - + The current mapped device is not connected - + Unexpected driver result %1 Beklenmeyen sürücü sonucu %1 - + [waiting] [bekleniyor] @@ -4716,7 +4910,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4768,12 +4962,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS Yapılandırması - + Select TAS Load Directory... Tas Yükleme Dizini Seçin @@ -4883,7 +5077,7 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5203,6 +5397,16 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu Web Servisi @@ -5212,42 +5416,29 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Kullanıcı adınızı ve tokeninizi sağlayarak Citra'nın ek kullanım verilerini toplamasına izin vermeyi kabul ediyorsunuz, bu kullanıcı tanımlayıcı bilgileri de içerebilir. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Doğrula + Doğrula - Sign up - Kayıt Ol + Kayıt Ol - + Token: Token: - + Username: Kullanıcı Adı: - What is my token? - Tokenim nedir? + Tokenim nedir? - + Web Service configuration can only be changed when a public room isn't being hosted. Web Sunucu ayarları yalnızca halka açık bir oda sunulmuyorken değiştirilebilir. @@ -5272,12 +5463,12 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Yeniden Oluştur - + Discord Presence Discord Görünümü - + Show Current Game in your Discord Status Şu anda oynadığın oyunu Discord'da durum olarak göster @@ -5286,24 +5477,8 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Daha Fazlası</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Kayıt Ol</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Kayıt Ol</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5326,10 +5501,9 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Token doğrulanmadı. Tokeninize yapılan değişiklik kaydedilmedi. - Unverified, please click Verify before saving configuration Tooltip - Doğrulanmadı, lütfen konfigürasyonu kaydetmeden önce Doğrula tuşuna basın + Doğrulanmadı, lütfen konfigürasyonu kaydetmeden önce Doğrula tuşuna basın Verifying... @@ -5353,20 +5527,67 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Doğrulanma başarısız oldu. Kullanıcı adı ve tokeninizi doğru girdiğinizden ve internete bağlı olduğunuzdan. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Kontrolcü O1 - + &Controller P1 &Kontrolcü O1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Versiyon + + DirectConnect @@ -5472,7 +5693,12 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5480,11 +5706,6 @@ Noktanın konumunu değiştirmek için sürükleyin ya da sayıların üstüne The host of the room has banned you. Speak with the host to unban you or try a different room. Oda yöneticisi sizi odadan yasakladı. Yasağı kaldırmak için yönetici ile konuşun ya da başka bir oda deneyin. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5546,7 +5767,7 @@ Lütfen Yapılandır -> Sistem -> Ağ'a gidip bir seçim yapınız.Telemetri - + Broken Vulkan Installation Detected Bozuk Vulkan Kurulumu Algılandı @@ -5555,106 +5776,105 @@ Lütfen Yapılandır -> Sistem -> Ağ'a gidip bir seçim yapınız.Açılışta Vulkan başlatılırken hata. Hata yardımını görüntülemek için <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>buraya tıklayın</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... Web Uygulaması Yükleniyor... - - + + Disable Web Applet Web Uygulamasını Devre Dışı Bırak - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Web uygulamasını kapatmak bilinmeyen hatalara neden olabileceğinden dolayı sadece Super Mario 3D All-Stars için kapatılması önerilir. Web uygulamasını kapatmak istediğinize emin misiniz? (Hata ayıklama ayarlarından tekrar açılabilir) - + The amount of shaders currently being built Şu anda derlenen shader miktarı - + The current selected resolution scaling multiplier. Geçerli seçili çözünürlük ölçekleme çarpanı. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Geçerli emülasyon hızı. %100'den yüksek veya düşük değerler emülasyonun bir Switch'den daha hızlı veya daha yavaş çalıştığını gösterir. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Oyunun şuanda saniye başına kaç kare gösterdiği. Bu oyundan oyuna ve sahneden sahneye değişiklik gösterir. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Bir Switch karesini emüle etmekte geçen zaman, karelimitleme ve v-sync hariç. Tam hız emülasyon için bu en çok 16,67 ms olmalı. - + Unmute Sessizden çıkar - + Mute Sessize al - + Reset Volume - + &Clear Recent Files &Son Dosyaları Temizle - + &Continue &Devam Et - + &Pause &Duraklat - Warning Outdated Game Format - Uyarı, Eski Oyun Formatı + Uyarı, Eski Oyun Formatı You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Bu oyun için dekonstrükte ROM formatı kullanıyorsunuz, bu fromatın yerine NCA, NAX, XCI ve NSP formatları kullanılmaktadır. Dekonstrükte ROM formatları ikon, üst veri ve güncelleme desteği içermemektedir.<br><br>Yuzu'nun desteklediği çeşitli Switch formatları için<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>Wiki'yi ziyaret edin</a>. Bu mesaj yeniden gösterilmeyecektir. - - + + Error while loading ROM! ROM yüklenirken hata oluştu! - + The ROM format is not supported. Bu ROM biçimi desteklenmiyor. - + An error occurred initializing the video core. Video çekirdeğini başlatılırken bir hata oluştu. @@ -5663,7 +5883,7 @@ Lütfen Yapılandır -> Sistem -> Ağ'a gidip bir seçim yapınız.yuzu video çekirdeğini çalıştırırken bir hatayla karşılaştı. Bu sorun genellikle eski GPU sürücüleri sebebiyle ortaya çıkar. Daha fazla detay için lütfen log dosyasına bakın. Log dosyasını incelemeye dair daha fazla bilgi için lütfen bu sayfaya ulaşın: <a href='https://yuzu-emu.org/help/reference/log-files/'>Log dosyası nasıl yüklenir</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM yüklenirken hata oluştu! %1 @@ -5674,1025 +5894,881 @@ Lütfen Yapılandır -> Sistem -> Ağ'a gidip bir seçim yapınız.%1<br>Lütfen dosyalarınızı yeniden dump etmek için<a href='https://yuzu-emu.org/help/quickstart/'>yuzu hızlı başlangıç kılavuzu'nu</a> takip edin.<br> Yardım için yuzu wiki</a>veya yuzu Discord'una</a> bakabilirsiniz. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Bilinmeyen bir hata oluştu. Lütfen daha fazla detay için kütüğe göz atınız. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Yazılım kapatılıyor... - + Save Data Kayıt Verisi - + Mod Data Mod Verisi - + Error Opening %1 Folder %1 klasörü açılırken hata - - + + Folder does not exist! Klasör mevcut değil! - Error Opening Transferable Shader Cache - Transfer Edilebilir Shader Cache'ini Açarken Bir Hata Oluştu + Transfer Edilebilir Shader Cache'ini Açarken Bir Hata Oluştu - Failed to create the shader cache directory for this title. - Bu oyun için shader cache konumu oluşturulamadı. + Bu oyun için shader cache konumu oluşturulamadı. - Error Removing Contents - İçerik Kaldırma Hatası + İçerik Kaldırma Hatası - Error Removing Update - Güncelleme Kaldırma hatası + Güncelleme Kaldırma hatası - Error Removing DLC - DLC Kaldırma Hatası + DLC Kaldırma Hatası - + Remove Installed Game Contents? Yüklenmiş Oyun İçeriğini Kaldırmak İstediğinize Emin Misiniz? - + Remove Installed Game Update? Yüklenmiş Oyun Güncellemesini Kaldırmak İstediğinize Emin Misiniz? - + Remove Installed Game DLC? Yüklenmiş DLC'yi Kaldırmak İstediğinize Emin Misiniz? - + Remove Entry Girdiyi Kaldır - - - - - - Successfully Removed - Başarıyla Kaldırıldı + Başarıyla Kaldırıldı - Successfully removed the installed base game. - Yüklenmiş oyun başarıyla kaldırıldı. + Yüklenmiş oyun başarıyla kaldırıldı. - The base game is not installed in the NAND and cannot be removed. - Asıl oyun NAND'de kurulu değil ve kaldırılamaz. + Asıl oyun NAND'de kurulu değil ve kaldırılamaz. - Successfully removed the installed update. - Yüklenmiş güncelleme başarıyla kaldırıldı. + Yüklenmiş güncelleme başarıyla kaldırıldı. - There is no update installed for this title. - Bu oyun için yüklenmiş bir güncelleme yok. + Bu oyun için yüklenmiş bir güncelleme yok. - There are no DLC installed for this title. - Bu oyun için yüklenmiş bir DLC yok. + Bu oyun için yüklenmiş bir DLC yok. - Successfully removed %1 installed DLC. - %1 yüklenmiş DLC başarıyla kaldırıldı. + %1 yüklenmiş DLC başarıyla kaldırıldı. - + Delete OpenGL Transferable Shader Cache? OpenGL Transfer Edilebilir Shader Cache'ini Kaldırmak İstediğinize Emin Misiniz? - + Delete Vulkan Transferable Shader Cache? Vulkan Transfer Edilebilir Shader Cache'ini Kaldırmak İstediğinize Emin Misiniz? - + Delete All Transferable Shader Caches? Tüm Transfer Edilebilir Shader Cache'leri Kaldırmak İstediğinize Emin Misiniz? - + Remove Custom Game Configuration? Oyuna Özel Yapılandırmayı Kaldırmak İstediğinize Emin Misiniz? - + Remove Cache Storage? - + Remove File Dosyayı Sil - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Transfer Edilebilir Shader Cache Kaldırılırken Bir Hata Oluştu + Transfer Edilebilir Shader Cache Kaldırılırken Bir Hata Oluştu - - A shader cache for this title does not exist. - Bu oyun için oluşturulmuş bir shader cache yok. + Bu oyun için oluşturulmuş bir shader cache yok. - Successfully removed the transferable shader cache. - Transfer edilebilir shader cache başarıyla kaldırıldı. + Transfer edilebilir shader cache başarıyla kaldırıldı. - Failed to remove the transferable shader cache. - Transfer edilebilir shader cache kaldırılamadı. + Transfer edilebilir shader cache kaldırılamadı. - Error Removing Vulkan Driver Pipeline Cache - Vulkan Pipeline Önbelleği Kaldırılırken Hata + Vulkan Pipeline Önbelleği Kaldırılırken Hata - Failed to remove the driver pipeline cache. - Sürücü pipeline önbelleği kaldırılamadı. + Sürücü pipeline önbelleği kaldırılamadı. - - Error Removing Transferable Shader Caches - Transfer Edilebilir Shader Cache'ler Kaldırılırken Bir Hata Oluştu + Transfer Edilebilir Shader Cache'ler Kaldırılırken Bir Hata Oluştu - Successfully removed the transferable shader caches. - Transfer edilebilir shader cacheler başarıyla kaldırıldı. + Transfer edilebilir shader cacheler başarıyla kaldırıldı. - Failed to remove the transferable shader cache directory. - Transfer edilebilir shader cache konumu kaldırılamadı. + Transfer edilebilir shader cache konumu kaldırılamadı. - - Error Removing Custom Configuration - Oyuna Özel Yapılandırma Kaldırılırken Bir Hata Oluştu. + Oyuna Özel Yapılandırma Kaldırılırken Bir Hata Oluştu. - A custom configuration for this title does not exist. - Bu oyun için bir özel yapılandırma yok. + Bu oyun için bir özel yapılandırma yok. - Successfully removed the custom game configuration. - Oyuna özel yapılandırma başarıyla kaldırıldı. + Oyuna özel yapılandırma başarıyla kaldırıldı. - Failed to remove the custom game configuration. - Oyuna özel yapılandırma kaldırılamadı. + Oyuna özel yapılandırma kaldırılamadı. - - + + RomFS Extraction Failed! RomFS Çıkartımı Başarısız! - + There was an error copying the RomFS files or the user cancelled the operation. RomFS dosyaları kopyalanırken bir hata oluştu veya kullanıcı işlemi iptal etti. - + Full Full - + Skeleton Çerçeve - + Select RomFS Dump Mode RomFS Dump Modunu Seçiniz - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Lütfen RomFS'in nasıl dump edilmesini istediğinizi seçin.<br>"Full" tüm dosyaları yeni bir klasöre kopyalarken <br>"skeleton" sadece klasör yapısını oluşturur. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 konumunda RomFS çıkarmaya yetecek alan yok. Lütfen yer açın ya da Emülasyon > Yapılandırma > Sistem > Dosya Sistemi > Dump konumu kısmından farklı bir çıktı konumu belirleyin. - + Extracting RomFS... RomFS çıkartılıyor... - - - - - + + Cancel İptal - + RomFS Extraction Succeeded! RomFS Çıkartımı Başarılı! - - - + The operation completed successfully. İşlem başarıyla tamamlandı. - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - - Verifying integrity... - - - - - - Integrity verification succeeded! - - - - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - Create Shortcut - Kısayol Oluştur + Kısayol Oluştur - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - %1 dizinine kısayol oluşturuldu + %1 dizinine kısayol oluşturuldu - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Bu seçenek, şu anki AppImage dosyasının kısayolunu oluşturacak. Uygulama güncellenirse kısayol çalışmayabilir. Devam edilsin mi? + Bu seçenek, şu anki AppImage dosyasının kısayolunu oluşturacak. Uygulama güncellenirse kısayol çalışmayabilir. Devam edilsin mi? - - Failed to create a shortcut to %1 + Create Icon + Simge Oluştur + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Simge dosyası oluşturulamadı. "%1" dizini yok ve oluşturulamıyor. + + + + Warning: Outdated Game Format - - Create Icon - Simge Oluştur + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Simge dosyası oluşturulamadı. "%1" dizini yok ve oluşturulamıyor. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 %1 Açılırken Bir Hata Oluştu - + Select Directory Klasör Seç - + Properties Özellikler - + The game properties could not be loaded. Oyun özellikleri yüklenemedi. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch Çalıştırılabilir Dosyası (%1);;Tüm Dosyalar (*.*) - + Load File Dosya Aç - + Open Extracted ROM Directory Çıkartılmış ROM klasörünü aç - + Invalid Directory Selected Geçersiz Klasör Seçildi - + The directory you have selected does not contain a 'main' file. Seçtiğiniz klasör bir "main" dosyası içermiyor. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Yüklenilebilir Switch Dosyası (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submissions Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Dosya Kur - + %n file(s) remaining %n dosya kaldı + %n dosya kaldı - + Installing file "%1"... "%1" dosyası kuruluyor... - - + + Install Results Kurulum Sonuçları - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Olası çakışmaları önlemek için oyunları NAND'e yüklememenizi tavsiye ediyoruz. Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın. - + %n file(s) were newly installed - %n dosya güncel olarak yüklendi - + %n dosya güncel olarak yüklendi + %n dosya güncel olarak yüklendi - + %n file(s) were overwritten - %n dosyanın üstüne yazıldı - + %n dosyanın üstüne yazıldı + %n dosyanın üstüne yazıldı - + %n file(s) failed to install - %n dosya yüklenemedi - + %n dosya yüklenemedi + %n dosya yüklenemedi - + System Application Sistem Uygulaması - + System Archive Sistem Arşivi - + System Application Update Sistem Uygulama Güncellemesi - + Firmware Package (Type A) Yazılım Paketi (Tür A) - + Firmware Package (Type B) Yazılım Paketi (Tür B) - + Game Oyun - + Game Update Oyun Güncellemesi - + Game DLC Oyun DLC'si - + Delta Title Delta Başlık - + Select NCA Install Type... NCA Kurulum Tipi Seçin... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Lütfen bu NCA dosyası için belirlemek istediğiniz başlık türünü seçiniz: (Çoğu durumda, varsayılan olan 'Oyun' kullanılabilir.) - + Failed to Install Kurulum Başarısız Oldu - + The title type you selected for the NCA is invalid. NCA için seçtiğiniz başlık türü geçersiz - + File not found Dosya Bulunamadı - + File "%1" not found Dosya "%1" Bulunamadı - + OK Tamam - - + + Hardware requirements not met Donanım gereksinimleri karşılanmıyor - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Sisteminiz, önerilen donanım gereksinimlerini karşılamıyor. Uyumluluk raporlayıcı kapatıldı. - + Missing yuzu Account Kayıp yuzu Hesabı - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Oyun uyumluluk test çalışması göndermek için öncelikle yuzu hesabınla giriş yapmanız gerekiyor.<br><br/>Yuzu hesabınızla giriş yapmak için, Emülasyon &gt; Yapılandırma &gt; Web'e gidiniz. - + Error opening URL URL açılırken bir hata oluştu - + Unable to open the URL "%1". URL "%1" açılamıyor. - + TAS Recording TAS kayıtta - + Overwrite file of player 1? Oyuncu 1'in dosyasının üstüne yazılsın mı? - + Invalid config detected Geçersiz yapılandırma tespit edildi - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handheld kontrolcü dock modunda kullanılamaz. Pro kontrolcü seçilecek. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo kaldırıldı - + Error Hata - - + + The current game is not looking for amiibos Aktif oyun amiibo beklemiyor - + Amiibo File (%1);; All Files (*.*) Amiibo Dosyası (%1);; Tüm Dosyalar (*.*) - + Load Amiibo Amiibo Yükle - + Error loading Amiibo data Amiibo verisi yüklenirken hata - + The selected file is not a valid amiibo Seçtiğiniz dosya geçerli bir amiibo değil - + The selected file is already on use Seçtiğiniz dosya hali hazırda kullanılıyor - + An unknown error occurred Bilinmeyen bir hata oluştu - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Kontrolcü Uygulaması - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Ekran Görüntüsü Al - + PNG Image (*.png) PNG görüntüsü (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS durumu: %1%2 çalışıyor - + TAS state: Recording %1 TAS durumu: %1 kaydediliyor - + TAS state: Idle %1/%2 TAS durumu: %1%2 boşta - + TAS State: Invalid TAS durumu: Geçersiz - + &Stop Running &Çalıştırmayı durdur - + &Start &Başlat - + Stop R&ecording K&aydetmeyi Durdur - + R&ecord K&aydet - + Building: %n shader(s) Oluşturuluyor: %n shader + Oluşturuluyor: %n shader - + Scale: %1x %1 is the resolution scaling factor Ölçek: %1x - + Speed: %1% / %2% Hız %1% / %2% - + Speed: %1% Hız: %1% @@ -6701,54 +6777,54 @@ Would you like to download it? Oyun: %1 FPS (Sınırsız) - + Game: %1 FPS Oyun: %1 FPS - + Frame: %1 ms Kare: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA AA YOK - + VOLUME: MUTE SES: KAPALI - + VOLUME: %1% Volume percentage (e.g. 50%) SES: %%1 - + Derivation Components Missing Türeten Bileşenleri Kayıp - + Select RomFS Dump Target RomFS Dump Hedefini Seçiniz - + Please select which RomFS you would like to dump. Lütfen dump etmek istediğiniz RomFS'i seçiniz. @@ -6761,7 +6837,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Emülasyonu durdurmak istediğinizden emin misiniz? Kaydedilmemiş veriler kaybolur. @@ -6774,102 +6850,102 @@ Would you like to bypass this and exit anyway? Görmezden gelip kapatmak ister misiniz? - + None Yok - + FXAA FXAA - + SMAA SMAA - + Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + ScaleForce ScaleForce - + Area - + Docked Dock Modu Aktif - + Handheld Taşınabilir - + Normal Normal - + High Yüksek - + Extreme Ekstrem - + Vulkan Vulkan - + OpenGL OpenGL - + Null - + GLSL - + GLASM - + SPIRV @@ -6877,13 +6953,13 @@ Görmezden gelip kapatmak ister misiniz? GRenderWindow - - + + OpenGL not available! OpenGL kullanıma uygun değil! - + OpenGL shared contexts are not supported. OpenGL paylaşılan bağlam desteklenmiyor. @@ -6892,33 +6968,33 @@ Görmezden gelip kapatmak ister misiniz? Yuzu OpenGL desteklememektedir. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! OpenGl başlatılırken bir hata oluştu! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPU'nuz OpenGL desteklemiyor veya güncel bir grafik sürücüsüne sahip değilsiniz. - + Error while initializing OpenGL 4.6! OpenGl 4.6 başlatılırken bir hata oluştu! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPU'nuz OpenGL 4.6'yı desteklemiyor veya güncel bir grafik sürücüsüne sahip değilsiniz.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPU'nuz gereken bir yada daha fazla OpenGL eklentisini desteklemiyor Lütfen güncel bir grafik sürücüsüne sahip olduğunuzdan emin olun.<br><br>GL Renderer:<br>%1<br><br> Desteklenmeyen Eklentiler:<br>%2 @@ -6926,128 +7002,128 @@ Görmezden gelip kapatmak ister misiniz? GameList - + Favorite Favori - + Start Game Oyunu Başlat - + Start Game without Custom Configuration Oyunu Özel Yapılandırma Olmadan Başlat - + Open Save Data Location Kayıt Dosyası Konumunu Aç - + Open Mod Data Location Mod Dosyası Konumunu Aç - + Open Transferable Pipeline Cache Transfer Edilebilir Pipeline Cache'ini Aç - + Remove Kaldır - + Remove Installed Update Yüklenmiş Güncellemeleri Kaldır - + Remove All Installed DLC Yüklenmiş DLC'leri Kaldır - + Remove Custom Configuration Oyuna Özel Yapılandırmayı Kaldır - + Remove Play Time Data - + Remove Cache Storage - + Remove OpenGL Pipeline Cache OpenGL Pipeline Cache'ini Kaldır - + Remove Vulkan Pipeline Cache Vulkan Pipeline Cache'ini Kaldır - + Remove All Pipeline Caches Bütün Pipeline Cache'lerini Kaldır - + Remove All Installed Contents Tüm Yüklenmiş İçeriği Kaldır - + Dump RomFS RomFS Dump Et - + Dump RomFS to SDMC RomFS'i SDMC'ye çıkar. - + Verify Integrity - + Copy Title ID to Clipboard Title ID'yi Panoya Kopyala - + Navigate to GameDB entry GameDB sayfasına yönlendir - + Create Shortcut Kısayol Oluştur - + Add to Desktop Masaüstüne Ekle - + Add to Applications Menu Uygulamalar Menüsüne Ekl - + Configure Game @@ -7056,62 +7132,62 @@ Görmezden gelip kapatmak ister misiniz? Özellikler - + Scan Subfolders Alt Klasörleri Tara - + Remove Game Directory Oyun Konumunu Kaldır - + ▲ Move Up ▲Yukarı Git - + ▼ Move Down ▼Aşağı Git - + Open Directory Location Oyun Dosyası Konumunu Aç - + Clear Temizle - + Name İsim - + Compatibility Uyumluluk - + Add-ons Eklentiler - + File type Dosya türü - + Size Boyut - + Play time @@ -7119,62 +7195,62 @@ Görmezden gelip kapatmak ister misiniz? GameListItemCompat - + Ingame Oyunda - + Game starts, but crashes or major glitches prevent it from being completed. Oyun başlatılabiliyor, fakat bariz hatalardan veya çökme sorunlarından dolayı bitirilemiyor. - + Perfect Mükemmel - + Game can be played without issues. Oyun sorunsuz bir şekilde oynanabiliyor. - + Playable Oynanabilir - + Game functions with minor graphical or audio glitches and is playable from start to finish. Oyun küçük grafik veya ses hatalarıyla çalışıyor ve baştan sona kadar oynanabilir. - + Intro/Menu İntro/Menü - + Game loads, but is unable to progress past the Start Screen. Oyun açılıyor, fakat ana menüden ileri gidilemiyor. - + Won't Boot Açılmıyor - + The game crashes when attempting to startup. Oyun açılmaya çalışıldığında çöküyor. - + Not Tested Test Edilmedi - + The game has not yet been tested. Bu oyun henüz test edilmedi. @@ -7182,7 +7258,7 @@ Görmezden gelip kapatmak ister misiniz? GameListPlaceholder - + Double-click to add a new folder to the game list Oyun listesine yeni bir klasör eklemek için çift tıklayın. @@ -7190,19 +7266,20 @@ Görmezden gelip kapatmak ister misiniz? GameListSearchField - + %1 of %n result(s) %n sonucun %1'i + %n sonucun %1'i - + Filter: Filtre: - + Enter pattern to filter Filtrelemek için bir düzen giriniz @@ -7284,7 +7361,7 @@ Görmezden gelip kapatmak ister misiniz? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7297,190 +7374,190 @@ Debug Message: Hotkeys - + Audio Mute/Unmute Sesi Sustur/Aç - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Ana Pencere - + Audio Volume Down Ses Kapa - + Audio Volume Up Ses Aç - + Capture Screenshot Ekran Görüntüsü Al - + Change Adapting Filter Uyarlanan Filtreyi Değiştir - + Change Docked Mode Takılı Modu Kullan - + Change GPU Accuracy GPU Doğruluğunu Değiştir - + Configure Yapılandır - + Configure Current Game - + Continue/Pause Emulation Sürdür/Emülasyonu duraklat - + Exit Fullscreen Tam Ekrandan Çık + + + Exit Eden + + Exit yuzu Yuzu'dan çık - - Exit eden - - - - + Fullscreen Tam Ekran - + Load File Dosya Aç - + Load/Remove Amiibo Amiibo Yükle/Kaldır - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Emülasyonu Yeniden Başlat - + Stop Emulation Emülasyonu Durdur - + TAS Record TAS Kaydet - + TAS Reset TAS Sıfırla - + TAS Start/Stop TAS Başlat/Durdur - + Toggle Filter Bar Filtre Çubuğunu Aç/Kapa - + Toggle Framerate Limit FPS Limitini Aç/Kapa - + Toggle Mouse Panning Mouse ile Kaydırmayı Aç/Kapa - + Toggle Renderdoc Capture - + Toggle Status Bar Durum Çubuğunu Aç/Kapa @@ -7488,22 +7565,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Lütfen yüklemek istediğiniz dosyaların bu dosyalar olduğunu doğrulayın. - + Installing an Update or DLC will overwrite the previously installed one. Bir Güncelleme ya da DLC yüklemek daha önce yüklenmiş olanların üstüne yazacaktır. - + Install Kur - + Install Files to NAND NAND'e Dosya Kur @@ -7511,7 +7588,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 Yazı bu karakterleri içeremez: @@ -7658,152 +7735,207 @@ Debug Message: &Son kullanılan Dosyalar - + + Open &Eden Folders + + + + &Emulation &Emülasyon - + &View &Görünüm - + &Reset Window Size &Pencere Boyutunu Sıfırla - + &Debugging &Hata Ayıklama - + Reset Window Size to &720p Pencere Boyutunu &720p'ye Sıfırla - + Reset Window Size to 720p Pencere Boyutunu 720p'ye Sıfırla - + Reset Window Size to &900p Pencere Boyutunu &900p'ye Sıfırla - + Reset Window Size to 900p Pencere Boyutunu 900p'ye Sıfırla - + Reset Window Size to &1080p Pencere Boyutunu &1080p'ye Sıfırla - + Reset Window Size to 1080p Pencere Boyutunu 1080p'ye Sıfırla - + &Multiplayer &Çok Oyunculu - + &Tools &Aletler - + &Amiibo &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Yardım - + &Install Files to NAND... &NAND'e Dosya Kur... - + L&oad File... &Dosyayı Yükle... - + Load &Folder... &Klasörü Yükle... - + E&xit &Çıkış - + &Pause &Duraklat - + &Stop Du&rdur - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7812,97 +7944,97 @@ Debug Message: &Yuzu Hakkında - + Single &Window Mode &Tek Pencere Modu - + Con&figure... &Yapılandır... - + Ctrl+, - + Display D&ock Widget Headers D&ock Widget Başlıkları'nı Göster - + Show &Filter Bar &Filtre Çubuğu'nu Göster - + Show &Status Bar &Durum Çubuğu'nu Göster - + Show Status Bar Durum Çubuğunu Göster - + &Browse Public Game Lobby &Herkese Açık Oyun Lobilerine Göz At - + &Create Room &Oda Oluştur - + &Leave Room &Odadan Ayrıl - + &Direct Connect to Room &Odaya Direkt Bağlan - + &Show Current Room &Şu Anki Odayı Göster - + F&ullscreen &Tam Ekran - + &Restart &Yeniden Başlat - + Load/Remove &Amiibo... &Amiibo Yükle/Kaldır - + &Report Compatibility &Uyumluluk Bildir - + Open &Mods Page &Mod Sayfasını Aç - + Open &Quickstart Guide &Hızlı Başlangıç Kılavuzunu Aç - + &FAQ &SSS @@ -7911,77 +8043,82 @@ Debug Message: &yuzu Klasörünü Aç - + &Capture Screenshot &Ekran Görüntüsü Al - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... &TAS'i Ayarla... - + Configure C&urrent Game... &Geçerli Oyunu Yapılandır... - + &Start B&aşlat - + &Reset &Sıfırla - + R&ecord K&aydet - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7989,26 +8126,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8068,37 +8215,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Anlık bağlantı durumu - + Not Connected. Click here to find a room! Bağlantı Yok. Oda bulmak için buraya basın! - + Not Connected Bağlantı Yok - + Connected Bağlandı - + New Messages Received Yeni Mesaj Alındı - + Error Hata - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Oda bilgisi güncellenemedi. Lütfen İnternet bağlantınızı kontrol edin ve yeniden bir oda açmayı deneyin. @@ -8290,56 +8437,56 @@ p, li { white-space: pre-wrap; } Şu anda oyun oynamıyor - + Installed SD Titles Yüklenmiş SD Oyunları - + Installed NAND Titles Yüklenmiş NAND Oyunları - + System Titles Sistemde Yüklü Oyunlar - + Add New Game Directory Yeni Oyun Konumu Ekle - + Favorites Favoriler - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [belirlenmedi] @@ -8350,14 +8497,14 @@ p, li { white-space: pre-wrap; } Hat %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Eksen %1%2 @@ -8368,357 +8515,357 @@ p, li { white-space: pre-wrap; } Tuş %1 - - - - - - + + + + + + [unknown] [bilinmeyen] - - - + + + Left Sol - - - + + + Right Sağ - - - + + + Down Aşağı - - - + + + Up Yukarı - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Yuvarlak - - + + Cross Çarpı - - + + Square Kare - - + + Triangle Üçgen - - + + Share Share - - + + Options Options - - + + [undefined] [belirsiz] - + %1%2 %1%2 - - + + [invalid] [geçersiz] - - + + %1%2Hat %3 %1%2Hat %3 - - - + + + %1%2Axis %3 %1%2Eksen %3 - - + + %1%2Axis %3,%4,%5 %1%2Eksen %3,%4,%5 - - + + %1%2Motion %3 %1%2Hareket %3 - - + + %1%2Button %3 %1%2Tuş %3 - - + + [unused] [kullanılmayan] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L L Çubuğu - + Stick R R Çubuğu - + Plus Artı - + Minus Eksi - - + + Home Home - + Capture Kaydet - + Touch Dokunmatik - + Wheel Indicates the mouse wheel Fare Tekerleği - + Backward Geri - + Forward İleri - + Task Görev - + Extra Ekstra - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Hat %4 - - + + %1%2%3Axis %4 - - + + %1%2%3Button %4 %1%2%3Tuş %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8836,6 +8983,298 @@ p, li { white-space: pre-wrap; } Bu amiibo'yu geri yüklemek istediğinize emin misiniz? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + İşlem başarıyla tamamlandı. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + İçerik Kaldırma Hatası + + + + Error Removing Update + Güncelleme Kaldırma hatası + + + + Error Removing DLC + DLC Kaldırma Hatası + + + + The base game is not installed in the NAND and cannot be removed. + Asıl oyun NAND'de kurulu değil ve kaldırılamaz. + + + + There is no update installed for this title. + Bu oyun için yüklenmiş bir güncelleme yok. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Başarıyla Kaldırıldı + + + + Successfully removed %1 installed DLC. + %1 yüklenmiş DLC başarıyla kaldırıldı. + + + + + Error Removing Transferable Shader Cache + Transfer Edilebilir Shader Cache Kaldırılırken Bir Hata Oluştu + + + + + A shader cache for this title does not exist. + Bu oyun için oluşturulmuş bir shader cache yok. + + + + Successfully removed the transferable shader cache. + Transfer edilebilir shader cache başarıyla kaldırıldı. + + + + Failed to remove the transferable shader cache. + Transfer edilebilir shader cache kaldırılamadı. + + + + Error Removing Vulkan Driver Pipeline Cache + Vulkan Pipeline Önbelleği Kaldırılırken Hata + + + + Failed to remove the driver pipeline cache. + Sürücü pipeline önbelleği kaldırılamadı. + + + + + Error Removing Transferable Shader Caches + Transfer Edilebilir Shader Cache'ler Kaldırılırken Bir Hata Oluştu + + + + Successfully removed the transferable shader caches. + Transfer edilebilir shader cacheler başarıyla kaldırıldı. + + + + Failed to remove the transferable shader cache directory. + Transfer edilebilir shader cache konumu kaldırılamadı. + + + + + Error Removing Custom Configuration + Oyuna Özel Yapılandırma Kaldırılırken Bir Hata Oluştu. + + + + A custom configuration for this title does not exist. + Bu oyun için bir özel yapılandırma yok. + + + + Successfully removed the custom game configuration. + Oyuna özel yapılandırma başarıyla kaldırıldı. + + + + Failed to remove the custom game configuration. + Oyuna özel yapılandırma kaldırılamadı. + + + + Reset Metadata Cache + Üstveri Cache'ini Sıfırla + + + + The metadata cache is already empty. + Metadata Cache'i zaten boş. + + + + The operation completed successfully. + İşlem başarıyla tamamlandı. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Metadata Cache'i silinemedi. Kullanımda ya da oluşturulmamış olabilir. + + + + Create Shortcut + Kısayol Oluştur + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + %1 dizinine kısayol oluşturuldu + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Bu seçenek, şu anki AppImage dosyasının kısayolunu oluşturacak. Uygulama güncellenirse kısayol çalışmayabilir. Devam edilsin mi? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Simge Oluştur + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Simge dosyası oluşturulamadı. "%1" dizini yok ve oluşturulamıyor. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9131,7 +9570,7 @@ Lütfen tekrar deneyin ya da yazılımın geliştiricisiyle iletişime geçin. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9139,7 +9578,7 @@ Lütfen tekrar deneyin ya da yazılımın geliştiricisiyle iletişime geçin. - + Users Kullanıcılar @@ -9263,7 +9702,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Çağrı yığını @@ -9271,12 +9710,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread hiçbir thread beklemedi @@ -9284,102 +9723,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable çalışabilir - + paused duraklatıldı - + sleeping uyuyor - + waiting for IPC reply IPC cevabı bekleniyor - + waiting for objects objeler bekleniyor - + waiting for condition variable koşul değişkeni bekleniyor - + waiting for address arbiter adres belirleyici bekleniyor - + waiting for suspend resume askıdaki işlemin sürdürülmesi bekleniyor - + waiting bekleniyor - + initialized başlatıldı - + terminated sonlandırıldı - + unknown bilinmeyen - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 çekirdek %1 - + processor = %1 işlemci = %1 - + affinity mask = %1 affinity mask = %1 - + thread id = %1 izlek id: %1 - + priority = %1(current) / %2(normal) öncelik = %1(geçerli) / %2(normal) - + last running ticks = %1 son çalışan tickler = %1 @@ -9387,7 +9826,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread izlek bekledi @@ -9395,7 +9834,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 528d191c5f..085e456985 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Зв'язок із сервером... - + Cancel Скасувати - + Touch the top left corner <br>of your touchpad. Торкніться верхнього лівого кута <br> вашого тачпаду. - + Now touch the bottom right corner <br>of your touchpad. Тепер торкніться правого нижнього кута <br> вашого тачпаду. - + Configuration completed! Налаштування завершено! - + OK ОК @@ -397,439 +397,152 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Помилка - - Net connect - - - - - Player select - - - - - Software keyboard - - - - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Рушій виводу: - + Output Device: Пристрій відтворення: - + Input Device: Пристрій вводу: - - Mute audio - - - - + Volume: Гучність - + Mute audio when in background Приглушити звук у фоновому режимі - + Multicore CPU Emulation Багатоядерна емуляція ЦП - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Обмеження відсотка швидкості - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Точність: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Не використовувати FMA (покращує продуктивність на ЦП без FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Прискорені FRSQRTE та FRECPE - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Швидші інструкції ASIMD (лише 32 біт) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Неправильна обробка NaN - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Вимкнути перевірку адресного простору - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Ігнорувати глобальний моніторинг - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Пристрій: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Бекенд шейдерів: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Роздільна здатність: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Фільтр адаптації вікна: - + FSR Sharpness: Різкість FSR: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Метод згладжування: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Повноекранний режим: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Співвідношення сторін: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Використовувати кеш конвеєра на диску - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Використовувати асинхронну емуляцію ГП - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Емуляція NVDEC: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Режим верт. синхронізації: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +553,34 @@ Mailbox може мати меншу затримку, ніж FIFO, і не ма Моментальний (без синхронізації) просто показує всі кадри і може мати розриви. - + Enable asynchronous presentation (Vulkan only) Увімкнути асинхронну презентацію (Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Примусово змусити максимальну тактову частоту (тільки для Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Виконує роботу у фоновому режимі в очікуванні графічних команд, не даючи змоги ГП знижувати тактову частоту. - + Anisotropic Filtering: Анізотропна фільтрація: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Рівень точності: + Рівень точності: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Використовувати асинхронну побудову шейдерів (хак) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Увімкнути Fast GPU Time (хак) @@ -905,1021 +590,1433 @@ This feature is experimental. Вмикає функцію Fast GPU Time. Цей параметр змусить більшість ігор працювати в максимальній рідній роздільній здатності. - + Use Vulkan pipeline cache Використовувати конвеєрний кеш Vulkan - + + Enable Reactive Flushing + Увімкнути реактивне очищення + + + + RNG Seed + Сід RNG + + + + Device Name + Назва пристрою + + + + Note: this can be overridden when region setting is auto-select + Примітка: може бути перезаписано якщо регіон вибирається автоматично + + + + Region: + Регіон: + + + + Time Zone: + Часовий пояс: + + + + Sound Output Mode: + Режим відстворення звуку: + + + + Prompt for user on game boot + Запитувати користувача під час запуску гри + + + + Pause emulation when in background + Призупиняти емуляцію у фоновому режимі + + + + Hide mouse on inactivity + Приховування миші при бездіяльності + + + + CPU + ЦП + + + + Uncompressed (Best quality) + Без стиснення (Найкраща якість) + + + + BC1 (Low quality) + ВС1 (Низька якість) + + + + BC3 (Medium quality) + ВС3 (Середня якість) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (асемблерні шейдери, лише для NVIDIA) + + + + Normal + Нормальна + + + + High + Висока + + + + Extreme + Екстрим + + + + Auto + Авто + + + + Accurate + Точно + + + + Unsafe + Небезпечно + + + + Paranoid (disables most optimizations) + Параноїк (відключає більшість оптимізацій) + + + + Borderless Windowed + Вікно без рамок + + + + Exclusive Fullscreen + Ексклюзивний повноекранний + + + + No Video Output + Відсутність відеовиходу + + + + CPU Video Decoding + Декодування відео на ЦП + + + + GPU Video Decoding (Default) + Декодування відео на ГП (за замовчуванням) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНЕ] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Найближчий сусід + + + + Bilinear + Білінійне + + + + Bicubic + Бікубічне + + + + Gaussian + Гауса + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Вимкнено + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + За замовчуванням (16:9) + + + + Force 4:3 + Змусити 4:3 + + + + Force 21:9 + Змусити 21:9 + + + + Force 16:10 + Змусити 16:10 + + + + Stretch to Window + Розтягнути до вікна + + + + Automatic + Автоматично + + + + + Default + За замовчуванням + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Software keyboard + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - Увімкнути реактивне очищення - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - - RNG Seed - Сід RNG + + RAII + - + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Назва пристрою - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Примітка: може бути перезаписано якщо регіон вибирається автоматично - - - - Region: - Регіон: - - - + The region of the emulated Switch. - - Time Zone: - Часовий пояс: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Режим відстворення звуку: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Запитувати користувача під час запуску гри - - - - Pause emulation when in background - Призупиняти емуляцію у фоновому режимі - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Приховування миші при бездіяльності - - - + This setting hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - ЦП - - - + GPU - + CPU Asynchronous - - Uncompressed (Best quality) - Без стиснення (Найкраща якість) - - - - BC1 (Low quality) - ВС1 (Низька якість) - - - - BC3 (Medium quality) - ВС3 (Середня якість) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (асемблерні шейдери, лише для NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Нормальна + + Unsafe (fast) + - - High - Висока + + Safe (stable) + - - Extreme - Екстрим - - - - Auto - Авто - - - - Accurate - Точно - - - - Unsafe - Небезпечно - - - - Paranoid (disables most optimizations) - Параноїк (відключає більшість оптимізацій) - - - + Dynarmic - + NCE - - Borderless Windowed - Вікно без рамок - - - - Exclusive Fullscreen - Ексклюзивний повноекранний - - - - No Video Output - Відсутність відеовиходу - - - - CPU Video Decoding - Декодування відео на ЦП - - - - GPU Video Decoding (Default) - Декодування відео на ГП (за замовчуванням) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНЕ] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Найближчий сусід - - - - Bilinear - Білінійне - - - - Bicubic - Бікубічне - - - - Gaussian - Гауса - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Вимкнено - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - За замовчуванням (16:9) - - - - Force 4:3 - Змусити 4:3 - - - - Force 21:9 - Змусити 21:9 - - - - Force 16:10 - Змусити 16:10 - - - - Stretch to Window - Розтягнути до вікна - - - - Automatic - Автоматично - - - - Default - За замовчуванням - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Голландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - - + + Serbian (српски) + + + + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone За замовчуванням (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Ейре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулуси - + Mono Моно - + Stereo Стерео - + Surround Об'ємний звук - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked У док-станції - + Handheld Портативний - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2271,27 +2368,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Журналювання - + Open Log Location Відкрити папку для журналів - + Global Log Filter Глобальний фільтр журналів - + When checked, the max size of the log increases from 100 MB to 1 GB Якщо увімкнено, максимальний розмір журналу збільшується зі 100 МБ до 1 ГБ - + Enable Extended Logging** Увімкнути розширене ведення журналу** - + Show Log in Console Показувати журнал у консолі @@ -2437,7 +2534,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2499,7 +2596,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Це буде автоматично скинуто після закриття yuzu. - + Web applet not compiled Веб-аплет не скомпільовано @@ -2549,7 +2646,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2558,88 +2655,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Деякі налаштування доступні тільки тоді, коли гру не запущено. - + Applets - - + + Audio Аудіо - - + + CPU ЦП - + Debug Налагодження - + Filesystem Файлова система - - + + General Загальні - - + + Graphics Графіка - + GraphicsAdvanced ГрафікаРозширені - + GraphicsExtensions - + Hotkeys Гарячі клавіші - - + + Controls Керування - + Profiles Профілі - + Network Мережа - - + + System Система - + Game List Список ігор - + Web Мережа @@ -2737,51 +2834,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Скинути кеш метаданих - + Select Emulated NAND Directory... Виберіть папку для емульованого NAND... - + Select Emulated SD Directory... Виберіть папку для емульованого SD... - + Select Gamecard Path... Оберіть папку для картриджів... - + Select Dump Directory... Оберіть папку для дампів... - + Select Mod Load Directory... Оберіть папку для модів... - The metadata cache is already empty. - Кеш метаданих вже порожній. + Кеш метаданих вже порожній. - The operation completed successfully. - Операція завершилася успішно. + Операція завершилася успішно. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Кеш метаданих не можна видалити. Можливо, він використовується або відсутній. + Кеш метаданих не можна видалити. Можливо, він використовується або відсутній. @@ -2812,12 +2903,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Це скине всі налаштування і видалить усі конфігурації під окремі ігри. При цьому не будуть видалені шляхи до ігор, профілів або профілів вводу. Продовжити? @@ -2850,33 +2941,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Фоновий колір: - + % FSR sharpening percentage (e.g. 50%) % - + Off Вимкнено - + VSync Off Верт. синхронізацію вимкнено - + Recommended Рекомендовано - + On Увімкнено - + VSync On Верт. синхронізація увімкнена @@ -2913,14 +3004,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2952,75 +3047,75 @@ These settings are experimental, and may cause black screens. If your games fail Відновити значення за замовчуванням. - + Action Дія - + Hotkey Гаряча клавіша - + Controller Hotkey Гаряча клавіша контролера - - - + + + Conflicting Key Sequence Конфліктуюча комбінація клавіш - - + + The entered key sequence is already assigned to: %1 Введена комбінація вже призначена до: %1 - + [waiting] [очікування] - + Invalid Неприпустимо - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Відновити значення за замовчуванням - + Clear Очистити - + Conflicting Button Sequence Конфліктуюче поєднання кнопок - + The default button sequence is already assigned to: %1 Типова комбінація кнопок вже призначена до: %1 - + The default key sequence is already assigned to: %1 Типова комбінація клавіш вже призначена до: %1 @@ -3340,7 +3435,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3495,7 +3590,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Лівий міні-джойстик @@ -3605,14 +3700,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3631,7 +3726,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Плюс @@ -3644,15 +3739,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3697,7 +3792,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Правий міні-джойстик @@ -3712,242 +3807,242 @@ These settings are experimental, and may cause black screens. If your games fail Налаштувати - - - - + + + + Clear Очистити - - - - - + + + + + [not set] [не задано] - - - + + + Invert button Інвертувати кнопку - - + + Toggle button Переключити кнопку - + Turbo button Турбо кнопка - - + + Invert axis Інвертувати осі - - - + + + Set threshold Встановити поріг - - + + Choose a value between 0% and 100% Оберіть значення між 0% і 100% - + Toggle axis Переключити осі - + Set gyro threshold Встановити поріг гіроскопа - + Calibrate sensor Калібрувати сенсор - + Map Analog Stick Задати аналоговий міні-джойстик - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Після натискання на ОК, рухайте ваш міні-джойстик горизонтально, а потім вертикально. Щоб інвертувати осі, спочатку рухайте ваш міні-джойстик вертикально, а потім горизонтально. - + Center axis Центрувати осі - - + + Deadzone: %1% Мертва зона: %1% - - + + Modifier Range: %1% Діапазон модифікатора: %1% - - + + Pro Controller Контролер Pro - + Dual Joycons Подвійні Joy-Con'и - + Left Joycon Лівий Joy-Con - + Right Joycon Правий Joy-Con - + Handheld Портативний - + GameCube Controller Контролер GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Контролер NES - + SNES Controller Контролер SNES - + N64 Controller Контролер N64 - + Sega Genesis Sega Genesis - + Start / Pause Старт / Пауза - + Z Z - + Control Stick Міні-джойстик керування - + C-Stick C-Джойстик - + Shake! Потрусіть! - + [waiting] [очікування] - + New Profile Новий профіль - + Enter a profile name: Введіть ім'я профілю: - - + + Create Input Profile Створити профіль контролю - + The given profile name is not valid! Задане ім'я профілю недійсне! - + Failed to create the input profile "%1" Не вдалося створити профіль контролю "%1" - + Delete Input Profile Видалити профіль контролю - + Failed to delete the input profile "%1" Не вдалося видалити профіль контролю "%1" - + Load Input Profile Завантажити профіль контролю - + Failed to load the input profile "%1" Не вдалося завантажити профіль контролю "%1" - + Save Input Profile Зберегти профіль контролю - + Failed to save the input profile "%1" Не вдалося зберегти профіль контролю "%1" @@ -4004,7 +4099,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure Налаштувати @@ -4040,7 +4135,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test Тест @@ -4059,7 +4154,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Дізнатися більше</span></a> - + %1:%2 %1:%2 @@ -4068,77 +4163,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Номер порту містить неприпустимі символи - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Порт повинен бути в районі від 0 до 65353 - + IP address is not valid IP-адреса недійсна - + This UDP server already exists Цей UDP сервер уже існує - + Unable to add more than 8 servers Неможливо додати більше 8 серверів - + Testing Тестування - + Configuring Налаштування - + Test Successful Тест успішний - + Successfully received data from the server. Успішно отримано інформацію із сервера - + Test Failed Тест провалено - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Не вдалося отримати дійсні дані з сервера.<br>Переконайтеся, що сервер правильно налаштований, а також перевірте адресу та порт. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Тест UDP або калібрація в процесі.<br>Будь ласка, зачекайте завершення. @@ -4265,7 +4360,12 @@ Current values are %1% and %2% respectively. Інтерфейс мережі - + + Enable Airplane Mode + + + + None Нічого @@ -4323,52 +4423,52 @@ Current values are %1% and %2% respectively. Деякі налаштування доступні тільки тоді, коли гру не запущено. - + Add-Ons Доповнення - + System Система - + CPU ЦП - + Graphics Графіка - + Adv. Graphics Розш. Графіка - + GPU Extensions - + Audio Аудіо - + Input Profiles Профілі вводу - + Linux - + Properties Властивості @@ -4386,12 +4486,12 @@ Current values are %1% and %2% respectively. Доповнення - + Patch Name Назва патчу - + Version Версія @@ -4429,27 +4529,32 @@ Current values are %1% and %2% respectively. Обрати зображення - + + Select Avatar + + + + Add Додати - + Rename Перейменувати - + Remove Видалити - + Profile management is available only when game is not running. Керування профілями недоступне, поки запущена гра. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4457,100 +4562,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username Введіть ім'я користувача - + Users Користувачі - + Enter a username for the new user: Введіть ім'я користувача для нового профілю: - + Enter a new username: Введіть нове ім'я користувача: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Оберіть зображення користувача - - JPEG Images (*.jpg *.jpeg) - Зображення JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Зображення JPEG (*.jpg *.jpeg) + + + Error deleting image Помилка під час видалення зображення - + Error occurred attempting to overwrite previous image at: %1. Помилка під час спроби перезапису попереднього зображення в: %1. - + Error deleting file Помилка під час видалення файлу - + Unable to delete existing file: %1. Не вдалося видалити наявний файл: %1. - + Error creating user image directory Помилка під час створення папки користувацьких зображень - + Unable to create directory %1 for storing user images. Не вийшло створити папку %1 для зберігання зображень користувача. - Error copying user image - Помилка під час копіювання зображення користувача + Помилка під час копіювання зображення користувача - Unable to copy image from %1 to %2 - Не вийшло скопіювати зображення з %1 у %2 + Не вийшло скопіювати зображення з %1 у %2 - Error resizing user image - Помилка під час зміни розміру зображення користувача + Помилка під час зміни розміру зображення користувача - Unable to resize image - Неможливо змінити розмір зображення + Неможливо змінити розмір зображення + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Скасувати + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Видалити цього користувача? Усі збережені дані користувача буде видалено. - + Confirm Delete Підтвердити видалення - + Name: %1 UUID: %2 Ім'я: %1 @@ -4603,7 +4797,7 @@ UUID: %2 - + Enable Увімкнути @@ -4614,7 +4808,7 @@ UUID: %2 - + Not connected Не під'єднано @@ -4624,63 +4818,63 @@ UUID: %2 За замовчуванням - + Clear Очистити - + [not set] [не задано] - + Invert axis Інвертувати осі - - + + Deadzone: %1% Мертва зона: %1% - + Error enabling ring input Помилка під час увімкнення введення кільця - + Direct Joycon driver is not enabled Прямий драйвер Joycon не активний - + Configuring Налаштування - + The current mapped device doesn't support the ring controller Поточний вибраний пристрій не підтримує контролер Ring - + The current mapped device doesn't have a ring attached До поточного пристрою не прикріплено кільце - + The current mapped device is not connected Поточний пристрій не під'єднано - + Unexpected driver result %1 Несподіваний результат драйвера %1 - + [waiting] [очікування] @@ -4722,7 +4916,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4774,12 +4968,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Налаштування TAS - + Select TAS Load Directory... Обрати папку завантаження TAS... @@ -4889,7 +5083,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5209,6 +5403,16 @@ Drag points to change position, or double-click table cells to edit values.Web Мережа + + + Eden Web Service + + + + + Generate + + yuzu Web Service Веб-сервіс yuzu @@ -5218,42 +5422,29 @@ Drag points to change position, or double-click table cells to edit values.Надаючи своє ім'я користувача і токен, ви погоджуєтеся дозволити yuzu збирати додаткові дані про використання, які можуть включати інформацію, що ідентифікує користувача. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Підтвердити + Підтвердити - Sign up - Реєстрація + Реєстрація - + Token: Токен: - + Username: Ім'я користувача: - What is my token? - Що таке токен і де його знайти? + Що таке токен і де його знайти? - + Web Service configuration can only be changed when a public room isn't being hosted. Налаштування веб-служби можуть бути змінені тільки в тому випадку, коли не хоститься публічна кімната. @@ -5278,12 +5469,12 @@ Drag points to change position, or double-click table cells to edit values.Перегенерувати - + Discord Presence Discord Presence - + Show Current Game in your Discord Status Показувати поточну гру у вашому статусі Discord @@ -5292,24 +5483,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Дізнатися більше</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Реєстрація</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Реєстрація</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5332,10 +5507,9 @@ Drag points to change position, or double-click table cells to edit values.Токен не було підтверджено. Зміну вашого токена не було збережено. - Unverified, please click Verify before saving configuration Tooltip - Не підтверджено, будь ласка, натисніть кнопку Підтвердити, перш ніж зберігати конфігурацію. + Не підтверджено, будь ласка, натисніть кнопку Підтвердити, перш ніж зберігати конфігурацію. Verifying... @@ -5359,20 +5533,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Підтверждення не було успішним. Переконайтеся, що ви правильно ввели свій токен і що ваше інтернет-з'єднання працює. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Контролер P1 - + &Controller P1 [&C] Контролер P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Версія + + DirectConnect @@ -5478,7 +5699,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5486,11 +5712,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. Хост кімнати заблокував вас. Поговоріть із хостом, щоб він розблокував вас, або спробуйте іншу кімнату. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5552,7 +5773,7 @@ Please go to Configure -> System -> Network and make a selection. Телеметрія - + Broken Vulkan Installation Detected Виявлено пошкоджену інсталяцію Vulkan @@ -5561,106 +5782,105 @@ Please go to Configure -> System -> Network and make a selection. Не вдалося виконати ініціалізацію Vulkan під час завантаження.<br><br>Натисніть <a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>тут для отримання інструкцій щодо усунення проблеми</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущено гру - + Loading Web Applet... Завантаження веб-аплета... - - + + Disable Web Applet Вимкнути веб-аплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Вимкнення веб-апплета може призвести до несподіваної поведінки, і його слід вимикати лише заради Super Mario 3D All-Stars. Ви впевнені, що хочете вимкнути веб-апплет? (Його можна знову ввімкнути в налаштуваннях налагодження.) - + The amount of shaders currently being built Кількість створюваних шейдерів на цей момент - + The current selected resolution scaling multiplier. Поточний обраний множник масштабування роздільної здатності. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Поточна швидкість емуляції. Значення вище або нижче 100% вказують на те, що емуляція йде швидше або повільніше, ніж на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Кількість кадрів на секунду в цей момент. Значення буде змінюватися між іграми та сценами. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Час, який потрібен для емуляції 1 кадру Switch, не беручи до уваги обмеження FPS або вертикальну синхронізацію. Для емуляції в повній швидкості значення має бути не більше 16,67 мс. - + Unmute Увімкнути звук - + Mute Вимкнути звук - + Reset Volume Скинути гучність - + &Clear Recent Files [&C] Очистити нещодавні файли - + &Continue [&C] Продовжити - + &Pause [&P] Пауза - Warning Outdated Game Format - Попередження застарілий формат гри + Попередження застарілий формат гри You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Для цієї гри ви використовуєте розархівований формат ROM'а, який є застарілим і був замінений іншими, такими як NCA, NAX, XCI або NSP. У розархівованих каталогах ROM'а відсутні іконки, метадані та підтримка оновлень. <br><br>Для отримання інформації про різні формати Switch, підтримувані yuzu, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>перегляньте нашу вікі</a>. Це повідомлення більше не буде відображатися. - - + + Error while loading ROM! Помилка під час завантаження ROM! - + The ROM format is not supported. Формат ROM'а не підтримується. - + An error occurred initializing the video core. Сталася помилка під час ініціалізації відеоядра. @@ -5669,7 +5889,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu зіткнувся з помилкою під час запуску відеоядра. Зазвичай це спричинено застарілими драйверами ГП, включно з інтегрованими. Перевірте журнал для отримання більш детальної інформації. Додаткову інформацію про доступ до журналу дивіться на наступній сторінці: <a href='https://yuzu-emu.org/help/reference/log-files/'>Як завантажити файл журналу</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Помилка під час завантаження ROM'а! %1 @@ -5680,1041 +5900,887 @@ Please go to Configure -> System -> Network and make a selection. %1<br>Будь ласка, дотримуйтесь <a href='https://yuzu-emu.org/help/quickstart/'>короткого керівництва користувача yuzu</a> щоб пере-дампити ваші файли<br>Ви можете звернутися до вікі yuzu</a> або Discord yuzu</a> для допомоги - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Сталася невідома помилка. Будь ласка, перевірте журнал для подробиць. - + (64-bit) (64-бітний) - + (32-bit) (32-бітний) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закриваємо програму... - + Save Data Збереження - + Mod Data Дані модів - + Error Opening %1 Folder Помилка під час відкриття папки %1 - - + + Folder does not exist! Папка не існує! - Error Opening Transferable Shader Cache - Помилка під час відкриття переносного кешу шейдерів + Помилка під час відкриття переносного кешу шейдерів - Failed to create the shader cache directory for this title. - Не вдалося створити папку кешу шейдерів для цієї гри. + Не вдалося створити папку кешу шейдерів для цієї гри. - Error Removing Contents - Помилка під час видалення вмісту + Помилка під час видалення вмісту - Error Removing Update - Помилка під час видалення оновлень + Помилка під час видалення оновлень - Error Removing DLC - Помилка під час видалення DLC + Помилка під час видалення DLC - + Remove Installed Game Contents? Видалити встановлений вміст ігор? - + Remove Installed Game Update? Видалити встановлені оновлення гри? - + Remove Installed Game DLC? Видалити встановлені DLC гри? - + Remove Entry Видалити запис - - - - - - Successfully Removed - Успішно видалено + Успішно видалено - Successfully removed the installed base game. - Встановлену гру успішно видалено. + Встановлену гру успішно видалено. - The base game is not installed in the NAND and cannot be removed. - Гру не встановлено в NAND і не може буде видалено. + Гру не встановлено в NAND і не може буде видалено. - Successfully removed the installed update. - Встановлене оновлення успішно видалено. + Встановлене оновлення успішно видалено. - There is no update installed for this title. - Для цієї гри не було встановлено оновлення. + Для цієї гри не було встановлено оновлення. - There are no DLC installed for this title. - Для цієї гри не було встановлено DLC. + Для цієї гри не було встановлено DLC. - Successfully removed %1 installed DLC. - Встановлений DLC %1 було успішно видалено + Встановлений DLC %1 було успішно видалено - + Delete OpenGL Transferable Shader Cache? Видалити переносний кеш шейдерів OpenGL? - + Delete Vulkan Transferable Shader Cache? Видалити переносний кеш шейдерів Vulkan? - + Delete All Transferable Shader Caches? Видалити весь переносний кеш шейдерів? - + Remove Custom Game Configuration? Видалити користувацьке налаштування гри? - + Remove Cache Storage? Видалити кеш-сховище? - + Remove File Видалити файл - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Помилка під час видалення переносного кешу шейдерів + Помилка під час видалення переносного кешу шейдерів - - A shader cache for this title does not exist. - Кеш шейдерів для цієї гри не існує. + Кеш шейдерів для цієї гри не існує. - Successfully removed the transferable shader cache. - Переносний кеш шейдерів успішно видалено. + Переносний кеш шейдерів успішно видалено. - Failed to remove the transferable shader cache. - Не вдалося видалити переносний кеш шейдерів. + Не вдалося видалити переносний кеш шейдерів. - Error Removing Vulkan Driver Pipeline Cache - Помилка під час видалення конвеєрного кешу Vulkan + Помилка під час видалення конвеєрного кешу Vulkan - Failed to remove the driver pipeline cache. - Не вдалося видалити конвеєрний кеш шейдерів. + Не вдалося видалити конвеєрний кеш шейдерів. - - Error Removing Transferable Shader Caches - Помилка під час видалення переносного кешу шейдерів + Помилка під час видалення переносного кешу шейдерів - Successfully removed the transferable shader caches. - Переносний кеш шейдерів успішно видалено. + Переносний кеш шейдерів успішно видалено. - Failed to remove the transferable shader cache directory. - Помилка під час видалення папки переносного кешу шейдерів. + Помилка під час видалення папки переносного кешу шейдерів. - - Error Removing Custom Configuration - Помилка під час видалення користувацького налаштування + Помилка під час видалення користувацького налаштування - A custom configuration for this title does not exist. - Користувацьких налаштувань для цієї гри не існує. + Користувацьких налаштувань для цієї гри не існує. - Successfully removed the custom game configuration. - Користувацьке налаштування гри успішно видалено. + Користувацьке налаштування гри успішно видалено. - Failed to remove the custom game configuration. - Не вдалося видалити користувацьке налаштування гри. + Не вдалося видалити користувацьке налаштування гри. - - + + RomFS Extraction Failed! Не вдалося вилучити RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Сталася помилка під час копіювання файлів RomFS або користувач скасував операцію. - + Full Повний - + Skeleton Скелет - + Select RomFS Dump Mode Виберіть режим дампа RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Будь ласка, виберіть, як ви хочете виконати дамп RomFS <br>Повний скопіює всі файли в нову папку, тоді як <br>скелет створить лише структуру папок. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root В %1 недостатньо вільного місця для вилучення RomFS. Будь ласка, звільніть місце або виберіть іншу папку для дампа в Емуляція > Налаштування > Система > Файлова система > Корінь дампа - + Extracting RomFS... Вилучення RomFS... - - - - - + + Cancel Скасувати - + RomFS Extraction Succeeded! Вилучення RomFS пройшло успішно! - - - + The operation completed successfully. Операція завершилася успішно. - - Integrity verification couldn't be performed! - - - - - File contents were not checked for validity. - - - - - - Verifying integrity... - - - - - - Integrity verification succeeded! - - - - - - Integrity verification failed! - - - - - File contents may be corrupt. - - - - - - - Create Shortcut - Створити ярлик + Створити ярлик - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Успішно створено ярлик у %1 + Успішно створено ярлик у %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Це створить ярлик для поточного AppImage. Він може не працювати після оновлень. Продовжити? + Це створить ярлик для поточного AppImage. Він може не працювати після оновлень. Продовжити? - - Failed to create a shortcut to %1 + Create Icon + Створити іконку + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Неможливо створити файл іконки. Шлях "%1" не існує і не може бути створений. + + + + Warning: Outdated Game Format - - Create Icon - Створити іконку + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Неможливо створити файл іконки. Шлях "%1" не існує і не може бути створений. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Помилка відкриття %1 - + Select Directory Обрати папку - + Properties Властивості - + The game properties could not be loaded. Не вдалося завантажити властивості гри. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Виконуваний файл Switch (%1);;Усі файли (*.*) - + Load File Завантажити файл - + Open Extracted ROM Directory Відкрити папку вилученого ROM'а - + Invalid Directory Selected Вибрано неприпустиму папку - + The directory you have selected does not contain a 'main' file. Папка, яку ви вибрали, не містить файлу 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Встановлюваний файл Switch (*.nca, *.nsp, *.xci);;Архів контенту Nintendo (*.nca);;Пакет подачі Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Встановити файли - + %n file(s) remaining Залишився %n файл Залишилося %n файл(ів) - Залишилося %n файл(ів) - + Installing file "%1"... Встановлення файлу "%1"... - - + + Install Results Результати встановлення - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Щоб уникнути можливих конфліктів, ми не рекомендуємо користувачам встановлювати ігри в NAND. Будь ласка, використовуйте цю функцію тільки для встановлення оновлень і завантажуваного контенту. - + %n file(s) were newly installed %n файл було нещодавно встановлено %n файл(ів) було нещодавно встановлено - - %n файл(ів) було нещодавно встановлено - + %n file(s) were overwritten %n файл було перезаписано %n файл(ів) було перезаписано - - %n файл(ів) було перезаписано - + %n file(s) failed to install %n файл не вдалося встановити %n файл(ів) не вдалося встановити - - %n файл(ів) не вдалося встановити - + System Application Системний додаток - + System Archive Системний архів - + System Application Update Оновлення системного додатку - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Гра - + Game Update Оновлення гри - + Game DLC DLC до гри - + Delta Title Дельта-титул - + Select NCA Install Type... Виберіть тип установки NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Будь ласка, виберіть тип додатку, який ви хочете встановити для цього NCA: (У більшості випадків, підходить стандартний вибір "Гра".) - + Failed to Install Помилка встановлення - + The title type you selected for the NCA is invalid. Тип додатку, який ви вибрали для NCA, недійсний. - + File not found Файл не знайдено - + File "%1" not found Файл "%1" не знайдено - + OK ОК - - + + Hardware requirements not met Не задоволені системні вимоги - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Ваша система не відповідає рекомендованим системним вимогам. Звіти про сумісність було вимкнено. - + Missing yuzu Account Відсутній обліковий запис yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Щоб надіслати звіт про сумісність гри, необхідно прив'язати свій обліковий запис yuzu. <br><br/>Щоб прив'язати свій обліковий запис yuzu, перейдіть у розділ Емуляція &gt; Параметри &gt; Мережа. - + Error opening URL Помилка під час відкриття URL - + Unable to open the URL "%1". Не вдалося відкрити URL: "%1". - + TAS Recording Запис TAS - + Overwrite file of player 1? Перезаписати файл гравця 1? - + Invalid config detected Виявлено неприпустиму конфігурацію - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативний контролер не може бути використаний у режимі док-станції. Буде обрано контролер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Поточний amiibo було прибрано - + Error Помилка - - + + The current game is not looking for amiibos Поточна гра не шукає amiibo - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Всі Файли (*.*) - + Load Amiibo Завантажити Amiibo - + Error loading Amiibo data Помилка під час завантаження даних Amiibo - + The selected file is not a valid amiibo Обраний файл не є допустимим amiibo - + The selected file is already on use Обраний файл уже використовується - + An unknown error occurred Виникла невідома помилка - - - Verification failed for the following files: - -%1 - - - - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Аплет контролера - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Зробити знімок екрану - + PNG Image (*.png) Зображення PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Стан TAS: Виконується %1/%2 - + TAS state: Recording %1 Стан TAS: Записується %1 - + TAS state: Idle %1/%2 Стан TAS: Простий %1/%2 - + TAS State: Invalid Стан TAS: Неприпустимий - + &Stop Running [&S] Зупинка - + &Start [&S] Почати - + Stop R&ecording [&E] Закінчити запис - + R&ecord [&E] Запис - + Building: %n shader(s) Побудова: %n шейдер Побудова: %n шейдер(ів) - Побудова: %n шейдер(ів) - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Швидкість: %1% / %2% - + Speed: %1% Швидкість: %1% @@ -6723,54 +6789,54 @@ Would you like to download it? Гра: %1 FPS (Необмежено) - + Game: %1 FPS Гра: %1 FPS - + Frame: %1 ms Кадр: %1 мс - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA БЕЗ ЗГЛАДЖУВАННЯ - + VOLUME: MUTE ГУЧНІСТЬ: ЗАГЛУШЕНА - + VOLUME: %1% Volume percentage (e.g. 50%) ГУЧНІСТЬ: %1% - + Derivation Components Missing Компоненти розрахунку відсутні - + Select RomFS Dump Target Оберіть ціль для дампа RomFS - + Please select which RomFS you would like to dump. Будь ласка, виберіть, який RomFS ви хочете здампити. @@ -6783,7 +6849,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Ви впевнені, що хочете зупинити емуляцію? Будь-який незбережений прогрес буде втрачено. @@ -6796,102 +6862,102 @@ Would you like to bypass this and exit anyway? Чи хочете ви обійти це і вийти в будь-якому випадку? - + None Вимкнено - + FXAA FXAA - + SMAA SMAA - + Nearest Найближчий - + Bilinear Білінійне - + Bicubic Бікубічне - + Gaussian Гауса - + ScaleForce ScaleForce - + Area - + Docked У док-станції - + Handheld Портативний - + Normal Нормальна - + High Висока - + Extreme Екстрим - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6899,13 +6965,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! OpenGL недоступний! - + OpenGL shared contexts are not supported. Загальні контексти OpenGL не підтримуються. @@ -6914,33 +6980,33 @@ Would you like to bypass this and exit anyway? yuzu не було зібрано з підтримкою OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Помилка під час ініціалізації OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Ваш ГП може не підтримувати OpenGL, або у вас встановлено застарілий графічний драйвер. - + Error while initializing OpenGL 4.6! Помилка під час ініціалізації OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Ваш ГП може не підтримувати OpenGL 4.6, або у вас встановлено застарілий графічний драйвер.<br><br>Рендерер GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Ваш ГП може не підтримувати одне або кілька необхідних розширень OpenGL. Будь ласка, переконайтеся в тому, що у вас встановлено останній графічний драйвер.<br><br>Рендерер GL:<br>%1<br><br>Розширення, що не підтримуються:<br>%2 @@ -6948,128 +7014,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite Улюблені - + Start Game Запустити гру - + Start Game without Custom Configuration Запустити гру без користувацького налаштування - + Open Save Data Location Відкрити папку для збережень - + Open Mod Data Location Відкрити папку для модів - + Open Transferable Pipeline Cache Відкрити переносний кеш конвеєра - + Remove Видалити - + Remove Installed Update Видалити встановлене оновлення - + Remove All Installed DLC Видалити усі DLC - + Remove Custom Configuration Видалити користувацьке налаштування - + Remove Play Time Data - + Remove Cache Storage Видалити кеш-сховище - + Remove OpenGL Pipeline Cache Видалити кеш конвеєра OpenGL - + Remove Vulkan Pipeline Cache Видалити кеш конвеєра Vulkan - + Remove All Pipeline Caches Видалити весь кеш конвеєра - + Remove All Installed Contents Видалити весь встановлений вміст - + Dump RomFS Дамп RomFS - + Dump RomFS to SDMC Здампити RomFS у SDMC - + Verify Integrity - + Copy Title ID to Clipboard Скопіювати ідентифікатор додатку в буфер обміну - + Navigate to GameDB entry Перейти до сторінки GameDB - + Create Shortcut Створити ярлик - + Add to Desktop Додати на Робочий стіл - + Add to Applications Menu Додати до меню застосунків - + Configure Game @@ -7078,62 +7144,62 @@ Would you like to bypass this and exit anyway? Властивості - + Scan Subfolders Сканувати підпапки - + Remove Game Directory Видалити директорію гри - + ▲ Move Up ▲ Перемістити вверх - + ▼ Move Down ▼ Перемістити вниз - + Open Directory Location Відкрити розташування папки - + Clear Очистити - + Name Назва - + Compatibility Сумісність - + Add-ons Доповнення - + File type Тип файлу - + Size Розмір - + Play time @@ -7141,62 +7207,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame Запускається - + Game starts, but crashes or major glitches prevent it from being completed. Гра запускається, але вильоти або серйозні баги не дають змоги її завершити. - + Perfect Ідеально - + Game can be played without issues. У гру можна грати без проблем. - + Playable Придатно до гри - + Game functions with minor graphical or audio glitches and is playable from start to finish. Гра працює з незначними графічними та/або звуковими помилками і прохідна від початку до кінця. - + Intro/Menu Вступ/Меню - + Game loads, but is unable to progress past the Start Screen. Гра завантажується, але не проходить далі стартового екрана. - + Won't Boot Не запускається - + The game crashes when attempting to startup. Гра вилітає під час запуску. - + Not Tested Не перевірено - + The game has not yet been tested. Гру ще не перевіряли на сумісність. @@ -7204,7 +7270,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list Натисніть двічі, щоб додати нову папку до списку ігор @@ -7212,21 +7278,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) %1 із %n результат(ів) %1 із %n результат(ів) - %1 із %n результат(ів) - + Filter: Пошук: - + Enter pattern to filter Введіть текст для пошуку @@ -7308,7 +7373,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7322,190 +7387,190 @@ Debug Message: Hotkeys - + Audio Mute/Unmute Увімкнення/вимкнення звуку - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Основне вікно - + Audio Volume Down Зменшити гучність звуку - + Audio Volume Up Підвищити гучність звуку - + Capture Screenshot Зробити знімок екрану - + Change Adapting Filter Змінити адаптуючий фільтр - + Change Docked Mode Змінити режим консолі - + Change GPU Accuracy Змінити точність ГП - + Configure Налаштувати - + Configure Current Game - + Continue/Pause Emulation Продовження/Пауза емуляції - + Exit Fullscreen Вийти з повноекранного режиму + + + Exit Eden + + Exit yuzu Вийти з yuzu - - Exit eden - - - - + Fullscreen Повний екран - + Load File Завантажити файл - + Load/Remove Amiibo Завантажити/видалити Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Перезапустити емуляцію - + Stop Emulation Зупинити емуляцію - + TAS Record Запис TAS - + TAS Reset Скидання TAS - + TAS Start/Stop Старт/Стоп TAS - + Toggle Filter Bar Переключити панель пошуку - + Toggle Framerate Limit Переключити обмеження частоти кадрів - + Toggle Mouse Panning Переключити панорамування миші - + Toggle Renderdoc Capture - + Toggle Status Bar Переключити панель стану @@ -7513,22 +7578,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. Будь ласка, переконайтеся, що це ті файли, які ви хочете встановити. - + Installing an Update or DLC will overwrite the previously installed one. Встановлення оновлення або завантажуваного контенту перезапише раніше встановлене. - + Install Встановити - + Install Files to NAND Встановити файли в NAND @@ -7536,7 +7601,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 У тексті неприпустимі такі символи: @@ -7683,152 +7748,207 @@ Debug Message: [&R] Нещодавні файли - + + Open &Eden Folders + + + + &Emulation [&E] Емуляція - + &View [&V] Вигляд - + &Reset Window Size [&R] Скинути розмір вікна - + &Debugging [&D] Налагодження - + Reset Window Size to &720p Скинути розмір вікна до &720p - + Reset Window Size to 720p Скинути розмір вікна до 720p - + Reset Window Size to &900p Скинути розмір вікна до &900p - + Reset Window Size to 900p Скинути розмір вікна до 900p - + Reset Window Size to &1080p Скинути розмір вікна до &1080p - + Reset Window Size to 1080p Скинути розмір вікна до 1080p - + &Multiplayer [&M] Мультиплеєр - + &Tools [&T] Інструменти - + &Amiibo - + &TAS [&T] TAS - + &Create Home Menu Shortcut - + &Help [&H] Допомога - + &Install Files to NAND... [&I] Встановити файли в NAND... - + L&oad File... [&O] Завантажити файл... - + Load &Folder... [&F] Завантажити папку... - + E&xit [&X] Вихід - + &Pause [&P] Пауза - + &Stop [&S] Стоп - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7837,97 +7957,97 @@ Debug Message: [&A] Про yuzu - + Single &Window Mode [&W] Режим одного вікна - + Con&figure... [&F] Налаштування... - + Ctrl+, - + Display D&ock Widget Headers [&O] Відображати заголовки віджетів дока - + Show &Filter Bar [&F] Показати панель пошуку - + Show &Status Bar [&S] Показати панель статусу - + Show Status Bar Показати панель статусу - + &Browse Public Game Lobby [&B] Переглянути публічні ігрові фойє - + &Create Room [&C] Створити кімнату - + &Leave Room [&L] Залишити кімнату - + &Direct Connect to Room [&D] Пряме під'єднання до кімнати - + &Show Current Room [&S] Показати поточну кімнату - + F&ullscreen [&U] Повноекранний - + &Restart [&R] Перезапустити - + Load/Remove &Amiibo... [&A] Завантажити/Видалити Amiibo... - + &Report Compatibility [&R] Повідомити про сумісність - + Open &Mods Page [&M] Відкрити сторінку модів - + Open &Quickstart Guide [&Q] Відкрити посібник користувача - + &FAQ [&F] ЧАП @@ -7936,77 +8056,82 @@ Debug Message: [&Y] Відкрити папку yuzu - + &Capture Screenshot [&C] Зробити знімок екрану - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... [&C] Налаштування TAS... - + Configure C&urrent Game... [&U] Налаштувати поточну гру... - + &Start [&S] Почати - + &Reset [&S] Скинути - + R&ecord [&E] Запис - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -8014,26 +8139,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - [&M] MicroProfile + [&M] MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8093,37 +8228,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Поточний стан з'єднання - + Not Connected. Click here to find a room! Не з'єднано. Натисніть тут, щоб знайти кімнату! - + Not Connected Не з'єднано - + Connected З'єднано - + New Messages Received Отримано нові повідомлення - + Error Помилка - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Не вдалося оновити інформацію про кімнату. Будь ласка, перевірте підключення до Інтернету та спробуйте знову зайти в кімнату. @@ -8315,56 +8450,56 @@ p, li { white-space: pre-wrap; } Не грає в гру - + Installed SD Titles Встановлені SD ігри - + Installed NAND Titles Встановлені NAND ігри - + System Titles Системні ігри - + Add New Game Directory Додати нову папку з іграми - + Favorites Улюблені - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [не задано] @@ -8375,14 +8510,14 @@ p, li { white-space: pre-wrap; } Напр. %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Ось %1%2 @@ -8393,357 +8528,357 @@ p, li { white-space: pre-wrap; } Кнопка %1 - - - - - - + + + + + + [unknown] [невідомо] - - - + + + Left Вліво - - - + + + Right Вправо - - - + + + Down Вниз - - - + + + Up Вгору - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Start - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Кружечок - - + + Cross Хрестик - - + + Square Квадратик - - + + Triangle Трикутничок - - + + Share Share - - + + Options Options - - + + [undefined] [невизначено] - + %1%2 %1%2 - - + + [invalid] [неприпустимо] - - + + %1%2Hat %3 %1%2Напр. %3 - - - + + + %1%2Axis %3 %1%2Ось %3 - - + + %1%2Axis %3,%4,%5 %1%2Ось %3,%4,%5 - - + + %1%2Motion %3 %1%2Рух %3 - - + + %1%2Button %3 %1%2Кнопка %3 - - + + [unused] [не використаний] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Лівий стік - + Stick R Правий стік - + Plus Плюс - + Minus Мінус - - + + Home Home - + Capture Захоплення - + Touch Сенсор - + Wheel Indicates the mouse wheel Коліщатко - + Backward Назад - + Forward Вперед - + Task Задача - + Extra Додаткова - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Напр. %4 - - + + %1%2%3Axis %4 %1%2%3Вісь %4 - - + + %1%2%3Button %4 %1%2%3Кнопка %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8861,6 +8996,298 @@ p, li { white-space: pre-wrap; } Чи хочете ви відновити цю amiibo? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Скасувати + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + + + + + + Verifying integrity... + + + + + + Integrity verification succeeded! + + + + + + The operation completed successfully. + Операція завершилася успішно. + + + + + Integrity verification failed! + + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Помилка під час видалення вмісту + + + + Error Removing Update + Помилка під час видалення оновлень + + + + Error Removing DLC + Помилка під час видалення DLC + + + + The base game is not installed in the NAND and cannot be removed. + Гру не встановлено в NAND і не може буде видалено. + + + + There is no update installed for this title. + Для цієї гри не було встановлено оновлення. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Успішно видалено + + + + Successfully removed %1 installed DLC. + Встановлений DLC %1 було успішно видалено + + + + + Error Removing Transferable Shader Cache + Помилка під час видалення переносного кешу шейдерів + + + + + A shader cache for this title does not exist. + Кеш шейдерів для цієї гри не існує. + + + + Successfully removed the transferable shader cache. + Переносний кеш шейдерів успішно видалено. + + + + Failed to remove the transferable shader cache. + Не вдалося видалити переносний кеш шейдерів. + + + + Error Removing Vulkan Driver Pipeline Cache + Помилка під час видалення конвеєрного кешу Vulkan + + + + Failed to remove the driver pipeline cache. + Не вдалося видалити конвеєрний кеш шейдерів. + + + + + Error Removing Transferable Shader Caches + Помилка під час видалення переносного кешу шейдерів + + + + Successfully removed the transferable shader caches. + Переносний кеш шейдерів успішно видалено. + + + + Failed to remove the transferable shader cache directory. + Помилка під час видалення папки переносного кешу шейдерів. + + + + + Error Removing Custom Configuration + Помилка під час видалення користувацького налаштування + + + + A custom configuration for this title does not exist. + Користувацьких налаштувань для цієї гри не існує. + + + + Successfully removed the custom game configuration. + Користувацьке налаштування гри успішно видалено. + + + + Failed to remove the custom game configuration. + Не вдалося видалити користувацьке налаштування гри. + + + + Reset Metadata Cache + Скинути кеш метаданих + + + + The metadata cache is already empty. + Кеш метаданих вже порожній. + + + + The operation completed successfully. + Операція завершилася успішно. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Кеш метаданих не можна видалити. Можливо, він використовується або відсутній. + + + + Create Shortcut + Створити ярлик + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Успішно створено ярлик у %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Це створить ярлик для поточного AppImage. Він може не працювати після оновлень. Продовжити? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Створити іконку + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Неможливо створити файл іконки. Шлях "%1" не існує і не може бути створений. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9156,7 +9583,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9164,7 +9591,7 @@ Please try again or contact the developer of the software. %2 - + Users Користувачі @@ -9288,7 +9715,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Стек викликів @@ -9296,12 +9723,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread не очікується жодним потоком @@ -9309,102 +9736,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable runnable - + paused paused - + sleeping sleeping - + waiting for IPC reply очікування відповіді IPC - + waiting for objects очікування об'єктів - + waiting for condition variable waiting for condition variable - + waiting for address arbiter waiting for address arbiter - + waiting for suspend resume waiting for suspend resume - + waiting waiting - + initialized initialized - + terminated terminated - + unknown невідомо - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 ядро %1 - + processor = %1 процесор = %1 - + affinity mask = %1 маска подібності = %1 - + thread id = %1 ідентифікатор потоку = %1 - + priority = %1(current) / %2(normal) пріоритет = %1(поточний) / %2(звичайний) - + last running ticks = %1 last running ticks = %1 @@ -9412,7 +9839,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread очікується потоком @@ -9420,7 +9847,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree [&W] Дерево очікування diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 17d8e62327..4ad6050d64 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Đang giao tiếp với máy chủ... - + Cancel Hủy bỏ - + Touch the top left corner <br>of your touchpad. Hãy chạm vào góc trên cùng<br>bên trái trên touchpad của bạn. - + Now touch the bottom right corner <br>of your touchpad. Giờ hãy chạm vào góc dưới cùng<br>bên phải trên touchpad của bạn. - + Configuration completed! Đã hoàn thành quá trình cấu hình! - + OK OK @@ -397,439 +397,157 @@ Việc này sẽ ban tên người dùng trên diễn đàn và IP của họ lu ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Lỗi - - Net connect - - - - - Player select - - - - + Software keyboard Bàn phím mềm - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Hệ thống xuất: - + Output Device: Thiết bị đầu ra: - + Input Device: Thiết bị đầu vào: - - Mute audio - - - - + Volume: Âm lượng: - + Mute audio when in background Tắt tiếng khi chạy nền - + Multicore CPU Emulation Giả lập CPU đa nhân - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Giới hạn phần trăm tốc độ - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Độ chính xác: - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Không dùng FMA (tăng hiệu suất cho các dòng CPU không hỗ trợ FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE FRSQRTE và FRECPE nhanh hơn - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Các chỉ thị ASIMD nhanh hơn (chỉ cho 32 bit) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Xử lí NaN không chính xác - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Tắt kiểm tra không gian địa chỉ - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Bỏ qua màn hình chung - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Thiết bị: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Backend shader: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Độ phân giải: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Bộ lọc điều chỉnh cửa sổ: - + FSR Sharpness: Độ nét FSR: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Phương pháp khử răng cưa: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Chế độ toàn màn hình: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Tỉ lệ khung hình: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Dùng bộ nhớ đệm pipeline trên ổ cứng - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Dùng giả lập GPU bất đồng bộ - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Giả lập NVDEC: - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +558,34 @@ Mailbox có thể có độ trễ thấp hơn FIFO và không gây hiện tượ Immediate (không đồng bộ hóa) chỉ hiển thị những gì đã có và có thể gây hiện tượng xé hình. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ cho Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ cho Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Lọc bất đẳng hướng: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Mức độ chính xác: + Mức độ chính xác: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Dùng tính năng dựng shader bất đồng bộ (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Dùng thời gian GPU nhanh (Hack) @@ -905,1021 +595,1428 @@ This feature is experimental. Bật chế độ Thời gian GPU nhanh. Tùy chọn này sẽ buộc hầu hết các game chạy ở độ phân giải gốc cao nhất của chúng. - + Use Vulkan pipeline cache Dùng bộ nhớ đệm pipeline Vulkan - + + Enable Reactive Flushing + Bật xả tương ứng + + + + Sync to framerate of video playback + Đồng bộ hóa với tốc độ khung hình khi phát video + + + + Run the game at normal speed during video playback, even when the framerate is unlocked. + Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. + + + + Barrier feedback loops + Vòng lặp phản hồi rào cản + + + + Improves rendering of transparency effects in specific games. + Cải thiện hiệu quả kết xuất của hiệu ứng trong suốt trong một số game. + + + + RNG Seed + Hạt giống RNG + + + + Device Name + Tên thiết bị + + + + Note: this can be overridden when region setting is auto-select + Lưu ý: Tuỳ chọn này có thể bị ghi đè nếu cài đặt vùng là chọn tự động. + + + + Region: + Vùng: + + + + Time Zone: + Múi giờ: + + + + Sound Output Mode: + Chế độ đầu ra âm thanh: + + + + Prompt for user on game boot + Hiển thị cửa sổ chọn người dùng khi bắt đầu game + + + + Pause emulation when in background + Tạm dừng giả lập khi chạy nền + + + + Hide mouse on inactivity + Ẩn con trỏ chuột khi không dùng + + + + Disable controller applet + Vô hiệu hoá applet tay cầm + + + + CPU + CPU + + + + Uncompressed (Best quality) + Không nén (Chất lượng tốt nhất) + + + + BC1 (Low quality) + BC1 (Chất lượng thấp) + + + + BC3 (Medium quality) + BC3 (Chất lượng trung bình) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly Shaders, chỉ cho NVIDIA) + + + + Normal + Bình thường + + + + High + Cao + + + + Extreme + Cực đại + + + + Auto + Tự động + + + + Accurate + Chính xác + + + + Unsafe + Không an toàn + + + + Paranoid (disables most optimizations) + Paranoid (vô hiệu hoá hầu hết sự tối ưu) + + + + Borderless Windowed + Cửa sổ không viền + + + + Exclusive Fullscreen + Toàn màn hình + + + + No Video Output + Không có đầu ra video + + + + CPU Video Decoding + Giải mã video bằng CPU + + + + GPU Video Decoding (Default) + Giải mã video bằng GPU (Mặc định) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [THỬ NGHIỆM] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [THỬ NGHIỆM] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest Neighbor + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + Gaussian + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Không có + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Mặc định (16:9) + + + + Force 4:3 + Dùng 4:3 + + + + Force 21:9 + Dùng 21:9 + + + + Force 16:10 + Dùng 16:10 + + + + Stretch to Window + Mở rộng đến cửa sổ + + + + Automatic + Tự động + + + + + Default + Mặc định + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - Bật xả tương ứng - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - - Sync to framerate of video playback - Đồng bộ hóa với tốc độ khung hình khi phát video + + RAII + - - Run the game at normal speed during video playback, even when the framerate is unlocked. - Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + - - Barrier feedback loops - Vòng lặp phản hồi rào cản + + Extended Dynamic State + - - Improves rendering of transparency effects in specific games. - Cải thiện hiệu quả kết xuất của hiệu ứng trong suốt trong một số game. + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + - - RNG Seed - Hạt giống RNG + + Provoking Vertex + - + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Tên thiết bị - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Lưu ý: Tuỳ chọn này có thể bị ghi đè nếu cài đặt vùng là chọn tự động. - - - - Region: - Vùng: - - - + The region of the emulated Switch. - - Time Zone: - Múi giờ: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Chế độ đầu ra âm thanh: - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Hiển thị cửa sổ chọn người dùng khi bắt đầu game - - - - Pause emulation when in background - Tạm dừng giả lập khi chạy nền - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Ẩn con trỏ chuột khi không dùng - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - Vô hiệu hoá applet tay cầm - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - - Uncompressed (Best quality) - Không nén (Chất lượng tốt nhất) - - - - BC1 (Low quality) - BC1 (Chất lượng thấp) - - - - BC3 (Medium quality) - BC3 (Chất lượng trung bình) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly Shaders, chỉ cho NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Bình thường + + Unsafe (fast) + - - High - Cao + + Safe (stable) + - - Extreme - Cực đại - - - - Auto - Tự động - - - - Accurate - Chính xác - - - - Unsafe - Không an toàn - - - - Paranoid (disables most optimizations) - Paranoid (vô hiệu hoá hầu hết sự tối ưu) - - - + Dynarmic - + NCE - - Borderless Windowed - Cửa sổ không viền - - - - Exclusive Fullscreen - Toàn màn hình - - - - No Video Output - Không có đầu ra video - - - - CPU Video Decoding - Giải mã video bằng CPU - - - - GPU Video Decoding (Default) - Giải mã video bằng GPU (Mặc định) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [THỬ NGHIỆM] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [THỬ NGHIỆM] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest Neighbor - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - Gaussian - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Không có - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Mặc định (16:9) - - - - Force 4:3 - Dùng 4:3 - - - - Force 21:9 - Dùng 21:9 - - - - Force 16:10 - Dùng 16:10 - - - - Stretch to Window - Mở rộng đến cửa sổ - - - - Automatic - Tự động - - - - Default - Mặc định - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - - + + Serbian (српски) + + + + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Docked - + Handheld Handheld - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2271,27 +2368,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Ghi nhật ký - + Open Log Location Mở vị trí nhật ký - + Global Log Filter Bộ lọc nhật ký chung - + When checked, the max size of the log increases from 100 MB to 1 GB Khi kích hoạt, kích thước tối đa của tập tin nhật ký tăng từ 100 MB lên 1 GB - + Enable Extended Logging** Bật ghi nhật ký mở rộng** - + Show Log in Console Hiện nhật ký trong console @@ -2437,7 +2534,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2499,7 +2596,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Sẽ tự động đặt lại khi đóng yuzu. - + Web applet not compiled Applet web chưa được biên dịch @@ -2549,7 +2646,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2558,88 +2655,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Một số cài đặt chỉ khả dụng khi game không chạy. - + Applets - - + + Audio Âm thanh - - + + CPU CPU - + Debug Gỡ lỗi - + Filesystem Hệ thống tập tin - - + + General Chung - - + + Graphics Đồ hoạ - + GraphicsAdvanced Đồ họa Nâng cao - + GraphicsExtensions - + Hotkeys Phím tắt - - + + Controls Điều khiển - + Profiles Hồ sơ - + Network Mạng - - + + System Hệ thống - + Game List Danh sách game - + Web Web @@ -2737,51 +2834,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Đặt lại bộ nhớ đệm metadata - + Select Emulated NAND Directory... Chọn thư mục NAND giả lập... - + Select Emulated SD Directory... Chọn thư mục SD giả lập... - + Select Gamecard Path... Chọn đường dẫn tới đĩa game... - + Select Dump Directory... Chọn thư mục trích xuất... - + Select Mod Load Directory... Chọn thư mục chứa mod... - The metadata cache is already empty. - Bộ nhớ đệm metadata trống. + Bộ nhớ đệm metadata trống. - The operation completed successfully. - Các hoạt động đã hoàn tất thành công. + Các hoạt động đã hoàn tất thành công. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Bộ nhớ đệm metadata không thể xoá. Nó có thể đang được sử dụng hoặc không tồn tại. + Bộ nhớ đệm metadata không thể xoá. Nó có thể đang được sử dụng hoặc không tồn tại. @@ -2812,12 +2903,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Quá trình này sẽ đặt lại toàn bộ tùy chỉnh và gỡ hết mọi cài đặt cho từng game riêng lẻ. Quá trình này không xoá thư mục game, hồ sơ, hay hồ sơ đầu vào. Tiếp tục? @@ -2850,33 +2941,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Màu nền: - + % FSR sharpening percentage (e.g. 50%) % - + Off Tắt - + VSync Off Tắt Vsync - + Recommended Đề xuất - + On Bật - + VSync On Bật Vsync @@ -2913,14 +3004,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2952,75 +3047,75 @@ These settings are experimental, and may cause black screens. If your games fail Khôi phục mặc định - + Action Hành động - + Hotkey Phím tắt - + Controller Hotkey Phím tắt tay cầm - - - + + + Conflicting Key Sequence Tổ hợp phím bị xung đột - - + + The entered key sequence is already assigned to: %1 Tổ hợp phím này đã gán với: %1 - + [waiting] [chờ] - + Invalid Không hợp lệ - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Khôi phục mặc định - + Clear Xóa - + Conflicting Button Sequence Tổ hợp nút bị xung đột - + The default button sequence is already assigned to: %1 Tổ hợp nút mặc định đã được gán cho: %1 - + The default key sequence is already assigned to: %1 Tổ hợp phím này đã gán với: %1 @@ -3340,7 +3435,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3495,7 +3590,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Cần trái @@ -3605,14 +3700,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3631,7 +3726,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Cộng @@ -3644,15 +3739,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3697,7 +3792,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Cần phải @@ -3712,242 +3807,242 @@ These settings are experimental, and may cause black screens. If your games fail Cấu hình - - - - + + + + Clear Xóa - - - - - + + + + + [not set] [chưa đặt] - - - + + + Invert button Đảo ngược nút - - + + Toggle button Đổi nút - + Turbo button Nút turbo - - + + Invert axis Đảo ngược trục - - - + + + Set threshold Thiết lập ngưỡng - - + + Choose a value between 0% and 100% Chọn một giá trị giữa 0% và 100% - + Toggle axis Chuyển đổi trục - + Set gyro threshold Thiết lập ngưỡng cảm biến con quay - + Calibrate sensor Hiệu chỉnh cảm biến - + Map Analog Stick Ánh xạ cần analog - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Sau khi nhấn OK, di chuyển cần điều khiển theo chiều ngang, sau đó theo chiều dọc. Để đảo ngược hướng, di chuyển cần điều khiển theo chiều dọc trước, sau đó theo chiều ngang. - + Center axis Canh chỉnh trục - - + + Deadzone: %1% Vùng chết: %1% - - + + Modifier Range: %1% Phạm vi điều chỉnh: %1% - - + + Pro Controller Pro Controller - + Dual Joycons Joycon đôi - + Left Joycon Joycon trái - + Right Joycon Joycon phải - + Handheld Handheld - + GameCube Controller Tay cầm GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Tay cầm NES - + SNES Controller Tay cầm SNES - + N64 Controller Tay cầm N64 - + Sega Genesis Sega Genesis - + Start / Pause Bắt đầu / Tạm dừng - + Z Z - + Control Stick Cần điều khiển - + C-Stick C-Stick - + Shake! Lắc! - + [waiting] [đang chờ] - + New Profile Hồ sơ mới - + Enter a profile name: Nhập tên hồ sơ: - - + + Create Input Profile Tạo hồ sơ đầu vào - + The given profile name is not valid! Tên hồ sơ không hợp lệ! - + Failed to create the input profile "%1" Thất bại khi tạo hồ sơ đầu vào "%1" - + Delete Input Profile Xoá hồ sơ đầu vào - + Failed to delete the input profile "%1" Thất bại khi xoá hồ sơ đầu vào "%1" - + Load Input Profile Nạp hồ sơ đầu vào - + Failed to load the input profile "%1" Thất bại khi nạp hồ sơ đầu vào "%1" - + Save Input Profile Lưu hồ sơ đầu vào - + Failed to save the input profile "%1" Thất bại khi lưu hồ sơ dầu vào "%1" @@ -4004,7 +4099,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure Cấu hình @@ -4040,7 +4135,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test Thử nghiệm @@ -4059,7 +4154,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Tìm hiểu thêm</span></a> - + %1:%2 %1:%2 @@ -4068,77 +4163,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Cổng có kí tự không hợp lệ - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Cổng phải từ 0 đến 65353 - + IP address is not valid Địa chỉ IP không hợp lệ - + This UDP server already exists Máy chủ UDP này đã tồn tại - + Unable to add more than 8 servers Không thể thêm quá 8 máy chủ - + Testing Thử nghiệm - + Configuring Cấu hình - + Test Successful Thử nghiệm thành công - + Successfully received data from the server. Thành công nhận dữ liệu từ máy chủ. - + Test Failed Thử nghiệm thất bại - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Không thể nhận được dữ liệu hợp lệ từ máy chủ.<br>Hãy chắc chắn máy chủ được thiết lập chính xác và địa chỉ lẫn cổng đều đúng. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Cấu hình kiểm tra hoặc hiệu chuẩn UDP đang được tiến hành.<br>Vui lòng chờ cho đến khi nó hoàn thành. @@ -4265,7 +4360,12 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Giao diện mạng - + + Enable Airplane Mode + + + + None Không có @@ -4323,52 +4423,52 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Một số cài đặt chỉ khả dụng khi game không chạy. - + Add-Ons Add-Ons - + System Hệ thống - + CPU CPU - + Graphics Đồ hoạ - + Adv. Graphics Đồ hoạ nâng cao - + GPU Extensions - + Audio Âm thanh - + Input Profiles Hồ sơ đầu vào - + Linux - + Properties Thuộc tính @@ -4386,12 +4486,12 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Add-Ons - + Patch Name Tên bản vá - + Version Phiên bản @@ -4429,27 +4529,32 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Đặt hình ảnh - + + Select Avatar + + + + Add Thêm - + Rename Đổi tên - + Remove Loại bỏ - + Profile management is available only when game is not running. Quản lí hồ sơ chỉ khả dụng khi game không chạy. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4457,100 +4562,189 @@ Các giá trị hiện tại lần lượt là %1% và %2%. %2 - + Enter Username Nhập tên người dùng - + Users Người dùng - + Enter a username for the new user: Chọn tên người dùng cho người dùng mới: - + Enter a new username: Nhập tên người dùng mới: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Chọn ảnh người dùng - - JPEG Images (*.jpg *.jpeg) - Ảnh JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Ảnh JPEG (*.jpg *.jpeg) + + + Error deleting image Lỗi khi xóa ảnh - + Error occurred attempting to overwrite previous image at: %1. Có lỗi khi ghi đè ảnh trước tại: %1. - + Error deleting file Lỗi khi xoá tập tin - + Unable to delete existing file: %1. Không thể xóa tập tin hiện tại: %1. - + Error creating user image directory Lỗi khi tạo thư mục chứa ảnh người dùng - + Unable to create directory %1 for storing user images. Không thể tạo thư mục %1 để chứa ảnh người dùng. - Error copying user image - Lỗi chép ảnh người dùng + Lỗi chép ảnh người dùng - Unable to copy image from %1 to %2 - Không thể chép ảnh từ %1 sang %2 + Không thể chép ảnh từ %1 sang %2 - Error resizing user image - Lỗi thu phóng ảnh + Lỗi thu phóng ảnh - Unable to resize image - Không thể thu phóng ảnh + Không thể thu phóng ảnh + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + Hủy bỏ + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Xoá người dùng này? Tất cả dữ liệu save của người dùng này sẽ bị xoá. - + Confirm Delete Xác nhận xóa - + Name: %1 UUID: %2 Tên: %1 @@ -4603,7 +4797,7 @@ UUID: %2 - + Enable Bật @@ -4614,7 +4808,7 @@ UUID: %2 - + Not connected Không kết nối @@ -4624,63 +4818,63 @@ UUID: %2 Khôi phục mặc định - + Clear Xóa - + [not set] [chưa đặt] - + Invert axis Đảo ngược trục - - + + Deadzone: %1% Vùng chết: %1% - + Error enabling ring input Lỗi khi bật đầu vào từ vòng - + Direct Joycon driver is not enabled Driver JoyCon trực tiếp chưa được bật - + Configuring Cấu hình - + The current mapped device doesn't support the ring controller Thiết bị được ánh xạ hiện tại không hỗ trợ vòng điều khiển - + The current mapped device doesn't have a ring attached Thiết bị được ánh xạ hiện tại không có vòng được gắn vào - + The current mapped device is not connected Thiết bị được ánh xạ hiện tại không được kết nối - + Unexpected driver result %1 Kết quả driver không như mong đợi %1 - + [waiting] [chờ] @@ -4722,7 +4916,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4774,12 +4968,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Cấu hình TAS - + Select TAS Load Directory... Chọn thư mục nạp TAS... @@ -4889,7 +5083,7 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5209,6 +5403,16 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Dịch vụ web yuzu @@ -5218,42 +5422,29 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Bằng cách cung cấp tên đăng nhập và token của bạn, bạn đã chấp thuận sẽ cho phép yuzu thu thập dữ liệu đã sử dụng, trong đó có thể có thông tin nhận dạng người dùng. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Xác nhận + Xác nhận - Sign up - Đăng ký + Đăng ký - + Token: Token: - + Username: Tên người dùng: - What is my token? - Token của tôi là gì? + Token của tôi là gì? - + Web Service configuration can only be changed when a public room isn't being hosted. Cấu hình dịch vụ web chỉ có thể thay đổi khi không có phòng công khai đang được tổ chức. @@ -5278,12 +5469,12 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Tạo mới - + Discord Presence Hiện diện trên Discord - + Show Current Game in your Discord Status Hiển thị game hiện tại lên trạng thái Discord của bạn @@ -5292,24 +5483,8 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Tìm hiểu thêm</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Đăng ký</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Đăng ký</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5332,10 +5507,9 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Token không được xác thực. Thay đổi token của bạn chưa được lưu. - Unverified, please click Verify before saving configuration Tooltip - Chưa xác minh, vui lòng nhấp vào Xác minh trước khi lưu cấu hình + Chưa xác minh, vui lòng nhấp vào Xác minh trước khi lưu cấu hình Verifying... @@ -5359,20 +5533,67 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Xác thực không thành công. Hãy kiểm tra xem bạn đã nhập token đúng chưa và kết nối internet của bạn có hoạt động hay không. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Tay cầm P1 - + &Controller P1 &Tay cầm P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Phiên bản + + DirectConnect @@ -5478,7 +5699,12 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5486,11 +5712,6 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr The host of the room has banned you. Speak with the host to unban you or try a different room. Chủ phòng đã ban bạn. Hãy nói chuyện với người chủ phòng để được unban, hoặc thử vào một phòng khác. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5552,7 +5773,7 @@ Vui lòng vào Cấu hình -> Hệ thống -> Mạng và thực hiện l Viễn trắc - + Broken Vulkan Installation Detected Phát hiện cài đặt Vulkan bị hỏng @@ -5561,106 +5782,105 @@ Vui lòng vào Cấu hình -> Hệ thống -> Mạng và thực hiện l Khởi tạo Vulkan thất bại trong quá trình khởi động.<br>Nhấp <br><a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>vào đây để xem hướng dẫn khắc phục vấn đề</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Đang chạy một game - + Loading Web Applet... Đang tải applet web... - - + + Disable Web Applet Tắt applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Tắt applet web có thể dẫn đến hành vi không xác định và chỉ nên được sử dụng với Super Mario 3D All-Stars. Bạn có chắc chắn muốn tắt applet web không? (Có thể được bật lại trong cài đặt Gỡ lỗi.) - + The amount of shaders currently being built Số lượng shader đang được dựng - + The current selected resolution scaling multiplier. Bội số tỷ lệ độ phân giải được chọn hiện tại. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Tốc độ giả lập hiện tại. Giá trị cao hơn hoặc thấp hơn 100% chỉ ra giả lập sẽ chạy nhanh hơn hoặc chậm hơn trên máy Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Có bao nhiêu khung hình trên mỗi giây mà game đang hiển thị. Điều này sẽ thay đổi giữa các game và các cảnh khác nhau. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Thời gian mà giả lập lấy từ khung hình Switch, sẽ không kể đến giới hạn khung hình hoặc v-sync. Đối với tốc độ tối đa mà giả lập nhận được nhiều nhất là ở độ khoảng 16.67 ms. - + Unmute Bật tiếng - + Mute Tắt tiếng - + Reset Volume Đặt lại âm lượng - + &Clear Recent Files &Xoá tập tin gần đây - + &Continue &Tiếp tục - + &Pause &Tạm dừng - Warning Outdated Game Format - Cảnh báo định dạng game đã lỗi thời + Cảnh báo định dạng game đã lỗi thời You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Bạn đang sử dụng định dạng thư mục ROM đã giải nén cho game này, một định dạng lỗi thời đã được thay thế bởi những thứ khác như NCA, NAX, XCI, hoặc NSP. Thư mục ROM đã giải nén có thể thiếu các biểu tượng, metadata, và hỗ trợ cập nhật.<br><br>Để hiểu thêm về các định dạng khác nhau của Switch mà yuzu hỗ trợ, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>vui lòng kiểm tra wiki của chúng tôi</a>. Thông báo này sẽ không hiển thị lại lần sau. - - + + Error while loading ROM! Lỗi khi nạp ROM! - + The ROM format is not supported. Định dạng ROM này không được hỗ trợ. - + An error occurred initializing the video core. Đã xảy ra lỗi khi khởi tạo lõi video. @@ -5669,7 +5889,7 @@ Vui lòng vào Cấu hình -> Hệ thống -> Mạng và thực hiện l yuzu đã gặp lỗi khi chạy lõi video. Điều này thường xảy ra do phiên bản driver GPU đã cũ, bao gồm cả driver tích hợp. Vui lòng xem nhật ký để biết thêm chi tiết. Để biết thêm thông tin về cách truy cập nhật ký, vui lòng xem trang sau: <a href='https://yuzu-emu.org/help/reference/log-files/'>Cách tải lên tập tin nhật ký</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Lỗi khi nạp ROM! %1 @@ -5680,1027 +5900,913 @@ Vui lòng vào Cấu hình -> Hệ thống -> Mạng và thực hiện l %1<br>Vui lòng tuân theo <a href='https://yuzu-emu.org/help/quickstart/'>hướng dẫn nhanh của yuzu</a> để trích xuất lại các tập tin của bạn.<br>Bạn có thể tham khảo yuzu wiki</a> hoặc yuzu Discord</a>để được hỗ trợ. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Đã xảy ra lỗi không xác định. Hãy xem nhật ký để biết thêm chi tiết. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Đang đóng phần mềm... - + Save Data Dữ liệu save - + Mod Data Dữ liệu mod - + Error Opening %1 Folder Lỗi khi mở thư mục %1 - - + + Folder does not exist! Thư mục này không tồn tại! - Error Opening Transferable Shader Cache - Lỗi khi mở bộ nhớ đệm shader chuyển được + Lỗi khi mở bộ nhớ đệm shader chuyển được - Failed to create the shader cache directory for this title. - Thất bại khi tạo thư mục bộ nhớ đệm shader cho title này. + Thất bại khi tạo thư mục bộ nhớ đệm shader cho title này. - Error Removing Contents - Lỗi khi loại bỏ nội dung + Lỗi khi loại bỏ nội dung - Error Removing Update - Lỗi khi loại bỏ bản cập nhật + Lỗi khi loại bỏ bản cập nhật - Error Removing DLC - Lỗi khi loại bỏ DLC + Lỗi khi loại bỏ DLC - + Remove Installed Game Contents? Loại bỏ nội dung game đã cài đặt? - + Remove Installed Game Update? Loại bỏ bản cập nhật game đã cài đặt? - + Remove Installed Game DLC? Loại bỏ DLC game đã cài đặt? - + Remove Entry Xoá mục - - - - - - Successfully Removed - Loại bỏ thành công + Loại bỏ thành công - Successfully removed the installed base game. - Loại bỏ thành công base game đã cài đặt. + Loại bỏ thành công base game đã cài đặt. - The base game is not installed in the NAND and cannot be removed. - Base game không được cài đặt trong NAND và không thể loại bỏ. + Base game không được cài đặt trong NAND và không thể loại bỏ. - Successfully removed the installed update. - Loại bỏ thành công bản cập nhật đã cài đặt. + Loại bỏ thành công bản cập nhật đã cài đặt. - There is no update installed for this title. - Không có bản cập nhật nào được cài đặt cho title này. + Không có bản cập nhật nào được cài đặt cho title này. - There are no DLC installed for this title. - Không có DLC nào được cài đặt cho title này. + Không có DLC nào được cài đặt cho title này. - Successfully removed %1 installed DLC. - Loại bỏ thành công %1 DLC đã cài đặt. + Loại bỏ thành công %1 DLC đã cài đặt. - + Delete OpenGL Transferable Shader Cache? Xoá bộ nhớ đệm shader OpenGL chuyển được? - + Delete Vulkan Transferable Shader Cache? Xoá bộ nhớ đệm shader Vulkan chuyển được? - + Delete All Transferable Shader Caches? Xoá tất cả bộ nhớ đệm shader chuyển được? - + Remove Custom Game Configuration? Loại bỏ cấu hình game tuỳ chỉnh? - + Remove Cache Storage? Loại bỏ bộ nhớ đệm? - + Remove File Loại bỏ tập tin - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Lỗi khi loại bỏ bộ nhớ đệm shader chuyển được + Lỗi khi loại bỏ bộ nhớ đệm shader chuyển được - - A shader cache for this title does not exist. - Bộ nhớ đệm shader cho title này không tồn tại. + Bộ nhớ đệm shader cho title này không tồn tại. - Successfully removed the transferable shader cache. - Thành công loại bỏ bộ nhớ đệm shader chuyển được. + Thành công loại bỏ bộ nhớ đệm shader chuyển được. - Failed to remove the transferable shader cache. - Thất bại khi xoá bộ nhớ đệm shader chuyển được. + Thất bại khi xoá bộ nhớ đệm shader chuyển được. - Error Removing Vulkan Driver Pipeline Cache - Lỗi khi xoá bộ nhớ đệm pipeline Vulkan + Lỗi khi xoá bộ nhớ đệm pipeline Vulkan - Failed to remove the driver pipeline cache. - Thất bại khi xoá bộ nhớ đệm pipeline của driver. + Thất bại khi xoá bộ nhớ đệm pipeline của driver. - - Error Removing Transferable Shader Caches - Lỗi khi loại bỏ bộ nhớ đệm shader chuyển được + Lỗi khi loại bỏ bộ nhớ đệm shader chuyển được - Successfully removed the transferable shader caches. - Thành công loại bỏ tất cả bộ nhớ đệm shader chuyển được. + Thành công loại bỏ tất cả bộ nhớ đệm shader chuyển được. - Failed to remove the transferable shader cache directory. - Thất bại khi loại bỏ thư mục bộ nhớ đệm shader. + Thất bại khi loại bỏ thư mục bộ nhớ đệm shader. - - Error Removing Custom Configuration - Lỗi khi loại bỏ cấu hình tuỳ chỉnh + Lỗi khi loại bỏ cấu hình tuỳ chỉnh - A custom configuration for this title does not exist. - Cấu hình tuỳ chỉnh cho title này không tồn tại. + Cấu hình tuỳ chỉnh cho title này không tồn tại. - Successfully removed the custom game configuration. - Loại bỏ thành công cấu hình game tuỳ chỉnh. + Loại bỏ thành công cấu hình game tuỳ chỉnh. - Failed to remove the custom game configuration. - Thất bại khi xoá cấu hình game tuỳ chỉnh. + Thất bại khi xoá cấu hình game tuỳ chỉnh. - - + + RomFS Extraction Failed! Giải nén RomFS không thành công! - + There was an error copying the RomFS files or the user cancelled the operation. Đã xảy ra lỗi khi sao chép các tập tin RomFS hoặc người dùng đã hủy bỏ hoạt động này. - + Full Đầy đủ - + Skeleton Khung - + Select RomFS Dump Mode Chọn chế độ trích xuất RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Vui lòng chọn cách mà bạn muốn RomFS được trích xuất.<br>Chế độ Đầy đủ sẽ sao chép toàn bộ tập tin vào một thư mục mới trong khi <br>chế độ Khung chỉ tạo cấu trúc thư mục. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Không đủ bộ nhớ trống tại %1 để trích xuất RomFS. Hãy giải phóng bộ nhớ hoặc chọn một thư mục trích xuất khác tại Giả lập > Cấu hình > Hệ thống > Hệ thống tập tin > Thư mục trích xuất gốc - + Extracting RomFS... Giải nén RomFS... - - - - - + + Cancel Hủy bỏ - + RomFS Extraction Succeeded! Giải nén RomFS thành công! - - - + The operation completed successfully. Các hoạt động đã hoàn tất thành công. - Integrity verification couldn't be performed! - Không thể thực hiện kiểm tra tính toàn vẹn! + Không thể thực hiện kiểm tra tính toàn vẹn! - File contents were not checked for validity. - Chưa kiểm tra sự hợp lệ của nội dung tập tin. + Chưa kiểm tra sự hợp lệ của nội dung tập tin. - - Verifying integrity... - Đang kiểm tra tính toàn vẹn... + Đang kiểm tra tính toàn vẹn... - - Integrity verification succeeded! - Kiểm tra tính toàn vẹn thành công! + Kiểm tra tính toàn vẹn thành công! - - Integrity verification failed! - Kiểm tra tính toàn vẹn thất bại! + Kiểm tra tính toàn vẹn thất bại! - File contents may be corrupt. - Nội dung tập tin có thể bị hỏng. + Nội dung tập tin có thể bị hỏng. - - - - Create Shortcut - Tạo lối tắt + Tạo lối tắt - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Thành công tạo lối tắt tại %1 + Thành công tạo lối tắt tại %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Việc này sẽ tạo một lối tắt tới AppImage hiện tại. Điều này có thể không hoạt động tốt nếu bạn cập nhật. Tiếp tục? + Việc này sẽ tạo một lối tắt tới AppImage hiện tại. Điều này có thể không hoạt động tốt nếu bạn cập nhật. Tiếp tục? - - Failed to create a shortcut to %1 + Create Icon + Tạo biểu tượng + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Không thể tạo tập tin biểu tượng. Đường dẫn "%1" không tồn tại và không thể tạo. + + + + Warning: Outdated Game Format - - Create Icon - Tạo biểu tượng + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Không thể tạo tập tin biểu tượng. Đường dẫn "%1" không tồn tại và không thể tạo. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Lỗi khi mở %1 - + Select Directory Chọn thư mục - + Properties Thuộc tính - + The game properties could not be loaded. Không thể tải thuộc tính của game. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Thực thi Switch (%1);;Tất cả tập tin (*.*) - + Load File Nạp tập tin - + Open Extracted ROM Directory Mở thư mục ROM đã giải nén - + Invalid Directory Selected Danh mục đã chọn không hợp lệ - + The directory you have selected does not contain a 'main' file. Thư mục mà bạn đã chọn không chứa tập tin 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Những tập tin Switch cài được (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Cài đặt tập tin - + %n file(s) remaining %n tập tin còn lại + %n tập tin còn lại - + Installing file "%1"... Đang cài đặt tập tin "%1"... - - + + Install Results Kết quả cài đặt - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Để tránh xung đột có thể xảy ra, chúng tôi không khuyến khích người dùng cài đặt base game vào NAND. Vui lòng, chỉ sử dụng tính năng này để cài đặt các bản cập nhật và DLC. - + %n file(s) were newly installed - %n tập tin đã được cài đặt mới - + %n tập tin đã được cài đặt mới + %n tập tin đã được cài đặt mới - + %n file(s) were overwritten - %n tập tin đã được ghi đè - + %n tập tin đã được ghi đè + %n tập tin đã được ghi đè - + %n file(s) failed to install - %n tập tin thất bại khi cài đặt - + %n tập tin thất bại khi cài đặt + %n tập tin thất bại khi cài đặt - + System Application Ứng dụng hệ thống - + System Archive Bản lưu trữ của hệ thống - + System Application Update Cập nhật ứng dụng hệ thống - + Firmware Package (Type A) Gói firmware (Loại A) - + Firmware Package (Type B) Gói firmware (Loại B) - + Game Game - + Game Update Cập nhật game - + Game DLC DLC game - + Delta Title Title Delta - + Select NCA Install Type... Chọn cách cài đặt NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Vui lòng chọn loại title mà bạn muốn cài đặt NCA này: (Trong hầu hết trường hợp, chọn mặc định 'Game' là tốt nhất.) - + Failed to Install Cài đặt thất bại - + The title type you selected for the NCA is invalid. Loại title mà bạn đã chọn cho NCA không hợp lệ. - + File not found Không tìm thấy tập tin - + File "%1" not found Không tìm thấy tập tin "%1" - + OK OK - - + + Hardware requirements not met Yêu cầu phần cứng không được đáp ứng - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Hệ thống của bạn không đáp ứng yêu cầu phần cứng được đề xuất. Báo cáo độ tương thích đã bị vô hiệu hoá. - + Missing yuzu Account Thiếu tài khoản yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Để gửi trường hợp thử nghiệm game tương thích, bạn phải liên kết tài khoản yuzu.<br><br/>Để liên kết tải khoản yuzu của bạn, hãy đến Giả lập &gt; Cấu hình &gt; Web. - + Error opening URL Lỗi khi mở URL - + Unable to open the URL "%1". Không thể mở URL "%1". - + TAS Recording Ghi lại TAS - + Overwrite file of player 1? Ghi đè tập tin của người chơi 1? - + Invalid config detected Đã phát hiện cấu hình không hợp lệ - + Handheld controller can't be used on docked mode. Pro controller will be selected. Tay cầm handheld không thể được sử dụng trong chế độ docked. Pro Controller sẽ được chọn. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo hiện tại đã được loại bỏ - + Error Lỗi - - + + The current game is not looking for amiibos Game hiện tại không tìm kiếm amiibos - + Amiibo File (%1);; All Files (*.*) Tập tin Amiibo (%1);; Tất cả tập tin (*.*) - + Load Amiibo Nạp Amiibo - + Error loading Amiibo data Lỗi khi nạp dữ liệu Amiibo - + The selected file is not a valid amiibo Tập tin đã chọn không phải là amiibo hợp lệ - + The selected file is already on use Tập tin đã chọn đã được sử dụng - + An unknown error occurred Đã xảy ra lỗi không xác định - - Verification failed for the following files: %1 - Kiểm tra những tập tin sau thất bại: + Kiểm tra những tập tin sau thất bại: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Applet tay cầm - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Chụp ảnh màn hình - + PNG Image (*.png) Hình ảnh PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Trạng thái TAS: Đang chạy %1/%2 - + TAS state: Recording %1 Trạng thái TAS: Đang ghi %1 - + TAS state: Idle %1/%2 Trạng thái TAS: Đang chờ %1/%2 - + TAS State: Invalid Trạng thái TAS: Không hợp lệ - + &Stop Running &Dừng chạy - + &Start &Bắt đầu - + Stop R&ecording Dừng G&hi - + R&ecord G&hi - + Building: %n shader(s) Đang dựng: %n shader + Đang dựng: %n shader - + Scale: %1x %1 is the resolution scaling factor Tỉ lệ thu phóng: %1x - + Speed: %1% / %2% Tốc độ: %1% / %2% - + Speed: %1% Tốc độ: %1% @@ -6709,54 +6815,54 @@ Would you like to download it? Game: %1 FPS (Đã mở khoá) - + Game: %1 FPS Game: %1 FPS - + Frame: %1 ms Khung hình: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA NO AA - + VOLUME: MUTE ÂM LƯỢNG: TẮT TIẾNG - + VOLUME: %1% Volume percentage (e.g. 50%) ÂM LƯỢNG: %1% - + Derivation Components Missing Thiếu các thành phần chuyển hoá - + Select RomFS Dump Target Chọn thư mục để trích xuất RomFS - + Please select which RomFS you would like to dump. Vui lòng chọn RomFS mà bạn muốn trích xuất. @@ -6769,7 +6875,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Bạn có chắc rằng muốn dừng giả lập? Bất kì tiến trình nào chưa được lưu sẽ bị mất. @@ -6782,102 +6888,102 @@ Would you like to bypass this and exit anyway? Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? - + None Không có - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + ScaleForce ScaleForce - + Area - + Docked Docked - + Handheld Handheld - + Normal Bình thường - + High Cao - + Extreme Cực đại - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6885,13 +6991,13 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GRenderWindow - - + + OpenGL not available! OpenGL không khả dụng! - + OpenGL shared contexts are not supported. Các ngữ cảnh OpenGL chung không được hỗ trợ. @@ -6900,33 +7006,33 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? yuzu không được biên dịch với hỗ trợ OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Lỗi khi khởi tạo OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPU của bạn có thể không hỗ trợ OpenGL, hoặc bạn không có driver đồ hoạ mới nhất. - + Error while initializing OpenGL 4.6! Lỗi khi khởi tạo OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPU của bạn có thể không hỗ trợ OpenGL 4.6, hoặc bạn không có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPU của bạn có thể không hỗ trợ một hoặc nhiều tiện ích OpenGL cần thiết. Vui lòng đảm bảo bạn có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1<br><br>Tiện ích không hỗ trợ:<br>%2 @@ -6934,128 +7040,128 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameList - + Favorite Ưa thích - + Start Game Bắt đầu game - + Start Game without Custom Configuration Bắt đầu game mà không có cấu hình tuỳ chỉnh - + Open Save Data Location Mở vị trí dữ liệu save - + Open Mod Data Location Mở vị trí chứa dữ liệu mod - + Open Transferable Pipeline Cache Mở thư mục chứa bộ nhớ đệm pipeline - + Remove Loại bỏ - + Remove Installed Update Loại bỏ bản cập nhật đã cài - + Remove All Installed DLC Loại bỏ tất cả DLC đã cài đặt - + Remove Custom Configuration Loại bỏ cấu hình tuỳ chỉnh - + Remove Play Time Data - + Remove Cache Storage Loại bỏ bộ nhớ đệm - + Remove OpenGL Pipeline Cache Loại bỏ bộ nhớ đệm pipeline OpenGL - + Remove Vulkan Pipeline Cache Loại bỏ bộ nhớ đệm pipeline Vulkan - + Remove All Pipeline Caches Loại bỏ tất cả bộ nhớ đệm shader - + Remove All Installed Contents Loại bỏ tất cả nội dung đã cài đặt - + Dump RomFS Trích xuất RomFS - + Dump RomFS to SDMC Trích xuất RomFS tới SDMC - + Verify Integrity Kiểm tra tính toàn vẹn - + Copy Title ID to Clipboard Sao chép ID title vào bộ nhớ tạm - + Navigate to GameDB entry Điều hướng đến mục GameDB - + Create Shortcut Tạo lối tắt - + Add to Desktop Thêm vào desktop - + Add to Applications Menu Thêm vào menu ứng dụng - + Configure Game @@ -7064,62 +7170,62 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? Thuộc tính - + Scan Subfolders Quét các thư mục con - + Remove Game Directory Loại bỏ thư mục game - + ▲ Move Up ▲ Di chuyển lên - + ▼ Move Down ▼ Di chuyển xuống - + Open Directory Location Mở vị trí thư mục - + Clear Xóa - + Name Tên - + Compatibility Độ tương thích - + Add-ons Add-ons - + File type Loại tập tin - + Size Kích thước - + Play time @@ -7127,62 +7233,62 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameListItemCompat - + Ingame Trong game - + Game starts, but crashes or major glitches prevent it from being completed. Game khởi động, nhưng bị crash hoặc lỗi nghiêm trọng dẫn đến việc không thể hoàn thành nó. - + Perfect Hoàn hảo - + Game can be played without issues. Game có thể chơi mà không gặp vấn đề. - + Playable Có thể chơi - + Game functions with minor graphical or audio glitches and is playable from start to finish. Game hoạt động với lỗi hình ảnh hoặc âm thanh nhẹ và có thể chơi từ đầu tới cuối. - + Intro/Menu Phần mở đầu/Menu - + Game loads, but is unable to progress past the Start Screen. Game đã tải, nhưng không thể qua được màn hình bắt đầu. - + Won't Boot Không khởi động - + The game crashes when attempting to startup. Game crash khi đang khởi động. - + Not Tested Chưa ai thử - + The game has not yet been tested. Game này chưa được thử nghiệm. @@ -7190,7 +7296,7 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameListPlaceholder - + Double-click to add a new folder to the game list Nhấp đúp chuột để thêm một thư mục mới vào danh sách game @@ -7198,19 +7304,20 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameListSearchField - + %1 of %n result(s) %1 trong %n kết quả + %1 trong %n kết quả - + Filter: Lọc: - + Enter pattern to filter Nhập mẫu để lọc @@ -7292,7 +7399,7 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7306,190 +7413,190 @@ Tin nhắn gỡ lỗi: Hotkeys - + Audio Mute/Unmute Tắt/Bật tiếng - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Cửa sổ chính - + Audio Volume Down Giảm âm lượng - + Audio Volume Up Tăng âm lượng - + Capture Screenshot Chụp ảnh màn hình - + Change Adapting Filter Thay đổi bộ lọc điều chỉnh - + Change Docked Mode Thay đổi chế độ docked - + Change GPU Accuracy Thay đổi độ chính xác GPU - + Configure Cấu hình - + Configure Current Game - + Continue/Pause Emulation Tiếp tục/Tạm dừng giả lập - + Exit Fullscreen Thoát chế độ toàn màn hình + + + Exit Eden + + Exit yuzu Thoát yuzu - - Exit eden - - - - + Fullscreen Toàn màn hình - + Load File Nạp tập tin - + Load/Remove Amiibo Nạp/Loại bỏ Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Khởi động lại giả lập - + Stop Emulation Dừng giả lập - + TAS Record Ghi lại TAS - + TAS Reset Đặt lại TAS - + TAS Start/Stop Bắt đầu/Dừng TAS - + Toggle Filter Bar Hiện/Ẩn thanh lọc - + Toggle Framerate Limit Bật/Tắt giới hạn tốc độ khung hình - + Toggle Mouse Panning Bật/Tắt lia chuột - + Toggle Renderdoc Capture - + Toggle Status Bar Hiện/Ẩn thanh trạng thái @@ -7497,22 +7604,22 @@ Tin nhắn gỡ lỗi: InstallDialog - + Please confirm these are the files you wish to install. Vui lòng xác nhận đây là những tập tin bạn muốn cài. - + Installing an Update or DLC will overwrite the previously installed one. Cài đặt một bản cập nhật hoặc DLC mới sẽ thay thế những bản cũ đã cài trước đó. - + Install Cài đặt - + Install Files to NAND Cài đặt tập tin vào NAND @@ -7520,7 +7627,7 @@ Tin nhắn gỡ lỗi: LimitableInputDialog - + The text can't contain any of the following characters: %1 Văn bản không được chứa bất kỳ ký tự sau đây: @@ -7667,152 +7774,207 @@ Tin nhắn gỡ lỗi: &Tập tin gần đây - + + Open &Eden Folders + + + + &Emulation &Giả lập - + &View &Xem - + &Reset Window Size &Đặt lại kích thước cửa sổ - + &Debugging &Gỡ lỗi - + Reset Window Size to &720p Đặt lại kích thước cửa sổ về &720p - + Reset Window Size to 720p Đặt lại kích thước cửa sổ về 720p - + Reset Window Size to &900p Đặt lại kích thước cửa sổ về &900p - + Reset Window Size to 900p Đặt lại kích thước cửa sổ về 900p - + Reset Window Size to &1080p Đặt lại kích thước cửa sổ về &1080p - + Reset Window Size to 1080p Đặt lại kích thước cửa sổ về 1080p - + &Multiplayer &Nhiều người chơi - + &Tools &Công cụ - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Trợ giúp - + &Install Files to NAND... &Cài đặt tập tin vào NAND... - + L&oad File... N&ạp tập tin... - + Load &Folder... Nạp &thư mục... - + E&xit T&hoát - + &Pause &Tạm dừng - + &Stop &Dừng - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7821,97 +7983,97 @@ Tin nhắn gỡ lỗi: &Thông tin về yuzu - + Single &Window Mode Chế độ &cửa sổ đơn - + Con&figure... Cấu &hình... - + Ctrl+, - + Display D&ock Widget Headers Hiển thị tiêu đề công cụ D&ock - + Show &Filter Bar Hiện thanh &lọc - + Show &Status Bar Hiện thanh &trạng thái - + Show Status Bar Hiện thanh trạng thái - + &Browse Public Game Lobby &Duyệt phòng game công khai - + &Create Room &Tạo phòng - + &Leave Room &Rời phòng - + &Direct Connect to Room &Kết nối trực tiếp tới phòng - + &Show Current Room &Hiện phòng hiện tại - + F&ullscreen T&oàn màn hình - + &Restart &Khởi động lại - + Load/Remove &Amiibo... Nạp/Loại bỏ &Amiibo... - + &Report Compatibility &Báo cáo độ tương thích - + Open &Mods Page Mở trang &mods - + Open &Quickstart Guide Mở &Hướng dẫn nhanh - + &FAQ &FAQ @@ -7920,77 +8082,82 @@ Tin nhắn gỡ lỗi: Mở thư mục &yuzu - + &Capture Screenshot &Chụp ảnh màn hình - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... &Cấu hình TAS... - + Configure C&urrent Game... Cấu hình game h&iện tại... - + &Start &Bắt đầu - + &Reset &Đặt lại - + R&ecord G&hi lại - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7998,26 +8165,36 @@ Tin nhắn gỡ lỗi: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8077,37 +8254,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Tình trạng kết nối hiện tại - + Not Connected. Click here to find a room! Không kết nối. Nhấp vào đây để tìm một phòng! - + Not Connected Không kết nối - + Connected Đã kết nối - + New Messages Received Đã nhận được tin nhắn mới - + Error Lỗi - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Không thể cập nhật thông tin phòng. Vui lòng kiểm tra kết nối Internet của bạn và thử tạo phòng lại. @@ -8299,56 +8476,56 @@ p, li { white-space: pre-wrap; } Hiện không chơi game - + Installed SD Titles Các title đã cài đặt trên thẻ SD - + Installed NAND Titles Các title đã cài đặt trên NAND - + System Titles Titles hệ thống - + Add New Game Directory Thêm thư mục game - + Favorites Ưa thích - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [chưa đặt] @@ -8359,14 +8536,14 @@ p, li { white-space: pre-wrap; } Mũ %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Trục %1%2 @@ -8377,357 +8554,357 @@ p, li { white-space: pre-wrap; } Nút %1 - - - - - - + + + + + + [unknown] [không xác định] - - - + + + Left Trái - - - + + + Right Phải - - - + + + Down Xuống - - - + + + Up Lên - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Bắt đầu - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Tròn - - + + Cross X - - + + Square Vuông - - + + Triangle Tam giác - - + + Share Chia sẻ - - + + Options Tuỳ chọn - - + + [undefined] [không xác định] - + %1%2 %1%2 - - + + [invalid] [không hợp lệ] - - + + %1%2Hat %3 %1%2Mũ %3 - - - + + + %1%2Axis %3 %1%2Trục %3 - - + + %1%2Axis %3,%4,%5 %1%2Trục %3,%4,%5 - - + + %1%2Motion %3 %1%2Chuyển động %3 - - + + %1%2Button %3 %1%2Nút %3 - - + + [unused] [không sử dụng] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Cần L - + Stick R Cần R - + Plus Cộng - + Minus Trừ - - + + Home Home - + Capture Chụp - + Touch Cảm ứng - + Wheel Indicates the mouse wheel Con lăn - + Backward Lùi - + Forward Tiến - + Task Nhiệm vụ - + Extra Thêm - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Mũ %4 - - + + %1%2%3Axis %4 %1%2%3Trục %4 - - + + %1%2%3Button %4 %1%2%3Nút %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8845,6 +9022,300 @@ p, li { white-space: pre-wrap; } Bạn có muốn khôi phục amiibo này không? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + Hủy bỏ + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + Kiểm tra những tập tin sau thất bại: + +%1 + + + + + Verifying integrity... + Đang kiểm tra tính toàn vẹn... + + + + + Integrity verification succeeded! + Kiểm tra tính toàn vẹn thành công! + + + + + The operation completed successfully. + Các hoạt động đã hoàn tất thành công. + + + + + Integrity verification failed! + Kiểm tra tính toàn vẹn thất bại! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Lỗi khi loại bỏ nội dung + + + + Error Removing Update + Lỗi khi loại bỏ bản cập nhật + + + + Error Removing DLC + Lỗi khi loại bỏ DLC + + + + The base game is not installed in the NAND and cannot be removed. + Base game không được cài đặt trong NAND và không thể loại bỏ. + + + + There is no update installed for this title. + Không có bản cập nhật nào được cài đặt cho title này. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Loại bỏ thành công + + + + Successfully removed %1 installed DLC. + Loại bỏ thành công %1 DLC đã cài đặt. + + + + + Error Removing Transferable Shader Cache + Lỗi khi loại bỏ bộ nhớ đệm shader chuyển được + + + + + A shader cache for this title does not exist. + Bộ nhớ đệm shader cho title này không tồn tại. + + + + Successfully removed the transferable shader cache. + Thành công loại bỏ bộ nhớ đệm shader chuyển được. + + + + Failed to remove the transferable shader cache. + Thất bại khi xoá bộ nhớ đệm shader chuyển được. + + + + Error Removing Vulkan Driver Pipeline Cache + Lỗi khi xoá bộ nhớ đệm pipeline Vulkan + + + + Failed to remove the driver pipeline cache. + Thất bại khi xoá bộ nhớ đệm pipeline của driver. + + + + + Error Removing Transferable Shader Caches + Lỗi khi loại bỏ bộ nhớ đệm shader chuyển được + + + + Successfully removed the transferable shader caches. + Thành công loại bỏ tất cả bộ nhớ đệm shader chuyển được. + + + + Failed to remove the transferable shader cache directory. + Thất bại khi loại bỏ thư mục bộ nhớ đệm shader. + + + + + Error Removing Custom Configuration + Lỗi khi loại bỏ cấu hình tuỳ chỉnh + + + + A custom configuration for this title does not exist. + Cấu hình tuỳ chỉnh cho title này không tồn tại. + + + + Successfully removed the custom game configuration. + Loại bỏ thành công cấu hình game tuỳ chỉnh. + + + + Failed to remove the custom game configuration. + Thất bại khi xoá cấu hình game tuỳ chỉnh. + + + + Reset Metadata Cache + Đặt lại bộ nhớ đệm metadata + + + + The metadata cache is already empty. + Bộ nhớ đệm metadata trống. + + + + The operation completed successfully. + Các hoạt động đã hoàn tất thành công. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Bộ nhớ đệm metadata không thể xoá. Nó có thể đang được sử dụng hoặc không tồn tại. + + + + Create Shortcut + Tạo lối tắt + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Thành công tạo lối tắt tại %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Việc này sẽ tạo một lối tắt tới AppImage hiện tại. Điều này có thể không hoạt động tốt nếu bạn cập nhật. Tiếp tục? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Tạo biểu tượng + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Không thể tạo tập tin biểu tượng. Đường dẫn "%1" không tồn tại và không thể tạo. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9140,7 +9611,7 @@ Vui lòng thử lại hoặc liên hệ nhà phát triển của phần mềm. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9148,7 +9619,7 @@ Vui lòng thử lại hoặc liên hệ nhà phát triển của phần mềm. - + Users Người dùng @@ -9272,7 +9743,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Ngăn xếp gọi @@ -9280,12 +9751,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread chờ đợi bởi vì không có luồng @@ -9293,102 +9764,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable có thể chạy - + paused đã tạm dừng - + sleeping ngủ - + waiting for IPC reply đang đợi IPC phản hồi - + waiting for objects đang đợi đối tượng - + waiting for condition variable đang chờ biến điều kiện - + waiting for address arbiter chờ đợi địa chỉ người đứng giữa - + waiting for suspend resume đang đợi để tạm dừng và tiếp tục - + waiting đang chờ - + initialized đã khởi tạo - + terminated đã chấm dứt - + unknown không xác định - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal lý tưởng - + core %1 lõi %1 - + processor = %1 bộ xử lý = %1 - + affinity mask = %1 che đậy tánh giống nhau = %1 - + thread id = %1 id luồng = %1 - + priority = %1(current) / %2(normal) quyền ưu tiên = %1(hiện tại) / %2(bình thường) - + last running ticks = %1 các tick chạy cuối cùng = %1 @@ -9396,7 +9867,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread đợi vì luồng @@ -9404,7 +9875,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Cây Đợi diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 6277ea7e03..2b31f1a630 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... Đang giao tiếp với máy chủ... - + Cancel Huỷ - + Touch the top left corner <br>of your touchpad. Hãy chạm vào góc trên cùng<br>bên trái trên touchpad của bạn. - + Now touch the bottom right corner <br>of your touchpad. Giờ hãy chạm vào góc dưới cùng<br>bên phải trên touchpad của bạn. - + Configuration completed! Đã hoàn thành quá trình thiết lập! - + OK OK @@ -397,439 +397,157 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - - Amiibo editor - - - - - Controller configuration - - - - - Data erase - - - - + Error Lỗi - - Net connect - - - - - Player select - - - - + Software keyboard Bàn phím mềm - - Mii Edit - - - - - Online web - - - - - Shop - - - - - Photo viewer - - - - - Offline web - - - - - Login share - - - - - Wifi web auth - - - - - My page - - - - + Output Engine: Đầu ra hệ thống: - + Output Device: Đầu ra thiết bị: - + Input Device: Đầu vào thiết bị: - - Mute audio - - - - + Volume: Âm lượng: - + Mute audio when in background Tắt âm thanh khi chạy nền - + Multicore CPU Emulation Giả lập CPU đa nhân - - This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. -This is mainly a debug option and shouldn’t be disabled. - - - - - Memory Layout - - - - - Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. -It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. -Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. - - - - + Limit Speed Percent Giới hạn phần trăm tốc độ - - Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. -200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. -Disabling it means unlocking the framerate to the maximum your PC can reach. - - - - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: Độ chính xác - - This setting controls the accuracy of the emulated CPU. -Don't change this unless you know what you are doing. - - - - - - Backend: - - - - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) Không dùng FMA (tăng hiệu suất cho các dòng CPU không hỗ trợ FMA) - - This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. - - - - + Faster FRSQRTE and FRECPE Chạy FRSQRTE và FRECPE nhanh hơn - - This option improves the speed of some approximate floating-point functions by using less accurate native approximations. - - - - + Faster ASIMD instructions (32 bits only) Các lệnh ASIMD nhanh hơn (chỉ áp dụng cho 32 bit) - - This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. - - - - + Inaccurate NaN handling Xử lí NaN gặp lỗi - - This option improves speed by removing NaN checking. -Please note this also reduces accuracy of certain floating-point instructions. - - - - + Disable address space checks Tắt kiểm tra không gian địa chỉ - - This option improves speed by eliminating a safety check before every memory read/write in guest. -Disabling it may allow a game to read/write the emulator's memory. - - - - + Ignore global monitor Bỏ qua màn hình chung - - This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. -Please note this may result in deadlocks and other race conditions. - - - - + API: API đồ hoạ: - - Switches between the available graphics APIs. -Vulkan is recommended in most cases. - - - - + Device: Thiết bị đồ hoạ: - - This setting selects the GPU to use with the Vulkan backend. - - - - + Shader Backend: Backend shader: - - The shader backend to use for the OpenGL renderer. -GLSL is the fastest in performance and the best in rendering accuracy. -GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. -SPIR-V compiles the fastest, but yields poor results on most GPU drivers. - - - - + Resolution: Độ phân giải: - - Forces the game to render at a different resolution. -Higher resolutions require much more VRAM and bandwidth. -Options lower than 1X can cause rendering issues. - - - - + Window Adapting Filter: Bộ lọc điều chỉnh cửa sổ: - + FSR Sharpness: Độ sắc nét FSR: - - Determines how sharpened the image will look while using FSR’s dynamic contrast. - - - - + Anti-Aliasing Method: Phương pháp khử răng cưa: - - The anti-aliasing method to use. -SMAA offers the best quality. -FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. - - - - + Fullscreen Mode: Chế độ Toàn màn hình: - - The method used to render the window in fullscreen. -Borderless offers the best compatibility with the on-screen keyboard that some games request for input. -Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - - - - + Aspect Ratio: Tỉ lệ khung hình: - - Stretches the game to fit the specified aspect ratio. -Switch games only support 16:9, so custom game mods are required to get other ratios. -Also controls the aspect ratio of captured screenshots. - - - - + Use disk pipeline cache Dùng bộ nhớ đệm pipeline trên ổ cứng - - Allows saving shaders to storage for faster loading on following game boots. -Disabling it is only intended for debugging. - - - - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation Dùng giả lập GPU không đồng bộ - - Uses an extra CPU thread for rendering. -This option should always remain enabled. - - - - + NVDEC emulation: Giả lập NVDEC - - Specifies how videos should be decoded. -It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). -In most cases, GPU decoding provides the best performance. - - - - - ASTC Decoding Method: - - - - - This option controls how ASTC textures should be decoded. -CPU: Use the CPU for decoding, slowest but safest method. -GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. -CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding -stuttering at the cost of rendering issues while the texture is being decoded. - - - - - ASTC Recompression Method: - - - - - Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. -This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. - - - - - VRAM Usage Mode: - - - - - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - - - - + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -840,62 +558,34 @@ Mailbox có thể có độ trễ thấp hơn FIFO và không gây hiện tượ Immediate (không đồng bộ hóa) chỉ hiển thị những gì đã có và có thể gây hiện tượng xé hình. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ dành cho Vulkan) - - Slightly improves performance by moving presentation to a separate CPU thread. - - - - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Bộ lọc góc nghiêng: - - Controls the quality of texture rendering at oblique angles. -It’s a light setting and safe to set at 16x on most GPUs. - - - - Accuracy Level: - Độ chính xác: + Độ chính xác: - - GPU emulation accuracy. -Most games render fine with Normal, but High is still required for some. -Particles tend to only render correctly with High accuracy. -Extreme should only be used for debugging. -This option can be changed while playing. -Some games may require booting on high to render properly. - - - - + Use asynchronous shader building (Hack) Dùng tính năng dựng shader bất đồng bộ (Hack) - - - Enables asynchronous shader compilation, which may reduce shader stutter. -This feature is experimental. - - Use Fast GPU Time (Hack) Tăng Tốc Thời Gian GPU (Hack) @@ -905,1021 +595,1428 @@ This feature is experimental. Bật chế độ Thời gian GPU nhanh. Tùy chọn này sẽ buộc hầu hết các game chạy ở độ phân giải gốc cao nhất của chúng. - + Use Vulkan pipeline cache Dùng Vulkan pipeline cache - + + Enable Reactive Flushing + Bật xả tương ứng + + + + Sync to framerate of video playback + Đồng bộ hóa với tốc độ khung hình khi phát video + + + + Run the game at normal speed during video playback, even when the framerate is unlocked. + Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. + + + + Barrier feedback loops + Vòng lặp phản hồi rào cản + + + + Improves rendering of transparency effects in specific games. + Cải thiện hiệu quả hiển thị của hiệu ứng trong suốt trong một số trò chơi. + + + + RNG Seed + Hạt giống RNG + + + + Device Name + Tên thiết bị + + + + Note: this can be overridden when region setting is auto-select + Chú ý: cái này có thể ghi đè khi cài đặt quốc gia là chọn tự động + + + + Region: + Vùng: + + + + Time Zone: + Múi giờ: + + + + Sound Output Mode: + Chế độ đầu ra âm thanh + + + + Prompt for user on game boot + Hiển thị cửa sổ chọn người dùng khi bắt đầu trò chơi + + + + Pause emulation when in background + Tạm dừng giả lập khi chạy nền + + + + Hide mouse on inactivity + Ẩn con trỏ chuột khi không dùng + + + + Disable controller applet + Vô hiệu hoá applet tay cầm + + + + CPU + CPU + + + + Uncompressed (Best quality) + Không nén (Chất lượng tốt nhất) + + + + BC1 (Low quality) + BC1 (Chất lượng thấp) + + + + BC3 (Medium quality) + BC3 (Chất lượng trung bình) + + + + OpenGL + OpenGL + + + + Vulkan + Vulkan + + + + Null + Null + + + + GLSL + GLSL + + + + GLASM (Assembly Shaders, NVIDIA Only) + GLASM (Assembly Shaders, Chỉ Cho NVIDIA) + + + + Normal + Trung bình + + + + High + Khỏe + + + + Extreme + Tối đa + + + + Auto + Tự động + + + + Accurate + Tuyệt đối + + + + Unsafe + Tương đối + + + + Paranoid (disables most optimizations) + Paranoid (vô hiệu hoá hầu hết sự tối ưu) + + + + Borderless Windowed + Cửa sổ không viền + + + + Exclusive Fullscreen + Toàn màn hình + + + + No Video Output + Không Video Đầu Ra + + + + CPU Video Decoding + Giải mã video bằng CPU + + + + GPU Video Decoding (Default) + Giải mã video bằng GPU (Mặc định) + + + + 0.75X (540p/810p) [EXPERIMENTAL] + 0.75X (540p/810p) [THỬ NGHIỆM] + + + + 1X (720p/1080p) + 1X (720p/1080p) + + + + 1.5X (1080p/1620p) [EXPERIMENTAL] + 1.5X (1080p/1620p) [THỬ NGHIỆM] + + + + 2X (1440p/2160p) + 2X (1440p/2160p) + + + + 3X (2160p/3240p) + 3X (2160p/3240p) + + + + 4X (2880p/4320p) + 4X (2880p/4320p) + + + + 5X (3600p/5400p) + 5X (3600p/5400p) + + + + 6X (4320p/6480p) + 6X (4320p/6480p) + + + + 7X (5040p/7560p) + 7X (5040p/7560p) + + + + 8X (5760p/8640p) + 8X (5760p/8640p) + + + + Nearest Neighbor + Nearest Neighbor + + + + Bilinear + Bilinear + + + + Bicubic + Bicubic + + + + Gaussian + ScaleForce + + + + ScaleForce + ScaleForce + + + + AMD FidelityFX™️ Super Resolution + AMD FidelityFX™️ Super Resolution + + + + None + Trống + + + + FXAA + FXAA + + + + SMAA + SMAA + + + + Default (16:9) + Mặc định (16:9) + + + + Force 4:3 + Dùng 4:3 + + + + Force 21:9 + Dùng 21:9 + + + + Force 16:10 + Dung 16:10 + + + + Stretch to Window + Kéo dãn đến cửa sổ phần mềm + + + + Automatic + Tự động + + + + + Default + Mặc định + + + + Amiibo editor + + + + + Controller configuration + + + + + Data erase + + + + + Net connect + + + + + Player select + + + + + Mii Edit + + + + + Online web + + + + + Shop + + + + + Photo viewer + + + + + Offline web + + + + + Login share + + + + + Wifi web auth + + + + + My page + + + + + Mute audio + + + + + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. +This is mainly a debug option and shouldn’t be disabled. + + + + + Memory Layout + + + + + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. +It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. +Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. + + + + + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. +200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. +Disabling it means unlocking the framerate to the maximum your PC can reach. + + + + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + This setting controls the accuracy of the emulated CPU. +Don't change this unless you know what you are doing. + + + + + + Backend: + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. + + + + + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. + + + + + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. + + + + + This option improves speed by removing NaN checking. +Please note this also reduces accuracy of certain floating-point instructions. + + + + + This option improves speed by eliminating a safety check before every memory read/write in guest. +Disabling it may allow a game to read/write the emulator's memory. + + + + + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. +Please note this may result in deadlocks and other race conditions. + + + + + Switches between the available graphics APIs. +Vulkan is recommended in most cases. + + + + + This setting selects the GPU to use with the Vulkan backend. + + + + + The shader backend to use for the OpenGL renderer. +GLSL is the fastest in performance and the best in rendering accuracy. +GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. +SPIR-V compiles the fastest, but yields poor results on most GPU drivers. + + + + + Forces the game to render at a different resolution. +Higher resolutions require much more VRAM and bandwidth. +Options lower than 1X can cause rendering issues. + + + + + Determines how sharpened the image will look while using FSR’s dynamic contrast. + + + + + The anti-aliasing method to use. +SMAA offers the best quality. +FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. + + + + + The method used to render the window in fullscreen. +Borderless offers the best compatibility with the on-screen keyboard that some games request for input. +Exclusive fullscreen may offer better performance and better Freesync/Gsync support. + + + + + Stretches the game to fit the specified aspect ratio. +Switch games only support 16:9, so custom game mods are required to get other ratios. +Also controls the aspect ratio of captured screenshots. + + + + + Allows saving shaders to storage for faster loading on following game boots. +Disabling it is only intended for debugging. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Uses an extra CPU thread for rendering. +This option should always remain enabled. + + + + + Specifies how videos should be decoded. +It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). +In most cases, GPU decoding provides the best performance. + + + + + ASTC Decoding Method: + + + + + This option controls how ASTC textures should be decoded. +CPU: Use the CPU for decoding, slowest but safest method. +GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. +CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely eliminates ASTC decoding +stuttering at the cost of rendering issues while the texture is being decoded. + + + + + ASTC Recompression Method: + + + + + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. +This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. + + + + + VRAM Usage Mode: + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + Slightly improves performance by moving presentation to a separate CPU thread. + + + + + Controls the quality of texture rendering at oblique angles. +It’s a light setting and safe to set at 16x on most GPUs. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Enables asynchronous shader compilation, which may reduce shader stutter. +This feature is experimental. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. - - Enable Reactive Flushing - Bật xả tương ứng - - - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - - Sync to framerate of video playback - Đồng bộ hóa với tốc độ khung hình khi phát video + + RAII + - - Run the game at normal speed during video playback, even when the framerate is unlocked. - Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + - - Barrier feedback loops - Vòng lặp phản hồi rào cản + + Extended Dynamic State + - - Improves rendering of transparency effects in specific games. - Cải thiện hiệu quả hiển thị của hiệu ứng trong suốt trong một số trò chơi. + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + - - RNG Seed - Hạt giống RNG + + Provoking Vertex + - + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + Controls the seed of the random number generator. Mainly used for speedrunning purposes. - - Device Name - Tên thiết bị - - - + The name of the emulated Switch. - + Custom RTC Date: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. - + Language: - - Note: this can be overridden when region setting is auto-select - Chú ý: cái này có thể ghi đè khi cài đặt quốc gia là chọn tự động - - - - Region: - Vùng: - - - + The region of the emulated Switch. - - Time Zone: - Múi giờ: - - - + The time zone of the emulated Switch. - - Sound Output Mode: - Chế độ đầu ra âm thanh - - - + Console Mode: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - - Prompt for user on game boot - Hiển thị cửa sổ chọn người dùng khi bắt đầu trò chơi - - - - Pause emulation when in background - Tạm dừng giả lập khi chạy nền - - - - Fast GPU Time (Hack) + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. + + This setting pauses Eden when focusing other windows. - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. - - Hide mouse on inactivity - Ẩn con trỏ chuột khi không dùng - - - + This setting hides the mouse after 2.5s of inactivity. - - Disable controller applet - Vô hiệu hoá applet tay cầm - - - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Custom frontend - + Real applet - + Never - + On Load - + Always - - CPU - CPU - - - + GPU - + CPU Asynchronous - - Uncompressed (Best quality) - Không nén (Chất lượng tốt nhất) - - - - BC1 (Low quality) - BC1 (Chất lượng thấp) - - - - BC3 (Medium quality) - BC3 (Chất lượng trung bình) - - - + Conservative - + Aggressive - - OpenGL - OpenGL - - - - Vulkan - Vulkan - - - - Null - Null - - - - GLSL - GLSL - - - - GLASM (Assembly Shaders, NVIDIA Only) - GLASM (Assembly Shaders, Chỉ Cho NVIDIA) - - - + SPIR-V (Experimental, AMD/Mesa Only) - - Normal - Trung bình + + Unsafe (fast) + - - High - Khỏe + + Safe (stable) + - - Extreme - Tối đa - - - - Auto - Tự động - - - - Accurate - Tuyệt đối - - - - Unsafe - Tương đối - - - - Paranoid (disables most optimizations) - Paranoid (vô hiệu hoá hầu hết sự tối ưu) - - - + Dynarmic - + NCE - - Borderless Windowed - Cửa sổ không viền - - - - Exclusive Fullscreen - Toàn màn hình - - - - No Video Output - Không Video Đầu Ra - - - - CPU Video Decoding - Giải mã video bằng CPU - - - - GPU Video Decoding (Default) - Giải mã video bằng GPU (Mặc định) - - - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - - 0.75X (540p/810p) [EXPERIMENTAL] - 0.75X (540p/810p) [THỬ NGHIỆM] - - - - 1X (720p/1080p) - 1X (720p/1080p) - - - - 1.5X (1080p/1620p) [EXPERIMENTAL] - 1.5X (1080p/1620p) [THỬ NGHIỆM] - - - - 2X (1440p/2160p) - 2X (1440p/2160p) - - - - 3X (2160p/3240p) - 3X (2160p/3240p) - - - - 4X (2880p/4320p) - 4X (2880p/4320p) - - - - 5X (3600p/5400p) - 5X (3600p/5400p) - - - - 6X (4320p/6480p) - 6X (4320p/6480p) - - - - 7X (5040p/7560p) - 7X (5040p/7560p) - - - - 8X (5760p/8640p) - 8X (5760p/8640p) - - - - Nearest Neighbor - Nearest Neighbor - - - - Bilinear - Bilinear - - - - Bicubic - Bicubic - - - - Gaussian - ScaleForce - - - - ScaleForce - ScaleForce - - - - AMD FidelityFX™️ Super Resolution - AMD FidelityFX™️ Super Resolution - - - + Area - - None - Trống - - - - FXAA - FXAA - - - - SMAA - SMAA - - - - Default (16:9) - Mặc định (16:9) - - - - Force 4:3 - Dùng 4:3 - - - - Force 21:9 - Dùng 21:9 - - - - Force 16:10 - Dung 16:10 - - - - Stretch to Window - Kéo dãn đến cửa sổ phần mềm - - - - Automatic - Tự động - - - - Default - Mặc định - - - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - - + + Serbian (српски) + + + + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - - Low (128) - - - - - Medium (256) - - - - - High (512) - - - - + Docked Chế độ cắm TV - + Handheld Cầm tay - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) - + Only if game specifies not to stop - + Never ask + + + Low (128) + + + + + Medium (256) + + + + + High (512) + + ConfigureApplets @@ -2271,27 +2368,27 @@ When a guest attempts to open the controller applet, it is immediately closed.Sổ ghi chép - + Open Log Location Mở vị trí sổ ghi chép - + Global Log Filter Bộ lọc sổ ghi chép - + When checked, the max size of the log increases from 100 MB to 1 GB Khi tích vào, dung lượng tối đa cho file log chuyển từ 100 MB lên 1 GB - + Enable Extended Logging** Bật ghi nhật ký mở rộng** - + Show Log in Console Hiện nhật ký trên trong console @@ -2437,7 +2534,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2499,7 +2596,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**Sẽ tự động thiết lập lại khi tắt yuzu. - + Web applet not compiled Applet web chưa được biên dịch @@ -2549,7 +2646,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2558,88 +2655,88 @@ When a guest attempts to open the controller applet, it is immediately closed.Một số cài đặt chỉ khả dụng khi game không chạy. - + Applets - - + + Audio Âm thanh - - + + CPU CPU - + Debug Gỡ lỗi - + Filesystem Hệ thống tệp tin - - + + General Chung - - + + Graphics Đồ hoạ - + GraphicsAdvanced Đồ họa Nâng cao - + GraphicsExtensions - + Hotkeys Phím tắt - - + + Controls Phím - + Profiles Hồ sơ - + Network Mạng - - + + System Hệ thống - + Game List Danh sách trò chơi - + Web Web @@ -2737,51 +2834,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache Khôi phục bộ nhớ đệm của metadata - + Select Emulated NAND Directory... Chọn Thư Mục Giả Lập NAND... - + Select Emulated SD Directory... Chọn Thư Mục Giả Lập SD... - + Select Gamecard Path... Chọn đường dẫn tới đĩa game... - + Select Dump Directory... Chọn thư mục trích xuất... - + Select Mod Load Directory... Chọn Thư Mục Chứa Mod... - The metadata cache is already empty. - Bộ nhớ đệm metadata trống. + Bộ nhớ đệm metadata trống. - The operation completed successfully. - Các hoạt động đã hoàn tất thành công. + Các hoạt động đã hoàn tất thành công. - The metadata cache couldn't be deleted. It might be in use or non-existent. - Bộ nhớ đệm metadata không thể xoá. Nó có thể đang được sử dụng hoặc không tồn tại. + Bộ nhớ đệm metadata không thể xoá. Nó có thể đang được sử dụng hoặc không tồn tại. @@ -2812,12 +2903,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? Quá trình này sẽ thiết lập lại toàn bộ tùy chỉnh và gỡ hết mọi cài đặt cho từng game riêng lẻ. Quá trình này không xóa đường dẫn tới thư mục game, hồ sơ, hay hồ sơ của thiết lập phím. Tiếp tục? @@ -2850,33 +2941,33 @@ When a guest attempts to open the controller applet, it is immediately closed.Màu nền: - + % FSR sharpening percentage (e.g. 50%) % - + Off Tắt - + VSync Off Tắt Vsync - + Recommended Đề xuất - + On Bật - + VSync On Bật Vsync @@ -2913,14 +3004,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -2952,75 +3047,75 @@ These settings are experimental, and may cause black screens. If your games fail Khôi phục về mặc định - + Action Hành động - + Hotkey Phím tắt - + Controller Hotkey Phím tắt tay cầm - - - + + + Conflicting Key Sequence Tổ hợp phím bị xung đột - - + + The entered key sequence is already assigned to: %1 Tổ hợp phím này đã gán với: %1 - + [waiting] [Chờ] - + Invalid Không hợp lệ - + Invalid hotkey settings - + An error occurred. Please report this issue on github. - + Restore Default Khôi phục về mặc định - + Clear Xóa - + Conflicting Button Sequence Dãy nút xung đột - + The default button sequence is already assigned to: %1 Dãy nút mặc định đã được gán cho: %1 - + The default key sequence is already assigned to: %1 Tổ hợp phím này đã gán với: %1 @@ -3340,7 +3435,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3495,7 +3590,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick Cần trái @@ -3605,14 +3700,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3631,7 +3726,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus Cộng @@ -3644,15 +3739,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3697,7 +3792,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick Cần phải @@ -3712,242 +3807,242 @@ These settings are experimental, and may cause black screens. If your games fail Cài đặt - - - - + + + + Clear Bỏ trống - - - - - + + + + + [not set] [không đặt] - - - + + + Invert button Đảo ngược nút - - + + Toggle button Đổi nút - + Turbo button Nút Turbo - - + + Invert axis Đảo ngược trục - - - + + + Set threshold Thiết lập ngưỡng - - + + Choose a value between 0% and 100% Chọn một giá trị giữa 0% và 100% - + Toggle axis Chuyển đổi trục - + Set gyro threshold Thiết lập ngưỡng cảm biến con quay - + Calibrate sensor Hiệu chỉnh cảm biến - + Map Analog Stick Thiết lập Cần Điều Khiển - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. Sau khi bấm OK, di chuyển cần sang ngang, rồi sau đó sang dọc. Nếu muốn đảo ngược hướng cần điều khiển, di chuyển cần sang dọc trước, rồi sang ngang. - + Center axis Canh chỉnh trục - - + + Deadzone: %1% Vùng chết: %1% - - + + Modifier Range: %1% Phạm vi điều chỉnh: %1% - - + + Pro Controller Tay cầm Pro Controller - + Dual Joycons Joycon đôi - + Left Joycon Joycon Trái - + Right Joycon Joycon Phải - + Handheld Cầm tay - + GameCube Controller Tay cầm GameCube - + Poke Ball Plus Poke Ball Plus - + NES Controller Tay cầm NES - + SNES Controller Tay cầm SNES - + N64 Controller Tay cầm N64 - + Sega Genesis Sega Genesis - + Start / Pause Bắt đầu / Tạm ngưng - + Z Z - + Control Stick Cần điều khiển - + C-Stick C-Stick - + Shake! Lắc! - + [waiting] [Chờ] - + New Profile Hồ sơ mới - + Enter a profile name: Nhập tên hồ sơ: - - + + Create Input Profile Tạo Hồ Sơ Phím - + The given profile name is not valid! Tên hồ sơ không hợp lệ! - + Failed to create the input profile "%1" Quá trình tạo hồ sơ phím "%1" thất bại - + Delete Input Profile Xóa Hồ Sơ Phím - + Failed to delete the input profile "%1" Quá trình xóa hồ sơ phím "%1" thất bại - + Load Input Profile Nạp Hồ Sơ Phím - + Failed to load the input profile "%1" Quá trình nạp hồ sơ phím "%1" thất bại - + Save Input Profile Lưu Hồ Sơ Phím - + Failed to save the input profile "%1" Quá trình lưu hồ sơ phím "%1" thất bại @@ -4004,7 +4099,7 @@ Nếu muốn đảo ngược hướng cần điều khiển, di chuyển cần s - + Configure Cài đặt @@ -4040,7 +4135,7 @@ Nếu muốn đảo ngược hướng cần điều khiển, di chuyển cần s - + Test Thử nghiệm @@ -4059,7 +4154,7 @@ Nếu muốn đảo ngược hướng cần điều khiển, di chuyển cần s <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Tìm hiểu thêm</span></a> - + %1:%2 %1:%2 @@ -4068,77 +4163,77 @@ Nếu muốn đảo ngược hướng cần điều khiển, di chuyển cần s yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters Cổng có kí tự không hợp lệ - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 Cổng phải từ 0 đến 65353 - + IP address is not valid Địa chỉ IP không hợp lệ - + This UDP server already exists Server UDP đã tồn tại - + Unable to add more than 8 servers Không thể vượt quá 8 server - + Testing Thử nghiệm - + Configuring Cài đặt - + Test Successful Thử Nghiệm Thành Công - + Successfully received data from the server. Nhận được dữ liệu từ server! - + Test Failed Thử Nghiệm Thất Bại - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. Không thể nhận được dữ liệu hợp lệ từ server. <br>Hãy chắc chắn server được thiết lập chính xác, từ địa chỉ lẫn cổng phải được thiết lập đúng. - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. Cấu hình kiểm tra hoặc hiệu chuẩn UDP đang được tiến hành.<br>Vui lòng chờ cho đến khi nó hoàn thành. @@ -4265,7 +4360,12 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Giao diện mạng - + + Enable Airplane Mode + + + + None Trống @@ -4323,52 +4423,52 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Một số cài đặt chỉ khả dụng khi game không chạy. - + Add-Ons Bổ Sung - + System Hệ Thống - + CPU CPU - + Graphics Đồ Họa - + Adv. Graphics Đồ Họa Nâng Cao - + GPU Extensions - + Audio Âm Thanh - + Input Profiles Hồ sơ đầu vào - + Linux - + Properties Thuộc tính @@ -4386,12 +4486,12 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Bổ Sung - + Patch Name Tên bản vá - + Version Phiên Bản @@ -4429,27 +4529,32 @@ Các giá trị hiện tại lần lượt là %1% và %2%. Đặt Hình Ảnh - + + Select Avatar + + + + Add Thêm - + Rename Đổi Tên - + Remove Gỡ Bỏ - + Profile management is available only when game is not running. Chỉ có thể quản lí hồ sơ khi game không chạy. - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4457,100 +4562,189 @@ Các giá trị hiện tại lần lượt là %1% và %2%. %2 - + Enter Username Điền Tên - + Users Người Dùng - + Enter a username for the new user: Chọn tên cho người dùng mới - + Enter a new username: Chọn một tên mới: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image Chọn Ảnh cho Người Dùng - - JPEG Images (*.jpg *.jpeg) - Ảnh JPEG (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + Ảnh JPEG (*.jpg *.jpeg) + + + Error deleting image Lỗi khi xóa ảnh - + Error occurred attempting to overwrite previous image at: %1. Có lỗi khi ghi đè ảnh trước tại: %1. - + Error deleting file Lỗi xóa ảnh - + Unable to delete existing file: %1. Không thể xóa ảnh hiện tại: %1. - + Error creating user image directory Lỗi khi tạo thư mục chứa ảnh người dùng - + Unable to create directory %1 for storing user images. Không thể tạo thư mục %1 để chứa ảnh người dùng - Error copying user image - Lỗi chép ảnh người dùng + Lỗi chép ảnh người dùng - Unable to copy image from %1 to %2 - Không thể chép ảnh từ %1 sang %2 + Không thể chép ảnh từ %1 sang %2 - Error resizing user image - Lỗi thu phóng ảnh + Lỗi thu phóng ảnh - Unable to resize image - Không thể thu phóng ảnh + Không thể thu phóng ảnh + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. Xoá người dùng này? Tất cả dữ liệu save của người dùng này sẽ bị xoá. - + Confirm Delete Xác nhận xóa - + Name: %1 UUID: %2 Tên: %1 @@ -4603,7 +4797,7 @@ UUID: %2 - + Enable Bật @@ -4614,7 +4808,7 @@ UUID: %2 - + Not connected Không kết nối @@ -4624,63 +4818,63 @@ UUID: %2 Khôi phục về mặc định - + Clear Bỏ trống - + [not set] [không đặt] - + Invert axis Đảo ngược trục - - + + Deadzone: %1% Vùng chết: %1% - + Error enabling ring input Lỗi khi bật đầu vào từ vòng - + Direct Joycon driver is not enabled Driver JoyCon trực tiếp chưa được bật - + Configuring Cài đặt - + The current mapped device doesn't support the ring controller Thiết bị đươc ánh xạ hiện tại không hỗ trợ vòng điều khiển - + The current mapped device doesn't have a ring attached Thiết bị được ánh xạ hiện tại không có vòng được gắn vào - + The current mapped device is not connected Thiết bị được ánh xạ hiện tại không được kết nối - + Unexpected driver result %1 Kết quả driver không như mong đợi %1 - + [waiting] [Chờ] @@ -4722,7 +4916,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4774,12 +4968,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration Cấu hình TAS - + Select TAS Load Directory... Chọn thư mục tải TAS @@ -4889,7 +5083,7 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5209,6 +5403,16 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Web Web + + + Eden Web Service + + + + + Generate + + yuzu Web Service Dịch vụ Web yuzu @@ -5218,42 +5422,29 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Bằng cách cung cấp tên đăng nhập và mã thông báo của bạn, bạn đã chấp thuận sẽ cho phép yuzu thu thập dữ liệu đã sử dụng, trong đó có thể có thông tin nhận dạng người dùng. - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - Xác nhận + Xác nhận - Sign up - Đăng ký + Đăng ký - + Token: Mã thông báo: - + Username: Tên người dùng: - What is my token? - Mã thông báo của tôi là gì? + Mã thông báo của tôi là gì? - + Web Service configuration can only be changed when a public room isn't being hosted. Cấu hình dịch vụ web chỉ có thể thay đổi khi không có phòng công khai đang được tổ chức. @@ -5278,12 +5469,12 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Tạo mới - + Discord Presence Hiện diện trên Discord - + Show Current Game in your Discord Status Hiển thị trò chơi hiện tại lên thông tin Discord của bạn @@ -5292,24 +5483,8 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr <a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">Tìm hiểu thêm</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Đăng ký</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Đăng ký</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5332,10 +5507,9 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Token không được xác thực. Thay đổi token của bạn chưa được lưu. - Unverified, please click Verify before saving configuration Tooltip - Chưa xác minh, vui lòng nhấp vào Xác minh trước khi lưu cấu hình + Chưa xác minh, vui lòng nhấp vào Xác minh trước khi lưu cấu hình Verifying... @@ -5359,20 +5533,67 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr Verification failed. Check that you have entered your token correctly, and that your internet connection is working. Xác thực không thành công. Hãy kiểm tra xem bạn đã nhập token đúng chưa và kết nối internet của bạn có hoạt động hay không. + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Tay cầm P1 - + &Controller P1 &Tay cầm P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + Phiên Bản + + DirectConnect @@ -5478,7 +5699,12 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5486,11 +5712,6 @@ Kéo điểm để thay đổi vị trí, hoặc nhấp đúp chuột vào ô tr The host of the room has banned you. Speak with the host to unban you or try a different room. Chủ phòng đã ban bạn. Hãy nói chuyện với người chủ phòng để được unban, hoặc thử vào một phòng khác. - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5551,7 +5772,7 @@ Please go to Configure -> System -> Network and make a selection. Viễn trắc - + Broken Vulkan Installation Detected Phát hiện cài đặt Vulkan bị hỏng @@ -5560,106 +5781,105 @@ Please go to Configure -> System -> Network and make a selection. Khởi tạo Vulkan thất bại trong quá trình khởi động.<br>Nhấn <br><a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>vào đây để xem hướng dẫn khắc phục vấn đề</a>. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Đang chạy một game - + Loading Web Applet... Đang tải applet web... - - + + Disable Web Applet Tắt applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Tắt applet web có thể dẫn đến hành vi không xác định và chỉ nên được sử dụng với Super Mario 3D All-Stars. Bạn có chắc chắn muốn tắt applet web không? (Có thể được bật lại trong cài đặt Gỡ lỗi.) - + The amount of shaders currently being built Số lượng shader đang được dựng - + The current selected resolution scaling multiplier. Bội số tỷ lệ độ phân giải được chọn hiện tại. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Tốc độ giả lập hiện tại. Giá trị cao hơn hoặc thấp hơn 100% chỉ ra giả lập sẽ chạy nhanh hơn hoặc chậm hơn trên máy Switch - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Có bao nhiêu khung hình trên mỗi giây mà trò chơi đang hiển thị. Điều này sẽ thay đổi từ trò chơi này đến trò chơi kia và khung cảnh này đến khung cảnh kia. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Thời gian mà giả lập lấy từ khung hình Switch, sẽ không kể đến giới hạn khung hình hoặc v-sync. Đối với tốc độ tối đa mà giả lập nhận được nhiều nhất là ở độ khoảng 16.67 ms. - + Unmute Bật tiếng - + Mute Tắt tiếng - + Reset Volume Đặt lại âm lượng - + &Clear Recent Files &Xoá tập tin gần đây - + &Continue &Tiếp tục - + &Pause &Tạm dừng - Warning Outdated Game Format - Chú ý định dạng trò chơi đã lỗi thời + Chú ý định dạng trò chơi đã lỗi thời You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. Bạn đang sử dụng định dạng danh mục ROM giải mã cho trò chơi này, và đó là một định dạng lỗi thời đã được thay thế bởi những thứ khác như NCA, NAX, XCI, hoặc NSP. Danh mục ROM giải mã có thể thiếu biểu tượng, metadata, và hỗ trợ cập nhật.<br><br>Để giải thích về các định dạng khác nhau của Switch mà yuzu hỗ trợ, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>vui lòng kiểm tra trên wiki của chúng tôi</a>. Thông báo này sẽ không hiển thị lại lần sau. - - + + Error while loading ROM! Xảy ra lỗi khi đang nạp ROM! - + The ROM format is not supported. Định dạng ROM này không hỗ trợ. - + An error occurred initializing the video core. Đã xảy ra lỗi khi khởi tạo lõi video. @@ -5668,7 +5888,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu đã gặp lỗi khi chạy lõi video. Điều này thường xảy ra do phiên bản driver GPU đã cũ, bao gồm cả driver tích hợp. Vui lòng xem nhật ký để biết thêm chi tiết. Để biết thêm thông tin về cách truy cập nhật ký, vui lòng xem trang sau: <a href='https://yuzu-emu.org/help/reference/log-files/'>Cách tải lên tập tin nhật ký</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Lỗi xảy ra khi nạp ROM! %1 @@ -5679,1027 +5899,913 @@ Please go to Configure -> System -> Network and make a selection. %1<br>Vui lòng tuân theo <a href='https://yuzu-emu.org/help/quickstart/'>hướng dẫn nhanh của yuzu</a> để trích xuất lại các tệp của bạn.<br>Bạn có thể tham khảo yuzu wiki</a> hoặc yuzu Discord</a>để được hỗ trợ. - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. Đã xảy ra lỗi không xác định. Vui lòng kiểm tra sổ ghi chép để biết thêm chi tiết. - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Đang đóng phần mềm... - + Save Data Dữ liệu save - + Mod Data Dữ liệu mod - + Error Opening %1 Folder Xảy ra lỗi khi mở %1 thư mục - - + + Folder does not exist! Thư mục này không tồn tại! - Error Opening Transferable Shader Cache - Lỗi khi mở bộ nhớ cache shader có thể chuyển. + Lỗi khi mở bộ nhớ cache shader có thể chuyển. - Failed to create the shader cache directory for this title. - Thất bại khi tạo thư mục bộ nhớ cache shader cho title này. + Thất bại khi tạo thư mục bộ nhớ cache shader cho title này. - Error Removing Contents - Lỗi khi loại bỏ nội dung + Lỗi khi loại bỏ nội dung - Error Removing Update - Lỗi khi loại bỏ cập nhật + Lỗi khi loại bỏ cập nhật - Error Removing DLC - Lỗi khi loại bỏ DLC + Lỗi khi loại bỏ DLC - + Remove Installed Game Contents? Loại bỏ nội dung game đã cài đặt? - + Remove Installed Game Update? Loại bỏ bản cập nhật game đã cài đặt? - + Remove Installed Game DLC? Loại bỏ DLC game đã cài đặt? - + Remove Entry Xoá mục - - - - - - Successfully Removed - Loại bỏ thành công + Loại bỏ thành công - Successfully removed the installed base game. - Loại bỏ thành công base game đã cài đặt + Loại bỏ thành công base game đã cài đặt - The base game is not installed in the NAND and cannot be removed. - Base game không được cài đặt trong NAND và không thể loại bỏ. + Base game không được cài đặt trong NAND và không thể loại bỏ. - Successfully removed the installed update. - Loại bỏ thành công bản cập nhật đã cài đặt + Loại bỏ thành công bản cập nhật đã cài đặt - There is no update installed for this title. - Không có bản cập nhật nào được cài đặt cho title này. + Không có bản cập nhật nào được cài đặt cho title này. - There are no DLC installed for this title. - Không có DLC nào được cài đặt cho title này. + Không có DLC nào được cài đặt cho title này. - Successfully removed %1 installed DLC. - Loại bỏ thành công %1 DLC đã cài đặt + Loại bỏ thành công %1 DLC đã cài đặt - + Delete OpenGL Transferable Shader Cache? Xoá bộ nhớ cache shader OpenGL chuyển được? - + Delete Vulkan Transferable Shader Cache? Xoá bộ nhớ cache shader Vulkan chuyển được? - + Delete All Transferable Shader Caches? Xoá tất cả bộ nhớ cache shader chuyển được? - + Remove Custom Game Configuration? Loại bỏ cấu hình game tuỳ chỉnh? - + Remove Cache Storage? Xoá bộ nhớ cache? - + Remove File Xoá tập tin - + Remove Play Time Data - + Reset play time? - - Error Removing Transferable Shader Cache - Lỗi khi xoá bộ nhớ cache shader chuyển được + Lỗi khi xoá bộ nhớ cache shader chuyển được - - A shader cache for this title does not exist. - Bộ nhớ cache shader cho title này không tồn tại. + Bộ nhớ cache shader cho title này không tồn tại. - Successfully removed the transferable shader cache. - Thành công loại bỏ bộ nhớ cache shader chuyển được + Thành công loại bỏ bộ nhớ cache shader chuyển được - Failed to remove the transferable shader cache. - Thất bại khi xoá bộ nhớ cache shader chuyển được. + Thất bại khi xoá bộ nhớ cache shader chuyển được. - Error Removing Vulkan Driver Pipeline Cache - Lỗi khi xoá bộ nhớ cache pipeline Vulkan + Lỗi khi xoá bộ nhớ cache pipeline Vulkan - Failed to remove the driver pipeline cache. - Thất bại khi xoá bộ nhớ cache pipeline của driver. + Thất bại khi xoá bộ nhớ cache pipeline của driver. - - Error Removing Transferable Shader Caches - Lỗi khi loại bỏ bộ nhớ cache shader chuyển được + Lỗi khi loại bỏ bộ nhớ cache shader chuyển được - Successfully removed the transferable shader caches. - Thành công loại bỏ tât cả bộ nhớ cache shader chuyển được. + Thành công loại bỏ tât cả bộ nhớ cache shader chuyển được. - Failed to remove the transferable shader cache directory. - Thất bại khi loại bỏ thư mục bộ nhớ cache shader. + Thất bại khi loại bỏ thư mục bộ nhớ cache shader. - - Error Removing Custom Configuration - Lỗi khi loại bỏ cấu hình tuỳ chỉnh + Lỗi khi loại bỏ cấu hình tuỳ chỉnh - A custom configuration for this title does not exist. - Cấu hình tuỳ chỉnh cho title này không tồn tại. + Cấu hình tuỳ chỉnh cho title này không tồn tại. - Successfully removed the custom game configuration. - Loại bỏ thành công cấu hình game tuỳ chỉnh. + Loại bỏ thành công cấu hình game tuỳ chỉnh. - Failed to remove the custom game configuration. - Thất bại khi xoá cấu hình game tuỳ chỉnh + Thất bại khi xoá cấu hình game tuỳ chỉnh - - + + RomFS Extraction Failed! Khai thác RomFS không thành công! - + There was an error copying the RomFS files or the user cancelled the operation. Đã xảy ra lỗi khi sao chép tệp tin RomFS hoặc người dùng đã hủy bỏ hoạt động này. - + Full Đầy - + Skeleton Sườn - + Select RomFS Dump Mode Chọn chế độ kết xuất RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Vui lòng chọn RomFS mà bạn muốn kết xuất như thế nào.<br>Đầy đủ sẽ sao chép toàn bộ tệp tin vào một danh mục mới trong khi <br>bộ xương chỉ tạo kết cấu danh mục. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Không đủ bộ nhớ trống tại %1 để trích xuất RomFS. Hãy giải phóng bộ nhớ hoặc chọn một thư mục trích xuất khác tại Giả lập > Thiết lập > Hệ thống > Hệ thống tệp > Thư mục trích xuất gốc - + Extracting RomFS... Khai thác RomFS... - - - - - + + Cancel Hủy bỏ - + RomFS Extraction Succeeded! Khai thác RomFS thành công! - - - + The operation completed successfully. Các hoạt động đã hoàn tất thành công. - Integrity verification couldn't be performed! - Không thể thực hiện kiểm tra tính toàn vẹn! + Không thể thực hiện kiểm tra tính toàn vẹn! - File contents were not checked for validity. - Chưa kiểm tra sự hợp lệ của nội dung tập tin. + Chưa kiểm tra sự hợp lệ của nội dung tập tin. - - Verifying integrity... - Đang kiểm tra tính toàn vẹn... + Đang kiểm tra tính toàn vẹn... - - Integrity verification succeeded! - Kiểm tra tính toàn vẹn thành công! + Kiểm tra tính toàn vẹn thành công! - - Integrity verification failed! - Kiểm tra tính toàn vẹn thất bại! + Kiểm tra tính toàn vẹn thất bại! - File contents may be corrupt. - Nội dung tập tin có thể bị hỏng. + Nội dung tập tin có thể bị hỏng. - - - - Create Shortcut - Tạo lối tắt + Tạo lối tắt - - Do you want to launch the game in fullscreen? - - - - Successfully created a shortcut to %1 - Thành công tạo lối tắt tại %1 + Thành công tạo lối tắt tại %1 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - Việc này sẽ tạo một lối tắt tới AppImage hiện tại. Điều này có thể không hoạt động tốt nếu bạn cập nhật. Tiếp tục? + Việc này sẽ tạo một lối tắt tới AppImage hiện tại. Điều này có thể không hoạt động tốt nếu bạn cập nhật. Tiếp tục? - - Failed to create a shortcut to %1 + Create Icon + Tạo icon + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Không thể tạo tập tin icon. Đường dẫn "%1" không tồn tại và không thể tạo. + + + + Warning: Outdated Game Format - - Create Icon - Tạo icon + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + - - Cannot create icon file. Path "%1" does not exist and cannot be created. - Không thể tạo tập tin icon. Đường dẫn "%1" không tồn tại và không thể tạo. + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + - + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 Lỗi khi mở %1 - + Select Directory Chọn danh mục - + Properties Thuộc tính - + The game properties could not be loaded. Thuộc tính của trò chơi không thể nạp được. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Thực thi Switch (%1);;Tất cả tệp tin (*.*) - + Load File Nạp tệp tin - + Open Extracted ROM Directory Mở danh mục ROM đã trích xuất - + Invalid Directory Selected Danh mục đã chọn không hợp lệ - + The directory you have selected does not contain a 'main' file. Danh mục mà bạn đã chọn không có chứa tệp tin 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Những tệp tin Switch cài được (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Cài đặt tập tin - + %n file(s) remaining %n tập tin còn lại + %n tập tin còn lại - + Installing file "%1"... Đang cài đặt tệp tin "%1"... - - + + Install Results Kết quả cài đặt - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Để tránh xung đột có thể xảy ra, chúng tôi không khuyến khích người dùng cài base games vào NAND. Vui lòng, chỉ sử dụng tính năng này để cài các bản cập nhật và DLC. - + %n file(s) were newly installed - %n đã được cài đặt mới - + %n đã được cài đặt mới + %n đã được cài đặt mới - + %n file(s) were overwritten - %n tập tin đã được ghi đè - + %n tập tin đã được ghi đè + %n tập tin đã được ghi đè - + %n file(s) failed to install - %n tập tin thất bại khi cài đặt - + %n tập tin thất bại khi cài đặt + %n tập tin thất bại khi cài đặt - + System Application Ứng dụng hệ thống - + System Archive Hệ thống lưu trữ - + System Application Update Cập nhật hệ thống ứng dụng - + Firmware Package (Type A) Gói phần mềm (Loại A) - + Firmware Package (Type B) Gói phần mềm (Loại B) - + Game Trò chơi - + Game Update Cập nhật trò chơi - + Game DLC Nội dung trò chơi có thể tải xuống - + Delta Title Tiêu đề Delta - + Select NCA Install Type... Chọn loại NCA để cài đặt... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Vui lòng chọn loại tiêu đề mà bạn muốn cài đặt NCA này: (Trong hầu hết trường hợp, chọn mặc định 'Game' là tốt nhất.) - + Failed to Install Cài đặt đã không thành công - + The title type you selected for the NCA is invalid. Loại tiêu đề NCA mà bạn chọn nó không hợp lệ. - + File not found Không tìm thấy tệp tin - + File "%1" not found Không tìm thấy "%1" tệp tin - + OK OK - - + + Hardware requirements not met Yêu cầu phần cứng không được đáp ứng - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. Hệ thống của bạn không đáp ứng yêu cầu phần cứng được đề xuất. Báo cáo tương thích đã được tắt. - + Missing yuzu Account Thiếu tài khoản yuzu - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + Select Dumped Firmware ZIP - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Zipped Archives (*.zip) - - Encryption keys are missing. + + Firmware cleanup failed - - Are you sure you want to close eden? + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - - - eden + + Please install firmware to use the Album applet. - - The currently running application has requested eden to not exit. + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. Để gửi trường hợp thử nghiệm trò chơi tương thích, bạn phải liên kết tài khoản yuzu.<br><br/>Để liên kết tải khoản yuzu của bạn, hãy đến Giả lập &gt; Thiết lập &gt; Web. - + Error opening URL Lỗi khi mở URL - + Unable to open the URL "%1". Không thể mở URL "%1". - + TAS Recording Ghi lại TAS - + Overwrite file of player 1? Ghi đè tập tin của người chơi 1? - + Invalid config detected Đã phát hiện cấu hình không hợp lệ - + Handheld controller can't be used on docked mode. Pro controller will be selected. Tay cầm handheld không thể được sử dụng trong chế độ docked. Pro Controller sẽ được chọn. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo hiện tại đã bị loại bỏ - + Error Lỗi - - + + The current game is not looking for amiibos Game hiện tại không tìm kiếm amiibos - + Amiibo File (%1);; All Files (*.*) Tệp tin Amiibo (%1);; Tất cả tệp tin (*.*) - + Load Amiibo Nạp dữ liệu Amiibo - + Error loading Amiibo data Xảy ra lỗi khi nạp dữ liệu Amiibo - + The selected file is not a valid amiibo Tập tin đã chọn không phải là amiibo hợp lệ - + The selected file is already on use Tập tin đã chọn đã được sử dụng - + An unknown error occurred Đã xảy ra lỗi không xác định - - Verification failed for the following files: %1 - Kiểm tra những tập tin sau thất bại: + Kiểm tra những tập tin sau thất bại: %1 - + + Keys not installed - + + + Install decryption keys and restart Eden before attempting to install firmware. + + + + Select Dumped Firmware Source Location - - Installing Firmware... - - - - - - - - Firmware install failed - - - - - Unable to locate potential firmware NCA files - - - - - Failed to delete one or more firmware file. - - - - - One or more firmware files failed to copy into NAND. - - - - - Firmware integrity verification failed! - - - - - Select Dumped Keys Location - - - - - - - Decryption Keys install failed - - - - - prod.keys is a required decryption key file. - - - - - One or more keys failed to copy. - - - - - Decryption Keys install succeeded - - - - - Decryption Keys were successfully installed - - - - - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - - - - - - - - - - + + + + + + No firmware available - - Please install the firmware to use the Album applet. - - - - + Album Applet - + Album applet is not available. Please reinstall firmware. - - Please install the firmware to use the Cabinet applet. - - - - + Cabinet Applet - + Cabinet applet is not available. Please reinstall firmware. - - Please install the firmware to use the Mii editor. - - - - + Mii Edit Applet - + Mii editor is not available. Please reinstall firmware. - - Please install the firmware to use the Controller Menu. - - - - + Controller Applet Applet tay cầm - + Controller Menu is not available. Please reinstall firmware. - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot Chụp ảnh màn hình - + PNG Image (*.png) Hình ảnh PNG (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 Trạng thái TAS: Đang chạy %1/%2 - + TAS state: Recording %1 Trạng thái TAS: Đang ghi %1 - + TAS state: Idle %1/%2 Trạng thái TAS: Đang chờ %1/%2 - + TAS State: Invalid Trạng thái TAS: Không hợp lệ - + &Stop Running &Dừng chạy - + &Start &Bắt đầu - + Stop R&ecording Dừng G&hi - + R&ecord G&hi - + Building: %n shader(s) Đang dựng: %n shader(s) + Đang dựng: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Tỉ lệ thu phóng: %1x - + Speed: %1% / %2% Tốc độ: %1% / %2% - + Speed: %1% Tốc độ: %1% @@ -6708,54 +6814,54 @@ Would you like to download it? Game: %1 FPS (Đã mở khoá) - + Game: %1 FPS Trò chơi: %1 FPS - + Frame: %1 ms Khung hình: %1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA NO AA - + VOLUME: MUTE ÂM LƯỢNG: TẮT TIẾNG - + VOLUME: %1% Volume percentage (e.g. 50%) ÂM LƯỢNG: %1% - + Derivation Components Missing Thiếu các thành phần chuyển hoá - + Select RomFS Dump Target Chọn thư mục để sao chép RomFS - + Please select which RomFS you would like to dump. Vui lòng chọn RomFS mà bạn muốn sao chép. @@ -6768,7 +6874,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Bạn có chắc rằng muốn dừng giả lập? Bất kì tiến trình nào chưa được lưu sẽ bị mất. @@ -6781,102 +6887,102 @@ Would you like to bypass this and exit anyway? Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? - + None Trống - + FXAA FXAA - + SMAA SMAA - + Nearest Nearest - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + ScaleForce ScaleForce - + Area - + Docked Chế độ cắm TV - + Handheld Cầm tay - + Normal Trung bình - + High Khỏe - + Extreme Tối đa - + Vulkan Vulkan - + OpenGL OpenGL - + Null Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6884,13 +6990,13 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GRenderWindow - - + + OpenGL not available! Không có sẵn OpenGL! - + OpenGL shared contexts are not supported. Các ngữ cảnh OpenGL chung không được hỗ trợ. @@ -6899,33 +7005,33 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? yuzu không được biên dịch với hỗ trợ OpenGL. - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! Đã xảy ra lỗi khi khởi tạo OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPU của bạn có thể không hỗ trợ OpenGL, hoặc bạn không có driver đồ hoạ mới nhất. - + Error while initializing OpenGL 4.6! Lỗi khi khởi tạo OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPU của bạn có thể không hỗ trợ OpenGL 4.6, hoặc bạn không có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPU của bạn có thể không hỗ trợ một hoặc nhiều tiện ích OpenGL cần thiết. Vui lòng đảm bảo bạn có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1<br><br>Tiện ích không hỗ trợ:<br>%2 @@ -6933,128 +7039,128 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameList - + Favorite Ưa thích - + Start Game Bắt đầu game - + Start Game without Custom Configuration Bắt đầu game mà không có cấu hình tuỳ chỉnh - + Open Save Data Location Mở vị trí lưu dữ liệu - + Open Mod Data Location Mở vị trí chỉnh sửa dữ liệu - + Open Transferable Pipeline Cache Mở thư mục chứa bộ nhớ cache pipeline - + Remove Gỡ Bỏ - + Remove Installed Update Loại bỏ bản cập nhật đã cài - + Remove All Installed DLC Loại bỏ tất cả DLC đã cài đặt - + Remove Custom Configuration Loại bỏ cấu hình tuỳ chỉnh - + Remove Play Time Data - + Remove Cache Storage Xoá bộ nhớ cache - + Remove OpenGL Pipeline Cache Loại bỏ OpenGL Pipeline Cache - + Remove Vulkan Pipeline Cache Loại bỏ bộ nhớ cache pipeline Vulkan - + Remove All Pipeline Caches Loại bỏ tất cả bộ nhớ cache shader - + Remove All Installed Contents Loại bỏ tất cả nội dung đã cài đặt - + Dump RomFS Kết xuất RomFS - + Dump RomFS to SDMC Trích xuất RomFS tới SDMC - + Verify Integrity Kiểm tra tính toàn vẹn - + Copy Title ID to Clipboard Sao chép ID tiêu đề vào bộ nhớ tạm - + Navigate to GameDB entry Điều hướng đến mục cơ sở dữ liệu trò chơi - + Create Shortcut Tạo lối tắt - + Add to Desktop Thêm vào Desktop - + Add to Applications Menu Thêm vào menu ứng dụng - + Configure Game @@ -7063,62 +7169,62 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? Thuộc tính - + Scan Subfolders Quét các thư mục con - + Remove Game Directory Loại bỏ thư mục game - + ▲ Move Up ▲ Di chuyển lên - + ▼ Move Down ▼ Di chuyển xuống - + Open Directory Location Mở vị trí thư mục - + Clear Bỏ trống - + Name Tên - + Compatibility Tương thích - + Add-ons Tiện ích ngoài - + File type Loại tệp tin - + Size Kích cỡ - + Play time @@ -7126,62 +7232,62 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameListItemCompat - + Ingame Trong game - + Game starts, but crashes or major glitches prevent it from being completed. Game khởi động, nhưng gặp vấn đề hoặc lỗi nghiêm trọng đến việc không thể hoàn thành trò chơi. - + Perfect Tốt nhất - + Game can be played without issues. Game có thể chơi mà không gặp vấn đề. - + Playable Có thể chơi - + Game functions with minor graphical or audio glitches and is playable from start to finish. Game hoạt động với lỗi hình ảnh hoặc âm thanh nhẹ và có thể chơi từ đầu tới cuối. - + Intro/Menu Phần mở đầu/Menu - + Game loads, but is unable to progress past the Start Screen. Trò chơi đã tải, nhưng không thể qua Màn hình Bắt đầu. - + Won't Boot Không hoạt động - + The game crashes when attempting to startup. Trò chơi sẽ thoát đột ngột khi khởi động. - + Not Tested Chưa ai thử - + The game has not yet been tested. Trò chơi này chưa có ai thử cả. @@ -7189,7 +7295,7 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameListPlaceholder - + Double-click to add a new folder to the game list Nháy đúp chuột để thêm một thư mục mới vào danh sách trò chơi game @@ -7197,19 +7303,20 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? GameListSearchField - + %1 of %n result(s) %1 trong %n kết quả + %1 trong %n kết quả - + Filter: Bộ lọc: - + Enter pattern to filter Nhập khuôn để lọc @@ -7291,7 +7398,7 @@ Bạn có muốn bỏ qua yêu cầu đó và thoát luôn không? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7305,190 +7412,190 @@ Tin nhắn gỡ lỗi: Hotkeys - + Audio Mute/Unmute Tắt/Bật tiếng - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window Cửa sổ chính - + Audio Volume Down Giảm âm lượng - + Audio Volume Up Tăng âm lượng - + Capture Screenshot Chụp ảnh màn hình - + Change Adapting Filter Thay đổi bộ lọc điều chỉnh - + Change Docked Mode Đổi chế độ Docked - + Change GPU Accuracy Thay đổi độ chính xác GPU - + Configure - + Configure Current Game - + Continue/Pause Emulation Tiếp tục/Tạm dừng giả lập - + Exit Fullscreen Thoát chế độ toàn màn hình + + + Exit Eden + + Exit yuzu Thoát yuzu - - Exit eden - - - - + Fullscreen Toàn màn hình - + Load File Nạp tệp tin - + Load/Remove Amiibo Tải/Loại bỏ Amiibo - + Multiplayer Browse Public Game Lobby - + Multiplayer Create Room - + Multiplayer Direct Connect to Room - + Multiplayer Leave Room - + Multiplayer Show Current Room - + Restart Emulation Khởi động lại giả lập - + Stop Emulation Dừng giả lập - + TAS Record Ghi lại TAS - + TAS Reset Đặt lại TAS - + TAS Start/Stop Bắt đầu/Dừng TAS - + Toggle Filter Bar Hiện/Ẩn thanh lọc - + Toggle Framerate Limit Bật/Tắt giới hạn tốc độ khung hình - + Toggle Mouse Panning Bật/Tắt di chuyển chuột - + Toggle Renderdoc Capture - + Toggle Status Bar Hiện/Ẩn thanh trạng thái @@ -7496,22 +7603,22 @@ Tin nhắn gỡ lỗi: InstallDialog - + Please confirm these are the files you wish to install. Xin hãy xác nhận đây là những tệp tin bạn muốn cài. - + Installing an Update or DLC will overwrite the previously installed one. Cài đặt một tệp tin cập nhật hoặc DLC mới sẽ thay thế những tệp cũ đã cài trước đó. - + Install Cài đặt - + Install Files to NAND Cài đặt tập tin vào NAND @@ -7519,7 +7626,7 @@ Tin nhắn gỡ lỗi: LimitableInputDialog - + The text can't contain any of the following characters: %1 Văn bản không được chứa bất kỳ ký tự sau đây: @@ -7666,152 +7773,207 @@ Tin nhắn gỡ lỗi: &Tập tin gần đây - + + Open &Eden Folders + + + + &Emulation &Giả lập - + &View &Xem - + &Reset Window Size &Đặt lại kích thước cửa sổ - + &Debugging &Gỡ lỗi - + Reset Window Size to &720p Đặt lại kích thước cửa sổ về &720p - + Reset Window Size to 720p Đặt lại kích thước cửa sổ về 720p - + Reset Window Size to &900p Đặt lại kích thước cửa sổ về &900p - + Reset Window Size to 900p Đặt lại kích thước cửa sổ về 900p - + Reset Window Size to &1080p Đặt lại kích thước cửa sổ về &1080p - + Reset Window Size to 1080p Đặt lại kích thước cửa sổ về 1080p - + &Multiplayer &Nhiều người chơi - + &Tools &Công cụ - + &Amiibo - + &TAS &TAS - + &Create Home Menu Shortcut - + &Help &Trợ giúp - + &Install Files to NAND... &Cài đặt tập tin vào NAND... - + L&oad File... N&ạp tập tin... - + Load &Folder... Nạp &Thư mục - + E&xit Th&oát - + &Pause &Tạm dừng - + &Stop &Dừng - + &Verify Installed Contents - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7820,97 +7982,97 @@ Tin nhắn gỡ lỗi: &Thông tin về yuzu - + Single &Window Mode &Chế độ cửa sổ đơn - + Con&figure... Cấu& hình - + Ctrl+, - + Display D&ock Widget Headers Hiển thị tiêu đề công cụ D&ock - + Show &Filter Bar Hiện thanh &lọc - + Show &Status Bar Hiện thanh &trạng thái - + Show Status Bar Hiển thị thanh trạng thái - + &Browse Public Game Lobby &Duyệt phòng game công khai - + &Create Room &Tạo phòng - + &Leave Room &Rời phòng - + &Direct Connect to Room &Kết nối trực tiếp tới phòng - + &Show Current Room &Hiện phòng hiện tại - + F&ullscreen T&oàn màn hình - + &Restart &Khởi động lại - + Load/Remove &Amiibo... Tải/Loại bỏ &Amiibo - + &Report Compatibility &Báo cáo tương thích - + Open &Mods Page Mở trang &mods - + Open &Quickstart Guide Mở &Hướng dẫn nhanh - + &FAQ &FAQ @@ -7919,77 +8081,82 @@ Tin nhắn gỡ lỗi: Mở thư mục &yuzu - + &Capture Screenshot &Chụp ảnh màn hình - + Open &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + Open &Mii Editor - + &Configure TAS... &Cấu hình TAS... - + Configure C&urrent Game... Cấu hình game hiện tại... - + &Start &Bắt đầu - + &Reset &Đặt lại - + R&ecord G&hi - + Open &Controller Menu - + Install Firmware - + + &About Eden + + + + Install Decryption Keys @@ -7997,26 +8164,36 @@ Tin nhắn gỡ lỗi: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8076,37 +8253,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status Tình trạng kết nối hiện tại - + Not Connected. Click here to find a room! Không kết nối. Nhấn vào đây để tìm một phòng! - + Not Connected Không kết nối - + Connected Đã kết nối - + New Messages Received Đã nhận được tin nhắn mới - + Error Lỗi - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: Không thể cập nhật thông tin phòng. Vui lòng kiểm tra kết nối Internet của bạn và thử tạo phòng lại. @@ -8297,56 +8474,56 @@ p, li { white-space: pre-wrap; } Hiện không chơi game - + Installed SD Titles Các title đã cài đặt trên thẻ SD - + Installed NAND Titles Các title đã cài đặt trên NAND - + System Titles Titles hệ thống - + Add New Game Directory Thêm thư mục game - + Favorites Ưa thích - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [chưa đặt nút] @@ -8357,14 +8534,14 @@ p, li { white-space: pre-wrap; } Mũ %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 Trục %1%2 @@ -8375,357 +8552,357 @@ p, li { white-space: pre-wrap; } Nút %1 - - - - - - + + + + + + [unknown] [không xác định] - - - + + + Left Trái - - - + + + Right Phải - - - + + + Down Xuống - - - + + + Up Lên - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start Bắt đầu - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle Tròn - - + + Cross X - - + + Square Hình vuông - - + + Triangle Hình tam giác - - + + Share Chia sẻ - - + + Options Tuỳ chọn - - + + [undefined] [không xác định] - + %1%2 %1%2 - - + + [invalid] [không hợp lệ] - - + + %1%2Hat %3 %1%2Mũ %3 - - - + + + %1%2Axis %3 %1%2Trục %3 - - + + %1%2Axis %3,%4,%5 %1%2Trục %3,%4,%5 - - + + %1%2Motion %3 %1%2Chuyển động %3 - - + + %1%2Button %3 %1%2Nút %3 - - + + [unused] [không sử dụng] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L Cần L - + Stick R Cần R - + Plus Cộng - + Minus Trừ - - + + Home Home - + Capture Chụp - + Touch Cảm Ứng - + Wheel Indicates the mouse wheel Con lăn - + Backward Lùi - + Forward Tiến - + Task Nhiệm vụ - + Extra Thêm - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3Mũ %4 - - + + %1%2%3Axis %4 %1%2%3Trục %4 - - + + %1%2%3Button %4 %1%2%3Nút %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8843,6 +9020,300 @@ p, li { white-space: pre-wrap; } Bạn có muốn khôi phục amiibo này không? + + QtCommon::Content + + + Installing Firmware... + + + + + + + Cancel + + + + + Firmware integrity verification failed! + + + + + + Verification failed for the following files: + +%1 + Kiểm tra những tập tin sau thất bại: + +%1 + + + + + Verifying integrity... + Đang kiểm tra tính toàn vẹn... + + + + + Integrity verification succeeded! + Kiểm tra tính toàn vẹn thành công! + + + + + The operation completed successfully. + Các hoạt động đã hoàn tất thành công. + + + + + Integrity verification failed! + Kiểm tra tính toàn vẹn thất bại! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + + + + + Decryption Keys install succeeded + + + + + Decryption Keys were successfully installed + + + + + Decryption Keys install failed + + + + + QtCommon::Game + + + Error Removing Contents + Lỗi khi loại bỏ nội dung + + + + Error Removing Update + Lỗi khi loại bỏ cập nhật + + + + Error Removing DLC + Lỗi khi loại bỏ DLC + + + + The base game is not installed in the NAND and cannot be removed. + Base game không được cài đặt trong NAND và không thể loại bỏ. + + + + There is no update installed for this title. + Không có bản cập nhật nào được cài đặt cho title này. + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + Loại bỏ thành công + + + + Successfully removed %1 installed DLC. + Loại bỏ thành công %1 DLC đã cài đặt + + + + + Error Removing Transferable Shader Cache + Lỗi khi xoá bộ nhớ cache shader chuyển được + + + + + A shader cache for this title does not exist. + Bộ nhớ cache shader cho title này không tồn tại. + + + + Successfully removed the transferable shader cache. + Thành công loại bỏ bộ nhớ cache shader chuyển được + + + + Failed to remove the transferable shader cache. + Thất bại khi xoá bộ nhớ cache shader chuyển được. + + + + Error Removing Vulkan Driver Pipeline Cache + Lỗi khi xoá bộ nhớ cache pipeline Vulkan + + + + Failed to remove the driver pipeline cache. + Thất bại khi xoá bộ nhớ cache pipeline của driver. + + + + + Error Removing Transferable Shader Caches + Lỗi khi loại bỏ bộ nhớ cache shader chuyển được + + + + Successfully removed the transferable shader caches. + Thành công loại bỏ tât cả bộ nhớ cache shader chuyển được. + + + + Failed to remove the transferable shader cache directory. + Thất bại khi loại bỏ thư mục bộ nhớ cache shader. + + + + + Error Removing Custom Configuration + Lỗi khi loại bỏ cấu hình tuỳ chỉnh + + + + A custom configuration for this title does not exist. + Cấu hình tuỳ chỉnh cho title này không tồn tại. + + + + Successfully removed the custom game configuration. + Loại bỏ thành công cấu hình game tuỳ chỉnh. + + + + Failed to remove the custom game configuration. + Thất bại khi xoá cấu hình game tuỳ chỉnh + + + + Reset Metadata Cache + Khôi phục bộ nhớ đệm của metadata + + + + The metadata cache is already empty. + Bộ nhớ đệm metadata trống. + + + + The operation completed successfully. + Các hoạt động đã hoàn tất thành công. + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + Bộ nhớ đệm metadata không thể xoá. Nó có thể đang được sử dụng hoặc không tồn tại. + + + + Create Shortcut + Tạo lối tắt + + + + Do you want to launch the game in fullscreen? + + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + Thành công tạo lối tắt tại %1 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + Việc này sẽ tạo một lối tắt tới AppImage hiện tại. Điều này có thể không hoạt động tốt nếu bạn cập nhật. Tiếp tục? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + + + + + Create Icon + Tạo icon + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + Không thể tạo tập tin icon. Đường dẫn "%1" không tồn tại và không thể tạo. + + + + No firmware available + + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9138,7 +9609,7 @@ Vui lòng thử lại hoặc liên hệ nhà phát triển của phần mềm. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9146,7 +9617,7 @@ Vui lòng thử lại hoặc liên hệ nhà phát triển của phần mềm. - + Users Người Dùng @@ -9270,7 +9741,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Chùm cuộc gọi @@ -9278,12 +9749,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread chờ đợi bởi vì không có luồng @@ -9291,102 +9762,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable có thể chạy - + paused tạm dừng - + sleeping ngủ - + waiting for IPC reply chờ đợi IPC phản hồi - + waiting for objects chờ đợi đối tượng - + waiting for condition variable đang chờ biến điều kiện - + waiting for address arbiter chờ đợi địa chỉ người đứng giữa - + waiting for suspend resume đang đợi để tạm dừng và tiếp tục - + waiting đang chờ - + initialized đã khởi tạo - + terminated đã chấm dứt - + unknown không xác định - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal lý tưởng - + core %1 lõi %1 - + processor = %1 bộ xử lý = %1 - + affinity mask = %1 che đậy tánh giống nhau = %1 - + thread id = %1 id luồng = %1 - + priority = %1(current) / %2(normal) quyền ưu tiên = %1(hiện tại) / %2(bình thường) - + last running ticks = %1 lần chạy cuối cùng = %1 @@ -9394,7 +9865,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread chờ đợi bởi vì có luồng @@ -9402,7 +9873,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Cây Đợi diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 934cc8897a..bfebf8ab9e 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... 正在与服务器通信… - + Cancel 取消 - + Touch the top left corner <br>of your touchpad. 触摸你的触摸板<br>的左上角。 - + Now touch the bottom right corner <br>of your touchpad. 触摸你的触摸板<br>的右下角。 - + Configuration completed! 配置完成! - + OK 确定 @@ -397,134 +397,134 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - + Amiibo editor Amiibo 编辑器 - + Controller configuration 控制器设置 - + Data erase 清除数据 - + Error 错误 - + Net connect 网络连接 - + Player select 选择玩家 - + Software keyboard 软件键盘 - + Mii Edit Mii Edit - + Online web 在线网络 - + Shop 商店 - + Photo viewer 照片查看器 - + Offline web 离线网络 - + Login share 第三方账号登录 - + Wifi web auth Wifi 网络认证 - + My page 我的主页 - + Output Engine: 输出引擎: - + Output Device: 输出设备: - + Input Device: 输入设备: - + Mute audio 静音 - + Volume: 音量: - + Mute audio when in background 模拟器位于后台时静音 - + Multicore CPU Emulation 多核 CPU 仿真 - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. 此选项将 CPU 模拟线程的数量从 1 增加到 Switch 实机的最大值 4。 这是调试选项,不应被禁用。 - + Memory Layout 内存布局 - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ Enabling it will increase memory use. It is not recommended to enable unless a s 启用时将增加内存使用量。建议不要启用,除非具有纹理 Mod 的某些游戏需要。 - + Limit Speed Percent 运行速度限制 - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,141 +547,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: 精度: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. 此选项控制模拟 CPU 的精度。 如果您不确定,就不要更改此项。 - - + + Backend: 后端: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) 低精度 FMA (在 CPU 不支持 FMA 指令集的情况下提高性能) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. 该选项通过降低积和熔加运算的精度来提高模拟器在不支持 FMA 指令集 CPU 上的运行速度。 - + Faster FRSQRTE and FRECPE 快速 FRSQRTE 和 FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. 该选项通过使用精度较低的近似值来提高某些浮点函数的运算速度。 - + Faster ASIMD instructions (32 bits only) 加速 ASIMD 指令执行(仅限 32 位) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. 该选项通过不正确的舍入模式来提高 32 位 ASIMD 浮点函数的运行速度。 - + Inaccurate NaN handling 低精度非数处理 - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. 该选项通过取消非数检查来提高速度。 请注意,这也会降低某些浮点指令的精确度。 - + Disable address space checks 禁用地址空间检查 - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. 此选项通过取消每次模拟内存读/写前的安全检查来提高速度。 禁用此选项可能会允许游戏读/写模拟器自己的内存。 - + Ignore global monitor 忽略全局监视器 - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. 此选项仅通过 cmpxchg 指令来提高速度,以确保独占访问指令的安全性。 请注意,这可能会导致死锁和其他问题。 - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. 切换图形 API。 大多数情况下建议使用 Vulkan。 - + Device: 设备: - + This setting selects the GPU to use with the Vulkan backend. 切换图形 API 为 Vulkan 时所使用的 GPU。 - + Shader Backend: 着色器后端: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -692,12 +669,12 @@ GLASM 仅限于 NVIDIA GPU,以 FPS 和渲染精度为代价提供更好的着 SPIR-V 编译速度最快,但在大多数 GPU 驱动程序上表现很差。 - + Resolution: 分辨率: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -706,27 +683,27 @@ Options lower than 1X can cause rendering issues. 低于 1X 的选项可能造成渲染问题。 - + Window Adapting Filter: 窗口滤镜: - + FSR Sharpness: FSR 锐化度: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. 指定使用 FSR 时图像的锐化程度。 - + Anti-Aliasing Method: 抗锯齿方式: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -735,12 +712,12 @@ FXAA has a lower performance impact and can produce a better and more stable pic 快速近似抗锯齿对性能影响较小,可以在非常低的分辨率下生成更好、更稳定的图像。 - + Fullscreen Mode: 全屏模式: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -749,12 +726,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 独占全屏提供更好的性能和 Freesync/Gsync 支持。 - + Aspect Ratio: 屏幕纵横比: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -763,49 +740,36 @@ Switch 游戏只支持 16:9,因此需要 Mod 才能实现其他比例。 此选项也控制捕获屏幕截图的纵横比。 - + Use disk pipeline cache 启用磁盘管线缓存 - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 将生成的着色器保存到硬盘,提高后续游戏过程中的着色器加载速度。 请仅在调试时禁用此项。 - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation 使用 GPU 异步模拟 - + Uses an extra CPU thread for rendering. This option should always remain enabled. 使用额外的 CPU 线程进行渲染。 此选项应始终保持启用状态。 - + NVDEC emulation: NVDEC 模拟方式: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -814,12 +778,12 @@ In most cases, GPU decoding provides the best performance. 大多数情况下,使用 GPU 解码将提供最好的性能。 - + ASTC Decoding Method: ASTC 纹理解码方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -832,37 +796,36 @@ CPU 异步模拟:使用 CPU 在 ASTC 纹理到达时对其进行解码。 消除 ASTC 解码带来的卡顿,但在解码时可能出现渲染问题。 - + ASTC Recompression Method: ASTC 纹理重压缩方式: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. 几乎所有台式机和笔记本电脑 GPU 都不支持 ASTC 纹理,这迫使模拟器解压纹理到 GPU 支持的中间格式 RGBA8。 此选项可将 RGBA8 重新压缩为 BC1 或 BC3 格式,节省 VRAM,但会对图像质量产生负面影响。 - + VRAM Usage Mode: VRAM 使用模式: - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - 指定模拟器使用 VRAM 的方式。此选项对核芯显卡没有影响。 + 指定模拟器使用 VRAM 的方式。此选项对核芯显卡没有影响。 保守模式:模拟器更倾向于节省 VRAM。 激进模式:最大限度利用 VRAM 来提高性能。 激进模式可能会严重影响其他应用程序(如录屏软件)的性能。 - + VSync Mode: 垂直同步模式: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -873,51 +836,49 @@ Mailbox 具有比 FIFO 更低的延迟,不会产生撕裂但可能会掉帧。 Immediate (无同步)只显示可用内容,并可能产生撕裂。 - + Enable asynchronous presentation (Vulkan only) 启用异步帧提交 (仅限 Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 将帧提交移动到单独的 CPU 线程,略微提高性能。 - + Force maximum clocks (Vulkan only) 强制最大时钟 (仅限 Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在后台运行的同时等待图形命令,以防止 GPU 降低时钟速度。 - + Anisotropic Filtering: 各向异性过滤: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. 控制斜角的纹理渲染质量。 这是一个渲染相关的选项,在大多数 GPU 上设置为 16x 是安全的。 - Accuracy Level: - 精度: + 精度: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - 指定 GPU 模拟精度。 + 指定 GPU 模拟精度。 大多数游戏设置为“正常”时渲染效果良好,但某些游戏需要设置为“高”。 粒子效果只能以高精度才能正确渲染。 “极高”只用于调试。 @@ -925,12 +886,12 @@ Some games may require booting on high to render properly. 某些游戏可能在启动时设置为“高”才能正确渲染。 - + Use asynchronous shader building (Hack) 启用异步着色器构建 (不稳定) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. 启用异步着色器编译,可能会减少着色器卡顿。 @@ -945,24 +906,24 @@ This feature is experimental. 启用快速 GPU 时钟。此选项将强制大多数游戏以其最高分辨率运行。 - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -971,111 +932,111 @@ Compute pipelines are always enabled on all other drivers. 在其他的驱动程序上将始终启用计算管线。 - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈环路 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + RNG Seed 随机数生成器种子 - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. 控制随机数生成器的种子。 主要用于快速通关。 - + Device Name 设备名称 - + The name of the emulated Switch. 模拟 Switch 主机的名称。 - + Custom RTC Date: 自定义系统时间: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. 此选项允许更改 Switch 的模拟时钟。 可用于在游戏中操纵时间。 - + Language: 语言: - + Note: this can be overridden when region setting is auto-select 注意:当“地区”设置是“自动选择”时,此设置可能会被覆盖。 - + Region: 地区: - + The region of the emulated Switch. 模拟 Switch 主机的所属地区。 - + Time Zone: 时区: - + The time zone of the emulated Switch. 模拟 Switch 主机的所属时区。 - + Sound Output Mode: 声音输出模式: - + Console Mode: 控制台模式: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1084,7 +1045,7 @@ Setting to Handheld can help improve performance for low end systems. 设置为掌机模式有助于提高低端 PC 上的模拟性能。 - + Prompt for user on game boot 游戏启动时提示选择用户 @@ -1093,7 +1054,7 @@ Setting to Handheld can help improve performance for low end systems. 每次启动时询问用户选择一个用户配置文件。在多人使用同一台电脑上的 yuzu 时,这很有用。 - + Pause emulation when in background 模拟器位于后台时暂停模拟 @@ -1102,843 +1063,992 @@ Setting to Handheld can help improve performance for low end systems. 当用户聚焦在其他窗口时暂停 yuzu。 - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation 停止模拟时需要确认 - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. 此设置将覆盖游戏中确认停止游戏的提示。 启用此项将绕过游戏中的提示并直接退出模拟。 - + Hide mouse on inactivity 自动隐藏鼠标光标 - + This setting hides the mouse after 2.5s of inactivity. 当鼠标停止活动超过 2.5 秒时隐藏鼠标光标。 - + Disable controller applet 禁用控制器小程序 - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. 强制禁用来宾程序使用控制器小程序。 当来宾程序尝试打开控制器小程序时,控制器小程序会立即关闭。 - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode 启用游戏模式 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - + Conservative 保守模式 - + Aggressive 激进模式 - + OpenGL OpenGL - + Vulkan Vulkan - + Null - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM (汇编着色器,仅限 NVIDIA 显卡) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (实验性,仅限 AMD/Mesa) - + Normal 正常 - + High - + Extreme 极高 - + Auto 自动 - + Accurate 高精度 - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + ScaleForce 强制缩放 - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ 超级分辨率锐画技术 - - Area - - - - + None - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + + Default 系统默认 - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - - + + Serbian (српски) + + + + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 中国台湾 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT 格林威治标准时间 (GMT) - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 中国香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT 新西兰-查塔姆群岛 - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1947,37 +2057,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 @@ -2331,27 +2441,27 @@ When a guest attempts to open the controller applet, it is immediately closed.日志 - + Open Log Location 打开日志位置 - + Global Log Filter 全局日志过滤器 - + When checked, the max size of the log increases from 100 MB to 1 GB 选中此项后,日志文件的最大大小从 100MB 增加到 1GB - + Enable Extended Logging** 启用扩展的日志记录** - + Show Log in Console 显示日志窗口 @@ -2497,7 +2607,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2559,7 +2669,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**该选项将在 yuzu 关闭时自动重置。 - + Web applet not compiled Web 小程序未编译 @@ -2609,7 +2719,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2618,88 +2728,88 @@ When a guest attempts to open the controller applet, it is immediately closed.只有当游戏不在运行时,某些设置项才可用。 - + Applets 小程序 - - + + Audio 声音 - - + + CPU CPU - + Debug 调试 - + Filesystem 文件系统 - - + + General 通用 - - + + Graphics 图形 - + GraphicsAdvanced 高级图形选项 - + GraphicsExtensions - + Hotkeys 热键 - - + + Controls 控制 - + Profiles 用户配置 - + Network 网络 - - + + System 系统 - + Game List 游戏列表 - + Web 网络 @@ -2797,51 +2907,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache 重置缓存数据 - + Select Emulated NAND Directory... 选择模拟 NAND 目录... - + Select Emulated SD Directory... 选择模拟 SD 卡目录... - + Select Gamecard Path... 选择游戏卡带路径... - + Select Dump Directory... 选择转储目录... - + Select Mod Load Directory... 选择 Mod 载入目录... - The metadata cache is already empty. - 缓存数据已为空。 + 缓存数据已为空。 - The operation completed successfully. - 操作已成功完成。 + 操作已成功完成。 - The metadata cache couldn't be deleted. It might be in use or non-existent. - 缓存数据删除失败。它可能不存在或正在被使用。 + 缓存数据删除失败。它可能不存在或正在被使用。 @@ -2872,12 +2976,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? 将重置模拟器所有设置并删除所有游戏的单独设置。这不会删除游戏目录、个人文件及输入配置文件。是否继续? @@ -2910,33 +3014,33 @@ When a guest attempts to open the controller applet, it is immediately closed.背景颜色: - + % FSR sharpening percentage (e.g. 50%) % - + Off 关闭 - + VSync Off 垂直同步关 - + Recommended 推荐 - + On 开启 - + VSync On 垂直同步开 @@ -2973,14 +3077,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3012,75 +3120,75 @@ These settings are experimental, and may cause black screens. If your games fail 恢复默认 - + Action 作用 - + Hotkey 热键 - + Controller Hotkey 控制器热键 - - - + + + Conflicting Key Sequence 按键冲突 - - + + The entered key sequence is already assigned to: %1 输入的按键序列已分配给: %1 - + [waiting] [请按键] - + Invalid 无效 - + Invalid hotkey settings 无效的热键设置 - + An error occurred. Please report this issue on github. 发生错误。请在 GitHub 提交 Issue。 - + Restore Default 恢复默认 - + Clear 清除 - + Conflicting Button Sequence 键位冲突 - + The default button sequence is already assigned to: %1 默认的按键序列已分配给: %1 - + The default key sequence is already assigned to: %1 默认的按键序列已分配给: %1 @@ -3400,7 +3508,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3555,7 +3663,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick 左摇杆 @@ -3665,14 +3773,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3691,7 +3799,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus @@ -3704,15 +3812,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3757,7 +3865,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick 右摇杆 @@ -3772,242 +3880,242 @@ These settings are experimental, and may cause black screens. If your games fail 设置 - - - - + + + + Clear 清除 - - - - - + + + + + [not set] [未设置] - - - + + + Invert button 反转按键 - - + + Toggle button 切换按键 - + Turbo button 连发键 - - + + Invert axis 轴方向倒置 - - - + + + Set threshold 阈值设定 - - + + Choose a value between 0% and 100% 选择一个介于 0% 和 100% 之间的值 - + Toggle axis 切换轴 - + Set gyro threshold 陀螺仪阈值设定 - + Calibrate sensor 校准传感器 - + Map Analog Stick 映射摇杆 - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. 在按下确定后,首先水平移动你的手柄,然后垂直移动它。 如果要使体感方向倒置,首先垂直移动你的手柄,然后水平移动它。 - + Center axis 中心轴 - - + + Deadzone: %1% 摇杆死区:%1% - - + + Modifier Range: %1% 摇杆灵敏度:%1% - - + + Pro Controller Pro Controller - + Dual Joycons 双 Joycons 手柄 - + Left Joycon 左 Joycon 手柄 - + Right Joycon 右 Joycon 手柄 - + Handheld 掌机模式 - + GameCube Controller GameCube 控制器 - + Poke Ball Plus 精灵球 PLUS - + NES Controller NES 控制器 - + SNES Controller SNES 控制器 - + N64 Controller N64 控制器 - + Sega Genesis 世嘉创世纪 - + Start / Pause 开始 / 暂停 - + Z Z - + Control Stick 控制摇杆 - + C-Stick C 摇杆 - + Shake! 摇动! - + [waiting] [等待中] - + New Profile 新建自定义设置 - + Enter a profile name: 输入配置文件名称: - - + + Create Input Profile 新建输入配置文件 - + The given profile name is not valid! 输入的配置文件名称无效! - + Failed to create the input profile "%1" 新建输入配置文件 "%1" 失败 - + Delete Input Profile 删除输入配置文件 - + Failed to delete the input profile "%1" 删除输入配置文件 "%1" 失败 - + Load Input Profile 加载输入配置文件 - + Failed to load the input profile "%1" 加载输入配置文件 "%1" 失败 - + Save Input Profile 保存输入配置文件 - + Failed to save the input profile "%1" 保存输入配置文件 "%1" 失败 @@ -4064,7 +4172,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure 设置 @@ -4100,7 +4208,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test 测试 @@ -4119,7 +4227,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">了解更多</span></a> - + %1:%2 %1:%2 @@ -4128,77 +4236,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters 端口号中包含无效字符 - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 端口必须为 0 到 65353 之间 - + IP address is not valid 无效的 IP 地址 - + This UDP server already exists 此 UDP 服务器已存在 - + Unable to add more than 8 servers 最多只能添加 8 个服务器 - + Testing 测试中 - + Configuring 配置中 - + Test Successful 测试成功 - + Successfully received data from the server. 已成功地从服务器获取数据。 - + Test Failed 测试失败 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 无法从服务器获取数据。<br>请验证服务器是否正在运行,以及地址和端口是否配置正确。 - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP 测试或触摸校准正在进行中。<br>请耐心等待。 @@ -4325,7 +4433,12 @@ Current values are %1% and %2% respectively. 网络接口 - + + Enable Airplane Mode + + + + None @@ -4383,52 +4496,52 @@ Current values are %1% and %2% respectively. 只有当游戏不在运行时,某些设置项才可用。 - + Add-Ons 附加项 - + System 系统 - + CPU CPU - + Graphics 图形 - + Adv. Graphics 高级图形 - + GPU Extensions - + Audio 声音 - + Input Profiles 输入配置文件 - + Linux Linux - + Properties 属性 @@ -4446,12 +4559,12 @@ Current values are %1% and %2% respectively. 附加项 - + Patch Name 补丁名称 - + Version 版本 @@ -4489,27 +4602,32 @@ Current values are %1% and %2% respectively. 设置图像 - + + Select Avatar + + + + Add 添加 - + Rename 重命名 - + Remove 移除 - + Profile management is available only when game is not running. 只有当游戏不在运行时,才能进行用户配置的管理。 - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4517,100 +4635,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username 输入用户名 - + Users 用户 - + Enter a username for the new user: 输入新用户的用户名: - + Enter a new username: 输入新的用户名: - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image 选择用户图像 - - JPEG Images (*.jpg *.jpeg) - JPEG 图像 (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + 无可用固件 + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG 图像 (*.jpg *.jpeg) + + + Error deleting image 删除图像时出错 - + Error occurred attempting to overwrite previous image at: %1. 尝试覆盖该用户的现有图像时出错: %1 - + Error deleting file 删除文件时出错 - + Unable to delete existing file: %1. 无法删除文件: %1 - + Error creating user image directory 创建用户图像目录时出错 - + Unable to create directory %1 for storing user images. 无法创建存储用户图像的目录 %1 。 - Error copying user image - 复制用户图像时出错 + 复制用户图像时出错 - Unable to copy image from %1 to %2 - 无法将图像从 %1 复制到 %2 + 无法将图像从 %1 复制到 %2 - Error resizing user image - 调整用户图像大小时出错 + 调整用户图像大小时出错 - Unable to resize image - 无法调整图像的大小 + 无法调整图像的大小 + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + 取消 + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. 删除此用户?此用户保存的所有数据都将被删除。 - + Confirm Delete 确认删除 - + Name: %1 UUID: %2 名称: %1 @@ -4663,7 +4870,7 @@ UUID: %2 - + Enable 启用 @@ -4674,7 +4881,7 @@ UUID: %2 - + Not connected 未连接 @@ -4684,63 +4891,63 @@ UUID: %2 恢复默认 - + Clear 清除 - + [not set] [未设置] - + Invert axis 轴方向倒置 - - + + Deadzone: %1% 摇杆死区:%1% - + Error enabling ring input 启用健身环输入时出错 - + Direct Joycon driver is not enabled 未启用 Joycon 直接驱动 - + Configuring 配置中 - + The current mapped device doesn't support the ring controller 当前映射的设备不支持健身环控制器 - + The current mapped device doesn't have a ring attached 当前映射的设备未连接健身环控制器 - + The current mapped device is not connected 当前映射的设备未连接 - + Unexpected driver result %1 意外的驱动结果: %1 - + [waiting] [请按键] @@ -4782,7 +4989,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4834,12 +5041,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS 设置 - + Select TAS Load Directory... 选择 TAS 载入目录... @@ -4949,7 +5156,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5269,6 +5476,16 @@ Drag points to change position, or double-click table cells to edit values.Web 网络 + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu 网络服务 @@ -5278,42 +5495,29 @@ Drag points to change position, or double-click table cells to edit values.提供您的用户名和令牌意味着您同意让 yuzu 收集额外的使用数据,其中可能包括用户识别信息。 - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - 验证 + 验证 - Sign up - 注册 + 注册 - + Token: 令牌: - + Username: 用户名: - What is my token? - 我的令牌是? + 我的令牌是? - + Web Service configuration can only be changed when a public room isn't being hosted. 公共房间未被创建时,才能更改网络服务设置。 @@ -5338,12 +5542,12 @@ Drag points to change position, or double-click table cells to edit values.重新生成 - + Discord Presence Discord 状态 - + Show Current Game in your Discord Status 在您的 Discord 状态中显示当前游戏 @@ -5352,24 +5556,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">了解更多</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">注册</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">注册</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5392,10 +5580,9 @@ Drag points to change position, or double-click table cells to edit values.令牌未被验证。您对用户名和令牌的更改尚未保存。 - Unverified, please click Verify before saving configuration Tooltip - 令牌未验证,请在保存配置前先进行验证。 + 令牌未验证,请在保存配置前先进行验证。 Verifying... @@ -5419,20 +5606,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. 验证失败。请检查您输入的令牌是否正确,并且确保您的互联网连接正常。 + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 控制器 P1 - + &Controller P1 控制器 P1 (&C) + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + 版本 + + DirectConnect @@ -5538,7 +5772,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5546,11 +5785,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. 此房间的主人已将您封禁。请联系房主进行解封或选择其他房间。 - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5612,7 +5846,7 @@ Please go to Configure -> System -> Network and make a selection. 使用数据共享 - + Broken Vulkan Installation Detected 检测到 Vulkan 的安装已损坏 @@ -5621,106 +5855,105 @@ Please go to Configure -> System -> Network and make a selection. Vulkan 初始化失败。<br><br>点击<a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>这里</a>获取此问题的相关信息。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 游戏正在运行 - + Loading Web Applet... 正在加载 Web 小程序... - - + + Disable Web Applet 禁用 Web 小程序 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 禁用 Web 小程序可能会发生未知的行为,且只能在《超级马里奥 3D 全明星》中使用。您确定要禁用 Web 小程序吗? (您可以在调试选项中重新启用它。) - + The amount of shaders currently being built 当前正在构建的着色器数量 - + The current selected resolution scaling multiplier. 当前选定的分辨率缩放比例。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 当前的模拟速度。高于或低于 100% 的值表示运行速度比实际的 Switch 更快或更慢。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 游戏当前运行的帧率。这将因游戏和场景的不同而有所变化。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 在不计算速度限制和垂直同步的情况下,模拟一个 Switch 帧的实际时间。若要进行全速模拟,这个数值不应超过 16.67 毫秒。 - + Unmute 取消静音 - + Mute 静音 - + Reset Volume 重置音量 - + &Clear Recent Files 清除最近文件 (&C) - + &Continue 继续 (&C) - + &Pause 暂停 (&P) - Warning Outdated Game Format - 过时游戏格式警告 + 过时游戏格式警告 You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. 目前使用的游戏为解体的 ROM 目录格式,这是一种过时的格式,已被其他格式替代,如 NCA,NAX,XCI 或 NSP。解体的 ROM 目录缺少图标、元数据和更新支持。<br><br>有关 yuzu 支持的各种 Switch 格式的说明,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>请查看我们的 wiki</a>。此消息将不会再次出现。 - - + + Error while loading ROM! 加载 ROM 时出错! - + The ROM format is not supported. 该 ROM 格式不受支持。 - + An error occurred initializing the video core. 初始化视频核心时发生错误 @@ -5729,7 +5962,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu 在运行视频核心时发生错误。这可能是由 GPU 驱动程序过旧造成的。有关详细信息,请参阅日志文件。关于日志文件的更多信息,请参考以下页面:<a href='https://yuzu-emu.org/help/reference/log-files/'>如何上传日志文件</a>。 - + Error while loading ROM! %1 %1 signifies a numeric error code. 加载 ROM 时出错! %1 @@ -5740,760 +5973,761 @@ Please go to Configure -> System -> Network and make a selection. %1<br>请参考<a href='https://yuzu-emu.org/help/quickstart/'>yuzu 快速导航</a>以获取相关文件。<br>您可以参考 yuzu 的 wiki 页面</a>或 Discord 社区</a>以获得帮助。 - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. 发生了未知错误。请查看日志了解详情。 - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 正在关闭… - + Save Data 保存数据 - + Mod Data Mod 数据 - + Error Opening %1 Folder 打开 %1 文件夹时出错 - - + + Folder does not exist! 文件夹不存在! - Error Opening Transferable Shader Cache - 打开可转移着色器缓存时出错 + 打开可转移着色器缓存时出错 - Failed to create the shader cache directory for this title. - 为该游戏创建着色器缓存目录时失败。 + 为该游戏创建着色器缓存目录时失败。 - Error Removing Contents - 删除内容时出错 + 删除内容时出错 - Error Removing Update - 删除更新时出错 + 删除更新时出错 - Error Removing DLC - 删除 DLC 时出错 + 删除 DLC 时出错 - + Remove Installed Game Contents? 删除已安装的游戏内容? - + Remove Installed Game Update? 删除已安装的游戏更新? - + Remove Installed Game DLC? 删除已安装的游戏 DLC 内容? - + Remove Entry 删除项目 - - - - - - Successfully Removed - 删除成功 + 删除成功 - Successfully removed the installed base game. - 成功删除已安装的游戏。 + 成功删除已安装的游戏。 - The base game is not installed in the NAND and cannot be removed. - 该游戏未安装于 NAND 中,无法删除。 + 该游戏未安装于 NAND 中,无法删除。 - Successfully removed the installed update. - 成功删除已安装的游戏更新。 + 成功删除已安装的游戏更新。 - There is no update installed for this title. - 这个游戏没有任何已安装的更新。 + 这个游戏没有任何已安装的更新。 - There are no DLC installed for this title. - 这个游戏没有任何已安装的 DLC 。 + 这个游戏没有任何已安装的 DLC 。 - Successfully removed %1 installed DLC. - 成功删除游戏 %1 安装的 DLC 。 + 成功删除游戏 %1 安装的 DLC 。 - + Delete OpenGL Transferable Shader Cache? 删除 OpenGL 模式的着色器缓存? - + Delete Vulkan Transferable Shader Cache? 删除 Vulkan 模式的着色器缓存? - + Delete All Transferable Shader Caches? 删除所有的着色器缓存? - + Remove Custom Game Configuration? 移除自定义游戏设置? - + Remove Cache Storage? 移除缓存? - + Remove File 删除文件 - + Remove Play Time Data 清除游玩时间 - + Reset play time? 重置游玩时间? - - Error Removing Transferable Shader Cache - 删除着色器缓存时出错 + 删除着色器缓存时出错 - - A shader cache for this title does not exist. - 这个游戏的着色器缓存不存在。 + 这个游戏的着色器缓存不存在。 - Successfully removed the transferable shader cache. - 成功删除着色器缓存。 + 成功删除着色器缓存。 - Failed to remove the transferable shader cache. - 删除着色器缓存失败。 + 删除着色器缓存失败。 - Error Removing Vulkan Driver Pipeline Cache - 删除 Vulkan 驱动程序管线缓存时出错 + 删除 Vulkan 驱动程序管线缓存时出错 - Failed to remove the driver pipeline cache. - 删除驱动程序管线缓存失败。 + 删除驱动程序管线缓存失败。 - - Error Removing Transferable Shader Caches - 删除着色器缓存时出错 + 删除着色器缓存时出错 - Successfully removed the transferable shader caches. - 着色器缓存删除成功。 + 着色器缓存删除成功。 - Failed to remove the transferable shader cache directory. - 删除着色器缓存目录失败。 + 删除着色器缓存目录失败。 - - Error Removing Custom Configuration - 移除自定义游戏设置时出错 + 移除自定义游戏设置时出错 - A custom configuration for this title does not exist. - 这个游戏的自定义设置不存在。 + 这个游戏的自定义设置不存在。 - Successfully removed the custom game configuration. - 成功移除自定义游戏设置。 + 成功移除自定义游戏设置。 - Failed to remove the custom game configuration. - 移除自定义游戏设置失败。 + 移除自定义游戏设置失败。 - - + + RomFS Extraction Failed! RomFS 提取失败! - + There was an error copying the RomFS files or the user cancelled the operation. 复制 RomFS 文件时出错,或用户取消了操作。 - + Full 完整 - + Skeleton 框架 - + Select RomFS Dump Mode 选择 RomFS 转储模式 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. 请选择 RomFS 转储的方式。<br>“完整” 会将所有文件复制到新目录中,而<br>“框架” 只会创建目录结构。 - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 没有足够的空间用于提取 RomFS。请保持足够的空间或于模拟—>设置—>系统—>文件系统—>转储根目录中选择一个其他目录。 - + Extracting RomFS... 正在提取 RomFS... - - - - - + + Cancel 取消 - + RomFS Extraction Succeeded! RomFS 提取成功! - - - + The operation completed successfully. 操作成功完成。 - Integrity verification couldn't be performed! - 无法执行完整性验证! + 无法执行完整性验证! - File contents were not checked for validity. - 未检查文件的完整性。 + 未检查文件的完整性。 - - Verifying integrity... - 正在验证完整性... + 正在验证完整性... - - Integrity verification succeeded! - 完整性验证成功! + 完整性验证成功! - - Integrity verification failed! - 完整性验证失败! + 完整性验证失败! - File contents may be corrupt. - 文件可能已经损坏。 + 文件可能已经损坏。 - - - - Create Shortcut - 创建快捷方式 + 创建快捷方式 - Do you want to launch the game in fullscreen? - 您想以全屏模式启动游戏吗? + 您想以全屏模式启动游戏吗? - Successfully created a shortcut to %1 - %1 的快捷方式创建成功 + %1 的快捷方式创建成功 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - 这将为当前的游戏创建快捷方式。但在其更新后,快捷方式可能无法正常工作。是否继续? + 这将为当前的游戏创建快捷方式。但在其更新后,快捷方式可能无法正常工作。是否继续? - Failed to create a shortcut to %1 - %1 的快捷方式创建失败 + %1 的快捷方式创建失败 - Create Icon - 创建图标 + 创建图标 - Cannot create icon file. Path "%1" does not exist and cannot be created. - 无法创建图标文件。路径“ %1 ”不存在且无法被创建。 + 无法创建图标文件。路径“ %1 ”不存在且无法被创建。 - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 打开 %1 时出错 - + Select Directory 选择目录 - + Properties 属性 - + The game properties could not be loaded. 无法加载该游戏的属性信息。 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - + Open Extracted ROM Directory 打开提取的 ROM 目录 - + Invalid Directory Selected 选择的目录无效 - + The directory you have selected does not contain a 'main' file. 选择的目录不包含 “main” 文件。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 可安装 Switch 文件 (*.nca *.nsp *.xci);;任天堂内容档案 (*.nca);;任天堂应用包 (*.nsp);;NX 卡带镜像 (*.xci) - + Install Files 安装文件 - + %n file(s) remaining 剩余 %n 个文件 + 剩余 %n 个文件 - + Installing file "%1"... 正在安装文件 "%1"... - - + + Install Results 安装结果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 为了避免可能存在的冲突,我们不建议将游戏本体安装到 NAND 中。 此功能仅用于安装游戏更新和 DLC 。 - + %n file(s) were newly installed - 最近安装了 %n 个文件 - + 最近安装了 %n 个文件 + 最近安装了 %n 个文件 - + %n file(s) were overwritten - %n 个文件被覆盖 - + %n 个文件被覆盖 + %n 个文件被覆盖 - + %n file(s) failed to install - %n 个文件安装失败 - + %n 个文件安装失败 + %n 个文件安装失败 - + System Application 系统应用 - + System Archive 系统档案 - + System Application Update 系统应用更新 - + Firmware Package (Type A) 固件包 (A型) - + Firmware Package (Type B) 固件包 (B型) - + Game 游戏 - + Game Update 游戏更新 - + Game DLC 游戏 DLC - + Delta Title 差量程序 - + Select NCA Install Type... 选择 NCA 安装类型... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 请选择此 NCA 的程序类型: (在大多数情况下,选择默认的“游戏”即可。) - + Failed to Install 安装失败 - + The title type you selected for the NCA is invalid. 选择的 NCA 程序类型无效。 - + File not found 找不到文件 - + File "%1" not found 文件 "%1" 未找到 - + OK 确定 - - + + Hardware requirements not met 硬件不满足要求 - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. 您的系统不满足运行 yuzu 的推荐配置。兼容性报告已被禁用。 - + Missing yuzu Account 未设置 yuzu 账户 - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. 要提交游戏兼容性测试用例,您必须设置您的 yuzu 帐户。<br><br/>要设置您的 yuzu 帐户,请转到模拟 &gt; 设置 &gt; 网络。 - + Error opening URL 打开 URL 时出错 - + Unable to open the URL "%1". 无法打开 URL : "%1" 。 - + TAS Recording TAS 录制中 - + Overwrite file of player 1? 覆盖玩家 1 的文件? - + Invalid config detected 检测到无效配置 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 掌机手柄无法在主机模式中使用。将会选择 Pro controller。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 当前的 Amiibo 已被移除。 - + Error 错误 - - + + The current game is not looking for amiibos 当前游戏并没有在寻找 Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);; 全部文件 (*.*) - + Load Amiibo 加载 Amiibo - + Error loading Amiibo data 加载 Amiibo 数据时出错 - + The selected file is not a valid amiibo 选择的文件并不是有效的 amiibo - + The selected file is already on use 选择的文件已在使用中 - + An unknown error occurred 发生了未知错误 - - Verification failed for the following files: %1 - 以下文件完整性验证失败: + 以下文件完整性验证失败: %1 - + + Keys not installed 密钥未安装 @@ -6502,273 +6736,234 @@ Would you like to bypass this and exit anyway? 在安装固件之前,请先安装密钥并重新启动 yuzu。 - + Select Dumped Firmware Source Location 选择固件位置 - Installing Firmware... - 正在安装固件... + 正在安装固件... - - - - Firmware install failed - 固件安装失败 + 固件安装失败 - Unable to locate potential firmware NCA files - 无法定位某些固件 NCA 文件 + 无法定位某些固件 NCA 文件 - Failed to delete one or more firmware file. - 无法删除某些固件文件。 + 无法删除某些固件文件。 Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. 固件安装被取消,安装的固件可能已经损坏。请重新启动 yuzu,或重新安装固件。 - One or more firmware files failed to copy into NAND. - 某些固件文件未能复制到 NAND。 + 某些固件文件未能复制到 NAND。 - Firmware integrity verification failed! - 固件完整性验证失败! + 固件完整性验证失败! - Select Dumped Keys Location - 选择密钥文件位置 + 选择密钥文件位置 - - - Decryption Keys install failed - 密钥文件安装失败 + 密钥文件安装失败 - prod.keys is a required decryption key file. - prod.keys 是必需的解密密钥文件。 + prod.keys 是必需的解密密钥文件。 - One or more keys failed to copy. - 某些密钥文件复制失败。 + 某些密钥文件复制失败。 - Decryption Keys install succeeded - 密钥文件安装成功 + 密钥文件安装成功 - Decryption Keys were successfully installed - 密钥文件已成功安装 + 密钥文件已成功安装 - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - 密钥文件无法初始化。请检查您的转储工具是否为最新版本,然后重新转储密钥文件。 + 密钥文件无法初始化。请检查您的转储工具是否为最新版本,然后重新转储密钥文件。 - - - - - - - + + + + + + No firmware available 无可用固件 - Please install the firmware to use the Album applet. - 请安装固件以使用相册小程序。 + 请安装固件以使用相册小程序。 - + Album Applet 相册小程序 - + Album applet is not available. Please reinstall firmware. 相册小程序不可用。请重新安装固件。 - Please install the firmware to use the Cabinet applet. - 请安装固件以使用 Cabinet 小程序。 + 请安装固件以使用 Cabinet 小程序。 - + Cabinet Applet Cabinet 小程序 - + Cabinet applet is not available. Please reinstall firmware. Cabinet 小程序不可用。请重新安装固件。 - Please install the firmware to use the Mii editor. - 请安装固件以使用 Mii editor。 + 请安装固件以使用 Mii editor。 - + Mii Edit Applet Mii Edit 小程序 - + Mii editor is not available. Please reinstall firmware. Mii editor 不可用。请重新安装固件。 - Please install the firmware to use the Controller Menu. - 请安装固件以使用控制器菜单。 + 请安装固件以使用控制器菜单。 - + Controller Applet 控制器小程序 - + Controller Menu is not available. Please reinstall firmware. 控制器菜单不可用。请重新安装固件。 - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot 捕获截图 - + PNG Image (*.png) PNG 图像 (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS 状态:正在运行 %1/%2 - + TAS state: Recording %1 TAS 状态:正在录制 %1 - + TAS state: Idle %1/%2 TAS 状态:空闲 %1/%2 - + TAS State: Invalid TAS 状态:无效 - + &Stop Running 停止运行 (&S) - + &Start 开始 (&S) - + Stop R&ecording 停止录制 (&E) - + R&ecord 录制 (&E) - + Building: %n shader(s) 正在编译 %n 个着色器文件 + 正在编译 %n 个着色器文件 - + Scale: %1x %1 is the resolution scaling factor 缩放比例: %1x - + Speed: %1% / %2% 速度: %1% / %2% - + Speed: %1% 速度: %1% @@ -6777,44 +6972,44 @@ Would you like to download it? FPS: %1 (未锁定) - + Game: %1 FPS FPS: %1 - + Frame: %1 ms 帧延迟: %1 毫秒 - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA 抗锯齿关 - + VOLUME: MUTE 音量: 静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + Derivation Components Missing 组件丢失 @@ -6823,12 +7018,12 @@ Would you like to download it? 密钥缺失。<br>请查看<a href='https://yuzu-emu.org/help/quickstart/'>yuzu 快速导航</a>以获得你的密钥、固件和游戏。 - + Select RomFS Dump Target 选择 RomFS 转储目标 - + Please select which RomFS you would like to dump. 请选择希望转储的 RomFS。 @@ -6841,7 +7036,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 您确定要停止模拟吗?未保存的进度将会丢失。 @@ -6854,102 +7049,102 @@ Would you like to bypass this and exit anyway? 您希望忽略并退出吗? - + None - + FXAA FXAA - + SMAA SMAA - + Nearest 邻近取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + ScaleForce 强制缩放 - + Area - + Docked 主机模式 - + Handheld 掌机模式 - + Normal 正常 - + High - + Extreme 极高 - + Vulkan Vulkan - + OpenGL OpenGL - + Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6957,13 +7152,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! OpenGL 模式不可用! - + OpenGL shared contexts are not supported. 不支持 OpenGL 共享上下文。 @@ -6972,33 +7167,33 @@ Would you like to bypass this and exit anyway? yuzu 没有使用 OpenGL 进行编译。 - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! 初始化 OpenGL 时出错! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. 您的 GPU 可能不支持 OpenGL ,或者您没有安装最新的显卡驱动。 - + Error while initializing OpenGL 4.6! 初始化 OpenGL 4.6 时出错! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 您的 GPU 可能不支持 OpenGL 4.6 ,或者您没有安装最新的显卡驱动。<br><br>GL 渲染器:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 您的 GPU 可能不支持某些必需的 OpenGL 扩展。请确保您已经安装最新的显卡驱动。<br><br>GL 渲染器:<br>%1<br><br>不支持的扩展:<br>%2 @@ -7006,128 +7201,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite 收藏 - + Start Game 开始游戏 - + Start Game without Custom Configuration 使用公共设置项进行游戏 - + Open Save Data Location 打开存档位置 - + Open Mod Data Location 打开 MOD 数据位置 - + Open Transferable Pipeline Cache 打开可转移着色器缓存 - + Remove 删除 - + Remove Installed Update 删除已安装的游戏更新 - + Remove All Installed DLC 删除所有已安装 DLC - + Remove Custom Configuration 删除自定义设置 - + Remove Play Time Data 清除游玩时间 - + Remove Cache Storage 移除缓存 - + Remove OpenGL Pipeline Cache 删除 OpenGL 着色器缓存 - + Remove Vulkan Pipeline Cache 删除 Vulkan 着色器缓存 - + Remove All Pipeline Caches 删除所有着色器缓存 - + Remove All Installed Contents 删除所有安装的项目 - + Dump RomFS 转储 RomFS - + Dump RomFS to SDMC 转储 RomFS 到 SDMC - + Verify Integrity 完整性验证 - + Copy Title ID to Clipboard 复制游戏 ID 到剪贴板 - + Navigate to GameDB entry 查看兼容性报告 - + Create Shortcut 创建快捷方式 - + Add to Desktop 添加到桌面 - + Add to Applications Menu 添加到应用程序菜单 - + Configure Game @@ -7136,62 +7331,62 @@ Would you like to bypass this and exit anyway? 属性 - + Scan Subfolders 扫描子文件夹 - + Remove Game Directory 移除游戏目录 - + ▲ Move Up ▲ 向上移动 - + ▼ Move Down ▼ 向下移动 - + Open Directory Location 打开目录位置 - + Clear 清除 - + Name 名称 - + Compatibility 兼容性 - + Add-ons 附加项 - + File type 文件类型 - + Size 大小 - + Play time 游玩时间 @@ -7199,62 +7394,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame 可进游戏 - + Game starts, but crashes or major glitches prevent it from being completed. 游戏可以开始,但会出现崩溃或严重故障导致游戏无法继续。 - + Perfect 完美 - + Game can be played without issues. 游戏可以毫无问题地运行。 - + Playable 可运行 - + Game functions with minor graphical or audio glitches and is playable from start to finish. 游戏可以从头到尾完整地运行,但可能出现轻微的图形或音频故障。 - + Intro/Menu 开场/菜单 - + Game loads, but is unable to progress past the Start Screen. 游戏可以加载,但无法通过标题页面。 - + Won't Boot 无法启动 - + The game crashes when attempting to startup. 在启动游戏时直接崩溃。 - + Not Tested 未测试 - + The game has not yet been tested. 游戏尚未经过测试。 @@ -7262,7 +7457,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list 双击添加新的游戏文件夹 @@ -7270,19 +7465,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) %1 / %n 个结果 + %1 / %n 个结果 - + Filter: 搜索: - + Enter pattern to filter 搜索游戏 @@ -7364,7 +7560,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7378,91 +7574,91 @@ Debug Message: Hotkeys - + Audio Mute/Unmute 开启/关闭静音 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window 主窗口 - + Audio Volume Down 调低音量 - + Audio Volume Up 调高音量 - + Capture Screenshot 捕获截图 - + Change Adapting Filter 更改窗口滤镜 - + Change Docked Mode 更改主机运行模式 - + Change GPU Accuracy 更改 GPU 精度 - + Configure 设置 - + Configure Current Game - + Continue/Pause Emulation 继续/暂停模拟 - + Exit Fullscreen 退出全屏 @@ -7471,97 +7667,97 @@ Debug Message: 退出 yuzu - - Exit eden + + Exit Eden - + Fullscreen 全屏 - + Load File 加载文件 - + Load/Remove Amiibo 加载/移除 Amiibo - + Multiplayer Browse Public Game Lobby 浏览公共游戏大厅 - + Multiplayer Create Room 创建房间 - + Multiplayer Direct Connect to Room 直接连接到房间 - + Multiplayer Leave Room 离开房间 - + Multiplayer Show Current Room 显示当前房间 - + Restart Emulation 重新启动模拟 - + Stop Emulation 停止模拟 - + TAS Record TAS 录制 - + TAS Reset 重置 TAS - + TAS Start/Stop TAS 开始/停止 - + Toggle Filter Bar 显示/隐藏搜索栏 - + Toggle Framerate Limit 打开/关闭帧率限制 - + Toggle Mouse Panning 打开/关闭鼠标平移 - + Toggle Renderdoc Capture 切换到 Renderdoc 捕获截图 - + Toggle Status Bar 显示/隐藏状态栏 @@ -7569,22 +7765,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. 请确认这些您想要安装的文件。 - + Installing an Update or DLC will overwrite the previously installed one. 安装游戏更新或 DLC 时,会覆盖以前安装的内容。 - + Install 安装 - + Install Files to NAND 安装文件到 NAND @@ -7592,7 +7788,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 文本中不能包含以下字符: @@ -7739,152 +7935,207 @@ Debug Message: 最近文件 (&R) - + + Open &Eden Folders + + + + &Emulation 模拟 (&E) - + &View 视图 (&V) - + &Reset Window Size 重置窗口大小 (&R) - + &Debugging 调试 (&D) - + Reset Window Size to &720p 重置窗口大小为720p (&7) - + Reset Window Size to 720p 重置窗口大小为720p - + Reset Window Size to &900p 重置窗口大小为900p (&9) - + Reset Window Size to 900p 重置窗口大小为900p - + Reset Window Size to &1080p 重置窗口大小为1080p (&1) - + Reset Window Size to 1080p 重置窗口大小为1080p - + &Multiplayer 多人游戏 (&M) - + &Tools 工具 (&T) - + &Amiibo Amiibo (&A) - + &TAS TAS (&T) - + &Create Home Menu Shortcut - + &Help 帮助 (&H) - + &Install Files to NAND... 安装文件到 NAND... (&I) - + L&oad File... 加载文件... (&O) - + Load &Folder... 加载文件夹... (&F) - + E&xit 退出 (&X) - + &Pause 暂停 (&P) - + &Stop 停止 (&S) - + &Verify Installed Contents 验证已安装内容的完整性 (&V) - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7893,97 +8144,97 @@ Debug Message: 关于 yuzu (&A) - + Single &Window Mode 单窗口模式 (&W) - + Con&figure... 设置... (&F) - + Ctrl+, - + Display D&ock Widget Headers 显示停靠小部件的标题 (&O) - + Show &Filter Bar 显示搜索栏 (&F) - + Show &Status Bar 显示状态栏 (&S) - + Show Status Bar 显示状态栏 - + &Browse Public Game Lobby 浏览公共游戏大厅 (&B) - + &Create Room 创建房间 (&C) - + &Leave Room 离开房间 (&L) - + &Direct Connect to Room 直接连接到房间 (&D) - + &Show Current Room 显示当前房间 (&S) - + F&ullscreen 全屏 (&U) - + &Restart 重新启动 (&R) - + Load/Remove &Amiibo... 加载/移除 Amiibo... (&A) - + &Report Compatibility 报告兼容性 (&R) - + Open &Mods Page 打开 Mod 页面 (&M) - + Open &Quickstart Guide 查看快速导航 (&Q) - + &FAQ FAQ (&F) @@ -7992,77 +8243,82 @@ Debug Message: 打开 yuzu 文件夹 (&Y) - + &Capture Screenshot 捕获截图 (&C) - + Open &Album 打开相册 (&A) - + &Set Nickname and Owner 设置昵称及所有者 (&S) - + &Delete Game Data 删除游戏数据 (&D) - + &Restore Amiibo 重置 Amiibo (&R) - + &Format Amiibo 格式化 Amiibo (&F) - + Open &Mii Editor 打开 Mii Editor (&M) - + &Configure TAS... 配置 TAS... (&C) - + Configure C&urrent Game... 配置当前游戏... (&U) - + &Start 开始 (&S) - + &Reset 重置 (&R) - + R&ecord 录制 (&E) - + Open &Controller Menu 打开控制器菜单 (&C) - + Install Firmware 安装固件 - + + &About Eden + + + + Install Decryption Keys 安装密钥文件 @@ -8070,26 +8326,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - MicroProfile (&M) + MicroProfile (&M) MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8149,37 +8415,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status 当前的连接状态 - + Not Connected. Click here to find a room! 未连接。点击此处查找一个房间! - + Not Connected 未连接 - + Connected 已连接 - + New Messages Received 收到了新消息 - + Error 错误 - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: 更新房间信息时失败。请检查网络连接并尝试重开房间。 @@ -8371,56 +8637,56 @@ p, li { white-space: pre-wrap; } 不在玩游戏 - + Installed SD Titles SD 卡中安装的项目 - + Installed NAND Titles NAND 中安装的项目 - + System Titles 系统项目 - + Add New Game Directory 添加游戏目录 - + Favorites 收藏 - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [未设置] @@ -8431,14 +8697,14 @@ p, li { white-space: pre-wrap; } 方向键 %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 轴 %1%2 @@ -8449,357 +8715,357 @@ p, li { white-space: pre-wrap; } 按键 %1 - - - - - - + + + + + + [unknown] [未知] - - - + + + Left - - - + + + Right - - - + + + Down - - - + + + Up - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start 开始 - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle - - + + Cross - - + + Square - - + + Triangle Δ - - + + Share 分享 - - + + Options 选项 - - + + [undefined] [未指定] - + %1%2 %1%2 - - + + [invalid] [无效] - - + + %1%2Hat %3 %1%2方向键 %3 - - - + + + %1%2Axis %3 %1%2轴 %3 - - + + %1%2Axis %3,%4,%5 %1%2轴 %3,%4,%5 - - + + %1%2Motion %3 %1%2体感 %3 - - + + %1%2Button %3 %1%2按键 %3 - - + + [unused] [未使用] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L 左摇杆 - + Stick R 右摇杆 - + Plus - + Minus - - + + Home Home - + Capture 截图 - + Touch 触摸 - + Wheel Indicates the mouse wheel 鼠标滚轮 - + Backward 后退 - + Forward 前进 - + Task 任务键 - + Extra 额外按键 - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3方向键 %4 - - + + %1%2%3Axis %4 %1%2%3轴 %4 - - + + %1%2%3Button %4 %1%2%3 按键 %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8917,6 +9183,300 @@ p, li { white-space: pre-wrap; } 您想要恢复这个 amiibo 吗? + + QtCommon::Content + + + Installing Firmware... + 正在安装固件... + + + + + + Cancel + 取消 + + + + Firmware integrity verification failed! + 固件完整性验证失败! + + + + + Verification failed for the following files: + +%1 + 以下文件完整性验证失败: + +%1 + + + + + Verifying integrity... + 正在验证完整性... + + + + + Integrity verification succeeded! + 完整性验证成功! + + + + + The operation completed successfully. + + + + + + Integrity verification failed! + 完整性验证失败! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + 选择密钥文件位置 + + + + Decryption Keys install succeeded + 密钥文件安装成功 + + + + Decryption Keys were successfully installed + 密钥文件已成功安装 + + + + Decryption Keys install failed + 密钥文件安装失败 + + + + QtCommon::Game + + + Error Removing Contents + 删除内容时出错 + + + + Error Removing Update + 删除更新时出错 + + + + Error Removing DLC + 删除 DLC 时出错 + + + + The base game is not installed in the NAND and cannot be removed. + 该游戏未安装于 NAND 中,无法删除。 + + + + There is no update installed for this title. + 这个游戏没有任何已安装的更新。 + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + 删除成功 + + + + Successfully removed %1 installed DLC. + 成功删除游戏 %1 安装的 DLC 。 + + + + + Error Removing Transferable Shader Cache + 删除着色器缓存时出错 + + + + + A shader cache for this title does not exist. + 这个游戏的着色器缓存不存在。 + + + + Successfully removed the transferable shader cache. + 成功删除着色器缓存。 + + + + Failed to remove the transferable shader cache. + 删除着色器缓存失败。 + + + + Error Removing Vulkan Driver Pipeline Cache + 删除 Vulkan 驱动程序管线缓存时出错 + + + + Failed to remove the driver pipeline cache. + 删除驱动程序管线缓存失败。 + + + + + Error Removing Transferable Shader Caches + 删除着色器缓存时出错 + + + + Successfully removed the transferable shader caches. + 着色器缓存删除成功。 + + + + Failed to remove the transferable shader cache directory. + 删除着色器缓存目录失败。 + + + + + Error Removing Custom Configuration + 移除自定义游戏设置时出错 + + + + A custom configuration for this title does not exist. + 这个游戏的自定义设置不存在。 + + + + Successfully removed the custom game configuration. + 成功移除自定义游戏设置。 + + + + Failed to remove the custom game configuration. + 移除自定义游戏设置失败。 + + + + Reset Metadata Cache + 重置缓存数据 + + + + The metadata cache is already empty. + 缓存数据已为空。 + + + + The operation completed successfully. + + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + 缓存数据删除失败。它可能不存在或正在被使用。 + + + + Create Shortcut + 创建快捷方式 + + + + Do you want to launch the game in fullscreen? + 您想以全屏模式启动游戏吗? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + %1 的快捷方式创建成功 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + 这将为当前的游戏创建快捷方式。但在其更新后,快捷方式可能无法正常工作。是否继续? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + %1 的快捷方式创建失败 + + + + Create Icon + 创建图标 + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + 无法创建图标文件。路径“ %1 ”不存在且无法被创建。 + + + + No firmware available + 无可用固件 + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9212,7 +9772,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9220,7 +9780,7 @@ Please try again or contact the developer of the software. %2 - + Users 用户 @@ -9344,7 +9904,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack 调用栈 @@ -9352,12 +9912,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread 没有等待的线程 @@ -9365,102 +9925,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable 可运行 - + paused 已暂停 - + sleeping 睡眠中 - + waiting for IPC reply 等待 IPC 响应 - + waiting for objects 等待对象 - + waiting for condition variable 等待条件变量 - + waiting for address arbiter 等待 address arbiter - + waiting for suspend resume 等待挂起的线程 - + waiting 等待中 - + initialized 初始化完毕 - + terminated 线程终止 - + unknown 未知 - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 核心 %1 - + processor = %1 处理器 = %1 - + affinity mask = %1 关联掩码 = %1 - + thread id = %1 线程 ID = %1 - + priority = %1(current) / %2(normal) 优先级 = %1 (实时) / %2 (正常) - + last running ticks = %1 最后运行频率 = %1 @@ -9468,7 +10028,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread 等待中的线程 @@ -9476,7 +10036,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree 等待树 (&W) diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 8e8b20e963..5b0fa57d03 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -13,12 +13,12 @@ - About eden + About Eden - <html><head/><body><p><span style=" font-size:28pt;">eden</span></p></body></html> + <html><head/><body><p><span style=" font-size:28pt;">Eden</span></p></body></html> @@ -34,8 +34,8 @@ p, li { white-space: pre-wrap; } hr { height: 1px; border-width: 0; } li.unchecked::marker { content: "\2610"; } li.checked::marker { content: "\2612"; } -</style></head><body style=" font-family:'Adwaita Sans'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> +</style></head><body style=" font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Eden is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+ which is based on the yuzu emulator which ended development back in March 2024. <br /><br />This software should not be used to play games you have not legally obtained.</span></p></body></html> @@ -72,32 +72,32 @@ p, li { white-space: pre-wrap; } CalibrationConfigurationDialog - + Communicating with the server... 與伺服器連線中... - + Cancel 取消 - + Touch the top left corner <br>of your touchpad. 觸碰您的觸控板<br>左上角 - + Now touch the bottom right corner <br>of your touchpad. 接著觸碰您的觸控板<br>右下角 - + Configuration completed! 設定完成! - + OK 確定 @@ -397,134 +397,134 @@ This would ban both their forum username and their IP address. ConfigurationShared - + % % - + Amiibo editor Amiibo 编辑器 - + Controller configuration 控制器设置 - + Data erase 清除数据 - + Error 錯誤 - + Net connect 网络连接 - + Player select 选择玩家 - + Software keyboard 軟體鍵盤 - + Mii Edit Mii Edit - + Online web 在线网站 - + Shop 商店 - + Photo viewer 照片查看器 - + Offline web 离线网络 - + Login share 第三方账号登录 - + Wifi web auth Wifi 网络认证 - + My page 我的主页 - + Output Engine: 輸出引擎: - + Output Device: 輸出裝置: - + Input Device: 輸入裝置: - + Mute audio 静音 - + Volume: 音量: - + Mute audio when in background 模擬器在背景執行時靜音 - + Multicore CPU Emulation 多核心 CPU 模擬 - + This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4. This is mainly a debug option and shouldn’t be disabled. 此选项将 CPU 模拟线程的数量从 1 增加到 Switch 实机的最大值 4。 这是调试选项,不应被禁用。 - + Memory Layout 内存布局 - + Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the developer kit's 8/6GB. It’s doesn’t improve stability or performance and is intended to let big texture mods fit in emulated RAM. Enabling it will increase memory use. It is not recommended to enable unless a specific game with a texture mod needs it. @@ -533,12 +533,12 @@ Enabling it will increase memory use. It is not recommended to enable unless a s 启用时将增加内存使用量。建议不要启用,除非具有纹理 Mod 的某些游戏需要。 - + Limit Speed Percent 執行速度限制 - + Controls the game's maximum rendering speed, but it’s up to each game if it runs faster or not. 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. @@ -547,141 +547,118 @@ Disabling it means unlocking the framerate to the maximum your PC can reach. - - Synchronize Core Speed - - - - - Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). -Compatibility varies by game; many (especially older ones) may not respond well. -Can help reduce stuttering at lower framerates. - - - - + Accuracy: 精度: - + This setting controls the accuracy of the emulated CPU. Don't change this unless you know what you are doing. 此选项控制模拟 CPU 的精度。 如果您不确定,就不要更改此项。 - - + + Backend: 后端: - - Fast CPU Time - - - - - Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. -Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. - - - - + Unfuse FMA (improve performance on CPUs without FMA) 不使用 FMA 指令集(能使不支援 FMA 指令集的 CPU 提高效能) - + This option improves speed by reducing accuracy of fused-multiply-add instructions on CPUs without native FMA support. 该选项通过降低积和熔加运算的精度来提高模拟器在不支持 FMA 指令集 CPU 上的运行速度。 - + Faster FRSQRTE and FRECPE 更快的 FRSQRTE 和 FRECPE - + This option improves the speed of some approximate floating-point functions by using less accurate native approximations. 该选项通过使用精度较低的近似值来提高某些浮点函数的运算速度。 - + Faster ASIMD instructions (32 bits only) 快速 ASIMD 指令(僅限 32 位元) - + This option improves the speed of 32 bits ASIMD floating-point functions by running with incorrect rounding modes. 该选项通过不正确的舍入模式来提高 32 位 ASIMD 浮点函数的运行速度。 - + Inaccurate NaN handling 低精度 NaN 處理 - + This option improves speed by removing NaN checking. Please note this also reduces accuracy of certain floating-point instructions. 该选项通过取消非数检查来提高速度。 请注意,这也会降低某些浮点指令的精确度。 - + Disable address space checks 停用位址空間檢查 - + This option improves speed by eliminating a safety check before every memory read/write in guest. Disabling it may allow a game to read/write the emulator's memory. 此选项通过取消每次模拟内存读/写前的安全检查来提高速度。 禁用此选项可能会允许游戏读/写模拟器自己的内存。 - + Ignore global monitor 忽略全局监视器 - + This option improves speed by relying only on the semantics of cmpxchg to ensure safety of exclusive access instructions. Please note this may result in deadlocks and other race conditions. 此选项仅通过 cmpxchg 指令来提高速度,以确保独占访问指令的安全性。 请注意,这可能会导致死锁和其他问题。 - + API: API: - + Switches between the available graphics APIs. Vulkan is recommended in most cases. 切换图形 API。 大多数情况下建议使用 Vulkan。 - + Device: 裝置: - + This setting selects the GPU to use with the Vulkan backend. 切换图形 API 为 Vulkan 时使用的 GPU。 - + Shader Backend: 著色器後端: - + The shader backend to use for the OpenGL renderer. GLSL is the fastest in performance and the best in rendering accuracy. GLASM is a deprecated NVIDIA-only backend that offers much better shader building performance at the cost of FPS and rendering accuracy. @@ -692,12 +669,12 @@ GLASM 仅限于 NVIDIA GPU,以 FPS 和渲染精度为代价提供更好的着 SPIR-V 编译速度最快,但在大多数 GPU 驱动程序上表现很差。 - + Resolution: 解析度: - + Forces the game to render at a different resolution. Higher resolutions require much more VRAM and bandwidth. Options lower than 1X can cause rendering issues. @@ -706,27 +683,27 @@ Options lower than 1X can cause rendering issues. 低于 1X 的选项可能造成渲染问题。 - + Window Adapting Filter: 視窗濾鏡: - + FSR Sharpness: FSR 清晰度: - + Determines how sharpened the image will look while using FSR’s dynamic contrast. 指定使用 FSR 时图像的锐化程度。 - + Anti-Aliasing Method: 抗鋸齒方式: - + The anti-aliasing method to use. SMAA offers the best quality. FXAA has a lower performance impact and can produce a better and more stable picture under very low resolutions. @@ -735,12 +712,12 @@ FXAA has a lower performance impact and can produce a better and more stable pic 快速近似抗锯齿对性能影响较小,可以在非常低的分辨率下生成更好、更稳定的图像。 - + Fullscreen Mode: 全螢幕模式: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -749,12 +726,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 独占全屏提供更好的性能和 Freesync/Gsync 支持。 - + Aspect Ratio: 長寬比: - + Stretches the game to fit the specified aspect ratio. Switch games only support 16:9, so custom game mods are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -763,49 +740,36 @@ Switch 游戏只支持 16:9,因此需要 Mod 才能实现其他比例。 此选项也控制捕获的屏幕截图的纵横比。 - + Use disk pipeline cache 使用硬碟管線快取 - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 将生成的着色器保存到硬盘,提高后续游戏过程中的着色器加载速度。 请仅在调试时禁用此项。 - - Optimize SPIRV output shader - - - - - Runs an additional optimization pass over generated SPIRV shaders. -Will increase time required for shader compilation. -May slightly improve performance. -This feature is experimental. - - - - + Use asynchronous GPU emulation 使用非同步 CPU 模擬 - + Uses an extra CPU thread for rendering. This option should always remain enabled. 使用额外的 CPU 线程进行渲染。 此选项应始终保持启用状态。 - + NVDEC emulation: NVDEC 模擬方式: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -814,12 +778,12 @@ In most cases, GPU decoding provides the best performance. 大多数情况下,使用 GPU 解码将提供最好的性能。 - + ASTC Decoding Method: ASTC 纹理解码方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding, slowest but safest method. GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most games and users. @@ -832,34 +796,33 @@ CPU 异步模拟:使用 CPU 在 ASTC 纹理到达时对其进行解码。 消除 ASTC 解码带来的卡顿,但在解码时可能出现渲染问题。 - + ASTC Recompression Method: ASTC 纹理重压缩方式: - + Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing the emulator to decompress to an intermediate format any card supports, RGBA8. This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but negatively affecting image quality. 几乎所有台式机和笔记本电脑 GPU 都不支持 ASTC 纹理,这迫使模拟器解压纹理到 GPU 支持的中间格式 RGBA8。 此选项可将 RGBA8 重新压缩为 BC1 或 BC3 格式,节省 VRAM,但会对图像质量产生负面影响。 - + VRAM Usage Mode: VRAM 使用模式: - Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Has no effect on integrated graphics. Aggressive mode may severely impact the performance of other applications such as recording software. - 指定模拟器倾向于节省 VRAM 或最大限度利用 VRAM 来提高性能。对核芯显卡没有影响。激进模式可能会严重影响其他应用程序(如录屏软件)的性能。 + 指定模拟器倾向于节省 VRAM 或最大限度利用 VRAM 来提高性能。对核芯显卡没有影响。激进模式可能会严重影响其他应用程序(如录屏软件)的性能。 - + VSync Mode: 垂直同步模式: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed is similar to FIFO but allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -870,51 +833,49 @@ Mailbox 具有比 FIFO 更低的延迟,不会产生撕裂但可能会掉帧。 Immediate (无同步)只显示可用内容,并可能产生撕裂。 - + Enable asynchronous presentation (Vulkan only) 启用异步帧提交 (仅限 Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 将帧提交移动到单独的 CPU 线程,略微提高性能。 - + Force maximum clocks (Vulkan only) 强制最大时钟 (仅限 Vulkan 模式) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在后台运行的同时等待图形命令,以防止 GPU 降低时钟速度。 - + Anisotropic Filtering: 各向異性過濾: - + Controls the quality of texture rendering at oblique angles. It’s a light setting and safe to set at 16x on most GPUs. 控制斜角的纹理渲染质量。 这是一个渲染相关的选项,在大多数 GPU 上设置为 16x 是安全的。 - Accuracy Level: - 精度: + 精度: - GPU emulation accuracy. Most games render fine with Normal, but High is still required for some. Particles tend to only render correctly with High accuracy. Extreme should only be used for debugging. This option can be changed while playing. Some games may require booting on high to render properly. - 指定 GPU 模拟精度。 + 指定 GPU 模拟精度。 大多数游戏设置为“正常”时渲染效果良好,但某些游戏需要设置为“高”。 粒子效果只能以高精度才能正确渲染。 “极高”只用于调试。 @@ -922,12 +883,12 @@ Some games may require booting on high to render properly. 某些游戏可能在启动时设置为“高”才能正确渲染。 - + Use asynchronous shader building (Hack) 使用非同步著色器編譯(不穩定) - + Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental. 启用异步着色器编译,可能会减少着色器卡顿。 @@ -942,24 +903,24 @@ This feature is experimental. 啟用快速 GPU 時間。此選項將強制大多數遊戲以其最高解析度執行。 - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Enable compute pipelines, required by some games. This setting only exists for Intel proprietary drivers, and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -968,111 +929,111 @@ Compute pipelines are always enabled on all other drivers. 在其他的驱动程序上将始终启用计算管线。 - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈循环 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + RNG Seed 隨機種子 - + Controls the seed of the random number generator. Mainly used for speedrunning purposes. 控制随机数生成器的种子。 主要用于快速通关。 - + Device Name 裝置名稱 - + The name of the emulated Switch. 模拟 Switch 主机的名称。 - + Custom RTC Date: 自定义系统时间: - + This option allows to change the emulated clock of the Switch. Can be used to manipulate time in games. 此选项允许更改 Switch 的模拟时钟。 可用于在游戏中操纵时间。 - + Language: 语言: - + Note: this can be overridden when region setting is auto-select 注意:當“區域”設定是“自動選擇”時,此設定可能會被覆寫。 - + Region: 區域: - + The region of the emulated Switch. 模拟 Switch 主机的所属地区。 - + Time Zone: 時區: - + The time zone of the emulated Switch. 模拟 Switch 主机的所属时区。 - + Sound Output Mode: 音訊輸出模式: - + Console Mode: 控制台模式: - + Selects if the console is emulated in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1081,7 +1042,7 @@ Setting to Handheld can help improve performance for low end systems. 设置为掌机模式有助于提高低端 PC 上的模拟性能。 - + Prompt for user on game boot 啟動遊戲時提示選擇使用者 @@ -1090,7 +1051,7 @@ Setting to Handheld can help improve performance for low end systems. 每次启动时询问用户选择一个用户配置文件。在多人使用同一台电脑上的 yuzu 时,这很有用。 - + Pause emulation when in background 模擬器在背景執行時暫停 @@ -1099,843 +1060,992 @@ Setting to Handheld can help improve performance for low end systems. 当用户聚焦在其他窗口时暂停 yuzu。 - - Fast GPU Time (Hack) - - - - - Overclocks the emulated GPU to increase dynamic resolution and render distance. -Use 128 for maximal performance and 512 for maximal graphics fidelity. - - - - - Extended Dynamic State - - - - - Enables the VkExtendedDynamicState* extensions. -Higher dynamic states will generally improve performance, but may cause issues on certain games or devices. - - - - - Provoking Vertex - - - - - Improves lighting and vertex handling in certain games. -Only Vulkan 1.0+ devices support this extension. - - - - - Descriptor Indexing - - - - - Improves texture & buffer handling and the Maxwell translation layer. -Some Vulkan 1.1+ and all 1.2+ devices support this extension. - - - - - Ask to select a user profile on each boot, useful if multiple people use eden on the same PC. - - - - - This setting pauses eden when focusing other windows. - - - - + Confirm before stopping emulation 停止模拟时需要确认 - + This setting overrides game prompts asking to confirm stopping the game. Enabling it bypasses such prompts and directly exits the emulation. 此设置将覆盖游戏中确认停止游戏的提示。 启用此项将绕过游戏中的提示并直接退出模拟。 - + Hide mouse on inactivity 滑鼠閒置時自動隱藏 - + This setting hides the mouse after 2.5s of inactivity. 当鼠标停止活动超过 2.5 秒时隐藏鼠标光标。 - + Disable controller applet 禁用控制器程序 - + Forcibly disables the use of the controller applet by guests. When a guest attempts to open the controller applet, it is immediately closed. 强制禁用来宾程序使用控制器小程序。 当来宾程序尝试打开控制器小程序时,控制器小程序会立即关闭。 - - Check for updates - - - - - Whether or not to check for updates upon startup. - - - - + Enable Gamemode 启用游戏模式 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - - Never - - - - - On Load - - - - - Always - - - - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + OpenGL OpenGL - + Vulkan Vulkan - + Null - + GLSL GLSL - + GLASM (Assembly Shaders, NVIDIA Only) GLASM(組合語言著色器,僅限 NVIDIA) - + SPIR-V (Experimental, AMD/Mesa Only) SPIR-V (实验性,仅限 AMD/Mesa) - + Normal 標準 - + High - + Extreme 極高 - + Auto 自動 - + Accurate 高精度 - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - - 0.25X (180p/270p) [EXPERIMENTAL] - - - - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + ScaleForce 強制縮放 - + AMD FidelityFX™️ Super Resolution AMD FidelityFX™️ 超級解析度技術 - - Area - - - - + None - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + + Default 預設 - + + Synchronize Core Speed + + + + + Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). +Compatibility varies by game; many (especially older ones) may not respond well. +Can help reduce stuttering at lower framerates. + + + + + Fast CPU Time + + + + + Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. +Use Boost (1700MHz) to run at the Switch's highest native clock, or Fast (2000MHz) to run at 2x clock. + + + + + Custom CPU Ticks + + + + + Set a custom value of CPU ticks. Higher values can increase performance, but may also cause the game to freeze. A range of 77–21000 is recommended. + + + + + Enable Host MMU Emulation (fastmem) + + + + + This optimization speeds up memory accesses by the guest program. +Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU. +Disabling this forces all memory accesses to use Software MMU Emulation. + + + + + Optimize SPIRV output shader + + + + + Runs an additional optimization pass over generated SPIRV shaders. +Will increase time required for shader compilation. +May slightly improve performance. +This feature is experimental. + + + + + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. +Aggressive mode may severely impact the performance of other applications such as recording software. + + + + + Skip CPU Inner Invalidation + + + + + Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it's performance. This may cause glitches or crashes on some games. + + + + + Sync Memory Operations + + + + + Ensures data consistency between compute and memory operations. +This option should fix issues in some games, but may also reduce performance in some cases. +Unreal Engine 4 games often see the most significant changes thereof. + + + + + GPU Accuracy: + + + + + Controls the GPU emulation accuracy. +Most games render fine with Normal, but High is still required for some. +Particles tend to only render correctly with High accuracy. +Extreme should only be used as a last resort. + + + + + DMA Accuracy: + + + + + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. +If unsure, leave this on Default. + + + + + Fast GPU Time (Hack) + + + + + Overclocks the emulated GPU to increase dynamic resolution and render distance. +Use 128 for maximal performance and 512 for maximal graphics fidelity. + + + + + RAII + + + + + A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. + + + + + Extended Dynamic State + + + + + Controls the number of features that can be used in Extended Dynamic State. +Higher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors. +The default value may vary depending on your system and hardware capabilities. +This value can be changed until stability and a better visual quality are achieved. + + + + + Provoking Vertex + + + + + Improves lighting and vertex handling in certain games. +Only Vulkan 1.0+ devices support this extension. + + + + + Descriptor Indexing + + + + + Improves texture & buffer handling and the Maxwell translation layer. +Some Vulkan 1.1+ and all 1.2+ devices support this extension. + + + + + Sample Shading + + + + + Allows the fragment shader to execute per sample in a multi-sampled fragment instead once per fragment. Improves graphics quality at the cost of some performance. +Higher values improve quality more but also reduce performance to a greater extent. + + + + + Ask to select a user profile on each boot, useful if multiple people use Eden on the same PC. + + + + + This setting pauses Eden when focusing other windows. + + + + + Check for updates + + + + + Whether or not to check for updates upon startup. + + + + + Never + + + + + On Load + + + + + Always + + + + + Unsafe (fast) + + + + + Safe (stable) + + + + + 0.25X (180p/270p) [EXPERIMENTAL] + + + + + Area + + + + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - - + + Serbian (српски) + + + + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Low (128) - + Medium (256) - + High (512) @@ -1944,37 +2054,37 @@ When a guest attempts to open the controller applet, it is immediately closed.8GB DRAM (不安全) - + Docked TV - + Handheld 掌機模式 - + Boost (1700MHz) - + Fast (2000MHz) - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 @@ -2328,27 +2438,27 @@ When a guest attempts to open the controller applet, it is immediately closed.紀錄 - + Open Log Location 開啟紀錄位置 - + Global Log Filter 全域紀錄篩選器 - + When checked, the max size of the log increases from 100 MB to 1 GB 啟用後紀錄檔案大小上限從 100MB 增加到 1GB - + Enable Extended Logging** 啟用延伸紀錄** - + Show Log in Console 在終端機中顯示紀錄 @@ -2494,7 +2604,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - **This will be reset automatically when eden closes. + **This will be reset automatically when Eden closes. @@ -2556,7 +2666,7 @@ When a guest attempts to open the controller applet, it is immediately closed.**當 yuzu 關閉時會自動重設。 - + Web applet not compiled Web 小程式未編譯 @@ -2606,7 +2716,7 @@ When a guest attempts to open the controller applet, it is immediately closed. - eden Configuration + Eden Configuration @@ -2615,88 +2725,88 @@ When a guest attempts to open the controller applet, it is immediately closed.某些設定僅在遊戲未執行時才能修改 - + Applets 小程序 - - + + Audio 音訊 - - + + CPU CPU - + Debug 偵錯 - + Filesystem 檔案系統 - - + + General 一般 - - + + Graphics 圖形 - + GraphicsAdvanced 進階圖形 - + GraphicsExtensions - + Hotkeys 快捷鍵 - - + + Controls 控制 - + Profiles 設定檔 - + Network 網路 - - + + System 系統 - + Game List 遊戲清單 - + Web 網路服務 @@ -2794,51 +2904,45 @@ When a guest attempts to open the controller applet, it is immediately closed. - - - Reset Metadata Cache 重設中繼資料快取 - + Select Emulated NAND Directory... 選擇模擬內部儲存空間資料夾... - + Select Emulated SD Directory... 選擇模擬 SD 卡資料夾... - + Select Gamecard Path... 選擇遊戲卡帶路徑... - + Select Dump Directory... 選擇傾印資料夾... - + Select Mod Load Directory... 選擇載入模組資料夾... - The metadata cache is already empty. - 無中繼資料快取 + 無中繼資料快取 - The operation completed successfully. - 動作已成功完成 + 動作已成功完成 - The metadata cache couldn't be deleted. It might be in use or non-existent. - 無法刪除中繼資料快取,可能因為正在使用或不存在。 + 無法刪除中繼資料快取,可能因為正在使用或不存在。 @@ -2869,12 +2973,12 @@ When a guest attempts to open the controller applet, it is immediately closed.yuzu - - eden + + Eden - + This reset all settings and remove all per-game configurations. This will not delete game directories, profiles, or input profiles. Proceed? 這將重設所有遊戲的額外設定,但不會刪除遊戲資料夾、使用者設定檔、輸入設定檔,是否繼續? @@ -2907,33 +3011,33 @@ When a guest attempts to open the controller applet, it is immediately closed.背景顏色: - + % FSR sharpening percentage (e.g. 50%) % - + Off 關閉 - + VSync Off 垂直同步關 - + Recommended 推薦 - + On 開啟 - + VSync On 垂直同步開 @@ -2970,14 +3074,18 @@ When a guest attempts to open the controller applet, it is immediately closed. - Vulkan Extension Settings + Vulkan Extensions Settings - - While it's recommended to use state 3, some games may perform better on lower states. Setting to 0 (disabled) may also break games. -If your GPU is older (i.e. RX570/580 or older), it may not support these features. If this is the case, set the slider to 0 and uncheck all boxes. -These settings are experimental, and may cause black screens. If your games fail to boot or are stuck on a black screen, change these settings around. + + % + Sample Shading percentage (e.g. 50%) + % + + + + Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens. @@ -3009,75 +3117,75 @@ These settings are experimental, and may cause black screens. If your games fail 還原預設值 - + Action 動作 - + Hotkey 快捷鍵 - + Controller Hotkey 控制器快捷鍵 - - - + + + Conflicting Key Sequence 按鍵衝突 - - + + The entered key sequence is already assigned to: %1 輸入的金鑰已指定給:%1 - + [waiting] [請按按鍵] - + Invalid 無效 - + Invalid hotkey settings 無效的快捷鍵設定 - + An error occurred. Please report this issue on github. 發生錯誤。請在 GitHub 回報此問題。 - + Restore Default 還原預設值 - + Clear 清除 - + Conflicting Button Sequence 按鍵衝突 - + The default button sequence is already assigned to: %1 預設的按鍵序列已分配給: %1 - + The default key sequence is already assigned to: %1 預設金鑰已指定給:%1 @@ -3397,7 +3505,7 @@ These settings are experimental, and may cause black screens. If your games fail - Requires restarting eden + Requires restarting Eden @@ -3552,7 +3660,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Left Stick 左搖桿 @@ -3662,14 +3770,14 @@ These settings are experimental, and may cause black screens. If your games fail - + L L - + ZL ZL @@ -3688,7 +3796,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Plus @@ -3701,15 +3809,15 @@ These settings are experimental, and may cause black screens. If your games fail - - + + R R - + ZR ZR @@ -3754,7 +3862,7 @@ These settings are experimental, and may cause black screens. If your games fail - + Right Stick 右搖桿 @@ -3769,242 +3877,242 @@ These settings are experimental, and may cause black screens. If your games fail 設定 - - - - + + + + Clear 清除 - - - - - + + + + + [not set] [未設定] - - - + + + Invert button 無效按鈕 - - + + Toggle button 切換按鍵 - + Turbo button 连发键 - - + + Invert axis 方向反轉 - - - + + + Set threshold 設定閾值 - - + + Choose a value between 0% and 100% 選擇介於 0% 和 100% 之間的值 - + Toggle axis 切換軸 - + Set gyro threshold 陀螺仪阈值设定 - + Calibrate sensor 校正感應器 - + Map Analog Stick 搖桿映射 - + After pressing OK, first move your joystick horizontally, and then vertically. To invert the axes, first move your joystick vertically, and then horizontally. 按下確定後,先水平再上下移動您的搖桿。 要反轉方向,則先上下再水平移動您的搖桿。 - + Center axis 中心軸 - - + + Deadzone: %1% 無感帶:%1% - - + + Modifier Range: %1% 輕推靈敏度:%1% - - + + Pro Controller Pro 手把 - + Dual Joycons 雙 Joycon 手把 - + Left Joycon 左 Joycon 手把 - + Right Joycon 右 Joycon 手把 - + Handheld 掌機模式 - + GameCube Controller GameCube 手把 - + Poke Ball Plus 精靈球 PLUS - + NES Controller NES 控制器 - + SNES Controller SNES 控制器 - + N64 Controller N64 控制器 - + Sega Genesis Mega Drive - + Start / Pause 開始 / 暫停 - + Z Z - + Control Stick 控制搖桿 - + C-Stick C 搖桿 - + Shake! 搖動! - + [waiting] [等待中] - + New Profile 新增設定檔 - + Enter a profile name: 輸入設定檔名稱: - - + + Create Input Profile 建立輸入設定檔 - + The given profile name is not valid! 輸入的設定檔名稱無效! - + Failed to create the input profile "%1" 建立輸入設定檔「%1」失敗 - + Delete Input Profile 刪除輸入設定檔 - + Failed to delete the input profile "%1" 刪除輸入設定檔「%1」失敗 - + Load Input Profile 載入輸入設定檔 - + Failed to load the input profile "%1" 載入輸入設定檔「%1」失敗 - + Save Input Profile 儲存輸入設定檔 - + Failed to save the input profile "%1" 儲存輸入設定檔「%1」失敗 @@ -4061,7 +4169,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Configure 設定 @@ -4097,7 +4205,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< - + Test 測試 @@ -4116,7 +4224,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< <a href='https://yuzu-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">了解更多</span></a> - + %1:%2 %1:%2 @@ -4125,77 +4233,77 @@ To invert the axes, first move your joystick vertically, and then horizontally.< yuzu - + <a href='https://eden-emulator.github.io/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input'><span style="text-decoration: underline; color:#039be5;">Learn More</span></a> - + Port number has invalid characters 連線埠中包含無效字元 - - - - - - - eden + + + + + + + Eden - + Port has to be in range 0 and 65353 連線埠必須為 0 到 65353 之間 - + IP address is not valid 無效的 IP 位址 - + This UDP server already exists 此 UDP 伺服器已存在 - + Unable to add more than 8 servers 最多只能新增 8 個伺服器 - + Testing 測試中 - + Configuring 設定中 - + Test Successful 測試成功 - + Successfully received data from the server. 已成功從伺服器取得資料 - + Test Failed 測試失敗 - + Could not receive valid data from the server.<br>Please verify that the server is set up correctly and the address and port are correct. 無法從伺服器取得有效的資料。<br>請檢查伺服器是否正確設定以及位址和連接埠是否正確。 - + UDP Test or calibration configuration is in progress.<br>Please wait for them to finish. UDP 測試或觸控校正進行中。<br>請耐心等候。 @@ -4322,7 +4430,12 @@ Current values are %1% and %2% respectively. 網路卡 - + + Enable Airplane Mode + + + + None @@ -4380,52 +4493,52 @@ Current values are %1% and %2% respectively. 某些設定僅在遊戲未執行時才能修改 - + Add-Ons 延伸模組 - + System 系統 - + CPU CPU - + Graphics 圖形 - + Adv. Graphics 進階圖形 - + GPU Extensions - + Audio 音訊 - + Input Profiles 輸入設定檔 - + Linux Linux - + Properties 屬性 @@ -4443,12 +4556,12 @@ Current values are %1% and %2% respectively. 延伸模組 - + Patch Name 延伸模組名稱 - + Version 版本 @@ -4486,27 +4599,32 @@ Current values are %1% and %2% respectively. 選擇圖片 - + + Select Avatar + + + + Add 新增 - + Rename 重新命名 - + Remove 移除 - + Profile management is available only when game is not running. 僅在遊戲未執行時才能修改使用者設定檔 - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -4514,100 +4632,189 @@ Current values are %1% and %2% respectively. %2 - + Enter Username 輸入使用者名稱 - + Users 使用者 - + Enter a username for the new user: 輸入新使用者的名稱 - + Enter a new username: 輸入新的使用者名稱 - + + Error saving user image + + + + + Unable to save image to file + + + + Select User Image 選擇使用者圖片 - - JPEG Images (*.jpg *.jpeg) - JPEG圖片 (*.jpg *.jpeg) + + Image Formats (*.jpg *.jpeg *.png *.bmp) + - + + No firmware available + 無可用韌體 + + + + Please install the firmware to use firmware avatars. + + + + + + Error loading archive + + + + + Archive is not available. Please install/reinstall firmware. + + + + + Archive does not contain romfs. It is probably corrupt. + + + + + Error extracting archive + + + + + Archive could not be extracted. It is probably corrupt. + + + + + Error finding image directory + + + + + Failed to find image directory in the archive. + + + + + No images found + + + + + No avatar images were found in the archive. + + + + JPEG Images (*.jpg *.jpeg) + JPEG圖片 (*.jpg *.jpeg) + + + Error deleting image 刪除圖片時發生錯誤 - + Error occurred attempting to overwrite previous image at: %1. 嘗試覆寫之前的圖片時發生錯誤:%1 - + Error deleting file 刪除檔案時發生錯誤 - + Unable to delete existing file: %1. 無法刪除檔案:%1 - + Error creating user image directory 建立使用者圖片資料夾時發生錯誤 - + Unable to create directory %1 for storing user images. 無法建立儲存使用者圖片的資料夾 %1 - Error copying user image - 複製使用者圖片時發生錯誤 + 複製使用者圖片時發生錯誤 - Unable to copy image from %1 to %2 - 無法將圖片從 %1 複製到 %2 + 無法將圖片從 %1 複製到 %2 - Error resizing user image - 調整使用者圖片大小時發生錯誤 + 調整使用者圖片大小時發生錯誤 - Unable to resize image - 無法調整圖片大小 + 無法調整圖片大小 + + + + ConfigureProfileManagerAvatarDialog + + + Select + + + + + Cancel + 取消 + + + + Background Color + + + + + Select Firmware Avatar + ConfigureProfileManagerDeleteDialog - + Delete this user? All of the user's save data will be deleted. 删除此用户?此用户保存的所有数据都将被删除。 - + Confirm Delete 確認刪除 - + Name: %1 UUID: %2 名稱: %1 @@ -4660,7 +4867,7 @@ UUID: %2 - + Enable 啟用 @@ -4671,7 +4878,7 @@ UUID: %2 - + Not connected 尚未連線 @@ -4681,63 +4888,63 @@ UUID: %2 還原預設值 - + Clear 清除 - + [not set] [未設定] - + Invert axis 方向反轉 - - + + Deadzone: %1% 無感帶:%1% - + Error enabling ring input 启用健身环输入时出错 - + Direct Joycon driver is not enabled 未启用 Joycon 直接驱动 - + Configuring 設定中 - + The current mapped device doesn't support the ring controller 当前映射的输入设备不支持健身环控制器 - + The current mapped device doesn't have a ring attached 当前映射的设备未连接健身环控制器 - + The current mapped device is not connected 目前映射的裝置未連線 - + Unexpected driver result %1 意外的驅動程式結果: %1 - + [waiting] [請按按鍵] @@ -4779,7 +4986,7 @@ UUID: %2 - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the Eden website.</p></body></html> @@ -4831,12 +5038,12 @@ UUID: %2 ConfigureTasDialog - + TAS Configuration TAS 設定 - + Select TAS Load Directory... 選擇 TAS 載入資料夾... @@ -4946,7 +5153,7 @@ Drag points to change position, or double-click table cells to edit values. - Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of Eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. @@ -5266,6 +5473,16 @@ Drag points to change position, or double-click table cells to edit values.Web 網路服務 + + + Eden Web Service + + + + + Generate + + yuzu Web Service yuzu 網路服務 @@ -5275,42 +5492,29 @@ Drag points to change position, or double-click table cells to edit values.提供您的使用者名稱和 Token 代表您同意讓 yuzu 收集額外的使用統計資訊,其中可能包含使用者識別訊息。 - - eden Web Service - - - - - By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. - - - - Verify - 驗證 + 驗證 - Sign up - 註冊 + 註冊 - + Token: Token: - + Username: 使用者名稱: - What is my token? - Token 說明 + Token 說明 - + Web Service configuration can only be changed when a public room isn't being hosted. 公共房间未被开放时,才能更改 Web 服务配置项。 @@ -5335,12 +5539,12 @@ Drag points to change position, or double-click table cells to edit values.重新產生 - + Discord Presence Discord 狀態 - + Show Current Game in your Discord Status 在 Discord 遊戲狀態上顯示目前的遊戲 @@ -5349,24 +5553,8 @@ Drag points to change position, or double-click table cells to edit values.<a href='https://yuzu-emu.org/help/feature/telemetry/'><span style="text-decoration: underline; color:#039be5;">了解更多</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">Sign up</span></a> - <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">註冊</span></a> - - - - <a href='https://evilperson1337.notion.site/Hosting-a-Room-Inside-of-Eden-20457c2edaf680108abac6215a79acdb'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> - - - - - Warning - - - - - Verification is currently nonfunctional, instead generate a random 48-character string with only lowercase a-z. - + <a href='https://profile.yuzu-emu.org/'><span style="text-decoration: underline; color:#039be5;">註冊</span></a> <a href='https://yuzu-emu.org/wiki/yuzu-web-service/'><span style="text-decoration: underline; color:#039be5;">What is my token?</span></a> @@ -5389,10 +5577,9 @@ Drag points to change position, or double-click table cells to edit values.Token 未驗證,因此未儲存您對使用者名稱和 Token 的修改。 - Unverified, please click Verify before saving configuration Tooltip - 令牌未验证,请在保存配置之前进行验证。 + 令牌未验证,请在保存配置之前进行验证。 Verifying... @@ -5416,20 +5603,67 @@ Drag points to change position, or double-click table cells to edit values.Verification failed. Check that you have entered your token correctly, and that your internet connection is working. 驗證失敗。請檢查您输入的 Token 是否正確,並確保您的網路連線正常。 + + + + All Good + Tooltip + + + + + Must be between 4-20 characters + Tooltip + + + + + Must be 48 characters, and lowercase a-z + Tooltip + + ControllerDialog - + Controller P1 Controller P1 - + &Controller P1 &Controller P1 + + DepsDialog + + + Eden Dependencies + + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + Dependency + + + + + Version + 版本 + + DirectConnect @@ -5535,7 +5769,12 @@ Drag points to change position, or double-click table cells to edit values. - Creating a room failed. Please retry. Restarting eden might be necessary. + Creating a room failed. Please retry. Restarting Eden might be necessary. + + + + + Version mismatch! Please update to the latest version of Eden. If the problem persists, contact the room host and ask them to update the server. @@ -5543,11 +5782,6 @@ Drag points to change position, or double-click table cells to edit values.The host of the room has banned you. Speak with the host to unban you or try a different room. 此房间的主人已将您封禁。请联系房主进行解封或选择其他房间。 - - - Version mismatch! Please update to the latest version of eden. If the problem persists, contact the room host and ask them to update the server. - - Incorrect password. @@ -5609,7 +5843,7 @@ Please go to Configure -> System -> Network and make a selection. 遙測 - + Broken Vulkan Installation Detected 檢查到 Vulkan 的安裝已損毀 @@ -5618,106 +5852,105 @@ Please go to Configure -> System -> Network and make a selection. Vulkan 初始化失败。<br><br>点击<a href='https://yuzu-emu.org/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>这里</a>获取此问题的相关信息。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 正在執行遊戲 - + Loading Web Applet... 載入 Web 小程式.. - - + + Disable Web Applet 停用 Web 小程式 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 停用 Web 小程式可能會導致未定義的行為,且只能在《超級瑪利歐 3D收藏輯》中使用。您確定要停用 Web 小程式? (您可以在偵錯設定中重新啟用它。) - + The amount of shaders currently being built 目前正在建構的著色器數量 - + The current selected resolution scaling multiplier. 目前選擇的解析度縮放比例。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 目前的模擬速度。高於或低於 100% 表示比實際 Switch 執行速度更快或更慢。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 遊戲即時 FPS。會因遊戲和場景的不同而改變。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 在不考慮幀數限制和垂直同步的情況下模擬一個 Switch 畫格的實際時間,若要全速模擬,此數值不得超過 16.67 毫秒。 - + Unmute 取消靜音 - + Mute 靜音 - + Reset Volume 重設音量 - + &Clear Recent Files 清除最近的檔案(&C) - + &Continue 繼續(&C) - + &Pause &暫停 - Warning Outdated Game Format - 過時遊戲格式警告 + 過時遊戲格式警告 You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats yuzu supports, <a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. 此遊戲為解構的 ROM 資料夾格式,這是一種過時的格式,已被其他格式取代,如 NCA、NAX、XCI、NSP。解構的 ROM 目錄缺少圖示、中繼資料和更新支援。<br><br>有關 yuzu 支援的各種 Switch 格式說明,<a href='https://yuzu-emu.org/wiki/overview-of-switch-game-formats'>請參閱我們的 wiki </a>。此訊息將不再顯示。 - - + + Error while loading ROM! 載入 ROM 時發生錯誤! - + The ROM format is not supported. 此 ROM 格式不支援 - + An error occurred initializing the video core. 初始化視訊核心時發生錯誤 @@ -5726,7 +5959,7 @@ Please go to Configure -> System -> Network and make a selection. yuzu 在執行視訊核心時發生錯誤。 這可能是 GPU 驅動程序過舊造成的。 詳細資訊請查閱日誌檔案。 關於日誌檔案的更多資訊,請參考以下頁面:<a href='https://yuzu-emu.org/help/reference/log-files/'>如何上傳日誌檔案</a>。 - + Error while loading ROM! %1 %1 signifies a numeric error code. 載入 ROM 時發生錯誤!%1 @@ -5737,759 +5970,761 @@ Please go to Configure -> System -> Network and make a selection. %1<br>請參閱 <a href='https://yuzu-emu.org/help/quickstart/'>yuzu 快速指引</a>以重新傾印檔案。<br>您可以前往 yuzu 的 wiki</a> 或 Discord 社群</a>以獲得幫助。 - + Vulkan initialization failed during boot.<br><br>Click <a href='https://eden-emulator.github.io/wiki/faq/#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>here for instructions to fix the issue</a>. - - Game Updates Warning - - - - - The game you are trying to launch is known to have performance or booting issues when updates are applied. Please try increasing the memory layout to 6GB or 8GB if any issues occur.<br><br>Press "OK" to continue launching, or "Cancel" to cancel the launch. - - - - - Don't show again for this game - - - - - You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. - - - - - eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://eden-emulator.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - - - - - %1<br>Please redump your files or ask on Discord for help. - %1 signifies an error string. - - - - + An unknown error occurred. Please see the log for more details. 發生未知錯誤,請檢視紀錄了解細節。 - + (64-bit) (64-bit) - + (32-bit) (32-bit) - + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 正在關閉軟體… - + Save Data 儲存資料 - + Mod Data 模組資料 - + Error Opening %1 Folder 開啟資料夾 %1 時發生錯誤 - - + + Folder does not exist! 資料夾不存在 - Error Opening Transferable Shader Cache - 開啟通用著色器快取位置時發生錯誤 + 開啟通用著色器快取位置時發生錯誤 - Failed to create the shader cache directory for this title. - 無法新增此遊戲的著色器快取資料夾。 + 無法新增此遊戲的著色器快取資料夾。 - Error Removing Contents - 移除內容時發生錯誤 + 移除內容時發生錯誤 - Error Removing Update - 移除更新時發生錯誤 + 移除更新時發生錯誤 - Error Removing DLC - 移除 DLC 時發生錯誤 + 移除 DLC 時發生錯誤 - + Remove Installed Game Contents? 移除已安裝的遊戲內容? - + Remove Installed Game Update? 移除已安裝的遊戲更新? - + Remove Installed Game DLC? 移除已安裝的遊戲 DLC? - + Remove Entry 移除項目 - - - - - - Successfully Removed - 移除成功 + 移除成功 - Successfully removed the installed base game. - 成功移除已安裝的遊戲。 + 成功移除已安裝的遊戲。 - The base game is not installed in the NAND and cannot be removed. - 此遊戲並非安裝在內部儲存空間,因此無法移除。 + 此遊戲並非安裝在內部儲存空間,因此無法移除。 - Successfully removed the installed update. - 成功移除已安裝的遊戲更新。 + 成功移除已安裝的遊戲更新。 - There is no update installed for this title. - 此遊戲沒有已安裝的更新。 + 此遊戲沒有已安裝的更新。 - There are no DLC installed for this title. - 此遊戲沒有已安裝的 DLC。 + 此遊戲沒有已安裝的 DLC。 - Successfully removed %1 installed DLC. - 成功移除遊戲 %1 已安裝的 DLC。 + 成功移除遊戲 %1 已安裝的 DLC。 - + Delete OpenGL Transferable Shader Cache? 刪除 OpenGL 模式的著色器快取? - + Delete Vulkan Transferable Shader Cache? 刪除 Vulkan 模式的著色器快取? - + Delete All Transferable Shader Caches? 刪除所有的著色器快取? - + Remove Custom Game Configuration? 移除額外遊戲設定? - + Remove Cache Storage? 移除快取儲存空間? - + Remove File 刪除檔案 - + Remove Play Time Data 清除遊玩時間 - + Reset play time? 重設遊玩時間? - - Error Removing Transferable Shader Cache - 刪除通用著色器快取時發生錯誤 + 刪除通用著色器快取時發生錯誤 - - A shader cache for this title does not exist. - 此遊戲沒有著色器快取 + 此遊戲沒有著色器快取 - Successfully removed the transferable shader cache. - 成功刪除著色器快取。 + 成功刪除著色器快取。 - Failed to remove the transferable shader cache. - 刪除通用著色器快取失敗。 + 刪除通用著色器快取失敗。 - Error Removing Vulkan Driver Pipeline Cache - 移除 Vulkan 驅動程式管線快取時發生錯誤 + 移除 Vulkan 驅動程式管線快取時發生錯誤 - Failed to remove the driver pipeline cache. - 無法移除驅動程式管線快取。 + 無法移除驅動程式管線快取。 - - Error Removing Transferable Shader Caches - 刪除通用著色器快取時發生錯誤 + 刪除通用著色器快取時發生錯誤 - Successfully removed the transferable shader caches. - 成功刪除通用著色器快取。 + 成功刪除通用著色器快取。 - Failed to remove the transferable shader cache directory. - 無法刪除著色器快取資料夾。 + 無法刪除著色器快取資料夾。 - - Error Removing Custom Configuration - 移除額外遊戲設定時發生錯誤 + 移除額外遊戲設定時發生錯誤 - A custom configuration for this title does not exist. - 此遊戲沒有額外設定。 + 此遊戲沒有額外設定。 - Successfully removed the custom game configuration. - 成功移除額外遊戲設定。 + 成功移除額外遊戲設定。 - Failed to remove the custom game configuration. - 移除額外遊戲設定失敗。 + 移除額外遊戲設定失敗。 - - + + RomFS Extraction Failed! RomFS 抽取失敗! - + There was an error copying the RomFS files or the user cancelled the operation. 複製 RomFS 檔案時發生錯誤或使用者取消動作。 - + Full 全部 - + Skeleton 部分 - + Select RomFS Dump Mode 選擇RomFS傾印模式 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. 請選擇如何傾印 RomFS。<br>「全部」會複製所有檔案到新資料夾中,而<br>「部分」只會建立資料夾結構。 - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 沒有足夠的空間用於抽取 RomFS。請確保有足夠的空間或於模擬 > 設定 >系統 >檔案系統 > 傾印根目錄中選擇其他資料夾。 - + Extracting RomFS... 抽取 RomFS 中... - - - - - + + Cancel 取消 - + RomFS Extraction Succeeded! RomFS 抽取完成! - - - + The operation completed successfully. 動作已成功完成 - Integrity verification couldn't be performed! - 無法執行完整性驗證! + 無法執行完整性驗證! - File contents were not checked for validity. - 未檢查檔案內容的完整性。 + 未檢查檔案內容的完整性。 - - Verifying integrity... - 正在驗證完整性... + 正在驗證完整性... - - Integrity verification succeeded! - 完整性驗證成功! + 完整性驗證成功! - - Integrity verification failed! - 完整性驗證失敗! + 完整性驗證失敗! - File contents may be corrupt. - 檔案可能已經損毀。 + 檔案可能已經損毀。 - - - - Create Shortcut - 建立捷徑 + 建立捷徑 - Do you want to launch the game in fullscreen? - 您想以全屏模式启动游戏吗? + 您想以全屏模式启动游戏吗? - Successfully created a shortcut to %1 - 已成功在 %1 建立捷徑 + 已成功在 %1 建立捷徑 - This will create a shortcut to the current AppImage. This may not work well if you update. Continue? - 這將會為目前的應用程式映像建立捷徑,可能在其更新後無法運作,仍要繼續嗎? + 這將會為目前的應用程式映像建立捷徑,可能在其更新後無法運作,仍要繼續嗎? - Failed to create a shortcut to %1 - 为 %1 创建快捷方式时失败 + 为 %1 创建快捷方式时失败 - Create Icon - 建立圖示 + 建立圖示 - Cannot create icon file. Path "%1" does not exist and cannot be created. - 無法建立圖示檔案,路徑「%1」不存在且無法建立。 + 無法建立圖示檔案,路徑「%1」不存在且無法建立。 - + + Warning: Outdated Game Format + + + + + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br><br>For an explanation of the various Switch formats Eden supports, <a href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our wiki</a>. This message will not be shown again. + + + + + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + + + + %1<br>Please redump your files or ask on Discord/Revolt for help. + %1 signifies an error string. + + + + Error Opening %1 開啟 %1 時發生錯誤 - + Select Directory 選擇資料夾 - + Properties 屬性 - + The game properties could not be loaded. 無法載入遊戲屬性 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 執行檔 (%1);;所有檔案 (*.*) - + Load File 開啟檔案 - + Open Extracted ROM Directory 開啟已抽取的 ROM 資料夾 - + Invalid Directory Selected 選擇的資料夾無效 - + The directory you have selected does not contain a 'main' file. 選擇的資料夾未包含「main」檔案。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 可安裝的 Switch 檔案 (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX 卡帶映像 (*.xci) - + Install Files 安裝檔案 - + %n file(s) remaining 剩餘 %n 個檔案 + 剩餘 %n 個檔案 - + Installing file "%1"... 正在安裝檔案「%1」... - - + + Install Results 安裝結果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 為了避免潛在的衝突,不建議將遊戲本體安裝至內部儲存空間。 此功能僅用於安裝遊戲更新和 DLC。 - + %n file(s) were newly installed - 最近安裝了 %n 個檔案 - + 最近安裝了 %n 個檔案 + 最近安裝了 %n 個檔案 - + %n file(s) were overwritten - %n 個檔案被取代 - + %n 個檔案被取代 + %n 個檔案被取代 - + %n file(s) failed to install %n 個檔案安裝失敗 + %n 個檔案安裝失敗 - + System Application 系統應用程式 - + System Archive 系統檔案 - + System Application Update 系統應用程式更新 - + Firmware Package (Type A) 韌體包(A型) - + Firmware Package (Type B) 韌體包(B型) - + Game 遊戲 - + Game Update 遊戲更新 - + Game DLC 遊戲 DLC - + Delta Title Delta Title - + Select NCA Install Type... 選擇 NCA 安裝類型... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 請選擇此 NCA 的安裝類型: (在多數情況下,選擇預設的「遊戲」即可。) - + Failed to Install 安裝失敗 - + The title type you selected for the NCA is invalid. 選擇的 NCA 安裝類型無效。 - + File not found 找不到檔案 - + File "%1" not found 找不到「%1」檔案 - + OK 確定 - - + + Hardware requirements not met 硬體不符合需求 - - + + Your system does not meet the recommended hardware requirements. Compatibility reporting has been disabled. 您的系統不符合建議的硬體需求,相容性回報已停用。 - + Missing yuzu Account 未設定 yuzu 帳號 - - In order to submit a game compatibility test case, you must link your eden account.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. + + In order to submit a game compatibility test case, you must set up your web token and username.<br><br/>To link your eden account, go to Emulation &gt; Configuration &gt; Web. - - Install decryption keys and restart eden before attempting to install firmware. + + + Install decryption keys and restart Eden before attempting to install firmware. - - Firmware installation cancelled, firmware may be in bad state, restart eden or re-install firmware. + + Select Dumped Firmware ZIP - - Encryption keys are missing. + + Zipped Archives (*.zip) - - Are you sure you want to close eden? + + Firmware cleanup failed - - - - eden + + Failed to clean up extracted firmware cache. +Check write permissions in the system temp directory and try again. +OS reported error: %1 - - The currently running application has requested eden to not exit. + + Please install firmware to use the Album applet. + + + + + Please install firmware to use the Cabinet applet. + + + + + Please install firmware to use the Mii editor. + + + + + Please install firmware to use the Controller Menu. + + + + + Please install firmware to use the Home Menu. + + + + + Firmware Corrupted + + + + + Firmware Too New + + + + + +Continue anyways? + + + + + Don't show again + + + + + Please install firmware to use Starter. + + + + + Are you sure you want to close Eden? + + + + + + + Eden + + + + + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? + + + Encryption keys are missing. + + In order to submit a game compatibility test case, you must link your yuzu account.<br><br/>To link your yuzu account, go to Emulation &gt; Configuration &gt; Web. 為了上傳相容性測試結果,您必須登入 yuzu 帳號。<br><br/>欲登入 yuzu 帳號請至模擬 &gt; 設定 &gt; 網路。 - + Error opening URL 開啟 URL 時發生錯誤 - + Unable to open the URL "%1". 無法開啟 URL:「%1」。 - + TAS Recording TAS 錄製 - + Overwrite file of player 1? 覆寫玩家 1 的檔案? - + Invalid config detected 偵測到無效設定 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 掌機手把無法在主機模式中使用。將會選擇 Pro 手把。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 目前 Amiibo 已被移除。 - + Error 錯誤 - - + + The current game is not looking for amiibos 目前遊戲並未在尋找 Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo 檔案 (%1);; 所有檔案 (*.*) - + Load Amiibo 開啟 Amiibo - + Error loading Amiibo data 載入 Amiibo 資料時發生錯誤 - + The selected file is not a valid amiibo 選取的檔案不是有效的 Amiibo - + The selected file is already on use 選取的檔案已在使用中 - + An unknown error occurred 發生了未知錯誤 - - Verification failed for the following files: %1 - 以下檔案驗證失敗: + 以下檔案驗證失敗: %1 - + + Keys not installed 密钥未安装 @@ -6498,273 +6733,234 @@ Would you like to bypass this and exit anyway? 在安装固件之前,请先安装密钥并重新启动 yuzu。 - + Select Dumped Firmware Source Location 选择固件位置 - Installing Firmware... - 正在安装固件... + 正在安装固件... - - - - Firmware install failed - 固件安装失败 + 固件安装失败 - Unable to locate potential firmware NCA files - 无法定位某些固件 NCA 文件 + 无法定位某些固件 NCA 文件 - Failed to delete one or more firmware file. - 无法删除某些固件文件。 + 无法删除某些固件文件。 Firmware installation cancelled, firmware may be in bad state, restart yuzu or re-install firmware. 固件安装被取消,安装的固件可能已经损坏。请重新启动 yuzu,或重新安装固件。 - One or more firmware files failed to copy into NAND. - 某些固件文件未能复制到 NAND。 + 某些固件文件未能复制到 NAND。 - Firmware integrity verification failed! - 固件完整性验证失败! + 固件完整性验证失败! - Select Dumped Keys Location - 选择密钥文件位置 + 选择密钥文件位置 - - - Decryption Keys install failed - 密钥文件安装失败 + 密钥文件安装失败 - prod.keys is a required decryption key file. - prod.keys 是必需的解密密钥文件。 + prod.keys 是必需的解密密钥文件。 - One or more keys failed to copy. - 某些密钥文件复制失败。 + 某些密钥文件复制失败。 - Decryption Keys install succeeded - 密钥文件安装成功 + 密钥文件安装成功 - Decryption Keys were successfully installed - 密钥文件已成功安装 + 密钥文件已成功安装 - Decryption Keys failed to initialize. Check that your dumping tools are up to date and re-dump keys. - 密钥文件无法初始化。请检查您的转储工具是否为最新版本,然后重新转储密钥文件。 + 密钥文件无法初始化。请检查您的转储工具是否为最新版本,然后重新转储密钥文件。 - - - - - - - + + + + + + No firmware available 無可用韌體 - Please install the firmware to use the Album applet. - 請安裝韌體以使用相簿小程式。 + 請安裝韌體以使用相簿小程式。 - + Album Applet 相簿小程式 - + Album applet is not available. Please reinstall firmware. 無法使用相簿小程式。請安裝韌體。 - Please install the firmware to use the Cabinet applet. - 請安裝韌體以使用 Cabinet 小程式。 + 請安裝韌體以使用 Cabinet 小程式。 - + Cabinet Applet Cabinet 小程式 - + Cabinet applet is not available. Please reinstall firmware. 無法使用 Cabinet 小程式。請安裝韌體。 - Please install the firmware to use the Mii editor. - 請安裝韌體以使用 Mii 編輯器。 + 請安裝韌體以使用 Mii 編輯器。 - + Mii Edit Applet Mii 編輯器小程式 - + Mii editor is not available. Please reinstall firmware. Mii 編輯器無法使用。請安裝韌體。 - Please install the firmware to use the Controller Menu. - 请安装固件以使用控制器菜单。 + 请安装固件以使用控制器菜单。 - + Controller Applet 控制器設定 - + Controller Menu is not available. Please reinstall firmware. 控制器菜单不可用。请重新安装固件。 - - Please install the firmware to use the Home Menu. - - - - - + Home Menu Applet - - + Home Menu is not available. Please reinstall firmware. - - Please install the firmware to use Starter. - - - - + Starter Applet - + Starter is not available. Please reinstall firmware. - - Please install firmware to use the home menu. - - - - + Capture Screenshot 截圖 - + PNG Image (*.png) PNG 圖片 (*.png) - + Update Available - + Update %1 for Eden is available. Would you like to download it? - + TAS state: Running %1/%2 TAS 狀態:正在執行 %1/%2 - + TAS state: Recording %1 TAS 狀態:正在錄製 %1 - + TAS state: Idle %1/%2 TAS 狀態:閒置 %1/%2 - + TAS State: Invalid TAS 狀態:無效 - + &Stop Running &停止執行 - + &Start 開始(&S) - + Stop R&ecording 停止錄製 - + R&ecord 錄製 (&E) - + Building: %n shader(s) 正在編譯 %n 個著色器檔案 + 正在編譯 %n 個著色器檔案 - + Scale: %1x %1 is the resolution scaling factor 縮放比例:%1x - + Speed: %1% / %2% 速度:%1% / %2% - + Speed: %1% 速度:%1% @@ -6773,44 +6969,44 @@ Would you like to download it? 遊戲: %1 FPS(未限制) - + Game: %1 FPS 遊戲:%1 FPS - + Frame: %1 ms 畫格延遲:%1 ms - + %1 %2 %1 %2 - - + + FSR FSR - + NO AA 抗鋸齒關 - + VOLUME: MUTE 音量: 靜音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量:%1% - + Derivation Components Missing 遺失產生元件 @@ -6819,12 +7015,12 @@ Would you like to download it? 密钥缺失。<br>请查看<a href='https://yuzu-emu.org/help/quickstart/'>yuzu 快速导航</a>以获得你的密钥、固件和游戏。 - + Select RomFS Dump Target 選擇 RomFS 傾印目標 - + Please select which RomFS you would like to dump. 請選擇希望傾印的 RomFS。 @@ -6837,7 +7033,7 @@ Would you like to download it? yuzu - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 您確定要停止模擬嗎?未儲存的進度將會遺失。 @@ -6850,102 +7046,102 @@ Would you like to bypass this and exit anyway? 您希望忽略並退出嗎? - + None - + FXAA FXAA - + SMAA SMAA - + Nearest 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + ScaleForce 強制縮放 - + Area - + Docked TV - + Handheld 掌機模式 - + Normal 標準 - + High - + Extreme 極高 - + Vulkan Vulkan - + OpenGL OpenGL - + Null - + GLSL GLSL - + GLASM GLASM - + SPIRV SPIRV @@ -6953,13 +7149,13 @@ Would you like to bypass this and exit anyway? GRenderWindow - - + + OpenGL not available! 無法使用 OpenGL 模式! - + OpenGL shared contexts are not supported. 不支援 OpenGL 共用的上下文。 @@ -6968,33 +7164,33 @@ Would you like to bypass this and exit anyway? yuzu 未以支援 OpenGL 的方式編譯。 - - eden has not been compiled with OpenGL support. + + Eden has not been compiled with OpenGL support. - - + + Error while initializing OpenGL! 初始化 OpenGL 時發生錯誤! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. 您的 GPU 可能不支援 OpenGL,或是未安裝最新的圖形驅動程式 - + Error while initializing OpenGL 4.6! 初始化 OpenGL 4.6 時發生錯誤! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 您的 GPU 可能不支援 OpenGL 4.6,或是未安裝最新的圖形驅動程式<br><br>GL 渲染器:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 您的 GPU 可能不支援某些必需的 OpenGL 功能。請確保您已安裝最新的圖形驅動程式。<br><br>GL 渲染器:<br>%1<br><br>不支援的功能:<br>%2 @@ -7002,128 +7198,128 @@ Would you like to bypass this and exit anyway? GameList - + Favorite 我的最愛 - + Start Game 開始遊戲 - + Start Game without Custom Configuration 開始遊戲(不使用額外設定) - + Open Save Data Location 開啟存檔位置 - + Open Mod Data Location 開啟模組位置 - + Open Transferable Pipeline Cache 開啟通用著色器管線快取位置 - + Remove 移除 - + Remove Installed Update 移除已安裝的遊戲更新 - + Remove All Installed DLC 移除所有安裝的DLC - + Remove Custom Configuration 移除額外設定 - + Remove Play Time Data 清除遊玩時間 - + Remove Cache Storage 移除快取儲存空間 - + Remove OpenGL Pipeline Cache 刪除 OpenGL 著色器管線快取 - + Remove Vulkan Pipeline Cache 刪除 Vulkan 著色器管線快取 - + Remove All Pipeline Caches 刪除所有著色器管線快取 - + Remove All Installed Contents 移除所有安裝項目 - + Dump RomFS 傾印 RomFS - + Dump RomFS to SDMC 傾印 RomFS 到 SDMC - + Verify Integrity 完整性驗證 - + Copy Title ID to Clipboard 複製遊戲 ID 到剪貼簿 - + Navigate to GameDB entry 檢視遊戲相容性報告 - + Create Shortcut 建立捷徑 - + Add to Desktop 新增至桌面 - + Add to Applications Menu 新增至應用程式選單 - + Configure Game @@ -7132,62 +7328,62 @@ Would you like to bypass this and exit anyway? 屬性 - + Scan Subfolders 包含子資料夾 - + Remove Game Directory 移除遊戲資料夾 - + ▲ Move Up ▲ 向上移動 - + ▼ Move Down ▼ 向下移動 - + Open Directory Location 開啟資料夾位置 - + Clear 清除 - + Name 名稱 - + Compatibility 相容性 - + Add-ons 延伸模組 - + File type 檔案格式 - + Size 大小 - + Play time 遊玩時間 @@ -7195,62 +7391,62 @@ Would you like to bypass this and exit anyway? GameListItemCompat - + Ingame 遊戲內 - + Game starts, but crashes or major glitches prevent it from being completed. 遊戲可以執行,但可能會出現當機或故障導致遊戲無法正常運作。 - + Perfect 完美 - + Game can be played without issues. 遊戲可以毫無問題的遊玩。 - + Playable 可遊玩 - + Game functions with minor graphical or audio glitches and is playable from start to finish. 遊戲自始至終可以正常遊玩,但可能會有一些輕微的圖形或音訊故障。 - + Intro/Menu 開始畫面/選單 - + Game loads, but is unable to progress past the Start Screen. 遊戲可以載入,但無法通過開始畫面。 - + Won't Boot 無法啟動 - + The game crashes when attempting to startup. 啟動遊戲時異常關閉 - + Not Tested 未測試 - + The game has not yet been tested. 此遊戲尚未經過測試 @@ -7258,7 +7454,7 @@ Would you like to bypass this and exit anyway? GameListPlaceholder - + Double-click to add a new folder to the game list 連點兩下以新增資料夾至遊戲清單 @@ -7266,19 +7462,20 @@ Would you like to bypass this and exit anyway? GameListSearchField - + %1 of %n result(s) %1 / %n 個結果 + %1 / %n 個結果 - + Filter: 搜尋: - + Enter pattern to filter 輸入文字以搜尋 @@ -7360,7 +7557,7 @@ Would you like to bypass this and exit anyway? - Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. + Failed to announce the room to the public lobby. In order to host a room publicly, you must have a valid Eden account configured in Emulation -> Configure -> Web. If you do not want to publish a room in the public lobby, then select Unlisted instead. Debug Message: @@ -7374,91 +7571,91 @@ Debug Message: Hotkeys - + Audio Mute/Unmute 靜音/取消靜音 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Window 主要視窗 - + Audio Volume Down 音訊音量降低 - + Audio Volume Up 音訊音量提高 - + Capture Screenshot 截圖 - + Change Adapting Filter 變更自適性過濾器 - + Change Docked Mode 變更底座模式 - + Change GPU Accuracy 變更 GPU 精確度 - + Configure 設定 - + Configure Current Game - + Continue/Pause Emulation 繼續/暫停模擬 - + Exit Fullscreen 離開全螢幕 @@ -7467,97 +7664,97 @@ Debug Message: 離開 yuzu - - Exit eden + + Exit Eden - + Fullscreen 全螢幕 - + Load File 開啟檔案 - + Load/Remove Amiibo 載入/移除 Amiibo - + Multiplayer Browse Public Game Lobby 浏览公共游戏大厅 - + Multiplayer Create Room 创建房间 - + Multiplayer Direct Connect to Room 直接连接到房间 - + Multiplayer Leave Room 离开房间 - + Multiplayer Show Current Room 显示当前房间 - + Restart Emulation 重新啟動模擬 - + Stop Emulation 停止模擬 - + TAS Record TAS 錄製 - + TAS Reset TAS 重設 - + TAS Start/Stop TAS 開始/停止 - + Toggle Filter Bar 切換搜尋列 - + Toggle Framerate Limit 切換影格速率限制 - + Toggle Mouse Panning 切換滑鼠移動 - + Toggle Renderdoc Capture 切換到 Renderdoc 截圖 - + Toggle Status Bar 切換狀態列 @@ -7565,22 +7762,22 @@ Debug Message: InstallDialog - + Please confirm these are the files you wish to install. 請確認您想安裝的檔案 - + Installing an Update or DLC will overwrite the previously installed one. 安裝遊戲更新或 DLC 時會覆寫之前的安裝 - + Install 安裝 - + Install Files to NAND 安裝檔案至內部儲存空間 @@ -7588,7 +7785,7 @@ Debug Message: LimitableInputDialog - + The text can't contain any of the following characters: %1 文字中不能包含以下字元:%1 @@ -7734,152 +7931,207 @@ Debug Message: 開啟最近的檔案(&R) - + + Open &Eden Folders + + + + &Emulation 模擬 (&E) - + &View 檢視 (&V) - + &Reset Window Size 重設視窗大小(&R) - + &Debugging 偵錯 (&D) - + Reset Window Size to &720p 重設視窗大小為 &720p - + Reset Window Size to 720p 重設視窗大小為 720p - + Reset Window Size to &900p 重設視窗大小為 &900p - + Reset Window Size to 900p 重設視窗大小為 900p - + Reset Window Size to &1080p 重設視窗大小為 &1080p - + Reset Window Size to 1080p 重設視窗大小為 1080p - + &Multiplayer 多人遊戲 (&M) - + &Tools 工具 (&T) - + &Amiibo &Amiibo - + &TAS TAS (&T) - + &Create Home Menu Shortcut - + &Help 說明 (&H) - + &Install Files to NAND... &安裝檔案至內部儲存空間 - + L&oad File... 開啟檔案(&O)... - + Load &Folder... 開啟資料夾(&F)... - + E&xit 結束(&X) - + &Pause 暫停(&P) - + &Stop 停止(&S) - + &Verify Installed Contents 驗證已安裝內容的完整性 (&V) - - &About eden + + &Root Data Folder - - Open &eden Folder + + &NAND Folder - + + &SDMC Folder + + + + + &Mod Folder + + + + + &Log Folder + + + + + From Folder + + + + + From ZIP + + + + + &X + + + + + X (Twitter) + + + + + &Revolt + + + + + Revolt + + + + + &Eden Dependencies + + + + Open Home Menu - + &Discord - + Open &Setup - + &Desktop - + &Application Menu @@ -7888,97 +8140,97 @@ Debug Message: 關於 yuzu(&A) - + Single &Window Mode 單一視窗模式(&W) - + Con&figure... 設定 (&F) - + Ctrl+, - + Display D&ock Widget Headers 顯示 Dock 小工具標題 (&O) - + Show &Filter Bar 顯示搜尋列(&F) - + Show &Status Bar 顯示狀態列(&S) - + Show Status Bar 顯示狀態列 - + &Browse Public Game Lobby 瀏覽公用遊戲大廳 (&B) - + &Create Room 建立房間 (&C) - + &Leave Room 離開房間 (&L) - + &Direct Connect to Room 直接連線到房間 (&D) - + &Show Current Room 顯示目前的房間 (&S) - + F&ullscreen 全螢幕(&U) - + &Restart 重新啟動(&R) - + Load/Remove &Amiibo... 載入/移除 Amiibo... (&A) - + &Report Compatibility 回報相容性(&R) - + Open &Mods Page 模組資訊 (&M) - + Open &Quickstart Guide 快速入門 (&Q) - + &FAQ 常見問題 (&F) @@ -7987,77 +8239,82 @@ Debug Message: 開啟 yuzu 資料夾(&Y) - + &Capture Screenshot 截圖 (&C) - + Open &Album 開啟相簿 (&A) - + &Set Nickname and Owner 登錄持有者和暱稱 (&S) - + &Delete Game Data 清除遊戲資料 (&D) - + &Restore Amiibo 復原資料 (&R) - + &Format Amiibo 初始化 Amiibo (&F) - + Open &Mii Editor 開啟 &Mii 編輯器 - + &Configure TAS... 設定 &TAS… - + Configure C&urrent Game... 目前遊戲設定...(&U) - + &Start 開始(&S) - + &Reset 重設 (&R) - + R&ecord 錄製 (&E) - + Open &Controller Menu 打开控制器菜单 (&C) - + Install Firmware 安装固件 - + + &About Eden + + + + Install Decryption Keys 安装密钥文件 @@ -8065,26 +8322,36 @@ Debug Message: MicroProfileDialog - &MicroProfile - &MicroProfile + &MicroProfile MigrationWorker - + Data was migrated successfully. - + Linking the old directory failed. You may need to re-run with administrative privileges on Windows. OS gave error: %1 - + + + +Note that your configuration and data will be shared with %1. +If this is not desirable, delete the following files: +%2 +%3 +%4 + + + + If you wish to clean up the files which were left in the old data location, you can do so by deleting the following directory: @@ -8144,37 +8411,37 @@ If you wish to clean up the files which were left in the old data location, you MultiplayerState - + Current connection status 目前連線狀態 - + Not Connected. Click here to find a room! 尚未連線,按一下這裡以尋找房間! - + Not Connected 尚未連線 - + Connected 已連線 - + New Messages Received 收到了新訊息 - + Error 錯誤 - + Failed to update the room information. Please check your Internet connection and try hosting the room again. Debug Message: 更新房間資訊失敗。請檢查您的網路連線並嘗試重開房間。 @@ -8366,56 +8633,56 @@ p, li { white-space: pre-wrap; } 不在玩遊戲 - + Installed SD Titles 安裝在 SD 卡中的遊戲 - + Installed NAND Titles 安裝在內部儲存空間中的遊戲 - + System Titles 系統項目 - + Add New Game Directory 加入遊戲資料夾 - + Favorites 我的最愛 - - + + Shift Shift - - + + Ctrl Ctrl - - + + Alt Alt - - - - + + + + [not set] [未設定] @@ -8426,14 +8693,14 @@ p, li { white-space: pre-wrap; } 方向鍵 %1 %2 - - - - - - - - + + + + + + + + Axis %1%2 軸 %1%2 @@ -8444,357 +8711,357 @@ p, li { white-space: pre-wrap; } 按鍵 %1 - - - - - - + + + + + + [unknown] [未知] - - - + + + Left - - - + + + Right - - - + + + Down - - - + + + Up - - + + Z Z - - + + R R - - + + L L - - + + A A - - + + B B - - + + X X - - + + Y Y - - + + Start 開始 - - + + L1 L1 - - + + L2 L2 - - + + L3 L3 - - + + R1 R1 - - + + R2 R2 - - + + R3 R3 - - + + Circle - - + + Cross - - + + Square - - + + Triangle Δ - - + + Share 分享 - - + + Options 選項 - - + + [undefined] [未指定] - + %1%2 %1%2 - - + + [invalid] [無效] - - + + %1%2Hat %3 %1%2Hat 控制器 %3 - - - + + + %1%2Axis %3 %1%2軸 %3 - - + + %1%2Axis %3,%4,%5 %1%2軸 %3,%4,%5 - - + + %1%2Motion %3 %1%2體感 %3 - - + + %1%2Button %3 %1%2按鈕 %3 - - + + [unused] [未使用] - + ZR ZR - + ZL ZL - + SR SR - + SL SL - + Stick L 左搖桿 - + Stick R 右搖桿 - + Plus - + Minus - - + + Home HOME - + Capture 截圖 - + Touch 觸控 - + Wheel Indicates the mouse wheel 滑鼠滾輪 - + Backward 後退 - + Forward 前進 - + Task 任務鍵 - + Extra 額外按鍵 - + %1%2%3%4 %1%2%3%4 - - + + %1%2%3Hat %4 %1%2%3 控制器 %4 - - + + %1%2%3Axis %4 %1%2%3軸 %4 - - + + %1%2%3Button %4 %1%2%3 按鍵 %4 - - + + Migration - + - - + + No - + You can manually re-trigger this prompt by deleting the new config directory: %1 - + Migrating - + Migrating, this may take a while... @@ -8912,6 +9179,300 @@ p, li { white-space: pre-wrap; } 您想要復原這個 amiibo 嗎? + + QtCommon::Content + + + Installing Firmware... + 正在安装固件... + + + + + + Cancel + 取消 + + + + Firmware integrity verification failed! + 固件完整性验证失败! + + + + + Verification failed for the following files: + +%1 + 以下檔案驗證失敗: + +%1 + + + + + Verifying integrity... + 正在驗證完整性... + + + + + Integrity verification succeeded! + 完整性驗證成功! + + + + + The operation completed successfully. + 動作已成功完成 + + + + + Integrity verification failed! + 完整性驗證失敗! + + + + File contents may be corrupt or missing. + + + + + Integrity verification couldn't be performed + + + + + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. + + + + + Select Dumped Keys Location + 选择密钥文件位置 + + + + Decryption Keys install succeeded + 密钥文件安装成功 + + + + Decryption Keys were successfully installed + 密钥文件已成功安装 + + + + Decryption Keys install failed + 密钥文件安装失败 + + + + QtCommon::Game + + + Error Removing Contents + 移除內容時發生錯誤 + + + + Error Removing Update + 移除更新時發生錯誤 + + + + Error Removing DLC + 移除 DLC 時發生錯誤 + + + + The base game is not installed in the NAND and cannot be removed. + 此遊戲並非安裝在內部儲存空間,因此無法移除。 + + + + There is no update installed for this title. + 此遊戲沒有已安裝的更新。 + + + + There are no DLCs installed for this title. + + + + + + + + Successfully Removed + 移除成功 + + + + Successfully removed %1 installed DLC. + 成功移除遊戲 %1 已安裝的 DLC。 + + + + + Error Removing Transferable Shader Cache + 刪除通用著色器快取時發生錯誤 + + + + + A shader cache for this title does not exist. + 此遊戲沒有著色器快取 + + + + Successfully removed the transferable shader cache. + 成功刪除著色器快取。 + + + + Failed to remove the transferable shader cache. + 刪除通用著色器快取失敗。 + + + + Error Removing Vulkan Driver Pipeline Cache + 移除 Vulkan 驅動程式管線快取時發生錯誤 + + + + Failed to remove the driver pipeline cache. + 無法移除驅動程式管線快取。 + + + + + Error Removing Transferable Shader Caches + 刪除通用著色器快取時發生錯誤 + + + + Successfully removed the transferable shader caches. + 成功刪除通用著色器快取。 + + + + Failed to remove the transferable shader cache directory. + 無法刪除著色器快取資料夾。 + + + + + Error Removing Custom Configuration + 移除額外遊戲設定時發生錯誤 + + + + A custom configuration for this title does not exist. + 此遊戲沒有額外設定。 + + + + Successfully removed the custom game configuration. + 成功移除額外遊戲設定。 + + + + Failed to remove the custom game configuration. + 移除額外遊戲設定失敗。 + + + + Reset Metadata Cache + 重設中繼資料快取 + + + + The metadata cache is already empty. + 無中繼資料快取 + + + + The operation completed successfully. + 動作已成功完成 + + + + The metadata cache couldn't be deleted. It might be in use or non-existent. + 無法刪除中繼資料快取,可能因為正在使用或不存在。 + + + + Create Shortcut + 建立捷徑 + + + + Do you want to launch the game in fullscreen? + 您想以全屏模式启动游戏吗? + + + + Shortcut Created + + + + + Successfully created a shortcut to %1 + 已成功在 %1 建立捷徑 + + + + Shortcut may be Volatile! + + + + + This will create a shortcut to the current AppImage. This may not work well if you update. Continue? + 這將會為目前的應用程式映像建立捷徑,可能在其更新後無法運作,仍要繼續嗎? + + + + Failed to Create Shortcut + + + + + Failed to create a shortcut to %1 + 为 %1 创建快捷方式时失败 + + + + Create Icon + 建立圖示 + + + + Cannot create icon file. Path "%1" does not exist and cannot be created. + 無法建立圖示檔案,路徑「%1」不存在且無法建立。 + + + + No firmware available + 無可用韌體 + + + + Please install firmware to use the home menu. + + + + + Home Menu Applet + + + + + Home Menu is not available. Please reinstall firmware. + + + QtControllerSelectorDialog @@ -9207,7 +9768,7 @@ Please try again or contact the developer of the software. QtProfileSelectionDialog - + %1 %2 %1 is the profile username, %2 is the formatted UUID (e.g. 00112233-4455-6677-8899-AABBCCDDEEFF)) @@ -9215,7 +9776,7 @@ Please try again or contact the developer of the software. %2 - + Users 使用者 @@ -9339,7 +9900,7 @@ p, li { white-space: pre-wrap; } WaitTreeCallstack - + Call stack Call stack @@ -9347,12 +9908,12 @@ p, li { white-space: pre-wrap; } WaitTreeSynchronizationObject - + [%1] %2 [%1] %2 - + waited by no thread waited by no thread @@ -9360,102 +9921,102 @@ p, li { white-space: pre-wrap; } WaitTreeThread - + runnable runnable - + paused paused - + sleeping sleeping - + waiting for IPC reply waiting for IPC reply - + waiting for objects waiting for objects - + waiting for condition variable waiting for condition variable - + waiting for address arbiter waiting for address arbiter - + waiting for suspend resume waiting for suspend resume - + waiting waiting - + initialized initialized - + terminated terminated - + unknown unknown - + PC = 0x%1 LR = 0x%2 PC = 0x%1 LR = 0x%2 - + ideal ideal - + core %1 core %1 - + processor = %1 processor = %1 - + affinity mask = %1 affinity mask = %1 - + thread id = %1 thread id = %1 - + priority = %1(current) / %2(normal) priority = %1(current) / %2(normal) - + last running ticks = %1 last running ticks = %1 @@ -9463,7 +10024,7 @@ p, li { white-space: pre-wrap; } WaitTreeThreadList - + waited by thread waited by thread @@ -9471,7 +10032,7 @@ p, li { white-space: pre-wrap; } WaitTreeWidget - + &Wait Tree &Wait Tree diff --git a/dist/qt_themes/colorful/icons/16x16/checked.png b/dist/qt_themes/colorful/icons/16x16/checked.png index b9e64e9e08..0694e3d405 100644 Binary files a/dist/qt_themes/colorful/icons/16x16/checked.png and b/dist/qt_themes/colorful/icons/16x16/checked.png differ diff --git a/dist/qt_themes/colorful/icons/16x16/info.png b/dist/qt_themes/colorful/icons/16x16/info.png index 8b9330f4c8..e7ffc60830 100644 Binary files a/dist/qt_themes/colorful/icons/16x16/info.png and b/dist/qt_themes/colorful/icons/16x16/info.png differ diff --git a/dist/qt_themes/colorful/icons/256x256/plus_folder.png b/dist/qt_themes/colorful/icons/256x256/plus_folder.png index 760fe6245e..31471e3a2a 100644 Binary files a/dist/qt_themes/colorful/icons/256x256/plus_folder.png and b/dist/qt_themes/colorful/icons/256x256/plus_folder.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/chip.png b/dist/qt_themes/colorful/icons/48x48/chip.png index 6fa1589995..42b016592e 100644 Binary files a/dist/qt_themes/colorful/icons/48x48/chip.png and b/dist/qt_themes/colorful/icons/48x48/chip.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/folder.png b/dist/qt_themes/colorful/icons/48x48/folder.png index 498de4c629..f4d459b053 100644 Binary files a/dist/qt_themes/colorful/icons/48x48/folder.png and b/dist/qt_themes/colorful/icons/48x48/folder.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/list-add.png b/dist/qt_themes/colorful/icons/48x48/list-add.png index 74e4882aae..27a6f47c97 100644 Binary files a/dist/qt_themes/colorful/icons/48x48/list-add.png and b/dist/qt_themes/colorful/icons/48x48/list-add.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/sd_card.png b/dist/qt_themes/colorful/icons/48x48/sd_card.png index 652d61bc32..fcc4c2a5fa 100644 Binary files a/dist/qt_themes/colorful/icons/48x48/sd_card.png and b/dist/qt_themes/colorful/icons/48x48/sd_card.png differ diff --git a/dist/qt_themes/colorful/icons/48x48/star.png b/dist/qt_themes/colorful/icons/48x48/star.png index 19d55a0a80..2ff57696d4 100644 Binary files a/dist/qt_themes/colorful/icons/48x48/star.png and b/dist/qt_themes/colorful/icons/48x48/star.png differ diff --git a/dist/qt_themes/default/icons/256x256/eden.png b/dist/qt_themes/default/icons/256x256/eden.png index 32a2eebe8b..c0d7d8e37c 100644 Binary files a/dist/qt_themes/default/icons/256x256/eden.png and b/dist/qt_themes/default/icons/256x256/eden.png differ diff --git a/dist/qt_themes/default/icons/256x256/eden_named.png b/dist/qt_themes/default/icons/256x256/eden_named.png index c77d32c380..e4944d624d 100644 Binary files a/dist/qt_themes/default/icons/256x256/eden_named.png and b/dist/qt_themes/default/icons/256x256/eden_named.png differ diff --git a/dist/qt_themes/default/icons/48x48/bad_folder.png b/dist/qt_themes/default/icons/48x48/bad_folder.png index 364ec646f6..b0cc440b84 100644 Binary files a/dist/qt_themes/default/icons/48x48/bad_folder.png and b/dist/qt_themes/default/icons/48x48/bad_folder.png differ diff --git a/dist/qt_themes/default/icons/48x48/list-add.png b/dist/qt_themes/default/icons/48x48/list-add.png index fd8a06132c..ce34ce5522 100644 Binary files a/dist/qt_themes/default/icons/48x48/list-add.png and b/dist/qt_themes/default/icons/48x48/list-add.png differ diff --git a/dist/qt_themes/default/icons/48x48/sd_card.png b/dist/qt_themes/default/icons/48x48/sd_card.png index 6bcb7f6b1d..083566404b 100644 Binary files a/dist/qt_themes/default/icons/48x48/sd_card.png and b/dist/qt_themes/default/icons/48x48/sd_card.png differ diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index db55b9b490..701086299d 100644 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -95,6 +95,60 @@ QPushButton#button_reset_defaults { padding: 4px 8px; } +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + border: 1px solid #32414B; + border-radius: 4px; + margin-top: 20px; + padding: 2px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 3px; + padding-right: 5px; + padding-top: 2px; +} + +QGroupBox::indicator { + margin-left: 2px; + height: 16px; + width: 16px; +} + +QGroupBox::indicator:unchecked { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked.png"); +} + +QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); +} + +QGroupBox::indicator:unchecked:disabled { + image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); +} + +QGroupBox::indicator:checked { + border: none; + image: url(":/qss_icons/rc/checkbox_checked.png"); +} + +QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { + border: none; + image: url(":/qss_icons/rc/checkbox_checked_focus.png"); +} + +QGroupBox::indicator:checked:disabled { + image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); +} + QWidget#bottomPerGameInput, QWidget#topControllerApplet, QWidget#bottomControllerApplet, diff --git a/dist/qt_themes/default_dark/style.qss b/dist/qt_themes/default_dark/style.qss index 6a3f517cb6..dd224c3322 100644 --- a/dist/qt_themes/default_dark/style.qss +++ b/dist/qt_themes/default_dark/style.qss @@ -697,3 +697,29 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { image: url(:/overlay/osk_button_Y_disabled.png); } + +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + border: 1px solid #32414B; + border-radius: 4px; + margin-top: 22px; + padding: 2px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; +} + +QGroupBox::indicator { + margin-left: 2px; + height: 16px; + width: 16px; +} diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/lock.png b/dist/qt_themes/qdarkstyle/icons/16x16/lock.png index 7e63927b2c..d187110ab3 100644 Binary files a/dist/qt_themes/qdarkstyle/icons/16x16/lock.png and b/dist/qt_themes/qdarkstyle/icons/16x16/lock.png differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png b/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png index 245f96c7ba..42fee9ced2 100644 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png and b/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/chip.png b/dist/qt_themes/qdarkstyle/icons/48x48/chip.png index db0cadac13..9a727e7451 100644 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/chip.png and b/dist/qt_themes/qdarkstyle/icons/48x48/chip.png differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png b/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png index 8fbe780116..fdc39d6ba4 100644 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png and b/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png differ diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png b/dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png index 15e5e40245..d03d13a379 100644 Binary files a/dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png and b/dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/Hmovetoolbar.png b/dist/qt_themes/qdarkstyle/rc/Hmovetoolbar.png index cead99ed10..a0782ef97a 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/Hmovetoolbar.png and b/dist/qt_themes/qdarkstyle/rc/Hmovetoolbar.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png b/dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png index 512edcecd6..25db314c17 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png and b/dist/qt_themes/qdarkstyle/rc/Vmovetoolbar.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate.png b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate.png index 830cfee656..56e8c49849 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate.png and b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png index cb63cc2fac..8ddbdabd4c 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png and b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png index 671be273b0..6111a28fc9 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png and b/dist/qt_themes/qdarkstyle/rc/checkbox_indeterminate_focus.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png index 2159aca9a1..166f5aa049 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png and b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png index ade721e81b..789a03b356 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png and b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_focus.png b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_focus.png index e4258cc470..4b6981b268 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_focus.png and b/dist/qt_themes/qdarkstyle/rc/checkbox_unchecked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/close-hover.png b/dist/qt_themes/qdarkstyle/rc/close-hover.png index 657943a668..afddf97a79 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/close-hover.png and b/dist/qt_themes/qdarkstyle/rc/close-hover.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/close-pressed.png b/dist/qt_themes/qdarkstyle/rc/close-pressed.png index 937d005983..605ac0e6bf 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/close-pressed.png and b/dist/qt_themes/qdarkstyle/rc/close-pressed.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/close.png b/dist/qt_themes/qdarkstyle/rc/close.png index bc0f576109..3f843b8bcc 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/close.png and b/dist/qt_themes/qdarkstyle/rc/close.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/radio_checked.png b/dist/qt_themes/qdarkstyle/rc/radio_checked.png index 235e6b0ba7..edaf3f2228 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/radio_checked.png and b/dist/qt_themes/qdarkstyle/rc/radio_checked.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/radio_checked_disabled.png b/dist/qt_themes/qdarkstyle/rc/radio_checked_disabled.png index bf0051ede5..f2a4ce1df3 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/radio_checked_disabled.png and b/dist/qt_themes/qdarkstyle/rc/radio_checked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/radio_checked_focus.png b/dist/qt_themes/qdarkstyle/rc/radio_checked_focus.png index 700c6b525e..d6b540408d 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/radio_checked_focus.png and b/dist/qt_themes/qdarkstyle/rc/radio_checked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/radio_unchecked.png b/dist/qt_themes/qdarkstyle/rc/radio_unchecked.png index 9a4def65c6..f69d92df09 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/radio_unchecked.png and b/dist/qt_themes/qdarkstyle/rc/radio_unchecked.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png b/dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png index 6ece890e75..c3f29da053 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png and b/dist/qt_themes/qdarkstyle/rc/radio_unchecked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/radio_unchecked_focus.png b/dist/qt_themes/qdarkstyle/rc/radio_unchecked_focus.png index 564e022d33..81323f4150 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/radio_unchecked_focus.png and b/dist/qt_themes/qdarkstyle/rc/radio_unchecked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/stylesheet-branch-end.png b/dist/qt_themes/qdarkstyle/rc/stylesheet-branch-end.png index cb5d3b51f8..a50d541878 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/stylesheet-branch-end.png and b/dist/qt_themes/qdarkstyle/rc/stylesheet-branch-end.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png b/dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png index 87536cce16..baf9bd8437 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png and b/dist/qt_themes/qdarkstyle/rc/stylesheet-vline.png differ diff --git a/dist/qt_themes/qdarkstyle/rc/undock.png b/dist/qt_themes/qdarkstyle/rc/undock.png index 88691d7795..b7975a2b89 100644 Binary files a/dist/qt_themes/qdarkstyle/rc/undock.png and b/dist/qt_themes/qdarkstyle/rc/undock.png differ diff --git a/dist/qt_themes/qdarkstyle/style.qss b/dist/qt_themes/qdarkstyle/style.qss index 32610b131e..d018b9b64b 100644 --- a/dist/qt_themes/qdarkstyle/style.qss +++ b/dist/qt_themes/qdarkstyle/style.qss @@ -307,7 +307,7 @@ QAbstractItemView QLineEdit { QGroupBox { border: 1px solid #54575B; border-radius: 2px; - margin-top: 12px; + margin-top: 20px; padding-top: 2px; } diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png index cead99ed10..a0782ef97a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Hmovetoolbar.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png index 512edcecd6..25db314c17 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/Vmovetoolbar.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down.png index c4e6894ba9..76232456f6 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down@2x.png index bb8cbed0d6..4238e31d73 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled.png index aa1d06c084..f286fb7605 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png index 86bf434b84..924f9951f9 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus.png index 1c42ee8f6a..310cdf0ae3 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png index 7374637c5e..c1fa23192d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed.png index 8139ee3e83..87cef99e61 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed@2x.png index 5e9d225ff6..47b87f55aa 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_down_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png index ef929fdf04..e71a93cf0e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png index c8923d6f4c..37362f331e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled.png index 9c69561a7f..67cbd8c203 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled@2x.png index e521143121..c33c0e50a4 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png index a1f0704550..58daf567b5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus@2x.png index c4267e856b..59d58ab753 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed.png index bd706cbdd6..54ab848e87 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png index 341b2e5410..a61de7f5ff 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_left_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right.png index 4f33885057..649da834ba 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png index 94b2609658..a16fe6d1ee 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png index 0fbc6b04c5..3d7f3c080e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled@2x.png index 8e9272a5b9..723de13ce1 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus.png index 7649409451..a0c45d83b0 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png index 6d52b5fa37..a34b45b35a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png index a5f04522a6..a6bdecbf28 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed@2x.png index 6f6a8130c1..b650e3271b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_right_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png index 61d7574a4d..751c95411b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up@2x.png index d711fae16a..b5375c7cb2 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png index 18e8ecd8d3..fde7ba3f01 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled@2x.png index fb4defb522..c09291ab13 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png index a7acd9b668..3dadfe4220 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus@2x.png index 9cd982a1d4..0ed72401e7 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png index 390a80e21b..fac7fdb9e8 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png index dd352cff39..70689f752a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/arrow_up_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png index 37a6158cc4..492cc2724e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon@2x.png index e6e5cb9160..19fbf8d5af 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled.png index 37a6158cc4..492cc2724e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled@2x.png index e6e5cb9160..19fbf8d5af 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus.png index 37a6158cc4..492cc2724e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus@2x.png index e6e5cb9160..19fbf8d5af 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed.png index 37a6158cc4..492cc2724e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed@2x.png index e6e5cb9160..19fbf8d5af 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/base_icon_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png index 53e2c51f57..df389d19fa 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png index 06cdefa5f1..606f905309 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled.png index 5106a1438b..43d7b70185 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled@2x.png index 180bae9e61..86dbc5bc69 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus.png index c227f9f71c..c530d0ee3c 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus@2x.png index ad23d0d332..954592f027 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png index 90845a81fa..4e7831ed41 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png index 60aaeb7fb3..61b924e9f2 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_closed_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png index 08b5559b21..4372be7a06 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end@2x.png index ae6dbe9913..a5c0485530 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png index 027a8894a6..e748e2e728 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled@2x.png index 43c1b0c769..fe12891a7e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png index fdb3160bb8..7a283b46b9 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png index 3ca8904498..c1a173e418 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png index 1c2432dd4b..12afd7b17a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png index af0f8fa5a9..cb781ab4dc 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_end_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png index a3a564e447..5bdb43fd41 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png index 1dbf71fc72..b5dced34e2 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png index ecc7e6d932..d0ad0e07ec 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png index adc6446c97..4bd61d377b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png index 0037f175ad..08ec6d12fe 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus@2x.png index cb257a9143..53a3164aa3 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png index 2d08565278..4d1e85a178 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png index 803708fb45..102b287c28 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_line_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png index 31b6cee873..e676e28e46 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more@2x.png index f1f7a67f16..7bf47a36af 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png index d4b6049055..f9b714eba9 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png index 3ef752108d..212b56ec5d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png index 943c13d0b2..8a74cad89c 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png index 9f53ef1fa5..6b3c2b8fbb 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png index 9037ed3b3f..dafad3dcf3 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed@2x.png index 675d52c761..b1a5d22842 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_more_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png index 0861d0bc76..b9e2719214 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png index 8850f7367b..541786551f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png index b6c80243b6..0f2e2e6cbf 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled@2x.png index 15ce9f2650..cbd1f2823f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png index eadb0962a5..c7f8089abb 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus@2x.png index 7dfcbbe8ab..5d08b01c8c 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png index 2b22e8d08d..361b1bff04 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png index 269a0cbee8..bde4b37e8d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/branch_open_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked.png index e7ed080810..2a698618b5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png index 35f2ade589..eebc45b172 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png index 512b0a3e4c..414e315d04 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png index 557383ec88..fc7973ccb6 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png index 0b90412f29..1a9894a616 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png index 7aee03cbb2..d2f515b4cd 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png index 3d4c869b79..8b5d23177b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed@2x.png index bfbc14b94d..0279f750f5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_checked_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png index c21ab99bfb..158038aa55 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png index 2fc29cee62..cf63ceab7f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png index 1d3c214923..b8602ab3c7 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled@2x.png index bb8e7a7477..0aecf329a5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png index 13ca4a7a40..2f3a5c098d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus@2x.png index 3907eb8d46..3f5e08f884 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png index 12f83ceba3..34fc686b9c 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png index 5ff4f66298..344d2fe47b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_indeterminate_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked.png index e2da452faa..f569143fe8 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png index 3732d5406e..883cd95814 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png index c2e30c690a..de85ec5e87 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled@2x.png index c4bddb6eb1..eac24e56b7 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png index c57f04d9f8..ee8eb5650a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus@2x.png index 1776ad0486..6421b2f75c 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed.png index be41236e1b..54f7917304 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png index b1ad7c72fe..136d9f6b77 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/checkbox_unchecked_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-hover.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-hover.png index 657943a668..afddf97a79 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-hover.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-hover.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-pressed.png index 937d005983..605ac0e6bf 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/close-pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/close.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/close.png index bc0f576109..3f843b8bcc 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/close.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/close.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal@2x.png index c229ac963d..41a3a1ef0a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png index a4713c565e..12f07fbb9d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png index 84397efdbf..0c26376506 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png index 140552e4ff..a6aeed8754 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_horizontal_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png index a3a564e447..5bdb43fd41 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png index 1dbf71fc72..b5dced34e2 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png index ecc7e6d932..d0ad0e07ec 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png index adc6446c97..4bd61d377b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png index 0037f175ad..08ec6d12fe 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus@2x.png index cb257a9143..53a3164aa3 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png index 2d08565278..4d1e85a178 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png index 803708fb45..102b287c28 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/line_vertical_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png index 6f1fd6ca69..4e5cc4445b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked@2x.png index 228ffdbf21..94f0939ba1 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png index 27788530d1..74fd0faae7 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled@2x.png index 930bfaf70d..ee6fab7c00 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png index ca8e8bc9a7..183930162f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png index aa0f1152be..4fd15f7f7d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed.png index 6e391a0ff3..24ecf6781d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed@2x.png index 0512731ae5..f816f32387 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_checked_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png index 763306bdcc..391acb69e8 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png index 28b6a07842..8bae28f3fb 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png index fc0b12f781..300d86068a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png index d31f2b4b9d..16d595ccee 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png index 9c87b01e49..edd78cb43b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus@2x.png index 4b4c7321dd..7ab8c79fba 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png index 709e316336..9046c4b764 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed@2x.png index b014de5f01..a6c3cd9b0f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/radio_unchecked_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png index cb5d3b51f8..a50d541878 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png index 87536cce16..baf9bd8437 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/stylesheet-vline.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal.png index 012ea2dfb1..fd0cf328b4 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png index 520c34f98d..0b07144fdd 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled.png index 1f91df98fd..bba0cf74b7 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png index 738008f92e..3162df8c18 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png index 999b3c7d82..fd021e97ec 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png index f8e40b7d19..d9aae5ecdd 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png index c31b69deb6..1e170e9a73 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed@2x.png index 2f4cb41c7e..bedb94a89e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_horizontal_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical@2x.png index 90a5caee37..ab7e0a52f1 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png index 2d240edb52..e2e2afce86 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png index fd1df30f11..7eccab8513 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png index 58cda1f805..82b2482ef5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png index 9222b4fd8e..66504f977f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed.png index e7d6419261..013bc2d3f0 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png index 9c438faf42..6ad8b47f16 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_move_vertical_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png index 3c0acbdcc0..71f79e7c18 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png index fb4e24c88f..4049b34530 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png index 32f7e8ca6f..eb5944bba0 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled@2x.png index f7bec188bb..12df69aad9 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png index 91c19d65c3..d05adc4a58 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png index c4829918d6..70556d96c7 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png index 7a7f917374..1ade9619f5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png index d65773b487..1c2f542ecf 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_horizontal_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png index fe97c0de36..4cced09e9b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png index 7acc6d33ea..7975862422 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png index 6e3c121433..a0c764d010 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png index cac3a56c28..1088091c5e 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png index b777784b88..dd8529c4b6 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed@2x.png index 7ed878fd3f..11007b6fca 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/toolbar_separator_vertical_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png index 88691d7795..b7975a2b89 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/undock.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close.png index 6f55c3ae77..72af3edd36 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png index ff644f2e81..41a82e7a5b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png index 22694e31dd..6e5f534d55 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png index ebc97db707..d6d3a6127c 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus.png index f017eda31f..23b0129b85 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus@2x.png index 5a354d7963..f1f2a8271a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed.png index 04b922dd08..a7924de6f9 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png index 58c0bf592c..92e7a86e2b 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_close_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip.png index 0528049bbd..a5b556fefa 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip@2x.png index 1ca1b073c9..e2a91a6b57 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png index 15f55c0560..509c335897 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png index 33a4588e8e..cb18102c61 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus.png index 06e76c31f2..ef4abe6215 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png index 58c2d06e4f..f4b7479e71 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png index b3a566cdb9..9a365bfc3f 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed@2x.png index e9da940497..e299648d08 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_grip_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize.png index f609816153..6f85fb6489 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png index 30f728f022..2a53538b34 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled.png index 29db1c9b18..e498972494 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png index 1572ca2fea..063c8f635d 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png index cb592f5988..561039af1a 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png index 6f6465169d..1f0c2e1b90 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png index 6962440ace..c1cb9fcb77 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png index cb028272b8..588baf4336 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_minimize_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png index 616da991a5..70c4dbcad5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png index 511036bf2d..db805412b5 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png index a2b3d25b23..0156d0be80 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png index 638ec8104a..ce1909f2c4 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_disabled@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png index ae6dc4a606..746a4d1909 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png index d06dd1eac8..603d3966cc 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_focus@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png index e9142ded2c..0b6fc91950 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png index a597420f36..736707afc1 100644 Binary files a/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png and b/dist/qt_themes/qdarkstyle_midnight_blue/rc/window_undock_pressed@2x.png differ diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss index 43db5ad0b5..ca80f8b665 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss @@ -235,10 +235,9 @@ https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox --------------------------------------------------------------------------- */ QGroupBox { - font-weight: bold; border: 1px solid #32414B; border-radius: 4px; - margin-top: 12px; + margin-top: 20px; padding: 2px; } diff --git a/docs/Build.md b/docs/Build.md new file mode 100644 index 0000000000..52a671ab1e --- /dev/null +++ b/docs/Build.md @@ -0,0 +1,160 @@ +# Building Eden + +> [!WARNING] +> This guide is intended for developers ONLY. If you are not a developer or packager, you are unlikely to receive support. + +This is a full-fledged guide to build Eden on all supported platforms. + +## Dependencies +First, you must [install some dependencies](Deps.md). + +## Clone +Next, you will want to clone Eden via the terminal: + +```sh +git clone https://git.eden-emu.dev/eden-emu/eden.git +cd eden +``` + +Or use Qt Creator (Create Project -> Import Project -> Git Clone). + +## Android + +Android has a completely different build process than other platforms. See its [dedicated page](build/Android.md). + +## Initial Configuration + +If the configure phase fails, see the `Troubleshooting` section below. Usually, as long as you followed the dependencies guide, the defaults *should* successfully configure and build. + +### Qt Creator + +This is the recommended GUI method for Linux, macOS, and Windows. + +
+Click to Open + +> [!WARNING] +> On MSYS2, to use Qt Creator you are recommended to *also* install Qt from the online installer, ensuring to select the "MinGW" version. + +Open the CMakeLists.txt file in your cloned directory via File -> Open File or Project (Ctrl+O), if you didn't clone Eden via the project import tool. + +Select your desired "kit" (usually, the default is okay). RelWithDebInfo or Release is recommended: + +![Qt Creator kits](img/creator-1.png) + +Hit "Configure Project", then wait for CMake to finish configuring (may take a while on Windows). + +
+ +### Command Line + +This is recommended for *BSD, Solaris, Linux, and MSYS2. MSVC is possible, but not recommended. + +
+Click to Open + +Note that CMake must be in your PATH, and you must be in the cloned Eden directory. On Windows, you must also set up a Visual C++ development environment. This can be done by running `C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat` in the same terminal. + +Recommended generators: + +- MSYS2: `MSYS Makefiles` +- MSVC: Install **[ninja](https://ninja-build.org/)** and use `Ninja`, OR use `Visual Studio 17 2022` +- macOS: `Ninja` (preferred) or `Xcode` +- Others: `Ninja` (preferred) or `UNIX Makefiles` + +BUILD_TYPE should usually be `Release` or `RelWithDebInfo` (debug symbols--compiled executable will be large). If you are using a debugger and annoyed with stuff getting optimized out, try `Debug`. + +Also see the [Options](Options.md) page for additional CMake options. + +```sh +cmake -S . -B build -G "GENERATOR" -DCMAKE_BUILD_TYPE= -DYUZU_TESTS=OFF +``` + +If you are on Windows and prefer to use Clang: + +```sh +cmake -S . -B build -G "GENERATOR" -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl +``` + +
+ +### [CLion](https://www.jetbrains.com/clion/) + +
+Click to Open + +* Clone the Repository: + + + + + +--- + +### Building & Setup + +* Once Cloned, You will be taken to a prompt like the image below: + + + +* Set the settings to the image below: +* Change `Build type: Release` +* Change `Name: Release` +* Change `Toolchain Visual Studio` +* Change `Generator: Let CMake decide` +* Change `Build directory: build` + + + +* Click OK; now Clion will build a directory and index your code to allow for IntelliSense. Please be patient. +* Once this process has been completed (No loading bar bottom right), you can now build eden +* In the top right, click on the drop-down menu, select all configurations, then select eden + + + +* Now run by clicking the play button or pressing Shift+F10, and eden will auto-launch once built. + + +
+ +## Troubleshooting + +If your initial configure failed: +- *Carefully* re-read the [dependencies guide](Deps.md) +- Clear the CPM cache (`.cache/cpm`) and CMake cache (`/CMakeCache.txt`) +- Evaluate the error and find any related settings +- See the [CPM docs](CPM.md) to see if you may need to forcefully bundle any packages + +Otherwise, feel free to ask for help in Revolt or Discord. + +## Caveats + +Many platforms have quirks, bugs, and other fun stuff that may cause issues when building OR running. See the [Caveats page](Caveats.md) before continuing. + +## Building & Running + +### Qt Creator + +Simply hit Ctrl+B, or the "hammer" icon in the bottom left. To run, hit the "play" icon, or Ctrl+R. + +### Command Line + +If you are not on Windows and are using the `UNIX Makefiles` generator, you must also add `-j$(nproc)` to this command. + +``` +cmake --build build +``` + +Your compiled executable will be in: +- `build/bin/eden.exe` for Windows, +- `build/bin/eden.app/Contents/MacOS/eden` for macOS, +- and `build/bin/eden` for others. + +## Scripts + +Some platforms have convenience scripts provided for building. + +- **[Linux](scripts/Linux.md)** +- **[Windows](scripts/Windows.md)** + +macOS scripts will come soon. \ No newline at end of file diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS new file mode 100644 index 0000000000..dcb97a5e83 --- /dev/null +++ b/docs/CODEOWNERS @@ -0,0 +1,27 @@ +# ui stuff +/src/android @AleksandrPopovich @nyxynx @Producdevity +/src/yuzu @crueter +/src/eden @crueter +/src/frontend_common @crueter +/src/qt_common @crueter + +# docs, meta +/docs @Lizzie @crueter +/.ci @crueter + +# cmake +*.cmake @crueter +*CMakeLists.txt @crueter +*.in @crueter + +# individual stuff +src/web_service @AleksandrPopovich +src/dynarmic @Lizzie +src/core @Lizzie @Maufeat @PavelBARABANOV @MrPurple666 @JPikachu +src/core/hle @Maufeat @PavelBARABANOV @SDK-Chan +src/core/arm @Lizzie @MrPurple666 +src/*_room @AleksandrPopovich +src/video_core @CamilleLaVey @MaranBr @Wildcard @weakboson + +# Global owners/triage +* @CamilleLaVey @Maufeat @crueter @MrPurple666 @MaranBr @Lizzie \ No newline at end of file diff --git a/docs/CPMUtil.md b/docs/CPMUtil.md new file mode 100644 index 0000000000..779515ae7e --- /dev/null +++ b/docs/CPMUtil.md @@ -0,0 +1,14 @@ +# CPMUtil + +CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful utility functions to make dependency management a piece of cake. + +See more in [its repository](https://git.crueter.xyz/CMake/CPMUtil) + +Eden-specific options: + +- `YUZU_USE_CPM` is set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing + * If this is `OFF`, required system dependencies will be searched via `find_package`, although most externals use CPM regardless. + +## Tooling + +See the [tooling docs](../tools/cpm) \ No newline at end of file diff --git a/docs/Caveats.md b/docs/Caveats.md new file mode 100644 index 0000000000..7bc2428bab --- /dev/null +++ b/docs/Caveats.md @@ -0,0 +1,52 @@ +# Caveats + +## Arch Linux + +- httplib AUR package is broken. Set `httplib_FORCE_BUNDLED=ON` if you have it installed. +- Eden is also available as an [AUR package](https://aur.archlinux.org/packages/eden-git). If you are unable to build, either use that or compare your process to the PKGBUILD. + +## Gentoo Linux + +Do not use the system sirit or xbyak packages. + +## macOS + +macOS is largely untested. Expect crashes, significant Vulkan issues, and other fun stuff. + +## Solaris + +Qt Widgets appears to be broken. For now, add `-DENABLE_QT=OFF` to your configure command. In the meantime, a Qt Quick frontend is in the works--check back later! + +This is needed for some dependencies that call cc directly (tz): + +```sh +echo '#!/bin/sh' >cc +echo 'gcc $@' >>cc +chmod +x cc +export PATH="$PATH:$PWD" +``` + +Default MESA is a bit outdated, the following environment variables should be set for a smoother experience: +```sh +export MESA_GL_VERSION_OVERRIDE=4.6 +export MESA_GLSL_VERSION_OVERRIDE=460 +export MESA_EXTENSION_MAX_YEAR=2025 +export MESA_DEBUG=1 +export MESA_VK_VERSION_OVERRIDE=1.3 +# Only if nvidia/intel drm drivers cause crashes, will severely hinder performance +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`). +- If using OpenIndiana, due to a bug in SDL2's CMake configuration, audio driver defaults to SunOS ``, 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. + +## OpenBSD + +After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`. + +## FreeBSD + +Eden is not currently available as a port on FreeBSD, though it is in the works. For now, the recommended method of usage is to compile it yourself. + +The available OpenSSL port (3.0.17) is out-of-date, and using a bundled static library instead is recommended; to do so, add `-DYUZU_USE_BUNDLED_OPENSSL=ON` to your CMake configure command. \ No newline at end of file diff --git a/docs/Deps.md b/docs/Deps.md new file mode 100644 index 0000000000..b8a1be66d2 --- /dev/null +++ b/docs/Deps.md @@ -0,0 +1,215 @@ +# Dependencies + +To build Eden, you MUST have a C++ compiler. +* On Linux, this is usually [GCC](https://gcc.gnu.org/) 11+ or [Clang](https://clang.llvm.org/) v14+ + - GCC 12 also requires Clang 14+ +* On Windows, this is either: + - **[MSVC](https://visualstudio.microsoft.com/downloads/)** (you should select *Community* option), + * *A convenience script to install the Visual Community Studio 2022 with necessary tools is provided in `.ci/windows/install-msvc.ps1`* + - clang-cl - can be downloaded from the MSVC installer, + - or **[MSYS2](https://www.msys2.org)** +* On macOS, this is Apple Clang + - This can be installed with `xcode-select --install` + +The following additional tools are also required: + +* **[CMake](https://www.cmake.org/)** 3.22+ - already included with the Android SDK +* **[Git](https://git-scm.com/)** for version control + - **[Windows installer](https://gitforwindows.org)** +* On Windows, you must install the **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** as well + - *A convenience script to install the latest SDK is provided in `.ci/windows/install-vulkan-sdk.ps1`* + +If you are on desktop and plan to use the Qt frontend, you *must* install Qt 6, and optionally Qt Creator (the recommended IDE for building) +* On Linux, *BSD and macOS, this can be done by the package manager + - If you wish to use Qt Creator, append `qtcreator` or `qt-creator` to the commands seen below. +* MSVC/clang-cl users on Windows must install through the [official installer](https://www.qt.io/download-qt-installer-oss) +* Linux and macOS users may choose to use the installer as well. +* MSYS2 can also install Qt 6 via the package manager + +If you are on Windows and NOT building with MSYS2, you may go [back home](Build.md) and continue. + +## Externals +The following are handled by Eden's externals: + +* [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) + +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): + +* [Boost](https://www.boost.org/users/download/) 1.57.0+ +* [Catch2](https://github.com/catchorg/Catch2) 3.0.1 if `YUZU_TESTS` or `DYNARMIC_TESTS` are on +* [fmt](https://fmt.dev/) 8.0.1+ +* [lz4](http://www.lz4.org) +* [nlohmann\_json](https://github.com/nlohmann/json) 3.8+ +* [OpenSSL](https://www.openssl.org/source/) 1.1.1+ +* [ZLIB](https://www.zlib.net/) 1.2+ +* [zstd](https://facebook.github.io/zstd/) 1.5+ +* [enet](http://enet.bespin.org/) 1.3+ +* [Opus](https://opus-codec.org/) 1.3+ +* [MbedTLS](https://github.com/Mbed-TLS/mbedtls) 3+ + +Vulkan 1.3.274+ is also needed: +* [VulkanUtilityLibraries](https://github.com/KhronosGroup/Vulkan-Utility-Libraries) +* [VulkanHeaders](https://github.com/KhronosGroup/Vulkan-Headers) +* [SPIRV-Tools](https://github.com/KhronosGroup/SPIRV-Tools) +* [SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) + +Certain other dependencies will be fetched by CPM regardless. System packages *can* be used for these libraries, but many are either not packaged by most distributions OR have issues when used by the system: + +* [SimpleIni](https://github.com/brofield/simpleini) +* [DiscordRPC](https://github.com/eden-emulator/discord-rpc) +* [cubeb](https://github.com/mozilla/cubeb) +* [libusb](https://github.com/libusb/libusb) +* [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator) +* [sirit](https://github.com/eden-emulator/sirit) +* [httplib](https://github.com/yhirose/cpp-httplib) - if `ENABLE_QT_UPDATE_CHECKER` or `ENABLE_WEB_SERVICE` are on + - This package is known to be broken on the AUR. +* [cpp-jwt](https://github.com/arun11299/cpp-jwt) 1.4+ - if `ENABLE_WEB_SERVICE` is on +* [unordered-dense](https://github.com/martinus/unordered_dense) +* [mcl](https://github.com/azahar-emu/mcl) - subject to removal + +On amd64: +* [xbyak](https://github.com/herumi/xbyak) - 7.22 or earlier is recommended +* [zycore](https://github.com/zyantific/zycore-c) +* [zydis](https://github.com/zyantific/zydis) 4+ +* Note: zydis and zycore-c MUST match. Using one as a system dependency and the other as a bundled dependency WILL break things + +On aarch64 OR if `DYNARMIC_TESTS` is on: +* [oaknut](https://github.com/merryhime/oaknut) 2.0.1+ + +On riscv64: +* [biscuit](https://github.com/lioncash/biscuit) 0.9.1+ + +## Commands + +These are commands to install all necessary dependencies on various Linux and BSD distributions, as well as macOS. Always review what you're running before you hit Enter! + +Click on the arrows to expand. + +
+Arch Linux + +```sh +sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip zydis zycore vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers +``` + +* Building with QT Web Engine requires `qt6-webengine` as well. +* Proper Wayland support requires `qt6-wayland` +* GCC 11 or later is required. +
+ +
+Ubuntu, Debian, Mint Linux + +```sh +sudo apt-get install autoconf cmake g++ gcc git glslang-tools libasound2t64 libboost-context-dev libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libzydis-dev zydis-tools libzycore-dev vulkan-utility-libraries-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev +``` + +* Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required. +* To enable QT Web Engine, add `-DYUZU_USE_QT_WEB_ENGINE=ON` when running CMake. +
+ +
+Fedora Linux + +```sh +sudo dnf install autoconf ccache cmake fmt-devel gcc{,-c++} glslang hidapi-devel json-devel libtool libusb1-devel libzstd-devel lz4-devel nasm ninja-build openssl-devel pulseaudio-libs-devel qt6-linguist qt6-qtbase{-private,}-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel +``` + +* Force system libraries via CMake arguments: + * SDL2: `-DYUZU_USE_BUNDLED_SDL2=OFF -DYUZU_USE_EXTERNAL_SDL2=OFF` + * FFmpeg: `-DYUZU_USE_EXTERNAL_FFMPEG=OFF` +* [RPM Fusion](https://rpmfusion.org/) is required for `ffmpeg-devel` +* Fedora 32 or later is required. +* Fedora 36+ users with GCC 12 need Clang and should configure CMake with: +
+ +
+macOS + +Install dependencies from **[Homebrew](https://brew.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 +``` + +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`. + +To run with MoltenVK, install additional dependencies: +```sh +brew install molten-vk vulkan-loader +``` + +
+ +
+FreeBSD + +``` +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 + +net/enet + +multimedia/ffnvcodec-headers +multimedia/ffmpeg + +audio/opus + +archivers/liblz4 + +lang/gcc12 + +graphics/glslang +graphics/vulkan-utility-libraries +``` + +If using FreeBSD 12 or prior, use `devel/pkg-config` instead. +
+ +
+OpenBSD + +```sh +pkg_add -u +pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake llvm-19.1.7p3 qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl2 libusb1.1.0.27 +``` +
+ +
+Solaris / OpenIndiana + +Always consult [the OpenIndiana package list](https://pkg.openindiana.org/hipster/en/index.shtml) to cross-verify availability. + +Run the usual update + install of essential toolings: `sudo pkg update && sudo pkg install git cmake`. + +- **gcc**: `sudo pkg install developer/gcc-14`. +- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`. + +Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`. +
+ +
+MSYS2 + +* Open the `MSYS2 MinGW 64-bit` shell (`mingw64.exe`) +* Download and install all dependencies using: + * `pacman -Syu git make mingw-w64-x86_64-SDL2 mingw-w64-x86_64-cmake mingw-w64-x86_64-python-pip mingw-w64-x86_64-qt6 mingw-w64-x86_64-toolchain autoconf libtool automake-wrapper` +* Add MinGW binaries to the PATH: + * `echo 'PATH=/mingw64/bin:$PATH' >> ~/.bashrc` +* Add VulkanSDK to the PATH: + * `echo 'PATH=$(readlink -e /c/VulkanSDK/*/Bin/):$PATH' >> ~/.bashrc` +
+ +## All Done + +You may now return to the **[root build guide](Build.md)**. diff --git a/docs/Development.md b/docs/Development.md index e60384e8ab..c223409243 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -1,22 +1,3 @@ -# Development - -* **Windows**: [Windows Building Guide](./build/Windows.md) -* **Linux**: [Linux Building Guide](./build/Linux.md) -* **Android**: [Android Building Guide](./build/Android.md) -* **Solaris**: [Solaris Building Guide](./build/Solaris.md) -* **FreeBSD**: [FreeBSD Building Guide](./build/FreeBSD.md) -* **macOS**: [macOS Building Guide](./build/macOS.md) - -# CPM - -CPM (CMake Package Manager) is the preferred method of managing dependencies within Eden. Documentation on adding dependencies/using CPMUtil is in the works. - -Notes: -- `YUZU_USE_CPM` is set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing -- `CPMUTIL_DEFAULT_SYSTEM` can be set to `OFF` to force the usage of bundled dependencies. This can marginally decrease the final package size. -- When adding new prebuilt dependencies a la OpenSSL, SDL2, or FFmpeg, there *must* be a CMake option made available to forcefully download this bundle. See the OpenSSL implementation in the root CMakeLists for an example. - * This is necessary to allow for creation of fully-qualified source packs that allow for offline builds after download (some package managers and distros enforce this) - # Guidelines ## License Headers @@ -36,6 +17,8 @@ FIX=true .ci/license-header.sh git commit --amend -a --no-edit ``` +If the work is licensed/vendored from other people or projects, you may omit the license headers. Additionally, if you wish to retain authorship over a piece of code, you may attribute it to yourself; however, the code may be changed at any given point and brought under the attribution of Eden. + ## Pull Requests Pull requests are only to be merged by core developers when properly tested and discussions conclude on Discord or other communication channels. Labels are recommended but not required. However, all PRs MUST be namespaced and optionally typed: ``` @@ -48,11 +31,33 @@ Pull requests are only to be merged by core developers when properly tested and - The level of namespacing is generally left to the committer's choice. - However, we never recommend going more than two levels *except* in `hle`, in which case you may go as many as four levels depending on the specificity of your changes. -- Ocassionally, up to two namespaces may be provided for more clarity. +- Ocassionally, up to two additional namespaces may be provided for more clarity. * Changes that affect the entire project (sans CMake changes) should be namespaced as `meta`. - Maintainers are permitted to change namespaces at will. - Commits within PRs are not required to be namespaced, but it is highly recommended. +## Adding new settings + +When adding new settings, use `tr("Setting:")` if the setting is meant to be a field, otherwise use `tr("Setting")` if the setting is meant to be a Yes/No or checkmark type of setting, see [this short style guide](https://learn.microsoft.com/en-us/style-guide/punctuation/colons#in-ui). + +- The majority of software must work with the default option selected for such setting. Unless the setting significantly degrades performance. +- Debug settings must never be turned on by default. +- Provide reasonable bounds (for example, a setting controlling the amount of VRAM should never be 0). +- The description of the setting must be short and concise, if the setting "does a lot of things" consider splitting the setting into multiple if possible. +- Try to avoid excessive/redundant explainations "recommended for most users and games" can just be "(recommended)". +- Try to not write "slow/fast" options unless it clearly degrades/increases performance for a given case, as most options may modify behaviour that result in different metrics accross different systems. If for example the option is an "accuracy" option, writing "High" is sufficient to imply "Slow". No need to write "High (Slow)". + +Some examples: +- "[...] negatively affecting image quality", "[...] degrading image quality": Same wording but with less filler. +- "[...] this may cause some glitches or crashes in some games", "[...] this may cause soft-crashes": Crashes implies there may be glitches (as crashes are technically a form of a fatal glitch). The entire sentence is structured as "may cause [...] on some games", which is redundant, because "may cause [...] in games" has the same semantic meaning ("may" is a chance that it will occur on "some" given set). +- "FIFO Relaxed is similar to FIFO [...]", "FIFO Relaxed [...]": The name already implies similarity. +- "[...] but may also reduce performance in some cases", "[...] but may degrade performance": Again, "some cases" and "may" implies there is a probability. +- "[...] it can [...] in some cases", "[...] it can [...]": Implied probability. + +Before adding a new setting, consider: +- Does the piece of code that the setting pertains to, make a significant difference if it's on/off? +- Can it be auto-detected? + # IDE setup ## VSCode @@ -86,6 +91,18 @@ cmake --build /tmp/ramdisk -- -j32 sudo umount /tmp/ramdisk ``` +# Assets and large files + +A general rule of thumb, before uploading files: +- PNG files: Use [optipng](https://web.archive.org/web/20240325055059/https://optipng.sourceforge.net/). +- SVG files: Use [svgo](https://github.com/svg/svgo). + +May not be used but worth mentioning nonethless: +- OGG files: Use [OptiVorbis](https://github.com/OptiVorbis/OptiVorbis). +- Video files: Use ffmpeg, preferably re-encode as AV1. + +# Debugging + ## Debugging (host code) Ignoring SIGSEGV when debugging in host: diff --git a/docs/Options.md b/docs/Options.md new file mode 100644 index 0000000000..3dd84ea645 --- /dev/null +++ b/docs/Options.md @@ -0,0 +1,69 @@ +# CMake Options + +To change these options, add `-DOPTION_NAME=NEWVALUE` to the command line. + +- On Qt Creator, go to Project -> Current Configuration + +Notes: +- Defaults are marked per-platform. +- "Non-UNIX" just means Windows/MSVC and Android (yes, macOS is UNIX +- Android generally doesn't need to change anything; if you do, go to `src/android/app/build.gradle.kts` +- To set a boolean variable to on, use `ON` for the value; to turn it off, use `OFF` +- If a variable is mentioned as being e.g. "ON" for a specific platform(s), that means it is defaulted to OFF on others +- TYPE is always boolean unless otherwise specified +- Format: + * `OPTION_NAME` (TYPE DEFAULT) DESCRIPTION + +## Options + +- `YUZU_USE_CPM` (ON for non-UNIX) Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched. See the [CPM](CPM.md) and [Deps](Deps.md) docs for more info. +- `ENABLE_WEB_SERVICE` (ON) Enable multiplayer service +- `ENABLE_WIFI_SCAN` (OFF) Enable WiFi scanning (requires iw on Linux) - experimental +- `YUZU_USE_BUNDLED_FFMPEG` (ON for non-UNIX) Download (Windows, Android) or build (UNIX) bundled FFmpeg +- `ENABLE_CUBEB` (ON) Enables the cubeb audio backend +- `YUZU_TESTS` (ON) Compile tests - requires Catch2 +- `YUZU_USE_PRECOMPILED_HEADERS` (ON for non-UNIX) Use precompiled headers +- `YUZU_DOWNLOAD_ANDROID_VVL` (ON) Download validation layer binary for Android +- `YUZU_ENABLE_LTO` (OFF) Enable link-time optimization + * Not recommended on Windows + * UNIX may be better off appending `-flto=thin` to compiler args +- `YUZU_DOWNLOAD_TIME_ZONE_DATA` (ON) Always download time zone binaries + * Currently, build fails without this +- `YUZU_USE_FASTER_LD` (ON) Check if a faster linker is available + * Only available on UNIX +- `YUZU_USE_BUNDLED_MOLTENVK` (ON, macOS only) Download bundled MoltenVK lib) +- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS) +- `ENABLE_OPENSSL` (ON for Linux and *BSD) Enable OpenSSL backend for the ssl service + * Always enabled if the web service is enabled +- `YUZU_USE_BUNDLED_OPENSSL` (ON for MSVC) Download bundled OpenSSL build + * Always on for Android + * Unavailable on OpenBSD + +The following options are desktop only: +- `ENABLE_SDL2` (ON) Enable the SDL2 desktop, audio, and input frontend (HIGHLY RECOMMENDED!) + * Unavailable on Android +- `YUZU_USE_EXTERNAL_SDL2` (ON for non-UNIX) Compiles SDL2 from source +- `YUZU_USE_BUNDLED_SDL2` (ON for MSVC) Download a prebuilt SDL2 + * Unavailable on OpenBSD + * Only enabled if YUZU_USE_CPM and ENABLE_SDL2 are both ON +- `ENABLE_LIBUSB` (ON) Enable the use of the libusb input frontend (HIGHLY RECOMMENDED) +- `ENABLE_OPENGL` (ON) Enable the OpenGL graphics frontend + * Unavailable on Windows/ARM64 and Android +- `ENABLE_QT` (ON) Enable the Qt frontend (recommended) +- `ENABLE_QT_TRANSLATION` (OFF) Enable translations for the Qt frontend +- `ENABLE_QT_UPDATE_CHECKER` (OFF) Enable update checker for the Qt frontend +- `YUZU_USE_BUNDLED_QT` (ON for MSVC) Download bundled Qt binaries + * Note that using **system Qt** requires you to include the Qt CMake directory in `CMAKE_PREFIX_PATH`, e.g: + * `-DCMAKE_PREFIX_PATH=C:/Qt/6.9.0/msvc2022_64/lib/cmake/Qt6` +- `YUZU_QT_MIRROR` (string) What mirror to use for downloading the bundled Qt libraries +- `YUZU_USE_QT_MULTIMEDIA` (OFF) Use QtMultimedia for camera support +- `YUZU_USE_QT_WEB_ENGINE` (OFF) Use QtWebEngine for web applet implementation (requires the huge QtWebEngine dependency; not recommended) +- `USE_DISCORD_PRESENCE` (OFF) Enables Discord Rich Presence (Qt frontend only) +- `YUZU_ROOM` (ON) Enable dedicated room functionality +- `YUZU_ROOM_STANDALONE` (ON) Enable standalone room executable (eden-room) + * Requires `YUZU_ROOM` +- `YUZU_CMD` (ON) Compile the SDL2 frontend (eden-cli) - requires SDL2 +- `YUZU_CRASH_DUMPS` Compile crash dump (Minidump) support" + * Currently only available on Windows and Linux + +See `src/dynarmic/CMakeLists.txt` for additional options--usually, these don't need changed \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..686cfe8ea0 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +# Eden Build Documentation + +This contains documentation created by developers. This contains build instructions, guidelines, instructions/layouts for [cool stuff we made](CPM.md), and more. + +- **[General Build Instructions](Build.md)** +- **[Development Guidelines](Development.md)** +- **[Dependencies](Deps.md)** +- **[CPM - CMake Package Manager](CPMUtil.md)** +- **[Platform-Specific Caveats](Caveats.md)** +- **[User Handbook](User.md)** \ No newline at end of file diff --git a/docs/SIGNUP.md b/docs/SIGNUP.md new file mode 100644 index 0000000000..6995db6d9a --- /dev/null +++ b/docs/SIGNUP.md @@ -0,0 +1,57 @@ +# Signup + +To prevent spam and reduce bandwidth usage, registration is closed, and will likely remain this way. + +## Valid Reasons + +First of all, you MUST have a valid reason to sign up for our Git. Valid reasons include (but are not limited to): + +- I want to add feature XYZ... +- I want to improve the macOS version... +- I want to improve the Vulkan backend... +- I want to fix bug XYZ... +- I have experience in XYZ... +- I can provide insight on XYZ... + +## Invalid Reasons + +The following are not valid reasons to sign up: + +- I want to contribute to Eden. + * Be at least somewhat specific! +- I want to support Eden. + * If you wish to support us through development, be more specific; otherwise, to support us, check out our [donations page](https://eden-emu.dev/donations). +- I want to report issues. + * Most of our issue tracking is handled on [GitHub](https://github.com/eden-emulator/Issue-Reports) for the time being. This is subject to change. +- I want to play/use Eden. + * To download and use Eden, see our [Releases page](https://github.com/eden-emulator/Releases/releases)! +- I want to see the source code. + * To see Eden's source code, go [here](https://git.eden-emu.dev/eden-emu/eden). + +## Other Information + +Requests that appear suspicious, automated, OR blank will generally be automatically filtered. In cases of suspicion, or any of the invalid reasons listed above, you may receive an email back asking for clarification. + +You MUST use the following format: + +``` +Subject: [Eden Git] Registration Request +Username: +Email: +I wish to sign up because... +``` + +Email notifications are disabled for the time being, so you don't have to use a real email. If you wish to remain anonymous, either send a separate email asking for access to a shared anonymous account, *or* create a fake username and email. + +## Instructions + +If you have read everything above and affirm that you will not abuse your access, click the summary below to get the email to send your request to. + +
+I affirm that I have read ALL of the information above, and will not abuse my access to Eden, nor will I send unnecessary spam requests or the following email. + +Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the format above. + +Once your request is processed, you should receive a confirmation email from crueter with your password alongside a link to a repository containing instructions on SSH, etc. Note that you are required to change your password. If your request is rejected, you will receive a notice as such, asking for clarification if needed. If you do not receive a response in 48 hours, you may send another email. + +
\ No newline at end of file diff --git a/docs/User.md b/docs/User.md new file mode 100644 index 0000000000..67f81eadb6 --- /dev/null +++ b/docs/User.md @@ -0,0 +1,10 @@ +# User Handbook + +The "FAQ". + +This handbook is primarily aimed at the end-user - baking useful knowledge for enhancing their emulation experience. + +- **[The Basics](user/Basics.md)** +- **[Audio](user/Audio.md)** +- **[Graphics](user/Graphics.md)** +- **[Platforms and Architectures](user/Architectures.md)** diff --git a/docs/build/Android.md b/docs/build/Android.md index 4bb1c868b6..f511f71370 100644 --- a/docs/build/Android.md +++ b/docs/build/Android.md @@ -1,42 +1,42 @@ -# Note: These build instructions are a work-in-progress. - -## Dependencies -* [Android Studio](https://developer.android.com/studio) -* [NDK 25.2.9519653 and CMake 3.22.1](https://developer.android.com/studio/projects/install-ndk#default-version) -* [Git](https://git-scm.com/download) - -### WINDOWS ONLY - Additional Dependencies - * **[Visual Studio 2022 Community](https://visualstudio.microsoft.com/downloads/)** - **Make sure to select "Desktop development with C++" support in the installer. Make sure to update to the latest version if already installed.** - * **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** - **Make sure to select Latest SDK.** - - A convenience script to install the latest SDK is provided in `.ci\windows\install-vulkan-sdk.ps1`. - -## Cloning Eden with Git -``` -git clone --recursive https://git.eden-emu.dev/eden-emu/eden.git -``` -Eden by default will be cloned into - -* `C:\Users\\eden` on Windows -* `~/eden` on Linux -* And wherever on macOS - -## Building -1. Start Android Studio, on the startup dialog select `Open`. -2. Navigate to the `eden/src/android` directory and click on `OK`. -3. In `Build > Select Build Variant`, select `release` or `relWithDebInfo` as the "Active build variant". -4. Build the project with `Build > Make Project` or run it on an Android device with `Run > Run 'app'`. - -## Building with Terminal -1. Download the SDK and NDK from Android Studio. -2. Navigate to SDK and NDK paths. -3. Then set ANDROID_SDK_ROOT and ANDROID_NDK_ROOT in terminal via -`export ANDROID_SDK_ROOT=path/to/sdk` -`export ANDROID_NDK_ROOT=path/to/ndk`. -4. Navigate to `eden/src/android`. -5. Then Build with `./gradlew assemblerelWithDebInfo`. -6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`. - -### Script -A convenience script for building is provided in `.ci/android/build.sh`. The built APK can be put into an `artifacts` directory via `.ci/android/package.sh`. On Windows, these must be done in the Git Bash or MinGW terminal. - -### Additional Resources -https://developer.android.com/studio/intro +# Note: These build instructions are a work-in-progress. + +## Dependencies +* [Android Studio](https://developer.android.com/studio) +* [NDK 27+ and CMake 3.22.1](https://developer.android.com/studio/projects/install-ndk#default-version) +* [Git](https://git-scm.com/download) + +### WINDOWS ONLY - Additional Dependencies + * **[Visual Studio 2022 Community](https://visualstudio.microsoft.com/downloads/)** - **Make sure to select "Desktop development with C++" support in the installer. Make sure to update to the latest version if already installed.** + * **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** - **Make sure to select Latest SDK.** + - A convenience script to install the latest SDK is provided in `.ci\windows\install-vulkan-sdk.ps1`. + +## Cloning Eden with Git +``` +git clone --recursive https://git.eden-emu.dev/eden-emu/eden.git +``` +Eden by default will be cloned into - +* `C:\Users\\eden` on Windows +* `~/eden` on Linux and macOS + +## Building +1. Start Android Studio, on the startup dialog select `Open`. +2. Navigate to the `eden/src/android` directory and click on `OK`. +3. In `Build > Select Build Variant`, select `release` or `relWithDebInfo` as the "Active build variant". +4. Build the project with `Build > Make Project` or run it on an Android device with `Run > Run 'app'`. + +## Building with Terminal +1. Download the SDK and NDK from Android Studio. +2. Navigate to SDK and NDK paths. +3. Then set ANDROID_SDK_ROOT and ANDROID_NDK_ROOT in terminal via +`export ANDROID_SDK_ROOT=path/to/sdk` +`export ANDROID_NDK_ROOT=path/to/ndk`. +4. Navigate to `eden/src/android`. +5. Then Build with `./gradlew assembleRelWithDebInfo`. +6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`. +7. You can pass extra variables to cmake via `-PYUZU_ANDROID_ARGS="-D..."` + +### Script +A convenience script for building is provided in `.ci/android/build.sh`. The built APK can be put into an `artifacts` directory via `.ci/android/package.sh`. On Windows, these must be done in the Git Bash or MinGW terminal. + +### Additional Resources +https://developer.android.com/studio/intro diff --git a/docs/build/FreeBSD.md b/docs/build/FreeBSD.md deleted file mode 100644 index 475378125c..0000000000 --- a/docs/build/FreeBSD.md +++ /dev/null @@ -1,85 +0,0 @@ -## One word of caution before proceeding. - -This is not the usual or preferred way to build programs on FreeBSD. -As of writing there is no official fresh port available for Eden, but it is in the works. -After it is available you can find a link to the eden-emu fresh port here and on Escary's github repo. -See this build as an AppImage alternative for FreeBSD. - -## Dependencies. -Before we start we need some dependencies. -These dependencies are generally needed to build Eden on FreeBSD. - -``` -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 - -multimedia/ffnvcodec-headers -multimedia/ffmpeg - -audio/opus - -archivers/liblz4 - -lang/gcc12 - -graphics/glslang -graphics/vulkan-utility-libraries -``` - -If using FreeBSD 12 or prior, use `devel/pkg-config` instead. - ---- - -### Build preparations: -Run the following command to clone eden with git: -```sh -git clone --recursive https://git.eden-emu.dev/eden-emu/eden -``` -You usually want to add the `--recursive` parameter as it also takes care of the external dependencies for you. - -Now change into the eden directory and create a build directory there: -```sh -cd eden -mkdir build -``` - -Change into that build directory: -```sh -cd build -``` - -#### 1. Building in Release Mode (usually preferred and the most performant choice): -```sh -cmake .. -GNinja -DYUZU_TESTS=OFF -``` - -#### 2. Building in Release Mode with debugging symbols (useful if you want to debug errors for a eventual fix): -```sh -cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=ON -``` - -Build the emulator locally: -```sh -ninja -``` - -Optional: If you wish to install eden globally onto your system issue the following command: -```sh -sudo ninja install -``` -OR -```sh -doas -- ninja install -``` - -## OpenSSL -The available OpenSSL port (3.0.17) is out-of-date, and using a bundled static library instead is recommended; to do so, add `-DYUZU_USE_CPM=ON` to your CMake configure command. \ No newline at end of file diff --git a/docs/build/Linux.md b/docs/build/Linux.md deleted file mode 100644 index ab653dad00..0000000000 --- a/docs/build/Linux.md +++ /dev/null @@ -1,138 +0,0 @@ -### Dependencies - -You'll need to download and install the following to build Eden: - - * [GCC](https://gcc.gnu.org/) v11+ (for C++20 support) & misc - * If GCC 12 is installed, [Clang](https://clang.llvm.org/) v14+ is required for compiling - * [CMake](https://www.cmake.org/) 3.22+ - -The following are handled by Eden's externals: - - * [FFmpeg](https://ffmpeg.org/) - * [SDL2](https://www.libsdl.org/download-2.0.php) 2.0.18+ - * [opus](https://opus-codec.org/downloads/) 1.3+ - -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: - - * [Boost](https://www.boost.org/users/download/) 1.79.0+ - * [Catch2](https://github.com/catchorg/Catch2) 2.13.7 - 2.13.9 - * [fmt](https://fmt.dev/) 8.0.1+ - * [lz4](http://www.lz4.org) 1.8+ - * [nlohmann_json](https://github.com/nlohmann/json) 3.8+ - * [OpenSSL](https://www.openssl.org/source/) 1.1.1+ - * [ZLIB](https://www.zlib.net/) 1.2+ - * [zstd](https://facebook.github.io/zstd/) 1.5+ - * [enet](http://enet.bespin.org/) 1.3+ - * [cubeb](https://github.com/mozilla/cubeb) - * [SimpleIni](https://github.com/brofield/simpleini) - -Certain other dependencies (httplib, jwt, sirit, etc.) will be fetched by CPM regardless. System packages *can* be used for these libraries but this is generally not recommended. - -Dependencies are listed here as commands that can be copied/pasted. Of course, they should be inspected before being run. - -- Arch / Manjaro: - - `sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip` - - Building with QT Web Engine requires `qt6-webengine` as well. - - Proper wayland support requires `qt6-wayland` - - GCC 11 or later is required. - -- Ubuntu / Linux Mint / Debian: - - `sudo apt-get install autoconf cmake g++ gcc git glslang-tools libasound2 libboost-context-dev libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev` - - Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required. - - Users need to manually specify building with QT Web Engine enabled. This is done using the parameter `-DYUZU_USE_QT_WEB_ENGINE=ON` when running CMake. - - Users need to manually disable building SDL2 from externals if they intend to use the version provided by their system by adding the parameters `-DYUZU_USE_EXTERNAL_SDL2=OFF` - -```sh -git submodule update --init --recursive -cmake .. -GNinja -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -``` - -- Fedora: - - `sudo dnf install autoconf ccache cmake fmt-devel gcc{,-c++} glslang hidapi-devel json-devel libtool libusb1-devel libzstd-devel lz4-devel nasm ninja-build openssl-devel pulseaudio-libs-devel qt6-linguist qt6-qtbase{-private,}-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel` - - Fedora 32 or later is required. - - Due to GCC 12, Fedora 36 or later users need to install `clang`, and configure CMake to use it via `-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang` - - CMake arguments to force system libraries: - - SDL2: `-DYUZU_USE_BUNDLED_SDL2=OFF -DYUZU_USE_EXTERNAL_SDL2=OFF` - - FFmpeg: `-DYUZU_USE_EXTERNAL_FFMPEG=OFF` - - [RPM Fusion](https://rpmfusion.org/) (free) is required to install `ffmpeg-devel` - -### Cloning Eden with Git - -**Master:** - -```bash -git clone --recursive https://git.eden-emu.dev/eden-emu/eden -cd eden -``` - -The `--recursive` option automatically clones the required Git submodules. - -### Building Eden in Release Mode (Optimised) - -If you need to run ctests, you can disable `-DYUZU_TESTS=OFF` and install Catch2. - -```bash -mkdir build && cd build -cmake .. -GNinja -DYUZU_TESTS=OFF -ninja -sudo ninja install -``` -You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..` - -`-DYUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS=OFF` might be needed if ninja command failed with `undefined reference to symbol 'spvOptimizerOptionsCreate`, reason currently unknown - -Optionally, you can use `cmake-gui ..` to adjust various options (e.g. disable the Qt GUI). - -### Building Eden in Debug Mode (Slow) - -```bash -mkdir build && cd build -cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug -DYUZU_TESTS=OFF -ninja -``` - -### Building with debug symbols - -```bash -mkdir build && cd build -cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU -DYUZU_TESTS=OFF -ninja -``` - -### Building with Scripts -A convenience script for building is provided in `.ci/linux/build.sh`. You must provide an arch target for optimization, e.g. `.ci/linux/build.sh amd64`. Valid targets: -- `legacy`: x86_64 generic, only needed for CPUs older than 2013 or so -- `amd64`: x86_64-v3, for CPUs newer than 2013 or so -- `steamdeck` / `zen2`: For Steam Deck or Zen >= 2 AMD CPUs (untested on Intel) -- `rog-ally` / `allyx` / `zen4`: For ROG Ally X or Zen >= 4 AMD CPUs (untested on Intel) -- `aarch64`: For armv8-a CPUs, older than mid-2021 or so -- `armv9`: For armv9-a CPUs, newer than mid-2021 or so -- `native`: Optimize to your native host architecture - -Extra flags to pass to CMake should be passed after the arch target. - -Additional environment variables can be used to control building: -- `NPROC`: Number of threads to use for compilation (defaults to all) -- `TARGET`: Set to `appimage` to disable standalone `eden-cli` and `eden-room` executables -- `BUILD_TYPE`: Sets the build type to use. Defaults to `Release` - -The following environment variables are boolean flags. Set to `true` to enable or `false` to disable: -- `DEVEL` (default FALSE): Disable Qt update checker -- `USE_WEBENGINE` (default FALSE): Enable Qt WebEngine -- `USE_MULTIMEDIA` (default TRUE): Enable Qt Multimedia - -After building, an AppImage can be packaged via `.ci/linux/package.sh`. This script takes the same arch targets as the build script. If the build was created in a different directory, you can specify its path relative to the source directory, e.g. `.ci/linux/package.sh amd64 build-appimage`. Additionally, set the `DEVEL` environment variable to `true` to change the app name to `Eden Nightly`. - -### Running without installing - -After building, the binaries `eden` and `eden-cmd` (depending on your build options) will end up in `build/bin/`. - -```bash -# SDL -cd build/bin/ -./eden-cmd - -# Qt -cd build/bin/ -./eden -``` diff --git a/docs/build/Solaris.md b/docs/build/Solaris.md deleted file mode 100644 index d4cfdbb6a9..0000000000 --- a/docs/build/Solaris.md +++ /dev/null @@ -1,51 +0,0 @@ -# Building for Solaris - -## Dependencies. -Always consult [the OpenIndiana package list](https://pkg.openindiana.org/hipster/en/index.shtml) to cross-verify availability. - -Run the usual update + install of essential toolings: `sudo pkg update && sudo pkg install git cmake`. - -- **gcc**: `sudo pkg install developer/gcc-14`. -- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`. - -Then install the libraies: `sudo pkg install qt6 boost glslang libzip library/lz4 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`. - -### Building - -Clone eden with git `git clone --recursive https://git.eden-emu.dev/eden-emu/eden` - -```sh -# Needed for some dependencies that call cc directly (tz) -echo '#!/bin/sh' >cc -echo 'gcc $@' >>cc -chmod +x cc -export PATH="$PATH:$PWD" -``` - -Patch for FFmpeg: -```sh -sed -i 's/ make / gmake /' externals/ffmpeg/CMakeFiles/ffmpeg-build.dir/build.make -``` - -- **Configure**: `cmake -B build -DYUZU_USE_CPM=ON -DCMAKE_CXX_FLAGS="-I/usr/include/SDL2" -DCMAKE_C_FLAGS="-I/usr/include/SDL2"`. -- **Build**: `cmake --build build`. -- **Installing**: `sudo cmake --install build`. - -### Running - -Default Mesa is a bit outdated, the following environment variables should be set for a smoother experience: -```sh -export MESA_GL_VERSION_OVERRIDE=4.6 -export MESA_GLSL_VERSION_OVERRIDE=460 -export MESA_EXTENSION_MAX_YEAR=2025 -export MESA_DEBUG=1 -export MESA_VK_VERSION_OVERRIDE=1.3 -# Only if nvidia/intel drm drivers cause crashes, will severely hinder performance -export LIBGL_ALWAYS_SOFTWARE=1 -``` - -### Notes - -- Modify the generated ffmpeg.make (in build dir) if using multiple threads (base system `make` doesn't use `-j4`, so change for `gmake`). -- If using OpenIndiana, due to a bug in SDL2 cmake configuration; Audio driver defaults to SunOS ``, which does not exist on OpenIndiana. -- System OpenSSL generally does not work. Instead, use `-DYUZU_USE_CPM=ON` to use a bundled static OpenSSL, or build a system dependency from source. \ No newline at end of file diff --git a/docs/build/Windows.md b/docs/build/Windows.md deleted file mode 100644 index 3b8c459073..0000000000 --- a/docs/build/Windows.md +++ /dev/null @@ -1,193 +0,0 @@ -# THIS GUIDE IS INTENDED FOR DEVELOPERS ONLY, SUPPORT WILL ONLY BE GIVEN IF YOU'RE A DEVELOPER. - -## Method I: MSVC Build for Windows - -### Minimal Dependencies - -On Windows, all library dependencies are automatically included within the `externals` folder, or can be downloaded on-demand. To build Eden, you need to install: - - * **[Visual Studio 2022 Community](https://visualstudio.microsoft.com/downloads/)** - **Make sure to select C++ support in the installer. Make sure to update to the latest version if already installed.** - * **[CMake](https://cmake.org/download/)** - Used to generate Visual Studio project files. Does not matter if either 32-bit or 64-bit version is installed. - * **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** - **Make sure to select Latest SDK.** - - A convenience script to install the latest SDK is provided in `.ci\windows\install-vulkan-sdk.ps1`. - - ![2](https://i.imgur.com/giDwuTm.png) - - * **Git** - We recommend [Git for Windows](https://gitforwindows.org). - - ![3](https://i.imgur.com/UeSzkBw.png) - - * While installing Git Bash, you should tell it to include Git in your system path. (Choose the "Git from the command line and also from 3rd-party software" option.) If you missed that, don't worry, you'll just have to manually tell CMake where your git.exe is, since it's used to include version info into the built executable. - - ![4](https://i.imgur.com/x0rRs1t.png) - -### Cloning Eden with Git - -**Master:** - ```cmd - git clone --recursive https://git.eden-emu.dev/eden-emu/eden - cd eden - ``` - - ![9](https://i.imgur.com/CcxIAht.png) - -* *(Note: eden by default downloads to `C:\Users\\eden` (Master) - -### Building - -* Open the CMake GUI application and point it to the `eden` (Master) - - ![10](https://i.imgur.com/qOslIWv.png) - -* For the build directory, use a `/build` subdirectory inside the source directory or some other directory of your choice. (Tell CMake to create it.) - -* Click the "Configure" button and choose `Visual Studio 17 2022`, with `x64` for the optional platform. - - ![12](https://i.imgur.com/DKiREaK.png) - - * *(Note: If you used GitHub's own app to clone, run `git submodule update --init --recursive` to get the remaining dependencies)* - - * *(You may also want to disable `YUZU_TESTS` in this case since Catch2 is not yet supported with this.)* - - ![13](https://user-images.githubusercontent.com/22451773/180585999-07316d6e-9751-4d11-b957-1cf57cd7cd58.png) - -* Click "Generate" to create the project files. - - ![15](https://i.imgur.com/5LKg92k.png) - -* Open the solution file `yuzu.sln` in Visual Studio 2022, which is located in the build folder. - - ![16](https://i.imgur.com/208yMml.png) - -* Depending if you want a graphical user interface or not (`eden` has the graphical user interface, while `eden-cmd` doesn't), select `eden` or `eden-cmd` in the Solution Explorer, right-click and `Set as StartUp Project`. - - ![17](https://i.imgur.com/nPMajnn.png) ![18](https://i.imgur.com/BDMLzRZ.png) - -* Select the appropriate build type, Debug for debug purposes or Release for performance (in case of doubt choose Release). - - ![19](https://i.imgur.com/qxg4roC.png) - -* Right-click the project you want to build and press Build in the submenu or press F5. - - ![20](https://i.imgur.com/CkQgOFW.png) - -## Method II: MinGW-w64 Build with MSYS2 - -### Prerequisites to install - -* [MSYS2](https://www.msys2.org) -* [Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows) - **Make sure to select Latest SDK.** -* Make sure to follow the instructions and update to the latest version by running `pacman -Syu` as many times as needed. - -### Install eden dependencies for MinGW-w64 - -* Open the `MSYS2 MinGW 64-bit` (mingw64.exe) shell -* Download and install all dependencies using: `pacman -Syu git make mingw-w64-x86_64-SDL2 mingw-w64-x86_64-cmake mingw-w64-x86_64-python-pip mingw-w64-x86_64-qt6 mingw-w64-x86_64-toolchain autoconf libtool automake-wrapper` -* Add MinGW binaries to the PATH: `echo 'PATH=/mingw64/bin:$PATH' >> ~/.bashrc` -* Add glslangValidator to the PATH: `echo 'PATH=$(readlink -e /c/VulkanSDK/*/Bin/):$PATH' >> ~/.bashrc` - -### Clone the eden repository with Git - - ```bash - git clone --recursive https://git.eden-emu.dev/eden-emu/eden - cd eden - ``` - -### Run the following commands to build eden (dynamically linked build) - -```bash -mkdir build && cd build -cmake -G "MSYS Makefiles" -DYUZU_TESTS=OFF .. -make -j$(nproc) -# test eden out with -./bin/eden.exe -``` - -* *(Note: This build is not a static build meaning that you need to include all of the DLLs with the .exe in order to use it!)* - -e.g. -```Bash -cp externals/ffmpeg-*/bin/*.dll bin/ -``` - -Bonus Note: Running programs from inside `MSYS2 MinGW x64` shell has a different %PATH% than directly from explorer. This different %PATH% has the locations of the other DLLs required. -![image](https://user-images.githubusercontent.com/190571/165000848-005e8428-8a82-41b1-bb4d-4ce7797cdac8.png) - - -### Building without Qt (Optional) - -Doesn't require the rather large Qt dependency, but you will lack a GUI frontend: - - * Pass the `-DENABLE_QT=no` flag to cmake - -## Method III: CLion Environment Setup - -### Minimal Dependencies - -To build eden, you need to install the following: - -* [CLion](https://www.jetbrains.com/clion/) - This IDE is not free; for a free alternative, check Method I -* [Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows) - Make sure to select the Latest SDK. - -### Cloning eden with CLion - -* Clone the Repository: - -![1](https://user-images.githubusercontent.com/42481638/216899046-0d41d7d6-8e4d-4ed2-9587-b57088af5214.png) -![2](https://user-images.githubusercontent.com/42481638/216899061-b2ea274a-e88c-40ae-bf0b-4450b46e9fea.png) -![3](https://user-images.githubusercontent.com/42481638/216899076-0e5988c4-d431-4284-a5ff-9ecff973db76.png) - - - -### Building & Setup - -* Once Cloned, You will be taken to a prompt like the image below: - -![4](https://user-images.githubusercontent.com/42481638/216899092-3fe4cec6-a540-44e3-9e1e-3de9c2fffc2f.png) - -* Set the settings to the image below: -* Change `Build type: Release` -* Change `Name: Release` -* Change `Toolchain Visual Studio` -* Change `Generator: Let CMake decide` -* Change `Build directory: build` - -![5](https://user-images.githubusercontent.com/42481638/216899164-6cee8482-3d59-428f-b1bc-e6dc793c9b20.png) - -* Click OK; now Clion will build a directory and index your code to allow for IntelliSense. Please be patient. -* Once this process has been completed (No loading bar bottom right), you can now build eden -* In the top right, click on the drop-down menu, select all configurations, then select eden - -![6](https://user-images.githubusercontent.com/42481638/216899226-975048e9-bc6d-4ec1-bc2d-bd8a1e15ed04.png) - -* Now run by clicking the play button or pressing Shift+F10, and eden will auto-launch once built. - -![7](https://user-images.githubusercontent.com/42481638/216899275-d514ec6a-e563-470e-81e2-3e04f0429b68.png) - -## Building from the command line with MSVC - -```cmd -git clone --recursive https://git.eden-emu.dev/eden-emu/eden -cd eden -mkdir build -cd build -cmake .. -G "Visual Studio 17 2022" -A x64 -cmake --build . --config Release -``` - -### Building with Scripts -A convenience script for building is provided in `.ci/windows/build.sh`. You must run this with Bash, e.g. Git Bash or MinGW TTY. To use this script, you must have windeployqt installed (usually bundled with Qt) and set the `WINDEPLOYQT` environment variable to its canonical Bash location, e.g. `WINDEPLOYQT="/c/Qt/6.9.1/msvc2022_64/bin/windeployqt6.exe" .ci/windows/build.sh`. - -Extra CMake flags should be placed in the arguments of the script. - -Additional environment variables can be used to control building: -- `BUILD_TYPE`: Sets the build type to use. Defaults to `Release` - -The following environment variables are boolean flags. Set to `true` to enable or `false` to disable: -- `DEVEL` (default FALSE): Disable Qt update checker -- `USE_WEBENGINE` (default FALSE): Enable Qt WebEngine -- `USE_MULTIMEDIA` (default TRUE): Enable Qt Multimedia -- `BUNDLE_QT` (default FALSE): Use bundled Qt - * Note that using system Qt requires you to include the Qt CMake directory in `CMAKE_PREFIX_PATH`, e.g. `.ci/windows/build.sh -DCMAKE_PREFIX_PATH=C:/Qt/6.9.0/msvc2022_64/lib/cmake/Qt6` - -After building, a zip can be packaged via `.ci/windows/package.sh`. Note that you must have 7-zip installed and in your PATH. The resulting zip will be placed into `artifacts` in the source directory. diff --git a/docs/build/macOS.md b/docs/build/macOS.md deleted file mode 100644 index 6cb62273cb..0000000000 --- a/docs/build/macOS.md +++ /dev/null @@ -1,105 +0,0 @@ -Please note this article is intended for development, and eden on macOS is not currently ready for regular use. - -This article was written for developers. eden support for macOS is not ready for casual use. - -## Method I: ninja ---- -If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`. - -Install dependencies from Homebrew: -```sh -brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader -``` - -Clone the repo -```sh -git clone --recursive https://git.eden-emu.dev/eden-emu/eden - -cd eden -``` - -Build for release -```sh -mkdir build && cd build - -export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" - -export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib - -cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON - -ninja -``` - -You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..` - -Build with debug symbols (vcpkg is not currently used due to broken boost-context library): -```sh -mkdir build && cd build -export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" -cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF -ninja -``` - -Run the output: -``` -bin/eden.app/Contents/MacOS/eden -``` - -## Method II: Xcode - ---- -If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`. - -Install dependencies from Homebrew: -```sh -brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader -``` - -Clone the repo -```sh -git clone --recursive https://git.eden-emu.dev/eden-emu/eden - -cd eden -``` - -Build for release -```sh -mkdir build && cd build - -export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" - -export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib - -cmake .. -GXcode -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON - -xcodebuild build -project eden.xcodeproj -scheme "eden" -configuration "RelWithDebInfo" -``` - -You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..` - -Build with debug symbols (vcpkg is not currently used due to broken boost-context library): -```sh -mkdir build && cd build -export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake" -cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF -ninja -``` - -Run the output: -``` -bin/eden.app/Contents/MacOS/eden -``` - ---- - -To run with MoltenVK, install additional dependencies: -```sh -brew install molten-vk vulkan-loader -``` - -Run with Vulkan loader path: -```sh -export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib -bin/eden.app/Contents/MacOS/eden -``` \ No newline at end of file diff --git a/docs/img/creator-1.png b/docs/img/creator-1.png new file mode 100644 index 0000000000..3e43ee7eca Binary files /dev/null and b/docs/img/creator-1.png differ diff --git a/docs/scripts/Linux.md b/docs/scripts/Linux.md new file mode 100644 index 0000000000..8b18e41ced --- /dev/null +++ b/docs/scripts/Linux.md @@ -0,0 +1,31 @@ +# Linux Build Scripts + +* Provided script: `.ci/linux/build.sh` +* Must specify arch target, e.g.: `.ci/linux/build.sh amd64` +* Valid targets: + * `native`: Optimize to your native host architecture + * `legacy`: x86\_64 generic, only needed for CPUs older than 2013 or so + * `amd64`: x86\_64-v3, for CPUs newer than 2013 or so + * `steamdeck` / `zen2`: For Steam Deck or Zen >= 2 AMD CPUs (untested on Intel) + * `rog-ally` / `allyx` / `zen4`: For ROG Ally X or Zen >= 4 AMD CPUs (untested on Intel) + * `aarch64`: For armv8-a CPUs, older than mid-2021 or so + * `armv9`: For armv9-a CPUs, newer than mid-2021 or so +* Extra CMake flags go after the arch target. + +### Environment Variables + +* `NPROC`: Number of compilation threads (default: all cores) +* `TARGET`: Set `appimage` to disable standalone `eden-cli` and `eden-room` +* `BUILD_TYPE`: Build type (default: `Release`) + +Boolean flags (set `true` to enable, `false` to disable): + +* `DEVEL` (default `FALSE`): Disable Qt update checker +* `USE_WEBENGINE` (default `FALSE`): Enable Qt WebEngine +* `USE_MULTIMEDIA` (default `FALSE`): Enable Qt Multimedia + +* AppImage packaging script: `.ci/linux/package.sh` + + * Accepts same arch targets as build script + * Use `DEVEL=true` to rename app to `Eden Nightly` + * This should generally not be used unless in a tailor-made packaging environment (e.g. Actions/CI) \ No newline at end of file diff --git a/docs/scripts/Windows.md b/docs/scripts/Windows.md new file mode 100644 index 0000000000..e60c2119a2 --- /dev/null +++ b/docs/scripts/Windows.md @@ -0,0 +1,29 @@ +# Windows Build Scripts + +* A convenience script for building is provided in `.ci/windows/build.sh`. +* You must run this with Bash, e.g. Git Bash or the MinGW TTY. +* To use this script, you must have `windeployqt` installed (usually bundled with Qt) and set the `WINDEPLOYQT` environment variable to its canonical Bash location: + * `WINDEPLOYQT="/c/Qt/6.9.1/msvc2022_64/bin/windeployqt6.exe" .ci/windows/build.sh`. +* You can use `aqtinstall`, more info on and + + +* Extra CMake flags should be placed in the arguments of the script. + +#### Additional environment variables can be used to control building: + +* `BUILD_TYPE` (default `Release`): Sets the build type to use. + +* The following environment variables are boolean flags. Set to `true` to enable or `false` to disable: + + * `DEVEL` (default FALSE): Disable Qt update checker + * `USE_WEBENGINE` (default FALSE): Enable Qt WebEngine + * `USE_MULTIMEDIA` (default FALSE): Enable Qt Multimedia + * `BUNDLE_QT` (default FALSE): Use bundled Qt + + * Note that using **system Qt** requires you to include the Qt CMake directory in `CMAKE_PREFIX_PATH` + * `.ci/windows/build.sh -DCMAKE_PREFIX_PATH=C:/Qt/6.9.0/msvc2022_64/lib/cmake/Qt6` + +* After building, a zip can be packaged via `.ci/windows/package.sh`. You must have 7-zip installed and in your PATH. + * The resulting zip will be placed into `artifacts` in the source directory. + + diff --git a/docs/user/Architectures.md b/docs/user/Architectures.md new file mode 100644 index 0000000000..240feb666d --- /dev/null +++ b/docs/user/Architectures.md @@ -0,0 +1,132 @@ +# User Handbook - Architectures and Platforms + +Notes and caveats for different architectures and platforms. + +# Architectures + +Eden is primarily designed to run on amd64 (x86_64--Intel/AMD 64-bit) and aarch64 (arm64--ARM 64-bit) CPUs. Each architecture tends to have their own quirks and fun stuff; this page serves as a reference for these quirks. + +## amd64 + +AMD64, aka x86_64, is the most tested and supported architecture for desktop targets. Android is entirely unsupported. + +### Caveats + +AMD64 systems are almost always limited by the CPU. For example, a Zen 5/RX 6600 system will often hit max CPU usage before the GPU ever reaches 70% usage, with minimal exceptions (that tend to pop up only at >200fps). JIT is slow! + +Computers on Linux will almost always run Eden strictly better than an equivalent machine on Windows. This is largely due to the way the Linux kernel handles memory management (and the lack of Microsoft spyware). + +Intel Macs are believed to be supported, but no CI is provided for them. Performance will likely be awful on all but the highest-end iMacs and Pro-level Macs, and the MoltenVK requirement generally means Vulkan compatibility will suffer. + +## aarch64 + +ARM64, aka aarch64, is the only supported architecture for Android, with limited experimental support available on Linux, Windows, and macOS. + +### Caveats + +NCE (Native Code Execution) is currently only available on Android and (experimentally) Linux. Support for macOS is in the works, but Windows is extremely unlikely to ever happen (if you want it--submit patches!). Generally, if NCE is available, you should pretty much always use it due to the massive performance hit JIT has. + +When NCE is enabled, do note that the GPU will almost always be the limiting factor. This is especially the case for Android, as well as desktops that lack dedicated GPUs; Adreno, Mali, PowerVR, etc. GPUs are generally significantly weaker relative to their respective CPUs. + +Windows/arm64 is *very* experimental and is unlikely to work at all. Support and testing is in the works. + +## riscv64 + +RISC-V, aka riscv64, is sparsely tested, but preliminary tests from developers have reported at least partial support on Milk-V's Fedora/riscv64 Linux distribution. Performance, Vulkan support, compatibility, and build system caveats are largely unknown for the time being. + +### Caveats + +Windows/riscv64 doesn't exist, and may never (until corporate greed no longer consumes Microsoft). + +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. + +## Other + +Other architectures, such as SPARC, MIPS, PowerPC, Loong, and all 32-bit architectures are completely unsupported, as there is no JIT backend or emitter thereof. If you want support for it--submit patches! + +IA-64 (Itanium) support is completely unknown. Existing amd64 packages will not run on IA-64 (assuming you can even find a supported Windows/Linux distribution) + +# Platforms + +The vast majority of Eden's testing is done on Windows, Linux, and Android. However, first-class support is also provided for: + +- FreeBSD +- OpenBSD +- OpenIndiana (Solaris) +- macOS + +## Linux + +While all modern Linux distributions are supported (Fedora >40, Ubuntu >24.04, Debian >12, Arch, Gentoo, etc.), the vast majority of testing and development for Linux is on Arch and Gentoo. Most major build system changes are tested on Gentoo first and foremost, so if builds fail on any modern distribution no matter what you do, it's likely a bug and should be reported. + +Intel and Nvidia GPU support is limited. AMD (RADV) drivers receive first-class testing and are known to provide the most stable Eden experience possible. + +Wayland is not recommended. Testing has shown significantly worse performance on most Wayland compositors compared to X11, alongside mysterious bugs and compatibility errors. For now, set `QT_QPA_PLATFORM=xcb` when running Eden, or pass `-platform xcb` to the launch arguments. + +## Windows + +Windows 10 and 11 are supported. Support for Windows 8.x is unknown, and Windows 7 support is unlikely to ever be added. + +In order to run Eden, you will probably need to install the [Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170). + +Neither AMD nor Nvidia drivers work nearly as well as Linux's RADV drivers. Compatibility is still largely the same, but performance and some hard-to-run games may suffer compared to Linux. + +## Android + +A cooler is always recommended. Phone SoCs tend to get very hot, especially those manufactured with the Samsung process or those lacking in power. + +Adreno 6xx and 7xx GPUs with Turnip drivers will always have the best compatibility. "Stock" (system) drivers will have better performance on Adreno, but compatibility will suffer. Better support for stock drivers (including Adreno 8xx) is in the works. + +Android 16 is always recommended, as it brought major improvements to Vulkan requirements and compatibility, *plus* significant performance gains. Some users reported an over 50% performance gain on some Pixel phones after updating. + +Mali, PowerVR, Xclipse, and other GPU vendors generally lack in performance and compatibility. Notably: +- No PowerVR GPUs *except* the DXT-48-1536 are known to work with Eden at all. +- No Xclipse GPUs *except* the very latest (e.g. Xclipse 950) are known to work with Eden at all. +- Mali has especially bad performance, though the Mali-G715 (Tensor G4) and Immortalis-G925 are known to generally run surprisingly well, especially on Android 16. +- The status of all other GPU vendors is unknown. As long as they support Vulkan, they theoretically can run Eden. +- Note that these GPUs generally don't play well with driver injection. If you choose to inject custom drivers via a rooted system (Panfrost, RADV, etc), you may see good results. + +Qualcomm Snapdragon SoCs are generally the most well supported. +- Google Tensor chips have pretty terrible performance, but even the G1 has been proven to be able to run some games well on the Pixel 6 Pro. + * The Tensor G4 is the best-supported at the time. How the G5 currently fares is unknown, but on paper, it should do about as well as a Snapdragon 8 Gen 2 with stock drivers. +- Samsung Exynos chips made before 2022 are not supported. +- MediaTek Dimensity chips are extremely weak and most before mid-2023 don't work at all. + * This means that most budget phones won't work, as they tend to use old MediaTek SoCs. + * Generally, if your phone doesn't cost *at least* as much as a Switch itself, it will not *emulate* the Switch very well. +- Snapdragon 865 and other old-ish SoCs may benefit from the Legacy build. These will reduce performance but *should* drastically improve compatibility. +- If you're not sure how powerful your SoC is, check [NanoReview](https://nanoreview.net/en/soc-compare) - e.g. [Tensor G5](https://archive.is/ylC4Z). + * A good base to compare to is the Snapdragon 865--e.g. [Tensor vs SD865](https://archive.is/M1P58) + * Some benchmarks may be misleading due to thermal throttling OR RAM requirements. + - For example, a Pixel 6a (Tensor G1) performs about 1/3 as well as an 865 due to its lack of RAM and poor thermals. + * Remember--always use a cooler if you can, and you MUST have *at least* 8GB of RAM! +- If you're not sure what SoC you have, check [GSMArena](https://www.gsmarena.com) - e.g. [Pixel 9 Pro](https://archive.ph/91VhA) + +Custom ROMs are recommended, *as long as* you know what you're doing. +- For most devices, [LineageOS](https://lineageos.org/) is preferred. +- [CalyxOS](https://calyxos.org/) is available as well. +- For Google Pixel devices ONLY... and [soon another OEM](https://archive.ph/cPpMd)... [GrapheneOS](https://grapheneos.org/) is highly recommended. + * As of October 5, 2025, the Pixel 10 line is unsupported, however, [it will be](https://archive.is/viAUl) in the very near future! + * Keep checking the [FAQ page](https://grapheneos.org/faq#supported-devices) for news. +- Custom ROMs will likely be exclusively recommended in the future due to Google's upcoming [draconian](https://archive.is/hGIjZ), [anti-privacy, anti-user](https://archive.is/mc1CJ) verification requirements. + +Eden is currently unavailable on F-Droid or the Play Store. Check back occasionally. + +## macOS + +macOS is relatively stable, with only the occasional crash and bug. Compatibility may suffer due to the MoltenVK layer, however. + +Do note that building the GUI version with Qt versions higher than 6.7.3 will cause mysterious bugs, Vulkan errors, and crashes, alongside the cool feature of freezing the entire system UI randomly; we recommend you build with 6.7.3 (via aqtinstall) or earlier as the CI does. + +## *BSD, Solaris + +BSD and Solaris distributions tend to lag behind Linux in terms of Vulkan and other library compatibility. For example, OpenIndiana (Solaris) does not properly package Qt, meaning the recommended method of usage is to use `eden-cli` only for now. Solaris also generally works better with OpenGL. + +AMD GPU support on these platforms is limited or nonexistent. + +## VMs + +Eden "can" run in a VM, but only with the software renderer, *unless* you create a hardware-accelerated KVM with GPU passthrough. If you *really* want to do this and don't have a spare GPU lying around, RX 570 and 580 GPUs are extremely cheap on the black market and are powerful enough to run most commercial games at 60fps. + +Some users and developers have had success using a pure OpenGL-accelerated KVM on Linux with a Windows VM, but this is ridiculously tedious to set up. You're probably better off dual-booting. \ No newline at end of file diff --git a/docs/user/Audio.md b/docs/user/Audio.md new file mode 100644 index 0000000000..38a4ead433 --- /dev/null +++ b/docs/user/Audio.md @@ -0,0 +1,3 @@ +# User Handbook - Audio + +`PULSE_SERVER=none` forces cubeb to use ALSA. diff --git a/docs/user/Basics.md b/docs/user/Basics.md new file mode 100644 index 0000000000..5751c6a6a3 --- /dev/null +++ b/docs/user/Basics.md @@ -0,0 +1,57 @@ +# User Handbook - The Basics + +## Introduction + +Eden is a very complicated piece of software, and as such there are many knobs and toggles that can be configured. Most of these are invisible to normal users, however power users may be able to leverage them to their advantage. + +This handbook primarily describes such knobs and toggles. Normal configuration options are described within the emulator itself and will not be covered in detail. + +## Requirements + +The emulator is very demanding on hardware, and as such requires a decent mid-range computer/cellphone. + +See [the requirements page](https://archive.is/sv83h) for recommended and minimum specs. + +The CPU must support FMA for an optimal gameplay experience. The GPU needs to support OpenGL 4.6 ([compatibility list](https://opengl.gpuinfo.org/)), or Vulkan 1.1 ([compatibility list](https://vulkan.gpuinfo.org/)). + +If your GPU doesn't support or is just behind by a minor version, see Mesa environment variables below (*nix only). + +## User configuration + +### Configuration directories + +Eden will store configuration files in the following directories: + +- **Windows**: `%AppData%\Roaming`. +- **Android**: Data is stored internally. +- **Linux, macOS, FreeBSD, Solaris, OpenBSD**: `$XDG_DATA_HOME`, `$XDG_CACHE_HOME`, `$XDG_CONFIG_HOME`. + +If a `user` directory is present in the current working directory, that will override all global configuration directories and the emulator will use that instead. + +### Environment variables + +Throughout the handbook, environment variables are mentioned. These are often either global (system wide) or local (set in a script, bound only to the current session). It's heavily recommended to use them in a local context only, as this allows you to rollback changes easily (if for example, there are regressions setting them). + +The recommended way is to create a `.bat` file alongside the emulator `.exe`; contents of which could resemble something like: + +```bat +set "__GL_THREADED_OPTIMIZATIONS=1" +set "SOME_OTHER_VAR=1" +eden.exe +``` + +Android doesn't have a convenient way to set environment variables. + +For other platforms, the recommended method is using a shell script: + +```sh +export __GL_THREADED_OPTIMIZATIONS=1 +export SOME_OTHER_VAR=1 +./eden +``` + +Then just running `chmod +x script.sh && source script.sh`. + +## Compatibility list + +Eden doesn't mantain a compatibility list. However, [EmuReady](https://www.emuready.com/) has a more fine-grained compatibility information for multiple emulators/forks as well. diff --git a/docs/user/Graphics.md b/docs/user/Graphics.md new file mode 100644 index 0000000000..1b4c0dc4c3 --- /dev/null +++ b/docs/user/Graphics.md @@ -0,0 +1,62 @@ +# User Handbook - Graphics + +## Visual Enhancements + +### Anti-aliasing + +Enhancements aimed at removing jagged lines/sharp edges and/or masking artifacts. + +- **No AA**: Default, provides no anti-aliasing. +- **FXAA**: Fast Anti-Aliasing, an implementation as described on [this blog post](https://web.archive.org/web/20110831051323/http://timothylottes.blogspot.com/2011/03/nvidia-fxaa.html). Generally fast but with some innocuos artifacts. +- **SMAA**: Subpixel Morphological Anti-Aliasing, an implementation as described on [this article](https://web.archive.org/web/20250000000000*/https://www.iryoku.com/smaa/). + +### Filters + +Various graphical filters exist - each of them aimed at a specific target/image quality preset. + +- **Nearest**: Provides no filtering - useful for debugging. + - **Pros**: Fast, works in any hardware. + - **Cons**: Less image quality. +- **Bilinear**: Provides the hardware default filtering of the Tegra X1. + - **Pros**: Fast with acceptable image quality. +- **Bicubic**: Provides a bicubic interpolation using a Catmull-Rom (or hardware-accelerated) implementation. + - **Pros**: Better image quality with more rounded edges. +- **Zero-Tangent, B-Spline, Mitchell**: Provides bicubic interpolation using the respective matrix weights. They're normally not hardware accelerated unless the device supports the `VK_QCOM_filter_cubic_weights` extension. The matrix weights are those matching [the specification itself](https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkSamplerCubicWeightsCreateInfoQCOM). + - **Pros/Cons**: Each of them is a variation of the Bicubic interpolation model with different weights, they offer different methods to fix some artifacts present in Catmull-Rom. +- **Spline-1**: Bicubic interpolation (similar to Mitchell) but with a faster texel fetch method. Generally less blurry than bicubic. + - **Pros**: Faster than bicubic even without hardware accelerated bicubic. +- **Gaussian**: Whole-area blur, an applied gaussian blur is done to the entire frame. + - **Pros**: Less edge artifacts. + - **Cons**: Slow and sometimes blurry. +- **Lanczos**: An implementation using `a = 3` (49 texel fetches). Provides sharper edges but blurrier artifacts. + - **Pros**: Less edge artifacts and less blurry than gaussian. + - **Cons**: Slow. +- **ScaleForce**: Experimental texture upscale method, see [ScaleFish](https://github.com/BreadFish64/ScaleFish). + - **Pros**: Relatively fast. +- **FSR**: Uses AMD FidelityFX Super Resolution to enhance image quality. + - **Pros**: Great for upscaling, and offers sharper visual quality. + - **Cons**: Somewhat slow, and may be offputtingly sharp. +- **Area**: Area interpolation (high kernel count). + - **Pros**: Best for downscaling (internal resolution > display resolution). + - **Cons**: Costly and slow. +- **MMPX**: Nearest-neighbour filter aimed at providing higher pixel-art quality. + - **Pros**: Offers decent pixel-art upscaling. + - **Cons**: Only works for pixel-art. + +### External + +While stock shaders offer a basic subset of options for most users, programs such as [ReShade](https://github.com/crosire/reshade) offer a more flexible experience. In addition to that users can also seek out modifications (mods) for enhancing visual experience (60 FPS mods, HDR, etc). + +## Driver specifics + +### Mesa environment variable hacks + +The software requires a certain version of Vulkan and a certain version of OpenGL to work - otherwise it will refuse to load, this can be easily bypassed by setting an environment variable: `MESA_GL_VERSION_OVERRIDE=4.6 MESA_GLSL_VERSION_OVERRIDE=460` (OpenGL) and `MESA_VK_VERSION_OVERRIDE=1.3` (Vulkan), for more information see [Environment variables for Mesa](https://web.archive.org/web/20250000000000*/https://docs.mesa3d.org/envvars.html). + +### NVIDIA OpenGL environment variables + +Unstable multithreaded optimisations are offered by the stock proprietary NVIDIA driver on X11 platforms. Setting `__GL_THREADED_OPTIMIZATIONS` to `1` would enable such optimisations. This mainly benefits the OpenGL backend. For more information see [Environment Variables for X11 NVIDIA](https://web.archive.org/web/20250115162518/https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/openglenvvariables.html). + +### swrast/LLVMpipe crashes under high load + +The OpenGL backend would invoke behaviour that would result in swarst/LLVMpipe writing an invalid SSA IR (on old versions of Mesa), and then proceeding to crash. The solution is using a script found in [tools/llvmpipe-run.sh](../../tools/llvmpipe-run.sh). diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 07e9ae7a8f..2da461fd5c 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -7,7 +7,6 @@ # TODO(crueter): A lot of this should be moved to the root. # otherwise we have to do weird shenanigans with library linking and stuff -# cpm include(CPMUtil) # Explicitly declare this option here to propagate to the oaknut CPM call @@ -26,39 +25,159 @@ set(BUILD_SHARED_LIBS OFF) # Skip install rules for all externals set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) -if (FORCE_DOWNLOAD_WIN_BUNDLES) - download_win_archives() -endif() - # Xbyak (also used by Dynarmic, so needs to be added first) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) - if (PLATFORM_SUN) - # Fix regset.h collisions - set(XBYAK_HASH 51f507b0b3) - set(XBYAK_SHA512SUM 4a29a3c2f97f7d5adf667a21a008be03c951fb6696b0d7ba27e7e4afa037bc76eb5e059bb84860e01baf741d4d3ac851b840cd54c99d038812fbe0f1fa6d38a4) + if (PLATFORM_SUN OR PLATFORM_OPENBSD) + AddJsonPackage(xbyak_sun) else() - set(XBYAK_HASH 4e44f4614d) - set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70) + AddJsonPackage(xbyak) endif() - - AddPackage( - NAME xbyak - REPO "Lizzie841/xbyak" - SHA ${XBYAK_HASH} - HASH ${XBYAK_SHA512SUM} - BUNDLED_PACKAGE ON - ) endif() # Oaknut (also used by Dynarmic, so needs to be added first) if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) - AddPackage( - NAME oaknut - VERSION 2.0.1 - REPO "merryhime/oaknut" - SHA 94c726ce03 - HASH d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac - ) + AddJsonPackage(oaknut) +endif() + +# enet +AddJsonPackage(enet) + +if (enet_ADDED) + target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include) +endif() + +if (NOT TARGET enet::enet) + add_library(enet::enet ALIAS enet) +endif() + +# mbedtls +AddJsonPackage(mbedtls) + +# VulkanUtilityHeaders - pulls in headers and utility libs +AddJsonPackage(vulkan-utility-headers) + +# small hack +if (NOT VulkanUtilityLibraries_ADDED) + find_package(VulkanHeaders 1.3.274 REQUIRED) +endif() + +# DiscordRPC +if (USE_DISCORD_PRESENCE) + if (ARCHITECTURE_arm64) + add_compile_definitions(RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN) + endif() + + AddJsonPackage(discord-rpc) + + if (DiscordRPC_ADDED) + target_include_directories(discord-rpc INTERFACE ${DiscordRPC_SOURCE_DIR}/include) + add_library(DiscordRPC::discord-rpc ALIAS discord-rpc) + endif() +endif() + +# SimpleIni +AddJsonPackage(simpleini) + +# Most linux distros don't package cubeb, so enable regardless of cpm settings +if(ENABLE_CUBEB) + AddJsonPackage(cubeb) + + if (cubeb_ADDED) + if (NOT MSVC) + if (TARGET speex) + target_compile_options(speex PRIVATE -Wno-sign-compare) + endif() + + set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "") + target_compile_options(cubeb INTERFACE + -Wno-implicit-const-int-float-conversion + -Wno-shadow + -Wno-missing-declarations + -Wno-return-type + -Wno-uninitialized + ) + else() + target_compile_options(cubeb PRIVATE + /wd4456 + /wd4458 + ) + endif() + endif() + + if (NOT TARGET cubeb::cubeb) + add_library(cubeb::cubeb ALIAS cubeb) + endif() +endif() + +# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package +if (ENABLE_SDL2) + if (YUZU_USE_EXTERNAL_SDL2) + message(STATUS "Using SDL2 from externals.") + if (NOT WIN32) + # 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) + # Yuzu-cmd also needs: Video (depends on Loadso/Dlopen) + # CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809) + set(SDL_UNUSED_SUBSYSTEMS + File Filesystem + Locale Power Render) + foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS}) + string(TOUPPER ${_SUB} _OPT) + set(SDL_${_OPT} OFF) + endforeach() + + set(HIDAPI ON) + endif() + + if (APPLE) + set(SDL_FILE ON) + endif() + + if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck") + set(SDL_PIPEWIRE OFF) # build errors out with this on + AddJsonPackage("sdl2_steamdeck") + else() + AddJsonPackage("sdl2_generic") + endif() + elseif (YUZU_USE_BUNDLED_SDL2) + message(STATUS "Using bundled SDL2") + AddJsonPackage(sdl2) + endif() + + find_package(SDL2 2.26.4 REQUIRED) +endif() + +# SPIRV Headers +AddJsonPackage(spirv-headers) + +# Sirit +if (YUZU_USE_BUNDLED_SIRIT) + AddJsonPackage(sirit-ci) +else() + AddJsonPackage(sirit) + # Change to old-but-more-cacheable debug info on Windows + if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) + get_target_property(sirit_opts sirit COMPILE_OPTIONS) + list(FILTER sirit_opts EXCLUDE REGEX "/Zi") + list(APPEND sirit_opts "/Z7") + set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${sirit_opts}") + endif() + if(MSVC AND CXX_CLANG) + target_compile_options(siritobj PRIVATE -Wno-error=unused-command-line-argument) + endif() +endif() + +# SPIRV Tools +AddJsonPackage(spirv-tools) + +if (SPIRV-Tools_ADDED) + add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static) + target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link) +endif() + +# Catch2 +if (YUZU_TESTS OR DYNARMIC_TESTS) + AddJsonPackage(catch2) endif() # getopt @@ -69,154 +188,55 @@ endif() # Glad add_subdirectory(glad) -# mbedtls -AddPackage( - NAME mbedtls - REPO "Mbed-TLS/mbedtls" - SHA "8c88150ca1" - HASH 769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966 - PATCHES - ${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch -) - -if (mbedtls_ADDED) - target_include_directories(mbedtls PUBLIC ${mbedtls_SOURCE_DIR}/include) - - if (NOT MSVC) - target_compile_options(mbedcrypto PRIVATE - -Wno-unused-but-set-variable - -Wno-string-concatenation) - endif() -endif() - # libusb -if (ENABLE_LIBUSB AND NOT TARGET libusb::usb) +if (ENABLE_LIBUSB) add_subdirectory(libusb) endif() -# Sirit -# TODO(crueter): spirv-tools doesn't work w/ system -set(SPIRV_WERROR OFF) -AddPackage( - NAME SPIRV-Headers - REPO "KhronosGroup/SPIRV-Headers" - SHA 4e209d3d7e - HASH f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4 -) +# VMA +AddJsonPackage(vulkan-memory-allocator) -AddPackage( - NAME sirit - REPO "eden-emulator/sirit" - SHA db1f1e8ab5 - HASH 73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05 - OPTIONS - "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" -) - -if(MSVC AND USE_CCACHE AND TARGET sirit) - get_target_property(_opts sirit COMPILE_OPTIONS) - list(FILTER _opts EXCLUDE REGEX "/Zi") - list(APPEND _opts "/Z7") - set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${_opts}") +if (VulkanMemoryAllocator_ADDED) + if (CXX_CLANG) + target_compile_options(VulkanMemoryAllocator INTERFACE + -Wno-unused-variable + ) + elseif(MSVC) + target_compile_options(VulkanMemoryAllocator INTERFACE + /wd4189 + ) + endif() endif() # httplib if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER) - AddPackage( - NAME httplib - REPO "yhirose/cpp-httplib" - SHA a609330e4c - HASH dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2 - OPTIONS - "HTTPLIB_REQUIRE_OPENSSL ${ENABLE_OPENSSL}" - ) + AddJsonPackage(httplib) endif() # cpp-jwt if (ENABLE_WEB_SERVICE) - AddPackage( - NAME cpp-jwt - VERSION 1.4 - REPO "arun11299/cpp-jwt" - SHA a54fa08a3b - HASH a90f7e594ada0c7e49d5ff9211c71097534e7742a8e44bf0851b0362642a7271d53f5d83d04eeaae2bad17ef3f35e09e6818434d8eaefa038f3d1f7359d0969a - FIND_PACKAGE_ARGUMENTS "CONFIG" - OPTIONS - "CPP_JWT_BUILD_EXAMPLES OFF" - "CPP_JWT_BUILD_TESTS OFF" - "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF" - PATCHES - ${CMAKE_SOURCE_DIR}/.patch/cpp-jwt/0001-no-install.patch - ${CMAKE_SOURCE_DIR}/.patch/cpp-jwt/0002-missing-decl.patch - ) + AddJsonPackage(cpp-jwt) endif() # unordered_dense -AddPackage( - NAME unordered_dense - REPO "Lizzie841/unordered_dense" - SHA e59d30b7b1 - HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0 - FIND_PACKAGE_ARGUMENTS "CONFIG" - OPTIONS - "UNORDERED_DENSE_INSTALL OFF" -) +AddJsonPackage(unordered-dense) # FFMpeg -if (YUZU_USE_BUNDLED_FFMPEG) +if (YUZU_USE_EXTERNAL_FFMPEG OR YUZU_USE_BUNDLED_FFMPEG) add_subdirectory(ffmpeg) + set(FFmpeg_PATH "${FFmpeg_PATH}" PARENT_SCOPE) set(FFmpeg_LDFLAGS "${FFmpeg_LDFLAGS}" PARENT_SCOPE) set(FFmpeg_LIBRARIES "${FFmpeg_LIBRARIES}" PARENT_SCOPE) + set(FFmpeg_LIBRARY_DIR "${FFmpeg_LIBRARY_DIR}" PARENT_SCOPE) set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE) -endif() -# Vulkan-Headers - -# TODO(crueter): Vk1.4 impl - -AddPackage( - NAME VulkanHeaders - VERSION 1.3.274 - REPO "KhronosGroup/Vulkan-Headers" - SHA 89268a6d17 - HASH 3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8 - BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS} -) - -# Vulkan-Utility-Libraries -AddPackage( - NAME VulkanUtilityLibraries - REPO "KhronosGroup/Vulkan-Utility-Libraries" - SHA df2e358152 - HASH 3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79 - BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES} -) - -# SPIRV-Tools -if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS) - AddPackage( - NAME SPIRV-Tools - REPO "KhronosGroup/SPIRV-Tools" - SHA 40eb301f32 - HASH 58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa - OPTIONS - "SPIRV_SKIP_EXECUTABLES ON" - ) + message(STATUS "FFmpeg Libraries: ${FFmpeg_LIBRARIES}") endif() # TZDB (Time Zone Database) add_subdirectory(nx_tzdb) -# VMA -AddPackage( - NAME VulkanMemoryAllocator - REPO "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator" - SHA 1076b348ab - HASH a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772 - FIND_PACKAGE_ARGUMENTS "CONFIG" -) - if (NOT TARGET LLVM::Demangle) add_library(demangle demangle/ItaniumDemangle.cpp) target_include_directories(demangle PUBLIC ./demangle) @@ -245,17 +265,8 @@ if (NOT TARGET RenderDoc::API) add_library(RenderDoc::API ALIAS renderdoc) endif() -if (ANDROID) - if (ARCHITECTURE_arm64) - AddPackage( - NAME libadrenotools - REPO "bylaws/libadrenotools" - SHA 8fae8ce254 - HASH c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb - PATCHES - ${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch - ) - endif() +if (ANDROID AND ARCHITECTURE_arm64) + AddJsonPackage(libadrenotools) endif() if (UNIX AND NOT APPLE AND NOT TARGET gamemode::headers) @@ -278,6 +289,7 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client) _CRT_NONSTDC_NO_DEPRECATE ) + # TODO AddPackage( NAME breakpad URL "google/breakpad" @@ -321,7 +333,7 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client) file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/mac/*.cc ${breakpad_SOURCE_DIR}/src/common/mac/*.cc) list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/common/mac/MachIPC.mm) else() - target_compile_definitions(libbreakpad_client PUBLIC -DHAVE_A_OUT_H) + target_compile_definitions(libbreakpad_client PUBLIC HAVE_A_OUT_H) file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/linux/*.cc ${breakpad_SOURCE_DIR}/src/common/linux/*.cc) endif() list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES}) @@ -378,13 +390,7 @@ endif() # oboe if (ANDROID) - AddPackage( - NAME oboe - REPO "google/oboe" - SHA 2bc873e53c - HASH 02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768 - BUNDLED_PACKAGE ON - ) + AddJsonPackage(oboe) add_library(oboe::oboe ALIAS oboe) endif() diff --git a/externals/cpmfile.json b/externals/cpmfile.json new file mode 100644 index 0000000000..dde8c22d5f --- /dev/null +++ b/externals/cpmfile.json @@ -0,0 +1,202 @@ +{ + "vulkan-memory-allocator": { + "package": "VulkanMemoryAllocator", + "repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator", + "tag": "v%VERSION%", + "hash": "deb5902ef8db0e329fbd5f3f4385eb0e26bdd9f14f3a2334823fb3fe18f36bc5d235d620d6e5f6fe3551ec3ea7038638899db8778c09f6d5c278f5ff95c3344b", + "find_args": "CONFIG", + "git_version": "3.3.0" + }, + "sirit": { + "repo": "eden-emulator/sirit", + "git_version": "1.0.2", + "tag": "v%VERSION%", + "artifact": "sirit-source-%VERSION%.tar.zst", + "hash_suffix": "sha512sum", + "find_args": "CONFIG", + "options": [ + "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" + ] + }, + "sirit-ci": { + "ci": true, + "package": "sirit", + "name": "sirit", + "repo": "eden-emulator/sirit", + "version": "1.0.2" + }, + "httplib": { + "repo": "yhirose/cpp-httplib", + "tag": "v%VERSION%", + "hash": "b364500f76e2ecb0fe21b032d831272e3f1dfeea71af74e325f8fc4ce9dcdb3c941b97a5b422bdeafb9facd058597b90f8bfc284fb9afe3c33fefa15dd5a010b", + "git_version": "0.26.0" + }, + "cpp-jwt": { + "version": "1.4", + "repo": "crueter/cpp-jwt", + "sha": "9eaea6328f", + "hash": "e237d92c59ebbf0dc8ac0bae3bc80340e1e9cf430e1c1c9638443001118e16de2b3e9036ac4b98105427667b0386d97831415170b68c432438dcad9ef8052de7", + "find_args": "CONFIG", + "options": [ + "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF" + ] + }, + "xbyak_sun": { + "package": "xbyak", + "repo": "herumi/xbyak", + "tag": "v%VERSION%", + "hash": "e84992c65ad62c577e2746ec5180132fd2875166d1e6b1521a0ff619787e1645792fe5f6a858fe94ed66f297912b6a6b89a509b5d5f5e81a2db1dd7e6790b1f5", + "bundled": true, + "git_version": "7.30" + }, + "xbyak": { + "package": "xbyak", + "repo": "herumi/xbyak", + "tag": "v%VERSION%", + "hash": "1042090405c426e339506c179d53e91d4d545ce9c9f53d8f797caa092d589f913a9bcb9c8f31c4c60870acb954c556e305fb6732c66bc3c8f1cd924f9172def9", + "git_version": "7.22", + "bundled": true, + "skip_updates": true + }, + "oaknut": { + "repo": "eden-emulator/oaknut", + "version": "2.0.1", + "git_version": "2.0.3", + "tag": "v%VERSION%", + "hash": "9697e80a7d5d9bcb3ce51051a9a24962fb90ca79d215f1f03ae6b58da8ba13a63b5dda1b4dde3d26ac6445029696b8ef2883f4e5a777b342bba01283ed293856" + }, + "libadrenotools": { + "repo": "bylaws/libadrenotools", + "sha": "8fae8ce254", + "hash": "c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb", + "patches": [ + "0001-linkerns-cpm.patch" + ] + }, + "oboe": { + "repo": "google/oboe", + "tag": "%VERSION%", + "hash": "ce4011afe7345370d4ead3b891cd69a5ef224b129535783586c0ca75051d303ed446e6c7f10bde8da31fff58d6e307f1732a3ffd03b249f9ef1fd48fd4132715", + "git_version": "1.10.0", + "bundled": true + }, + "unordered-dense": { + "package": "unordered_dense", + "repo": "martinus/unordered_dense", + "tag": "v%VERSION%", + "hash": "f9c819e28e1c1a387acfee09277d6af5e366597a0d39acf1c687acf0608a941ba966af8aaebdb8fba0126c7360269c4a51754ef4cab17c35c01a30215f953368", + "find_args": "CONFIG", + "git_version": "4.5.0" + }, + "mbedtls": { + "package": "MbedTLS", + "repo": "Mbed-TLS/mbedtls", + "tag": "mbedtls-%VERSION%", + "hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da", + "version": "3", + "git_version": "3.6.4", + "artifact": "%TAG%.tar.bz2", + "skip_updates": true + }, + "enet": { + "repo": "lsalzman/enet", + "tag": "v%VERSION%", + "hash": "a0d2fa8c957704dd49e00a726284ac5ca034b50b00d2b20a94fa1bbfbb80841467834bfdc84aa0ed0d6aab894608fd6c86c3b94eee46343f0e6d9c22e391dbf9", + "version": "1.3", + "git_version": "1.3.18", + "find_args": "MODULE" + }, + "vulkan-utility-headers": { + "package": "VulkanUtilityLibraries", + "repo": "scripts/VulkanUtilityHeaders", + "tag": "%VERSION%", + "git_version": "1.4.328", + "artifact": "VulkanUtilityHeaders.tar.zst", + "git_host": "git.crueter.xyz", + "hash": "9922217b39faf73cd4fc1510f2fdba14a49aa5c0d77f9ee24ee0512cef16b234d0cabc83c1fec861fa5df1d43e7f086ca9b6501753899119f39c5ca530cb0dae" + }, + "spirv-tools": { + "package": "SPIRV-Tools", + "repo": "crueter/SPIRV-Tools", + "sha": "2fa2d44485", + "hash": "45b198be1d09974ccb2438e8bfa5683f23a0421b058297c28eacfd77e454ec2cf87e77850eddd202efff34b004d8d6b4d12e9615e59bd72be904c196f5eb2169", + "git_version": "2025.4", + "options": [ + "SPIRV_SKIP_EXECUTABLES ON" + ] + }, + "spirv-headers": { + "package": "SPIRV-Headers", + "repo": "KhronosGroup/SPIRV-Headers", + "sha": "01e0577914", + "hash": "d0f905311faf7d743de686fdf241dc4cb0a4f08e2184f5a3b3b2946e680db3cd89eeb72954eafe6fa457f93550e27d516575c8709cb134d8aecc0b43064636ce", + "options": [ + "SPIRV_WERROR OFF" + ] + }, + "cubeb": { + "repo": "mozilla/cubeb", + "sha": "fa02160712", + "hash": "82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61", + "find_args": "CONFIG", + "options": [ + "USE_SANITIZERS OFF", + "BUILD_TESTS OFF", + "BUILD_TOOLS OFF", + "BUNDLE_SPEEX ON" + ] + }, + "sdl2": { + "ci": true, + "package": "SDL2", + "name": "SDL2", + "repo": "crueter-ci/SDL2", + "version": "2.32.10", + "min_version": "2.26.4", + "disabled_platforms": [ + "macos-universal" + ] + }, + "catch2": { + "package": "Catch2", + "repo": "catchorg/Catch2", + "tag": "v%VERSION%", + "hash": "a95495142f915d6e9c2a23e80fe360343e9097680066a2f9d3037a070ba5f81ee5559a0407cc9e972dc2afae325873f1fc7ea07a64012c0f01aac6e549f03e3f", + "version": "3.0.1", + "git_version": "3.11.0" + }, + "discord-rpc": { + "package": "DiscordRPC", + "repo": "eden-emulator/discord-rpc", + "sha": "1cf7772bb6", + "hash": "e9b35e6f2c075823257bcd59f06fe7bb2ccce1976f44818d2e28810435ef79c712a3c4f20f40da41f691342a4058cf86b078eb7f9d9e4dae83c0547c21ec4f97", + "find_args": "MODULE" + }, + "simpleini": { + "package": "SimpleIni", + "repo": "brofield/simpleini", + "tag": "v%VERSION%", + "hash": "6c198636816a0018adbf7f735d402c64245c6fcd540b7360d4388d46f007f3a520686cdaec4705cb8cb31401b2cb4797a80b42ea5d08a6a5807c0848386f7ca1", + "find_args": "MODULE", + "git_version": "4.22" + }, + "sdl2_generic": { + "package": "SDL2", + "repo": "libsdl-org/SDL", + "tag": "release-%VERSION%", + "hash": "d5622d6bb7266f7942a7b8ad43e8a22524893bf0c2ea1af91204838d9b78d32768843f6faa248757427b8404b8c6443776d4afa6b672cd8571a4e0c03a829383", + "key": "generic", + "bundled": true, + "git_version": "2.32.10", + "skip_updates": true + }, + "sdl2_steamdeck": { + "package": "SDL2", + "repo": "libsdl-org/SDL", + "sha": "cc016b0046", + "hash": "34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b", + "key": "steamdeck", + "bundled": true, + "skip_updates": "true" + } +} diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index 048ab36c17..59397f6acb 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -1,7 +1,143 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2021 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later -if (NOT WIN32 AND NOT ANDROID) +include(CPMUtil) + +# TODO(crueter, MaranBr): Externals FFmpeg 8.0 + +set(FFmpeg_HWACCEL_LIBRARIES) +set(FFmpeg_HWACCEL_FLAGS) +set(FFmpeg_HWACCEL_INCLUDE_DIRS) +set(FFmpeg_HWACCEL_LDFLAGS) + +if (UNIX AND NOT ANDROID) + find_package(PkgConfig REQUIRED) + if (NOT ANDROID) + pkg_check_modules(LIBVA libva) + pkg_check_modules(CUDA cuda) + pkg_check_modules(FFNVCODEC ffnvcodec) + pkg_check_modules(VDPAU vdpau) + endif() + + if (NOT APPLE) + # In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so + if(PLATFORM_SUN) + list(APPEND FFmpeg_HWACCEL_LIBRARIES + X11 + "/usr/lib/xorg/amd64/libdrm.so") + else() + pkg_check_modules(LIBDRM libdrm REQUIRED) + list(APPEND FFmpeg_HWACCEL_LIBRARIES + ${LIBDRM_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS + ${LIBDRM_INCLUDE_DIRS}) + endif() + list(APPEND FFmpeg_HWACCEL_FLAGS + --enable-libdrm) + endif() + + if(LIBVA_FOUND) + find_package(X11 REQUIRED) + pkg_check_modules(LIBVA-DRM libva-drm REQUIRED) + pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED) + list(APPEND FFmpeg_HWACCEL_LIBRARIES + ${X11_LIBRARIES} + ${LIBVA-DRM_LIBRARIES} + ${LIBVA-X11_LIBRARIES} + ${LIBVA_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_FLAGS + --enable-hwaccel=h264_vaapi + --enable-hwaccel=vp8_vaapi + --enable-hwaccel=vp9_vaapi) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS + ${X11_INCLUDE_DIRS} + ${LIBVA-DRM_INCLUDE_DIRS} + ${LIBVA-X11_INCLUDE_DIRS} + ${LIBVA_INCLUDE_DIRS} + ) + message(STATUS "ffmpeg: va-api libraries version ${LIBVA_VERSION} found") + else() + list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi) + message(WARNING "ffmpeg: libva-dev not found, disabling Video Acceleration API (VA-API)...") + endif() + + if (FFNVCODEC_FOUND) + list(APPEND FFmpeg_HWACCEL_FLAGS + --enable-cuvid + --enable-ffnvcodec + --enable-nvdec + --enable-hwaccel=h264_nvdec + --enable-hwaccel=vp8_nvdec + --enable-hwaccel=vp9_nvdec + ) + list(APPEND FFmpeg_HWACCEL_LIBRARIES ${FFNVCODEC_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${FFNVCODEC_INCLUDE_DIRS}) + list(APPEND FFmpeg_HWACCEL_LDFLAGS ${FFNVCODEC_LDFLAGS}) + message(STATUS "ffmpeg: ffnvcodec libraries version ${FFNVCODEC_VERSION} found") + # ffnvenc could load CUDA libraries at the runtime using dlopen/dlsym or LoadLibrary/GetProcAddress + # here we handle the hard-linking scenario where CUDA is linked during compilation + if (CUDA_FOUND) + # This line causes build error if CUDA_INCLUDE_DIRS is anything but a single non-empty value + #list(APPEND FFmpeg_HWACCEL_FLAGS --extra-cflags=-I${CUDA_INCLUDE_DIRS}) + list(APPEND FFmpeg_HWACCEL_LIBRARIES ${CUDA_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) + list(APPEND FFmpeg_HWACCEL_LDFLAGS ${CUDA_LDFLAGS}) + message(STATUS "ffmpeg: CUDA libraries version ${CUDA_VERSION} found, hard-linking will be performed") + endif(CUDA_FOUND) + endif() + + if (VDPAU_FOUND) + list(APPEND FFmpeg_HWACCEL_FLAGS + --enable-vdpau + --enable-hwaccel=h264_vdpau + --enable-hwaccel=vp9_vdpau + ) + list(APPEND FFmpeg_HWACCEL_LIBRARIES ${VDPAU_LIBRARIES}) + list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${VDPAU_INCLUDE_DIRS}) + list(APPEND FFmpeg_HWACCEL_LDFLAGS ${VDPAU_LDFLAGS}) + message(STATUS "ffmpeg: vdpau libraries version ${VDPAU_VERSION} found") + else() + list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau) + message(WARNING "ffmpeg: libvdpau-dev not found, disabling Video Decode and Presentation API for Unix (VDPAU)...") + endif() +endif() + +if (YUZU_USE_BUNDLED_FFMPEG) + # MSVC conflicts with ksuser otherwise + # Android needs some deps to be compiled with PIC (TODO) + # TODO(crueter) fix + if (MSVC OR ANDROID) + set(BUILD_SHARED_LIBS ON) + else() + set(BUILD_SHARED_LIBS OFF) + endif() + + AddJsonPackage(ffmpeg-ci) + + set(FFmpeg_INCLUDE_DIR + "${FFmpeg_SOURCE_DIR}/include;${FFmpeg_HWACCEL_INCLUDE_DIRS}" + PARENT_SCOPE + ) + + set(FFmpeg_PATH + "${FFmpeg_SOURCE_DIR}" + PARENT_SCOPE + ) + + set(FFmpeg_LIBRARY_DIR + "${FFmpeg_SOURCE_DIR}/bin" + PARENT_SCOPE + ) + + set(FFmpeg_LIBRARIES + FFmpeg::FFmpeg + ${FFmpeg_HWACCEL_LIBRARIES} + PARENT_SCOPE + ) +else() # Build FFmpeg from externals message(STATUS "Using FFmpeg from externals") @@ -19,13 +155,7 @@ if (NOT WIN32 AND NOT ANDROID) message(FATAL_ERROR "Required program `autoconf` not found.") endif() - AddPackage( - NAME ffmpeg - REPO "FFmpeg/FFmpeg" - SHA c2184b65d2 - HASH 2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97 - SYSTEM_PACKAGE OFF - ) + AddJsonPackage(ffmpeg) set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR}) set(FFmpeg_BUILD_DIR ${ffmpeg_BINARY_DIR}) @@ -52,86 +182,6 @@ if (NOT WIN32 AND NOT ANDROID) CACHE PATH "Paths to FFmpeg libraries" FORCE) endforeach() - find_package(PkgConfig REQUIRED) - if (NOT ANDROID) - pkg_check_modules(LIBVA libva) - pkg_check_modules(CUDA cuda) - pkg_check_modules(FFNVCODEC ffnvcodec) - pkg_check_modules(VDPAU vdpau) - endif() - - set(FFmpeg_HWACCEL_LIBRARIES) - set(FFmpeg_HWACCEL_FLAGS) - set(FFmpeg_HWACCEL_INCLUDE_DIRS) - set(FFmpeg_HWACCEL_LDFLAGS) - - if(LIBVA_FOUND) - pkg_check_modules(LIBDRM libdrm REQUIRED) - find_package(X11 REQUIRED) - pkg_check_modules(LIBVA-DRM libva-drm REQUIRED) - pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED) - list(APPEND FFmpeg_HWACCEL_LIBRARIES - ${LIBDRM_LIBRARIES} - ${X11_LIBRARIES} - ${LIBVA-DRM_LIBRARIES} - ${LIBVA-X11_LIBRARIES} - ${LIBVA_LIBRARIES}) - set(FFmpeg_HWACCEL_FLAGS - --enable-hwaccel=h264_vaapi - --enable-hwaccel=vp8_vaapi - --enable-hwaccel=vp9_vaapi - --enable-libdrm) - list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS - ${LIBDRM_INCLUDE_DIRS} - ${X11_INCLUDE_DIRS} - ${LIBVA-DRM_INCLUDE_DIRS} - ${LIBVA-X11_INCLUDE_DIRS} - ${LIBVA_INCLUDE_DIRS} - ) - message(STATUS "VA-API found") - else() - set(FFmpeg_HWACCEL_FLAGS --disable-vaapi) - endif() - - if (FFNVCODEC_FOUND) - list(APPEND FFmpeg_HWACCEL_FLAGS - --enable-cuvid - --enable-ffnvcodec - --enable-nvdec - --enable-hwaccel=h264_nvdec - --enable-hwaccel=vp8_nvdec - --enable-hwaccel=vp9_nvdec - ) - list(APPEND FFmpeg_HWACCEL_LIBRARIES ${FFNVCODEC_LIBRARIES}) - list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${FFNVCODEC_INCLUDE_DIRS}) - list(APPEND FFmpeg_HWACCEL_LDFLAGS ${FFNVCODEC_LDFLAGS}) - message(STATUS "ffnvcodec libraries version ${FFNVCODEC_VERSION} found") - # ffnvenc could load CUDA libraries at the runtime using dlopen/dlsym or LoadLibrary/GetProcAddress - # here we handle the hard-linking senario where CUDA is linked during compilation - if (CUDA_FOUND) - # This line causes build error if CUDA_INCLUDE_DIRS is anything but a single non-empty value - #list(APPEND FFmpeg_HWACCEL_FLAGS --extra-cflags=-I${CUDA_INCLUDE_DIRS}) - list(APPEND FFmpeg_HWACCEL_LIBRARIES ${CUDA_LIBRARIES}) - list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) - list(APPEND FFmpeg_HWACCEL_LDFLAGS ${CUDA_LDFLAGS}) - message(STATUS "CUDA libraries found, hard-linking will be performed") - endif(CUDA_FOUND) - endif() - - if (VDPAU_FOUND) - list(APPEND FFmpeg_HWACCEL_FLAGS - --enable-vdpau - --enable-hwaccel=h264_vdpau - --enable-hwaccel=vp9_vdpau - ) - list(APPEND FFmpeg_HWACCEL_LIBRARIES ${VDPAU_LIBRARIES}) - list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${VDPAU_INCLUDE_DIRS}) - list(APPEND FFmpeg_HWACCEL_LDFLAGS ${VDPAU_LDFLAGS}) - message(STATUS "vdpau libraries version ${VDPAU_VERSION} found") - else() - list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau) - endif() - find_program(BASH_PROGRAM bash REQUIRED) set(FFmpeg_CROSS_COMPILE_FLAGS "") @@ -231,57 +281,6 @@ if (NOT WIN32 AND NOT ANDROID) else() message(FATAL_ERROR "FFmpeg not found") endif() -elseif(ANDROID) - # Use yuzu FFmpeg binaries - if (ARCHITECTURE_arm64) - set(FFmpeg_EXT_NAME "ffmpeg-android-7.1.1-aarch64") - elseif (ARCHITECTURE_x86_64) - set(FFmpeg_EXT_NAME "ffmpeg-android-v5.1.LTS-x86_64") - else() - message(FATAL_ERROR "Unsupported architecture for Android FFmpeg") - endif() - - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1) - set(FFmpeg_FOUND YES) - set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) - set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE) - set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) - set(FFmpeg_LIBRARIES - ${FFmpeg_LIBRARY_DIR}/libavcodec.so - ${FFmpeg_LIBRARY_DIR}/libavdevice.so - ${FFmpeg_LIBRARY_DIR}/libavfilter.so - ${FFmpeg_LIBRARY_DIR}/libavformat.so - ${FFmpeg_LIBRARY_DIR}/libavutil.so - ${FFmpeg_LIBRARY_DIR}/libswresample.so - ${FFmpeg_LIBRARY_DIR}/libswscale.so - ${FFmpeg_LIBRARY_DIR}/libvpx.a - ${FFmpeg_LIBRARY_DIR}/libx264.a - CACHE PATH "Paths to FFmpeg libraries" FORCE) - # exported variables - set(FFmpeg_PATH "${FFmpeg_PATH}" PARENT_SCOPE) - set(FFmpeg_LDFLAGS "${FFmpeg_LDFLAGS}" PARENT_SCOPE) - set(FFmpeg_LIBRARIES "${FFmpeg_LIBRARIES}" PARENT_SCOPE) - set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE) -elseif(WIN32) - # Use yuzu FFmpeg binaries - set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") - - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1) - set(FFmpeg_FOUND YES) - set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) - set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) - set(FFmpeg_LDFLAGS "" CACHE STRING "FFmpeg linker flags" FORCE) - set(FFmpeg_LIBRARIES - ${FFmpeg_LIBRARY_DIR}/swscale.lib - ${FFmpeg_LIBRARY_DIR}/avcodec.lib - ${FFmpeg_LIBRARY_DIR}/avfilter.lib - ${FFmpeg_LIBRARY_DIR}/avutil.lib - CACHE PATH "Paths to FFmpeg libraries" FORCE) - # exported variables - set(FFmpeg_PATH "${FFmpeg_PATH}" PARENT_SCOPE) - set(FFmpeg_LDFLAGS "${FFmpeg_LDFLAGS}" PARENT_SCOPE) - set(FFmpeg_LIBRARIES "${FFmpeg_LIBRARIES}" PARENT_SCOPE) - set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE) endif() unset(FFmpeg_COMPONENTS) diff --git a/externals/ffmpeg/cpmfile.json b/externals/ffmpeg/cpmfile.json new file mode 100644 index 0000000000..a4933da275 --- /dev/null +++ b/externals/ffmpeg/cpmfile.json @@ -0,0 +1,21 @@ +{ + "ffmpeg": { + "repo": "FFmpeg/FFmpeg", + "sha": "c2184b65d2", + "hash": "2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97", + "bundled": true + }, + "ffmpeg-ci": { + "ci": true, + "package": "FFmpeg", + "name": "ffmpeg", + "repo": "crueter-ci/FFmpeg", + "version": "8.0", + "min_version": "4.1", + "disabled_platforms": [ + "freebsd-amd64", + "solaris-amd64", + "macos-universal" + ] + } +} diff --git a/externals/libusb/CMakeLists.txt b/externals/libusb/CMakeLists.txt index ec7724e874..a53464ea98 100644 --- a/externals/libusb/CMakeLists.txt +++ b/externals/libusb/CMakeLists.txt @@ -1,7 +1,19 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2020 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later -if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE) +include(CPMUtil) + +AddJsonPackage(libusb) + +if (NOT libusb_ADDED) + return() +endif() + +# TODO: *BSD fails to compile--may need different configs/symbols +if (MINGW OR PLATFORM_LINUX OR APPLE) set(LIBUSB_FOUND ON CACHE BOOL "libusb is present" FORCE) set(LIBUSB_VERSION "1.0.24" CACHE STRING "libusb version string" FORCE) @@ -19,8 +31,8 @@ if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE) message(FATAL_ERROR "Required program `libtoolize` not found.") endif() - set(LIBUSB_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/libusb") - set(LIBUSB_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libusb") + set(LIBUSB_PREFIX "${libusb_BINARY_DIR}") + set(LIBUSB_SRC_DIR "${libusb_SOURCE_DIR}") # Workarounds for MSYS/MinGW if (MSYS) @@ -118,27 +130,27 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") endif() add_library(usb - libusb/libusb/core.c - libusb/libusb/core.c - libusb/libusb/descriptor.c - libusb/libusb/hotplug.c - libusb/libusb/io.c - libusb/libusb/strerror.c - libusb/libusb/sync.c + ${libusb_SOURCE_DIR}/libusb/core.c + ${libusb_SOURCE_DIR}/libusb/core.c + ${libusb_SOURCE_DIR}/libusb/descriptor.c + ${libusb_SOURCE_DIR}/libusb/hotplug.c + ${libusb_SOURCE_DIR}/libusb/io.c + ${libusb_SOURCE_DIR}/libusb/strerror.c + ${libusb_SOURCE_DIR}/libusb/sync.c ) set_target_properties(usb PROPERTIES VERSION 1.0.24) if(WIN32) target_include_directories(usb BEFORE PUBLIC - libusb/libusb + ${libusb_SOURCE_DIR}/libusb PRIVATE "${CMAKE_CURRENT_BINARY_DIR}" ) if (NOT MINGW) - target_include_directories(usb BEFORE PRIVATE libusb/msvc) + target_include_directories(usb BEFORE PRIVATE ${libusb_SOURCE_DIR}/msvc) endif() else() @@ -148,7 +160,7 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") BEFORE PUBLIC - libusb/libusb + ${libusb_SOURCE_DIR}/libusb PRIVATE "${CMAKE_CURRENT_BINARY_DIR}" @@ -157,15 +169,15 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if(WIN32 OR CYGWIN) target_sources(usb PRIVATE - libusb/libusb/os/threads_windows.c - libusb/libusb/os/windows_winusb.c - libusb/libusb/os/windows_usbdk.c - libusb/libusb/os/windows_common.c + ${libusb_SOURCE_DIR}/libusb/os/threads_windows.c + ${libusb_SOURCE_DIR}/libusb/os/windows_winusb.c + ${libusb_SOURCE_DIR}/libusb/os/windows_usbdk.c + ${libusb_SOURCE_DIR}/libusb/os/windows_common.c ) set(OS_WINDOWS TRUE) elseif(APPLE) target_sources(usb PRIVATE - libusb/libusb/os/darwin_usb.c + ${libusb_SOURCE_DIR}/libusb/os/darwin_usb.c ) find_library(COREFOUNDATION_LIBRARY CoreFoundation) find_library(IOKIT_LIBRARY IOKit) @@ -178,20 +190,20 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(OS_DARWIN TRUE) elseif(ANDROID) target_sources(usb PRIVATE - libusb/libusb/os/linux_usbfs.c - libusb/libusb/os/linux_netlink.c + ${libusb_SOURCE_DIR}/libusb/os/linux_usbfs.c + ${libusb_SOURCE_DIR}/libusb/os/linux_netlink.c ) find_library(LOG_LIBRARY log) target_link_libraries(usb PRIVATE ${LOG_LIBRARY}) set(OS_LINUX TRUE) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") target_sources(usb PRIVATE - libusb/libusb/os/linux_usbfs.c + ${libusb_SOURCE_DIR}/libusb/os/linux_usbfs.c ) find_package(Libudev) if(LIBUDEV_FOUND) target_sources(usb PRIVATE - libusb/libusb/os/linux_udev.c + ${libusb_SOURCE_DIR}/libusb/os/linux_udev.c ) target_link_libraries(usb PRIVATE "${LIBUDEV_LIBRARIES}") target_include_directories(usb PRIVATE "${LIBUDEV_INCLUDE_DIR}") @@ -199,26 +211,26 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(USE_UDEV TRUE) else() target_sources(usb PRIVATE - libusb/libusb/os/linux_netlink.c + ${libusb_SOURCE_DIR}/libusb/os/linux_netlink.c ) endif() set(OS_LINUX TRUE) elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") target_sources(usb PRIVATE - libusb/libusb/os/netbsd_usb.c + ${libusb_SOURCE_DIR}/libusb/os/netbsd_usb.c ) set(OS_NETBSD TRUE) elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") target_sources(usb PRIVATE - libusb/libusb/os/openbsd_usb.c + ${libusb_SOURCE_DIR}/libusb/os/openbsd_usb.c ) set(OS_OPENBSD TRUE) endif() if(UNIX) target_sources(usb PRIVATE - libusb/libusb/os/events_posix.c - libusb/libusb/os/threads_posix.c + ${libusb_SOURCE_DIR}/libusb/os/events_posix.c + ${libusb_SOURCE_DIR}/libusb/os/threads_posix.c ) find_package(Threads REQUIRED) if(THREADS_HAVE_PTHREAD_ARG) @@ -230,8 +242,8 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(THREADS_POSIX TRUE) elseif(WIN32) target_sources(usb PRIVATE - libusb/libusb/os/events_windows.c - libusb/libusb/os/threads_windows.c + ${libusb_SOURCE_DIR}/libusb/os/events_windows.c + ${libusb_SOURCE_DIR}/libusb/os/threads_windows.c ) endif() diff --git a/externals/libusb/cpmfile.json b/externals/libusb/cpmfile.json new file mode 100644 index 0000000000..dc69841ab7 --- /dev/null +++ b/externals/libusb/cpmfile.json @@ -0,0 +1,9 @@ +{ + "libusb": { + "repo": "libusb/libusb", + "tag": "v%VERSION%", + "hash": "98c5f7940ff06b25c9aa65aa98e23de4c79a4c1067595f4c73cc145af23a1c286639e1ba11185cd91bab702081f307b973f08a4c9746576dc8d01b3620a3aeb5", + "find_args": "MODULE", + "git_version": "1.0.29" + } +} diff --git a/externals/libusb/libusb b/externals/libusb/libusb deleted file mode 160000 index c060e9ce30..0000000000 --- a/externals/libusb/libusb +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7 diff --git a/externals/nx_tzdb/CMakeLists.txt b/externals/nx_tzdb/CMakeLists.txt index a86a97b4da..a51939f7c8 100644 --- a/externals/nx_tzdb/CMakeLists.txt +++ b/externals/nx_tzdb/CMakeLists.txt @@ -1,6 +1,11 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later +include(CPMUtil) + set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") add_library(nx_tzdb INTERFACE) @@ -11,33 +16,41 @@ find_program(DATE_PROG date) set(CAN_BUILD_NX_TZDB true) -if (NOT GIT) - set(CAN_BUILD_NX_TZDB false) -endif() -if (NOT GNU_MAKE) - set(CAN_BUILD_NX_TZDB false) -endif() -if (NOT DATE_PROG) - set(CAN_BUILD_NX_TZDB false) -endif() -if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR ANDROID) +if (NOT (GIT AND GNU_MAKE AND DATE_PROG) OR CMAKE_SYSTEM_NAME STREQUAL "Windows" OR ANDROID) # tzdb_to_nx currently requires a posix-compliant host # MinGW and Android are handled here due to the executable format being different from the host system # TODO (lat9nq): cross-compiling support + set(CAN_BUILD_NX_TZDB false) endif() -set(NX_TZDB_VERSION "250725") -set(NX_TZDB_ARCHIVE "${CPM_SOURCE_CACHE}/nx_tzdb/${NX_TZDB_VERSION}.zip") +if (CAN_BUILD_NX_TZDB AND NOT YUZU_DOWNLOAD_TIME_ZONE_DATA) + message(FATAL_ERROR "Building tzdb is currently unsupported. Check back later.") + add_subdirectory(tzdb_to_nx) + add_dependencies(nx_tzdb x80e) -set(NX_TZDB_ROMFS_DIR "${CPM_SOURCE_CACHE}/nx_tzdb/tz") + set(NX_TZDB_BASE_DIR "${NX_TZDB_DIR}") + set(NX_TZDB_TZ_DIR "${NX_TZDB_BASE_DIR}/zoneinfo") +endif() + +if(NOT YUZU_TZDB_PATH STREQUAL "") + set(NX_TZDB_BASE_DIR "${YUZU_TZDB_PATH}") + set(NX_TZDB_TZ_DIR "${NX_TZDB_BASE_DIR}/zoneinfo") +elseif (MSVC) + # TODO(crueter): This is a terrible solution, but MSVC fails to link without it + # Need to investigate further but I still can't reproduce... + set(NX_TZDB_VERSION "250725") + set(NX_TZDB_ARCHIVE "${CPM_SOURCE_CACHE}/nx_tzdb/${NX_TZDB_VERSION}.zip") + + set(NX_TZDB_BASE_DIR "${CPM_SOURCE_CACHE}/nx_tzdb/tz") + set(NX_TZDB_TZ_DIR "${NX_TZDB_BASE_DIR}/zoneinfo") -if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_TZDB_ROMFS_DIR}) set(NX_TZDB_DOWNLOAD_URL "https://github.com/crueter/tzdb_to_nx/releases/download/${NX_TZDB_VERSION}/${NX_TZDB_VERSION}.zip") message(STATUS "Downloading time zone data from ${NX_TZDB_DOWNLOAD_URL}...") file(DOWNLOAD ${NX_TZDB_DOWNLOAD_URL} ${NX_TZDB_ARCHIVE} STATUS NX_TZDB_DOWNLOAD_STATUS) + list(GET NX_TZDB_DOWNLOAD_STATUS 0 NX_TZDB_DOWNLOAD_STATUS_CODE) if (NOT NX_TZDB_DOWNLOAD_STATUS_CODE EQUAL 0) message(FATAL_ERROR "Time zone data download failed (status code ${NX_TZDB_DOWNLOAD_STATUS_CODE})") @@ -47,13 +60,17 @@ if ((NOT CAN_BUILD_NX_TZDB OR YUZU_DOWNLOAD_TIME_ZONE_DATA) AND NOT EXISTS ${NX_ INPUT ${NX_TZDB_ARCHIVE} DESTINATION - ${NX_TZDB_ROMFS_DIR}) -elseif (CAN_BUILD_NX_TZDB AND NOT YUZU_DOWNLOAD_TIME_ZONE_DATA) - # TODO(crueter): this sucked to do with cpm, see if i can get it to work again - add_subdirectory(tzdb_to_nx) - add_dependencies(nx_tzdb x80e) + ${NX_TZDB_BASE_DIR}) +else() + message(STATUS "Downloading time zone data...") + AddJsonPackage(tzdb) - set(NX_TZDB_ROMFS_DIR "${NX_TZDB_DIR}") + target_include_directories(nx_tzdb + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include + INTERFACE ${NX_TZDB_INCLUDE_DIR}) + + set(NX_TZDB_BASE_DIR "${CPM_SOURCE_CACHE}/nx_tzdb") + set(NX_TZDB_TZ_DIR "${nx_tzdb_SOURCE_DIR}") endif() target_include_directories(nx_tzdb @@ -78,25 +95,25 @@ function(CreateHeader ZONE_PATH HEADER_NAME) target_sources(nx_tzdb PRIVATE ${HEADER_PATH}) endfunction() -CreateHeader(${NX_TZDB_ROMFS_DIR} base) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo zoneinfo) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Africa africa) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America america) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Argentina america_argentina) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Indiana america_indiana) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/Kentucky america_kentucky) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/America/North_Dakota america_north_dakota) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Antarctica antarctica) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Arctic arctic) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Asia asia) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Atlantic atlantic) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Australia australia) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Brazil brazil) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Canada canada) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Chile chile) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Etc etc) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Europe europe) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Indian indian) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Mexico mexico) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/Pacific pacific) -CreateHeader(${NX_TZDB_ROMFS_DIR}/zoneinfo/US us) +CreateHeader(${NX_TZDB_BASE_DIR} base) +CreateHeader(${NX_TZDB_TZ_DIR} zoneinfo) +CreateHeader(${NX_TZDB_TZ_DIR}/Africa africa) +CreateHeader(${NX_TZDB_TZ_DIR}/America america) +CreateHeader(${NX_TZDB_TZ_DIR}/America/Argentina america_argentina) +CreateHeader(${NX_TZDB_TZ_DIR}/America/Indiana america_indiana) +CreateHeader(${NX_TZDB_TZ_DIR}/America/Kentucky america_kentucky) +CreateHeader(${NX_TZDB_TZ_DIR}/America/North_Dakota america_north_dakota) +CreateHeader(${NX_TZDB_TZ_DIR}/Antarctica antarctica) +CreateHeader(${NX_TZDB_TZ_DIR}/Arctic arctic) +CreateHeader(${NX_TZDB_TZ_DIR}/Asia asia) +CreateHeader(${NX_TZDB_TZ_DIR}/Atlantic atlantic) +CreateHeader(${NX_TZDB_TZ_DIR}/Australia australia) +CreateHeader(${NX_TZDB_TZ_DIR}/Brazil brazil) +CreateHeader(${NX_TZDB_TZ_DIR}/Canada canada) +CreateHeader(${NX_TZDB_TZ_DIR}/Chile chile) +CreateHeader(${NX_TZDB_TZ_DIR}/Etc etc) +CreateHeader(${NX_TZDB_TZ_DIR}/Europe europe) +CreateHeader(${NX_TZDB_TZ_DIR}/Indian indian) +CreateHeader(${NX_TZDB_TZ_DIR}/Mexico mexico) +CreateHeader(${NX_TZDB_TZ_DIR}/Pacific pacific) +CreateHeader(${NX_TZDB_TZ_DIR}/US us) diff --git a/externals/nx_tzdb/cpmfile.json b/externals/nx_tzdb/cpmfile.json new file mode 100644 index 0000000000..feb9daf7da --- /dev/null +++ b/externals/nx_tzdb/cpmfile.json @@ -0,0 +1,11 @@ +{ + "tzdb": { + "package": "nx_tzdb", + "repo": "misc/tzdb_to_nx", + "git_host": "git.crueter.xyz", + "artifact": "%VERSION%.zip", + "tag": "%VERSION%", + "hash": "8f60b4b29f285e39c0443f3d5572a73780f3dbfcfd5b35004451fadad77f3a215b2e2aa8d0fffe7e348e2a7b0660882b35228b6178dda8804a14ce44509fd2ca", + "version": "250725" + } +} diff --git a/externals/sse2neon/sse2neon.h b/externals/sse2neon/sse2neon.h index 66b93c1c74..67ad0ae6f8 100755 --- a/externals/sse2neon/sse2neon.h +++ b/externals/sse2neon/sse2neon.h @@ -183,7 +183,7 @@ } /* Compiler barrier */ -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) #define SSE2NEON_BARRIER() _ReadWriteBarrier() #else #define SSE2NEON_BARRIER() \ @@ -859,7 +859,7 @@ FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) { poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0); poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0); -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) __n64 a1 = {a}, b1 = {b}; return vreinterpretq_u64_p128(vmull_p64(a1, b1)); #else @@ -1770,7 +1770,7 @@ FORCE_INLINE void _mm_free(void *addr) FORCE_INLINE uint64_t _sse2neon_get_fpcr(void) { uint64_t value; -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) value = _ReadStatusReg(ARM64_FPCR); #else __asm__ __volatile__("mrs %0, FPCR" : "=r"(value)); /* read */ @@ -1780,7 +1780,7 @@ FORCE_INLINE uint64_t _sse2neon_get_fpcr(void) FORCE_INLINE void _sse2neon_set_fpcr(uint64_t value) { -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) _WriteStatusReg(ARM64_FPCR, value); #else __asm__ __volatile__("msr FPCR, %0" ::"r"(value)); /* write */ @@ -2249,7 +2249,7 @@ FORCE_INLINE __m128 _mm_or_ps(__m128 a, __m128 b) FORCE_INLINE void _mm_prefetch(char const *p, int i) { (void) i; -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) switch (i) { case _MM_HINT_NTA: __prefetch2(p, 1); @@ -4820,7 +4820,7 @@ FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b) // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_pause FORCE_INLINE void _mm_pause(void) { -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) __isb(_ARM64_BARRIER_SY); #else __asm__ __volatile__("isb\n"); @@ -5716,7 +5716,7 @@ FORCE_INLINE __m128d _mm_undefined_pd(void) #pragma GCC diagnostic ignored "-Wuninitialized" #endif __m128d a; -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) a = _mm_setzero_pd(); #endif return a; @@ -8130,7 +8130,7 @@ FORCE_INLINE int _sse2neon_sido_negative(int res, int lb, int imm8, int bound) FORCE_INLINE int _sse2neon_clz(unsigned int x) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) unsigned long cnt = 0; if (_BitScanReverse(&cnt, x)) return 31 - cnt; @@ -8142,7 +8142,7 @@ FORCE_INLINE int _sse2neon_clz(unsigned int x) FORCE_INLINE int _sse2neon_ctz(unsigned int x) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) unsigned long cnt = 0; if (_BitScanForward(&cnt, x)) return cnt; @@ -9058,7 +9058,7 @@ FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon) // AESE does ShiftRows and SubBytes on A uint8x16_t u8 = vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0)); -#ifndef _MSC_VER +#if !defined(_MSC_VER) || defined(__clang__) uint8x16_t dest = { // Undo ShiftRows step from AESE and extract X1 and X3 u8[0x4], u8[0x1], u8[0xE], u8[0xB], // SubBytes(X1) @@ -9245,7 +9245,7 @@ FORCE_INLINE uint64_t _rdtsc(void) * bits wide and it is attributed with the flag 'cap_user_time_short' * is true. */ -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) val = _ReadStatusReg(ARM64_SYSREG(3, 3, 14, 0, 2)); #else __asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val)); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bd1285b2bc..0f3c5cfd4b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,20 +18,20 @@ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$:_DEBUG> $<$>:NDEBUG>) # Set compilation flags -if (MSVC) +if (MSVC AND NOT CXX_CLANG) set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE) # Silence "deprecation" warnings - add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _SCL_SECURE_NO_WARNINGS) # Avoid windows.h junk - add_definitions(-DNOMINMAX) + add_compile_definitions(NOMINMAX) # Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors. - add_definitions(-DWIN32_LEAN_AND_MEAN) + add_compile_definitions(WIN32_LEAN_AND_MEAN) # Ensure that projects are built with Unicode support. - add_definitions(-DUNICODE -D_UNICODE) + add_compile_definitions(UNICODE _UNICODE) # /W4 - Level 4 warnings # /MP - Multi-threaded compilation @@ -69,10 +69,6 @@ if (MSVC) /external:anglebrackets # Treats all headers included by #include
, where the header file is enclosed in angle brackets (< >), as external headers /external:W0 # Sets the default warning level to 0 for external headers, effectively disabling warnings for them. - # Warnings - /W4 - /WX- - /we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled /we4189 # 'identifier': local variable is initialized but not referenced /we4265 # 'class': class has virtual functions, but destructor is not virtual @@ -97,15 +93,17 @@ if (MSVC) /wd4702 # unreachable code (when used with LTO) ) - if (USE_CCACHE OR YUZU_USE_PRECOMPILED_HEADERS) - # when caching, we need to use /Z7 to downgrade debug info to use an older but more cacheable format - # Precompiled headers are deleted if not using /Z7. See https://github.com/nanoant/CMakePCHCompiler/issues/21 - add_compile_options(/Z7) - # Avoid D9025 warning - string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") - else() - add_compile_options(/Zi) + if (NOT CXX_CLANG) + add_compile_options( + # Warnings + /W4 + /WX- + ) + endif() + + if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") endif() if (ARCHITECTURE_x86_64) @@ -118,9 +116,13 @@ if (MSVC) set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE) set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE) else() - add_compile_options( - -fwrapv + if (NOT MSVC) + add_compile_options( + -fwrapv + ) + endif() + add_compile_options( -Werror=all -Werror=extra -Werror=missing-declarations @@ -133,14 +135,19 @@ else() -Wno-missing-field-initializers ) - if (CMAKE_CXX_COMPILER_ID MATCHES Clang OR CMAKE_CXX_COMPILER_ID MATCHES IntelLLVM) # Clang or AppleClang + if (CXX_CLANG OR CXX_ICC OR CXX_APPLE) # Clang, AppleClang, or Intel C++ + if (NOT MSVC) + add_compile_options( + -Werror=shadow-uncaptured-local + -Werror=implicit-fallthrough + -Werror=type-limits + ) + endif() + add_compile_options( -Wno-braced-scalar-init -Wno-unused-private-field -Wno-nullability-completeness - -Werror=shadow-uncaptured-local - -Werror=implicit-fallthrough - -Werror=type-limits ) endif() @@ -148,12 +155,12 @@ else() add_compile_options("-mcx16") endif() - if (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL Clang) + if (APPLE AND CXX_CLANG) add_compile_options("-stdlib=libc++") endif() # GCC bugs - if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CXX_GCC) # These diagnostics would be great if they worked, but are just completely broken # and produce bogus errors on external libraries like fmt. add_compile_options( @@ -169,15 +176,15 @@ else() # glibc, which may default to 32 bits. glibc allows this to be configured # by setting _FILE_OFFSET_BITS. if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW) - add_definitions(-D_FILE_OFFSET_BITS=64) + add_compile_definitions(_FILE_OFFSET_BITS=64) endif() if (MINGW) - add_definitions(-DMINGW_HAS_SECURE_API) + add_compile_definitions(MINGW_HAS_SECURE_API) add_compile_options("-msse4.1") if (MINGW_STATIC_BUILD) - add_definitions(-DQT_STATICPLUGIN) + add_compile_definitions(QT_STATICPLUGIN) add_compile_options("-static") endif() endif() @@ -221,6 +228,8 @@ if (YUZU_ROOM_STANDALONE) endif() if (ENABLE_QT) + add_definitions(-DYUZU_QT_WIDGETS) + add_subdirectory(qt_common) add_subdirectory(yuzu) endif() diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 0cbb29b01b..31db36199a 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -30,8 +30,8 @@ val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toIn android { namespace = "org.yuzu.yuzu_emu" - compileSdkVersion = "android-35" - ndkVersion = "26.1.10909125" + compileSdkVersion = "android-36" + ndkVersion = "28.2.13676358" buildFeatures { viewBinding = true @@ -57,9 +57,9 @@ android { } defaultConfig { - // TODO If this is ever modified, change application_id in strings.xml applicationId = "dev.eden.eden_emulator" - minSdk = 30 + + minSdk = 28 targetSdk = 36 versionName = getGitVersion() @@ -72,8 +72,33 @@ android { buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"") buildConfigField("String", "BRANCH", "\"${getBranch()}\"") + + externalNativeBuild { + cmake { + val extraCMakeArgs = (project.findProperty("YUZU_ANDROID_ARGS") as String?)?.split("\\s+".toRegex()) ?: emptyList() + + arguments.addAll(listOf( + "-DENABLE_QT=0", // Don't use QT + "-DENABLE_SDL2=0", // Don't use SDL + "-DENABLE_WEB_SERVICE=1", // Enable web service + "-DENABLE_OPENSSL=ON", + "-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work + "-DYUZU_USE_CPM=ON", + "-DCPMUTIL_FORCE_BUNDLED=ON", + "-DYUZU_USE_BUNDLED_FFMPEG=ON", + "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON", + "-DBUILD_TESTING=OFF", + "-DYUZU_TESTS=OFF", + "-DDYNARMIC_TESTS=OFF", + *extraCMakeArgs.toTypedArray() + )) + + abiFilters("arm64-v8a") + } + } } + val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE") signingConfigs { if (keystoreFile != null) { @@ -94,7 +119,6 @@ android { // Define build types, which are orthogonal to product flavors. buildTypes { - // Signed by release key, allowing for upload to Play Store. release { signingConfig = if (keystoreFile != null) { @@ -103,7 +127,6 @@ android { signingConfigs.getByName("default") } - resValue("string", "app_name_suffixed", "Eden") isMinifyEnabled = true isDebuggable = false proguardFiles( @@ -116,7 +139,6 @@ android { // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. register("relWithDebInfo") { isDefault = true - resValue("string", "app_name_suffixed", "Eden Debug Release") signingConfig = signingConfigs.getByName("default") isDebuggable = true proguardFiles( @@ -132,7 +154,6 @@ android { // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. debug { signingConfig = signingConfigs.getByName("default") - resValue("string", "app_name_suffixed", "Eden Debug") isDebuggable = true isJniDebuggable = true versionNameSuffix = "-debug" @@ -140,19 +161,62 @@ android { } } + // this is really annoying but idk any other ways to fix this behavior + applicationVariants.all { + val variant = this + when { + variant.flavorName == "legacy" && variant.buildType.name == "debug" -> { + variant.resValue("string", "app_name_suffixed", "Eden Legacy Debug") + } + variant.flavorName == "mainline" && variant.buildType.name == "debug" -> { + variant.resValue("string", "app_name_suffixed", "Eden Debug") + } + variant.flavorName == "genshinSpoof" && variant.buildType.name == "debug" -> { + variant.resValue("string", "app_name_suffixed", "Eden Optimized Debug") + } + variant.flavorName == "legacy" && variant.buildType.name == "relWithDebInfo" -> { + variant.resValue("string", "app_name_suffixed", "Eden Legacy Debug Release") + } + variant.flavorName == "mainline" && variant.buildType.name == "relWithDebInfo" -> { + variant.resValue("string", "app_name_suffixed", "Eden Debug Release") + } + variant.flavorName == "genshinSpoof" && variant.buildType.name == "relWithDebInfo" -> { + variant.resValue("string", "app_name_suffixed", "Eden Optimized Debug Release") + } + } + } + android { flavorDimensions.add("version") productFlavors { create("mainline") { dimension = "version" - // No need to set applicationId here + resValue("string", "app_name_suffixed", "Eden") } create("genshinSpoof") { dimension = "version" - resValue("string", "app_name_suffixed", "Eden Optimised") + resValue("string", "app_name_suffixed", "Eden Optimized") applicationId = "com.miHoYo.Yuanshen" } + + create("legacy") { + dimension = "version" + resValue("string", "app_name_suffixed", "Eden Legacy") + applicationId = "dev.legacy.eden_emulator" + + externalNativeBuild { + cmake { + arguments.add("-DYUZU_LEGACY=ON") + } + } + + sourceSets { + getByName("legacy") { + res.srcDirs("src/main/legacy") + } + } + } } } @@ -162,26 +226,6 @@ android { path = file("../../../CMakeLists.txt") } } - - defaultConfig { - externalNativeBuild { - cmake { - arguments( - "-DENABLE_QT=0", // Don't use QT - "-DENABLE_SDL2=0", // Don't use SDL - "-DENABLE_WEB_SERVICE=1", // Enable web service - "-DENABLE_OPENSSL=ON", - "-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work - "-DYUZU_USE_CPM=ON", - "-DYUZU_USE_BUNDLED_FFMPEG=ON", - "-DYUZU_ENABLE_LTO=ON", - "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON" - ) - - abiFilters("arm64-v8a") - } - } - } } tasks.register("ktlintReset", fun Delete.() { diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index d31deaa355..45c5dfef8c 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -27,6 +27,8 @@ SPDX-License-Identifier: GPL-3.0-or-later + + @@ -93,6 +95,10 @@ SPDX-License-Identifier: GPL-3.0-or-later + + + + + when (event.action) { + MotionEvent.ACTION_DOWN -> { + touchDownTime = System.currentTimeMillis() + // show overlay immediately on touch and cancel timer + if (!emulationViewModel.drawerOpen.value) { + fragment.handler.removeCallbacksAndMessages(null) + fragment.showOverlay() + } + } + MotionEvent.ACTION_UP -> { + if (!emulationViewModel.drawerOpen.value) { + val touchDuration = System.currentTimeMillis() - touchDownTime + + if (touchDuration <= maxTapDuration) { + fragment.handleScreenTap(false) + } else { + // just start the auto-hide timer without toggling visibility + fragment.handleScreenTap(true) + } + } + } + } + } + + return super.dispatchTouchEvent(event) + } + fun onEmulationStarted() { emulationViewModel.setEmulationStarted(true) } @@ -511,6 +559,12 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener { companion object { const val EXTRA_SELECTED_GAME = "SelectedGame" + fun stopForegroundService(activity: Activity) { + val startIntent = Intent(activity, ForegroundService::class.java) + startIntent.action = ForegroundService.ACTION_STOP + activity.startForegroundService(startIntent) + } + fun launch(activity: AppCompatActivity, game: Game) { val launcher = Intent(activity, EmulationActivity::class.java) launcher.putExtra(EXTRA_SELECTED_GAME, game) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt index 11b81a01a6..9ea2a9ee17 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/GameAdapter.kt @@ -36,14 +36,18 @@ import androidx.core.net.toUri import androidx.core.content.edit import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.yuzu.yuzu_emu.NativeLibrary +import org.yuzu.yuzu_emu.databinding.CardGameGridCompactBinding +import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting +import org.yuzu.yuzu_emu.features.settings.model.Settings class GameAdapter(private val activity: AppCompatActivity) : AbstractDiffAdapter(exact = false) { companion object { const val VIEW_TYPE_GRID = 0 - const val VIEW_TYPE_LIST = 1 - const val VIEW_TYPE_CAROUSEL = 2 + const val VIEW_TYPE_GRID_COMPACT = 1 + const val VIEW_TYPE_LIST = 2 + const val VIEW_TYPE_CAROUSEL = 3 } private var viewType = 0 @@ -77,6 +81,7 @@ class GameAdapter(private val activity: AppCompatActivity) : listBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT listBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT } + VIEW_TYPE_GRID -> { val gridBinding = holder.binding as CardGameGridBinding gridBinding.cardGameGrid.scaleX = 1f @@ -86,6 +91,17 @@ class GameAdapter(private val activity: AppCompatActivity) : gridBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT gridBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT } + + VIEW_TYPE_GRID_COMPACT -> { + val gridCompactBinding = holder.binding as CardGameGridCompactBinding + gridCompactBinding.cardGameGridCompact.scaleX = 1f + gridCompactBinding.cardGameGridCompact.scaleY = 1f + gridCompactBinding.cardGameGridCompact.alpha = 1f + // Reset layout params to XML defaults (same as normal grid) + gridCompactBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT + gridCompactBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT + } + VIEW_TYPE_CAROUSEL -> { val carouselBinding = holder.binding as CardGameCarouselBinding // soothens transient flickering @@ -102,16 +118,25 @@ class GameAdapter(private val activity: AppCompatActivity) : parent, false ) + VIEW_TYPE_GRID -> CardGameGridBinding.inflate( LayoutInflater.from(parent.context), parent, false ) + + VIEW_TYPE_GRID_COMPACT -> CardGameGridCompactBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + VIEW_TYPE_CAROUSEL -> CardGameCarouselBinding.inflate( LayoutInflater.from(parent.context), parent, false ) + else -> throw IllegalArgumentException("Invalid view type") } return GameViewHolder(binding, viewType) @@ -127,6 +152,7 @@ class GameAdapter(private val activity: AppCompatActivity) : VIEW_TYPE_LIST -> bindListView(model) VIEW_TYPE_GRID -> bindGridView(model) VIEW_TYPE_CAROUSEL -> bindCarouselView(model) + VIEW_TYPE_GRID_COMPACT -> bindGridCompactView(model) } } @@ -165,6 +191,23 @@ class GameAdapter(private val activity: AppCompatActivity) : gridBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT } + private fun bindGridCompactView(model: Game) { + val gridCompactBinding = binding as CardGameGridCompactBinding + + gridCompactBinding.imageGameScreenCompact.scaleType = ImageView.ScaleType.CENTER_CROP + GameIconUtils.loadGameIcon(model, gridCompactBinding.imageGameScreenCompact) + + gridCompactBinding.textGameTitleCompact.text = model.title.replace("[\\t\\n\\r]+".toRegex(), " ") + + gridCompactBinding.textGameTitleCompact.marquee() + gridCompactBinding.cardGameGridCompact.setOnClickListener { onClick(model) } + gridCompactBinding.cardGameGridCompact.setOnLongClickListener { onLongClick(model) } + + // Reset layout params to XML defaults (same as normal grid) + gridCompactBinding.root.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT + gridCompactBinding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT + } + private fun bindCarouselView(model: Game) { val carouselBinding = binding as CardGameCarouselBinding diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 21a159676d..b26fb1dec5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -18,6 +18,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { USE_FAST_CPU_TIME("use_fast_cpu_time"), USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), + CPUOPT_UNSAFE_HOST_MMU("cpuopt_unsafe_host_mmu"), USE_DOCKED_MODE("use_docked_mode"), USE_AUTO_STUB("use_auto_stub"), RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"), @@ -50,10 +51,11 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { SOC_OVERLAY_BACKGROUND("soc_overlay_background"), - ENABLE_RAII("enable_raii"), FRAME_INTERPOLATION("frame_interpolation"), // FRAME_SKIPPING("frame_skipping"), + ENABLE_INPUT_OVERLAY_AUTO_HIDE("enable_input_overlay_auto_hide"), + PERF_OVERLAY_BACKGROUND("perf_overlay_background"), SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"), @@ -65,10 +67,9 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { SHOW_POWER_INFO("show_power_info"), SHOW_SHADERS_BUILDING("show_shaders_building"), - DEBUG_FLUSH_BY_LINE("flush_lines"), + DEBUG_FLUSH_BY_LINE("flush_line"), USE_LRU_CACHE("use_lru_cache"); - external fun isRaiiEnabled(): Boolean // external fun isFrameSkippingEnabled(): Boolean external fun isFrameInterpolationEnabled(): Boolean diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt index 21aad8b5d1..d5556a337b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt @@ -59,7 +59,8 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { OFFLINE_WEB_APPLET("offline_web_applet_mode"), LOGIN_SHARE_APPLET("login_share_applet_mode"), WIFI_WEB_AUTH_APPLET("wifi_web_auth_applet_mode"), - MY_PAGE_APPLET("my_page_applet_mode") + MY_PAGE_APPLET("my_page_applet_mode"), + INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide") ; override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index a52f582031..454d0e4807 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -12,6 +12,7 @@ object Settings { SECTION_SYSTEM(R.string.preferences_system), SECTION_RENDERER(R.string.preferences_graphics), SECTION_PERFORMANCE_STATS(R.string.stats_overlay_options), + SECTION_INPUT_OVERLAY(R.string.input_overlay_options), SECTION_SOC_OVERLAY(R.string.soc_overlay_options), SECTION_AUDIO(R.string.preferences_audio), SECTION_INPUT(R.string.preferences_controls), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 062038aa44..ebc726225a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -96,6 +96,7 @@ abstract class SettingsItem( const val TYPE_INT_SINGLE_CHOICE = 9 const val TYPE_INPUT_PROFILE = 10 const val TYPE_STRING_INPUT = 11 + const val TYPE_SPINBOX = 12 const val FASTMEM_COMBINED = "fastmem_combined" @@ -228,13 +229,6 @@ abstract class SettingsItem( override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset() } - put( - SwitchSetting( - BooleanSetting.ENABLE_RAII, - titleId = R.string.enable_raii, - descriptionId = R.string.enable_raii_description - ) - ) put( SwitchSetting( BooleanSetting.FRAME_INTERPOLATION, @@ -297,7 +291,6 @@ abstract class SettingsItem( descriptionId = R.string.use_custom_rtc_description ) ) - put( StringInputSetting( StringSetting.WEB_TOKEN, @@ -386,6 +379,22 @@ abstract class SettingsItem( warningMessage = R.string.warning_resolution ) ) + put( + SwitchSetting( + BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE, + titleId = R.string.enable_input_overlay_auto_hide, + ) + ) + put( + SpinBoxSetting( + IntSetting.INPUT_OVERLAY_AUTO_HIDE, + titleId = R.string.overlay_auto_hide, + descriptionId = R.string.overlay_auto_hide_description, + min = 1, + max = 999, + valueHint = R.string.seconds + ) + ) put( SwitchSetting( @@ -673,6 +682,13 @@ abstract class SettingsItem( descriptionId = R.string.skip_cpu_inner_invalidation_description ) ) + put( + SwitchSetting( + BooleanSetting.CPUOPT_UNSAFE_HOST_MMU, + titleId = R.string.cpuopt_unsafe_host_mmu, + descriptionId = R.string.cpuopt_unsafe_host_mmu_description + ) + ) put( SwitchSetting( BooleanSetting.RENDERER_REACTIVE_FLUSHING, @@ -810,3 +826,4 @@ abstract class SettingsItem( } } } + diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SpinBoxSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SpinBoxSetting.kt new file mode 100644 index 0000000000..0b0d01dfe0 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SpinBoxSetting.kt @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model.view + +import androidx.annotation.StringRes +import org.yuzu.yuzu_emu.features.settings.model.AbstractByteSetting +import org.yuzu.yuzu_emu.features.settings.model.AbstractFloatSetting +import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting +import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting +import org.yuzu.yuzu_emu.features.settings.model.AbstractShortSetting + +class SpinBoxSetting( + setting: AbstractSetting, + @StringRes titleId: Int = 0, + titleString: String = "", + @StringRes descriptionId: Int = 0, + descriptionString: String = "", + val valueHint: Int, + val min: Int, + val max: Int +) : SettingsItem(setting, titleId, titleString, descriptionId, descriptionString) { + override val type = TYPE_SPINBOX + + fun getSelectedValue(needsGlobal: Boolean = false) = + when (setting) { + is AbstractByteSetting -> setting.getByte(needsGlobal).toInt() + is AbstractShortSetting -> setting.getShort(needsGlobal).toInt() + is AbstractIntSetting -> setting.getInt(needsGlobal) + is AbstractFloatSetting -> setting.getFloat(needsGlobal).toInt() + else -> 0 + } + + fun setSelectedValue(value: Int) = + when (setting) { + is AbstractByteSetting -> setting.setByte(value.toByte()) + is AbstractShortSetting -> setting.setShort(value.toShort()) + is AbstractFloatSetting -> setting.setFloat(value.toFloat()) + else -> (setting as AbstractIntSetting).setInt(value) + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt index 500ac6e66e..bdc51b7070 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.features.settings.ui @@ -61,6 +61,10 @@ class SettingsAdapter( SliderViewHolder(ListItemSettingBinding.inflate(inflater), this) } + SettingsItem.TYPE_SPINBOX -> { + SpinBoxViewHolder(ListItemSettingBinding.inflate(inflater), this) + } + SettingsItem.TYPE_SUBMENU -> { SubmenuViewHolder(ListItemSettingBinding.inflate(inflater), this) } @@ -191,6 +195,14 @@ class SettingsAdapter( position ).show(fragment.childFragmentManager, SettingsDialogFragment.TAG) } + fun onSpinBoxClick(item: SpinBoxSetting, position: Int) { + SettingsDialogFragment.newInstance( + settingsViewModel, + item, + SettingsItem.TYPE_SPINBOX, + position + ).show(fragment.childFragmentManager, SettingsDialogFragment.TAG) + } fun onSubmenuClick(item: SubmenuSetting) { val action = SettingsNavigationDirections.actionGlobalSettingsFragment(item.menuKey, null) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt index dc9f561eca..2a97f15892 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -14,6 +14,7 @@ import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels @@ -22,6 +23,7 @@ import com.google.android.material.slider.Slider import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.databinding.DialogEditTextBinding import org.yuzu.yuzu_emu.databinding.DialogSliderBinding +import org.yuzu.yuzu_emu.databinding.DialogSpinboxBinding import org.yuzu.yuzu_emu.features.input.NativeInput import org.yuzu.yuzu_emu.features.input.model.AnalogDirection import org.yuzu.yuzu_emu.features.settings.model.view.AnalogInputSetting @@ -30,6 +32,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.IntSingleChoiceSetting import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting +import org.yuzu.yuzu_emu.features.settings.model.view.SpinBoxSetting import org.yuzu.yuzu_emu.features.settings.model.view.StringInputSetting import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting import org.yuzu.yuzu_emu.utils.ParamPackage @@ -46,6 +49,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener private lateinit var sliderBinding: DialogSliderBinding private lateinit var stringInputBinding: DialogEditTextBinding + private lateinit var spinboxBinding: DialogSpinboxBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -142,6 +146,76 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener .create() } + SettingsItem.TYPE_SPINBOX -> { + spinboxBinding = DialogSpinboxBinding.inflate(layoutInflater) + val item = settingsViewModel.clickedItem as SpinBoxSetting + + val currentValue = item.getSelectedValue() + spinboxBinding.editValue.setText(currentValue.toString()) + spinboxBinding.textInputLayout.hint = getString(item.valueHint) + + val dialog = MaterialAlertDialogBuilder(requireContext()) + .setTitle(item.title) + .setView(spinboxBinding.root) + .setPositiveButton(android.R.string.ok, this) + .setNegativeButton(android.R.string.cancel, defaultCancelListener) + .create() + + val updateButtonState = { enabled: Boolean -> + dialog.setOnShowListener { dialogInterface -> + (dialogInterface as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)?.isEnabled = enabled + } + if (dialog.isShowing) { + dialog.getButton(DialogInterface.BUTTON_POSITIVE)?.isEnabled = enabled + } + } + + val updateValidity = { value: Int -> + val isValid = value in item.min..item.max + if (isValid) { + spinboxBinding.textInputLayout.error = null + } else { + spinboxBinding.textInputLayout.error = getString( + if (value < item.min) R.string.value_too_low else R.string.value_too_high, + if (value < item.min) item.min else item.max + ) + } + updateButtonState(isValid) + } + + spinboxBinding.buttonDecrement.setOnClickListener { + val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue + val newValue = current - 1 + spinboxBinding.editValue.setText(newValue.toString()) + updateValidity(newValue) + } + + spinboxBinding.buttonIncrement.setOnClickListener { + val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue + val newValue = current + 1 + spinboxBinding.editValue.setText(newValue.toString()) + updateValidity(newValue) + } + + spinboxBinding.editValue.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + val value = s.toString().toIntOrNull() + if (value != null) { + updateValidity(value) + } else { + spinboxBinding.textInputLayout.error = getString(R.string.invalid_value) + updateButtonState(false) + } + } + }) + + updateValidity(currentValue) + + dialog + } + SettingsItem.TYPE_STRING_INPUT -> { stringInputBinding = DialogEditTextBinding.inflate(layoutInflater) val item = settingsViewModel.clickedItem as StringInputSetting @@ -281,6 +355,14 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value) } + is SpinBoxSetting -> { + val spinBoxSetting = settingsViewModel.clickedItem as SpinBoxSetting + val value = spinboxBinding.editValue.text.toString().toIntOrNull() + if (value != null && value in spinBoxSetting.min..spinBoxSetting.max) { + spinBoxSetting.setSelectedValue(value) + } + } + is StringInputSetting -> { val stringInputSetting = settingsViewModel.clickedItem as StringInputSetting stringInputSetting.setSelectedValue( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 672bcd492c..0d882a7f01 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -97,6 +97,7 @@ class SettingsFragmentPresenter( MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl) MenuTag.SECTION_PERFORMANCE_STATS -> addPerformanceOverlaySettings(sl) MenuTag.SECTION_SOC_OVERLAY -> addSocOverlaySettings(sl) + MenuTag.SECTION_INPUT_OVERLAY -> addInputOverlaySettings(sl) MenuTag.SECTION_AUDIO -> addAudioSettings(sl) MenuTag.SECTION_INPUT -> addInputSettings(sl) MenuTag.SECTION_INPUT_PLAYER_ONE -> addInputPlayer(sl, 0) @@ -156,6 +157,14 @@ class SettingsFragmentPresenter( menuKey = MenuTag.SECTION_SOC_OVERLAY ) ) + add( + SubmenuSetting( + titleId = R.string.input_overlay_options, + iconId = R.drawable.ic_controller, + descriptionId = R.string.input_overlay_options_description, + menuKey = MenuTag.SECTION_INPUT_OVERLAY + ) + ) } add( SubmenuSetting( @@ -264,6 +273,13 @@ class SettingsFragmentPresenter( } } + private fun addInputOverlaySettings(sl: ArrayList) { + sl.apply { + add(BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.key) + add(IntSetting.INPUT_OVERLAY_AUTO_HIDE.key) + } + } + private fun addSocOverlaySettings(sl: ArrayList) { sl.apply { add(HeaderSetting(R.string.stats_overlay_customization)) @@ -446,7 +462,6 @@ class SettingsFragmentPresenter( add(IntSetting.RENDERER_SAMPLE_SHADING_FRACTION.key) add(HeaderSetting(R.string.veil_renderer)) - add(BooleanSetting.ENABLE_RAII.key) add(BooleanSetting.RENDERER_EARLY_RELEASE_FENCES.key) add(IntSetting.DMA_ACCURACY.key) add(BooleanSetting.BUFFER_REORDER_DISABLE.key) @@ -466,6 +481,7 @@ class SettingsFragmentPresenter( add(BooleanSetting.USE_CUSTOM_CPU_TICKS.key) add(IntSetting.CPU_TICKS.key) add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) + add(BooleanSetting.CPUOPT_UNSAFE_HOST_MMU.key) add(BooleanSetting.USE_LRU_CACHE.key) add(BooleanSetting.CORE_SYNC_CORE_SPEED.key) add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SpinBoxViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SpinBoxViewHolder.kt new file mode 100644 index 0000000000..1f9a16b798 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/SpinBoxViewHolder.kt @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.ui.viewholder + +import android.view.View +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding +import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem +import org.yuzu.yuzu_emu.features.settings.model.view.SpinBoxSetting +import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter +import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible + +class SpinBoxViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : + SettingViewHolder(binding.root, adapter) { + private lateinit var setting: SpinBoxSetting + + override fun bind(item: SettingsItem) { + setting = item as SpinBoxSetting + binding.textSettingName.text = setting.title + binding.textSettingDescription.setVisible(item.description.isNotEmpty()) + binding.textSettingDescription.text = setting.description + binding.textSettingValue.setVisible(true) + binding.textSettingValue.text = setting.getSelectedValue().toString() + + binding.buttonClear.setVisible(setting.clearable) + binding.buttonClear.setOnClickListener { + adapter.onClearClick(setting, bindingAdapterPosition) + } + + setStyle(setting.isEditable, binding) + } + override fun onClick(clicked: View) { + if (setting.isEditable) { + adapter.onSpinBoxClick(setting, bindingAdapterPosition) + } + } + override fun onLongClick(clicked: View): Boolean { + if (setting.isEditable) { + return adapter.onLongClick(setting, bindingAdapterPosition) + } + return false + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt index b8d0f2197e..dea762dc17 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt @@ -79,7 +79,7 @@ class DriverFetcherFragment : Fragment() { IntRange(600, 639) to "Mr. Purple EOL-24.3.4", IntRange(640, 699) to "Mr. Purple T19", IntRange(700, 710) to "KIMCHI 25.2.0_r5", - IntRange(711, 799) to "Mr. Purple T21", + IntRange(711, 799) to "Mr. Purple T22", IntRange(800, 899) to "GameHub Adreno 8xx", IntRange(900, Int.MAX_VALUE) to "Unsupported" ) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 96015e58ec..b2d6135372 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -96,6 +96,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private var perfStatsUpdater: (() -> Unit)? = null private var socUpdater: (() -> Unit)? = null + val handler = Handler(Looper.getMainLooper()) + private var isOverlayVisible = true + private var _binding: FragmentEmulationBinding? = null private val binding get() = _binding!! @@ -452,7 +455,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { /** * Ask user if they want to launch with default settings when custom settings fail */ - private suspend fun askUserToLaunchWithDefaultSettings(gameTitle: String, errorMessage: String): Boolean { + private suspend fun askUserToLaunchWithDefaultSettings( + gameTitle: String, + errorMessage: String + ): Boolean { return suspendCoroutine { continuation -> requireActivity().runOnUiThread { MaterialAlertDialogBuilder(requireContext()) @@ -509,6 +515,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { gpuModel = GpuDriverHelper.getGpuModel().toString() fwVersion = NativeLibrary.firmwareVersion() + updateQuickOverlayMenuEntry(BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) + binding.surfaceEmulation.holder.addCallback(this) binding.doneControlConfig.setOnClickListener { stopConfiguringControls() } @@ -530,6 +538,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) binding.inGameMenu.requestFocus() emulationViewModel.setDrawerOpen(true) + updateQuickOverlayMenuEntry(BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) } override fun onDrawerClosed(drawerView: View) { @@ -571,25 +580,24 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.id.menu_pause_emulation -> { if (emulationState.isPaused) { emulationState.run(false) - it.title = resources.getString(R.string.emulation_pause) - it.icon = ResourcesCompat.getDrawable( - resources, - R.drawable.ic_pause, - requireContext().theme - ) + updatePauseMenuEntry(false) } else { emulationState.pause() - it.title = resources.getString(R.string.emulation_unpause) - it.icon = ResourcesCompat.getDrawable( - resources, - R.drawable.ic_play, - requireContext().theme - ) + updatePauseMenuEntry(true) } binding.inGameMenu.requestFocus() true } + R.id.menu_quick_overlay -> { + val newState = !BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() + BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(newState) + updateQuickOverlayMenuEntry(newState) + binding.surfaceInputOverlay.refreshControls() + NativeConfig.saveGlobalConfig() + true + } + R.id.menu_settings -> { val action = HomeNavigationDirections.actionGlobalSettingsActivity( null, @@ -726,6 +734,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { updateShowStatsOverlay() updateSocOverlay() + initializeOverlayAutoHide() + // Re update binding when the specs values get initialized properly binding.inGameMenu.getHeaderView(0).apply { val titleView = findViewById(R.id.text_game_title) @@ -808,28 +818,26 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - if (_binding == null) { - return - } + val b = _binding ?: return updateScreenLayout() val showInputOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() if (emulationActivity?.isInPictureInPictureMode == true) { - if (binding.drawerLayout.isOpen) { - binding.drawerLayout.close() + if (b.drawerLayout.isOpen) { + b.drawerLayout.close() } if (showInputOverlay) { - binding.surfaceInputOverlay.setVisible(visible = false, gone = false) + b.surfaceInputOverlay.setVisible(visible = false, gone = false) } } else { - binding.surfaceInputOverlay.setVisible( + b.surfaceInputOverlay.setVisible( showInputOverlay && emulationViewModel.emulationStarted.value ) if (!isInFoldableLayout) { if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - binding.surfaceInputOverlay.layout = OverlayLayout.Portrait + b.surfaceInputOverlay.layout = OverlayLayout.Portrait } else { - binding.surfaceInputOverlay.layout = OverlayLayout.Landscape + b.surfaceInputOverlay.layout = OverlayLayout.Landscape } } } @@ -844,9 +852,53 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + private fun updateQuickOverlayMenuEntry(isVisible: Boolean) { + val b = _binding ?: return + val item = b.inGameMenu.menu.findItem(R.id.menu_quick_overlay) ?: return + + if (isVisible) { + item.title = getString(R.string.emulation_hide_overlay) + item.icon = ResourcesCompat.getDrawable( + resources, + R.drawable.ic_controller_disconnected, + requireContext().theme + ) + } else { + item.title = getString(R.string.emulation_show_overlay) + item.icon = ResourcesCompat.getDrawable( + resources, + R.drawable.ic_controller, + requireContext().theme + ) + } + } + + private fun updatePauseMenuEntry(isPaused: Boolean) { + val b = _binding ?: return + val pauseItem = b.inGameMenu.menu.findItem(R.id.menu_pause_emulation) ?: return + if (isPaused) { + pauseItem.title = getString(R.string.emulation_unpause) + pauseItem.icon = ResourcesCompat.getDrawable( + resources, + R.drawable.ic_play, + requireContext().theme + ) + } else { + pauseItem.title = getString(R.string.emulation_pause) + pauseItem.icon = ResourcesCompat.getDrawable( + resources, + R.drawable.ic_pause, + requireContext().theme + ) + } + } + override fun onPause() { - if (emulationState.isRunning && emulationActivity?.isInPictureInPictureMode != true) { - emulationState.pause() + if (this::emulationState.isInitialized) { + if (emulationState.isRunning && emulationActivity?.isInPictureInPictureMode != true) { + emulationState.pause() + updatePauseMenuEntry(true) + } } super.onPause() } @@ -863,12 +915,21 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { override fun onResume() { super.onResume() - // If the overlay is enabled, we need to update the position if changed - val position = IntSetting.PERF_OVERLAY_POSITION.getInt() - updateStatsPosition(position) + val b = _binding ?: return + updateStatsPosition(IntSetting.PERF_OVERLAY_POSITION.getInt()) + updateSocPosition(IntSetting.SOC_OVERLAY_POSITION.getInt()) + + if (this::emulationState.isInitialized) { + b.inGameMenu.post { + if (!this::emulationState.isInitialized || _binding == null) return@post + updatePauseMenuEntry(emulationState.isPaused) + } + } + + // if the overlay auto-hide setting is changed while paused, + // we need to reinitialize the auto-hide timer + initializeOverlayAutoHide() - val socPosition = IntSetting.SOC_OVERLAY_POSITION.getInt() - updateSocPosition(socPosition) } private fun resetInputOverlay() { @@ -876,6 +937,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { IntSetting.OVERLAY_OPACITY.reset() binding.surfaceInputOverlay.post { binding.surfaceInputOverlay.resetLayoutVisibilityAndPlacement() + binding.surfaceInputOverlay.resetIndividualControlScale() } } @@ -986,7 +1048,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val status = batteryIntent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || - status == BatteryManager.BATTERY_STATUS_FULL + status == BatteryManager.BATTERY_STATUS_FULL if (isCharging) { sb.append(" ${getString(R.string.charging)}") @@ -1182,6 +1244,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } private fun updateScreenLayout() { + val b = _binding ?: return val verticalAlignment = EmulationVerticalAlignment.from(IntSetting.VERTICAL_ALIGNMENT.getInt()) val aspectRatio = when (IntSetting.RENDERER_ASPECT_RATIO.getInt()) { @@ -1193,35 +1256,37 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } when (verticalAlignment) { EmulationVerticalAlignment.Top -> { - binding.surfaceEmulation.setAspectRatio(aspectRatio) + b.surfaceEmulation.setAspectRatio(aspectRatio) val params = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ) params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL - binding.surfaceEmulation.layoutParams = params + b.surfaceEmulation.layoutParams = params } EmulationVerticalAlignment.Center -> { - binding.surfaceEmulation.setAspectRatio(null) - binding.surfaceEmulation.updateLayoutParams { + b.surfaceEmulation.setAspectRatio(null) + b.surfaceEmulation.updateLayoutParams { width = ViewGroup.LayoutParams.MATCH_PARENT height = ViewGroup.LayoutParams.MATCH_PARENT } } EmulationVerticalAlignment.Bottom -> { - binding.surfaceEmulation.setAspectRatio(aspectRatio) + b.surfaceEmulation.setAspectRatio(aspectRatio) val params = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ) params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL - binding.surfaceEmulation.layoutParams = params + b.surfaceEmulation.layoutParams = params } } - emulationState.updateSurface() + if (this::emulationState.isInitialized) { + emulationState.updateSurface() + } emulationActivity?.buildPictureInPictureParams() updateOrientation() } @@ -1391,6 +1456,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.id.menu_show_overlay -> { it.isChecked = !it.isChecked BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(it.isChecked) + updateQuickOverlayMenuEntry(it.isChecked) binding.surfaceInputOverlay.refreshControls() true } @@ -1494,6 +1560,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { .setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int -> setControlScale(50) setControlOpacity(100) + binding.surfaceInputOverlay.resetIndividualControlScale() } .show() } @@ -1674,4 +1741,61 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!) private val socUpdateHandler = Handler(Looper.myLooper()!!) } + + private fun startOverlayAutoHideTimer(seconds: Int) { + handler.removeCallbacksAndMessages(null) + + handler.postDelayed({ + if (isOverlayVisible) { + hideOverlay() + } + }, seconds * 1000L) + } + + fun handleScreenTap(isLongTap: Boolean) { + val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt() + val shouldProceed = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() && BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() + + if (!shouldProceed) { + return + } + + // failsafe + if (autoHideSeconds == 0) { + showOverlay() + return + } + + if (!isOverlayVisible && !isLongTap) { + showOverlay() + } + + startOverlayAutoHideTimer(autoHideSeconds) + } + + private fun initializeOverlayAutoHide() { + val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt() + val autoHideEnabled = BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() + val showOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() + + if (autoHideEnabled && showOverlay) { + showOverlay() + startOverlayAutoHideTimer(autoHideSeconds) + } + } + + + fun showOverlay() { + if (!isOverlayVisible) { + isOverlayVisible = true + ViewUtils.showView(binding.surfaceInputOverlay, 500) + } + } + + private fun hideOverlay() { + if (isOverlayVisible) { + isOverlayVisible = false + ViewUtils.hideView(binding.surfaceInputOverlay, 500) + } + } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt index 97a60ee184..a06abb394f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/HomeViewModel.kt @@ -31,9 +31,6 @@ class HomeViewModel : ViewModel() { private val _checkKeys = MutableStateFlow(false) val checkKeys = _checkKeys.asStateFlow() - private val _checkFirmware = MutableStateFlow(false) - val checkFirmware = _checkFirmware.asStateFlow() - var navigatedToSetup = false fun setStatusBarShadeVisibility(visible: Boolean) { @@ -66,8 +63,4 @@ class HomeViewModel : ViewModel() { fun setCheckKeys(value: Boolean) { _checkKeys.value = value } - - fun setCheckFirmware(value: Boolean) { - _checkFirmware.value = value - } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt index 737e035840..9f050a5053 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.overlay @@ -13,6 +13,8 @@ import android.graphics.Rect import android.graphics.drawable.Drawable import android.graphics.drawable.VectorDrawable import android.os.Build +import android.os.Handler +import android.os.Looper import android.util.AttributeSet import android.view.HapticFeedbackConstants import android.view.MotionEvent @@ -52,6 +54,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : private var dpadBeingConfigured: InputOverlayDrawableDpad? = null private var joystickBeingConfigured: InputOverlayDrawableJoystick? = null + private var scaleDialog: OverlayScaleDialog? = null + private var touchStartX = 0f + private var touchStartY = 0f + private var hasMoved = false + private val moveThreshold = 20f + private lateinit var windowInsets: WindowInsets var layout = OverlayLayout.Landscape @@ -254,23 +262,44 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : ) { buttonBeingConfigured = button buttonBeingConfigured!!.onConfigureTouch(event) + touchStartX = event.getX(pointerIndex) + touchStartY = event.getY(pointerIndex) + hasMoved = false } MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) { - buttonBeingConfigured!!.onConfigureTouch(event) - invalidate() - return true + val moveDistance = kotlin.math.sqrt( + (event.getX(pointerIndex) - touchStartX).let { it * it } + + (event.getY(pointerIndex) - touchStartY).let { it * it } + ) + + if (moveDistance > moveThreshold) { + hasMoved = true + buttonBeingConfigured!!.onConfigureTouch(event) + invalidate() + return true + } } MotionEvent.ACTION_UP, MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) { - // Persist button position by saving new place. - saveControlPosition( - buttonBeingConfigured!!.overlayControlData.id, - buttonBeingConfigured!!.bounds.centerX(), - buttonBeingConfigured!!.bounds.centerY(), - layout - ) + if (!hasMoved) { + showScaleDialog( + buttonBeingConfigured, + null, + null, + fingerPositionX, + fingerPositionY + ) + } else { + saveControlPosition( + buttonBeingConfigured!!.overlayControlData.id, + buttonBeingConfigured!!.bounds.centerX(), + buttonBeingConfigured!!.bounds.centerY(), + individuaScale = buttonBeingConfigured!!.overlayControlData.individualScale, + layout + ) + } buttonBeingConfigured = null } } @@ -287,23 +316,46 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : ) { dpadBeingConfigured = dpad dpadBeingConfigured!!.onConfigureTouch(event) + touchStartX = event.getX(pointerIndex) + touchStartY = event.getY(pointerIndex) + hasMoved = false } MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) { - dpadBeingConfigured!!.onConfigureTouch(event) - invalidate() - return true + val moveDistance = kotlin.math.sqrt( + (event.getX(pointerIndex) - touchStartX).let { it * it } + + (event.getY(pointerIndex) - touchStartY).let { it * it } + ) + + if (moveDistance > moveThreshold) { + hasMoved = true + dpadBeingConfigured!!.onConfigureTouch(event) + invalidate() + return true + } } MotionEvent.ACTION_UP, MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) { - // Persist button position by saving new place. - saveControlPosition( - OverlayControl.COMBINED_DPAD.id, - dpadBeingConfigured!!.bounds.centerX(), - dpadBeingConfigured!!.bounds.centerY(), - layout - ) + if (!hasMoved) { + // This was a click, show scale dialog for dpad + showScaleDialog( + null, + dpadBeingConfigured, + null, + fingerPositionX, + fingerPositionY + ) + } else { + // This was a move, save position + saveControlPosition( + OverlayControl.COMBINED_DPAD.id, + dpadBeingConfigured!!.bounds.centerX(), + dpadBeingConfigured!!.bounds.centerY(), + individuaScale = dpadBeingConfigured!!.individualScale, + layout + ) + } dpadBeingConfigured = null } } @@ -317,21 +369,43 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : ) { joystickBeingConfigured = joystick joystickBeingConfigured!!.onConfigureTouch(event) + touchStartX = event.getX(pointerIndex) + touchStartY = event.getY(pointerIndex) + hasMoved = false } MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) { - joystickBeingConfigured!!.onConfigureTouch(event) - invalidate() + val moveDistance = kotlin.math.sqrt( + (event.getX(pointerIndex) - touchStartX).let { it * it } + + (event.getY(pointerIndex) - touchStartY).let { it * it } + ) + + if (moveDistance > moveThreshold) { + hasMoved = true + joystickBeingConfigured!!.onConfigureTouch(event) + invalidate() + } } MotionEvent.ACTION_UP, MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) { - saveControlPosition( - joystickBeingConfigured!!.prefId, - joystickBeingConfigured!!.bounds.centerX(), - joystickBeingConfigured!!.bounds.centerY(), - layout - ) + if (!hasMoved) { + showScaleDialog( + null, + null, + joystickBeingConfigured, + fingerPositionX, + fingerPositionY + ) + } else { + saveControlPosition( + joystickBeingConfigured!!.prefId, + joystickBeingConfigured!!.bounds.centerX(), + joystickBeingConfigured!!.bounds.centerY(), + individuaScale = joystickBeingConfigured!!.individualScale, + layout + ) + } joystickBeingConfigured = null } } @@ -607,25 +681,117 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : invalidate() } - private fun saveControlPosition(id: String, x: Int, y: Int, layout: OverlayLayout) { + private fun saveControlPosition( + id: String, + x: Int, + y: Int, + individuaScale: Float, + layout: OverlayLayout + ) { val windowSize = getSafeScreenSize(context, Pair(measuredWidth, measuredHeight)) val min = windowSize.first val max = windowSize.second val overlayControlData = NativeConfig.getOverlayControlData() val data = overlayControlData.firstOrNull { it.id == id } val newPosition = Pair((x - min.x).toDouble() / max.x, (y - min.y).toDouble() / max.y) + when (layout) { OverlayLayout.Landscape -> data?.landscapePosition = newPosition OverlayLayout.Portrait -> data?.portraitPosition = newPosition OverlayLayout.Foldable -> data?.foldablePosition = newPosition + } + + data?.individualScale = individuaScale + NativeConfig.setOverlayControlData(overlayControlData) } fun setIsInEditMode(editMode: Boolean) { inEditMode = editMode + if (!editMode) { + scaleDialog?.dismiss() + scaleDialog = null + } } + private fun showScaleDialog( + button: InputOverlayDrawableButton?, + dpad: InputOverlayDrawableDpad?, + joystick: InputOverlayDrawableJoystick?, + x: Int, y: Int + ) { + val overlayControlData = NativeConfig.getOverlayControlData() + // prevent dialog from being spam opened + scaleDialog?.dismiss() + + + when { + button != null -> { + val buttonData = + overlayControlData.firstOrNull { it.id == button.overlayControlData.id } + if (buttonData != null) { + scaleDialog = + OverlayScaleDialog(context, button.overlayControlData) { newScale -> + saveControlPosition( + button.overlayControlData.id, + button.bounds.centerX(), + button.bounds.centerY(), + individuaScale = newScale, + layout + ) + refreshControls() + } + + scaleDialog?.showDialog(x,y, button.bounds.width(), button.bounds.height()) + + } + } + + dpad != null -> { + val dpadData = + overlayControlData.firstOrNull { it.id == OverlayControl.COMBINED_DPAD.id } + if (dpadData != null) { + scaleDialog = OverlayScaleDialog(context, dpadData) { newScale -> + saveControlPosition( + OverlayControl.COMBINED_DPAD.id, + dpad.bounds.centerX(), + dpad.bounds.centerY(), + newScale, + layout + ) + + refreshControls() + } + + scaleDialog?.showDialog(x,y, dpad.bounds.width(), dpad.bounds.height()) + + } + } + + joystick != null -> { + val joystickData = overlayControlData.firstOrNull { it.id == joystick.prefId } + if (joystickData != null) { + scaleDialog = OverlayScaleDialog(context, joystickData) { newScale -> + saveControlPosition( + joystick.prefId, + joystick.bounds.centerX(), + joystick.bounds.centerY(), + individuaScale = newScale, + layout + ) + + refreshControls() + } + + scaleDialog?.showDialog(x,y, joystick.bounds.width(), joystick.bounds.height()) + + } + } + } + } + + /** * Applies and saves all default values for the overlay */ @@ -664,12 +830,24 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : val overlayControlData = NativeConfig.getOverlayControlData() overlayControlData.forEach { it.enabled = OverlayControl.from(it.id)?.defaultVisibility == true + it.individualScale = OverlayControl.from(it.id)?.defaultIndividualScaleResource!! } NativeConfig.setOverlayControlData(overlayControlData) refreshControls() } + fun resetIndividualControlScale() { + val overlayControlData = NativeConfig.getOverlayControlData() + overlayControlData.forEach { data -> + val defaultControlData = OverlayControl.from(data.id) ?: return@forEach + data.individualScale = defaultControlData.defaultIndividualScaleResource + } + NativeConfig.setOverlayControlData(overlayControlData) + NativeConfig.saveGlobalConfig() + refreshControls() + } + private fun defaultOverlayPositionByLayout(layout: OverlayLayout) { val overlayControlData = NativeConfig.getOverlayControlData() for (data in overlayControlData) { @@ -860,6 +1038,9 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat() scale /= 100f + // Apply individual scale + scale *= overlayControlData.individualScale + // Initialize the InputOverlayDrawableButton. val defaultStateBitmap = getBitmap(context, defaultResId, scale) val pressedStateBitmap = getBitmap(context, pressedResId, scale) @@ -922,11 +1103,20 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : // Resources handle for fetching the initial Drawable resource. val res = context.resources + // Get the dpad control data for individual scale + val overlayControlData = NativeConfig.getOverlayControlData() + val dpadData = overlayControlData.firstOrNull { it.id == OverlayControl.COMBINED_DPAD.id } + // Decide scale based on button ID and user preference var scale = 0.25f scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat() scale /= 100f + // Apply individual scale + if (dpadData != null) { + scale *= dpadData.individualScale + } + // Initialize the InputOverlayDrawableDpad. val defaultStateBitmap = getBitmap(context, defaultResId, scale) @@ -1000,6 +1190,9 @@ class InputOverlay(context: Context, attrs: AttributeSet?) : scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat() scale /= 100f + // Apply individual scale + scale *= overlayControlData.individualScale + // Initialize the InputOverlayDrawableJoystick. val bitmapOuter = getBitmap(context, resOuter, scale) val bitmapInnerDefault = getBitmap(context, defaultResInner, 1.0f) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableDpad.kt index 0cb6ff2440..01f07e4f36 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.overlay @@ -42,6 +42,8 @@ class InputOverlayDrawableDpad( val width: Int val height: Int + var individualScale: Float = 1.0f + private val defaultStateBitmap: BitmapDrawable private val pressedOneDirectionStateBitmap: BitmapDrawable private val pressedTwoDirectionsStateBitmap: BitmapDrawable diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableJoystick.kt index 4b07107fca..bc3ff15b21 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.overlay @@ -51,6 +51,8 @@ class InputOverlayDrawableJoystick( val width: Int val height: Int + var individualScale: Float = 1.0f + private var opacity: Int = 0 private var virtBounds: Rect diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/OverlayScaleDialog.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/OverlayScaleDialog.kt new file mode 100644 index 0000000000..f489ef3b7c --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/OverlayScaleDialog.kt @@ -0,0 +1,124 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.overlay + +import android.app.Dialog +import android.content.Context +import android.view.Gravity +import android.view.LayoutInflater +import android.view.WindowManager +import android.widget.TextView +import com.google.android.material.button.MaterialButton +import com.google.android.material.slider.Slider +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.overlay.model.OverlayControlData + +class OverlayScaleDialog( + context: Context, + private val overlayControlData: OverlayControlData, + private val onScaleChanged: (Float) -> Unit +) : Dialog(context) { + + private var currentScale = overlayControlData.individualScale + private val originalScale = overlayControlData.individualScale + private lateinit var scaleValueText: TextView + private lateinit var scaleSlider: Slider + + init { + setupDialog() + } + + private fun setupDialog() { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_overlay_scale, null) + setContentView(view) + + window?.setBackgroundDrawable(null) + + window?.apply { + attributes = attributes.apply { + flags = flags and WindowManager.LayoutParams.FLAG_DIM_BEHIND.inv() + flags = flags or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + } + } + + scaleValueText = view.findViewById(R.id.scaleValueText) + scaleSlider = view.findViewById(R.id.scaleSlider) + val resetButton = view.findViewById(R.id.resetButton) + val confirmButton = view.findViewById(R.id.confirmButton) + val cancelButton = view.findViewById(R.id.cancelButton) + + scaleValueText.text = String.format("%.1fx", currentScale) + scaleSlider.value = currentScale + + scaleSlider.addOnChangeListener { _, value, input -> + if (input) { + currentScale = value + scaleValueText.text = String.format("%.1fx", currentScale) + } + } + + scaleSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { + override fun onStartTrackingTouch(slider: Slider) { + // pass + } + + override fun onStopTrackingTouch(slider: Slider) { + onScaleChanged(currentScale) + } + }) + + resetButton.setOnClickListener { + currentScale = 1.0f + scaleSlider.value = 1.0f + scaleValueText.text = String.format("%.1fx", currentScale) + onScaleChanged(currentScale) + } + + confirmButton.setOnClickListener { + overlayControlData.individualScale = currentScale + //slider value is already saved on touch dispatch but just to be sure + onScaleChanged(currentScale) + dismiss() + } + + // both cancel button and back gesture should revert the scale change + cancelButton.setOnClickListener { + onScaleChanged(originalScale) + dismiss() + } + + setOnCancelListener { + onScaleChanged(originalScale) + dismiss() + } + } + + fun showDialog(anchorX: Int, anchorY: Int, anchorHeight: Int, anchorWidth: Int) { + show() + + show() + + // TODO: this calculation is a bit rough, improve it later on + window?.let { window -> + val layoutParams = window.attributes + layoutParams.gravity = Gravity.TOP or Gravity.START + + val density = context.resources.displayMetrics.density + val dialogWidthPx = (320 * density).toInt() + val dialogHeightPx = (400 * density).toInt() // set your estimated dialog height + + val screenHeight = context.resources.displayMetrics.heightPixels + + + layoutParams.x = anchorX + anchorWidth / 2 - dialogWidthPx / 2 + layoutParams.y = anchorY + anchorHeight / 2 - dialogHeightPx / 2 + layoutParams.width = dialogWidthPx + + + window.attributes = layoutParams + } + + } + +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControl.kt index a0eeadf4bc..10cc547d0b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControl.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.overlay.model @@ -12,126 +12,144 @@ enum class OverlayControl( val defaultVisibility: Boolean, @IntegerRes val defaultLandscapePositionResources: Pair, @IntegerRes val defaultPortraitPositionResources: Pair, - @IntegerRes val defaultFoldablePositionResources: Pair + @IntegerRes val defaultFoldablePositionResources: Pair, + val defaultIndividualScaleResource: Float, ) { BUTTON_A( "button_a", true, Pair(R.integer.BUTTON_A_X, R.integer.BUTTON_A_Y), Pair(R.integer.BUTTON_A_X_PORTRAIT, R.integer.BUTTON_A_Y_PORTRAIT), - Pair(R.integer.BUTTON_A_X_FOLDABLE, R.integer.BUTTON_A_Y_FOLDABLE) + Pair(R.integer.BUTTON_A_X_FOLDABLE, R.integer.BUTTON_A_Y_FOLDABLE), + 1.0f ), BUTTON_B( "button_b", true, Pair(R.integer.BUTTON_B_X, R.integer.BUTTON_B_Y), Pair(R.integer.BUTTON_B_X_PORTRAIT, R.integer.BUTTON_B_Y_PORTRAIT), - Pair(R.integer.BUTTON_B_X_FOLDABLE, R.integer.BUTTON_B_Y_FOLDABLE) + Pair(R.integer.BUTTON_B_X_FOLDABLE, R.integer.BUTTON_B_Y_FOLDABLE), + 1.0f ), BUTTON_X( "button_x", true, Pair(R.integer.BUTTON_X_X, R.integer.BUTTON_X_Y), Pair(R.integer.BUTTON_X_X_PORTRAIT, R.integer.BUTTON_X_Y_PORTRAIT), - Pair(R.integer.BUTTON_X_X_FOLDABLE, R.integer.BUTTON_X_Y_FOLDABLE) + Pair(R.integer.BUTTON_X_X_FOLDABLE, R.integer.BUTTON_X_Y_FOLDABLE), + 1.0f ), BUTTON_Y( "button_y", true, Pair(R.integer.BUTTON_Y_X, R.integer.BUTTON_Y_Y), Pair(R.integer.BUTTON_Y_X_PORTRAIT, R.integer.BUTTON_Y_Y_PORTRAIT), - Pair(R.integer.BUTTON_Y_X_FOLDABLE, R.integer.BUTTON_Y_Y_FOLDABLE) + Pair(R.integer.BUTTON_Y_X_FOLDABLE, R.integer.BUTTON_Y_Y_FOLDABLE), + 1.0f ), BUTTON_PLUS( "button_plus", true, Pair(R.integer.BUTTON_PLUS_X, R.integer.BUTTON_PLUS_Y), Pair(R.integer.BUTTON_PLUS_X_PORTRAIT, R.integer.BUTTON_PLUS_Y_PORTRAIT), - Pair(R.integer.BUTTON_PLUS_X_FOLDABLE, R.integer.BUTTON_PLUS_Y_FOLDABLE) + Pair(R.integer.BUTTON_PLUS_X_FOLDABLE, R.integer.BUTTON_PLUS_Y_FOLDABLE), + 1.0f ), BUTTON_MINUS( "button_minus", true, Pair(R.integer.BUTTON_MINUS_X, R.integer.BUTTON_MINUS_Y), Pair(R.integer.BUTTON_MINUS_X_PORTRAIT, R.integer.BUTTON_MINUS_Y_PORTRAIT), - Pair(R.integer.BUTTON_MINUS_X_FOLDABLE, R.integer.BUTTON_MINUS_Y_FOLDABLE) + Pair(R.integer.BUTTON_MINUS_X_FOLDABLE, R.integer.BUTTON_MINUS_Y_FOLDABLE), + 1.0f ), BUTTON_HOME( "button_home", false, Pair(R.integer.BUTTON_HOME_X, R.integer.BUTTON_HOME_Y), Pair(R.integer.BUTTON_HOME_X_PORTRAIT, R.integer.BUTTON_HOME_Y_PORTRAIT), - Pair(R.integer.BUTTON_HOME_X_FOLDABLE, R.integer.BUTTON_HOME_Y_FOLDABLE) + Pair(R.integer.BUTTON_HOME_X_FOLDABLE, R.integer.BUTTON_HOME_Y_FOLDABLE), + 1.0f ), BUTTON_CAPTURE( "button_capture", false, Pair(R.integer.BUTTON_CAPTURE_X, R.integer.BUTTON_CAPTURE_Y), Pair(R.integer.BUTTON_CAPTURE_X_PORTRAIT, R.integer.BUTTON_CAPTURE_Y_PORTRAIT), - Pair(R.integer.BUTTON_CAPTURE_X_FOLDABLE, R.integer.BUTTON_CAPTURE_Y_FOLDABLE) + Pair(R.integer.BUTTON_CAPTURE_X_FOLDABLE, R.integer.BUTTON_CAPTURE_Y_FOLDABLE), + 1.0f ), BUTTON_L( "button_l", true, Pair(R.integer.BUTTON_L_X, R.integer.BUTTON_L_Y), Pair(R.integer.BUTTON_L_X_PORTRAIT, R.integer.BUTTON_L_Y_PORTRAIT), - Pair(R.integer.BUTTON_L_X_FOLDABLE, R.integer.BUTTON_L_Y_FOLDABLE) + Pair(R.integer.BUTTON_L_X_FOLDABLE, R.integer.BUTTON_L_Y_FOLDABLE), + 1.0f ), BUTTON_R( "button_r", true, Pair(R.integer.BUTTON_R_X, R.integer.BUTTON_R_Y), Pair(R.integer.BUTTON_R_X_PORTRAIT, R.integer.BUTTON_R_Y_PORTRAIT), - Pair(R.integer.BUTTON_R_X_FOLDABLE, R.integer.BUTTON_R_Y_FOLDABLE) + Pair(R.integer.BUTTON_R_X_FOLDABLE, R.integer.BUTTON_R_Y_FOLDABLE), + 1.0f ), BUTTON_ZL( "button_zl", true, Pair(R.integer.BUTTON_ZL_X, R.integer.BUTTON_ZL_Y), Pair(R.integer.BUTTON_ZL_X_PORTRAIT, R.integer.BUTTON_ZL_Y_PORTRAIT), - Pair(R.integer.BUTTON_ZL_X_FOLDABLE, R.integer.BUTTON_ZL_Y_FOLDABLE) + Pair(R.integer.BUTTON_ZL_X_FOLDABLE, R.integer.BUTTON_ZL_Y_FOLDABLE), + 1.0f ), BUTTON_ZR( "button_zr", true, Pair(R.integer.BUTTON_ZR_X, R.integer.BUTTON_ZR_Y), Pair(R.integer.BUTTON_ZR_X_PORTRAIT, R.integer.BUTTON_ZR_Y_PORTRAIT), - Pair(R.integer.BUTTON_ZR_X_FOLDABLE, R.integer.BUTTON_ZR_Y_FOLDABLE) + Pair(R.integer.BUTTON_ZR_X_FOLDABLE, R.integer.BUTTON_ZR_Y_FOLDABLE), + 1.0f ), BUTTON_STICK_L( "button_stick_l", true, Pair(R.integer.BUTTON_STICK_L_X, R.integer.BUTTON_STICK_L_Y), Pair(R.integer.BUTTON_STICK_L_X_PORTRAIT, R.integer.BUTTON_STICK_L_Y_PORTRAIT), - Pair(R.integer.BUTTON_STICK_L_X_FOLDABLE, R.integer.BUTTON_STICK_L_Y_FOLDABLE) + Pair(R.integer.BUTTON_STICK_L_X_FOLDABLE, R.integer.BUTTON_STICK_L_Y_FOLDABLE), + 1.0f ), BUTTON_STICK_R( "button_stick_r", true, Pair(R.integer.BUTTON_STICK_R_X, R.integer.BUTTON_STICK_R_Y), Pair(R.integer.BUTTON_STICK_R_X_PORTRAIT, R.integer.BUTTON_STICK_R_Y_PORTRAIT), - Pair(R.integer.BUTTON_STICK_R_X_FOLDABLE, R.integer.BUTTON_STICK_R_Y_FOLDABLE) + Pair(R.integer.BUTTON_STICK_R_X_FOLDABLE, R.integer.BUTTON_STICK_R_Y_FOLDABLE), + 1.0f ), STICK_L( "stick_l", true, Pair(R.integer.STICK_L_X, R.integer.STICK_L_Y), Pair(R.integer.STICK_L_X_PORTRAIT, R.integer.STICK_L_Y_PORTRAIT), - Pair(R.integer.STICK_L_X_FOLDABLE, R.integer.STICK_L_Y_FOLDABLE) + Pair(R.integer.STICK_L_X_FOLDABLE, R.integer.STICK_L_Y_FOLDABLE), + 1.0f ), STICK_R( "stick_r", true, Pair(R.integer.STICK_R_X, R.integer.STICK_R_Y), Pair(R.integer.STICK_R_X_PORTRAIT, R.integer.STICK_R_Y_PORTRAIT), - Pair(R.integer.STICK_R_X_FOLDABLE, R.integer.STICK_R_Y_FOLDABLE) + Pair(R.integer.STICK_R_X_FOLDABLE, R.integer.STICK_R_Y_FOLDABLE), + 1.0f ), COMBINED_DPAD( "combined_dpad", true, Pair(R.integer.COMBINED_DPAD_X, R.integer.COMBINED_DPAD_Y), Pair(R.integer.COMBINED_DPAD_X_PORTRAIT, R.integer.COMBINED_DPAD_Y_PORTRAIT), - Pair(R.integer.COMBINED_DPAD_X_FOLDABLE, R.integer.COMBINED_DPAD_Y_FOLDABLE) + Pair(R.integer.COMBINED_DPAD_X_FOLDABLE, R.integer.COMBINED_DPAD_Y_FOLDABLE), + 1.0f ); fun getDefaultPositionForLayout(layout: OverlayLayout): Pair { @@ -173,7 +191,8 @@ enum class OverlayControl( defaultVisibility, getDefaultPositionForLayout(OverlayLayout.Landscape), getDefaultPositionForLayout(OverlayLayout.Portrait), - getDefaultPositionForLayout(OverlayLayout.Foldable) + getDefaultPositionForLayout(OverlayLayout.Foldable), + defaultIndividualScaleResource ) companion object { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlData.kt index 26cfeb1db5..6cc5a59c98 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlData.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.overlay.model @@ -8,7 +8,8 @@ data class OverlayControlData( var enabled: Boolean, var landscapePosition: Pair, var portraitPosition: Pair, - var foldablePosition: Pair + var foldablePosition: Pair, + var individualScale: Float ) { fun positionFromLayout(layout: OverlayLayout): Pair = when (layout) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt index 03fa1a3a2e..80055628e1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt @@ -194,6 +194,10 @@ class GamesFragment : Fragment() { val columns = resources.getInteger(R.integer.game_columns_grid) GridLayoutManager(context, columns) } + GameAdapter.VIEW_TYPE_GRID_COMPACT -> { + val columns = resources.getInteger(R.integer.game_columns_grid) + GridLayoutManager(context, columns) + } GameAdapter.VIEW_TYPE_LIST -> { val columns = resources.getInteger(R.integer.game_columns_list) GridLayoutManager(context, columns) @@ -300,6 +304,7 @@ class GamesFragment : Fragment() { val currentViewType = getCurrentViewType() when (currentViewType) { GameAdapter.VIEW_TYPE_LIST -> popup.menu.findItem(R.id.view_list).isChecked = true + GameAdapter.VIEW_TYPE_GRID_COMPACT -> popup.menu.findItem(R.id.view_grid_compact).isChecked = true GameAdapter.VIEW_TYPE_GRID -> popup.menu.findItem(R.id.view_grid).isChecked = true GameAdapter.VIEW_TYPE_CAROUSEL -> popup.menu.findItem(R.id.view_carousel).isChecked = true } @@ -314,6 +319,14 @@ class GamesFragment : Fragment() { true } + R.id.view_grid_compact -> { + if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) onPause() + setCurrentViewType(GameAdapter.VIEW_TYPE_GRID_COMPACT) + applyGridGamesBinding() + item.isChecked = true + true + } + R.id.view_list -> { if (getCurrentViewType() == GameAdapter.VIEW_TYPE_CAROUSEL) onPause() setCurrentViewType(GameAdapter.VIEW_TYPE_LIST) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index fffaa1e3ba..956d93a4eb 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -38,6 +38,7 @@ import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.InstallResult +import android.os.Build import org.yuzu.yuzu_emu.model.TaskState import org.yuzu.yuzu_emu.model.TaskViewModel import org.yuzu.yuzu_emu.utils.* @@ -47,6 +48,8 @@ import java.io.BufferedOutputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream import androidx.core.content.edit +import org.yuzu.yuzu_emu.activities.EmulationActivity +import kotlin.text.compareTo class MainActivity : AppCompatActivity(), ThemeProvider { private lateinit var binding: ActivityMainBinding @@ -110,6 +113,19 @@ class MainActivity : AppCompatActivity(), ThemeProvider { binding = ActivityMainBinding.inflate(layoutInflater) + // Since Android 15, google automatically forces "games" to be 60 hrz + // This ensures the display's max refresh rate is actually used + display?.let { + val supportedModes = it.supportedModes + val maxRefreshRate = supportedModes.maxByOrNull { mode -> mode.refreshRate } + + if (maxRefreshRate != null) { + val layoutParams = window.attributes + layoutParams.preferredDisplayModeId = maxRefreshRate.modeId + window.attributes = layoutParams + } + } + setContentView(binding.root) checkAndRequestBluetoothPermissions() @@ -127,16 +143,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { checkedDecryption = true } - if (!checkedFirmware) { - val firstTimeSetup = PreferenceManager.getDefaultSharedPreferences(applicationContext) - .getBoolean(Settings.PREF_FIRST_APP_LAUNCH, true) - if (!firstTimeSetup) { - checkFirmware() - showPreAlphaWarningDialog() - } - checkedFirmware = true - } - WindowCompat.setDecorFitsSystemWindows(window, false) window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING) @@ -183,12 +189,8 @@ class MainActivity : AppCompatActivity(), ThemeProvider { if (it) checkKeys() } - homeViewModel.checkFirmware.collect( - this, - resetState = { homeViewModel.setCheckFirmware(false) } - ) { - if (it) checkFirmware() - } + // Dismiss previous notifications (should not happen unless a crash occurred) + EmulationActivity.stopForegroundService(this) setInsets() } @@ -228,21 +230,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { ).show(supportFragmentManager, MessageDialogFragment.TAG) } } - - private fun checkFirmware() { - val resultCode: Int = NativeLibrary.verifyFirmware() - if (resultCode == 0) return - - val resultString: String = - resources.getStringArray(R.array.verifyFirmwareResults)[resultCode] - - MessageDialogFragment.newInstance( - titleId = R.string.firmware_invalid, - descriptionString = resultString, - helpLinkId = R.string.firmware_missing_help - ).show(supportFragmentManager, MessageDialogFragment.TAG) - } - override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putBoolean(CHECKED_DECRYPTION, checkedDecryption) @@ -310,6 +297,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { themeId = resId } + override fun onDestroy() { + EmulationActivity.stopForegroundService(this) + super.onDestroy() + } + val getGamesDirectory = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result -> if (result != null) { @@ -419,7 +411,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { cacheFirmwareDir.copyRecursively(firmwarePath, true) NativeLibrary.initializeSystem(true) homeViewModel.setCheckKeys(true) - homeViewModel.setCheckFirmware(true) getString(R.string.save_file_imported_success) } } catch (e: Exception) { @@ -449,7 +440,6 @@ class MainActivity : AppCompatActivity(), ThemeProvider { // Optionally reinitialize the system or perform other necessary steps NativeLibrary.initializeSystem(true) homeViewModel.setCheckKeys(true) - homeViewModel.setCheckFirmware(true) messageToShow = getString(R.string.firmware_uninstalled_success) } else { messageToShow = getString(R.string.firmware_uninstalled_failure) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/CustomSettingsHandler.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/CustomSettingsHandler.kt index a317be14d5..377313d0aa 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/CustomSettingsHandler.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/CustomSettingsHandler.kt @@ -124,11 +124,16 @@ object CustomSettingsHandler { // Check for driver requirements if activity and driverViewModel are provided if (activity != null && driverViewModel != null) { - val driverPath = extractDriverPath(customSettings) - if (driverPath != null) { - Log.info("[CustomSettingsHandler] Custom settings specify driver: $driverPath") + val rawDriverPath = extractDriverPath(customSettings) + if (rawDriverPath != null) { + // Normalize to local storage path (we only store drivers under driverStoragePath) + val driverFilename = rawDriverPath.substringAfterLast('/') + .substringAfterLast('\\') + val localDriverPath = "${GpuDriverHelper.driverStoragePath}$driverFilename" + Log.info("[CustomSettingsHandler] Custom settings specify driver: $rawDriverPath (normalized: $localDriverPath)") + // Check if driver exists in the driver storage - val driverFile = File(driverPath) + val driverFile = File(localDriverPath) if (!driverFile.exists()) { Log.info("[CustomSettingsHandler] Driver not found locally: ${driverFile.name}") @@ -182,7 +187,7 @@ object CustomSettingsHandler { } // Attempt to download and install the driver - val driverUri = DriverResolver.ensureDriverAvailable(driverPath, activity) { progress -> + val driverUri = DriverResolver.ensureDriverAvailable(driverFilename, activity) { progress -> progressChannel.trySend(progress.toInt()) } @@ -209,12 +214,12 @@ object CustomSettingsHandler { return null } - // Verify the downloaded driver - val installedFile = File(driverPath) + // Verify the downloaded driver (from normalized local path) + val installedFile = File(localDriverPath) val metadata = GpuDriverHelper.getMetadataFromZip(installedFile) if (metadata.name == null) { Log.error( - "[CustomSettingsHandler] Downloaded driver is invalid: $driverPath" + "[CustomSettingsHandler] Downloaded driver is invalid: $localDriverPath" ) Toast.makeText( activity, @@ -232,7 +237,7 @@ object CustomSettingsHandler { } // Add to driver list - driverViewModel.onDriverAdded(Pair(driverPath, metadata)) + driverViewModel.onDriverAdded(Pair(localDriverPath, metadata)) Log.info( "[CustomSettingsHandler] Successfully downloaded and installed driver: ${metadata.name}" ) @@ -268,7 +273,7 @@ object CustomSettingsHandler { // Driver exists, verify it's valid val metadata = GpuDriverHelper.getMetadataFromZip(driverFile) if (metadata.name == null) { - Log.error("[CustomSettingsHandler] Invalid driver file: $driverPath") + Log.error("[CustomSettingsHandler] Invalid driver file: $localDriverPath") Toast.makeText( activity, activity.getString( @@ -459,6 +464,8 @@ object CustomSettingsHandler { if (inGpuDriverSection && trimmed.startsWith("driver_path=")) { return trimmed.substringAfter("driver_path=") + .trim() + .removeSurrounding("\"", "\"") } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt index de0794a17f..5325f688b6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.utils @@ -170,7 +170,8 @@ object DirectoryInitialization { buttonEnabled, Pair(landscapeXPosition, landscapeYPosition), Pair(portraitXPosition, portraitYPosition), - Pair(foldableXPosition, foldableYPosition) + Pair(foldableXPosition, foldableYPosition), + OverlayControl.map[buttonId]?.defaultIndividualScaleResource ?: 1.0f ) overlayControlDataMap[buttonId] = controlData setOverlayData = true diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DriverResolver.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DriverResolver.kt index 74f98ccbd2..2072344bdf 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DriverResolver.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DriverResolver.kt @@ -68,6 +68,48 @@ object DriverResolver { val filename: String ) + // Matching helpers + private val KNOWN_SUFFIXES = listOf( + ".adpkg.zip", + ".zip", + ".7z", + ".tar.gz", + ".tar.xz", + ".rar" + ) + + private fun stripKnownSuffixes(name: String): String { + var result = name + var changed: Boolean + do { + changed = false + for (s in KNOWN_SUFFIXES) { + if (result.endsWith(s, ignoreCase = true)) { + result = result.dropLast(s.length) + changed = true + } + } + } while (changed) + return result + } + + private fun normalizeName(name: String): String { + val base = stripKnownSuffixes(name.lowercase()) + // Remove non-alphanumerics to make substring checks resilient + return base.replace(Regex("[^a-z0-9]+"), " ").trim() + } + + private fun tokenize(name: String): Set = + normalizeName(name).split(Regex("\\s+")).filter { it.isNotBlank() }.toSet() + + // Jaccard similarity between two sets + private fun jaccard(a: Set, b: Set): Double { + if (a.isEmpty() || b.isEmpty()) return 0.0 + val inter = a.intersect(b).size.toDouble() + val uni = a.union(b).size.toDouble() + return if (uni == 0.0) 0.0 else inter / uni + } + /** * Resolve a driver download URL from its filename * @param filename The driver filename (e.g., "turnip_mrpurple-T19-toasted.adpkg.zip") @@ -98,7 +140,7 @@ object DriverResolver { async { searchRepository(repoPath, filename) } - }.mapNotNull { it.await() }.firstOrNull().also { resolved -> + }.firstNotNullOfOrNull { it.await() }.also { resolved -> // Cache the result if found resolved?.let { urlCache[filename] = it @@ -119,22 +161,56 @@ object DriverResolver { releaseCache[repoPath] = it } - // Search through all releases and artifacts + // First pass: exact name (case-insensitive) against asset filenames + val target = filename.lowercase() for (release in releases) { for (artifact in release.artifacts) { - if (artifact.name == filename) { - Log.info( - "[DriverResolver] Found $filename in $repoPath/${release.tagName}" - ) + if (artifact.name.equals(filename, ignoreCase = true) || artifact.name.lowercase() == target) { + Log.info("[DriverResolver] Found $filename in $repoPath/${release.tagName}") return@withContext ResolvedDriver( downloadUrl = artifact.url.toString(), repoPath = repoPath, releaseTag = release.tagName, - filename = filename + filename = artifact.name ) } } } + + // Second pass: fuzzy match by asset filenames only + val reqNorm = normalizeName(filename) + val reqTokens = tokenize(filename) + var best: ResolvedDriver? = null + var bestScore = 0.0 + + for (release in releases) { + for (artifact in release.artifacts) { + val artNorm = normalizeName(artifact.name) + val artTokens = tokenize(artifact.name) + + var score = jaccard(reqTokens, artTokens) + // Boost if one normalized name contains the other + if (artNorm.contains(reqNorm) || reqNorm.contains(artNorm)) { + score = maxOf(score, 0.92) + } + + if (score > bestScore) { + bestScore = score + best = ResolvedDriver( + downloadUrl = artifact.url.toString(), + repoPath = repoPath, + releaseTag = release.tagName, + filename = artifact.name + ) + } + } + } + + // Threshold to avoid bad guesses, this worked fine in testing but might need tuning + if (best != null && bestScore >= 0.6) { + Log.info("[DriverResolver] Fuzzy matched $filename -> ${best.filename} in ${best.repoPath} (score=%.2f)".format(bestScore)) + return@withContext best + } null } catch (e: Exception) { Log.error("[DriverResolver] Failed to search $repoPath: ${e.message}") @@ -296,8 +372,8 @@ object DriverResolver { context: Context, onProgress: ((Float) -> Unit)? = null ): Uri? { - // Extract filename from path - val filename = driverPath.substringAfterLast('/') + // Extract filename from path (support both separators) + val filename = driverPath.substringAfterLast('/').substringAfterLast('\\') // Check if driver already exists locally val localPath = "${GpuDriverHelper.driverStoragePath}$filename" diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt new file mode 100644 index 0000000000..c181656d99 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// Copyright 2023 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.yuzu.yuzu_emu.utils + +import android.app.PendingIntent +import android.app.Service +import android.content.Intent +import android.os.IBinder +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.activities.EmulationActivity + +/** + * A service that shows a permanent notification in the background to avoid the app getting + * cleared from memory by the system. + */ +class ForegroundService : Service() { + companion object { + const val EMULATION_RUNNING_NOTIFICATION = 0x1000 + + const val ACTION_STOP = "stop" + } + + private fun showRunningNotification() { + // Intent is used to resume emulation if the notification is clicked + val contentIntent = PendingIntent.getActivity( + this, + 0, + Intent(this, EmulationActivity::class.java), + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + val builder = + NotificationCompat.Builder(this, getString(R.string.app_notification_channel_id)) + .setSmallIcon(R.drawable.ic_stat_notification_logo) + .setContentTitle(getString(R.string.app_name)) + .setContentText(getString(R.string.app_notification_running)) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setOngoing(true) + .setVibrate(null) + .setSound(null) + .setContentIntent(contentIntent) + startForeground(EMULATION_RUNNING_NOTIFICATION, builder.build()) + } + + override fun onBind(intent: Intent): IBinder? { + return null + } + + override fun onCreate() { + showRunningNotification() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (intent?.action == ACTION_STOP) { + try { + NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION) + stopForeground(STOP_FOREGROUND_REMOVE) + } catch (e: Exception) { + Log.error("Failed to stop foreground service") + } + stopSelfResult(startId) + return START_NOT_STICKY + } + + if (intent != null) { + showRunningNotification() + } + return START_STICKY + } + + override fun onDestroy() = + NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION) +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/CarouselRecyclerView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/CarouselRecyclerView.kt index 8a66ebf11f..2c35e7349a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/CarouselRecyclerView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/CarouselRecyclerView.kt @@ -19,6 +19,7 @@ import org.yuzu.yuzu_emu.adapters.GameAdapter import androidx.core.view.doOnNextLayout import org.yuzu.yuzu_emu.YuzuApplication import androidx.preference.PreferenceManager +import androidx.core.view.WindowInsetsCompat /** * CarouselRecyclerView encapsulates all carousel logic for the games UI. @@ -205,8 +206,8 @@ class CarouselRecyclerView @JvmOverloads constructor( if (enabled) { useCustomDrawingOrder = true - val insets = rootWindowInsets - val bottomInset = insets?.getInsets(android.view.WindowInsets.Type.systemBars())?.bottom ?: 0 + val insets = rootWindowInsets?.let { WindowInsetsCompat.toWindowInsetsCompat(it, this) } + val bottomInset = insets?.getInsets(WindowInsetsCompat.Type.systemBars())?.bottom ?: 0 val internalFactor = resources.getFraction(R.fraction.carousel_card_size_factor, 1, 1) val userFactor = preferences.getFloat(CAROUSEL_CARD_SIZE_FACTOR, internalFactor).coerceIn( 0f, diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt index 1e30b16d96..0557236394 100644 --- a/src/android/app/src/main/jni/CMakeLists.txt +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later @@ -17,7 +20,7 @@ add_library(yuzu-android SHARED set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR}) -target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common Vulkan::Headers) +target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common video_core) target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log) if (ARCHITECTURE_arm64) target_link_libraries(yuzu-android PRIVATE adrenotools) @@ -27,4 +30,4 @@ if (ENABLE_OPENSSL OR ENABLE_WEB_SERVICE) target_link_libraries(yuzu-android PRIVATE OpenSSL::SSL cpp-jwt::cpp-jwt) endif() - set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} yuzu-android) +set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} yuzu-android) diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index a79a64afbb..41ac680d6b 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later #include #include @@ -103,6 +103,7 @@ void AndroidConfig::ReadOverlayValues() { ReadDoubleSetting(std::string("foldable\\x_position")); control_data.foldable_position.second = ReadDoubleSetting(std::string("foldable\\y_position")); + control_data.individual_scale = static_cast(ReadDoubleSetting(std::string("individual_scale"))); AndroidSettings::values.overlay_control_data.push_back(control_data); } EndArray(); @@ -255,6 +256,7 @@ void AndroidConfig::SaveOverlayValues() { control_data.foldable_position.first); WriteDoubleSetting(std::string("foldable\\y_position"), control_data.foldable_position.second); + WriteDoubleSetting(std::string("individual_scale"), static_cast(control_data.individual_scale)); } EndArray(); diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index cd18f1e5b3..c9e59ce105 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -24,6 +24,7 @@ namespace AndroidSettings { std::pair landscape_position; std::pair portrait_position; std::pair foldable_position; + float individual_scale; }; struct Values { @@ -79,6 +80,15 @@ namespace AndroidSettings { Settings::Category::Overlay, Settings::Specialization::Paired, true, true}; + Settings::Setting enable_input_overlay_auto_hide{linkage, false, + "enable_input_overlay_auto_hide", + Settings::Category::Overlay, + Settings::Specialization::Default, true, + true,}; + + Settings::Setting input_overlay_auto_hide{linkage, 5, "input_overlay_auto_hide", + Settings::Category::Overlay, + Settings::Specialization::Default, true, true, &enable_input_overlay_auto_hide}; Settings::Setting perf_overlay_background{linkage, false, "perf_overlay_background", Settings::Category::Overlay, Settings::Specialization::Default, true, diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index f8f175d313..306b7e2a4c 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -596,6 +596,8 @@ jstring Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getGpuModel(JNIEnv *env, j const std::string model_name{device.GetModelName()}; + window.release(); + return Common::Android::ToJString(env, model_name); } diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 0b26280c6c..e6021ed217 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later #include @@ -369,7 +369,9 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getOverlayControlData(JN env->NewObject(Common::Android::GetOverlayControlDataClass(), Common::Android::GetOverlayControlDataConstructor(), Common::Android::ToJString(env, control_data.id), control_data.enabled, - jlandscapePosition, jportraitPosition, jfoldablePosition); + jlandscapePosition, jportraitPosition, jfoldablePosition, + control_data.individual_scale); + env->SetObjectArrayElement(joverlayControlDataArray, i, jcontrolData); } return joverlayControlDataArray; @@ -418,9 +420,12 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setOverlayControlData( env, env->GetObjectField(jfoldablePosition, Common::Android::GetPairSecondField()))); + float individual_scale = static_cast(env->GetFloatField( + joverlayControlData, Common::Android::GetOverlayControlDataIndividualScaleField())); + AndroidSettings::values.overlay_control_data.push_back(AndroidSettings::OverlayControlData{ Common::Android::GetJString(env, jidString), enabled, landscape_position, - portrait_position, foldable_position}); + portrait_position, foldable_position, individual_scale}); } } diff --git a/src/android/app/src/main/legacy/drawable/ic_icon_bg.png b/src/android/app/src/main/legacy/drawable/ic_icon_bg.png new file mode 100644 index 0000000000..3327014f8f Binary files /dev/null and b/src/android/app/src/main/legacy/drawable/ic_icon_bg.png differ diff --git a/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png b/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png new file mode 100644 index 0000000000..a9fc55a4f5 Binary files /dev/null and b/src/android/app/src/main/legacy/drawable/ic_icon_bg_orig.png differ diff --git a/src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png b/src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png index 5f82432397..7ea5c71380 100644 Binary files a/src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png and b/src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png differ diff --git a/src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png b/src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png index 9c80904a86..d1b8f5d358 100644 Binary files a/src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png and b/src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png differ diff --git a/src/android/app/src/main/res/drawable-xhdpi/tv_banner.png b/src/android/app/src/main/res/drawable-xhdpi/tv_banner.png index d1541d8ec6..1b6ee05b59 100644 Binary files a/src/android/app/src/main/res/drawable-xhdpi/tv_banner.png and b/src/android/app/src/main/res/drawable-xhdpi/tv_banner.png differ diff --git a/src/android/app/src/main/res/drawable-xxhdpi/ic_stat_notification_logo.png b/src/android/app/src/main/res/drawable-xxhdpi/ic_stat_notification_logo.png index 63ef14ce0f..1d01126b30 100644 Binary files a/src/android/app/src/main/res/drawable-xxhdpi/ic_stat_notification_logo.png and b/src/android/app/src/main/res/drawable-xxhdpi/ic_stat_notification_logo.png differ diff --git a/src/android/app/src/main/res/drawable/gradient_overlay_bottom.xml b/src/android/app/src/main/res/drawable/gradient_overlay_bottom.xml new file mode 100644 index 0000000000..f74cfa0d05 --- /dev/null +++ b/src/android/app/src/main/res/drawable/gradient_overlay_bottom.xml @@ -0,0 +1,9 @@ + + + + diff --git a/src/android/app/src/main/res/drawable/ic_icon_bg.png b/src/android/app/src/main/res/drawable/ic_icon_bg.png index 30b29a32d8..7da2c6a1a3 100644 Binary files a/src/android/app/src/main/res/drawable/ic_icon_bg.png and b/src/android/app/src/main/res/drawable/ic_icon_bg.png differ diff --git a/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png b/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png index 9ebc6ce17c..18325c031a 100644 Binary files a/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png and b/src/android/app/src/main/res/drawable/ic_icon_bg_orig.png differ diff --git a/src/android/app/src/main/res/layout/card_game_grid.xml b/src/android/app/src/main/res/layout/card_game_grid.xml index 3e0bf6005c..f03a77c4f1 100644 --- a/src/android/app/src/main/res/layout/card_game_grid.xml +++ b/src/android/app/src/main/res/layout/card_game_grid.xml @@ -5,27 +5,32 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="false" - android:focusableInTouchMode="false"> + android:focusableInTouchMode="false" + android:padding="4dp"> + app:cardCornerRadius="16dp" + android:foreground="@color/eden_border_gradient_start"> + android:paddingTop="14dp" + android:paddingLeft="6dp" + android:paddingRight="6dp" + android:paddingBottom="6dp"> + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/dialog_overlay_scale.xml b/src/android/app/src/main/res/layout/dialog_overlay_scale.xml new file mode 100644 index 0000000000..9e047f211e --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_overlay_scale.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/layout/dialog_spinbox.xml b/src/android/app/src/main/res/layout/dialog_spinbox.xml new file mode 100644 index 0000000000..2f18ab750d --- /dev/null +++ b/src/android/app/src/main/res/layout/dialog_spinbox.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/menu/menu_game_views.xml b/src/android/app/src/main/res/menu/menu_game_views.xml index 241cdcb4b5..11bf3e695e 100644 --- a/src/android/app/src/main/res/menu/menu_game_views.xml +++ b/src/android/app/src/main/res/menu/menu_game_views.xml @@ -4,6 +4,9 @@ + + + امتدادات GPU العارض - RAII - طريقة لإدارة الموارد تلقائيًا في فولكان تضمن الإفراج الصحيح عن الموارد عندما لا تكون هناك حاجة إليها، ولكن قد تسبب تعطل الألعاب المجمعة. وحدة المعالجة المركزية والذاكرة حجاب عدن إعدادات تجريبية لتحسين الأداء والقدرة. قد تسبب هذه الإعدادات شاشات سوداء أو مشاكل أخرى في اللعبة. @@ -117,8 +115,10 @@ دورات تخطي إبطال ذاكرة التخزين المؤقت الداخلية للوحدة المركزية يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقت أثناء تحديثات الذاكرة، مما يقلل استخدام المعالج ويحسن أدائه. قد يسبب هذا أعطالاً أو تعطلًا في بعض الألعاب. - مستوى DMA - يتحكم في دقة تحديد مستوى DMA. الدقة الأعلى يمكنها إصلاح بعض المشاكل في بعض الألعاب، ولكنها قد تؤثر أيضًا على الأداء في بعض الحالات. إذا كنت غير متأكد، اتركه على الوضع الافتراضي. + تمكين محاكاة MMU المضيف + يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية. + دقة DMA + يتحكم في دقة تحديد DMA. يمكن أن تصلح الدقة الآمنة المشاكل في بعض الألعاب، ولكنها قد تؤثر أيضًا على الأداء في بعض الحالات. إذا كنت غير متأكد، اترك هذا على الوضع الافتراضي. 4 جيجابايت (موصى به) @@ -417,10 +417,18 @@ خصائص مجلد اللعبة فشل استيراد %d حفظ + فشل استيراد %d حفظ + فشل استيراد %d حفظ + فشل استيراد %d حفظ + فشل استيراد %d حفظ فشل استيراد %d حفظ تم استيراد %d حفظ بنجاح + تم استيراد %d حفظ بنجاح + تم استيراد %d حفظ بنجاح + تم استيراد %d حفظ بنجاح + تم استيراد %d حفظ بنجاح تم استيراد %d حفظ بنجاح لم يتم العثور على بيانات الحفظ @@ -445,8 +453,7 @@ قم بتشغيل تطبيقات النظام باستخدام فيرموير المثبت البرنامج الثابت غير مثبت أو إصدار غير صالح التطبيق المصغر غير متوفر - prod.keys الخاص بك و -البرنامج الثابت مثبتة وحاول مرة أخرى.
بالإضافة إلى ذلك، تأكد من أن برنامجك الثابت من إصدار 19.0.1 أو أقدم.]]>
+ prod.keys الخاص بك و البرنامج الثابت مثبتة وحاول مرة أخرى.
بالإضافة إلى ذلك، تأكد من أن برنامجك الثابت من إصدار 19.0.1 أو أقدم.]]>
الألبوم شاهد الصور المخزنة في مجلد لقطات شاشة المستخدم باستخدام عارض صور النظام تحرير Mii @@ -670,14 +677,14 @@ الخاص بك ROM تم تشفير - ألعاب البطاقات أو العناوين الرقمية.]]> - prod.keys]]> + ألعاب البطاقات أو العناوين الرقمية.]]> + prod.keys]]> حدث خطأ أثناء تهيئة مركز الفيديو قد يكون بسبب تعريف GPU غير متوافق ROM غير قادر على تحميل غير موجود ROM ملف اللعبة تتطلب برنامجاً ثابتاً - نسخ وتثبيت البرنامج الثابت، أو اضغط "موافق" للمتابعة على أي حال.]]> + نسخ وتثبيت البرنامج الثابت، أو اضغط \"موافق\" للمتابعة على أي حال.]]> جاري البحث عن اللعبة... @@ -731,7 +738,8 @@ مركز العصا النسبي مزلاق الأسهم الاهتزازات الديناميكية - عرض التراكب + إظهار وحدة التحكم + إخفاء وحدة التحكم الكل ضبط التراكب الحجم @@ -789,9 +797,8 @@ افتراضي - عادي - عالي - مفرط + غير آمن (سريع) + آمن (مستقر) 0.25X (180p/270p) @@ -834,13 +841,13 @@ تمتد إلى النافذة - Dynarmic (بطيء) + Dynarmic (JIT) تنفيذ التعليمات البرمجية الأصلية (NCE) دقه غير آمن - Paranoid (بطيء) + Paranoid الأسهم diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 1845dbbade..2ab4af16ad 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -65,8 +65,6 @@ پاشکۆکانی GPU رێندرەر - RAII - ڕێگایەکی بەڕێوەبردنی سەرچاوەکان بە خۆکار لە ڤولکان کە دڵنیای دەکاتەوە لە ئازادکردنی گونجاوی سەرچاوەکان کاتێک کە چیتر پێویستیان نییە، بەڵام لەوانەیە ببێتە هۆی کەوتنی یارییە کۆکراوەکان. CPU و بیرگە حجاب عدن ڕێکخستنە تاقیکارییەکان بۆ باشترکردنی کارایی و توانا. ئەم ڕێکخستنانە لەوانەیە ببێتە هۆی شاشە ڕەشەکان یان کێشەیتری یاری. @@ -126,8 +124,10 @@ تیک بازنەکردنی ناوەکی CPU هەندێک لە بازنەکردنەکانی هەڵگر لە کاتی نوێکردنەوەی بیرگە دەنێرێت، کەمکردنەوەی بەکارهێنانی CPU و باشترکردنی کارایی. لەوانەیە لە هەندێک یاری کێشە درووست بکات. - ئاستی DMA - کۆنتڕۆڵی وردی ڕێکخستنی DMA دەکات. وردی زیاتر دەتوانێ هەندێک کێشە لە هەندێک یاری چارەسەر بکات، بەڵام لە هەندێک حاڵەتدا کاریگەری لەسەر کارایی هەیە. ئەگەر دڵنیا نیت، بە ڕێکخستنی بنەڕەتی بێڵە. + چالاککردنی میمیکردنی MMU میواندە + ئەم باشکردنە خێرایی دەستکەوتنی بیرگە لەلایەن پرۆگرامی میوانەکە زیاد دەکات. چالاککردنی وای لێدەکات کە خوێندنەوە/نووسینەکانی بیرگەی میوانەکە ڕاستەوخۆ لە بیرگە ئەنجام بدرێت و میمیکردنی MMU میواندە بەکاربهێنێت. ناچالاککردنی ئەمە هەموو دەستکەوتنەکانی بیرگە ڕەت دەکاتەوە لە بەکارهێنانی میمیکردنی MMU نەرمەکاڵا. + وردیی DMA + کۆنتڕۆڵی وردیی وردیی DMA دەکات. وردییی پارێزراو دەتوانێت کێشەکان لە هەندێک یاری چارەسەر بکات، بەڵام لە هەندێک حاڵەتدا کاریگەری لەسەر کارایی هەیە. ئەگەر دڵنیا نیت، ئەمە بە سەر ڕەھەوادا بهێڵە. 4GB (پێشنیارکراو) 6GB (نائاسایش) @@ -320,7 +320,7 @@ کارۆسێل فۆڵدەر نەرمەکاڵای پێش-ئەلفا - "ئاگاداری: ئەم وەشانە بۆ بڵاوکردنەوە یان پیشاندانی گشتی نییە. ئەم نەرمەکاڵایە لە قۆناغی پێش-ئەلفادایە و لەوانەیە هەڵەی تێدا بێت." + ئاگاداری: ئەم وەشانە بۆ بڵاوکردنەوە یان پیشاندانی گشتی نییە. ئەم نەرمەکاڵایە لە قۆناغی پێش-ئەلفادایە و لەوانەیە هەڵەی تێدا بێت. دووبارە نیشان مەدە نەرمەکاڵای پێش-ئەلفا؛ بۆ بەکارهێنانی گشتی نییە فۆڵدەری نوێ بە سەرکەوتوویی زیادکرا @@ -439,8 +439,7 @@ ئەپلێتی سیستەم دەستپێبکە بە بەکارهێنانی پتەوواڵای دامەزراو فریموێر نەنێردراوە یان وەشانێکی نادروستە ئەپلێت بەردەست نییە - prod.keys و -فریموێرەکەت نێردراوە و هەوڵ بدەرەوە.
هەروەها دڵنیابە لەوەی فریموێرەکەت وەشانی ١٩.٠.١ یان کەمتر بێت.]]>
+ prod.keys و فریموێرەکەت نێردراوە و هەوڵ بدەرەوە.
هەروەها دڵنیابە لەوەی فریموێرەکەت وەشانی ١٩.٠.١ یان کەمتر بێت.]]>
ئەلبوم وێنەکان لە فۆڵدەری وێنەی بەکارهێنەر ببینە دەستکاریی Mii @@ -647,14 +646,14 @@ ڕۆمەکەت کۆدکراوە - یارییە کارتەکان یان ناونیشانە دیجیتاڵییەکان.]]> + یارییە کارتەکان یان ناونیشانە دیجیتاڵییەکان.]]> prod.keys فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]> هەڵەیەک لە دەستپێکردنی ناوەکی ڤیدیۆکەدا ڕوویدا ئەمەش بەزۆری بەهۆی وەگەڕخەرێکی ناتەبای GPU ەوەیە. دامەزراندنی وەگەڕخەری GPU ی تایبەتمەندکراو لەوانەیە ئەم کێشەیە چارەسەر بکات. ناتوانرێت ڕۆم باربکرێت فایلی ڕۆم بوونی نییە یارییەکە فریموێر پێویستە - فریموێر دامپ بکە و دابنێ, یان پەنجە بنێ سەر "باشە" بۆ بەردەوامبوون هەرچۆنێک بێت.]]> + فریموێر دامپ بکە و دابنێ, یان پەنجە بنێ سەر \"باشە\" بۆ بەردەوامبوون هەرچۆنێک بێت.]]> گەڕان بە دوای یارییە... @@ -708,7 +707,8 @@ ناوەندی گێڕ بەنزیکەیی خلیسکانی 4 دوگمەکە لەرینەوەی پەنجەلێدان - نیشاندانی داپۆشەر + نیشاندانی کۆنتڕۆڵەر + پیشاندانی کۆنتڕۆڵەر گۆڕینی سەرجەم ڕێکخستنی داپۆشەر پێوەر @@ -758,9 +758,8 @@ بنەڕەتی - ئاسایی - بەرز - زۆر بەرز + نەپارێزراو (خێرا) + پارێزراو (جێگیر) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 484ba1fc5f..ad8f89ffc5 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -64,8 +64,6 @@ Rozšíření GPU Renderer - RAII - Metoda automatické správy prostředků ve Vulkanu, která zajišťuje správné uvolnění prostředků, když již nejsou potřeba, ale může způsobit pády v balených hrách. CPU a paměť Edenův závoj Experimentální nastavení pro zlepšení výkonu a schopností. Tato nastavení mohou způsobit černé obrazovky nebo další herní problémy. @@ -125,8 +123,10 @@ Takty Přeskočit vnitřní invalidaci CPU Přeskočí některé invalidace mezipaměti na straně CPU během aktualizací paměti, čímž sníží zatížení CPU a zlepší jeho výkon. Může způsobit chyby nebo pády v některých hrách. - Úroveň DMA - Ovládá přesnost DMA. Vyšší přesnost může opravit problémy v některých hrách, ale může také ovlivnit výkon. Pokud si nejste jisti, ponechejte výchozí nastavení. + Povolit emulaci hostitelské MMU + Tato optimalizace zrychluje přístup do paměti hostovaného programu. Její povolení způsobí, že čtení a zápisy do paměti hosta se provádějí přímo v paměti a využívají hostitelskou MMU. Zakázání této funkce vynutí použití softwarové emulace MMU pro všechny přístupy do paměti. + Přesnost DMA + Ovládá přesnost DMA. Bezpečná přesnost může opravit problémy v některých hrách, ale v některých případech může také ovlivnit výkon. Pokud si nejste jisti, ponechte to na výchozím nastavení. 4GB (Doporučeno) 6GB (Nebezpečné) @@ -377,10 +377,14 @@ Vlastnosti složky s hrami Chyba při importu %d uložení + Chyba při importu %d uložení + Chyba při importu %d uložení Chyba při importu %d uložení Úspěšně importováno %d uložení + Úspěšně importováno %d uložení + Úspěšně importováno %d uložení Úspěšně importováno %d uložení Nenalezena uložená data @@ -405,8 +409,7 @@ Spouštění systémových apletů Firmware není nainstalován nebo je neplatná verze Aplet není dostupný - prod.keys a -firmware, a zkuste to znovu.
Dále se ujistěte, že váš firmware je verze 19.0.1 nebo starší.]]>
+ prod.keys a firmware, a zkuste to znovu.
Dále se ujistěte, že váš firmware je verze 19.0.1 nebo starší.]]>
Album Zobrazovat obrázky uložené v uživatelské složce se snímky obrazovky pomocí systémového prohlížeče fotografií Editor Mii @@ -627,14 +630,14 @@ ROM je zašifrován - herních karet nebo digitálních titulů.]]> - prod.keys pro dešifrování.]]> + herních karet nebo digitálních titulů.]]> + prod.keys pro dešifrování.]]> Chyba inicializace Neplatný GPU ovladač Nelze načíst ROM ROM neexistuje Hra vyžaduje firmware - převezměte a nainstalujte firmware, nebo stiskněte "OK" pro pokračování v každém případě.]]> + převezměte a nainstalujte firmware, nebo stiskněte \"OK\" pro pokračování v každém případě.]]> Hledání hry... @@ -689,7 +692,8 @@ Relativní střed joysticku D-pad slide Haptická odezva - Zobrazit překryv + Zobrazit ovladač + Skrýt ovladač Přepnout vše Upravit překryv Měřítko @@ -732,9 +736,8 @@ Výchozí - Normální - Vysoká - Extrémní + Nebezpečné (rychlé) + Bezpečné (stabilní) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 821ba56399..cf12a2244f 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -65,8 +65,6 @@ GPU-Erweiterungen Renderer - RAII - Eine Methode zur automatischen Ressourcenverwaltung in Vulkan, die eine ordnungsgemäße Freigabe von Ressourcen gewährleistet, wenn sie nicht mehr benötigt werden, aber bei gebündelten Spielen Abstürze verursachen kann. CPU und Speicher Edens Schleier Experimentelle Einstellungen zur Verbesserung der Leistung und Funktionalität. Diese Einstellungen können schwarze Bildschirme oder andere Spielprobleme verursachen. @@ -126,8 +124,10 @@ Ticks CPU-interne Invalidierung überspringen Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Kann in einigen Spielen zu Fehlern oder Abstürzen führen. - DMA-Level - Steuert die DMA-Präzisionsgenauigkeit. Eine höhere Präzision kann Probleme in einigen Spielen beheben, kann aber in einigen Fällen auch die Leistung beeinträchtigen. Im Zweifel auf „Standard“ belassen. + Host-MMU-Emulation aktivieren + Diese Optimierung beschleunigt Speicherzugriffe durch das Gastprogramm. Wenn aktiviert, erfolgen Speicherlese- und -schreibvorgänge des Gastes direkt im Speicher und nutzen die MMU des Hosts. Das Deaktivieren erzwingt die Verwendung der Software-MMU-Emulation für alle Speicherzugriffe. + DMA-Genauigkeit + Steuert die DMA-Präzisionsgenauigkeit. Sichere Präzision kann Probleme in einigen Spielen beheben, kann aber in einigen Fällen auch die Leistung beeinträchtigen. Im Zweifel lassen Sie dies auf Standard stehen. 4 GB (Empfohlen) 6 GB (Unsicher) @@ -438,8 +438,7 @@ Wirklich fortfahren?
System-Applets mit Firmware starten Firmware nicht installiert oder ungültige Version Applet nicht verfügbar - prod.keys-Datei und -Firmware installiert sind, und versuchen Sie es erneut.
Stellen Sie außerdem sicher, dass Ihre Firmware Version 19.0.1 oder älter ist.]]>
+ prod.keys-Datei und Firmware installiert sind, und versuchen Sie es erneut.
Stellen Sie außerdem sicher, dass Ihre Firmware Version 19.0.1 oder älter ist.]]>
Album Bilder im Screenshot-Ordner anzeigen Mii-Editor @@ -703,14 +702,14 @@ Wirklich fortfahren?
Integritätsüberprüfung konnte nicht durchgeführt werden Das ROM ist verschlüsselt - Spielkarten oder digitalen Titel.]]> + Spielkarten oder digitalen Titel.]]> prod.keys Datei installiert ist, damit Spiele entschlüsselt werden können.]]> Bei der Initialisierung des Videokerns ist ein Fehler aufgetreten Dies wird normalerweise durch einen inkompatiblen GPU-Treiber verursacht. Die Installation eines passenden GPU-Treibers kann dieses Problem beheben. ROM konnte nicht geladen werden ROM-Datei existiert nicht Spiel erfordert Firmware - dumpen und installieren Sie Firmware, oder drücken Sie "OK", um trotzdem zu starten.]]> + dumpen und installieren Sie Firmware, oder drücken Sie \"OK\", um trotzdem zu starten.]]> Suche nach Spiel... @@ -760,6 +759,13 @@ Wirklich fortfahren?
Emulation beenden Fertig FPS Zähler + + Steuerung umschalten + Relativer Stick-Zentrum + D-Pad-Scrollen + Haptisches Feedback + Controller anzeigen + Controller ausblenden Alle umschalten Overlay anpassen Größe @@ -818,9 +824,8 @@ Wirklich fortfahren?
Standard - Normal - Hoch - Extrem + Unsicher (schnell) + Sicher (stabil) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 9db08e1425..eff563b7ea 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -65,8 +65,6 @@ Extensiones de GPU Renderizador - RAII - Un método de gestión automática de recursos en Vulkan que garantiza la liberación adecuada de recursos cuando ya no son necesarios, pero puede causar fallos en juegos empaquetados. CPU y memoria Velo de Edén Configuraciones experimentales para mejorar el rendimiento y la capacidad. Estas configuraciones pueden causar pantallas negras u otros problemas en el juego. @@ -126,8 +124,10 @@ Ticks Omitir invalidación interna de la CPU Omite ciertas invalidaciones de caché durante actualizaciones de memoria, reduciendo el uso de CPU y mejorando su rendimiento. Puede causar fallos en algunos juegos. - Nivel de DMA - Controla la precisión del DMA. Una mayor precisión puede solucionar problemas en algunos juegos, pero también puede afectar el rendimiento en algunos casos. Si no está seguro, déjelo en Predeterminado. + Habilitar emulación de MMU del host + Esta optimización acelera los accesos a la memoria por parte del programa invitado. Al habilitarla, las lecturas/escrituras de memoria del invitado se realizan directamente en la memoria y utilizan la MMU del host. Deshabilitar esto obliga a que todos los accesos a la memoria utilicen la emulación de MMU por software. + Precisión de DMA + Controla la precisión de DMA. La precisión segura puede solucionar problemas en algunos juegos, pero también puede afectar al rendimiento en algunos casos. Si no está seguro, déjelo en Predeterminado. 4GB (Recomendado) 6GB (Inseguro) @@ -451,8 +451,7 @@ Ejecutar applets de sistema usando el firmware instalado Firmware no instalado o versión inválida Applet no disponible - prod.keys y -firmware estén instalados e inténtalo de nuevo.
Además, asegúrate de que tu firmware sea de la versión 19.0.1 o anterior.]]>
+ prod.keys y firmware estén instalados e inténtalo de nuevo.
Además, asegúrate de que tu firmware sea de la versión 19.0.1 o anterior.]]>
Álbum Ver las imágenes que están en la carpeta \"screenshots\" del usuario con el visor de fotos del sistema Editor de Mii @@ -720,10 +719,10 @@ Actualizaciones y DLC Mods y trucos Aviso importante de addons - + Para instalar mods y trucos, debes seleccionar una carpeta que contiene los directorios cheats/, romfs/, o exefs/ . ¡No podemos confirmar si éstos serán compatibles con tu juego, así que ten cuidado! Directorio no válido - + Por favor, asegúrese de que el directorio que ha selecionado incluye las carpetas cheats/, romfs/, o exefs/ e inténtelo de nuevo. Addon instalado con éxito Verificando contenido... @@ -742,14 +741,14 @@ Su ROM está encriptada - tarjetas de juego o títulos digitales.]]> + tarjetas de juego o títulos digitales.]]> prod.keys está instalado, para que los juegos sean descifrados.]]> Ocurrió un error al inicializar el núcleo de video, posiblemente debido a una incompatibilidad con el driver seleccionado Esto suele deberse a un driver de GPU incompatible. La instalación de un controlador de GPU personalizado puede resolver este problema. No se pudo cargar la ROM Archivo ROM no existe El juego requiere firmware - vuelca e instala el firmware, o pulsa "Aceptar" para continuar de todos modos.]]> + vuelca e instala el firmware, o pulsa \"Aceptar\" para continuar de todos modos.]]> Buscando juego... @@ -804,7 +803,8 @@ Centro relativo del stick Deslizamiento de la cruceta Toques hápticos - Mostrar overlay + Mostrar controlador + Ocultar controlador Alternar todo Ajustar overlay Escala @@ -867,9 +867,8 @@ Predeterminado - Normal - Alto - Extremo + Inseguro (rápido) + Seguro (estable) 0.25X (180p/270p) @@ -917,13 +916,13 @@ Ajustar a la ventana - DynARMic (lento) + Dynarmic (JIT) Ejecución nativa de código (NCE) Preciso Impreciso - Paranoico (Lento) + Paranoico Cruceta diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 91fa4bd5c2..205662b182 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -65,8 +65,6 @@ افزونه‌های GPU رندرر - RAII - روشی برای مدیریت خودکار منابع در ولکان که تضمین می‌کند منابع به درستی آزاد شوند وقتی دیگر مورد نیاز نیستند، اما ممکن است باعث کرش شدن بازی‌های بسته‌بندی شده شود. پردازنده و حافظه پرده عدن تنظیمات آزمایشی برای بهبود عملکرد و قابلیت. این تنظیمات ممکن است باعث نمایش صفحه سیاه یا سایر مشکلات بازی شود. @@ -126,8 +124,10 @@ تیک‌ها رد کردن ابطال داخلی CPU بعضی ابطال‌های حافظه نهان در هنگام به‌روزرسانی‌های حافظه را رد می‌کند، استفاده از CPU را کاهش داده و عملکرد آن را بهبود می‌بخشد. ممکن است در برخی بازی‌ها باعث مشکلات یا خرابی شود. - سطح DMA - دقت صحت DMA را کنترل می کند. دقت بالاتر می تواند مشکلات برخی بازی ها را برطرف کند، اما در برخی موارد نیز می تواند بر عملکرد تأثیر بگذارد. اگر مطمئن نیستید، آن را روی پیش فرض بگذارید. + فعال‌سازی شبیه‌سازی MMU میزبان + این بهینه‌سازی دسترسی‌های حافظه توسط برنامه میهمان را تسریع می‌کند. فعال‌سازی آن باعث می‌شود خواندن/نوشتن حافظه میهمان مستقیماً در حافظه انجام شود و از MMU میزبان استفاده کند. غیرفعال کردن این قابلیت، همه دسترسی‌های حافظه را مجبور به استفاده از شبیه‌سازی نرم‌افزاری MMU می‌کند. + دقت DMA + دقت صحت DMA را کنترل می کند. دقت ایمن می تواند مشکلات برخی بازی ها را برطرف کند، اما در برخی موارد نیز ممکن است بر عملکرد تأثیر بگذارد. اگر مطمئن نیستید، این گزینه را روی پیش فرض بگذارید. 4 گیگابایت (توصیه شده) 6 گیگابایت (ناامن) @@ -449,8 +449,7 @@ برنامک‌های سیستم را با استفاده از ثابت‌افزار نصب شده راه اندازی کنید فریمور نصب نشده یا نسخه نامعتبر است برنامک در دسترس نیست - prod.keys و -فریمور شما نصب شده است و دوباره امتحان کنید.
همچنین مطمئن شوید که فریمور شما نسخه 19.0.1 یا قدیمی‌تر است.]]>
+ prod.keys و فریمور شما نصب شده است و دوباره امتحان کنید.
همچنین مطمئن شوید که فریمور شما نسخه 19.0.1 یا قدیمی‌تر است.]]>
آلبوم تصاویر ذخیره شده در پوشه اسکرین شات‌های کاربر را با نمایشگر عکس سیستم مشاهده کنید ویرایش Mii @@ -719,10 +718,10 @@ آپدیت‌ها و DLC مودها و چیت‌ها اطلاعیه مهم افزونه - + برای نصب مودها و چیت ها، باید پوشه ای را انتخاب کنید که حاوی مسیر cheats/ یا romfs/ یا exefs/ باشد. ما نمی‌توانیم تأیید کنیم که این‌ها با بازی شما سازگار هستند، بنابراین مراقب باشید! مسیر نامعتبر - + لطفاً مطمئن شوید که مسیر انتخابی شما حاوی یک پوشه cheats/ یا romfs/ یا exefs/ می‌باشد و دوباره امتحان کنید. افزونه با موفقیت نصب شد در حال تأیید محتوا… @@ -741,14 +740,14 @@ رام شما رمزگذاری شده است - کارت‌های بازی یا عنوان‌های دیجیتال را دنبال کنید.]]> + کارت‌های بازی یا عنوان‌های دیجیتال را دنبال کنید.]]> در راه‌اندازی اولیه هسته ویدیو خطایی رخ داد این مورد معمولاً توسط یک درایور گرافیکی ناسازگار ایجاد می‌شود. نصب درایور گرافیکی سفارشی ممکن است این مشکل را حل کند. رام بارگذاری نشد فایل رام وجود ندارد بازی نیاز به فیرمور دارد - فیرمور را دامپ و نصب کنید یا برای ادامه کار "تایید" را فشار دهید.]]> + فیرمور را دامپ و نصب کنید یا برای ادامه کار \"تایید\" را فشار دهید.]]> در حال جستجوی بازی... @@ -803,7 +802,8 @@ مرکز نسبی استیک لغزش دکمه‌های جهتی لرزش لمسی - نشان دادن نمایش روی صفحه + نمایش کنترلر + پنهان کردن کنترلر تغییر همه تنظیم نمایش روی صفحه مقیاس @@ -866,9 +866,8 @@ پیش فرض - معمولی - بالا - فوق العاده + ناایمن (سریع) + ایمن (پایدار) 0.25X (180p/270p) @@ -916,13 +915,13 @@ کشش تا پر کردن پنجره - دینارمیک (کند) + Dynarmic (JIT) اجرای کد اصلی (NCE) دقیق ناامن - بدگمان (کند) + بدگمان کلیدهای جهتی diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index a7139ddbf6..12c93fd76c 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -65,8 +65,6 @@ Extensions GPU Rendu - RAII - Une méthode de gestion automatique des ressources dans Vulkan qui assure la libération correcte des ressources lorsqu\'elles ne sont plus nécessaires, mais peut provoquer des plantages dans les jeux regroupés. CPU et mémoire Voile d\'Eden Paramètres expérimentaux pour améliorer les performances et les capacités. Ces paramètres peuvent causer des écrans noirs ou d\'autres problèmes de jeu. @@ -126,8 +124,10 @@ Ticks Ignorer l\'invalidation interne du CPU 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. - Niveau DMA - Contrôle la précision du DMA. Une précision plus élevée 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-la sur Défaut. + Activer l\'émulation de la MMU hôte + Cette optimisation accélère les accès mémoire par le programme invité. L\'activer entraîne que les lectures/écritures mémoire de l\'invité sont effectuées directement en mémoire et utilisent la MMU de l\'hôte. Désactiver cela force tous les accès mémoire à utiliser l\'émulation logicielle de la MMU. + Précision DMA + 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. 4 Go (Recommandé) 6 Go (Dangereux) @@ -451,8 +451,7 @@ Lancer des applets système en utilisant le firmware installé Firmware non installé ou version invalide Applet non disponible - prod.keys et -firmware sont installés et réessayez.
Assurez-vous également que votre firmware est en version 19.0.1 ou antérieure.]]>
+ prod.keys et firmware sont installés et réessayez.
Assurez-vous également que votre firmware est en version 19.0.1 ou antérieure.]]>
Album Afficher les images stockées dans le dossier de captures d\'écran de l\'utilisateur avec le visualiseur de photos système. Éditeur Mii @@ -768,10 +767,10 @@ Mises à jour et DLC Mods et cheats Notification importante concernant l\'addon - + Pour installer des mods et des cheats, vous devez sélectionner un dossier contenant un répertoire cheats/, romfs/ ou exefs/. Nous ne pouvons pas garantir leur compatibilité avec votre jeu, alors soyez prudent ! Répertoire non valide - + Veuillez vous assurer que le répertoire que vous avez sélectionné contient un dossier cheats/, romfs/ ou exefs/, puis réessayez. Addon installé avec succès Vérification du contenu... @@ -790,14 +789,14 @@ Votre ROM est cryptée - cartes de jeu ou titres numériques.]]> + cartes de jeu ou titres numériques.]]> prod.keys est installé pour que les jeux puissent être déchiffrés.]]> Une erreur s\'est produite lors de l\'initialisation du noyau vidéo Cela est généralement dû à un pilote GPU incompatible. L\'installation d\'un pilote GPU personnalisé peut résoudre ce problème. Impossible de charger la ROM Le fichier ROM n\'existe pas Jeu nécessite un firmware - dumper et installer le firmware ou appuyez sur "OK" pour continuer quand même.]]> + dumper et installer le firmware ou appuyez sur \"OK\" pour continuer quand même.]]> Recherche du jeu... @@ -852,7 +851,8 @@ Centre du stick relatif Glissement du D-pad Toucher haptique - Afficher l\'overlay + Afficher la manette + Masquer la manette Tout basculer Ajuster l\'overlay Échelle @@ -915,9 +915,8 @@ Défaut - Normal - Élevé - Extrême + Dangereux (rapide) + Sûr (stable) 0.25X (180p/270p) @@ -965,13 +964,13 @@ Étirer à la fenêtre - Dynarmic (Lent) + Dynarmic (JIT) Exécution de code natif (NCE) Précis Risqué - Paranoïaque (Lent) + Paranoïaque Pavé directionnel diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index 63aaee043e..9efaf05085 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -65,8 +65,6 @@ הרחבות GPU רנדרר - RAII - שיטה לניהול אוטומטי של משאבים ב-Vulkan המבטיחה שחרור נכון של משאבים כאשר הם כבר לא נחוצים, אך עלולה לגרום לקריסות במשחקים מאוגדים. מעבד וזיכרון עדן וייל הגדרות ניסיוניות לשיפור ביצועים ויכולות. הגדרות אלו עלולות לגרום למסכים שחורים או לבעיות אחרות במשחק. @@ -127,8 +125,10 @@ טיקים דלג על איפוס מטמון פנימי של המעבד מדלג על איפוסי מטמון מסוימים במהלך עדכוני זיכרון, מפחית שימוש במעבד ומשפר ביצועים. עלול לגרום לתקלות או קריסות בחלק מהמשחקים. - רמת DMA - שולטת בדיוק הדיוק של DMA. דיוק גבוה יותר יכול לתקן בעיות בחלק מהמשחקים, אך הוא עלול גם להשפיע על הביצועים במקרים מסוימים. אם אינך בטוח, השאר ברירת מחדל. + הפעל אמולציית MMU מארח + אופטימיזציה זו מאיצה את גישת הזיכרון על ידי התוכנית האורחת. הפעלתה גורמת לכך שפעולות קריאה/כתיבה לזיכרון האורח מתבצעות ישירות לזיכרון ומשתמשות ב-MMU של המארח. השבתת זאת מאלצת את כל גישות הזיכרון להשתמש באמולציית MMU תוכנתית. + דיוק DMA + שולט בדיוק הדיוק של DMA. דיוק בטוח יכול לתקן בעיות בחלק מהמשחקים, אך הוא עלול גם להשפיע על הביצועים במקרים מסוימים. אם אינך בטוח, השאר זאת על ברירת מחדל. 4GB (מומלץ) 6GB (לא בטוח) @@ -422,10 +422,12 @@ מאפייני תיקיית משחקים נכשל בייבוא %d שמירה + נכשל בייבוא %d שמירות נכשל בייבוא %d שמירות יובא בהצלחה %d שמירה + יובא בהצלחה %d שמירות יובא בהצלחה %d שמירות לא נמצאו שמירות @@ -450,8 +452,8 @@ מערכת שיגור Applet משתמשת בתוכנה המותקנת קושחה לא מותקנת או גרסה לא תקינה Applet לא זמין - prod.keys שלך -וה-קושחה מותקנים ונסה שוב.
כמו כן, ודא שהקושחה שלך בגרסה 19.0.1 או ישנה יותר.]]>
+ prod.keys שלך +וה-קושחה מותקנים ונסה שוב.
כמו כן, ודא שהקושחה שלך בגרסה 19.0.1 או ישנה יותר.]]>
אלבום צפה בתמונות השמורות בתיקיית צילומי המסך של המשתמש בעזרת מציג התמונות של המערכת עורך Mii @@ -676,14 +678,14 @@ אימות התקינות הצליח! המשחק שלך מוצפן - כרטיסי משחק או כותרות דיגיטליות מחדש.]]> + כרטיסי משחק או כותרות דיגיטליות מחדש.]]> prod.keys מותקן כך שניתן יהיה לפענח משחקים.]]> התרחשה בעיה באתחול של ליבת הווידאו זה בדרך כלל נגרם על ידי דרייבר לא מתאים עבור המעבד הגרפי. התקנת דרייבר אשר מתאים למעבד הגרפי יכול לפתור את הבעיה הזו. אין אפשרות לטעון את המשחק קובץ המשחק לא קיים המשחק דורש קושחה - שמור והתקן קושחה או לחץ "אישור" כדי להמשיך בכל מקרה.]]> + שמור והתקן קושחה או לחץ \"אישור\" כדי להמשיך בכל מקרה.]]> מחפש משחק... @@ -737,7 +739,8 @@ מרכז ג׳ויסטיק יחסי החלקת D-pad רטט מגע - הצג את שכבת-העל + הצג בקר + הסתר בקר החלף הכל התאם את שכבת-העל קנה מידה @@ -797,9 +800,8 @@ ברירת מחדל - רגיל - גבוה - קיצוני + לא בטוח (מהיר) + בטוח (יציב) 0.25X (180p/270p) @@ -842,13 +844,13 @@ הרחב לגודל המסך - דינמי (איטי) + דינמי ביצוע קוד מקורי (NCE) מדויק לא בטוח - פראנואידי (איטי) + פראנואידי D-pad diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 15dd00997b..20b222818f 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -65,8 +65,6 @@ GPU kiterjesztések Megjelenítő - RAII - A Vulkan erőforrás-kezelési módszere, amely biztosítja az erőforrások megfelelő felszabadítását, ha már nincs rájuk szükség, de csomagolt játékok összeomlását okozhatja. CPU és memória Eden Fátyla Kísérleti beállítások a teljesítmény és képesség javításához. Ezek a beállítások fekete képernyőket vagy más játékproblémákat okozhatnak. @@ -126,8 +124,10 @@ Tick-ek CPU belső érvénytelenítés kihagyása Kihagy néhány CPU-oldali gyorsítótár-érvénytelenítést memóriafrissítések közben, csökkentve a CPU használatát és javítva a teljesítményt. Néhány játékban hibákat vagy összeomlást okozhat. - DMA szint - Szabályozza a DMA pontosságát. A magasabb pontosság megoldhat néhány játék problémáit, de bizonyos esetekben befolyásolhatja a teljesítményt. Ha bizonytalan, hagyja Alapértelmezett beállításnál. + Gazda MMU emuláció engedélyezése + Ez az optimalizáció gyorsítja a vendégprogram memória-hozzáférését. Engedélyezése esetén a vendég memóriaolvasási/írási műveletei közvetlenül a memóriában történnek, és kihasználják a gazda MMU-ját. Letiltás esetén minden memória-hozzáférés a szoftveres MMU emulációt használja. + DMA pontosság + Szabályozza a DMA pontosságát. A biztonságos pontosság megoldhat néhány játék problémáit, de bizonyos esetekben befolyásolhatja a teljesítményt. Ha bizonytalan, hagyja Alapértelmezett beállításon. 4GB (Ajánlott) 6GB (Nem biztonságos) @@ -447,8 +447,7 @@ Rendszer appletek indítása a telepített firmware-rel A firmware nincs telepítve vagy érvénytelen verzió Applet nem elérhető - prod.keys fájl és -firmware telepítve van-e, majd próbálja újra.
Győződjön meg arról is, hogy a firmware verziója 19.0.1 vagy régebbi.]]>
+ prod.keys fájl és firmware telepítve van-e, majd próbálja újra.
Győződjön meg arról is, hogy a firmware verziója 19.0.1 vagy régebbi.]]>
Album Képernyőképek megtekintése a rendszer fényképnézegetőjével Mii szerkesztés @@ -758,10 +757,10 @@ Frissítések és DLC Modok és csalások Fontos kiegészítő értesítés - + A modok és csalások telepítéséhez olyan mappát válassz, amely tartalmaz cheats/, romfs/ vagy exefs/ könyvtárat. Nem tudjuk garantálni, hogy ezek kompatibilisek lesznek a játékoddal, ezért légy óvatos! Érvénytelen könyvtár - + Kérjük, győződj meg róla, hogy a kiválasztott könyvtár tartalmazza a cheats/, romfs/ vagy exefs/ mappát, majd próbáld újra. Kiegészítő sikeresen telepítve Tartalom ellenőrzése... @@ -780,14 +779,14 @@ ROM titkosítva - játékkártyák vagy digitális címek újradumpolásához.]]> + játékkártyák vagy digitális címek újradumpolásához.]]> prod.keys fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]> Hiba lépett fel a videómag inicializása során Ezt általában egy nem kompatibilis GPU illesztő okozza. Egyéni GPU illesztőprogram telepítése megoldhatja a problémát. Nem sikerült betölteni a ROM-ot ROM fájl nem létezik A játék firmware-t igényel - dumpolja és telepítse a firmware-t, vagy nyomja meg az "OK" gombot a folytatáshoz.]]> + dumpolja és telepítse a firmware-t, vagy nyomja meg az \"OK\" gombot a folytatáshoz.]]> Játék keresése... @@ -841,7 +840,8 @@ Irányítás átkapcsolása D-pad csúsztatása Érintés haptikája - Átfedés mutatása + Vezérlő megjelenítése + Vezérlő elrejtése Összes átkapcsolása Átfedés testreszabása Skálázás @@ -904,9 +904,8 @@ Alapértelmezett - Normál - Magas - Extrém + Nem biztonságos (gyors) + Biztonságos (stabil) 0.25X (180p/270p) @@ -952,13 +951,13 @@ Ablakhoz nyújtás - Dinamikus (lassú) + Dynarmic (JIT) Natív kód végrehajtás (Native code execution (NCE)) Pontos Nem biztonságos - Paranoid (Lassú) + Paranoid D-pad diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 7daa4a8e94..83db153bec 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -65,8 +65,6 @@ Ekstensi GPU Renderer - RAII - Metode manajemen sumber daya otomatis di Vulkan yang memastikan pelepasan sumber daya yang tepat ketika tidak lagi diperlukan, tetapi dapat menyebabkan crash pada game yang dibundel. CPU dan Memori Eden\'s Veil Pengaturan eksperimental untuk meningkatkan kinerja dan kemampuan. Pengaturan ini dapat menyebabkan layar hitam atau masalah game lainnya. @@ -126,8 +124,10 @@ Ticks Lewati Pembatalan Internal CPU Melewati beberapa pembatalan cache sisi CPU selama pembaruan memori, mengurangi penggunaan CPU dan meningkatkan kinerjanya. Mungkin menyebabkan gangguan atau crash pada beberapa game. - Level DMA - Mengontrol akurasi presisi DMA. Presisi yang lebih tinggi dapat memperbaiki masalah di beberapa game, tetapi juga dapat memengaruhi performa dalam beberapa kasus. Jika tidak yakin, biarkan di Bawaan. + Aktifkan Emulasi MMU Host + Optimasi ini mempercepat akses memori oleh program tamu. Mengaktifkannya menyebabkan pembacaan/penulisan memori tamu dilakukan langsung ke memori dan memanfaatkan MMU Host. Menonaktifkan ini memaksa semua akses memori menggunakan Emulasi MMU Perangkat Lunak. + Akurasi DMA + Mengontrol keakuratan presisi DMA. Presisi aman dapat memperbaiki masalah di beberapa game, tetapi juga dapat memengaruhi kinerja dalam beberapa kasus. Jika tidak yakin, biarkan ini pada Bawaan. 4GB (Direkomendasikan) 6GB (Tidak Aman) @@ -321,10 +321,10 @@ Karousel Folder Perangkat Lunak Pre-Alpha - "PERINGATAN: Build ini tidak dimaksudkan untuk dibagikan atau ditunjukkan ke publik. Perangkat lunak ini dalam tahap pre-alpha dan mungkin memiliki bug dan fitur yang belum lengkap. \nJika Anda mendapatkan akses tidak sah ke build ini; sangat disarankan untuk mencopotnya segera" + PERINGATAN: Build ini tidak dimaksudkan untuk dibagikan atau ditunjukkan ke publik. Perangkat lunak ini dalam tahap pre-alpha dan mungkin memiliki bug dan fitur yang belum lengkap. \nJika Anda mendapatkan akses tidak sah ke build ini; sangat disarankan untuk mencopotnya segera Jangan Tampilkan Lagi - PERANGKAT LUNAK PRE-ALPHA; TIDAK UNTUK PENGGUNAAN PUBLIK\ - "Direktori game baru berhasil ditambahkan" + PERANGKAT LUNAK PRE-ALPHA; TIDAK UNTUK PENGGUNAAN PUBLIK + Direktori game baru berhasil ditambahkan Permainan Cari Pengaturan @@ -447,8 +447,7 @@ Meluncurkan sistem applet menggunakan firmware yang diinstal Firmware tidak terinstal atau versi tidak valid Applet tidak tersedia - prod.keys dan -firmware Anda terinstal dan coba lagi.
Pastikan juga firmware Anda versi 19.0.1 atau lebih lama.]]>
+ prod.keys dan firmware Anda terinstal dan coba lagi.
Pastikan juga firmware Anda versi 19.0.1 atau lebih lama.]]>
Album Lihat gambar yang disimpan di folder tangkapan layar pengguna dengan penampil foto sistem. Ubah Mii @@ -712,10 +711,10 @@ Update Dan Dlc Mod Dan Cheat Pemberitahuan Pengaya - + Untuk memasang mod dan cheat, Anda harus memilih folder yang berisi direktori cheats/, romfs/, atau exefs/. Kami tidak dapat memverifikasi apakah semua ini kompatibel dengan game Anda, jadi berhati-hatilah! Direktori Tidak Valid - + Pastikan direktori yang Anda pilih berisi folder cheats/, romfs/, atau exefs/, lalu coba lagi. Pengaya Sukses Dipasang Memverifikasi Konten @@ -734,14 +733,14 @@ ROM-mu ter-enkripsi - kartrid game atau judul digital Anda.]]> + kartrid game atau judul digital Anda.]]> prod.keys diinstal sehingga game dapat didekripsi.]]> Terjadi kesalahan ketika menginisialisasi inti video. Hal ini biasanya disebabkan oleh driver GPU yang tidak kompatibel. Menginstal driver GPU khusus dapat mengatasi masalah ini Tidak Dapat Memuat ROM Berkas Tidak Ditemukan Game memerlukan firmware - dump dan instal firmware, atau tekan "OK" untuk melanjutkan.]]> + dump dan instal firmware, atau tekan \"OK\" untuk melanjutkan.]]> Mencari game... @@ -796,7 +795,8 @@ Pusat stick relatif Geser Dpad Haptik - Tampilkan Hamparan + Tampilkan Kontroler + Sembunyikan Kontroler Alihkan Semua Menyesuaikan Skala @@ -859,9 +859,8 @@ Bawaan - Normal - Tinggi - Ekstrem + Tidak Aman (cepat) + Aman (stabil) 0.25X (180p/270p) @@ -909,13 +908,13 @@ Merentangkan - Dynamic (Lambat) + Dynarmic (JIT) Native code execution (NCE) Akurat Berbahaya - Paranoid (Slow) + Paranoid D Pad diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 66446eae34..7d5c118441 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -65,8 +65,6 @@ Estensioni GPU Renderer - RAII - Un metodo di gestione automatica delle risorse in Vulkan che garantisce il corretto rilascio delle risorse quando non sono più necessarie, ma può causare crash nei giochi in bundle. CPU e Memoria Velo di Eden Impostazioni sperimentali per migliorare prestazioni e capacità. Queste impostazioni possono causare schermate nere o altri problemi di gioco. @@ -126,8 +124,10 @@ Tick Salta invalidamento interno CPU Salta alcuni invalidamenti della cache lato CPU durante gli aggiornamenti di memoria, riducendo l\'uso della CPU e migliorandone le prestazioni. Potrebbe causare glitch o crash in alcuni giochi. - Livello DMA - Controlla la precisione del DMA. Una precisione più alta può risolvere problemi in alcuni giochi, ma in alcuni casi può influire sulle prestazioni. Se non sei sicuro, lascia su Predefinito. + Abilita emulazione MMU host + Questa ottimizzazione accelera gli accessi alla memoria da parte del programma guest. Abilitandola, le letture/scritture della memoria guest vengono eseguite direttamente in memoria e sfruttano la MMU host. Disabilitandola, tutti gli accessi alla memoria sono costretti a utilizzare l\'emulazione software della MMU. + Precisione DMA + Controlla la precisione del DMA. La precisione sicura può risolvere problemi in alcuni giochi, ma in alcuni casi può anche influire sulle prestazioni. In caso di dubbi, lascia questo su Predefinito. 4GB (Consigliato) 6GB (Non sicuro) @@ -422,10 +422,12 @@ Proprietà della cartella di Gioco Importazione fallita per %d salvataggio + Importazione fallita per %d salvataggi Importazione fallita per %d salvataggi Importati %d salvataggio + Importati %d salvataggi Importati %d salvataggi Nessun salvataggio trovato @@ -450,8 +452,7 @@ Avvia applet di sistema usando il firmware installato Firmware non installato o versione non valida Applet non disponibile - prod.keys e -firmware siano installati e riprova.
Inoltre, assicurati che il tuo firmware sia versione 19.0.1 o precedente.]]>
+ prod.keys e firmware siano installati e riprova.
Inoltre, assicurati che il tuo firmware sia versione 19.0.1 o precedente.]]>
Album Visualizza le immagini salvate nella cartella screenshots dell\'utente con il visualizzatore immagini di sistema Modifica Mii @@ -707,14 +708,14 @@ L\'integrità dei contenuti non è stata validata La tua ROM è criptata - schede di gioco o titoli digitali.]]> + schede di gioco o titoli digitali.]]> prod.keys sia installato in modo che i giochi possano essere decrittati.]]> È stato riscontrato un errore nell\'inizializzazione del core video Questo è causato solitamente dal driver incompatibile di una GPU. L\'installazione di driver GPU personalizzati potrebbe risolvere questo problema. Impossibile caricare la ROM Il file della ROM non esiste Il gioco richiede firmware - dumpa e installa il firmware, o premi "OK" per continuare comunque.]]> + dumpa e installa il firmware, o premi \"OK\" per continuare comunque.]]> Ricerca del gioco in corso... @@ -768,7 +769,8 @@ Centro relativo degli Stick DPad A Scorrimento Feedback Aptico - Mostra l\'overlay + Mostra l\'controller + Nascondi l\'controller Attiva/Disattiva tutto Regola l\'overlay Scala @@ -828,9 +830,8 @@ Predefinito - Normale - Alto - Estremo + Non sicuro (veloce) + Sicuro (stabile) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 2090aa5f74..0d0c37c78f 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -65,8 +65,6 @@ GPU拡張機能 レンダラー - RAII - Vulkanにおける自動リソース管理の方法で、不要になったリソースを適切に解放しますが、バンドルされたゲームでクラッシュを引き起こす可能性があります。 CPUとメモリ エデンのベール パフォーマンスと機能を向上させる実験的な設定。これらの設定は黒画面やその他のゲームの問題を引き起こす可能性があります。 @@ -126,8 +124,10 @@ ティック CPU内部無効化をスキップ メモリ更新時のCPU側キャッシュ無効化をスキップし、CPU使用率を減らして性能を向上させます。一部のゲームで不具合やクラッシュが発生する可能性があります。 - DMAレベル - DMAの精度を制御します。精度を高くすると一部のゲームの問題が修正される場合がありますが、場合によってはパフォーマンスに影響を与える可能性もあります。不明な場合は、デフォルトのままにしてください。 + ホストMMUエミュレーションを有効化 + この最適化により、ゲストプログラムによるメモリアクセスが高速化されます。有効にすると、ゲストのメモリ読み書きが直接メモリ内で実行され、ホストのMMUを利用します。無効にすると、すべてのメモリアクセスでソフトウェアMMUエミュレーションが使用されます。 + DMA精度 + DMAの精度を制御します。安全な精度は一部のゲームの問題を修正できる場合がありますが、場合によってはパフォーマンスに影響を与える可能性もあります。不明な場合は、これをデフォルトのままにしてください。 4GB (推奨) 6GB (安全でない) @@ -411,11 +411,9 @@ このフォルダは既に追加されています ゲームフォルダのプロパティ - %d件のセーブインポート失敗 %d件のセーブインポート失敗 - %d件のセーブインポート成功 %d件のセーブインポート成功 セーブデータが見つかりません @@ -440,8 +438,7 @@ インストール済みファームウェアでシステムアプレットを起動 ファームウェアがインストールされていないか無効なバージョンです アプレット利用不可 - prod.keysファイルと -ファームウェアがインストールされていることを確認し、再度お試しください。
また、ファームウェアが19.0.1以下のバージョンであることを確認してください。]]>
+ prod.keysファイルと ファームウェアがインストールされていることを確認し、再度お試しください。
また、ファームウェアが19.0.1以下のバージョンであることを確認してください。]]>
アルバム システムフォトビューアでスクリーンショットを表示 Mii編集 @@ -666,14 +663,14 @@ 整合性の確認に失敗しました! ROMが暗号化されています - ゲームカードまたはデジタルタイトルを再ダンプするにはガイドに従ってください。]]> + ゲームカードまたはデジタルタイトルを再ダンプするにはガイドに従ってください。]]> prod.keys ファイルがインストールされていることを確認してください。]]> ビデオコアの初期化中にエラーが発生しました これは通常、互換性のないGPUドライバーが原因で発生します。 カスタムGPUドライバーをインストールすると、問題が解決する可能性があります。 ROMの読み込みに失敗しました ROMファイルが存在しません ゲームにはファームウェアが必要です - ファームウェアをダンプしてインストールするか、"OK"を押して続行してください。]]> + ファームウェアをダンプしてインストールするか、\"OK\"を押して続行してください。]]> ゲームを検索中... @@ -727,7 +724,8 @@ スティックを固定しない 十字キーをスライド操作 タッチ振動 - ボタンを表示 + コントローラーを表示 + コントローラーを非表示 すべて切替 見た目を調整 大きさ @@ -787,9 +785,8 @@ デフォルト - 標準 - - 最高 + 安全でない(高速) + 安全(安定) 0.25X (180p/270p) @@ -832,13 +829,13 @@ 画面に合わせる - Dynarmic (低速) + Dynarmic (JIT) ネイティブコード実行 (NCE) 正確 不安定 - パラノイド (低速) + パラノイド 方向ボタン diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index d73dc53987..ff0af4fc43 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -65,8 +65,6 @@ GPU 확장 기능 렌더러 - RAII - Vulkan에서 자동 리소스 관리를 위한 방법으로, 더 이상 필요하지 않은 리소스를 적절히 해제하지만 번들된 게임에서 충돌을 일으킬 수 있습니다. CPU 및 메모리 에덴의 베일 성능 및 기능을 향상시키기 위한 실험적 설정. 이 설정은 검은 화면 또는 기타 게임 문제를 일으킬 수 있습니다. @@ -126,8 +124,10 @@ CPU 내부 무효화 건너뛰기 메모리 업데이트 시 일부 CPU 측 캐시 무효화를 건너뛰어 CPU 사용량을 줄이고 성능을 향상시킵니다. 일부 게임에서 오류 또는 충돌을 일으킬 수 있습니다. - DMA 수준 - DMA 정밀도를 제어합니다. 높은 정밀도는 일부 게임의 문제를 해결할 수 있지만 경우에 따라 성능에 영향을 미칠 수도 있습니다. 확실하지 않다면 기본값으로 두세요. + 호스트 MMU 에뮬레이션 사용 + 이 최적화는 게스트 프로그램의 메모리 접근 속도를 높입니다. 활성화하면 게스트의 메모리 읽기/쓰기가 메모리에서 직접 수행되고 호스트의 MMU를 활용합니다. 비활성화하면 모든 메모리 접근에 소프트웨어 MMU 에뮬레이션을 사용하게 됩니다. + DMA 정확도 + DMA 정밀도 정확도를 제어합니다. 안전한 정밀도는 일부 게임의 문제를 해결할 수 있지만 경우에 따라 성능에 영향을 미칠 수도 있습니다. 확실하지 않은 경우 기본값으로 두십시오. 4GB (권장) 6GB (안전하지 않음) @@ -320,10 +320,10 @@ 캐러셀 폴더 프리-알파 소프트웨어 - "경고: 이 빌드는 공개용이 아닙니다. 이 소프트웨어는 프리-알파 단계이며 버그 및 미완성 기능이 있을 수 있습니다. \n무단으로 이 빌드를 획득한 경우 즉시 삭제하는 것이 좋습니다." + 경고: 이 빌드는 공개용이 아닙니다. 이 소프트웨어는 프리-알파 단계이며 버그 및 미완성 기능이 있을 수 있습니다. \n무단으로 이 빌드를 획득한 경우 즉시 삭제하는 것이 좋습니다. 다시 보지 않기 - 프리-알파 소프트웨어; 공개용 아님\ - 새 게임 디렉터리가 성공적으로 추가되었습니다." + 프리-알파 소프트웨어; 공개용 아님 + 새 게임 디렉터리가 성공적으로 추가되었습니다. 게임 검색 설정 @@ -446,8 +446,7 @@ 설치된 펌웨어를 사용해 시스템 애플릿을 실행합니다. 펌웨어가 설치되지 않았거나 유효하지 않은 버전입니다 애플릿을 사용할 수 없음 - prod.keys 파일과 -펌웨어가 설치되어 있는지 확인하고 다시 시도하세요.
또한 펌웨어 버전이 19.0.1 이하인지 확인하세요.]]>
+ prod.keys 파일과 펌웨어가 설치되어 있는지 확인하고 다시 시도하세요.
또한 펌웨어 버전이 19.0.1 이하인지 확인하세요.]]>
앨범 시스템 사진 뷰어로 유저 스크린샷 폴더에 저장된 이미지를 확인합니다. Mii 편집 @@ -712,10 +711,10 @@ 업데이트 및 DLC 모드 및 치트 중요 애드온 알림 - + 모드와 치트를 설치하려면 cheats/, romfs/, 또는 exefs/ 디렉토리를 포함하는 폴더를 선택해야 합니다. 게임과의 호환 여부를 확인할 수 없기 때문에 신중하게 결정하세요. 잘못된 디렉토리 - + 선택한 디렉토리가 cheats/, romfs/, 또는 exefs/ 폴더를 포함하는지 확인하고 다시 시도하세요. 애드온을 설치했습니다. 콘텐츠 확인 중... @@ -734,14 +733,14 @@ 롬 파일이 암호화되어있음 - 게임 카드 또는 디지털 타이틀을 다시 덤프하려면 가이드를 따르세요.]]> + 게임 카드 또는 디지털 타이틀을 다시 덤프하려면 가이드를 따르세요.]]> prod.keys 파일이 설치되어 있는지 확인하세요.]]> 비디오 코어를 초기화하는 동안 오류 발생 일반적으로 이 문제는 호환되지 않는 GPU 드라이버로 인해 발생합니다. 사용자 지정 GPU 드라이버를 설치하면 이 문제가 해결될 수 있습니다. 롬 파일을 불러올 수 없음 롬 파일이 존재하지 않음 게임에 펌웨어가 필요합니다 - 펌웨어를 덤프하여 설치하거나 "확인"을 눌러 계속 진행하세요.]]> + 펌웨어를 덤프하여 설치하거나 \"확인\"을 눌러 계속 진행하세요.]]> 게임 검색 중... @@ -796,6 +795,7 @@ 십자키 슬라이드 터치 햅틱 컨트롤러 표시 + 컨트롤러 숨기기 모두 선택 컨트롤러 조정 크기 @@ -858,9 +858,8 @@ 기본값 - 보통 - 높음 - 극단적 + 안전하지 않음(빠름) + 안전함(안정적) 0.25X (180p/270p) @@ -908,13 +907,13 @@ 화면에 맞춤 - Dynarmic (느림) + Dynarmic (JIT) 네이티브 코드 실행 (NCE) 정확함 최적화 (안전하지 않음) - 최적화하지 않음 (느림) + 최적화하지 않음 십자키 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 61fa5792e5..313d8797c3 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -65,8 +65,6 @@ GPU-utvidelser Renderer - RAII - En metode for automatisk ressurshåndtering i Vulkan som sikrer riktig frigjøring av ressurser når de ikke lenger trengs, men kan føre til krasj i bundlede spill. CPU og minne Edens slør Eksperimentelle innstillinger for å forbedre ytelse og funksjonalitet. Disse innstillingene kan forårsake svarte skjermer eller andre spillproblemer. @@ -126,8 +124,10 @@ Takter Hopp over CPU intern invalidering Hopper over enkelte CPU-side cache-invalideringer under minneoppdateringer, reduserer CPU-bruk og forbedrer ytelsen. Kan forårsake feil eller krasj i noen spill. - DMA-nivå - Styrer DMA-presisjonsnøyaktigheten. Høyere presisjon kan fikse problemer i noen spill, men kan også påvirke ytelsen i noen tilfeller. Hvis du er usikker, la den stå på Standard. + Aktiver verts-MMU-emulering + Denne optimaliseringen fremskynder minnetilgang av gjesteprogrammet. Hvis aktivert, utføres gjestens minnelesing/skriving direkte i minnet og bruker vertens MMU. Deaktivering tvinger alle minnetilganger til å bruke programvarebasert MMU-emulering. + DMA-nøyaktighet + Kontrollerer DMA-presisjonsnøyaktigheten. Sikker presisjon kan fikse problemer i noen spill, men kan også påvirke ytelsen i noen tilfeller. Hvis du er usikker, la dette stå på Standard. 4GB (Anbefalt) 6GB (Usikkert) @@ -439,8 +439,7 @@ Start systemapplets Firmware er ikke installert eller ugyldig versjon Applet utilgjengelig - prod.keys-filen din og -firmware er installert og prøv igjen.
Kontroller også at firmwaren din er versjon 19.0.1 eller eldre.]]>
+ prod.keys-filen din og firmware er installert og prøv igjen.
Kontroller også at firmwaren din er versjon 19.0.1 eller eldre.]]>
Album Vis bilder i systemets fotovisning Mii-redigering @@ -657,14 +656,14 @@ Integritetsverifisering mislyktes! ROM-en din er kryptert - spillkort eller digitale titler på nytt.]]> + spillkort eller digitale titler på nytt.]]> prod.keys filen er installert slik at spillene kan dekrypteres.]]> Det oppstod en feil ved initialisering av videokjernen Dette skyldes vanligvis en inkompatibel GPU-driver. Installering av en tilpasset GPU-driver kan løse problemet. Kunne ikke laste inn ROM ROM-filen finnes ikke Spillet krever fastvare - dump og installer fastvare, eller trykk "OK" for å fortsette likevel.]]> + dump og installer fastvare, eller trykk \"OK\" for å fortsette likevel.]]> Søker etter spill... @@ -718,7 +717,8 @@ Relativt pinnesenter D-pad-skyving Berøringshaptikk - Vis overlegg + Vis kontroller + Skjul kontroller Veksle mellom alle Juster overlegg Skaler @@ -768,9 +768,8 @@ Standard - Normal - Høy - Ekstrem + Usikker (rask) + Sikker (stabil) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index d640112fca..4ebe24e1c9 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -65,8 +65,6 @@ Rozszerzenia GPU Renderer - RAII - Metoda automatycznego zarządzania zasobami w Vulkanie, która zapewnia prawidłowe zwalnianie zasobów, gdy nie są już potrzebne, ale może powodować awarie w pakietowych grach. Procesor i pamięć Zasłona Edenu Eksperymentalne ustawienia poprawiające wydajność i możliwości. Te ustawienia mogą powodować czarne ekrany lub inne problemy z grą. @@ -126,8 +124,10 @@ Takty Pomiń wewnętrzne unieważnienie CPU Pomija niektóre unieważnienia pamięci podręcznej po stronie CPU podczas aktualizacji pamięci, zmniejszając użycie CPU i poprawiając jego wydajność. Może powodować błędy lub awarie w niektórych grach. - Poziom DMA - Kontroluje dokładność precyzji DMA. Wyższy poziom może naprawić problemy w niektórych grach, ale może również wpłynąć na wydajność. Jeśli nie jesteś pewien, pozostaw wartość «Domyślny». + Włącz emulację MMU hosta + Ta optymalizacja przyspiesza dostęp do pamięci przez program gościa. Włączenie powoduje, że odczyty/zapisy pamięci gościa są wykonywane bezpośrednio w pamięci i wykorzystują MMU hosta. Wyłączenie wymusza użycie programowej emulacji MMU dla wszystkich dostępów do pamięci. + Dokładność DMA + Kontroluje dokładność precyzji DMA. Bezpieczna precyzja może naprawić problemy w niektórych grach, ale w niektórych przypadkach może również wpłynąć na wydajność. Jeśli nie jesteś pewien, pozostaw wartość Domyślną. 4GB (Zalecane) 6GB (Niebezpieczne) @@ -411,10 +411,14 @@ Właściwości folderu Błąd importu %d zapisu + Błąd importu %d zapisów + Błąd importu %d zapisów Błąd importu %d zapisów Pomyślnie zaimportowano %d zapis + Pomyślnie zaimportowano %d zapisów + Pomyślnie zaimportowano %d zapisów Pomyślnie zaimportowano %d zapisów Brak zapisów @@ -439,8 +443,7 @@ Uruchamia aplety systemowe. Firmware nie zainstalowany lub nieprawidłowa wersja Aplet niedostępny - prod.keys i -firmware są zainstalowane i spróbuj ponownie.
Upewnij się również, że firmware jest w wersji 19.0.1 lub starszej.]]>
+ prod.keys i firmware są zainstalowane i spróbuj ponownie.
Upewnij się również, że firmware jest w wersji 19.0.1 lub starszej.]]>
Album Przeglądaj zrzuty ekranu. Edytor Mii @@ -655,14 +658,14 @@ Dodatki Twój ROM jest zakodowany - karty gry lub tytuły cyfrowe.]]> + karty gry lub tytuły cyfrowe.]]> prod.keys jest zainstalowany aby gry mogły zostać odczytane.]]> Błąd inicjacji podsystemu graficznego Zazwyczaj spowodowane niekompatybilnym sterownikiem GPU, instalacja niestandardowego sterownika może rozwiązać ten problem. Nie można wczytać pliku ROM Plik ROM nie istnieje Gra wymaga oprogramowania sprzętowego - zrzuć i zainstaluj oprogramowanie sprzętowe, lub naciśnij "OK", aby kontynuować mimo to.]]> + zrzuć i zainstaluj oprogramowanie sprzętowe, lub naciśnij \"OK\", aby kontynuować mimo to.]]> Wyszukiwanie gry... @@ -716,7 +719,8 @@ Wycentruj gałki Ruchomy D-pad Wibracje haptyczne - Pokaż przyciski + Pokaż kontroler + Ukryj kontroler Włącz wszystkie Dostosuj nakładkę Skala @@ -765,9 +769,8 @@ 預設 - 普通 - - 極高 + Niezabezpieczone (szybkie) + Bezpieczne (stabilne) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index d0ec24f453..2f5f4c4b5b 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -65,8 +65,6 @@ Extensões da GPU Renderizador - RAII - Um método de gerenciamento automático de recursos no Vulkan que garante a liberação adequada de recursos quando não são mais necessários, mas pode causar falhas em jogos empacotados. CPU e Memória Véu do Éden Configurações experimentais para melhorar desempenho e capacidade. Essas configurações podem causar telas pretas ou outros problemas no jogo. @@ -126,8 +124,10 @@ Ticks Pular invalidação interna da CPU Ignora algumas invalidações de cache do lado da CPU durante atualizações de memória, reduzindo o uso da CPU e melhorando seu desempenho. Pode causar falhas ou travamentos em alguns jogos. - Nível DMA - Controla a precisão do DMA. Maior precisão pode corrigir problemas em alguns jogos, mas também pode impactar o desempenho em alguns casos. Se não tiver certeza, deixe em Padrão. + Ativar Emulação de MMU do Host + Esta otimização acelera os acessos à memória pelo programa convidado. Ativar isso faz com que as leituras/gravações de memória do convidado sejam feitas diretamente na memória e utilizem a MMU do Host. Desativar isso força todos os acessos à memória a usarem a Emulação de MMU por Software. + Precisão de DMA + Controla a precisão do DMA. A precisão segura pode corrigir problemas em alguns jogos, mas também pode afetar o desempenho em alguns casos. Se não tiver certeza, deixe isso como Padrão. 4GB (Recomendado) 6GB (Inseguro) @@ -321,10 +321,10 @@ Carrossel Pasta Software Pré-Alpha - "AVISO: Esta versão não deve ser compartilhada. Software em estágio pré-alpha pode conter bugs e recursos incompletos. \nSe você obteve acesso não autorizado a esta versão, é recomendado desinstalá-la imediatamente." + AVISO: Esta versão não deve ser compartilhada. Software em estágio pré-alpha pode conter bugs e recursos incompletos. \nSe você obteve acesso não autorizado a esta versão, é recomendado desinstalá-la imediatamente. Não mostrar novamente SOFTWARE PRÉ-ALPHA; NÃO PARA USO PÚBLICO - "Pasta de jogos adicionada com sucesso" + Pasta de jogos adicionada com sucesso Jogos Pesquisar Configurações @@ -451,8 +451,7 @@ Execute miniaplicativos do sistema usando o firmware instalado Firmware não instalado ou versão inválida Miniaplicativo não disponível - prod.keys e -firmware estejam instalados e tente novamente.
Além disso, verifique se seu firmware é a versão 19.0.1 ou mais antiga.]]>
+ prod.keys e firmware estejam instalados e tente novamente.
Além disso, verifique se seu firmware é a versão 19.0.1 ou mais antiga.]]>
Álbum Visualize imagens armazenadas na pasta de capturas de telas do usuário com o visualizador de imagens do sistema Editor de Mii @@ -769,10 +768,10 @@ uma tentativa de mapeamento automático Atualizações e DLC Mods e cheats Aviso importante sobre os complementos - + Para instalar mods e cheats, você deve selecionar uma pasta que contenha um diretório cheats/, romfs/ ou exefs. Não podemos verificar se eles são compatíveis com seu jogo, então tenha cuidado! Diretório inválido - + Por favor verifique se o diretório selecionado contém uma pasta cheats/, romfs/ ou exefs/ e tente novamente. Complemento instalado com sucesso Verificando conteúdo... @@ -791,14 +790,14 @@ uma tentativa de mapeamento automático Sua ROM está encriptada - cartões de jogo ou títulos digitais.]]> + cartões de jogo ou títulos digitais.]]> prod.keys está instalado para que os jogos possam ser decriptados.]]> Ocorreu um erro ao iniciar o núcleo de vídeo. Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver de GPU personalizado pode resolver este problema. Impossível carregar a ROM O arquivo ROM não existe O jogo requer firmware - faça dump e instale o firmware, ou pressione "OK" para continuar mesmo assim.]]> + faça dump e instale o firmware, ou pressione \"OK\" para continuar mesmo assim.]]> Procurando jogo... @@ -853,7 +852,8 @@ uma tentativa de mapeamento automático Centro Relativo do Analógico Deslizamento dos Botões Direcionais Vibração ao tocar - Mostrar overlay + Mostrar controle + Ocultar controle Marcar/Desmarcar tudo Ajustar overlay Escala @@ -916,9 +916,8 @@ uma tentativa de mapeamento automático Padrão - Normal - Alto - Extremo + Inseguro (rápido) + Seguro (estável) 0.25X (180p/270p) @@ -966,13 +965,13 @@ uma tentativa de mapeamento automático Esticar à janela - Dynarmic (Lenta) + Dynarmic (JIT) Execução de código nativo (NCE) Precisa Não segura - Paranoica (Lenta) + Paranoica Botões Direcionais diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 4e0fc4167a..084fe1c82d 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -65,8 +65,6 @@ Extensões da GPU Renderizador - RAII - Um método de gestão automática de recursos no Vulkan que garante a libertação adequada de recursos quando já não são necessários, mas pode causar falhas em jogos empacotados. CPU e Memória Véu do Éden Definições experimentais para melhorar o desempenho e capacidade. Estas definições podem causar ecrãs pretos ou outros problemas no jogo. @@ -126,8 +124,10 @@ Ticks Ignorar invalidação interna da CPU Ignora algumas invalidações de cache do lado da CPU durante atualizações de memória, reduzindo a utilização da CPU e melhorando o desempenho. Pode causar falhas ou crashes em alguns jogos. - Nível DMA - Controla a precisão do DMA. Maior precisão pode corrigir problemas em alguns jogos, mas também pode afetar o desempenho nalguns casos. Se não tiver a certeza, deixe em Predefinido. + Ativar Emulação de MMU do Anfitrião + Esta otimização acelera os acessos à memória pelo programa convidado. Ativar faz com que as leituras/escritas de memória do convidado sejam efetuadas diretamente na memória e utilizem a MMU do Anfitrião. Desativar força todos os acessos à memória a usar a Emulação de MMU por Software. + Precisão da DMA + Controla a precisão da DMA. A precisão segura pode resolver problemas em alguns jogos, mas também pode afetar o desempenho nalguns casos. Se não tiver a certeza, deixe esta opção em Predefinido. 4GB (Recomendado) 6GB (Inseguro) @@ -451,8 +451,7 @@ Inicie miniaplicativos do sistema usando o firmware instalado Firmware não instalado ou versão inválida Miniaplicativo não disponível - prod.keys e -firmware estão instalados e tente novamente.
Além disso, verifique se o seu firmware é a versão 19.0.1 ou mais antiga.]]>
+ prod.keys e firmware estão instalados e tente novamente.
Além disso, verifique se o seu firmware é a versão 19.0.1 ou mais antiga.]]>
Álbum Visualize imagens armazenadas na pasta de capturas de telas do usuário com o visualizador de imagens do sistema Editor de Mii @@ -769,10 +768,10 @@ uma tentativa de mapeamento automático Atualizações e DLC Mods e trapaças Aviso importante sobre os adicionais - + Para instalar mods e cheats, você deve selecionar uma pasta que contenha um diretório cheats/, romfs/ ou exefs. Não podemos verificar se eles são compatíveis com seu jogo, então tenha cuidado! Diretório inválido - + Por favor verifique se o diretório selecionado contém uma pasta cheats/, romfs ou exefs e tente novamente. Adicional instalado com sucesso Verificando conteúdo @@ -791,14 +790,14 @@ uma tentativa de mapeamento automático A tua ROM está encriptada - cartões de jogo ou títulos digitais.]]> + cartões de jogo ou títulos digitais.]]> prod.keys está instalado para que os jogos possam ser desencriptados.]]> Ocorreu um erro ao iniciar o núcleo de vídeo. Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver GPU pode resolver este problema. Impossível carregar a tua ROM O ficheiro da ROM não existe O jogo requer firmware - faça dump e instale o firmware, ou pressione "OK" para continuar mesmo assim.]]> + faça dump e instale o firmware, ou pressione \"OK\" para continuar mesmo assim.]]> A procurar jogo... @@ -853,7 +852,8 @@ uma tentativa de mapeamento automático Centro Relativo de Analógico Deslizamento dos Botões Direcionais Vibração ao tocar - Mostrar overlay + Mostrar comando + Ocultar comando Marcar/Desmarcar tudo Ajustar overlay Escala @@ -916,9 +916,8 @@ uma tentativa de mapeamento automático Predefinido - Normal - Alto - Extremo + Inseguro (rápido) + Seguro (estável) 0.25X (180p/270p) @@ -966,13 +965,13 @@ uma tentativa de mapeamento automático Esticar à janela - Dynarmic (Lento) + Dynarmic (JIT) Native code execution (NCE) Preciso Inseguro - Paranoid (Lento) + Paranoid Botões Direcionais diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 658286152b..0938b9c18f 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -72,8 +72,6 @@ Настройки в Покров Эдема являются экспериментальными и могут вызывать проблемы. Если ваша игра не запускается, отключите все расширения. В разработке: Пропуск кадров Включите или отключите пропуск кадров для повышения производительности за счет уменьшения количества отображаемых кадров. Эта функция находится в разработке и будет включена в будущих версиях. - RAII - Метод автоматического управления ресурсами в Vulkan, который обеспечивает правильное освобождение ресурсов при их ненадобности, но может вызывать сбои в бандл-играх. Улучшенная синхронизация кадров Обеспечивает плавную и стабильную подачу кадров за счет синхронизации их времени, уменьшая подтормаживания и неравномерную анимацию. Идеально для игр с нестабильным временем кадров или микро-подтормаживаниями во время игры. Ранний релиз ограждений @@ -126,8 +124,10 @@ Такты Пропустить внутреннюю инвалидацию ЦП Пропускает некоторые инвалидации кэша на стороне ЦП при обновлениях памяти, уменьшая нагрузку на процессор и повышая производительность. Может вызывать сбои в некоторых играх. - Уровень DMA - Управляет точностью DMA. Более высокий уровень может исправить проблемы в некоторых играх, но также может повлиять на производительность. Если не уверены, оставьте значение «По умолчанию». + Включить эмуляцию MMU хоста + Эта оптимизация ускоряет доступ к памяти гостевой программой. При включении операции чтения/записи памяти гостя выполняются напрямую в памяти с использованием MMU хоста. Отключение заставляет все обращения к памяти использовать программную эмуляцию MMU. + Точность DMA + Управляет точностью DMA. Безопасная точность может исправить проблемы в некоторых играх, но в некоторых случаях также может повлиять на производительность. Если не уверены, оставьте значение По умолчанию. 4 ГБ (Рекомендуется) 6 ГБ (Небезопасно) @@ -453,8 +453,7 @@ Запуск системных апплетов на установленной прошивке Прошивка не установлена или неверная версия Апплет недоступен - prod.keys и -прошивка установлены, и попробуйте снова.
Также убедитесь, что ваша прошивка версии 19.0.1 или ниже.]]>
+ prod.keys и прошивка установлены, и попробуйте снова.
Также убедитесь, что ваша прошивка версии 19.0.1 или ниже.]]>
Альбом Просмотрите изображения, сохраненные в папке скриншотов пользователя, с помощью системного просмотрщика фотографий. Mii редактор @@ -770,10 +769,10 @@ Обновления и DLC Моды и читы Важное уведомление о дополнении - + Для установки модов и читов необходимо выбрать папку, содержащую каталог cheats/, romfs/ или exefs/. Мы не можем гарантировать их совместимость с вашей игрой, поэтому будьте осторожны! Неверный каталог - + Пожалуйста, убедитесь, что выбранная вами директория содержит папку cheats/, romfs/ или exefs/ и попробуйте снова. Аддон успешно установлен Проверка содержимого... @@ -792,14 +791,14 @@ Ваш ROM зашифрованный - игровых картриджей или установленных игр.]]> + игровых картриджей или установленных игр.]]> prod.keys установлен, чтобы игры можно было расшифровать.]]> Произошла ошибка при инициализации видеоядра. Обычно это вызвано несовместимым драйвером ГП. Установка пользовательского драйвера ГП может решить эту проблему. Не удалось запустить ROM Файл ROM не существует Игре требуется прошивка - сохраните и установите прошивку или нажмите "OK" для запуска в любом случае.]]> + сохраните и установите прошивку или нажмите \"OK\" для запуска в любом случае.]]> Поиск игры... @@ -854,7 +853,8 @@ Относительный центр стика Слайд крестовиной Обратная связь от нажатий - Показать оверлей + Показать контроллер + Скрыть контроллер Переключить всё Регулировка оверлея Масштаб @@ -917,9 +917,8 @@ По умолчанию - Нормальный - Высокий - Экстремальный + Небезопасно (быстро) + Безопасно (стабильно) 0.25X (180p/270p) @@ -953,7 +952,7 @@ Авто Альбомная (сенсор) - Пейзаж + Альбомная Обратная альбомная Портретная (сенсор) Портрет @@ -967,13 +966,13 @@ Растянуть до окна - Dynarmic (Медленно) + Dynarmic (JIT) Нативное выполнение (NCE) Точно Небезопасно - Параноик (медленно) + Параноик Крестовина diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index 18612333f9..35ef07f3a6 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -81,8 +81,6 @@ Побољшава текстуру и руковање међуспремника, као и преводилачки слој Маквелл. Подржани од стране неких Вулкана 1.1 ГПУ-а и сви Вулкан 1.2+ ГПУ. Рендерер - RAII - Метод аутоматског управљања ресурсима у Vulkan-у који осигурава правилно ослобађање ресурса када више нису потребни, али може изазвати падове у пакованим играма. Побољшани оквирни пејсинг Осигурава глатку и доследан испоруку оквира синхронизацијом времена између оквира, смањење муцања и неуједначене анимације. Идеално за игре које доживљавају временски оквир нестабилност или микро-штитнике током играња. Ranije oslobađanje ograda @@ -119,8 +117,10 @@ Тактови Preskoči unutrašnje poništavanje CPU-a Preskače određena poništavanja keša na strani CPU-a tokom ažuriranja memorije, smanjujući opterećenje procesora i poboljšavajući performanse. Može izazvati greške u nekim igrama. - DMA ниво - Контролише тачност DMA прецизности. Виши ниво може да поправи проблеме у неким играма, али може и да утиче на перформансе. Ако нисте сигурни, оставите на «Подразумевано». + Омогући емулацију MMU домаћина + Ова оптимизација убрзава приступ меморији од стране гостујућег програма. Укључивање изазива да се читања/уписа меморије госта обављају директно у меморији и користе MMU домаћина. Искључивање присиљава све приступе меморији да користе софтверску емулацију MMU. + DMA тачност + Управља прецизношћу DMA-а. Сигурна прецизност може да исправи проблеме у неким играма, али у неким случајевима може да утиче и на перформансе. Ако нисте сигурни, оставите ово на Подразумевано. Схадер Бацкенд @@ -272,10 +272,10 @@ Карусел Мапа Пре-Алпха софтвер - "УПОЗОРЕЊЕ: Овај софтвер је у пре-алфа фази и може имати грешке и непотпуне примене функција." + УПОЗОРЕЊЕ: Овај софтвер је у пре-алфа фази и може имати грешке и непотпуне примене функција. Не покажи поново Пре-Алпха софтвер - "Нова играчка игара је успешно додата" + Нова играчка игара је успешно додата Игре Тражити Подешавања @@ -285,7 +285,7 @@ Управљајте мапама игара Омогућује ЕДЕН-у да попуни листу игара Прескочите одабир мапе игре? - Игре побеђују \ "т приказују се на листи игара ако је изабрана мапа н \" т. + Игре побеђују \"т приказују се на листи игара ако је изабрана мапа н \" т. Претражите игре Подешавања претраге Изабрани Игре Именик @@ -362,7 +362,7 @@ %1$d инсталирано успешно %1$d преписано успешно Прилагођени управљачки програми нису подржани - Прилагођени управљачки програм за учитавање ИСН \ "т тренутно подржан за овај уређај. \ НХЕЦК Поново у будућности да бисте видели да ли је додата подршка! + Прилагођени управљачки програм за учитавање ИСН \"т тренутно подржан за овај уређај.\" НХЕЦК Поново у будућности да бисте видели да ли је додата подршка! Управљајте подацима ЕДЕН-а Увоз / извозни софтвер, кључеви, кориснички подаци и још много тога! Схаре Спреми датотеку @@ -374,10 +374,12 @@ Играње некретнина Увоз%d уштедите%d + Увоз%d уносе%d Увоз%d уносе%d Успешно увезено%d уштеда + Успешно увезени%d штеди Успешно увезени%d штеди Не пронађени су подаци сачувања @@ -477,7 +479,7 @@ Омјер аспекта Филтер прилагођавања прозора ФСР оштрина - Одређује колико ће се слика наоштрен трајати док користи ФСР \ "динамички контраст + Одређује колико ће се слика наоштрен трајати док користи \"ФСР\" динамички контраст Метода против алиасирања Формирајте максималне сатове (само адрено) Снагује ГПУ да се покреће максималним могућим сатовима (топлотна ограничења ће се и даље примењивати). @@ -726,10 +728,10 @@ Ажурирања и ДЛЦ Модови и варалице Важна Обавештење о Аддон-у - + Да бисте инсталирали модс и варалице, морате да одаберете мапу која садржи шифре /, Ромфс / или ЕкеФС / директориј. Не можемо да проверимо да ли ће то бити компатибилно са вашом игром, па будите опрезни! Неважећи директориј - + Молимо вас проверите да ли је име одабрано да садржи варалице /, Ромфс / или ЕкеФС / мапу и покушајте поново. Аддон је успешно инсталиран Верификација садржаја ... @@ -755,7 +757,7 @@ Није могуће учитати РОМ РОМ датотека не постоји Игра захтева firmware - направите дамп и инсталирајте firmware, или притисните "OK" да бисте наставили у сваком случају.]]> + направите дамп и инсталирајте firmware, или притисните \"OK\" да бисте наставили у сваком случају.]]> Тражење игре... @@ -810,7 +812,8 @@ Релативни центар за штапић Д-Пад Слиде Додирните ХАптицс - Приказати прекривање + Приказати контролер + Сакрити контролер Пребацивати све Подесити прекривање Скала @@ -912,9 +915,8 @@ Подразумевано - Нормално - Високо - Екстремно + Небезбедно (брзо) + Безбедно (стабилно) АСТЦ метода декодирања @@ -986,13 +988,13 @@ Протезање до прозора - Динамина (споро) + Dynarmic (JIT) Извођење изворног кода (НЦЕ) Тачан Несигуран - Параноичан (споро) + Параноичан Д-пад diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 830e1f0ef9..b22c30999b 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -70,8 +70,6 @@ Експериментальні налаштування для покращення продуктивності та сумісності. Ці налаштування можуть викликати збої, зокрема чорний екран. Експериментальні налаштування Налаштування Завіси Eden є експериментальними та можуть спричинити проблеми. Якщо ваша гра не запускається — вимкніть усі розширення. - RAII - Метод автоматичного керування ресурсами у Vulkan, який забезпечує правильне звільнення ресурсів після завершення їх використання, проте він може спричинити збої в ігрових збірниках. В розробці: Пропуск кадрів Увімкніть або вимкніть пропуск кадрів для покращення продуктивності за рахунок зменшення кількості візуалізованих кадрів. Ця функція ще розробляється та буде доступна у майбутніх версіях. Покращена синхронізація кадрів @@ -126,8 +124,10 @@ Такти Пропустити внутрішнє інвалідування CPU Пропускає деякі інвалідації кешу на стороні CPU під час оновлення пам\'яті, зменшуючи навантаження на процесор і покращуючи продуктивність. Може спричинити збої в деяких іграх. - Рівень DMA - Керує точністю DMA. Вищий рівень може виправити проблеми в деяких іграх, але також може вплинути на продуктивність. Якщо не впевнені, залиште значення «Типово». + Увімкнути емуляцію MMU хоста + Ця оптимізація пришвидшує доступ до пам\'яті гостьовою програмою. Увімкнення призводить до того, що читання/запис пам\'яті гостя виконуються безпосередньо в пам\'яті та використовують MMU хоста. Вимкнення змушує всі звернення до пам\'яті використовувати програмну емуляцію MMU. + Точність DMA + Керує точністю DMA. Безпечна точність може виправити проблеми в деяких іграх, але в деяких випадках також може вплинути на продуктивність. Якщо не впевнені, залиште це значення за замовчуванням. 4 ГБ (Рекомендовано) 6 ГБ (Небезпечно) @@ -411,10 +411,14 @@ Властивості теки Не вдалося імпортувати %d збереження + Не вдалося імпортувати %d збережень + Не вдалося імпортувати %d збережень Не вдалося імпортувати %d збережень Успішно імпортовано %d збереження + Успішно імпортовано %d збережень + Успішно імпортовано %d збережень Успішно імпортовано %d збережень Збережень не знайдено @@ -439,8 +443,7 @@ Запуск системних аплетів за допомогою прошивки. Прошивка не встановлена або недійсна версія Аплет недоступний - prod.keys та -прошивка встановлені, і спробуйте ще раз.
Також переконайтеся, що ваша прошивка має версію 19.0.1 або старішу.]]>
+ prod.keys та прошивка встановлені, і спробуйте ще раз.
Також переконайтеся, що ваша прошивка має версію 19.0.1 або старішу.]]>
Альбом Перегляд зображень у папці скріншотів. Редактор Mii @@ -460,7 +463,7 @@ Автори проєкту Зроблено з \u2764 командою Eden Проєкти, які зробили запуск Eden на Android можливим - + Збірка Дані користувача Імпортувати/експортувати всі дані застосунку.\n\nПід час імпорту всі наявні дані користувача буде видалено!\n\nІмпортування даних із Citron може спричинити помилки. Рекомендується вручну імпортувати всі потрібні дані. @@ -685,14 +688,14 @@ Ваш ROM зашифрований - ігрових картриджів або цифрових назв.]]> + ігрових картриджів або цифрових назв.]]> prod.keys встановлено, щоб ігри можна було розшифрувати.]]> Сталася помилка під час ініціалізації відеоядра. Зазвичай це спричинено несумісним драйвером GPU. Встановлення користувацького драйвера GPU може вирішити цю проблему. Не вдалося запустити ROM ROM файлу не існує Гра вимагає прошивки - зробіть дамп і встановіть прошивку, або натисніть "OK", щоб продовжити в будь-якому разі.]]> + зробіть дамп і встановіть прошивку, або натисніть \"OK\", щоб продовжити в будь-якому разі.]]> Пошук гри... @@ -747,7 +750,8 @@ Відносний центр джойстика Ковзання D-pad Тактильний відгук - Показати накладання + Показати контролер + Сховати контролер Перемкнути все Налаштувати накладання Масштаб @@ -806,9 +810,8 @@ Типово - Нормальний - Високий - Екстремальний + Небезпечно (швидко) + Безпечно (стабільно) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 1c656fc7bb..171b4ea116 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -65,8 +65,6 @@ Tiện ích mở rộng GPU Trình kết xuất - RAII - Phương pháp quản lý tài nguyên tự động trong Vulkan đảm bảo giải phóng tài nguyên đúng cách khi không còn cần thiết, nhưng có thể gây ra sự cố trong các trò chơi được đóng gói. CPU và Bộ nhớ Mành che của Eden Cài đặt thử nghiệm để cải thiện hiệu suất và khả năng. Những cài đặt này có thể gây ra màn hình đen hoặc các vấn đề khác trong trò chơi. @@ -126,8 +124,10 @@ Tích Bỏ qua vô hiệu hóa bên trong CPU Bỏ qua một số lần vô hiệu hóa bộ nhớ đệm phía CPU trong khi cập nhật bộ nhớ, giảm mức sử dụng CPU và cải thiện hiệu suất. Có thể gây ra lỗi hoặc treo máy trong một số trò chơi. - Cấp độ DMA - Điều khiển độ chính xác của DMA. Độ chính xác cao hơn có thể sửa lỗi trong một số trò chơi, nhưng cũng có thể ảnh hưởng đến hiệu suất trong một số trường hợp. Nếu không chắc chắn, hãy để ở Mặc định. + Bật giả lập MMU Máy chủ + Tối ưu hóa này tăng tốc độ truy cập bộ nhớ của chương trình khách. Bật nó lên khiến các thao tác đọc/ghi bộ nhớ khách được thực hiện trực tiếp vào bộ nhớ và sử dụng MMU của Máy chủ. Tắt tính năng này buộc tất cả quyền truy cập bộ nhớ phải sử dụng Giả lập MMU Phần mềm. + Độ chính xác DMA + Điều khiển độ chính xác của DMA. Độ chính xác an toàn có thể khắc phục sự cố trong một số trò chơi, nhưng trong một số trường hợp cũng có thể ảnh hưởng đến hiệu suất. Nếu không chắc chắn, hãy để giá trị này ở Mặc định. 4GB (Được đề xuất) 6GB (Không an toàn) @@ -410,11 +410,9 @@ Thư mục đã tồn tại Thuộc tính thư mục - Lỗi nhập %d save Lỗi nhập %d saves - Nhập thành công %d save Nhập thành công %d saves Không tìm thấy save @@ -439,8 +437,7 @@ Khởi chạy applet hệ thống Firmware chưa cài đặt hoặc phiên bản không hợp lệ Applet không khả dụng - prod.keys và -firmware đã được cài đặt và thử lại.
Đồng thời đảm bảo firmware của bạn là phiên bản 19.0.1 hoặc cũ hơn.]]>
+ prod.keys và firmware đã được cài đặt và thử lại.
Đồng thời đảm bảo firmware của bạn là phiên bản 19.0.1 hoặc cũ hơn.]]>
Album Xem ảnh trong thư mục chụp màn hình Chỉnh sửa Mii @@ -660,14 +657,14 @@ Kiểm tra tính toàn vẹn thất bại! ROM của bạn đã bị mã hoá - băng trò chơi hoặc tựa game kỹ thuật số của bạn.]]> + băng trò chơi hoặc tựa game kỹ thuật số của bạn.]]> prod.keys đã được cài đặt để game có thể được giải mã.]]> Đã xảy ra lỗi khi khởi tạo lõi video Việc này thường do driver GPU không tương thích. Cài đặt một driver GPU tùy chỉnh có thể giải quyết vấn đề này. Không thể tải ROM Tệp ROM không tồn tại Trò chơi yêu cầu firmware - dump và cài đặt firmware, hoặc nhấn "OK" để tiếp tục dù sao đi nữa.]]> + dump và cài đặt firmware, hoặc nhấn \"OK\" để tiếp tục dù sao đi nữa.]]> Đang tìm kiếm trò chơi... @@ -721,7 +718,8 @@ Trung tâm nút cần xoay tương đối Trượt D-pad Chạm haptics - Hiện lớp phủ + Hiện bộ điều khiển + Ẩn bộ điều khiển Chuyển đổi tất cả Điều chỉnh lớp phủ Tỉ lệ thu phóng @@ -771,9 +769,8 @@ Mặc định - Bình thường - Cao - Cực cao + Không an toàn (nhanh) + An toàn (ổn định) 0.25X (180p/270p) diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index f3e7d9282c..daa2143beb 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -65,8 +65,6 @@ GPU扩展 渲染器 - RAII - Vulkan中的一种自动资源管理方法,确保在不再需要时正确释放资源,但可能导致捆绑游戏崩溃。 CPU和内存 伊甸之幕 实验性设置以提高性能和能力。这些设置可能会导致黑屏或其他游戏问题。 @@ -125,8 +123,10 @@ 时钟 跳过CPU内部无效化 在内存更新期间跳过某些CPU端缓存无效化,减少CPU使用率并提高其性能。可能会导致某些游戏出现故障或崩溃。 - DMA 级别 - 控制 DMA 精度。更高的精度可以修复某些游戏中的问题,但在某些情况下也可能影响性能。如果不确定,请保留为“默认”。 + 启用主机 MMU 模拟 + 此优化可加速来宾程序的内存访问。启用后,来宾内存读取/写入将直接在内存中执行并利用主机的 MMU。禁用此功能将强制所有内存访问使用软件 MMU 模拟。 + DMA 精度 + 控制 DMA 精度。安全精度可以修复某些游戏中的问题,但在某些情况下也可能影响性能。如果不确定,请保留为“默认”。 4GB (推荐) 6GB (不安全) @@ -445,8 +445,7 @@ 使用已安装的固件启动系统小程序 固件未安装或版本无效 小程序不可用 - prod.keys文件和 -固件已安装并重试。
同时请确保您的固件版本为19.0.1或更早。]]>
+ prod.keys文件和 固件已安装并重试。
同时请确保您的固件版本为19.0.1或更早。]]>
相册 查看存储在用户屏幕截图文件夹中的图像 Mii edit @@ -762,10 +761,10 @@ 游戏更新和 DLC Mod 和金手指 附加项重要提醒 - + 为了安装 mod 和金手指,您必须选择一个包含 cheats/、romfs/ 或 exefs/ 目录的文件夹。我们无法验证这些内容是否与您的游戏兼容,所以请小心使用! 无效目录 - + 请确保您选择的目录下包含 cheats/、romfs/ 或 exefs/ 文件夹然后重试。 附加项安装成功 验证安装内容... @@ -784,14 +783,14 @@ 您的 ROM 已加密 - 游戏卡带或数字版游戏。]]> + 游戏卡带或数字版游戏。]]> prod.keys 文件已安装,使得游戏可以被解密。]]> 初始化视频核心时发生错误 这通常由不兼容的 GPU 驱动程序造成,安装自定义 GPU 驱动程序可能解决此问题。 无法载入 ROM ROM 文件不存在 游戏需要固件 - 转储并安装固件,或点击"确定"继续。]]> + 转储并安装固件,或点击\"确定\"继续。]]> 正在搜索游戏... @@ -846,7 +845,8 @@ 相对摇杆中心 十字方向键滑动 触觉反馈 - 显示虚拟按键 + 显示控制器 + 隐藏控制器 全部切换 调整虚拟按键 缩放 @@ -909,9 +909,8 @@ 默认 - 普通 - - 极高 + 不安全(快速) + 安全(稳定) 0.25X (180p/270p) @@ -959,13 +958,13 @@ 拉伸窗口 - 动态编译 (慢速) + Dynarmic (JIT) 本机代码执行 (NCE) 高精度 低精度 - 偏执模式 (慢速) + 偏执模式 十字方向键 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index b6c17745be..67f3f268a8 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -65,8 +65,6 @@ GPU擴充功能 渲染器 - RAII - Vulkan中的一種自動資源管理方法,確保在不再需要時正確釋放資源,但可能導致捆綁遊戲崩潰。 CPU與記憶體 伊甸之幕 實驗性設定以提高效能和能力。這些設定可能會導致黑屏或其他遊戲問題。 @@ -118,8 +116,10 @@ 時脈 跳過CPU內部無效化 在記憶體更新期間跳過某些CPU端快取無效化,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或崩潰。 - DMA 級別 - 控制 DMA 精確度。更高的精確度可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為「預設」。 + 啟用主機 MMU 模擬 + 此最佳化可加速來賓程式的記憶體存取。啟用後,來賓記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬。 + DMA 精度 + 控制 DMA 精度。安全精度可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為「預設」。 4GB (推薦) @@ -450,8 +450,7 @@ 使用已安裝的韌體啟動系統小程式 韌體未安裝或版本無效 無法使用小程式 - prod.keys檔案和 -韌體已安裝並重試。
同時請確保您的韌體版本為19.0.1或更早。]]>
+ prod.keys檔案和 韌體已安裝並重試。
同時請確保您的韌體版本為19.0.1或更早。]]>
相簿 使用系統相片檢視器查看儲存在使用者螢幕截圖資料夾中的影像 Mii 編輯 @@ -767,10 +766,10 @@ 更新及 DLC 模組及密技 重要的˙附加元件通知 - + 若要安裝模組及密技,您必須選取一個包含 cheats/、romfs/ 或 exefs/ 的目錄。我們無法驗證這些內容是否與您的遊戲相容,所以請小心作業! 無效的目錄 - + 請確保您選取的目錄包含 cheats/、romfs/ 或 exefs/ 資料夾,然後再試一次。 附加元件已成功安裝 正在驗證內容… @@ -789,14 +788,14 @@ 您的 ROM 已加密 - 遊戲卡帶或數位版遊戲。]]> + 遊戲卡帶或數位版遊戲。]]> prod.keys 檔案已安裝,讓遊戲可以解密。]]> 初始化視訊核心時發生錯誤 這經常由不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。 無法載入 ROM ROM 檔案不存在 遊戲需要韌體 - 轉儲並安裝韌體,或點擊"確定"繼續。]]> + 轉儲並安裝韌體,或點擊\"確定\"繼續。]]> 正在搜尋遊戲... @@ -851,7 +850,8 @@ 相對搖桿中心 方向鍵滑動 觸覺回饋技術 - 顯示覆疊 + 顯示控制器 + 隱藏控制器 全部切換 調整覆疊 縮放 @@ -914,9 +914,8 @@ 預設 - 普通 - - 極高 + 不安全(快速) + 安全(穩定) 0.25X (180p/270p) @@ -964,13 +963,13 @@ 延展視窗 - 動態 (慢) + Dynarmic (JIT) 機器碼執行 (NCE) 高精度 低精度 - 不合理 (慢) + 不合理 方向鍵 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 2f0392675d..2150d401db 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -180,6 +180,7 @@ @string/resolution_half @string/resolution_three_quarter @string/resolution_one + @string/resolution_five_quarter @string/resolution_three_half @string/resolution_two @string/resolution_three @@ -202,6 +203,7 @@ 5 6 7 + 8 @@ -252,9 +254,15 @@ @string/scaling_filter_bilinear @string/scaling_filter_bicubic @string/scaling_filter_gaussian + @string/scaling_filter_lanczos @string/scaling_filter_scale_force @string/scaling_filter_fsr @string/scaling_filter_area + @string/scaling_filter_mmpx + @string/scaling_filter_zero_tangent + @string/scaling_filter_bspline + @string/scaling_filter_mitchell + @string/scaling_filter_spline1 @@ -265,6 +273,12 @@ 4 5 6 + 7 + 8 + 9 + 10 + 11 + 12 @@ -454,15 +468,13 @@ @string/dma_accuracy_default - @string/dma_accuracy_normal - @string/dma_accuracy_high - @string/dma_accuracy_extreme + @string/dma_accuracy_unsafe + @string/dma_accuracy_safe 0 1 2 - 3 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 975bd1741a..00206a5df5 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -8,6 +8,29 @@ noticesAndErrors Shows notifications when something goes wrong. Notification permission not granted! + Eden + Eden + Eden Switch emulator notifications + Eden is Running + Seconds + + + Increment + Decrement + Value + Value must be at least %1$d + Value must be at most %1$d + Invalid value + + + + Overlay Auto Hide + Automatically hide the touch controls overlay after the specified time of inactivity. + Enable Overlay Auto Hide + + Input Overlay + Configure on-screen controls + (Enhanced) @@ -86,8 +109,6 @@ The intensity of the sample shading pass. Higher values improve quality more but also reduce performance to a greater extent. Renderer - RAII - A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games. Enhanced Frame Pacing Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay. Release Fences Early @@ -109,12 +130,14 @@ Ticks Skip CPU Inner Invalidation Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games. + Enable Host MMU Emulation + This optimization speeds up memory accesses by the guest program. Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host\'s MMU. Disabling this forces all memory accesses to use Software MMU Emulation. CPU Clock Use Boost (1700MHz) to run at the Switch\'s highest native clock, or Fast (2000MHz) to run at 2x clock. Memory Layout (EXPERIMENTAL) Change the emulated memory layout. This setting will not increase performance, but may help with games utilizing high resolutions via mods. Do not use on phones with 8GB of RAM or less. Only works on the Dynarmic (JIT) backend. - DMA Level - Controls the DMA precision accuracy. Higher precision can fix issues in some games, but it can also impact performance in some cases. If unsure, leave it at Default. + DMA Accuracy + Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. If unsure, leave this on Default. Shader Backend @@ -264,14 +287,15 @@ Alphabetical List Grid + Compact Grid Carousel Screenshot for %1$s Folder Pre-Alpha Software - "WARNING: This software is in the pre-alpha stage and may have bugs and incomplete feature implementations." + WARNING: This software is in the pre-alpha stage and may have bugs and incomplete feature implementations. Don\'t Show Again - PRE-ALPHA SOFTWARE\ - "New game directory added successfully " + PRE-ALPHA SOFTWARE + New game directory added successfully Games Search Settings @@ -748,10 +772,10 @@ Updates and DLC Mods and cheats Important addon notice - + In order to install mods and cheats, you must select a folder that contains a cheats/, romfs/, or exefs/ directory. We can\'t verify if these will be compatible with your game so be careful! Invalid directory - + Please make sure that the directory you selected contains a cheats/, romfs/, or exefs/ folder and try again. Addon installed successfully Verifying content… @@ -778,7 +802,7 @@ ROM file does not exist Game Requires Firmware - dump and install firmware, or press "OK" to launch anyways.]]> + dump and install firmware, or press \"OK\" to launch anyways.]]> Searching for game... @@ -833,7 +857,8 @@ Relative stick center D-pad slide Touch haptics - Show overlay + Show controller + Hide controller Toggle all Adjust overlay Scale @@ -846,6 +871,7 @@ Touchscreen Lock drawer Unlock drawer + Reset Loading settings… @@ -856,12 +882,12 @@ Abort Continue System Archive Not Found - %s is missing. Please dump your system archives.\nContinuing emulation may result in crashes and bugs. + %s is missing. Please dump your system archives.\nContinuing emulation may result in crashes. A system archive Save/Load Error Fatal Error - A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes and bugs. - Turning off this setting will significantly reduce emulation performance! For the best experience, it is recommended that you leave this setting enabled. + A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes. + Turning off this setting will significantly degrade performance. It"s recommended that you leave this setting enabled. Device RAM: %1$s\nRecommended: %2$s %1$s %2$s No bootable game present! @@ -932,13 +958,12 @@ Normal High - Extreme (Slow) + Extreme Default - Normal - High - Extreme + Unsafe + Safe ASTC Decoding Method @@ -969,6 +994,7 @@ 0.5X (360p/540p) 0.75X (540p/810p) 1X (720p/1080p) + 1.25X (900p/1350p) 1.5X (1080p/1620p) 2X (1440p/2160p) (Slow) 3X (2160p/3240p) (Slow) @@ -984,10 +1010,16 @@ Nearest Neighbor Bilinear Bicubic + Spline-1 Gaussian + Lanczos ScaleForce AMD FidelityFX™ Super Resolution Area + Zero-Tangent + B-Spline + Mitchell + MMPX None @@ -1011,13 +1043,13 @@ Stretch to window - Dynarmic (Slow) + Dynarmic (JIT) Native code execution (NCE) Accurate Unsafe - Paranoid (Slow) + Paranoid D-pad diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index e040ec756d..c9f8af7dc3 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later @@ -227,11 +230,12 @@ else() endif() target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS}) -target_link_libraries(audio_core PUBLIC common core opus) +target_link_libraries(audio_core PUBLIC common core Opus::opus) -if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) - target_link_libraries(audio_core PRIVATE dynarmic::dynarmic) -endif() +# what? +# if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) +# target_link_libraries(audio_core PRIVATE dynarmic::dynarmic) +# endif() if (ENABLE_CUBEB) target_sources(audio_core PRIVATE @@ -239,8 +243,8 @@ if (ENABLE_CUBEB) sink/cubeb_sink.h ) - target_link_libraries(audio_core PRIVATE cubeb) - target_compile_definitions(audio_core PRIVATE -DHAVE_CUBEB=1) + target_link_libraries(audio_core PRIVATE cubeb::cubeb) + target_compile_definitions(audio_core PRIVATE HAVE_CUBEB=1) endif() if (ENABLE_SDL2) diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp index d799f3f06f..b874f87ae6 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp @@ -193,7 +193,7 @@ void AudioRenderer::Main(std::stop_token stop_token) { } } - max_time = std::min(command_buffer.time_limit, max_time); + max_time = (std::min)(command_buffer.time_limit, max_time); command_list_processor.SetProcessTimeMax(max_time); if (index == 0) { diff --git a/src/audio_core/audio_event.cpp b/src/audio_core/audio_event.cpp index c23ef09900..afd69e7842 100644 --- a/src/audio_core/audio_event.cpp +++ b/src/audio_core/audio_event.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/audio_event.h" #include "common/assert.h" -#include "common/polyfill_ranges.h" +#include namespace AudioCore { diff --git a/src/audio_core/common/common.h b/src/audio_core/common/common.h index 6abd9be45e..f1c35ad60f 100644 --- a/src/audio_core/common/common.h +++ b/src/audio_core/common/common.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -73,9 +76,9 @@ constexpr s32 HighestVoicePriority = 0; constexpr u32 BufferAlignment = 0x40; constexpr u32 WorkbufferAlignment = 0x1000; constexpr s32 FinalMixId = 0; -constexpr s32 InvalidDistanceFromFinalMix = std::numeric_limits::min(); +constexpr s32 InvalidDistanceFromFinalMix = (std::numeric_limits::min)(); constexpr s32 UnusedSplitterId = -1; -constexpr s32 UnusedMixId = std::numeric_limits::max(); +constexpr s32 UnusedMixId = (std::numeric_limits::max)(); constexpr u32 InvalidNodeId = 0xF0000000; constexpr s32 InvalidProcessOrder = -1; constexpr u32 MaxBiquadFilters = 2; diff --git a/src/audio_core/common/feature_support.h b/src/audio_core/common/feature_support.h index eef2a844ba..91d6991416 100644 --- a/src/audio_core/common/feature_support.h +++ b/src/audio_core/common/feature_support.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,10 +13,10 @@ #include "common/assert.h" #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include namespace AudioCore { -constexpr u32 CurrentRevision = 13; +constexpr u32 CurrentRevision = 16; enum class SupportTags { CommandProcessingTimeEstimatorVersion4, @@ -54,6 +57,7 @@ constexpr u32 GetRevisionNum(u32 user_revision) { user_revision -= Common::MakeMagic('R', 'E', 'V', '0'); user_revision >>= 24; } + return user_revision; }; diff --git a/src/audio_core/device/audio_buffers.h b/src/audio_core/device/audio_buffers.h index 9e84a9c059..0ee3225bf6 100644 --- a/src/audio_core/device/audio_buffers.h +++ b/src/audio_core/device/audio_buffers.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -51,7 +54,7 @@ public: */ void RegisterBuffers(boost::container::static_vector& out_buffers) { std::scoped_lock l{lock}; - const s32 to_register{std::min(std::min(appended_count, BufferAppendLimit), + const s32 to_register{(std::min)((std::min)(appended_count, BufferAppendLimit), BufferAppendLimit - registered_count)}; for (s32 i = 0; i < to_register; i++) { @@ -175,7 +178,7 @@ public: } size_t buffers_to_flush{ - std::min(static_cast(registered_count + appended_count), max_buffers)}; + (std::min)(static_cast(registered_count + appended_count), max_buffers)}; if (buffers_to_flush == 0) { return 0; } diff --git a/src/audio_core/opus/decoder.cpp b/src/audio_core/opus/decoder.cpp index 0c110cbeb6..e60a7d48d4 100644 --- a/src/audio_core/opus/decoder.cpp +++ b/src/audio_core/opus/decoder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -148,7 +151,7 @@ Result OpusDecoder::DecodeInterleavedForMultiStream(u32* out_data_size, u64* out auto* header_p{reinterpret_cast(input_data.data())}; OpusPacketHeader header{ReverseHeader(*header_p)}; - LOG_TRACE(Service_Audio, "header size 0x{:X} input data size 0x{:X} in_data size 0x{:X}", + LOG_TRACE(Service_Audio, "header size {:#X} input data size 0x{:X} in_data size 0x{:X}", header.size, input_data.size_bytes(), in_data.size_bytes()); R_UNLESS(in_data.size_bytes() >= header.size && diff --git a/src/audio_core/renderer/audio_device.cpp b/src/audio_core/renderer/audio_device.cpp index 5be5594f6f..b5092f023a 100644 --- a/src/audio_core/renderer/audio_device.cpp +++ b/src/audio_core/renderer/audio_device.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -45,7 +48,7 @@ u32 AudioDevice::ListAudioDeviceName(std::span out_buffer) cons names = device_names; } - const u32 out_count{static_cast(std::min(out_buffer.size(), names.size()))}; + const u32 out_count{static_cast((std::min)(out_buffer.size(), names.size()))}; for (u32 i = 0; i < out_count; i++) { out_buffer[i] = names[i]; } @@ -53,7 +56,7 @@ u32 AudioDevice::ListAudioDeviceName(std::span out_buffer) cons } u32 AudioDevice::ListAudioOutputDeviceName(std::span out_buffer) const { - const u32 out_count{static_cast(std::min(out_buffer.size(), output_device_names.size()))}; + const u32 out_count{static_cast((std::min)(out_buffer.size(), output_device_names.size()))}; for (u32 i = 0; i < out_count; i++) { out_buffer[i] = output_device_names[i]; diff --git a/src/audio_core/renderer/behavior/behavior_info.cpp b/src/audio_core/renderer/behavior/behavior_info.cpp index 0585390426..d0df1f29de 100644 --- a/src/audio_core/renderer/behavior/behavior_info.cpp +++ b/src/audio_core/renderer/behavior/behavior_info.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -43,7 +46,7 @@ void BehaviorInfo::AppendError(const ErrorInfo& error) { } void BehaviorInfo::CopyErrorInfo(std::span out_errors, u32& out_count) const { - out_count = std::min(error_count, MaxErrors); + out_count = (std::min)(error_count, MaxErrors); for (size_t i = 0; i < MaxErrors; i++) { if (i < out_count) { diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp index 3dae6069f7..20f6cda3a2 100644 --- a/src/audio_core/renderer/behavior/info_updater.cpp +++ b/src/audio_core/renderer/behavior/info_updater.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/audio_core/renderer/command/command_buffer.cpp b/src/audio_core/renderer/command/command_buffer.cpp index 67d43e69aa..d680e0c74b 100644 --- a/src/audio_core/renderer/command/command_buffer.cpp +++ b/src/audio_core/renderer/command/command_buffer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -464,7 +467,7 @@ void CommandBuffer::GenerateDeviceSinkCommand(const s32 node_id, const s16 buffe s16 max_input{0}; for (u32 i = 0; i < parameter.input_count; i++) { cmd.inputs[i] = buffer_offset + parameter.inputs[i]; - max_input = std::max(max_input, cmd.inputs[i]); + max_input = (std::max)(max_input, cmd.inputs[i]); } if (state.upsampler_info != nullptr) { diff --git a/src/audio_core/renderer/command/command_generator.h b/src/audio_core/renderer/command/command_generator.h index 38ee2a64ee..b74ad525ae 100644 --- a/src/audio_core/renderer/command/command_generator.h +++ b/src/audio_core/renderer/command/command_generator.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -56,11 +59,11 @@ public: // Voices u64 voice_size{0}; if (behavior.IsWaveBufferVer2Supported()) { - voice_size = std::max(std::max(sizeof(AdpcmDataSourceVersion2Command), + voice_size = (std::max)((std::max)(sizeof(AdpcmDataSourceVersion2Command), sizeof(PcmInt16DataSourceVersion2Command)), sizeof(PcmFloatDataSourceVersion2Command)); } else { - voice_size = std::max(std::max(sizeof(AdpcmDataSourceVersion1Command), + voice_size = (std::max)((std::max)(sizeof(AdpcmDataSourceVersion1Command), sizeof(PcmInt16DataSourceVersion1Command)), sizeof(PcmFloatDataSourceVersion1Command)); } @@ -82,7 +85,7 @@ public: // Sinks size += - params.sinks * std::max(sizeof(DeviceSinkCommand), sizeof(CircularBufferSinkCommand)); + params.sinks * (std::max)(sizeof(DeviceSinkCommand), sizeof(CircularBufferSinkCommand)); // Performance size += (params.effects + params.voices + params.sinks + params.sub_mixes + 1 + diff --git a/src/audio_core/renderer/command/data_source/decode.cpp b/src/audio_core/renderer/command/data_source/decode.cpp index 905613a5a8..5a97aadad4 100644 --- a/src/audio_core/renderer/command/data_source/decode.cpp +++ b/src/audio_core/renderer/command/data_source/decode.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,8 +32,8 @@ constexpr std::array PitchBySrcQuality = {4, 8, 4}; template static u32 DecodePcm(Core::Memory::Memory& memory, std::span out_buffer, const DecodeArg& req) { - constexpr s32 min{std::numeric_limits::min()}; - constexpr s32 max{std::numeric_limits::max()}; + constexpr s32 min{(std::numeric_limits::min)()}; + constexpr s32 max{(std::numeric_limits::max)()}; if (req.buffer == 0 || req.buffer_size == 0) { return 0; @@ -41,7 +44,7 @@ static u32 DecodePcm(Core::Memory::Memory& memory, std::span out_buffer, } auto samples_to_decode{ - std::min(req.samples_to_read, req.end_offset - req.start_offset - req.offset)}; + (std::min)(req.samples_to_read, req.end_offset - req.start_offset - req.offset)}; u32 channel_count{static_cast(req.channel_count)}; switch (req.channel_count) { @@ -55,7 +58,7 @@ static u32 DecodePcm(Core::Memory::Memory& memory, std::span out_buffer, if constexpr (std::is_floating_point_v) { for (u32 i = 0; i < samples_to_decode; i++) { auto sample{static_cast(samples[i * channel_count + req.target_channel] * - std::numeric_limits::max())}; + (std::numeric_limits::max)())}; out_buffer[i] = static_cast(std::clamp(sample, min, max)); } } else { @@ -79,7 +82,7 @@ static u32 DecodePcm(Core::Memory::Memory& memory, std::span out_buffer, if constexpr (std::is_floating_point_v) { for (u32 i = 0; i < samples_to_decode; i++) { auto sample{static_cast(samples[i * channel_count + req.target_channel] * - std::numeric_limits::max())}; + (std::numeric_limits::max)())}; out_buffer[i] = static_cast(std::clamp(sample, min, max)); } } else { @@ -125,7 +128,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span out_buffer, } auto start_pos{req.start_offset + req.offset}; - auto samples_to_process{std::min(req.end_offset - start_pos, req.samples_to_read)}; + auto samples_to_process{(std::min)(req.end_offset - start_pos, req.samples_to_read)}; if (samples_to_process == 0) { return 0; } @@ -139,7 +142,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span out_buffer, position_in_frame += 2; } - const auto size{std::max((samples_to_process / 8U) * SamplesPerFrame, 8U)}; + const auto size{(std::max)((samples_to_process / 8U) * SamplesPerFrame, 8U)}; Core::Memory::CpuGuestMemory wavebuffer( memory, req.buffer + position_in_frame / 2, size); @@ -260,7 +263,7 @@ void DecodeFromWaveBuffers(Core::Memory::Memory& memory, const DecodeFromWaveBuf auto max_remaining_sample_count{ ((Common::FixedPoint<17, 15>(TempBufferSize) - fraction) / sample_rate_ratio) .to_uint_floor()}; - max_remaining_sample_count = std::min(max_remaining_sample_count, remaining_sample_count); + max_remaining_sample_count = (std::min)(max_remaining_sample_count, remaining_sample_count); auto wavebuffers_consumed{voice_state.wave_buffers_consumed}; auto wavebuffer_index{voice_state.wave_buffer_index}; @@ -273,7 +276,7 @@ void DecodeFromWaveBuffers(Core::Memory::Memory& memory, const DecodeFromWaveBuf std::array temp_buffer{}; while (remaining_sample_count > 0) { - const auto samples_to_write{std::min(remaining_sample_count, max_remaining_sample_count)}; + const auto samples_to_write{(std::min)(remaining_sample_count, max_remaining_sample_count)}; const auto samples_to_read{ (fraction + samples_to_write * sample_rate_ratio).to_uint_floor()}; diff --git a/src/audio_core/renderer/command/effect/aux_.cpp b/src/audio_core/renderer/command/effect/aux_.cpp index 74d9c229f3..5cee02a55c 100644 --- a/src/audio_core/renderer/command/effect/aux_.cpp +++ b/src/audio_core/renderer/command/effect/aux_.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -86,7 +89,7 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, CpuAddr send_info_, u32 write_count{write_count_}; u32 read_pos{0}; while (write_count > 0) { - u32 to_write{std::min(count_max - target_write_offset, write_count)}; + u32 to_write{(std::min)(count_max - target_write_offset, write_count)}; if (to_write > 0) { const auto write_addr = send_buffer + target_write_offset * sizeof(s32); memory.WriteBlockUnsafe(write_addr, &input[read_pos], to_write * sizeof(s32)); @@ -157,7 +160,7 @@ static u32 ReadAuxBufferDsp(Core::Memory::Memory& memory, CpuAddr return_info_, u32 read_count{read_count_}; u32 write_pos{0}; while (read_count > 0) { - u32 to_read{std::min(count_max - target_read_offset, read_count)}; + u32 to_read{(std::min)(count_max - target_read_offset, read_count)}; if (to_read > 0) { const auto read_addr = return_buffer + target_read_offset * sizeof(s32); memory.ReadBlockUnsafe(read_addr, &output[write_pos], to_read * sizeof(s32)); diff --git a/src/audio_core/renderer/command/effect/biquad_filter.cpp b/src/audio_core/renderer/command/effect/biquad_filter.cpp index 3392e7747d..539e0c6370 100644 --- a/src/audio_core/renderer/command/effect/biquad_filter.cpp +++ b/src/audio_core/renderer/command/effect/biquad_filter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,8 +23,8 @@ namespace AudioCore::Renderer { void ApplyBiquadFilterFloat(std::span output, std::span input, std::array& b_, std::array& a_, VoiceState::BiquadFilterState& state, const u32 sample_count) { - constexpr f64 min{std::numeric_limits::min()}; - constexpr f64 max{std::numeric_limits::max()}; + constexpr f64 min{(std::numeric_limits::min)()}; + constexpr f64 max{(std::numeric_limits::max)()}; std::array b{Common::FixedPoint<50, 14>::from_base(b_[0]).to_double(), Common::FixedPoint<50, 14>::from_base(b_[1]).to_double(), Common::FixedPoint<50, 14>::from_base(b_[2]).to_double()}; @@ -61,8 +64,8 @@ void ApplyBiquadFilterFloat(std::span output, std::span input, static void ApplyBiquadFilterInt(std::span output, std::span input, std::array& b, std::array& a, VoiceState::BiquadFilterState& state, const u32 sample_count) { - constexpr s64 min{std::numeric_limits::min()}; - constexpr s64 max{std::numeric_limits::max()}; + constexpr s64 min{(std::numeric_limits::min)()}; + constexpr s64 max{(std::numeric_limits::max)()}; for (u32 i = 0; i < sample_count; i++) { const s64 in_sample{input[i]}; diff --git a/src/audio_core/renderer/command/effect/capture.cpp b/src/audio_core/renderer/command/effect/capture.cpp index f235ce027f..4267580128 100644 --- a/src/audio_core/renderer/command/effect/capture.cpp +++ b/src/audio_core/renderer/command/effect/capture.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -79,7 +82,7 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_in u32 write_count{write_count_}; u32 write_pos{0}; while (write_count > 0) { - u32 to_write{std::min(count_max - target_write_offset, write_count)}; + u32 to_write{(std::min)(count_max - target_write_offset, write_count)}; if (to_write > 0) { memory.WriteBlockUnsafe(send_buffer + target_write_offset * sizeof(s32), diff --git a/src/audio_core/renderer/command/effect/i3dl2_reverb.cpp b/src/audio_core/renderer/command/effect/i3dl2_reverb.cpp index ecfdfabc61..be5e36d2ae 100644 --- a/src/audio_core/renderer/command/effect/i3dl2_reverb.cpp +++ b/src/audio_core/renderer/command/effect/i3dl2_reverb.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include "audio_core/adsp/apps/audio_renderer/command_list_processor.h" #include "audio_core/renderer/command/effect/i3dl2_reverb.h" -#include "common/polyfill_ranges.h" +#include namespace AudioCore::Renderer { @@ -76,9 +79,9 @@ static void UpdateI3dl2ReverbEffectParameter(const I3dl2ReverbInfo::ParameterVer state.dry_gain = params.dry_gain; Common::FixedPoint<50, 14> early_gain{ - std::min(params.room_gain + params.reflection_gain, 5000.0f) / 2000.0f}; + (std::min)(params.room_gain + params.reflection_gain, 5000.0f) / 2000.0f}; state.early_gain = pow_10(early_gain.to_float()); - Common::FixedPoint<50, 14> late_gain{std::min(params.room_gain + params.reverb_gain, 5000.0f) / + Common::FixedPoint<50, 14> late_gain{(std::min)(params.room_gain + params.reverb_gain, 5000.0f) / 2000.0f}; state.late_gain = pow_10(late_gain.to_float()); @@ -94,7 +97,7 @@ static void UpdateI3dl2ReverbEffectParameter(const I3dl2ReverbInfo::ParameterVer const Common::FixedPoint<50, 14> c{ std::sqrt(std::pow(b.to_float(), 2.0f) + (std::pow(a.to_float(), 2.0f) * -4.0f))}; - state.lowpass_1 = std::min(((b - c) / (a * 2.0f)).to_float(), 0.99723f); + state.lowpass_1 = (std::min)(((b - c) / (a * 2.0f)).to_float(), 0.99723f); state.lowpass_2 = 1.0f - state.lowpass_1; } diff --git a/src/audio_core/renderer/command/effect/light_limiter.cpp b/src/audio_core/renderer/command/effect/light_limiter.cpp index 63aa06f5c3..7f0455461f 100644 --- a/src/audio_core/renderer/command/effect/light_limiter.cpp +++ b/src/audio_core/renderer/command/effect/light_limiter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -50,8 +53,8 @@ static void ApplyLightLimiterEffect(const LightLimiterInfo::ParameterVersion2& p std::span> inputs, std::span> outputs, const u32 sample_count, LightLimiterInfo::StatisticsInternal* statistics) { - constexpr s64 min{std::numeric_limits::min()}; - constexpr s64 max{std::numeric_limits::max()}; + constexpr s64 min{(std::numeric_limits::min)()}; + constexpr s64 max{(std::numeric_limits::max)()}; const auto recip_estimate = [](f64 a) -> f64 { s32 q, s; @@ -117,9 +120,9 @@ static void ApplyLightLimiterEffect(const LightLimiterInfo::ParameterVersion2& p if (statistics) { statistics->channel_max_sample[channel] = - std::max(statistics->channel_max_sample[channel], abs_sample.to_float()); + (std::max)(statistics->channel_max_sample[channel], abs_sample.to_float()); statistics->channel_compression_gain_min[channel] = - std::min(statistics->channel_compression_gain_min[channel], + (std::min)(statistics->channel_compression_gain_min[channel], state.compression_gain[channel].to_float()); } } diff --git a/src/audio_core/renderer/command/effect/reverb.cpp b/src/audio_core/renderer/command/effect/reverb.cpp index 7f152a9629..87eab1adda 100644 --- a/src/audio_core/renderer/command/effect/reverb.cpp +++ b/src/audio_core/renderer/command/effect/reverb.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include "audio_core/adsp/apps/audio_renderer/command_list_processor.h" #include "audio_core/renderer/command/effect/reverb.h" -#include "common/polyfill_ranges.h" +#include namespace AudioCore::Renderer { @@ -94,7 +97,7 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par for (u32 i = 0; i < ReverbInfo::MaxDelayTaps; i++) { auto early_delay{ ((pre_delay_time + EarlyDelayTimes[params.early_mode][i]) * sample_rate).to_int()}; - early_delay = std::min(early_delay, state.pre_delay_line.sample_count_max); + early_delay = (std::min)(early_delay, state.pre_delay_line.sample_count_max); state.early_delay_times[i] = early_delay + 1; state.early_gains[i] = Common::FixedPoint<50, 14>::from_base(params.early_gain) * EarlyDelayGains[params.early_mode][i]; @@ -107,7 +110,7 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par auto pre_time{ ((pre_delay_time + EarlyDelayTimes[params.early_mode][10]) * sample_rate).to_int()}; - state.pre_delay_time = std::min(pre_time, state.pre_delay_line.sample_count_max); + state.pre_delay_time = (std::min)(pre_time, state.pre_delay_line.sample_count_max); if (!unk_initialized) { unk_value = cos((1280.0f / sample_rate).to_float()); @@ -117,13 +120,13 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) { const auto fdn_delay{(FdnDelayTimes[params.late_mode][i] * sample_rate).to_int()}; state.fdn_delay_lines[i].sample_count = - std::min(fdn_delay, state.fdn_delay_lines[i].sample_count_max); + (std::min)(fdn_delay, state.fdn_delay_lines[i].sample_count_max); state.fdn_delay_lines[i].buffer_end = &state.fdn_delay_lines[i].buffer[state.fdn_delay_lines[i].sample_count - 1]; const auto decay_delay{(DecayDelayTimes[params.late_mode][i] * sample_rate).to_int()}; state.decay_delay_lines[i].sample_count = - std::min(decay_delay, state.decay_delay_lines[i].sample_count_max); + (std::min)(decay_delay, state.decay_delay_lines[i].sample_count_max); state.decay_delay_lines[i].buffer_end = &state.decay_delay_lines[i].buffer[state.decay_delay_lines[i].sample_count - 1]; @@ -188,8 +191,6 @@ static void InitializeReverbEffect(const ReverbInfo::ParameterVersion2& params, const auto center_delay_time{(5 * delay).to_uint_floor()}; state.center_delay_line.Initialize(center_delay_time, 1.0f); - UpdateReverbEffectParameter(params, state); - for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) { std::ranges::fill(state.fdn_delay_lines[i].buffer, 0); std::ranges::fill(state.decay_delay_lines[i].buffer, 0); diff --git a/src/audio_core/renderer/command/mix/depop_for_mix_buffers.cpp b/src/audio_core/renderer/command/mix/depop_for_mix_buffers.cpp index caedb56b79..5c062b2e9c 100644 --- a/src/audio_core/renderer/command/mix/depop_for_mix_buffers.cpp +++ b/src/audio_core/renderer/command/mix/depop_for_mix_buffers.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -43,7 +46,7 @@ void DepopForMixBuffersCommand::Dump( } void DepopForMixBuffersCommand::Process(const AudioRenderer::CommandListProcessor& processor) { - auto end_index{std::min(processor.buffer_count, input + count)}; + auto end_index{(std::min)(processor.buffer_count, input + count)}; std::span depop_buff{reinterpret_cast(depop_buffer), end_index}; for (u32 index = input; index < end_index; index++) { diff --git a/src/audio_core/renderer/command/resample/upsample.cpp b/src/audio_core/renderer/command/resample/upsample.cpp index 691d70390f..71d865264a 100644 --- a/src/audio_core/renderer/command/resample/upsample.cpp +++ b/src/audio_core/renderer/command/resample/upsample.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -215,7 +218,7 @@ auto UpsampleCommand::Dump([[maybe_unused]] const AudioRenderer::CommandListProc void UpsampleCommand::Process(const AudioRenderer::CommandListProcessor& processor) { const auto info{reinterpret_cast(upsampler_info)}; - const auto input_count{std::min(info->input_count, buffer_count)}; + const auto input_count{(std::min)(info->input_count, buffer_count)}; const std::span inputs_{reinterpret_cast(inputs), input_count}; for (u32 i = 0; i < input_count; i++) { diff --git a/src/audio_core/renderer/command/sink/circular_buffer.cpp b/src/audio_core/renderer/command/sink/circular_buffer.cpp index e056d15a65..b2d4ccfcd8 100644 --- a/src/audio_core/renderer/command/sink/circular_buffer.cpp +++ b/src/audio_core/renderer/command/sink/circular_buffer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,8 +24,8 @@ void CircularBufferSinkCommand::Dump( } void CircularBufferSinkCommand::Process(const AudioRenderer::CommandListProcessor& processor) { - constexpr s32 min{std::numeric_limits::min()}; - constexpr s32 max{std::numeric_limits::max()}; + constexpr s32 min{(std::numeric_limits::min)()}; + constexpr s32 max{(std::numeric_limits::max)()}; std::array output{}; for (u32 channel = 0; channel < input_count; channel++) { diff --git a/src/audio_core/renderer/command/sink/device.cpp b/src/audio_core/renderer/command/sink/device.cpp index 3480ed475c..16b1bd7467 100644 --- a/src/audio_core/renderer/command/sink/device.cpp +++ b/src/audio_core/renderer/command/sink/device.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,8 +23,8 @@ void DeviceSinkCommand::Dump([[maybe_unused]] const AudioRenderer::CommandListPr } void DeviceSinkCommand::Process(const AudioRenderer::CommandListProcessor& processor) { - constexpr s32 min = std::numeric_limits::min(); - constexpr s32 max = std::numeric_limits::max(); + constexpr s32 min = (std::numeric_limits::min)(); + constexpr s32 max = (std::numeric_limits::max)(); auto stream{processor.GetOutputSinkStream()}; stream->SetSystemChannels(input_count); diff --git a/src/audio_core/renderer/mix/mix_context.cpp b/src/audio_core/renderer/mix/mix_context.cpp index c712610bbd..9333a29492 100644 --- a/src/audio_core/renderer/mix/mix_context.cpp +++ b/src/audio_core/renderer/mix/mix_context.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include "audio_core/renderer/mix/mix_context.h" #include "audio_core/renderer/splitter/splitter_context.h" -#include "common/polyfill_ranges.h" +#include namespace AudioCore::Renderer { @@ -126,7 +129,7 @@ bool MixContext::TSortInfo(const SplitterContext& splitter_context) { } auto sorted_results{node_states.GetSortedResuls()}; - const auto result_size{std::min(count, static_cast(sorted_results.second))}; + const auto result_size{(std::min)(count, static_cast(sorted_results.second))}; for (s32 i = 0; i < result_size; i++) { sorted_mix_infos[i] = &mix_infos[sorted_results.first[i]]; } diff --git a/src/audio_core/renderer/sink/sink_info_base.h b/src/audio_core/renderer/sink/sink_info_base.h index e10d1cb382..b368f7ba48 100644 --- a/src/audio_core/renderer/sink/sink_info_base.h +++ b/src/audio_core/renderer/sink/sink_info_base.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -168,9 +171,9 @@ protected: /// Node id for this sink u32 node_id{}; /// State buffer for this sink - std::array state{}; + std::array state{}; /// Parameter buffer for this sink - std::array + std::array parameter{}; }; diff --git a/src/audio_core/renderer/splitter/splitter_context.cpp b/src/audio_core/renderer/splitter/splitter_context.cpp index d0f3b60c29..fb118e981e 100644 --- a/src/audio_core/renderer/splitter/splitter_context.cpp +++ b/src/audio_core/renderer/splitter/splitter_context.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -170,7 +173,7 @@ void SplitterContext::RecomposeDestination(SplitterInfo& out_info, auto dest_count{info_header->destination_count}; if (!splitter_bug_fixed) { - dest_count = std::min(dest_count, GetDestCountPerInfoForCompat()); + dest_count = (std::min)(dest_count, GetDestCountPerInfoForCompat()); } if (dest_count == 0) { diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index c30d68426c..2053ec6dd4 100644 --- a/src/audio_core/renderer/system.cpp +++ b/src/audio_core/renderer/system.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -718,7 +721,7 @@ u64 System::GenerateCommand(std::span in_command_buffer, const auto estimated_time{start_estimated_time - end_estimated_time}; - const auto time_limit{static_cast(std::max(dsp_time_limit + estimated_time, 0.0f))}; + const auto time_limit{static_cast((std::max)(dsp_time_limit + estimated_time, 0.0f))}; num_voices_dropped = DropVoices(command_buffer, static_cast(start_estimated_time), time_limit); } diff --git a/src/audio_core/renderer/voice/voice_context.cpp b/src/audio_core/renderer/voice/voice_context.cpp index c3644e38b2..c9b4d57fdb 100644 --- a/src/audio_core/renderer/voice/voice_context.cpp +++ b/src/audio_core/renderer/voice/voice_context.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "audio_core/renderer/voice/voice_context.h" -#include "common/polyfill_ranges.h" +#include namespace AudioCore::Renderer { diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp index a33162b806..a3a7a89ba4 100644 --- a/src/audio_core/sink/cubeb_sink.cpp +++ b/src/audio_core/sink/cubeb_sink.cpp @@ -73,7 +73,7 @@ public: minimum_latency = TargetSampleCount * 2; } - minimum_latency = std::max(minimum_latency, TargetSampleCount * 2); + minimum_latency = (std::max)(minimum_latency, TargetSampleCount * 2); LOG_INFO(Service_Audio, "Opening cubeb stream {} type {} with: rate {} channels {} (system channels {}) " @@ -372,7 +372,7 @@ u32 GetCubebLatency() { LOG_CRITICAL(Audio_Sink, "Error getting minimum latency, error: {}", latency_error); latency = TargetSampleCount * 2; } - latency = std::max(latency, TargetSampleCount * 2); + latency = (std::max)(latency, TargetSampleCount * 2); cubeb_destroy(ctx); return latency; } @@ -426,7 +426,7 @@ bool IsCubebSuitable() { LOG_ERROR(Audio_Sink, "Cubeb could not get min latency, it is not suitable."); return false; } - latency = std::max(latency, TargetSampleCount * 2); + latency = (std::max)(latency, TargetSampleCount * 2); // Test opening a device with standard parameters cubeb_devid output_device{0}; diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp index c0078e6ddc..b75d743494 100644 --- a/src/audio_core/sink/sink_stream.cpp +++ b/src/audio_core/sink/sink_stream.cpp @@ -31,8 +31,8 @@ void SinkStream::AppendBuffer(SinkBuffer& buffer, std::span samples) { return; } - constexpr s32 min{std::numeric_limits::min()}; - constexpr s32 max{std::numeric_limits::max()}; + constexpr s32 min{(std::numeric_limits::min)()}; + constexpr s32 max{(std::numeric_limits::max)()}; auto yuzu_volume{Settings::Volume()}; if (yuzu_volume > 1.0f) { @@ -123,8 +123,8 @@ void SinkStream::AppendBuffer(SinkBuffer& buffer, std::span samples) { } std::vector SinkStream::ReleaseBuffer(u64 num_samples) { - constexpr s32 min = std::numeric_limits::min(); - constexpr s32 max = std::numeric_limits::max(); + constexpr s32 min = (std::numeric_limits::min)(); + constexpr s32 max = (std::numeric_limits::max)(); auto samples{samples_buffer.Pop(num_samples)}; @@ -293,8 +293,7 @@ void SinkStream::WaitFreeSpace(std::stop_token stop_token) { release_cv.wait_for(lk, std::chrono::milliseconds(5), [this]() { return paused || queued_buffers < max_queue_size; }); if (queued_buffers > max_queue_size + 3) { - Common::CondvarWait(release_cv, lk, stop_token, - [this] { return paused || queued_buffers < max_queue_size; }); + release_cv.wait(lk, stop_token, [this] { return paused || queued_buffers < max_queue_size; }); } } diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index cbe1d35fc5..96ea429e5a 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -32,7 +32,6 @@ add_library( atomic_ops.h bit_cast.h bit_field.h - bit_set.h bit_util.h bounded_threadsafe_queue.h cityhash.cpp @@ -97,8 +96,6 @@ add_library( memory_detect.h multi_level_page_table.cpp multi_level_page_table.h - nvidia_flags.cpp - nvidia_flags.h overflow.h page_table.cpp page_table.h @@ -162,10 +159,6 @@ add_library( zstd_compression.h ) -if(YUZU_ENABLE_PORTABLE) - add_compile_definitions(YUZU_ENABLE_PORTABLE) -endif() - if(WIN32) target_sources(common PRIVATE windows/timer_resolution.cpp windows/timer_resolution.h) @@ -241,7 +234,7 @@ else() ) # Get around GCC failing with intrinsics in Debug - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_BUILD_TYPE MATCHES "Debug") + if(CXX_GCC AND CMAKE_BUILD_TYPE MATCHES "Debug") set_property( SOURCE stb.cpp APPEND @@ -249,7 +242,7 @@ else() endif() endif() -if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +if(CXX_CLANG) target_compile_options(common PRIVATE -fsized-deallocation -Werror=unreachable-code-aggressive) target_compile_definitions( @@ -262,28 +255,17 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") endif() if (BOOST_NO_HEADERS) - target_link_libraries(common PUBLIC Boost::algorithm Boost::icl Boost::pool) + target_link_libraries(common PUBLIC Boost::algorithm Boost::icl Boost::pool) else() - target_link_libraries(common PUBLIC Boost::headers) + target_link_libraries(common PUBLIC Boost::headers) endif() if (lz4_ADDED) - target_include_directories(common PRIVATE ${lz4_SOURCE_DIR}/lib) + target_include_directories(common PRIVATE ${lz4_SOURCE_DIR}/lib) endif() target_link_libraries(common PUBLIC fmt::fmt stb::headers Threads::Threads) -target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle) - -if (TARGET libzstd_static) - target_link_libraries(common PRIVATE libzstd_static) -else() - target_link_libraries(common PRIVATE zstd) -endif() - -if (TARGET unordered_dense::unordered_dense) - # weird quirk of system installs - target_link_libraries(common PUBLIC unordered_dense::unordered_dense) -endif() +target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle zstd::zstd) if(ANDROID) # For ASharedMemory_create diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index e0edd006a5..1198833996 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -1,7 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -49,6 +46,7 @@ static jclass s_overlay_control_data_class; static jmethodID s_overlay_control_data_constructor; static jfieldID s_overlay_control_data_id_field; static jfieldID s_overlay_control_data_enabled_field; +static jfieldID s_overlay_control_data_individual_scale_field; static jfieldID s_overlay_control_data_landscape_position_field; static jfieldID s_overlay_control_data_portrait_position_field; static jfieldID s_overlay_control_data_foldable_position_field; @@ -244,6 +242,10 @@ namespace Common::Android { return s_overlay_control_data_enabled_field; } + jfieldID GetOverlayControlDataIndividualScaleField() { + return s_overlay_control_data_individual_scale_field; + } + jfieldID GetOverlayControlDataLandscapePositionField() { return s_overlay_control_data_landscape_position_field; } @@ -494,7 +496,7 @@ namespace Common::Android { reinterpret_cast(env->NewGlobalRef(overlay_control_data_class)); s_overlay_control_data_constructor = env->GetMethodID(overlay_control_data_class, "", - "(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;)V"); + "(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;F)V"); s_overlay_control_data_id_field = env->GetFieldID(overlay_control_data_class, "id", "Ljava/lang/String;"); s_overlay_control_data_enabled_field = @@ -505,6 +507,8 @@ namespace Common::Android { env->GetFieldID(overlay_control_data_class, "portraitPosition", "Lkotlin/Pair;"); s_overlay_control_data_foldable_position_field = env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); + s_overlay_control_data_individual_scale_field = + env->GetFieldID(overlay_control_data_class, "individualScale", "F"); env->DeleteLocalRef(overlay_control_data_class); const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch"); diff --git a/src/common/android/id_cache.h b/src/common/android/id_cache.h index c56ffcf5c6..6b48f471b7 100644 --- a/src/common/android/id_cache.h +++ b/src/common/android/id_cache.h @@ -1,7 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -67,6 +64,7 @@ jclass GetOverlayControlDataClass(); jmethodID GetOverlayControlDataConstructor(); jfieldID GetOverlayControlDataIdField(); jfieldID GetOverlayControlDataEnabledField(); +jfieldID GetOverlayControlDataIndividualScaleField(); jfieldID GetOverlayControlDataLandscapePositionField(); jfieldID GetOverlayControlDataPortraitPositionField(); jfieldID GetOverlayControlDataFoldablePositionField(); diff --git a/src/common/bit_set.h b/src/common/bit_set.h deleted file mode 100644 index 74754504be..0000000000 --- a/src/common/bit_set.h +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -#include "common/alignment.h" -#include "common/bit_util.h" -#include "common/common_types.h" - -namespace Common { - -namespace impl { - -template -class BitSet { - -public: - constexpr BitSet() = default; - - constexpr void SetBit(size_t i) { - this->words[i / FlagsPerWord] |= GetBitMask(i % FlagsPerWord); - } - - constexpr void ClearBit(size_t i) { - this->words[i / FlagsPerWord] &= ~GetBitMask(i % FlagsPerWord); - } - - constexpr size_t CountLeadingZero() const { - for (size_t i = 0; i < NumWords; i++) { - if (this->words[i]) { - return FlagsPerWord * i + CountLeadingZeroImpl(this->words[i]); - } - } - return FlagsPerWord * NumWords; - } - - constexpr size_t GetNextSet(size_t n) const { - for (size_t i = (n + 1) / FlagsPerWord; i < NumWords; i++) { - Storage word = this->words[i]; - if (!IsAligned(n + 1, FlagsPerWord)) { - word &= GetBitMask(n % FlagsPerWord) - 1; - } - if (word) { - return FlagsPerWord * i + CountLeadingZeroImpl(word); - } - } - return FlagsPerWord * NumWords; - } - -private: - static_assert(std::is_unsigned_v); - static_assert(sizeof(Storage) <= sizeof(u64)); - - static constexpr size_t FlagsPerWord = BitSize(); - static constexpr size_t NumWords = AlignUp(N, FlagsPerWord) / FlagsPerWord; - - static constexpr auto CountLeadingZeroImpl(Storage word) { - return std::countl_zero(static_cast(word)) - - (BitSize() - FlagsPerWord); - } - - static constexpr Storage GetBitMask(size_t bit) { - return Storage(1) << (FlagsPerWord - 1 - bit); - } - - std::array words{}; -}; - -} // namespace impl - -template -using BitSet8 = impl::BitSet; - -template -using BitSet16 = impl::BitSet; - -template -using BitSet32 = impl::BitSet; - -template -using BitSet64 = impl::BitSet; - -} // namespace Common diff --git a/src/common/bounded_threadsafe_queue.h b/src/common/bounded_threadsafe_queue.h index b36fc1de96..80f32e2553 100644 --- a/src/common/bounded_threadsafe_queue.h +++ b/src/common/bounded_threadsafe_queue.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -123,7 +126,7 @@ private: } else if constexpr (Mode == PopMode::WaitWithStopToken) { // Wait until the queue is not empty. std::unique_lock lock{consumer_cv_mutex}; - Common::CondvarWait(consumer_cv, lock, stop_token, [this, read_index] { + consumer_cv.wait(lock, stop_token, [this, read_index] { return read_index != m_write_index.load(std::memory_order::acquire); }); if (stop_token.stop_requested()) { diff --git a/src/common/common_types.h b/src/common/common_types.h index 99fff66bed..6e7e4ec0d9 100644 --- a/src/common/common_types.h +++ b/src/common/common_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2012 Gekko Emulator // SPDX-FileContributor: ShizZy // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,6 @@ #include #include -#include using u8 = std::uint8_t; ///< 8-bit unsigned byte using u16 = std::uint16_t; ///< 16-bit unsigned short diff --git a/src/common/free_region_manager.h b/src/common/free_region_manager.h index 2e590d6094..913668b291 100644 --- a/src/common/free_region_manager.h +++ b/src/common/free_region_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,8 +30,8 @@ public: // If we are, join with them, ensuring we stay in bounds. if (it != m_free_regions.end()) { - start_address = std::min(start_address, it->lower()); - end_address = std::max(end_address, it->upper()); + start_address = (std::min)(start_address, it->lower()); + end_address = (std::max)(end_address, it->upper()); } // Free the relevant region. diff --git a/src/common/fs/file.cpp b/src/common/fs/file.cpp index b0b25eb432..722ba41949 100644 --- a/src/common/fs/file.cpp +++ b/src/common/fs/file.cpp @@ -3,6 +3,7 @@ #include +#include "common/assert.h" #include "common/fs/file.h" #include "common/fs/fs.h" #ifdef ANDROID diff --git a/src/common/fs/fs_paths.h b/src/common/fs/fs_paths.h index 40891380c9..5cdf9be39d 100644 --- a/src/common/fs/fs_paths.h +++ b/src/common/fs/fs_paths.h @@ -12,7 +12,6 @@ #define PORTABLE_DIR "user" // Sub-directories contained within a yuzu data directory - #define AMIIBO_DIR "amiibo" #define CACHE_DIR "cache" #define CONFIG_DIR "config" @@ -28,11 +27,12 @@ #define SHADER_DIR "shader" #define TAS_DIR "tas" #define ICONS_DIR "icons" + +// Compatibility with other emulators #define CITRON_DIR "citron" #define SUDACHI_DIR "sudachi" #define YUZU_DIR "yuzu" #define SUYU_DIR "suyu" // yuzu-specific files - #define LOG_FILE "eden_log.txt" diff --git a/src/common/fs/fs_types.h b/src/common/fs/fs_types.h index 900f85d24e..7b7359fa6f 100644 --- a/src/common/fs/fs_types.h +++ b/src/common/fs/fs_types.h @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include #include "common/common_funcs.h" diff --git a/src/common/fs/fs_util.cpp b/src/common/fs/fs_util.cpp index 813a713c3b..847fedec54 100644 --- a/src/common/fs/fs_util.cpp +++ b/src/common/fs/fs_util.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/fs/fs_util.h" -#include "common/polyfill_ranges.h" +#include namespace Common::FS { diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index e032360961..a095e0c239 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -9,6 +9,7 @@ #include #include +#include "common/assert.h" #include "common/fs/fs.h" #ifdef ANDROID #include "common/fs/fs_android.h" @@ -101,61 +102,53 @@ public: legacy_paths.insert_or_assign(legacy_path, new_path); } + /// In non-android devices, the current directory will first search for "user" + /// if such directory (and it must be a directory) is found, that takes priority + /// over the global configuration directory (in other words, portable directories + /// take priority over the global ones, always) + /// On Android, the behaviour is to look for the current directory only. void Reinitialize(fs::path eden_path = {}) { fs::path eden_path_cache; fs::path eden_path_config; - #ifdef _WIN32 -#ifdef YUZU_ENABLE_PORTABLE + // User directory takes priority over global %AppData% directory eden_path = GetExeDirectory() / PORTABLE_DIR; -#endif - if (!IsDir(eden_path)) { + if (!Exists(eden_path) || !IsDir(eden_path)) { eden_path = GetAppDataRoamingDirectory() / EDEN_DIR; } - eden_path_cache = eden_path / CACHE_DIR; eden_path_config = eden_path / CONFIG_DIR; - #define LEGACY_PATH(titleName, upperName) GenerateLegacyPath(LegacyPath::titleName##Dir, GetAppDataRoamingDirectory() / upperName##_DIR); \ GenerateLegacyPath(LegacyPath::titleName##ConfigDir, GetAppDataRoamingDirectory() / upperName##_DIR / CONFIG_DIR); \ GenerateLegacyPath(LegacyPath::titleName##CacheDir, GetAppDataRoamingDirectory() / upperName##_DIR / CACHE_DIR); - LEGACY_PATH(Citron, CITRON) LEGACY_PATH(Sudachi, SUDACHI) LEGACY_PATH(Yuzu, YUZU) LEGACY_PATH(Suyu, SUYU) #undef LEGACY_PATH - #elif ANDROID ASSERT(!eden_path.empty()); eden_path_cache = eden_path / CACHE_DIR; eden_path_config = eden_path / CONFIG_DIR; #else -#ifdef YUZU_ENABLE_PORTABLE eden_path = GetCurrentDir() / PORTABLE_DIR; -#endif - if (Exists(eden_path) && IsDir(eden_path)) { - eden_path_cache = eden_path / CACHE_DIR; - eden_path_config = eden_path / CONFIG_DIR; - } else { + if (!Exists(eden_path) || !IsDir(eden_path)) { eden_path = GetDataDirectory("XDG_DATA_HOME") / EDEN_DIR; eden_path_cache = GetDataDirectory("XDG_CACHE_HOME") / EDEN_DIR; eden_path_config = GetDataDirectory("XDG_CONFIG_HOME") / EDEN_DIR; + } else { + eden_path_cache = eden_path / CACHE_DIR; + eden_path_config = eden_path / CONFIG_DIR; } - #define LEGACY_PATH(titleName, upperName) GenerateLegacyPath(LegacyPath::titleName##Dir, GetDataDirectory("XDG_DATA_HOME") / upperName##_DIR); \ GenerateLegacyPath(LegacyPath::titleName##ConfigDir, GetDataDirectory("XDG_CONFIG_HOME") / upperName##_DIR); \ GenerateLegacyPath(LegacyPath::titleName##CacheDir, GetDataDirectory("XDG_CACHE_HOME") / upperName##_DIR); - LEGACY_PATH(Citron, CITRON) LEGACY_PATH(Sudachi, SUDACHI) LEGACY_PATH(Yuzu, YUZU) LEGACY_PATH(Suyu, SUYU) - #undef LEGACY_PATH - #endif - GenerateEdenPath(EdenPath::EdenDir, eden_path); GenerateEdenPath(EdenPath::AmiiboDir, eden_path / AMIIBO_DIR); GenerateEdenPath(EdenPath::CacheDir, eden_path_cache); @@ -492,9 +485,9 @@ std::string GetParentPath(std::string_view path) { std::size_t name_index; if (name_bck_index == std::string_view::npos || name_fwd_index == std::string_view::npos) { - name_index = std::min(name_bck_index, name_fwd_index); + name_index = (std::min)(name_bck_index, name_fwd_index); } else { - name_index = std::max(name_bck_index, name_fwd_index); + name_index = (std::max)(name_bck_index, name_fwd_index); } return std::string(path.substr(0, name_index)); @@ -514,27 +507,7 @@ std::string_view GetPathWithoutTop(std::string_view path) { const auto name_bck_index = path.find('\\'); const auto name_fwd_index = path.find('/'); - return path.substr(std::min(name_bck_index, name_fwd_index) + 1); -} - -std::string_view GetFilename(std::string_view path) { - const auto name_index = path.find_last_of("\\/"); - - if (name_index == std::string_view::npos) { - return {}; - } - - return path.substr(name_index + 1); -} - -std::string_view GetExtensionFromFilename(std::string_view name) { - const std::size_t index = name.rfind('.'); - - if (index == std::string_view::npos) { - return {}; - } - - return name.substr(index + 1); + return path.substr((std::min)(name_bck_index, name_fwd_index) + 1); } } // namespace Common::FS diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h index c1f478690a..b34efc472f 100644 --- a/src/common/fs/path_util.h +++ b/src/common/fs/path_util.h @@ -352,9 +352,17 @@ enum class DirectorySeparator { [[nodiscard]] std::string_view GetPathWithoutTop(std::string_view path); // Gets the filename of the path -[[nodiscard]] std::string_view GetFilename(std::string_view path); +[[nodiscard]] inline std::string_view GetFilename(const std::string_view path) noexcept { + if (auto const name_index = path.find_last_of("\\/"); name_index != std::string_view::npos) + return path.substr(name_index + 1); + return {}; +} // Gets the extension of the filename -[[nodiscard]] std::string_view GetExtensionFromFilename(std::string_view name); +[[nodiscard]] inline std::string_view GetExtensionFromFilename(const std::string_view name) noexcept { + if (auto const index = name.rfind('.'); index != std::string_view::npos) + return name.substr(index + 1); + return {}; +} } // namespace Common::FS diff --git a/src/common/heap_tracker.cpp b/src/common/heap_tracker.cpp index d509f2644c..a99d386d8a 100644 --- a/src/common/heap_tracker.cpp +++ b/src/common/heap_tracker.cpp @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include - #include "common/heap_tracker.h" #include "common/logging/log.h" +#include "common/assert.h" namespace Common { @@ -36,60 +36,68 @@ HeapTracker::~HeapTracker() = default; void HeapTracker::Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perm, bool is_separate_heap) { - bool rebuild_required = false; // When mapping other memory, map pages immediately. if (!is_separate_heap) { m_buffer.Map(virtual_offset, host_offset, length, perm, false); return; } + { - // We are mapping part of a separate heap and insert into mappings. + // We are mapping part of a separate heap. std::scoped_lock lk{m_lock}; - m_map_count++; - const auto it = m_mappings.insert_or_assign(virtual_offset, SeparateHeapMap{ + + auto* const map = new SeparateHeapMap{ + .vaddr = virtual_offset, .paddr = host_offset, .size = length, .tick = m_tick++, .perm = perm, .is_resident = false, - }); - // Update tick before possible rebuild. - it.first->second.tick = m_tick++; - // Check if we need to rebuild. - if (m_resident_map_count >= m_max_resident_map_count) - rebuild_required = true; - // Map the area. - m_buffer.Map(it.first->first, it.first->second.paddr, it.first->second.size, it.first->second.perm, false); - // This map is now resident. - it.first->second.is_resident = true; - m_resident_map_count++; - m_resident_mappings.insert(*it.first); + }; + + // Insert into mappings. + m_map_count++; + m_mappings.insert(*map); } - // A rebuild was required, so perform it now. - if (rebuild_required) - this->RebuildSeparateHeapAddressSpace(); + + // Finally, map. + this->DeferredMapSeparateHeap(virtual_offset); } void HeapTracker::Unmap(size_t virtual_offset, size_t size, bool is_separate_heap) { // If this is a separate heap... if (is_separate_heap) { std::scoped_lock lk{m_lock}; + + const SeparateHeapMap key{ + .vaddr = virtual_offset, + }; + // Split at the boundaries of the region we are removing. this->SplitHeapMapLocked(virtual_offset); this->SplitHeapMapLocked(virtual_offset + size); + // Erase all mappings in range. - auto it = m_mappings.find(virtual_offset); - while (it != m_mappings.end() && it->first < virtual_offset + size) { + auto it = m_mappings.find(key); + while (it != m_mappings.end() && it->vaddr < virtual_offset + size) { + // Get underlying item. + auto* const item = std::addressof(*it); + // If resident, erase from resident map. - if (it->second.is_resident) { + if (item->is_resident) { ASSERT(--m_resident_map_count >= 0); - m_resident_mappings.erase(m_resident_mappings.find(it->first)); + m_resident_mappings.erase(m_resident_mappings.iterator_to(*item)); } + // Erase from map. ASSERT(--m_map_count >= 0); it = m_mappings.erase(it); + + // Free the item. + delete item; } } + // Unmap pages. m_buffer.Unmap(virtual_offset, size, false); } @@ -111,51 +119,109 @@ void HeapTracker::Protect(size_t virtual_offset, size_t size, MemoryPermission p { std::scoped_lock lk2{m_lock}; + + const SeparateHeapMap key{ + .vaddr = next, + }; + // Try to get the next mapping corresponding to this address. - const auto it = m_mappings.find(next); + const auto it = m_mappings.nfind(key); + if (it == m_mappings.end()) { // There are no separate heap mappings remaining. next = end; should_protect = true; - } else if (it->first == cur) { + } else if (it->vaddr == cur) { // We are in range. // Update permission bits. - it->second.perm = perm; + it->perm = perm; // Determine next address and whether we should protect. - next = cur + it->second.size; - should_protect = it->second.is_resident; + next = cur + it->size; + should_protect = it->is_resident; } else /* if (it->vaddr > cur) */ { // We weren't in range, but there is a block coming up that will be. - next = it->first; + next = it->vaddr; should_protect = true; } } // Clamp to end. - next = std::min(next, end); + next = (std::min)(next, end); // Reprotect, if we need to. - if (should_protect) + if (should_protect) { m_buffer.Protect(cur, next - cur, perm); + } + // Advance. cur = next; } } +bool HeapTracker::DeferredMapSeparateHeap(u8* fault_address) { + if (m_buffer.IsInVirtualRange(fault_address)) { + return this->DeferredMapSeparateHeap(fault_address - m_buffer.VirtualBasePointer()); + } + + return false; +} + +bool HeapTracker::DeferredMapSeparateHeap(size_t virtual_offset) { + bool rebuild_required = false; + + { + std::scoped_lock lk{m_lock}; + + // Check to ensure this was a non-resident separate heap mapping. + const auto it = this->GetNearestHeapMapLocked(virtual_offset); + if (it == m_mappings.end() || it->is_resident) { + return false; + } + + // Update tick before possible rebuild. + it->tick = m_tick++; + + // Check if we need to rebuild. + if (m_resident_map_count > m_max_resident_map_count) { + rebuild_required = true; + } + + // Map the area. + m_buffer.Map(it->vaddr, it->paddr, it->size, it->perm, false); + + // This map is now resident. + it->is_resident = true; + m_resident_map_count++; + m_resident_mappings.insert(*it); + } + + if (rebuild_required) { + // A rebuild was required, so perform it now. + this->RebuildSeparateHeapAddressSpace(); + } + + return true; +} + void HeapTracker::RebuildSeparateHeapAddressSpace() { std::scoped_lock lk{m_rebuild_lock, m_lock}; + ASSERT(!m_resident_mappings.empty()); + // Dump half of the mappings. + // // Despite being worse in theory, this has proven to be better in practice than more // regularly dumping a smaller amount, because it significantly reduces average case // lock contention. - std::size_t const desired_count = std::min(m_resident_map_count, m_max_resident_map_count) / 2; + std::size_t const desired_count = (std::min)(m_resident_map_count, m_max_resident_map_count) / 2; std::size_t const evict_count = m_resident_map_count - desired_count; auto it = m_resident_mappings.begin(); - for (std::size_t i = 0; i < evict_count && it != m_resident_mappings.end(); i++) { + + for (size_t i = 0; i < evict_count && it != m_resident_mappings.end(); i++) { // Unmark and unmap. - it->second.is_resident = false; - m_buffer.Unmap(it->first, it->second.size, false); + it->is_resident = false; + m_buffer.Unmap(it->vaddr, it->size, false); + // Advance. ASSERT(--m_resident_map_count >= 0); it = m_resident_mappings.erase(it); @@ -164,32 +230,53 @@ void HeapTracker::RebuildSeparateHeapAddressSpace() { void HeapTracker::SplitHeapMap(VAddr offset, size_t size) { std::scoped_lock lk{m_lock}; + this->SplitHeapMapLocked(offset); this->SplitHeapMapLocked(offset + size); } void HeapTracker::SplitHeapMapLocked(VAddr offset) { - auto it = this->GetNearestHeapMapLocked(offset); - if (it != m_mappings.end() && it->first != offset) { - // Adjust left iterator - auto const orig_size = it->second.size; - auto const left_size = offset - it->first; - it->second.size = left_size; - // Insert the new right map. - auto const right = SeparateHeapMap{ - .paddr = it->second.paddr + left_size, - .size = orig_size - left_size, - .tick = it->second.tick, - .perm = it->second.perm, - .is_resident = it->second.is_resident, - }; - m_map_count++; - auto rit = m_mappings.insert_or_assign(it->first + left_size, right); - if (rit.first->second.is_resident) { - m_resident_map_count++; - m_resident_mappings.insert(*rit.first); - } + const auto it = this->GetNearestHeapMapLocked(offset); + if (it == m_mappings.end() || it->vaddr == offset) { + // Not contained or no split required. + return; + } + + // Cache the original values. + auto* const left = std::addressof(*it); + const size_t orig_size = left->size; + + // Adjust the left map. + const size_t left_size = offset - left->vaddr; + left->size = left_size; + + // Create the new right map. + auto* const right = new SeparateHeapMap{ + .vaddr = left->vaddr + left_size, + .paddr = left->paddr + left_size, + .size = orig_size - left_size, + .tick = left->tick, + .perm = left->perm, + .is_resident = left->is_resident, + }; + + // Insert the new right map. + m_map_count++; + m_mappings.insert(*right); + + // If resident, also insert into resident map. + if (right->is_resident) { + m_resident_map_count++; + m_resident_mappings.insert(*right); } } +HeapTracker::AddrTree::iterator HeapTracker::GetNearestHeapMapLocked(VAddr offset) { + const SeparateHeapMap key{ + .vaddr = offset, + }; + + return m_mappings.find(key); +} + } // namespace Common diff --git a/src/common/heap_tracker.h b/src/common/heap_tracker.h index 14b5401c18..ee5b0bf43a 100644 --- a/src/common/heap_tracker.h +++ b/src/common/heap_tracker.h @@ -1,55 +1,93 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include +#include #include -#include + #include "common/host_memory.h" +#include "common/intrusive_red_black_tree.h" namespace Common { struct SeparateHeapMap { - PAddr paddr{}; //8 - std::size_t size{}; //8 (16) - std::size_t tick{}; //8 (24) - // 4 bits needed, sync with host_memory.h if needed - MemoryPermission perm : 4 = MemoryPermission::Read; - bool is_resident : 1 = false; + Common::IntrusiveRedBlackTreeNode addr_node{}; + Common::IntrusiveRedBlackTreeNode tick_node{}; + VAddr vaddr{}; + PAddr paddr{}; + size_t size{}; + size_t tick{}; + MemoryPermission perm{}; + bool is_resident{}; +}; + +struct SeparateHeapMapAddrComparator { + static constexpr int Compare(const SeparateHeapMap& lhs, const SeparateHeapMap& rhs) { + if (lhs.vaddr < rhs.vaddr) { + return -1; + } else if (lhs.vaddr <= (rhs.vaddr + rhs.size - 1)) { + return 0; + } else { + return 1; + } + } +}; + +struct SeparateHeapMapTickComparator { + static constexpr int Compare(const SeparateHeapMap& lhs, const SeparateHeapMap& rhs) { + if (lhs.tick < rhs.tick) { + return -1; + } else if (lhs.tick > rhs.tick) { + return 1; + } else { + return SeparateHeapMapAddrComparator::Compare(lhs, rhs); + } + } }; -static_assert(sizeof(SeparateHeapMap) == 32); //half a cache line! good for coherency class HeapTracker { public: explicit HeapTracker(Common::HostMemory& buffer); ~HeapTracker(); - void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perm, bool is_separate_heap); + + void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perm, + bool is_separate_heap); void Unmap(size_t virtual_offset, size_t size, bool is_separate_heap); void Protect(size_t virtual_offset, size_t length, MemoryPermission perm); - inline u8* VirtualBasePointer() noexcept { + u8* VirtualBasePointer() { return m_buffer.VirtualBasePointer(); } + + bool DeferredMapSeparateHeap(u8* fault_address); + bool DeferredMapSeparateHeap(size_t virtual_offset); + private: - // TODO: You may want to "fake-map" the first 2GB of 64-bit address space - // and dedicate it entirely to a recursive PTE mapping :) - // However Ankerl is way better than using an RB tree, in all senses - using AddrTree = ankerl::unordered_dense::map; - AddrTree m_mappings; - using TicksTree = ankerl::unordered_dense::map; - TicksTree m_resident_mappings; + using AddrTreeTraits = + Common::IntrusiveRedBlackTreeMemberTraitsDeferredAssert<&SeparateHeapMap::addr_node>; + using AddrTree = AddrTreeTraits::TreeType; + + using TickTreeTraits = + Common::IntrusiveRedBlackTreeMemberTraitsDeferredAssert<&SeparateHeapMap::tick_node>; + using TickTree = TickTreeTraits::TreeType; + + AddrTree m_mappings{}; + TickTree m_resident_mappings{}; + private: void SplitHeapMap(VAddr offset, size_t size); void SplitHeapMapLocked(VAddr offset); + + AddrTree::iterator GetNearestHeapMapLocked(VAddr offset); + void RebuildSeparateHeapAddressSpace(); - inline HeapTracker::AddrTree::iterator GetNearestHeapMapLocked(VAddr offset) noexcept { - return m_mappings.find(offset); - } + private: Common::HostMemory& m_buffer; const s64 m_max_resident_map_count; + std::shared_mutex m_rebuild_lock{}; std::mutex m_lock{}; s64 m_map_count{}; diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 949cd188f3..3838c12903 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -12,7 +12,7 @@ #include #include "common/dynamic_library.h" -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun__) // ^^^ Windows ^^^ vvv Linux vvv +#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun__) || defined(__APPLE__) // ^^^ Windows ^^^ vvv POSIX vvv #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -20,10 +20,18 @@ #include #include #include -#include #include #include "common/scope_exit.h" +#if defined(__linux__) +#include +#elif defined(__APPLE__) +#include +#include +#include +#include +#endif + // FreeBSD #ifndef MAP_NORESERVE #define MAP_NORESERVE 0 @@ -32,8 +40,12 @@ #ifndef MAP_ALIGNED_SUPER #define MAP_ALIGNED_SUPER 0 #endif +// macOS +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif -#endif // ^^^ Linux ^^^ +#endif // ^^^ POSIX ^^^ #include #include @@ -44,6 +56,16 @@ #include "common/host_memory.h" #include "common/logging/log.h" +#if defined(__ANDROID__) && __ANDROID_API__ < 30 +#include +#ifndef MFD_CLOEXEC +#define MFD_CLOEXEC 0x0001U +#endif +static int memfd_create(const char* name, unsigned int flags) { + return syscall(__NR_memfd_create, name, flags); +} +#endif + namespace Common { constexpr size_t PageAlignment = 0x1000; @@ -187,8 +209,8 @@ public: std::scoped_lock lock{placeholder_mutex}; auto [it, end] = placeholders.equal_range({virtual_offset, virtual_end}); while (it != end) { - const size_t offset = std::max(it->lower(), virtual_offset); - const size_t protect_length = std::min(it->upper(), virtual_end) - offset; + const size_t offset = (std::max)(it->lower(), virtual_offset); + const size_t protect_length = (std::min)(it->upper(), virtual_end) - offset; DWORD old_flags{}; if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) { LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules"); @@ -254,8 +276,8 @@ private: } const size_t placeholder_begin = it->lower(); const size_t placeholder_end = it->upper(); - const size_t unmap_begin = std::max(virtual_offset, placeholder_begin); - const size_t unmap_end = std::min(virtual_offset + length, placeholder_end); + const size_t unmap_begin = (std::max)(virtual_offset, placeholder_begin); + const size_t unmap_end = (std::min)(virtual_offset + length, placeholder_end); ASSERT(unmap_begin >= placeholder_begin && unmap_begin < placeholder_end); ASSERT(unmap_end <= placeholder_end && unmap_end > placeholder_begin); @@ -372,7 +394,7 @@ private: std::unordered_map placeholder_host_pointers; ///< Placeholder backing offset }; -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun__) // ^^^ Windows ^^^ vvv Linux vvv +#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun__) || defined(__APPLE__) // ^^^ Windows ^^^ vvv POSIX vvv #ifdef ARCHITECTURE_arm64 @@ -417,11 +439,12 @@ static void* ChooseVirtualBase(size_t virtual_size) { #else static void* ChooseVirtualBase(size_t virtual_size) { +#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); if (virtual_base != MAP_FAILED) return virtual_base; - return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); +#endif + return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); } #endif @@ -477,19 +500,9 @@ class HostMemory::Impl { public: explicit Impl(size_t backing_size_, size_t virtual_size_) : backing_size{backing_size_}, virtual_size{virtual_size_} { - bool good = false; - SCOPE_EXIT { - if (!good) { - Release(); - } - }; - long page_size = sysconf(_SC_PAGESIZE); - if (page_size != 0x1000) { - LOG_CRITICAL(HW_Memory, "page size {:#x} is incompatible with 4K paging", page_size); - throw std::bad_alloc{}; - } - + ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", + page_size); // Backing memory initialization #if defined(__sun__) || defined(__HAIKU__) || defined(__NetBSD__) || defined(__DragonFly__) fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); @@ -498,41 +511,33 @@ public: #elif defined(__FreeBSD__) && __FreeBSD__ < 13 // XXX Drop after FreeBSD 12.* reaches EOL on 2024-06-30 fd = shm_open(SHM_ANON, O_RDWR, 0600); +#elif defined(__APPLE__) + // macOS doesn't have memfd_create, use anonymous temporary file + char template_path[] = "/tmp/eden_mem_XXXXXX"; + fd = mkstemp(template_path); + if (fd >= 0) { + unlink(template_path); + } #else fd = memfd_create("HostMemory", 0); #endif - if (fd < 0) { - LOG_CRITICAL(HW_Memory, "memfd_create failed: {}", strerror(errno)); - throw std::bad_alloc{}; - } + ASSERT_MSG(fd >= 0, "memfd_create failed: {}", strerror(errno)); // Defined to extend the file with zeros int ret = ftruncate(fd, backing_size); - if (ret != 0) { - LOG_CRITICAL(HW_Memory, "ftruncate failed with {}, are you out-of-memory?", - strerror(errno)); - throw std::bad_alloc{}; - } + ASSERT_MSG(ret == 0, "ftruncate failed with {}, are you out-of-memory?", strerror(errno)); backing_base = static_cast( mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); - if (backing_base == MAP_FAILED) { - LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); - throw std::bad_alloc{}; - } + ASSERT_MSG(backing_base != MAP_FAILED, "mmap failed: {}", strerror(errno)); // Virtual memory initialization virtual_base = virtual_map_base = static_cast(ChooseVirtualBase(virtual_size)); - if (virtual_base == MAP_FAILED) { - LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); - throw std::bad_alloc{}; - } + ASSERT_MSG(virtual_base != MAP_FAILED, "mmap failed: {}", strerror(errno)); #if defined(__linux__) madvise(virtual_base, virtual_size, MADV_HUGEPAGE); #endif - free_manager.SetAddressSpace(virtual_base, virtual_size); - good = true; } ~Impl() { @@ -603,12 +608,17 @@ public: bool ClearBackingRegion(size_t physical_offset, size_t length) { #ifdef __linux__ - // Set MADV_REMOVE on backing map to destroy it instantly. - // This also deletes the area from the backing file. - int ret = madvise(backing_base + physical_offset, length, MADV_REMOVE); - ASSERT_MSG(ret == 0, "madvise failed: {}", strerror(errno)); - - return true; + // Only incur syscall cost IF memset would be slower (theshold = 16MiB) + // TODO(lizzie): Smarter way to dynamically get this threshold (broadwell != raptor lake) for example + if (length >= 2097152UL * 8) { + // Set MADV_REMOVE on backing map to destroy it instantly. + // This also deletes the area from the backing file. + int ret = madvise(backing_base + physical_offset, length, MADV_REMOVE); + ASSERT_MSG(ret == 0, "madvise failed: {}", strerror(errno)); + return true; + } else { + return false; + } #else return false; #endif @@ -660,8 +670,8 @@ private: *virtual_offset = 0; *length = 0; } else { - *virtual_offset = std::max(intended_start, address_space_start); - *length = std::min(intended_end, address_space_end) - *virtual_offset; + *virtual_offset = (std::max)(intended_start, address_space_start); + *length = (std::min)(intended_end, address_space_end) - *virtual_offset; } } @@ -669,14 +679,13 @@ private: FreeRegionManager free_manager{}; }; -#else // ^^^ Linux ^^^ vvv Generic vvv +#else // ^^^ POSIX ^^^ vvv Generic vvv class HostMemory::Impl { public: - explicit Impl(size_t /*backing_size */, size_t /* virtual_size */) { + explicit Impl([[maybe_unused]] size_t backing_size, [[maybe_unused]] size_t virtual_size) { // This is just a place holder. - // Please implement fastmem in a proper way on your platform. - throw std::bad_alloc{}; + ASSERT_MSG(false, "Please implement fastmem in a proper way on your platform."); } void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perm) {} diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index ff07ab68eb..c2cbf3f4a5 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -36,9 +39,17 @@ namespace Common::Log { namespace { -/** - * Interface for logging backends. - */ +/// @brief Trims up to and including the last of ../, ..\, src/, src\ in a string +/// do not be fooled this isn't generating new strings on .rodata :) +constexpr const char* TrimSourcePath(std::string_view source) { + const auto rfind = [source](const std::string_view match) { + return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size()); + }; + auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")}); + return source.data() + idx; +} + +/// @brief Interface for logging backends. class Backend { public: virtual ~Backend() = default; @@ -50,9 +61,7 @@ public: virtual void Flush() = 0; }; -/** - * Backend that writes to stderr and with color - */ +/// @brief Backend that writes to stderr and with color class ColorConsoleBackend final : public Backend { public: explicit ColorConsoleBackend() = default; @@ -81,9 +90,7 @@ private: std::atomic_bool enabled{false}; }; -/** - * Backend that writes to a file passed into the constructor - */ +/// @brief Backend that writes to a file passed into the constructor class FileBackend final : public Backend { public: explicit FileBackend(const std::filesystem::path& filename) { @@ -121,7 +128,7 @@ public: bytes_written += file->WriteString(message); // Option to log each line rather than 4k buffers - if (Settings::values.log_flush_lines.GetValue()) { + if (Settings::values.log_flush_line.GetValue()) { file->Flush(); } @@ -245,13 +252,14 @@ public: color_console_backend.SetEnabled(enabled); } + bool CanPushEntry(Class log_class, Level log_level) const noexcept { + return filter.CheckMessage(log_class, log_level); + } + void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num, - const char* function, std::string&& message) { - if (!filter.CheckMessage(log_class, log_level)) { - return; - } + const char* function, std::string&& message) noexcept { message_queue.EmplaceWait( - CreateEntry(log_class, log_level, filename, line_num, function, std::move(message))); + CreateEntry(log_class, log_level, TrimSourcePath(filename), line_num, function, std::move(message))); } private: @@ -365,8 +373,9 @@ void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, const fmt::format_args& args) { if (!initialization_in_progress_suppress_logging) { - Impl::Instance().PushEntry(log_class, log_level, filename, line_num, function, - fmt::vformat(format, args)); + auto& instance = Impl::Instance(); + if (instance.CanPushEntry(log_class, log_level)) + instance.PushEntry(log_class, log_level, filename, line_num, function, fmt::vformat(format, args)); } } } // namespace Common::Log diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 4e3a614a45..813e812780 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,22 +12,20 @@ namespace Common::Log { namespace { template Level GetLevelByName(const It begin, const It end) { - for (u8 i = 0; i < static_cast(Level::Count); ++i) { - const char* level_name = GetLevelName(static_cast(i)); - if (Common::ComparePartialString(begin, end, level_name)) { - return static_cast(i); - } + for (u32 i = 0; i < u32(Level::Count); ++i) { + const char* level_name = GetLevelName(Level(i)); + if (Common::ComparePartialString(begin, end, level_name)) + return Level(i); } return Level::Count; } template Class GetClassByName(const It begin, const It end) { - for (u8 i = 0; i < static_cast(Class::Count); ++i) { - const char* level_name = GetLogClassName(static_cast(i)); - if (Common::ComparePartialString(begin, end, level_name)) { - return static_cast(i); - } + for (u32 i = 0; i < u32(Class::Count); ++i) { + const char* level_name = GetLogClassName(Class(i)); + if (Common::ComparePartialString(begin, end, level_name)) + return Class(i); } return Class::Count; } @@ -229,13 +230,12 @@ void Filter::ParseFilterString(std::string_view filter_view) { } bool Filter::CheckMessage(Class log_class, Level level) const { - return static_cast(level) >= - static_cast(class_levels[static_cast(log_class)]); + return u8(level) >= u8(class_levels[std::size_t(log_class)]); } bool Filter::IsDebug() const { return std::any_of(class_levels.begin(), class_levels.end(), [](const Level& l) { - return static_cast(l) <= static_cast(Level::Debug); + return u8(l) <= u8(Level::Debug); }); } diff --git a/src/common/logging/log.h b/src/common/logging/log.h index 6da9e5231a..7b23b59aab 100644 --- a/src/common/logging/log.h +++ b/src/common/logging/log.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,15 +16,6 @@ namespace Common::Log { -// trims up to and including the last of ../, ..\, src/, src\ in a string -constexpr const char* TrimSourcePath(std::string_view source) { - const auto rfind = [source](const std::string_view match) { - return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size()); - }; - auto idx = std::max({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")}); - return source.data() + idx; -} - /// Logs a message to the global logger, using fmt void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, @@ -39,7 +33,7 @@ void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsig #ifdef _DEBUG #define LOG_TRACE(log_class, ...) \ Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Trace, \ - Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \ + __FILE__, __LINE__, __func__, \ __VA_ARGS__) #else #define LOG_TRACE(log_class, fmt, ...) (void(0)) @@ -47,21 +41,21 @@ void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsig #define LOG_DEBUG(log_class, ...) \ Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Debug, \ - Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \ + __FILE__, __LINE__, __func__, \ __VA_ARGS__) #define LOG_INFO(log_class, ...) \ Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Info, \ - Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \ + __FILE__, __LINE__, __func__, \ __VA_ARGS__) #define LOG_WARNING(log_class, ...) \ Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Warning, \ - Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \ + __FILE__, __LINE__, __func__, \ __VA_ARGS__) #define LOG_ERROR(log_class, ...) \ Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Error, \ - Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \ + __FILE__, __LINE__, __func__, \ __VA_ARGS__) #define LOG_CRITICAL(log_class, ...) \ Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Critical, \ - Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \ + __FILE__, __LINE__, __func__, \ __VA_ARGS__) diff --git a/src/common/math_util.h b/src/common/math_util.h index 1f5928c15f..967d755f53 100644 --- a/src/common/math_util.h +++ b/src/common/math_util.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2013 Dolphin Emulator Project // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -85,10 +88,10 @@ struct Rectangle { } [[nodiscard]] constexpr bool Intersect(const Rectangle& with, Rectangle* result) const { - result->left = std::max(left, with.left); - result->top = std::max(top, with.top); - result->right = std::min(right, with.right); - result->bottom = std::min(bottom, with.bottom); + result->left = (std::max)(left, with.left); + result->top = (std::max)(top, with.top); + result->right = (std::min)(right, with.right); + result->bottom = (std::min)(bottom, with.bottom); return !result->IsEmpty(); } }; diff --git a/src/common/nvidia_flags.cpp b/src/common/nvidia_flags.cpp deleted file mode 100644 index baca31b0ac..0000000000 --- a/src/common/nvidia_flags.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include - -#include "common/fs/fs.h" -#include "common/fs/path_util.h" -#include "common/nvidia_flags.h" - -namespace Common { - -void ConfigureNvidiaEnvironmentFlags() { -#ifdef _WIN32 - const auto nvidia_shader_dir = - Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir) / "nvidia"; - - if (!Common::FS::CreateDirs(nvidia_shader_dir)) { - return; - } - - const auto windows_path_string = - Common::FS::PathToUTF8String(nvidia_shader_dir.lexically_normal()); - - void(_putenv(fmt::format("__GL_SHADER_DISK_CACHE_PATH={}", windows_path_string).c_str())); - void(_putenv("__GL_SHADER_DISK_CACHE_SKIP_CLEANUP=1")); - void(_putenv("__GL_THREADED_OPTIMIZATIONS=1")); -#endif -} - -} // namespace Common diff --git a/src/common/nvidia_flags.h b/src/common/nvidia_flags.h deleted file mode 100644 index 8c3b1bfb92..0000000000 --- a/src/common/nvidia_flags.h +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -namespace Common { - -/// Configure platform specific flags for Nvidia's driver -void ConfigureNvidiaEnvironmentFlags(); - -} // namespace Common diff --git a/src/common/overflow.h b/src/common/overflow.h index e184ead953..5f048de7e6 100644 --- a/src/common/overflow.h +++ b/src/common/overflow.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -25,9 +28,9 @@ template inline bool CanAddWithoutOverflow(T lhs, T rhs) { #ifdef _MSC_VER if (lhs >= 0 && rhs >= 0) { - return WrappingAdd(lhs, rhs) >= std::max(lhs, rhs); + return WrappingAdd(lhs, rhs) >= (std::max)(lhs, rhs); } else if (lhs < 0 && rhs < 0) { - return WrappingAdd(lhs, rhs) <= std::min(lhs, rhs); + return WrappingAdd(lhs, rhs) <= (std::min)(lhs, rhs); } else { return true; } diff --git a/src/common/polyfill_ranges.h b/src/common/polyfill_ranges.h deleted file mode 100644 index 512dbcbcb7..0000000000 --- a/src/common/polyfill_ranges.h +++ /dev/null @@ -1,530 +0,0 @@ -// SPDX-FileCopyrightText: 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -// -// TODO: remove this file when ranges are supported by all compilation targets -// - -#pragma once - -#include -#include -#include - -#ifndef __cpp_lib_ranges - -namespace std { -namespace ranges { - -template -concept range = requires(T& t) { - begin(t); - end(t); - }; - -template -concept input_range = range; - -template -concept output_range = range; - -template -using range_difference_t = ptrdiff_t; - -// -// find, find_if, find_if_not -// - -struct find_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, const T& value, - Proj proj = {}) const { - for (; first != last; ++first) { - if (std::invoke(proj, *first) == value) { - return first; - } - } - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, const T& value, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), value, std::ref(proj)); - } -}; - -struct find_if_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { - for (; first != last; ++first) { - if (std::invoke(pred, std::invoke(proj, *first))) { - return first; - } - } - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -struct find_if_not_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { - for (; first != last; ++first) { - if (!std::invoke(pred, std::invoke(proj, *first))) { - return first; - } - } - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -inline constexpr find_fn find; -inline constexpr find_if_fn find_if; -inline constexpr find_if_not_fn find_if_not; - -// -// any_of, all_of, none_of -// - -struct all_of_fn { - template - constexpr bool operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { - return ranges::find_if_not(first, last, std::ref(pred), std::ref(proj)) == last; - } - - template - constexpr bool operator()(R&& r, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -struct any_of_fn { - template - constexpr bool operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { - return ranges::find_if(first, last, std::ref(pred), std::ref(proj)) != last; - } - - template - constexpr bool operator()(R&& r, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -struct none_of_fn { - template - constexpr bool operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { - return ranges::find_if(first, last, std::ref(pred), std::ref(proj)) == last; - } - - template - constexpr bool operator()(R&& r, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -inline constexpr any_of_fn any_of; -inline constexpr all_of_fn all_of; -inline constexpr none_of_fn none_of; - -// -// count, count_if -// - -struct count_fn { - template - constexpr ptrdiff_t operator()(Iterator first, Iterator last, const T& value, - Proj proj = {}) const { - ptrdiff_t counter = 0; - for (; first != last; ++first) - if (std::invoke(proj, *first) == value) - ++counter; - return counter; - } - - template - constexpr ptrdiff_t operator()(R&& r, const T& value, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), value, std::ref(proj)); - } -}; - -struct count_if_fn { - template - constexpr ptrdiff_t operator()(Iterator first, Iterator last, Pred pred, Proj proj = {}) const { - ptrdiff_t counter = 0; - for (; first != last; ++first) - if (std::invoke(pred, std::invoke(proj, *first))) - ++counter; - return counter; - } - - template - constexpr ptrdiff_t operator()(R&& r, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -inline constexpr count_fn count; -inline constexpr count_if_fn count_if; - -// -// transform -// - -struct transform_fn { - template - constexpr void operator()(InputIterator first1, InputIterator last1, OutputIterator result, - F op, Proj proj = {}) const { - for (; first1 != last1; ++first1, (void)++result) { - *result = std::invoke(op, std::invoke(proj, *first1)); - } - } - - template - constexpr void operator()(R&& r, OutputIterator result, F op, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), result, std::ref(op), std::ref(proj)); - } -}; - -inline constexpr transform_fn transform; - -// -// sort -// - -struct sort_fn { - template - constexpr void operator()(Iterator first, Iterator last, Comp comp = {}, Proj proj = {}) const { - if (first == last) - return; - - Iterator last_iter = ranges::next(first, last); - std::sort(first, last_iter, - [&](auto& lhs, auto& rhs) { return comp(proj(lhs), proj(rhs)); }); - } - - template - constexpr void operator()(R&& r, Comp comp = {}, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::move(comp), std::move(proj)); - } -}; - -inline constexpr sort_fn sort; - -// -// fill -// - -struct fill_fn { - template - constexpr OutputIterator operator()(OutputIterator first, OutputIterator last, - const T& value) const { - while (first != last) { - *first++ = value; - } - - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, const T& value) const { - return operator()(ranges::begin(r), ranges::end(r), value); - } -}; - -inline constexpr fill_fn fill; - -// -// for_each -// - -struct for_each_fn { - template - constexpr void operator()(Iterator first, Iterator last, Fun f, Proj proj = {}) const { - for (; first != last; ++first) { - std::invoke(f, std::invoke(proj, *first)); - } - } - - template - constexpr void operator()(R&& r, Fun f, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::move(f), std::ref(proj)); - } -}; - -inline constexpr for_each_fn for_each; - -// -// min_element, max_element -// - -struct min_element_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, Comp comp = {}, - Proj proj = {}) const { - if (first == last) { - return last; - } - - auto smallest = first; - ++first; - for (; first != last; ++first) { - if (!std::invoke(comp, std::invoke(proj, *smallest), std::invoke(proj, *first))) { - smallest = first; - } - } - return smallest; - } - - template - constexpr ranges::iterator_t operator()(R&& r, Comp comp = {}, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); - } -}; - -struct max_element_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, Comp comp = {}, - Proj proj = {}) const { - if (first == last) { - return last; - } - - auto largest = first; - ++first; - for (; first != last; ++first) { - if (std::invoke(comp, std::invoke(proj, *largest), std::invoke(proj, *first))) { - largest = first; - } - } - return largest; - } - - template - constexpr ranges::iterator_t operator()(R&& r, Comp comp = {}, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); - } -}; - -inline constexpr min_element_fn min_element; -inline constexpr max_element_fn max_element; - -// -// replace, replace_if -// - -struct replace_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, const T1& old_value, - const T2& new_value, Proj proj = {}) const { - for (; first != last; ++first) { - if (old_value == std::invoke(proj, *first)) { - *first = new_value; - } - } - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, const T1& old_value, const T2& new_value, - Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), old_value, new_value, std::move(proj)); - } -}; - -struct replace_if_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, Pred pred, const T& new_value, - Proj proj = {}) const { - for (; first != last; ++first) { - if (!!std::invoke(pred, std::invoke(proj, *first))) { - *first = new_value; - } - } - return std::move(first); - } - - template - constexpr ranges::iterator_t operator()(R&& r, Pred pred, const T& new_value, - Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::move(pred), new_value, - std::move(proj)); - } -}; - -inline constexpr replace_fn replace; -inline constexpr replace_if_fn replace_if; - -// -// copy, copy_if -// - -struct copy_fn { - template - constexpr void operator()(InputIterator first, InputIterator last, - OutputIterator result) const { - for (; first != last; ++first, (void)++result) { - *result = *first; - } - } - - template - constexpr void operator()(R&& r, OutputIterator result) const { - return operator()(ranges::begin(r), ranges::end(r), std::move(result)); - } -}; - -struct copy_if_fn { - template - constexpr void operator()(InputIterator first, InputIterator last, OutputIterator result, - Pred pred, Proj proj = {}) const { - for (; first != last; ++first) { - if (std::invoke(pred, std::invoke(proj, *first))) { - *result = *first; - ++result; - } - } - } - - template - constexpr void operator()(R&& r, OutputIterator result, Pred pred, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::move(result), std::ref(pred), - std::ref(proj)); - } -}; - -inline constexpr copy_fn copy; -inline constexpr copy_if_fn copy_if; - -// -// generate -// - -struct generate_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, F gen) const { - for (; first != last; *first = std::invoke(gen), ++first) - ; - return first; - } - - template - requires std::invocable && ranges::output_range - constexpr ranges::iterator_t operator()(R&& r, F gen) const { - return operator()(ranges::begin(r), ranges::end(r), std::move(gen)); - } -}; - -inline constexpr generate_fn generate; - -// -// lower_bound, upper_bound -// - -struct lower_bound_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, const T& value, Comp comp = {}, - Proj proj = {}) const { - Iterator it; - std::ptrdiff_t _count, _step; - _count = std::distance(first, last); - - while (_count > 0) { - it = first; - _step = _count / 2; - ranges::advance(it, _step, last); - if (comp(std::invoke(proj, *it), value)) { - first = ++it; - _count -= _step + 1; - } else { - _count = _step; - } - } - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, const T& value, Comp comp = {}, - Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), value, std::ref(comp), std::ref(proj)); - } -}; - -struct upper_bound_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, const T& value, Comp comp = {}, - Proj proj = {}) const { - Iterator it; - std::ptrdiff_t _count, _step; - _count = std::distance(first, last); - - while (_count > 0) { - it = first; - _step = _count / 2; - ranges::advance(it, _step, last); - if (!comp(value, std::invoke(proj, *it))) { - first = ++it; - _count -= _step + 1; - } else { - _count = _step; - } - } - return first; - } - - template - constexpr ranges::iterator_t operator()(R&& r, const T& value, Comp comp = {}, - Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), value, std::ref(comp), std::ref(proj)); - } -}; - -inline constexpr lower_bound_fn lower_bound; -inline constexpr upper_bound_fn upper_bound; - -// -// adjacent_find -// - -struct adjacent_find_fn { - template - constexpr Iterator operator()(Iterator first, Iterator last, Pred pred = {}, - Proj proj = {}) const { - if (first == last) - return first; - auto _next = ranges::next(first); - for (; _next != last; ++_next, ++first) - if (std::invoke(pred, std::invoke(proj, *first), std::invoke(proj, *_next))) - return first; - return _next; - } - - template - constexpr ranges::iterator_t operator()(R&& r, Pred pred = {}, Proj proj = {}) const { - return operator()(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); - } -}; - -inline constexpr adjacent_find_fn adjacent_find; - -} // namespace ranges -} // namespace std - -#endif diff --git a/src/common/polyfill_thread.h b/src/common/polyfill_thread.h index 12e59a8939..0d3c963d25 100644 --- a/src/common/polyfill_thread.h +++ b/src/common/polyfill_thread.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,23 +10,13 @@ #pragma once -#include - -#ifdef __cpp_lib_jthread - #include #include -#include #include #include namespace Common { -template -void CondvarWait(Condvar& cv, std::unique_lock& lk, std::stop_token token, Pred&& pred) { - cv.wait(lk, token, std::forward(pred)); -} - template bool StoppableTimedWait(std::stop_token token, const std::chrono::duration& rel_time) { std::condition_variable_any cv; @@ -35,341 +28,3 @@ bool StoppableTimedWait(std::stop_token token, const std::chrono::duration -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace std { -namespace polyfill { - -using stop_state_callback = size_t; - -class stop_state { -public: - stop_state() = default; - ~stop_state() = default; - - bool request_stop() { - unique_lock lk{m_lock}; - - if (m_stop_requested) { - // Already set, nothing to do. - return false; - } - - // Mark stop requested. - m_stop_requested = true; - - while (!m_callbacks.empty()) { - // Get an iterator to the first element. - const auto it = m_callbacks.begin(); - - // Move the callback function out of the map. - function f; - swap(it->second, f); - - // Erase the now-empty map element. - m_callbacks.erase(it); - - // Run the callback. - if (f) { - f(); - } - } - - return true; - } - - bool stop_requested() const { - unique_lock lk{m_lock}; - return m_stop_requested; - } - - stop_state_callback insert_callback(function f) { - unique_lock lk{m_lock}; - - if (m_stop_requested) { - // Stop already requested. Don't insert anything, - // just run the callback synchronously. - if (f) { - f(); - } - return 0; - } - - // Insert the callback. - stop_state_callback ret = ++m_next_callback; - m_callbacks.emplace(ret, std::move(f)); - return ret; - } - - void remove_callback(stop_state_callback cb) { - unique_lock lk{m_lock}; - m_callbacks.erase(cb); - } - -private: - mutable recursive_mutex m_lock; - map> m_callbacks; - stop_state_callback m_next_callback{0}; - bool m_stop_requested{false}; -}; - -} // namespace polyfill - -class stop_token; -class stop_source; -struct nostopstate_t { - explicit nostopstate_t() = default; -}; -inline constexpr nostopstate_t nostopstate{}; - -template -class stop_callback; - -class stop_token { -public: - stop_token() noexcept = default; - - stop_token(const stop_token&) noexcept = default; - stop_token(stop_token&&) noexcept = default; - stop_token& operator=(const stop_token&) noexcept = default; - stop_token& operator=(stop_token&&) noexcept = default; - ~stop_token() = default; - - void swap(stop_token& other) noexcept { - m_stop_state.swap(other.m_stop_state); - } - - [[nodiscard]] bool stop_requested() const noexcept { - return m_stop_state && m_stop_state->stop_requested(); - } - [[nodiscard]] bool stop_possible() const noexcept { - return m_stop_state != nullptr; - } - -private: - friend class stop_source; - template - friend class stop_callback; - stop_token(shared_ptr stop_state) : m_stop_state(std::move(stop_state)) {} - -private: - shared_ptr m_stop_state; -}; - -class stop_source { -public: - stop_source() : m_stop_state(make_shared()) {} - explicit stop_source(nostopstate_t) noexcept {} - - stop_source(const stop_source&) noexcept = default; - stop_source(stop_source&&) noexcept = default; - stop_source& operator=(const stop_source&) noexcept = default; - stop_source& operator=(stop_source&&) noexcept = default; - ~stop_source() = default; - void swap(stop_source& other) noexcept { - m_stop_state.swap(other.m_stop_state); - } - - [[nodiscard]] stop_token get_token() const noexcept { - return stop_token(m_stop_state); - } - [[nodiscard]] bool stop_possible() const noexcept { - return m_stop_state != nullptr; - } - [[nodiscard]] bool stop_requested() const noexcept { - return m_stop_state && m_stop_state->stop_requested(); - } - bool request_stop() noexcept { - return m_stop_state && m_stop_state->request_stop(); - } - -private: - friend class jthread; - explicit stop_source(shared_ptr stop_state) - : m_stop_state(std::move(stop_state)) {} - -private: - shared_ptr m_stop_state; -}; - -template -class stop_callback { - static_assert(is_nothrow_destructible_v); - static_assert(is_invocable_v); - -public: - using callback_type = Callback; - - template - requires constructible_from - explicit stop_callback(const stop_token& st, - C&& cb) noexcept(is_nothrow_constructible_v) - : m_stop_state(st.m_stop_state) { - if (m_stop_state) { - m_callback = m_stop_state->insert_callback(std::move(cb)); - } - } - template - requires constructible_from - explicit stop_callback(stop_token&& st, - C&& cb) noexcept(is_nothrow_constructible_v) - : m_stop_state(std::move(st.m_stop_state)) { - if (m_stop_state) { - m_callback = m_stop_state->insert_callback(std::move(cb)); - } - } - ~stop_callback() { - if (m_stop_state && m_callback) { - m_stop_state->remove_callback(m_callback); - } - } - - stop_callback(const stop_callback&) = delete; - stop_callback(stop_callback&&) = delete; - stop_callback& operator=(const stop_callback&) = delete; - stop_callback& operator=(stop_callback&&) = delete; - -private: - shared_ptr m_stop_state; - polyfill::stop_state_callback m_callback; -}; - -template -stop_callback(stop_token, Callback) -> stop_callback; - -class jthread { -public: - using id = thread::id; - using native_handle_type = thread::native_handle_type; - - jthread() noexcept = default; - - template , jthread>>> - explicit jthread(F&& f, Args&&... args) - : m_stop_state(make_shared()), - m_thread(make_thread(std::forward(f), std::forward(args)...)) {} - - ~jthread() { - if (joinable()) { - request_stop(); - join(); - } - } - - jthread(const jthread&) = delete; - jthread(jthread&&) noexcept = default; - jthread& operator=(const jthread&) = delete; - - jthread& operator=(jthread&& other) noexcept { - m_thread.swap(other.m_thread); - m_stop_state.swap(other.m_stop_state); - return *this; - } - - void swap(jthread& other) noexcept { - m_thread.swap(other.m_thread); - m_stop_state.swap(other.m_stop_state); - } - [[nodiscard]] bool joinable() const noexcept { - return m_thread.joinable(); - } - void join() { - m_thread.join(); - } - void detach() { - m_thread.detach(); - m_stop_state.reset(); - } - - [[nodiscard]] id get_id() const noexcept { - return m_thread.get_id(); - } - [[nodiscard]] native_handle_type native_handle() { - return m_thread.native_handle(); - } - [[nodiscard]] stop_source get_stop_source() noexcept { - return stop_source(m_stop_state); - } - [[nodiscard]] stop_token get_stop_token() const noexcept { - return stop_source(m_stop_state).get_token(); - } - bool request_stop() noexcept { - return get_stop_source().request_stop(); - } - [[nodiscard]] static unsigned int hardware_concurrency() noexcept { - return thread::hardware_concurrency(); - } - -private: - template - thread make_thread(F&& f, Args&&... args) { - if constexpr (is_invocable_v, stop_token, decay_t...>) { - return thread(std::forward(f), get_stop_token(), std::forward(args)...); - } else { - return thread(std::forward(f), std::forward(args)...); - } - } - - shared_ptr m_stop_state; - thread m_thread; -}; - -} // namespace std - -namespace Common { - -template -void CondvarWait(Condvar& cv, std::unique_lock& lk, std::stop_token token, Pred pred) { - if (token.stop_requested()) { - return; - } - - std::stop_callback callback(token, [&] { - { std::scoped_lock lk2{*lk.mutex()}; } - cv.notify_all(); - }); - - cv.wait(lk, [&] { return pred() || token.stop_requested(); }); -} - -template -bool StoppableTimedWait(std::stop_token token, const std::chrono::duration& rel_time) { - if (token.stop_requested()) { - return false; - } - - bool stop_requested = false; - std::condition_variable cv; - std::mutex m; - - std::stop_callback cb(token, [&] { - // Wake up the waiting thread. - { - std::scoped_lock lk{m}; - stop_requested = true; - } - cv.notify_one(); - }); - - // Perform the timed wait. - std::unique_lock lk{m}; - return !cv.wait_for(lk, rel_time, [&] { return stop_requested; }); -} - -} // namespace Common - -#endif diff --git a/src/common/range_map.h b/src/common/range_map.h index ab73993e3b..1ea29897c9 100644 --- a/src/common/range_map.h +++ b/src/common/range_map.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -18,7 +21,7 @@ private: public: explicit RangeMap(ValueT null_value_) : null_value{null_value_} { - container.emplace(std::numeric_limits::min(), null_value); + container.emplace((std::numeric_limits::min)(), null_value); }; ~RangeMap() = default; @@ -66,7 +69,7 @@ private: } const auto it_end = std::next(it); if (it_end == container.end()) { - return std::numeric_limits::max() - address; + return (std::numeric_limits::max)() - address; } return it_end->first - address; } diff --git a/src/common/range_sets.inc b/src/common/range_sets.inc index b83eceb7b0..3edd8c8a43 100644 --- a/src/common/range_sets.inc +++ b/src/common/range_sets.inc @@ -274,7 +274,7 @@ void OverlapRangeSet::Subtract(AddressType base_address, size_t siz template void OverlapRangeSet::DeleteAll(AddressType base_address, size_t size) { - m_impl->template Subtract(base_address, size, std::numeric_limits::max(), + m_impl->template Subtract(base_address, size, (std::numeric_limits::max)(), [](AddressType, AddressType) {}); } diff --git a/src/common/ring_buffer.h b/src/common/ring_buffer.h index b92db6185b..e97854f514 100644 --- a/src/common/ring_buffer.h +++ b/src/common/ring_buffer.h @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,6 +15,7 @@ #include #include #include +#include namespace Common { @@ -26,7 +29,7 @@ class RingBuffer { // T must be safely memcpy-able and have a trivial default constructor. static_assert(std::is_trivial_v); // Ensure capacity is sensible. - static_assert(capacity < std::numeric_limits::max() / 2); + static_assert(capacity < (std::numeric_limits::max)() / 2); static_assert((capacity & (capacity - 1)) == 0, "capacity must be a power of two"); // Ensure lock-free. static_assert(std::atomic_size_t::is_always_lock_free); @@ -37,12 +40,12 @@ public: /// @param slot_count Number of slots to push /// @returns The number of slots actually pushed std::size_t Push(const void* new_slots, std::size_t slot_count) { - const std::size_t write_index = m_write_index.load(); - const std::size_t slots_free = capacity + m_read_index.load() - write_index; - const std::size_t push_count = std::min(slot_count, slots_free); + std::lock_guard lock(rb_mutex); + const std::size_t slots_free = capacity + read_index - write_index; + const std::size_t push_count = (std::min)(slot_count, slots_free); const std::size_t pos = write_index % capacity; - const std::size_t first_copy = std::min(capacity - pos, push_count); + const std::size_t first_copy = (std::min)(capacity - pos, push_count); const std::size_t second_copy = push_count - first_copy; const char* in = static_cast(new_slots); @@ -50,8 +53,7 @@ public: in += first_copy * slot_size; std::memcpy(m_data.data(), in, second_copy * slot_size); - m_write_index.store(write_index + push_count); - + write_index = write_index + push_count; return push_count; } @@ -64,12 +66,12 @@ public: /// @param max_slots Maximum number of slots to pop /// @returns The number of slots actually popped std::size_t Pop(void* output, std::size_t max_slots = ~std::size_t(0)) { - const std::size_t read_index = m_read_index.load(); - const std::size_t slots_filled = m_write_index.load() - read_index; - const std::size_t pop_count = std::min(slots_filled, max_slots); + std::lock_guard lock(rb_mutex); + const std::size_t slots_filled = write_index - read_index; + const std::size_t pop_count = (std::min)(slots_filled, max_slots); const std::size_t pos = read_index % capacity; - const std::size_t first_copy = std::min(capacity - pos, pop_count); + const std::size_t first_copy = (std::min)(capacity - pos, pop_count); const std::size_t second_copy = pop_count - first_copy; char* out = static_cast(output); @@ -77,42 +79,33 @@ public: out += first_copy * slot_size; std::memcpy(out, m_data.data(), second_copy * slot_size); - m_read_index.store(read_index + pop_count); - + read_index = read_index + pop_count; return pop_count; } std::vector Pop(std::size_t max_slots = ~std::size_t(0)) { - std::vector out(std::min(max_slots, capacity)); + std::vector out((std::min)(max_slots, capacity)); const std::size_t count = Pop(out.data(), out.size()); out.resize(count); return out; } /// @returns Number of slots used - [[nodiscard]] std::size_t Size() const { - return m_write_index.load() - m_read_index.load(); + [[nodiscard]] inline std::size_t Size() const { + return write_index - read_index; } /// @returns Maximum size of ring buffer - [[nodiscard]] constexpr std::size_t Capacity() const { + [[nodiscard]] consteval std::size_t Capacity() const { return capacity; } private: - // It is important to align the below variables for performance reasons: - // Having them on the same cache-line would result in false-sharing between them. - // TODO: Remove this ifdef whenever clang and GCC support - // std::hardware_destructive_interference_size. -#ifdef __cpp_lib_hardware_interference_size - alignas(std::hardware_destructive_interference_size) std::atomic_size_t m_read_index{0}; - alignas(std::hardware_destructive_interference_size) std::atomic_size_t m_write_index{0}; -#else - alignas(128) std::atomic_size_t m_read_index{0}; - alignas(128) std::atomic_size_t m_write_index{0}; -#endif - std::array m_data; + // This is wrong, a thread-safe ringbuffer is impossible. + std::size_t read_index{0}; + std::size_t write_index{0}; + std::mutex rb_mutex; }; } // namespace Common diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in index b6bff72867..60c9c119f9 100644 --- a/src/common/scm_rev.cpp.in +++ b/src/common/scm_rev.cpp.in @@ -1,14 +1,13 @@ +// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/scm_rev.h" -#include -#include -#include - -#define GIT_REV "@GIT_REV@" -#define GIT_BRANCH "@GIT_BRANCH@" +#define GIT_REV "@GIT_COMMIT@" +#define GIT_BRANCH "@GIT_REFSPEC@" #define GIT_DESC "@GIT_DESC@" #define BUILD_NAME "@REPO_NAME@" #define BUILD_DATE "@BUILD_DATE@" @@ -18,64 +17,28 @@ #define TITLE_BAR_FORMAT_IDLE "@TITLE_BAR_FORMAT_IDLE@" #define TITLE_BAR_FORMAT_RUNNING "@TITLE_BAR_FORMAT_RUNNING@" #define IS_DEV_BUILD @IS_DEV_BUILD@ +#define COMPILER_ID "@CXX_COMPILER@" +#define BUILD_AUTO_UPDATE_WEBSITE "@BUILD_AUTO_UPDATE_WEBSITE@" +#define BUILD_AUTO_UPDATE_API "@BUILD_AUTO_UPDATE_API@" +#define BUILD_AUTO_UPDATE_REPO "@BUILD_AUTO_UPDATE_REPO@" namespace Common { -const char* g_scm_rev; -const char* g_scm_branch; -const char* g_scm_desc; -const char g_build_name[] = BUILD_NAME; -const char g_build_date[] = BUILD_DATE; -const char g_build_fullname[] = BUILD_FULLNAME; -const char g_build_version[] = BUILD_VERSION; -const char g_build_id[] = BUILD_ID; -const char g_title_bar_format_idle[] = TITLE_BAR_FORMAT_IDLE; -const char g_title_bar_format_running[] = TITLE_BAR_FORMAT_RUNNING; -const bool g_is_dev_build = IS_DEV_BUILD; +constexpr const char g_scm_rev[] = GIT_REV; +constexpr const char g_scm_branch[] = GIT_BRANCH; +constexpr const char g_scm_desc[] = GIT_DESC; +constexpr const char g_build_name[] = BUILD_NAME; +constexpr const char g_build_date[] = BUILD_DATE; +constexpr const char g_build_fullname[] = BUILD_FULLNAME; +constexpr const char g_build_version[] = BUILD_VERSION; +constexpr const char g_build_id[] = BUILD_ID; +constexpr const char g_title_bar_format_idle[] = TITLE_BAR_FORMAT_IDLE; +constexpr const char g_title_bar_format_running[] = TITLE_BAR_FORMAT_RUNNING; +constexpr const char g_compiler_id[] = COMPILER_ID; +constexpr const bool g_is_dev_build = IS_DEV_BUILD; -/// Anonymizes SCM data -/// This is quite weak. But better than nothing. -class scm_encrypt { - std::string m_scm_rev, m_scm_branch, m_scm_desc; +constexpr const char g_build_auto_update_website[] = BUILD_AUTO_UPDATE_WEBSITE; +constexpr const char g_build_auto_update_api[] = BUILD_AUTO_UPDATE_API; +constexpr const char g_build_auto_update_repo[] = BUILD_AUTO_UPDATE_REPO; -public: - scm_encrypt() { - // Get a key that is easy to obtain when asking the person directly but (usually) hard to - // guess - std::string key; -#ifdef __linux__ - if (!std::getline(std::ifstream("/proc/sys/kernel/hostname"), key)) - key = "linux_error_key"; -#else - // Not a good fallback, but better than nothing I guess? - key = g_build_date; -#endif - // Copy strings in place - m_scm_rev = GIT_REV; - m_scm_branch = GIT_BRANCH; - m_scm_desc = GIT_DESC; - // XOR each string with key - auto key_it = key.begin(); - for (auto& string : {&m_scm_rev, &m_scm_branch, &m_scm_desc}) { - for (auto& c : *string) { - c ^= *key_it; - if (++key_it == key.end()) - key_it = key.begin(); - } - } - // Make each string human-readable - for (auto& string : {&m_scm_rev, &m_scm_branch, &m_scm_desc}) { - const std::string original = *string; - string->clear(); - for (const auto c : original) { - string->append(fmt::format("{:x}", unsigned(c))); - } - string->pop_back(); - } - // Set pointers - g_scm_rev = m_scm_rev.c_str(); - g_scm_branch = m_scm_branch.c_str(); - g_scm_desc = m_scm_desc.c_str(); - } -} scm_encrypt_instance; } // namespace Common diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h index ee1997950a..b89de95a3d 100644 --- a/src/common/scm_rev.h +++ b/src/common/scm_rev.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,9 +8,9 @@ namespace Common { -extern const char* g_scm_rev; -extern const char* g_scm_branch; -extern const char* g_scm_desc; +extern const char g_scm_rev[]; +extern const char g_scm_branch[]; +extern const char g_scm_desc[]; extern const char g_build_name[]; extern const char g_build_date[]; extern const char g_build_fullname[]; @@ -16,6 +19,10 @@ extern const char g_build_id[]; extern const char g_title_bar_format_idle[]; extern const char g_title_bar_format_running[]; extern const char g_shader_cache_version[]; +extern const char g_compiler_id[]; extern const bool g_is_dev_build; +extern const char g_build_auto_update_website[]; +extern const char g_build_auto_update_api[]; +extern const char g_build_auto_update_repo[]; } // namespace Common diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 63d46722ea..b849d7cb6a 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -154,11 +154,26 @@ bool IsGPULevelHigh() { values.current_gpu_accuracy == GpuAccuracy::High; } +bool IsDMALevelDefault() { + return values.dma_accuracy.GetValue() == DmaAccuracy::Default; +} + +bool IsDMALevelSafe() { + return values.dma_accuracy.GetValue() == DmaAccuracy::Safe; +} + bool IsFastmemEnabled() { if (values.cpu_debug_mode) { return static_cast(values.cpuopt_fastmem); } + if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) { + return static_cast(values.cpuopt_unsafe_host_mmu); + } +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + return false; +#else return true; +#endif } static bool is_nce_enabled = false; @@ -286,6 +301,10 @@ void TranslateResolutionInfo(ResolutionSetup setup, ResolutionScalingInfo& info) info.up_scale = 3; info.down_shift = 1; break; + case ResolutionSetup::Res5_4X: + info.up_scale = 5; + info.down_shift = 2; + break; case ResolutionSetup::Res2X: info.up_scale = 2; info.down_shift = 0; diff --git a/src/common/settings.h b/src/common/settings.h index b846f41318..dd9b03f28e 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -37,14 +37,14 @@ struct ResolutionScalingInfo { if (value == 0) { return 0; } - return std::max((value * static_cast(up_scale)) >> static_cast(down_shift), 1); + return (std::max)((value * static_cast(up_scale)) >> static_cast(down_shift), 1); } u32 ScaleUp(u32 value) const { if (value == 0U) { return 0U; } - return std::max((value * up_scale) >> down_shift, 1U); + return (std::max)((value * up_scale) >> down_shift, 1U); } }; @@ -161,7 +161,7 @@ struct Values { Category::LibraryApplet}; Setting photo_viewer_applet_mode{ linkage, AppletMode::LLE, "photo_viewer_applet_mode", Category::LibraryApplet}; - Setting offline_web_applet_mode{linkage, AppletMode::LLE, "offline_web_applet_mode", + Setting offline_web_applet_mode{linkage, AppletMode::HLE, "offline_web_applet_mode", Category::LibraryApplet}; Setting login_share_applet_mode{linkage, AppletMode::HLE, "login_share_applet_mode", Category::LibraryApplet}; @@ -178,7 +178,7 @@ struct Values { SwitchableSetting audio_input_device_id{ linkage, "auto", "input_device", Category::Audio, Specialization::RuntimeList}; SwitchableSetting sound_index{ - linkage, AudioMode::Stereo, AudioMode::Mono, AudioMode::Surround, + linkage, AudioMode::Stereo, "sound_index", Category::SystemAudio, Specialization::Default, true, true}; SwitchableSetting volume{linkage, @@ -199,8 +199,6 @@ struct Values { SwitchableSetting use_multi_core{linkage, true, "use_multi_core", Category::Core}; SwitchableSetting memory_layout_mode{linkage, MemoryLayout::Memory_4Gb, - MemoryLayout::Memory_4Gb, - MemoryLayout::Memory_12Gb, "memory_layout_mode", Category::Core, Specialization::Default, @@ -217,7 +215,8 @@ struct Values { true, true, &use_speed_limit}; - SwitchableSetting sync_core_speed{linkage, false, "sync_core_speed", Category::Core, Specialization::Default}; + SwitchableSetting sync_core_speed{linkage, false, "sync_core_speed", Category::Core, + Specialization::Default}; // Memory #ifdef HAS_NCE @@ -239,9 +238,8 @@ struct Values { #endif "cpu_backend", Category::Cpu}; - SwitchableSetting cpu_accuracy{linkage, CpuAccuracy::Auto, - CpuAccuracy::Auto, CpuAccuracy::Paranoid, - "cpu_accuracy", Category::Cpu}; + SwitchableSetting cpu_accuracy{linkage, CpuAccuracy::Auto, + "cpu_accuracy", Category::Cpu}; SwitchableSetting use_fast_cpu_time{linkage, false, @@ -299,6 +297,15 @@ struct Values { Category::CpuDebug}; Setting cpuopt_ignore_memory_aborts{linkage, true, "cpuopt_ignore_memory_aborts", Category::CpuDebug}; + + SwitchableSetting cpuopt_unsafe_host_mmu{linkage, +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + false, +#else + true, +#endif + "cpuopt_unsafe_host_mmu", + Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_unfuse_fma{linkage, true, "cpuopt_unsafe_unfuse_fma", Category::CpuUnsafe}; SwitchableSetting cpuopt_unsafe_reduce_fp_error{ @@ -313,15 +320,22 @@ struct Values { linkage, true, "cpuopt_unsafe_ignore_global_monitor", Category::CpuUnsafe}; // Renderer - SwitchableSetting renderer_backend{ - linkage, RendererBackend::Vulkan, RendererBackend::OpenGL, RendererBackend::Null, + SwitchableSetting renderer_backend{linkage, +#if defined(__sun__) || defined(__managarm__) + RendererBackend::OpenGL, +#else + RendererBackend::Vulkan, +#endif "backend", Category::Renderer}; - SwitchableSetting shader_backend{ - linkage, ShaderBackend::SpirV, ShaderBackend::Glsl, ShaderBackend::SpirV, + SwitchableSetting shader_backend{linkage, +#if defined(__sun__) || defined(__managarm__) + ShaderBackend::Glsl, +#else + ShaderBackend::SpirV, +#endif "shader_backend", Category::Renderer, Specialization::RuntimeList}; SwitchableSetting vulkan_device{linkage, 0, "vulkan_device", Category::Renderer, Specialization::RuntimeList}; - SwitchableSetting enable_raii{linkage, false, "enable_raii", Category::Renderer}; #ifdef __ANDROID__ SwitchableSetting frame_interpolation{linkage, true, "frame_interpolation", Category::Renderer, Specialization::RuntimeList}; @@ -332,8 +346,6 @@ struct Values { Category::Renderer}; SwitchableSetting optimize_spirv_output{linkage, SpirvOptimizeMode::Never, - SpirvOptimizeMode::Never, - SpirvOptimizeMode::Always, "optimize_spirv_output", Category::Renderer}; SwitchableSetting use_asynchronous_gpu_emulation{ @@ -344,12 +356,10 @@ struct Values { #else AstcDecodeMode::Gpu, #endif - AstcDecodeMode::Cpu, - AstcDecodeMode::CpuAsynchronous, "accelerate_astc", Category::Renderer}; SwitchableSetting vsync_mode{ - linkage, VSyncMode::Fifo, VSyncMode::Immediate, VSyncMode::FifoRelaxed, + linkage, VSyncMode::Fifo, "use_vsync", Category::Renderer, Specialization::RuntimeList, true, true}; SwitchableSetting nvdec_emulation{linkage, NvdecEmulation::Gpu, @@ -362,8 +372,6 @@ struct Values { #else FullscreenMode::Exclusive, #endif - FullscreenMode::Borderless, - FullscreenMode::Exclusive, "fullscreen_mode", Category::Renderer, Specialization::Default, @@ -371,8 +379,6 @@ struct Values { true}; SwitchableSetting aspect_ratio{linkage, AspectRatio::R16_9, - AspectRatio::R16_9, - AspectRatio::Stretch, "aspect_ratio", Category::Renderer, Specialization::Default, @@ -420,8 +426,6 @@ struct Values { #else GpuAccuracy::High, #endif - GpuAccuracy::Normal, - GpuAccuracy::Extreme, "gpu_accuracy", Category::RendererAdvanced, Specialization::Default, @@ -432,8 +436,6 @@ struct Values { SwitchableSetting dma_accuracy{linkage, DmaAccuracy::Default, - DmaAccuracy::Default, - DmaAccuracy::Extreme, "dma_accuracy", Category::RendererAdvanced, Specialization::Default, @@ -446,20 +448,14 @@ struct Values { #else AnisotropyMode::Automatic, #endif - AnisotropyMode::Automatic, - AnisotropyMode::X16, "max_anisotropy", Category::RendererAdvanced}; SwitchableSetting astc_recompression{linkage, AstcRecompression::Uncompressed, - AstcRecompression::Uncompressed, - AstcRecompression::Bc3, "astc_recompression", Category::RendererAdvanced}; SwitchableSetting vram_usage_mode{linkage, VramUsageMode::Conservative, - VramUsageMode::Conservative, - VramUsageMode::Aggressive, "vram_usage_mode", Category::RendererAdvanced}; SwitchableSetting skip_cpu_inner_invalidation{linkage, @@ -542,6 +538,8 @@ struct Values { 3, #elif defined (ANDROID) 0, +#elif defined (__APPLE__) + 0, #else 2, #endif @@ -574,20 +572,19 @@ struct Values { linkage, false, "disable_shader_loop_safety_checks", Category::RendererDebug}; Setting enable_renderdoc_hotkey{linkage, false, "renderdoc_hotkey", Category::RendererDebug}; - Setting disable_buffer_reorder{linkage, false, "disable_buffer_reorder", - Category::RendererDebug}; + SwitchableSetting disable_buffer_reorder{linkage, false, "disable_buffer_reorder", + Category::RendererDebug, + Specialization::Default, + true, + true}; // System SwitchableSetting language_index{linkage, Language::EnglishAmerican, - Language::Japanese, - Language::Serbian, "language_index", Category::System}; - SwitchableSetting region_index{linkage, Region::Usa, Region::Japan, - Region::Taiwan, "region_index", Category::System}; - SwitchableSetting time_zone_index{linkage, TimeZone::Auto, - TimeZone::Auto, TimeZone::Zulu, + SwitchableSetting region_index{linkage, Region::Usa, "region_index", Category::System}; + SwitchableSetting time_zone_index{linkage, TimeZone::Auto, "time_zone_index", Category::System}; // Measured in seconds since epoch SwitchableSetting custom_rtc_enabled{ @@ -597,8 +594,8 @@ struct Values { false, true, &custom_rtc_enabled}; SwitchableSetting custom_rtc_offset{linkage, 0, - std::numeric_limits::min(), - std::numeric_limits::max(), + (std::numeric_limits::min)(), + (std::numeric_limits::max)(), "custom_rtc_offset", Category::System, Specialization::Countable, @@ -610,7 +607,7 @@ struct Values { linkage, 0, "rng_seed", Category::System, Specialization::Hex, true, true, &rng_seed_enabled}; Setting device_name{ - linkage, "Eden", "device_name", Category::System, Specialization::Default, true, true}; + linkage, "Eden", "device_name", Category::System, Specialization::Default, true, true}; Setting current_user{linkage, 0, "current_user", Category::System}; @@ -741,7 +738,7 @@ struct Values { // Miscellaneous Setting log_filter{linkage, "*:Info", "log_filter", Category::Miscellaneous}; - Setting log_flush_lines{linkage, true, "flush_lines", Category::Miscellaneous, Specialization::Default, true, true}; + Setting log_flush_line{linkage, false, "flush_line", Category::Miscellaneous, Specialization::Default, true, true}; Setting censor_username{linkage, true, "censor_username", Category::Miscellaneous}; Setting use_dev_keys{linkage, false, "use_dev_keys", Category::Miscellaneous}; Setting first_launch{linkage, true, "first_launch", Category::Miscellaneous}; @@ -768,6 +765,9 @@ void UpdateGPUAccuracy(); bool IsGPULevelExtreme(); bool IsGPULevelHigh(); +bool IsDMALevelDefault(); +bool IsDMALevelSafe(); + bool IsFastmemEnabled(); void SetNceEnabled(bool is_64bit); bool IsNceEnabled(); diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 52b4a128f7..ccf6f1cfb2 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -10,6 +10,7 @@ #pragma once #include +#include #include #include #include "common/common_types.h" @@ -18,8 +19,10 @@ namespace Settings { template struct EnumMetadata { - static std::vector> Canonicalizations(); + static std::vector> Canonicalizations(); static u32 Index(); + static constexpr T GetFirst(); + static constexpr T GetLast(); }; #define PAIR_45(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_46(N, __VA_ARGS__)) @@ -69,138 +72,101 @@ struct EnumMetadata { #define PAIR_1(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_2(N, __VA_ARGS__)) #define PAIR(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_1(N, __VA_ARGS__)) -#define ENUM(NAME, ...) \ - enum class NAME : u32 { __VA_ARGS__ }; \ - template <> \ - inline std::vector> EnumMetadata::Canonicalizations() { \ - return {PAIR(NAME, __VA_ARGS__)}; \ - } \ - template <> \ - inline u32 EnumMetadata::Index() { \ - return __COUNTER__; \ +#define PP_HEAD(A, ...) A + +#define ENUM(NAME, ...) \ + enum class NAME : u32 { __VA_ARGS__ }; \ + template<> inline std::vector> EnumMetadata::Canonicalizations() { \ + return {PAIR(NAME, __VA_ARGS__)}; \ + } \ + template<> inline u32 EnumMetadata::Index() { \ + return __COUNTER__; \ + } \ + template<> inline constexpr NAME EnumMetadata::GetFirst() { \ + return NAME::PP_HEAD(__VA_ARGS__); \ + } \ + template<> inline constexpr NAME EnumMetadata::GetLast() { \ + return (std::vector>{PAIR(NAME, __VA_ARGS__)}).back().second; \ } // AudioEngine must be specified discretely due to having existing but slightly different // canonicalizations // TODO (lat9nq): Remove explicit definition of AudioEngine/sink_id -enum class AudioEngine : u32 { - Auto, - Cubeb, - Sdl2, - Null, - Oboe, -}; - -template <> -inline std::vector> -EnumMetadata::Canonicalizations() { +enum class AudioEngine : u32 { Auto, Cubeb, Sdl2, Null, Oboe, }; +template<> +inline std::vector> EnumMetadata::Canonicalizations() { return { {"auto", AudioEngine::Auto}, {"cubeb", AudioEngine::Cubeb}, {"sdl2", AudioEngine::Sdl2}, {"null", AudioEngine::Null}, {"oboe", AudioEngine::Oboe}, }; } - -template <> +/// @brief This is just a sufficiently large number that is more than the number of other enums declared here +template<> inline u32 EnumMetadata::Index() { - // This is just a sufficiently large number that is more than the number of other enums declared - // here return 100; } +template<> +inline constexpr AudioEngine EnumMetadata::GetFirst() { + return AudioEngine::Auto; +} +template<> +inline constexpr AudioEngine EnumMetadata::GetLast() { + return AudioEngine::Oboe; +} ENUM(AudioMode, Mono, Stereo, Surround); +static_assert(EnumMetadata::GetFirst() == AudioMode::Mono); +static_assert(EnumMetadata::GetLast() == AudioMode::Surround); ENUM(Language, Japanese, EnglishAmerican, French, German, Italian, Spanish, Chinese, Korean, Dutch, Portuguese, Russian, Taiwanese, EnglishBritish, FrenchCanadian, SpanishLatin, ChineseSimplified, ChineseTraditional, PortugueseBrazilian, Serbian); - ENUM(Region, Japan, Usa, Europe, Australia, China, Korea, Taiwan); - ENUM(TimeZone, Auto, Default, Cet, Cst6Cdt, Cuba, Eet, Egypt, Eire, Est, Est5Edt, Gb, GbEire, Gmt, - GmtPlusZero, GmtMinusZero, GmtZero, Greenwich, Hongkong, Hst, Iceland, Iran, Israel, Jamaica, - Japan, Kwajalein, Libya, Met, Mst, Mst7Mdt, Navajo, Nz, NzChat, Poland, Portugal, Prc, Pst8Pdt, - Roc, Rok, Singapore, Turkey, Uct, Universal, Utc, WSu, Wet, Zulu); - + GmtPlusZero, GmtMinusZero, GmtZero, Greenwich, Hongkong, Hst, Iceland, Iran, Israel, Jamaica, + Japan, Kwajalein, Libya, Met, Mst, Mst7Mdt, Navajo, Nz, NzChat, Poland, Portugal, Prc, Pst8Pdt, + Roc, Rok, Singapore, Turkey, Uct, Universal, Utc, WSu, Wet, Zulu); ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16); - ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous); - ENUM(AstcRecompression, Uncompressed, Bc1, Bc3); - ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed); - ENUM(VramUsageMode, Conservative, Aggressive); - ENUM(RendererBackend, OpenGL, Vulkan, Null); - ENUM(ShaderBackend, Glsl, Glasm, SpirV); - ENUM(GpuAccuracy, Normal, High, Extreme); - -ENUM(DmaAccuracy, Default, Normal, High, Extreme); - +ENUM(DmaAccuracy, Default, Unsafe, Safe); ENUM(CpuBackend, Dynarmic, Nce); - ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid); - ENUM(CpuClock, Boost, Fast) - ENUM(MemoryLayout, Memory_4Gb, Memory_6Gb, Memory_8Gb, Memory_10Gb, Memory_12Gb); - ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never); - ENUM(FullscreenMode, Borderless, Exclusive); - ENUM(NvdecEmulation, Off, Cpu, Gpu); - -ENUM(ResolutionSetup, - Res1_4X, - Res1_2X, - Res3_4X, - Res1X, - Res3_2X, - Res2X, - Res3X, - Res4X, - Res5X, - Res6X, - Res7X, - Res8X); - -ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, ScaleForce, Fsr, Area, MaxEnum); - +ENUM(ResolutionSetup, Res1_4X, Res1_2X, Res3_4X, Res1X, Res5_4X, Res3_2X, Res2X, Res3X, Res4X, Res5X, Res6X, Res7X, Res8X); +ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, ScaleForce, Fsr, Area, ZeroTangent, BSpline, Mitchell, Spline1, Mmpx, MaxEnum); ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum); - ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch); - ENUM(ConsoleMode, Handheld, Docked); - ENUM(AppletMode, HLE, LLE); - ENUM(SpirvOptimizeMode, Never, OnLoad, Always); - ENUM(GpuOverclock, Low, Medium, High) - ENUM(TemperatureUnits, Celsius, Fahrenheit) template -inline std::string CanonicalizeEnum(Type id) { +inline std::string_view CanonicalizeEnum(Type id) { const auto group = EnumMetadata::Canonicalizations(); - for (auto& [name, value] : group) { - if (value == id) { + for (auto& [name, value] : group) + if (value == id) return name; - } - } return "unknown"; } template inline Type ToEnum(const std::string& canonicalization) { const auto group = EnumMetadata::Canonicalizations(); - for (auto& [name, value] : group) { - if (name == canonicalization) { + for (auto& [name, value] : group) + if (name == canonicalization) return value; - } - } return {}; } } // namespace Settings diff --git a/src/common/settings_setting.h b/src/common/settings_setting.h index 0b18ca5ecc..a7e6bb6168 100644 --- a/src/common/settings_setting.h +++ b/src/common/settings_setting.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -69,10 +72,17 @@ public: u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, BasicSetting* other_setting_ = nullptr) requires(ranged) - : BasicSetting(linkage, name, category_, save_, runtime_modifiable_, specialization_, - other_setting_), + : BasicSetting(linkage, name, category_, save_, runtime_modifiable_, specialization_, other_setting_), value{default_val}, default_value{default_val}, maximum{max_val}, minimum{min_val} {} + explicit Setting(Linkage& linkage, const Type& default_val, + const std::string& name, Category category_, + u32 specialization_ = Specialization::Default, bool save_ = true, + bool runtime_modifiable_ = false, BasicSetting* other_setting_ = nullptr) + requires(ranged && std::is_enum_v) + : BasicSetting(linkage, name, category_, save_, runtime_modifiable_, specialization_, other_setting_), + value{default_val}, default_value{default_val}, maximum{EnumMetadata::GetLast()}, minimum{EnumMetadata::GetFirst()} {} + /** * Returns a reference to the setting's value. * @@ -116,9 +126,6 @@ protected: return value_.has_value() ? std::to_string(*value_) : "none"; } else if constexpr (std::is_same_v) { return value_ ? "true" : "false"; - } else if constexpr (std::is_same_v) { - // Compatibility with old AudioEngine setting being a string - return CanonicalizeEnum(value_); } else if constexpr (std::is_floating_point_v) { return fmt::format("{:f}", value_); } else if constexpr (std::is_enum_v) { @@ -204,7 +211,7 @@ public: [[nodiscard]] std::string Canonicalize() const override final { if constexpr (std::is_enum_v) { - return CanonicalizeEnum(this->GetValue()); + return std::string{CanonicalizeEnum(this->GetValue())}; } else { return ToString(this->GetValue()); } @@ -223,7 +230,7 @@ public: if constexpr (std::is_enum_v) { return EnumMetadata::Index(); } else { - return std::numeric_limits::max(); + return (std::numeric_limits::max)(); } } @@ -237,14 +244,14 @@ public: [[nodiscard]] std::string MinVal() const override final { if constexpr (std::is_arithmetic_v && !ranged) { - return this->ToString(std::numeric_limits::min()); + return this->ToString((std::numeric_limits::min)()); } else { return this->ToString(minimum); } } [[nodiscard]] std::string MaxVal() const override final { if constexpr (std::is_arithmetic_v && !ranged) { - return this->ToString(std::numeric_limits::max()); + return this->ToString((std::numeric_limits::max)()); } else { return this->ToString(maximum); } @@ -285,41 +292,32 @@ public: * @param other_setting_ A second Setting to associate to this one in metadata */ template - explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const std::string& name, - Category category_, u32 specialization_ = Specialization::Default, - bool save_ = true, bool runtime_modifiable_ = false, - typename std::enable_if::type other_setting_ = nullptr) - : Setting{ - linkage, default_val, name, category_, specialization_, - save_, runtime_modifiable_, other_setting_} { + explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const std::string& name, Category category_, u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, T* other_setting_ = nullptr) requires(!ranged) + : Setting{ linkage, default_val, name, category_, specialization_, save_, runtime_modifiable_, other_setting_} { linkage.restore_functions.emplace_back([this]() { this->SetGlobal(true); }); } virtual ~SwitchableSetting() = default; - /** - * Sets a default value, minimum value, maximum value, and label. - * - * @param linkage Setting registry - * @param default_val Initial value of the setting, and default value of the setting - * @param min_val Sets the minimum allowed value of the setting - * @param max_val Sets the maximum allowed value of the setting - * @param name Label for the setting - * @param category_ Category of the setting AKA INI group - * @param specialization_ Suggestion for how frontend implementations represent this in a config - * @param save_ Suggests that this should or should not be saved to a frontend config file - * @param runtime_modifiable_ Suggests whether this is modifiable while a guest is loaded - * @param other_setting_ A second Setting to associate to this one in metadata - */ + /// @brief Sets a default value, minimum value, maximum value, and label. + /// @param linkage Setting registry + /// @param default_val Initial value of the setting, and default value of the setting + /// @param min_val Sets the minimum allowed value of the setting + /// @param max_val Sets the maximum allowed value of the setting + /// @param name Label for the setting + /// @param category_ Category of the setting AKA INI group + /// @param specialization_ Suggestion for how frontend implementations represent this in a config + /// @param save_ Suggests that this should or should not be saved to a frontend config file + /// @param runtime_modifiable_ Suggests whether this is modifiable while a guest is loaded + /// @param other_setting_ A second Setting to associate to this one in metadata template - explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const Type& min_val, - const Type& max_val, const std::string& name, Category category_, - u32 specialization_ = Specialization::Default, bool save_ = true, - bool runtime_modifiable_ = false, - typename std::enable_if::type other_setting_ = nullptr) - : Setting{linkage, default_val, min_val, - max_val, name, category_, - specialization_, save_, runtime_modifiable_, - other_setting_} { + explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const Type& min_val, const Type& max_val, const std::string& name, Category category_, u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, T* other_setting_ = nullptr) requires(ranged) + : Setting{linkage, default_val, min_val, max_val, name, category_, specialization_, save_, runtime_modifiable_, other_setting_} { + linkage.restore_functions.emplace_back([this]() { this->SetGlobal(true); }); + } + + template + explicit SwitchableSetting(Linkage& linkage, const Type& default_val, const std::string& name, Category category_, u32 specialization_ = Specialization::Default, bool save_ = true, bool runtime_modifiable_ = false, T* other_setting_ = nullptr) requires(ranged) + : Setting{linkage, default_val, EnumMetadata::GetFirst(), EnumMetadata::GetLast(), name, category_, specialization_, save_, runtime_modifiable_, other_setting_} { linkage.restore_functions.emplace_back([this]() { this->SetGlobal(true); }); } diff --git a/src/common/slot_vector.h b/src/common/slot_vector.h index 34ff7de941..01c65306c8 100644 --- a/src/common/slot_vector.h +++ b/src/common/slot_vector.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,12 +15,12 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include namespace Common { struct SlotId { - static constexpr u32 INVALID_INDEX = std::numeric_limits::max(); + static constexpr u32 INVALID_INDEX = (std::numeric_limits::max)(); constexpr auto operator<=>(const SlotId&) const noexcept = default; diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 1909aced54..7bcbe737b6 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2013 Dolphin Emulator Project // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,6 +10,7 @@ #include #include #include +#include #include "common/string_util.h" @@ -21,51 +25,21 @@ namespace Common { /// Make a string lowercase -std::string ToLower(std::string str) { +std::string ToLower(const std::string_view sv) { + std::string str{sv}; std::transform(str.begin(), str.end(), str.begin(), - [](unsigned char c) { return static_cast(std::tolower(c)); }); + [](auto const c) { return char(std::tolower(c)); }); return str; } /// Make a string uppercase -std::string ToUpper(std::string str) { +std::string ToUpper(const std::string_view sv) { + std::string str{sv}; std::transform(str.begin(), str.end(), str.begin(), - [](unsigned char c) { return static_cast(std::toupper(c)); }); + [](auto const c) { return char(std::toupper(c)); }); return str; } -std::string StringFromBuffer(std::span data) { - return std::string(data.begin(), std::find(data.begin(), data.end(), '\0')); -} - -std::string StringFromBuffer(std::span data) { - return std::string(data.begin(), std::find(data.begin(), data.end(), '\0')); -} - -// Turns " hej " into "hej". Also handles tabs. -std::string StripSpaces(const std::string& str) { - const std::size_t s = str.find_first_not_of(" \t\r\n"); - - if (str.npos != s) - return str.substr(s, str.find_last_not_of(" \t\r\n") - s + 1); - else - return ""; -} - -// "\"hello\"" is turned to "hello" -// This one assumes that the string has already been space stripped in both -// ends, as done by StripSpaces above, for example. -std::string StripQuotes(const std::string& s) { - if (s.size() && '\"' == s[0] && '\"' == *s.rbegin()) - return s.substr(1, s.size() - 2); - else - return s; -} - -std::string StringFromBool(bool value) { - return value ? "True" : "False"; -} - bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension) { if (full_path.empty()) diff --git a/src/common/string_util.h b/src/common/string_util.h index 53d0549ca7..4358541b14 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2013 Dolphin Emulator Project // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include #include #include @@ -13,18 +17,38 @@ namespace Common { /// Make a string lowercase -[[nodiscard]] std::string ToLower(std::string str); +[[nodiscard]] std::string ToLower(const std::string_view sv); /// Make a string uppercase -[[nodiscard]] std::string ToUpper(std::string str); +[[nodiscard]] std::string ToUpper(const std::string_view sv); -[[nodiscard]] std::string StringFromBuffer(std::span data); -[[nodiscard]] std::string StringFromBuffer(std::span data); +[[nodiscard]] inline std::string StringFromBuffer(std::span data) noexcept { + return std::string(data.begin(), std::find(data.begin(), data.end(), '\0')); +} +[[nodiscard]] inline std::string StringFromBuffer(std::span data) noexcept { + return std::string(data.begin(), std::find(data.begin(), data.end(), '\0')); +} -[[nodiscard]] std::string StripSpaces(const std::string& s); -[[nodiscard]] std::string StripQuotes(const std::string& s); +/// Turns " hej " into "hej". Also handles tabs. +[[nodiscard]] inline std::string StripSpaces(const std::string_view str) noexcept { + const std::size_t s = str.find_first_not_of(" \t\r\n"); + if (str.npos != s) + return std::string{str.substr(s, str.find_last_not_of(" \t\r\n") - s + 1)}; + return {}; +} -[[nodiscard]] std::string StringFromBool(bool value); +/// "\"hello\"" is turned to "hello" +/// This one assumes that the string has already been space stripped in both +/// ends, as done by StripSpaces above, for example. +[[nodiscard]] inline std::string StripQuotes(const std::string_view s) noexcept { + if (s.size() && '\"' == s[0] && '\"' == *s.rbegin()) + return std::string{s.substr(1, s.size() - 2)}; + return std::string{s}; +} + +[[nodiscard]] inline std::string StringFromBool(bool value) noexcept { + return value ? "True" : "False"; +} [[nodiscard]] std::string TabsToSpaces(int tab_size, std::string in); @@ -54,7 +78,7 @@ bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _ * `other` for equality. */ template -[[nodiscard]] bool ComparePartialString(InIt begin, InIt end, const char* other) { +[[nodiscard]] inline bool ComparePartialString(InIt begin, InIt end, const char* other) noexcept { for (; begin != end && *other != '\0'; ++begin, ++other) { if (*begin != *other) { return false; @@ -64,18 +88,14 @@ template return (begin == end) == (*other == '\0'); } -/** - * Creates a std::string from a fixed-size NUL-terminated char buffer. If the buffer isn't - * NUL-terminated then the string ends at max_len characters. - */ +/// Creates a std::string from a fixed-size NUL-terminated char buffer. If the buffer isn't +/// NUL-terminated then the string ends at max_len characters. [[nodiscard]] std::string StringFromFixedZeroTerminatedBuffer(std::string_view buffer, std::size_t max_len); -/** - * Creates a UTF-16 std::u16string from a fixed-size NUL-terminated char buffer. If the buffer isn't - * null-terminated, then the string ends at the greatest multiple of two less then or equal to - * max_len_bytes. - */ +/// Creates a UTF-16 std::u16string from a fixed-size NUL-terminated char buffer. If the buffer isn't +/// null-terminated, then the string ends at the greatest multiple of two less then or equal to +/// max_len_bytes. [[nodiscard]] std::u16string UTF16StringFromFixedZeroTerminatedBuffer(std::u16string_view buffer, std::size_t max_len); diff --git a/src/common/thread.cpp b/src/common/thread.cpp index 34cc1527bf..2de7465a22 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2013 Dolphin Emulator Project // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,9 +17,8 @@ #else #if defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include -#else -#include #endif +#include #include #endif #ifndef _WIN32 @@ -66,7 +67,7 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) { const auto scheduling_type = SCHED_OTHER; s32 max_prio = sched_get_priority_max(scheduling_type); s32 min_prio = sched_get_priority_min(scheduling_type); - u32 level = std::max(static_cast(new_priority) + 1, 4U); + u32 level = (std::max)(static_cast(new_priority) + 1, 4U); struct sched_param params; if (max_prio > min_prio) { @@ -90,33 +91,35 @@ void SetCurrentThreadName(const char* name) { #else // !MSVC_VER, so must be POSIX threads // MinGW with the POSIX threading model does not support pthread_setname_np -#if !defined(_WIN32) || defined(_MSC_VER) void SetCurrentThreadName(const char* name) { + // See for reference + // https://gitlab.freedesktop.org/mesa/mesa/-/blame/main/src/util/u_thread.c?ref_type=heads#L75 #ifdef __APPLE__ pthread_setname_np(name); +#elif defined(__HAIKU__) + rename_thread(find_thread(NULL), name); #elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) pthread_set_name_np(pthread_self(), name); #elif defined(__NetBSD__) pthread_setname_np(pthread_self(), "%s", (void*)name); -#elif defined(__linux__) - // Linux limits thread names to 15 characters and will outright reject any - // attempt to set a longer name with ERANGE. - std::string truncated(name, std::min(strlen(name), static_cast(15))); - if (int e = pthread_setname_np(pthread_self(), truncated.c_str())) { - errno = e; - LOG_ERROR(Common, "Failed to set thread name to '{}': {}", truncated, GetLastErrorMsg()); +#elif defined(__linux__) || defined(__CYGWIN__) || defined(__sun__) || defined(__glibc__) || defined(__managarm__) + int ret = pthread_setname_np(pthread_self(), name); + if (ret == ERANGE) { + // Linux limits thread names to 15 characters and will outright reject any + // attempt to set a longer name with ERANGE. + char buf[16]; + size_t const len = std::min(std::strlen(name), sizeof(buf) - 1); + std::memcpy(buf, name, len); + buf[len] = '\0'; + pthread_setname_np(pthread_self(), buf); } +#elif !defined(_WIN32) || defined(_MSC_VER) + // mingw stub + (void)name; #else pthread_setname_np(pthread_self(), name); #endif } -#endif - -#if defined(_WIN32) -void SetCurrentThreadName(const char* name) { - // Do Nothing on MingW -} -#endif #endif diff --git a/src/common/thread.h b/src/common/thread.h index c6976fb6cd..5ab495baaa 100644 --- a/src/common/thread.h +++ b/src/common/thread.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2013 Dolphin Emulator Project // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -80,7 +83,7 @@ public: condvar.notify_all(); return true; } else { - CondvarWait(condvar, lk, token, + condvar.wait(lk, token, [this, current_generation] { return current_generation != generation; }); return !token.stop_requested(); } diff --git a/src/common/thread_worker.h b/src/common/thread_worker.h index 260ad44e45..6ec9d6a2bd 100644 --- a/src/common/thread_worker.h +++ b/src/common/thread_worker.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -47,8 +50,8 @@ public: if (requests.empty()) { wait_condition.notify_all(); } - Common::CondvarWait(condition, lock, stop_token, - [this] { return !requests.empty(); }); + condition.wait(lock, stop_token, + [this] { return !requests.empty(); }); if (stop_token.stop_requested()) { break; } diff --git a/src/common/threadsafe_queue.h b/src/common/threadsafe_queue.h index 2ef1da0644..f9fc0ca171 100644 --- a/src/common/threadsafe_queue.h +++ b/src/common/threadsafe_queue.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2010 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -99,7 +102,11 @@ public: T PopWait(std::stop_token stop_token) { if (Empty()) { std::unique_lock lock{cv_mutex}; - Common::CondvarWait(cv, lock, stop_token, [this] { return !Empty(); }); + if constexpr (with_stop_token) { + cv.wait(lock, stop_token, [this] { return !Empty(); }); + } else { + cv.wait(lock, [this] { return !Empty(); }); + } } if (stop_token.stop_requested()) { return T{}; diff --git a/src/common/tiny_mt.h b/src/common/tiny_mt.h index 5d5ebf158c..c9f9ed4a5d 100644 --- a/src/common/tiny_mt.h +++ b/src/common/tiny_mt.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -124,7 +127,7 @@ public: this->state.data[3] = ParamTmat; { - const int num_init_iterations = std::max(seed_count + 1, MinimumInitIterations) - 1; + const int num_init_iterations = (std::max)(seed_count + 1, MinimumInitIterations) - 1; GenerateInitialValuePlus(&this->state, 0, seed_count); diff --git a/src/common/uint128.h b/src/common/uint128.h index f450a6db99..3d142d7f83 100644 --- a/src/common/uint128.h +++ b/src/common/uint128.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,7 +23,7 @@ namespace Common { // This function multiplies 2 u64 values and divides it by a u64 value. [[nodiscard]] static inline u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) { -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) u128 r{}; r[0] = _umul128(a, b, &r[1]); u64 remainder; @@ -41,7 +44,7 @@ namespace Common { // This function multiplies 2 u64 values and produces a u128 value; [[nodiscard]] static inline u128 Multiply64Into128(u64 a, u64 b) { u128 result; -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) result[0] = _umul128(a, b, &result[1]); #else unsigned __int128 tmp = a; @@ -65,7 +68,7 @@ namespace Common { #endif #else // This one is bit more inaccurate. - return MultiplyAndDivide64(std::numeric_limits::max(), numerator, divisor); + return MultiplyAndDivide64((std::numeric_limits::max)(), numerator, divisor); #endif } diff --git a/src/common/x64/cpu_wait.cpp b/src/common/x64/cpu_wait.cpp index 41d385f598..12f2e9d4b1 100644 --- a/src/common/x64/cpu_wait.cpp +++ b/src/common/x64/cpu_wait.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -24,7 +27,7 @@ constexpr auto PauseCycles = 100'000U; } // Anonymous namespace -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) __forceinline static void TPAUSE() { static constexpr auto RequestC02State = 0U; _tpause(RequestC02State, FencedRDTSC() + PauseCycles); diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index eab506f194..62dab070e3 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later @@ -88,6 +91,8 @@ add_library(core STATIC file_sys/fssystem/fssystem_crypto_configuration.h file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.cpp file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h + file_sys/fssystem/fssystem_hierarchical_sha3_storage.cpp + file_sys/fssystem/fssystem_hierarchical_sha3_storage.h file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp file_sys/fssystem/fssystem_hierarchical_sha256_storage.h file_sys/fssystem/fssystem_indirect_storage.cpp @@ -102,8 +107,6 @@ add_library(core STATIC file_sys/fssystem/fssystem_nca_header.cpp file_sys/fssystem/fssystem_nca_header.h file_sys/fssystem/fssystem_nca_reader.cpp - file_sys/fssystem/fssystem_pooled_buffer.cpp - file_sys/fssystem/fssystem_pooled_buffer.h file_sys/fssystem/fssystem_sparse_storage.cpp file_sys/fssystem/fssystem_sparse_storage.h file_sys/fssystem/fssystem_switch_storage.h @@ -1152,7 +1155,7 @@ add_library(core STATIC if (ENABLE_WIFI_SCAN) # find_package(libiw REQUIRED) - target_compile_definitions(core PRIVATE -DENABLE_WIFI_SCAN) + target_compile_definitions(core PRIVATE ENABLE_WIFI_SCAN) target_link_libraries(core PRIVATE iw) endif() @@ -1181,6 +1184,7 @@ else() -Wno-cast-function-type $<$:-fsized-deallocation> + $<$:-Wno-cast-function-type-mismatch> ) endif() @@ -1193,13 +1197,13 @@ else() target_link_libraries(core PUBLIC Boost::headers) endif() -target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls RenderDoc::API) +target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API MbedTLS::mbedcrypto MbedTLS::mbedtls) if (MINGW) target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY}) endif() if (ENABLE_WEB_SERVICE) - target_compile_definitions(core PUBLIC -DENABLE_WEB_SERVICE) + target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE) target_link_libraries(core PUBLIC web_service) endif() @@ -1220,7 +1224,7 @@ if (HAS_NCE) arm/nce/patcher.h arm/nce/visitor_base.h ) - target_link_libraries(core PRIVATE merry::mcl merry::oaknut) + target_link_libraries(core PRIVATE merry::oaknut) endif() if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) @@ -1270,8 +1274,4 @@ if (YUZU_USE_PRECOMPILED_HEADERS) target_precompile_headers(core PRIVATE precompiled_headers.h) endif() -if (YUZU_ENABLE_LTO) - set_property(TARGET core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) -endif() - create_target_directory_groups(core) diff --git a/src/core/arm/debug.cpp b/src/core/arm/debug.cpp index 854509463b..3049ea0be1 100644 --- a/src/core/arm/debug.cpp +++ b/src/core/arm/debug.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -283,9 +286,9 @@ Loader::AppLoader::Modules FindModules(Kernel::KProcess* process) { // Ignore leading directories. char* path_pointer = module_path.path.data(); char* path_end = - path_pointer + std::min(PathLengthMax, module_path.path_length); + path_pointer + (std::min)(PathLengthMax, module_path.path_length); - for (s32 i = 0; i < std::min(PathLengthMax, module_path.path_length) && + for (s32 i = 0; i < (std::min)(PathLengthMax, module_path.path_length) && module_path.path[i] != '\0'; i++) { if (module_path.path[i] == '/' || module_path.path[i] == '\\') { diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 9d26db51f7..e6e9fc45be 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp @@ -3,9 +3,47 @@ #ifdef __linux__ -//#include "common/signal_chain.h" +#include "common/signal_chain.h" + #include "core/arm/dynarmic/arm_dynarmic.h" -//#include "core/hle/kernel/k_process.h" -//#include "core/memory.h" +#include "core/hle/kernel/k_process.h" +#include "core/memory.h" + +namespace Core { + +namespace { + +thread_local Core::Memory::Memory* g_current_memory{}; +std::once_flag g_registered{}; +struct sigaction g_old_segv {}; + +void HandleSigSegv(int sig, siginfo_t* info, void* ctx) { + if (g_current_memory && g_current_memory->InvalidateSeparateHeap(info->si_addr)) { + return; + } + + return g_old_segv.sa_sigaction(sig, info, ctx); +} + +} // namespace + +ScopedJitExecution::ScopedJitExecution(Kernel::KProcess* process) { + g_current_memory = std::addressof(process->GetMemory()); +} + +ScopedJitExecution::~ScopedJitExecution() { + g_current_memory = nullptr; +} + +void ScopedJitExecution::RegisterHandler() { + std::call_once(g_registered, [] { + struct sigaction sa {}; + sa.sa_sigaction = &HandleSigSegv; + sa.sa_flags = SA_SIGINFO | SA_ONSTACK; + Common::SigAction(SIGSEGV, std::addressof(sa), std::addressof(g_old_segv)); + }); +} + +} // namespace Core #endif diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index eef7c31160..53dd188151 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h @@ -26,4 +26,24 @@ constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) { return static_cast(hr); } +#ifdef __linux__ + +class ScopedJitExecution { +public: + explicit ScopedJitExecution(Kernel::KProcess* process); + ~ScopedJitExecution(); + static void RegisterHandler(); +}; + +#else + +class ScopedJitExecution { +public: + explicit ScopedJitExecution(Kernel::KProcess* process) {} + ~ScopedJitExecution() {} + static void RegisterHandler() {} +}; + +#endif + } // namespace Core diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 1731ef1aec..d2035d0fe0 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -88,7 +88,7 @@ public: void InterpreterFallback(u32 pc, std::size_t num_instructions) override { m_parent.LogBacktrace(m_process); LOG_ERROR(Core_ARM, - "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, + "Unimplemented instruction @ {:#X} for {} instructions (instr = {:08X})", pc, num_instructions, m_memory.Read32(pc)); } @@ -175,7 +175,6 @@ public: Kernel::KProcess* m_process{}; const bool m_debugger_enabled{}; const bool m_check_memory_access{}; - static constexpr u64 MinimumRunCycles = 10000U; }; std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* page_table) const { @@ -272,6 +271,10 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa // Unsafe optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; + if (!Settings::values.cpuopt_unsafe_host_mmu) { + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; + } if (Settings::values.cpuopt_unsafe_unfuse_fma) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; } @@ -292,6 +295,10 @@ std::shared_ptr ArmDynarmic32::MakeJit(Common::PageTable* pa // Curated optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { config.unsafe_optimizations = true; +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; +#endif config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreStandardFPCRValue; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_InaccurateNaN; @@ -336,11 +343,15 @@ bool ArmDynarmic32::IsInThumbMode() const { } HaltReason ArmDynarmic32::RunThread(Kernel::KThread* thread) { + ScopedJitExecution sj(thread->GetOwnerProcess()); + m_jit->ClearExclusiveState(); return TranslateHaltReason(m_jit->Run()); } HaltReason ArmDynarmic32::StepThread(Kernel::KThread* thread) { + ScopedJitExecution sj(thread->GetOwnerProcess()); + m_jit->ClearExclusiveState(); return TranslateHaltReason(m_jit->Step()); } @@ -382,6 +393,7 @@ ArmDynarmic32::ArmDynarmic32(System& system, bool uses_wall_clock, Kernel::KProc m_cp15(std::make_shared(*this)), m_core_index{core_index} { auto& page_table_impl = process->GetPageTable().GetBasePageTable().GetImpl(); m_jit = MakeJit(&page_table_impl); + ScopedJitExecution::RegisterHandler(); } ArmDynarmic32::~ArmDynarmic32() = default; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 9674e88d9d..438b7b691c 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -102,7 +102,7 @@ public: void InterpreterFallback(u64 pc, std::size_t num_instructions) override { m_parent.LogBacktrace(m_process); LOG_ERROR(Core_ARM, - "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, + "Unimplemented instruction @ {:#X} for {} instructions (instr = {:08X})", pc, num_instructions, m_memory.Read32(pc)); ReturnException(pc, PrefetchAbort); } @@ -330,6 +330,10 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa // Unsafe optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Unsafe) { config.unsafe_optimizations = true; + if (!Settings::values.cpuopt_unsafe_host_mmu) { + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; + } if (Settings::values.cpuopt_unsafe_unfuse_fma) { config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; } @@ -350,6 +354,10 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa // Curated optimizations if (Settings::values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Auto) { config.unsafe_optimizations = true; +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) + config.fastmem_pointer = std::nullopt; + config.fastmem_exclusive_access = false; +#endif config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_UnfuseFMA; config.fastmem_address_space_bits = 64; config.optimizations |= Dynarmic::OptimizationFlag::Unsafe_IgnoreGlobalMonitor; @@ -366,11 +374,15 @@ std::shared_ptr ArmDynarmic64::MakeJit(Common::PageTable* pa } HaltReason ArmDynarmic64::RunThread(Kernel::KThread* thread) { + ScopedJitExecution sj(thread->GetOwnerProcess()); + m_jit->ClearExclusiveState(); return TranslateHaltReason(m_jit->Run()); } HaltReason ArmDynarmic64::StepThread(Kernel::KThread* thread) { + ScopedJitExecution sj(thread->GetOwnerProcess()); + m_jit->ClearExclusiveState(); return TranslateHaltReason(m_jit->Step()); } @@ -410,6 +422,7 @@ ArmDynarmic64::ArmDynarmic64(System& system, bool uses_wall_clock, Kernel::KProc auto& page_table = process->GetPageTable().GetBasePageTable(); auto& page_table_impl = page_table.GetImpl(); m_jit = MakeJit(&page_table_impl, page_table.GetAddressSpaceWidth()); + ScopedJitExecution::RegisterHandler(); } ArmDynarmic64::~ArmDynarmic64() = default; diff --git a/src/core/arm/dynarmic/dynarmic_cp15.cpp b/src/core/arm/dynarmic/dynarmic_cp15.cpp index c663adda19..e3e2d8339d 100644 --- a/src/core/arm/dynarmic/dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/dynarmic_cp15.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -58,6 +61,8 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 _mm_lfence(); #elif defined(ARCHITECTURE_x86_64) asm volatile("mfence\n\tlfence\n\t" : : : "memory"); +#elif defined(_MSC_VER) && defined(ARCHITECTURE_arm64) + _Memory_barrier(); #elif defined(ARCHITECTURE_arm64) asm volatile("dsb sy\n\t" : : : "memory"); #else @@ -75,6 +80,8 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1 _mm_mfence(); #elif defined(ARCHITECTURE_x86_64) asm volatile("mfence\n\t" : : : "memory"); +#elif defined(_MSC_VER) && defined(ARCHITECTURE_arm64) + _Memory_barrier(); #elif defined(ARCHITECTURE_arm64) asm volatile("dmb sy\n\t" : : : "memory"); #else diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp index 877e8ac3c7..0e0d72fc8a 100644 --- a/src/core/arm/nce/arm_nce.cpp +++ b/src/core/arm/nce/arm_nce.cpp @@ -227,7 +227,7 @@ HaltReason ArmNce::RunThread(Kernel::KThread* thread) { if (auto it = post_handlers.find(m_guest_ctx.pc); it != post_handlers.end()) { hr = ReturnToRunCodeByTrampoline(thread_params, &m_guest_ctx, it->second); } else { - hr = ReturnToRunCodeByExceptionLevelChange(m_thread_id, thread_params); + hr = ReturnToRunCodeByExceptionLevelChange(m_thread_id, thread_params); // Android: Use "process handle SIGUSR2 -n true -p true -s false" (and SIGURG) in LLDB when debugging } // Critical section for thread cleanup diff --git a/src/core/arm/nce/interpreter_visitor.h b/src/core/arm/nce/interpreter_visitor.h index f90d876abb..daae204310 100644 --- a/src/core/arm/nce/interpreter_visitor.h +++ b/src/core/arm/nce/interpreter_visitor.h @@ -1,12 +1,20 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 merryhime // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include #include +#include +#include "core/hle/kernel/k_thread.h" +#include "core/memory.h" +#include "common/logging/log.h" #include "core/arm/nce/visitor_base.h" namespace Core { diff --git a/src/core/arm/nce/patcher.cpp b/src/core/arm/nce/patcher.cpp index b8387ce7cb..9321258ae9 100644 --- a/src/core/arm/nce/patcher.cpp +++ b/src/core/arm/nce/patcher.cpp @@ -11,6 +11,8 @@ #include "core/core.h" #include "core/core_timing.h" #include "core/hle/kernel/svc.h" +#include "core/memory.h" +#include "core/hle/kernel/k_thread.h" namespace Core::NCE { diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index 7f54608e3f..31b122477f 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -27,11 +27,11 @@ template <> struct std::hash { size_t operator()(const PatchCacheKey& key) const { // Simple XOR hash of first few bytes - size_t hash = 0; + size_t hash_ = 0; for (size_t i = 0; i < key.module_id.size(); ++i) { - hash ^= static_cast(key.module_id[i]) << ((i % sizeof(size_t)) * 8); + hash_ ^= static_cast(key.module_id[i]) << ((i % sizeof(size_t)) * 8); } - return hash ^ std::hash{}(key.offset); + return hash_ ^ std::hash{}(key.offset); } }; diff --git a/src/core/core.cpp b/src/core/core.cpp index c2852e66f0..7315f35e0c 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -185,7 +185,7 @@ struct System::Impl { Service::PSC::Time::LocationName name{}; auto new_name = Settings::GetTimeZoneString(Settings::values.time_zone_index.GetValue()); - std::memcpy(name.data(), new_name.data(), std::min(name.size(), new_name.size())); + std::memcpy(name.data(), new_name.data(), (std::min)(name.size(), new_name.size())); timezone_service->SetDeviceLocationName(name); diff --git a/src/core/crypto/aes_util.h b/src/core/crypto/aes_util.h index c2fd587a73..7cc672635e 100644 --- a/src/core/crypto/aes_util.h +++ b/src/core/crypto/aes_util.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,7 +19,7 @@ struct CipherContext; enum class Mode { CTR = 11, ECB = 2, - XTS = 70, + XTS = 74, }; enum class Op { diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index 74b1ca04b1..50945eee91 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -31,6 +34,10 @@ #include "core/hle/service/filesystem/filesystem.h" #include "core/loader/loader.h" +#ifndef MBEDTLS_CMAC_C +#error mbedtls was compiled without CMAC support. Check your USE flags (Gentoo) or contact your package maintainer. +#endif + namespace Core::Crypto { namespace { @@ -38,13 +45,6 @@ constexpr u64 CURRENT_CRYPTO_REVISION = 0x5; using Common::AsArray; -// clang-format off -constexpr std::array eticket_source_hashes{ - AsArray("B71DB271DC338DF380AA2C4335EF8873B1AFD408E80B3582D8719FC81C5E511C"), // eticket_rsa_kek_source - AsArray("E8965A187D30E57869F562D04383C996DE487BBA5761363D2D4D32391866A85C"), // eticket_rsa_kekek_source -}; -// clang-format on - constexpr std::array>, 30> s128_file_id{{ {"eticket_rsa_kek", {S128KeyType::ETicketRSAKek, 0, 0}}, {"eticket_rsa_kek_source", @@ -532,7 +532,7 @@ static std::array MGF1(const std::array& seed) { while (out.size() < target_size) { out.resize(out.size() + 0x20); seed_exp[in_size + 3] = static_cast(i); - mbedtls_sha256_ret(seed_exp.data(), seed_exp.size(), out.data() + out.size() - 0x20, 0); + mbedtls_sha256(seed_exp.data(), seed_exp.size(), out.data() + out.size() - 0x20, 0); ++i; } @@ -1110,81 +1110,25 @@ void KeyManager::DeriveBase() { void KeyManager::DeriveETicket(PartitionDataManager& data, const FileSys::ContentProvider& provider) { - // ETicket keys - const auto es = provider.GetEntry(0x0100000000000033, FileSys::ContentRecordType::Program); - - if (es == nullptr) { + // The emulator no longer derives the ETicket RSA Kek. + // It is now required for the user to provide this key in their keys file. + if (!HasKey(S128KeyType::ETicketRSAKek)) { + LOG_WARNING(Crypto, "ETicket RSA Kek not found, skipping eTicket parsing."); return; } - const auto exefs = es->GetExeFS(); - if (exefs == nullptr) { - return; - } - - const auto main = exefs->GetFile("main"); - if (main == nullptr) { - return; - } - - const auto bytes = main->ReadAllBytes(); - - const auto eticket_kek = FindKeyFromHex16(bytes, eticket_source_hashes[0]); - const auto eticket_kekek = FindKeyFromHex16(bytes, eticket_source_hashes[1]); - - const auto seed3 = data.GetRSAKekSeed3(); - const auto mask0 = data.GetRSAKekMask0(); - - if (eticket_kek != Key128{}) { - SetKey(S128KeyType::Source, eticket_kek, static_cast(SourceKeyType::ETicketKek)); - } - if (eticket_kekek != Key128{}) { - SetKey(S128KeyType::Source, eticket_kekek, - static_cast(SourceKeyType::ETicketKekek)); - } - if (seed3 != Key128{}) { - SetKey(S128KeyType::RSAKek, seed3, static_cast(RSAKekType::Seed3)); - } - if (mask0 != Key128{}) { - SetKey(S128KeyType::RSAKek, mask0, static_cast(RSAKekType::Mask0)); - } - if (eticket_kek == Key128{} || eticket_kekek == Key128{} || seed3 == Key128{} || - mask0 == Key128{}) { - return; - } - - const Key128 rsa_oaep_kek = seed3 ^ mask0; - if (rsa_oaep_kek == Key128{}) { - return; - } - - SetKey(S128KeyType::Source, rsa_oaep_kek, - static_cast(SourceKeyType::RSAOaepKekGeneration)); - - Key128 temp_kek{}; - Key128 temp_kekek{}; - Key128 eticket_final{}; - - // Derive ETicket RSA Kek - AESCipher es_master(GetKey(S128KeyType::Master), Mode::ECB); - es_master.Transcode(rsa_oaep_kek.data(), rsa_oaep_kek.size(), temp_kek.data(), Op::Decrypt); - AESCipher es_kekek(temp_kek, Mode::ECB); - es_kekek.Transcode(eticket_kekek.data(), eticket_kekek.size(), temp_kekek.data(), Op::Decrypt); - AESCipher es_kek(temp_kekek, Mode::ECB); - es_kek.Transcode(eticket_kek.data(), eticket_kek.size(), eticket_final.data(), Op::Decrypt); - - if (eticket_final == Key128{}) { - return; - } - - SetKey(S128KeyType::ETicketRSAKek, eticket_final); - - // Titlekeys + // Decrypt PRODINFO to get the extended kek needed for the RSA keypair. data.DecryptProdInfo(GetBISKey(0)); + // The extended kek is read from the decrypted PRODINFO. eticket_extended_kek = data.GetETicketExtendedKek(); WriteKeyToFile(KeyCategory::Console, "eticket_extended_kek", eticket_extended_kek); + + // Derive the final RSA keypair using the user-provided ETicketRSAKek + // and the extended kek from PRODINFO. DeriveETicketRSAKey(); + + // Load personalized tickets from the NAND. PopulateTickets(); } @@ -1265,22 +1209,6 @@ void KeyManager::PopulateFromPartitionData(PartitionDataManager& data) { encrypted_keyblobs[i]); } - SetKeyWrapped(S128KeyType::Source, data.GetPackage2KeySource(), - static_cast(SourceKeyType::Package2)); - SetKeyWrapped(S128KeyType::Source, data.GetAESKekGenerationSource(), - static_cast(SourceKeyType::AESKekGeneration)); - SetKeyWrapped(S128KeyType::Source, data.GetTitlekekSource(), - static_cast(SourceKeyType::Titlekek)); - SetKeyWrapped(S128KeyType::Source, data.GetMasterKeySource(), - static_cast(SourceKeyType::Master)); - SetKeyWrapped(S128KeyType::Source, data.GetKeyblobMACKeySource(), - static_cast(SourceKeyType::KeyblobMAC)); - - for (size_t i = 0; i < PartitionDataManager::MAX_KEYBLOB_SOURCE_HASH; ++i) { - SetKeyWrapped(S128KeyType::Source, data.GetKeyblobKeySource(i), - static_cast(SourceKeyType::Keyblob), i); - } - if (data.HasFuses()) { SetKeyWrapped(S128KeyType::SecureBoot, data.GetSecureBootKey()); } @@ -1295,13 +1223,6 @@ void KeyManager::PopulateFromPartitionData(PartitionDataManager& data) { } } - const auto masters = data.GetTZMasterKeys(latest_master); - for (size_t i = 0; i < masters.size(); ++i) { - if (masters[i] != Key128{} && !HasKey(S128KeyType::Master, i)) { - SetKey(S128KeyType::Master, masters[i], i); - } - } - DeriveBase(); if (!data.HasPackage2()) @@ -1315,27 +1236,6 @@ void KeyManager::PopulateFromPartitionData(PartitionDataManager& data) { } data.DecryptPackage2(package2_keys, Package2Type::NormalMain); - SetKeyWrapped(S128KeyType::Source, data.GetKeyAreaKeyApplicationSource(), - static_cast(SourceKeyType::KeyAreaKey), - static_cast(KeyAreaKeyType::Application)); - SetKeyWrapped(S128KeyType::Source, data.GetKeyAreaKeyOceanSource(), - static_cast(SourceKeyType::KeyAreaKey), - static_cast(KeyAreaKeyType::Ocean)); - SetKeyWrapped(S128KeyType::Source, data.GetKeyAreaKeySystemSource(), - static_cast(SourceKeyType::KeyAreaKey), - static_cast(KeyAreaKeyType::System)); - SetKeyWrapped(S128KeyType::Source, data.GetSDKekSource(), - static_cast(SourceKeyType::SDKek)); - SetKeyWrapped(S256KeyType::SDKeySource, data.GetSDSaveKeySource(), - static_cast(SDKeyType::Save)); - SetKeyWrapped(S256KeyType::SDKeySource, data.GetSDNCAKeySource(), - static_cast(SDKeyType::NCA)); - SetKeyWrapped(S128KeyType::Source, data.GetHeaderKekSource(), - static_cast(SourceKeyType::HeaderKek)); - SetKeyWrapped(S256KeyType::HeaderSource, data.GetHeaderKeySource()); - SetKeyWrapped(S128KeyType::Source, data.GetAESKeyGenerationSource(), - static_cast(SourceKeyType::AESKeyGeneration)); - DeriveBase(); } diff --git a/src/core/crypto/partition_data_manager.cpp b/src/core/crypto/partition_data_manager.cpp index 4b45e72c43..e185838e57 100644 --- a/src/core/crypto/partition_data_manager.cpp +++ b/src/core/crypto/partition_data_manager.cpp @@ -1,11 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// NOTE TO FUTURE MAINTAINERS: -// When a new version of switch cryptography is released, -// hash the new keyblob source and master key and add the hashes to -// the arrays below. - #include #include #include @@ -46,178 +44,7 @@ struct Package2Header { }; static_assert(sizeof(Package2Header) == 0x200, "Package2Header has incorrect size."); -// clang-format off -constexpr std::array source_hashes{ - AsArray("B24BD293259DBC7AC5D63F88E60C59792498E6FC5443402C7FFE87EE8B61A3F0"), // keyblob_mac_key_source - AsArray("7944862A3A5C31C6720595EFD302245ABD1B54CCDCF33000557681E65C5664A4"), // master_key_source - AsArray("21E2DF100FC9E094DB51B47B9B1D6E94ED379DB8B547955BEF8FE08D8DD35603"), // package2_key_source - AsArray("FC02B9D37B42D7A1452E71444F1F700311D1132E301A83B16062E72A78175085"), // aes_kek_generation_source - AsArray("FBD10056999EDC7ACDB96098E47E2C3606230270D23281E671F0F389FC5BC585"), // aes_key_generation_source - AsArray("C48B619827986C7F4E3081D59DB2B460C84312650E9A8E6B458E53E8CBCA4E87"), // titlekek_source - AsArray("04AD66143C726B2A139FB6B21128B46F56C553B2B3887110304298D8D0092D9E"), // key_area_key_application_source - AsArray("FD434000C8FF2B26F8E9A9D2D2C12F6BE5773CBB9DC86300E1BD99F8EA33A417"), // key_area_key_ocean_source - AsArray("1F17B1FD51AD1C2379B58F152CA4912EC2106441E51722F38700D5937A1162F7"), // key_area_key_system_source - AsArray("6B2ED877C2C52334AC51E59ABFA7EC457F4A7D01E46291E9F2EAA45F011D24B7"), // sd_card_kek_source - AsArray("D482743563D3EA5DCDC3B74E97C9AC8A342164FA041A1DC80F17F6D31E4BC01C"), // sd_card_save_key_source - AsArray("2E751CECF7D93A2B957BD5FFCB082FD038CC2853219DD3092C6DAB9838F5A7CC"), // sd_card_nca_key_source - AsArray("1888CAED5551B3EDE01499E87CE0D86827F80820EFB275921055AA4E2ABDFFC2"), // header_kek_source - AsArray("8F783E46852DF6BE0BA4E19273C4ADBAEE16380043E1B8C418C4089A8BD64AA6"), // header_key_source - AsArray("D1757E52F1AE55FA882EC690BC6F954AC46A83DC22F277F8806BD55577C6EED7"), // rsa_kek_seed3 - AsArray("FC02B9D37B42D7A1452E71444F1F700311D1132E301A83B16062E72A78175085"), // rsa_kek_mask0 -}; -// clang-format on - -// clang-format off -constexpr std::array keyblob_source_hashes{ - AsArray("8A06FE274AC491436791FDB388BCDD3AB9943BD4DEF8094418CDAC150FD73786"), // keyblob_key_source_00 - AsArray("2D5CAEB2521FEF70B47E17D6D0F11F8CE2C1E442A979AD8035832C4E9FBCCC4B"), // keyblob_key_source_01 - AsArray("61C5005E713BAE780641683AF43E5F5C0E03671117F702F401282847D2FC6064"), // keyblob_key_source_02 - AsArray("8E9795928E1C4428E1B78F0BE724D7294D6934689C11B190943923B9D5B85903"), // keyblob_key_source_03 - AsArray("95FA33AF95AFF9D9B61D164655B32710ED8D615D46C7D6CC3CC70481B686B402"), // keyblob_key_source_04 - AsArray("3F5BE7B3C8B1ABD8C10B4B703D44766BA08730562C172A4FE0D6B866B3E2DB3E"), // keyblob_key_source_05 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_06 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_07 - - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_08 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_09 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_0A - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_0B - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_0C - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_0D - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_0E - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_0F - - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_10 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_11 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_12 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_13 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_14 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_15 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_16 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_17 - - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_18 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_19 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_1A - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_1B - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_1C - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_1D - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_1E - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // keyblob_key_source_1F -}; -// clang-format on - -// clang-format off -constexpr std::array master_key_hashes{ - AsArray("0EE359BE3C864BB0782E1D70A718A0342C551EED28C369754F9C4F691BECF7CA"), // master_key_00 - AsArray("4FE707B7E4ABDAF727C894AAF13B1351BFE2AC90D875F73B2E20FA94B9CC661E"), // master_key_01 - AsArray("79277C0237A2252EC3DFAC1F7C359C2B3D121E9DB15BB9AB4C2B4408D2F3AE09"), // master_key_02 - AsArray("4F36C565D13325F65EE134073C6A578FFCB0008E02D69400836844EAB7432754"), // master_key_03 - AsArray("75FF1D95D26113550EE6FCC20ACB58E97EDEB3A2FF52543ED5AEC63BDCC3DA50"), // master_key_04 - AsArray("EBE2BCD6704673EC0F88A187BB2AD9F1CC82B718C389425941BDC194DC46B0DD"), // master_key_05 - AsArray("9497E6779F5D840F2BBA1DE4E95BA1D6F21EFC94717D5AE5CA37D7EC5BD37A19"), // master_key_06 - AsArray("4EC96B8CB01B8DCE382149443430B2B6EBCB2983348AFA04A25E53609DABEDF6"), // master_key_07 - - AsArray("2998E2E23609BC2675FF062A2D64AF5B1B78DFF463B24119D64A1B64F01B2D51"), // master_key_08 - AsArray("9D486A98067C44B37CF173D3BF577891EB6081FF6B4A166347D9DBBF7025076B"), // master_key_09 - AsArray("4EC5A237A75A083A9C5F6CF615601522A7F822D06BD4BA32612C9CEBBB29BD45"), // master_key_0A - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_0B - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_0C - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_0D - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_0E - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_0F - - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_10 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_11 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_12 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_13 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_14 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_15 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_16 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_17 - - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_18 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_19 - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_1A - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_1B - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_1C - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_1D - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_1E - AsArray("0000000000000000000000000000000000000000000000000000000000000000"), // master_key_1F -}; -// clang-format on - -static constexpr u8 CalculateMaxKeyblobSourceHash() { - const auto is_zero = [](const auto& data) { - // TODO: Replace with std::all_of whenever mingw decides to update their - // libraries to include the constexpr variant of it. - for (const auto element : data) { - if (element != 0) { - return false; - } - } - return true; - }; - - for (s8 i = 0x1F; i >= 0; --i) { - if (!is_zero(keyblob_source_hashes[i])) { - return static_cast(i + 1); - } - } - - return 0; -} - -const u8 PartitionDataManager::MAX_KEYBLOB_SOURCE_HASH = CalculateMaxKeyblobSourceHash(); - -template -std::array FindKeyFromHex(const std::vector& binary, - const std::array& hash) { - if (binary.size() < key_size) - return {}; - - std::array temp{}; - for (size_t i = 0; i < binary.size() - key_size; ++i) { - mbedtls_sha256_ret(binary.data() + i, key_size, temp.data(), 0); - - if (temp != hash) - continue; - - std::array out{}; - std::memcpy(out.data(), binary.data() + i, key_size); - return out; - } - - return {}; -} - -std::array FindKeyFromHex16(const std::vector& binary, std::array hash) { - return FindKeyFromHex<0x10>(binary, hash); -} - -static std::array FindEncryptedMasterKeyFromHex(const std::vector& binary, - const Key128& key) { - if (binary.size() < 0x10) - return {}; - - SHA256Hash temp{}; - Key128 dec_temp{}; - std::array out{}; - AESCipher cipher(key, Mode::ECB); - for (size_t i = 0; i < binary.size() - 0x10; ++i) { - cipher.Transcode(binary.data() + i, dec_temp.size(), dec_temp.data(), Op::Decrypt); - mbedtls_sha256_ret(dec_temp.data(), dec_temp.size(), temp.data(), 0); - - for (size_t k = 0; k < out.size(); ++k) { - if (temp == master_key_hashes[k]) { - out[k] = dec_temp; - break; - } - } - } - - return out; -} +const u8 PartitionDataManager::MAX_KEYBLOB_SOURCE_HASH = 32; static FileSys::VirtualFile FindFileInDirWithNames(const FileSys::VirtualDir& dir, const std::string& name) { @@ -284,52 +111,10 @@ std::vector PartitionDataManager::GetSecureMonitor() const { return secure_monitor_bytes; } -std::array PartitionDataManager::GetPackage2KeySource() const { - return FindKeyFromHex(secure_monitor_bytes, source_hashes[2]); -} - -std::array PartitionDataManager::GetAESKekGenerationSource() const { - return FindKeyFromHex(secure_monitor_bytes, source_hashes[3]); -} - -std::array PartitionDataManager::GetTitlekekSource() const { - return FindKeyFromHex(secure_monitor_bytes, source_hashes[5]); -} - -std::array, 32> PartitionDataManager::GetTZMasterKeys( - std::array master_key) const { - return FindEncryptedMasterKeyFromHex(secure_monitor_bytes, master_key); -} - -std::array PartitionDataManager::GetRSAKekSeed3() const { - return FindKeyFromHex(secure_monitor_bytes, source_hashes[14]); -} - -std::array PartitionDataManager::GetRSAKekMask0() const { - return FindKeyFromHex(secure_monitor_bytes, source_hashes[15]); -} - std::vector PartitionDataManager::GetPackage1Decrypted() const { return package1_decrypted_bytes; } -std::array PartitionDataManager::GetMasterKeySource() const { - return FindKeyFromHex(package1_decrypted_bytes, source_hashes[1]); -} - -std::array PartitionDataManager::GetKeyblobMACKeySource() const { - return FindKeyFromHex(package1_decrypted_bytes, source_hashes[0]); -} - -std::array PartitionDataManager::GetKeyblobKeySource(std::size_t revision) const { - if (keyblob_source_hashes[revision] == SHA256Hash{}) { - LOG_WARNING(Crypto, - "No keyblob source hash for crypto revision {:02X}! Cannot derive keys...", - revision); - } - return FindKeyFromHex(package1_decrypted_bytes, keyblob_source_hashes[revision]); -} - bool PartitionDataManager::HasFuses() const { return fuses != nullptr; } @@ -441,46 +226,10 @@ const std::vector& PartitionDataManager::GetPackage2FSDecompressed(Package2T return package2_fs.at(static_cast(type)); } -std::array PartitionDataManager::GetKeyAreaKeyApplicationSource(Package2Type type) const { - return FindKeyFromHex(package2_fs.at(static_cast(type)), source_hashes[6]); -} - -std::array PartitionDataManager::GetKeyAreaKeyOceanSource(Package2Type type) const { - return FindKeyFromHex(package2_fs.at(static_cast(type)), source_hashes[7]); -} - -std::array PartitionDataManager::GetKeyAreaKeySystemSource(Package2Type type) const { - return FindKeyFromHex(package2_fs.at(static_cast(type)), source_hashes[8]); -} - -std::array PartitionDataManager::GetSDKekSource(Package2Type type) const { - return FindKeyFromHex(package2_fs.at(static_cast(type)), source_hashes[9]); -} - -std::array PartitionDataManager::GetSDSaveKeySource(Package2Type type) const { - return FindKeyFromHex<0x20>(package2_fs.at(static_cast(type)), source_hashes[10]); -} - -std::array PartitionDataManager::GetSDNCAKeySource(Package2Type type) const { - return FindKeyFromHex<0x20>(package2_fs.at(static_cast(type)), source_hashes[11]); -} - -std::array PartitionDataManager::GetHeaderKekSource(Package2Type type) const { - return FindKeyFromHex(package2_fs.at(static_cast(type)), source_hashes[12]); -} - -std::array PartitionDataManager::GetHeaderKeySource(Package2Type type) const { - return FindKeyFromHex<0x20>(package2_fs.at(static_cast(type)), source_hashes[13]); -} - const std::vector& PartitionDataManager::GetPackage2SPLDecompressed(Package2Type type) const { return package2_spl.at(static_cast(type)); } -std::array PartitionDataManager::GetAESKeyGenerationSource(Package2Type type) const { - return FindKeyFromHex(package2_spl.at(static_cast(type)), source_hashes[4]); -} - bool PartitionDataManager::HasProdInfo() const { return prodinfo != nullptr; } @@ -506,4 +255,4 @@ std::array PartitionDataManager::GetETicketExtendedKek() const { prodinfo_decrypted->Read(out.data(), out.size(), 0x3890); return out; } -} // namespace Core::Crypto +} // namespace Core::Crypto \ No newline at end of file diff --git a/src/core/crypto/partition_data_manager.h b/src/core/crypto/partition_data_manager.h index 4354a21e6a..2a01aed228 100644 --- a/src/core/crypto/partition_data_manager.h +++ b/src/core/crypto/partition_data_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -36,16 +39,7 @@ public: EncryptedKeyBlob GetEncryptedKeyblob(std::size_t index) const; EncryptedKeyBlobs GetEncryptedKeyblobs() const; std::vector GetSecureMonitor() const; - std::array GetPackage2KeySource() const; - std::array GetAESKekGenerationSource() const; - std::array GetTitlekekSource() const; - std::array, 0x20> GetTZMasterKeys(std::array master_key) const; - std::array GetRSAKekSeed3() const; - std::array GetRSAKekMask0() const; std::vector GetPackage1Decrypted() const; - std::array GetMasterKeySource() const; - std::array GetKeyblobMACKeySource() const; - std::array GetKeyblobKeySource(std::size_t revision) const; // Fuses bool HasFuses() const; @@ -63,21 +57,8 @@ public: Package2Type type); const std::vector& GetPackage2FSDecompressed( Package2Type type = Package2Type::NormalMain) const; - std::array GetKeyAreaKeyApplicationSource( - Package2Type type = Package2Type::NormalMain) const; - std::array GetKeyAreaKeyOceanSource( - Package2Type type = Package2Type::NormalMain) const; - std::array GetKeyAreaKeySystemSource( - Package2Type type = Package2Type::NormalMain) const; - std::array GetSDKekSource(Package2Type type = Package2Type::NormalMain) const; - std::array GetSDSaveKeySource(Package2Type type = Package2Type::NormalMain) const; - std::array GetSDNCAKeySource(Package2Type type = Package2Type::NormalMain) const; - std::array GetHeaderKekSource(Package2Type type = Package2Type::NormalMain) const; - std::array GetHeaderKeySource(Package2Type type = Package2Type::NormalMain) const; const std::vector& GetPackage2SPLDecompressed( Package2Type type = Package2Type::NormalMain) const; - std::array GetAESKeyGenerationSource( - Package2Type type = Package2Type::NormalMain) const; // PRODINFO bool HasProdInfo() const; @@ -104,6 +85,4 @@ private: std::array, 6> package2_spl; }; -std::array FindKeyFromHex16(const std::vector& binary, std::array hash); - -} // namespace Core::Crypto +} // namespace Core::Crypto \ No newline at end of file diff --git a/src/core/crypto/xts_encryption_layer.cpp b/src/core/crypto/xts_encryption_layer.cpp index b60303412b..36cc501b90 100644 --- a/src/core/crypto/xts_encryption_layer.cpp +++ b/src/core/crypto/xts_encryption_layer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -34,8 +37,8 @@ std::size_t XTSEncryptionLayer::Read(u8* data, std::size_t length, std::size_t o buffer.resize(XTS_SECTOR_SIZE); cipher.XTSTranscode(buffer.data(), buffer.size(), buffer.data(), offset / XTS_SECTOR_SIZE, XTS_SECTOR_SIZE, Op::Decrypt); - std::memcpy(data, buffer.data(), std::min(buffer.size(), length)); - return std::min(buffer.size(), length); + std::memcpy(data, buffer.data(), (std::min)(buffer.size(), length)); + return (std::min)(buffer.size(), length); } // offset does not fall on block boundary (0x4000) diff --git a/src/core/debugger/debugger.cpp b/src/core/debugger/debugger.cpp index 7fe22fdce2..1c86b38bf5 100644 --- a/src/core/debugger/debugger.cpp +++ b/src/core/debugger/debugger.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include -#if BOOST_VERSION > 108300 && (!defined(_WINDOWS) && !defined(ANDROID)) || defined(YUZU_BOOST_v1) +#if BOOST_VERSION > 108400 && (!defined(_WINDOWS) && !defined(ANDROID)) || defined(YUZU_BOOST_v1) #define USE_BOOST_v1 #endif diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp index fcb5787147..16c42bf175 100644 --- a/src/core/debugger/gdbstub.cpp +++ b/src/core/debugger/gdbstub.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -664,7 +667,7 @@ void GDBStub::HandleRcmd(const std::vector& command) { if (svc_mem_info.state != Kernel::Svc::MemoryState::Inaccessible || svc_mem_info.base_address + svc_mem_info.size - 1 != - std::numeric_limits::max()) { + (std::numeric_limits::max)()) { const char* state = GetMemoryStateName(svc_mem_info.state); const char* perm = GetMemoryPermissionString(svc_mem_info); const char l = True(svc_mem_info.attribute & MemoryAttribute::Locked) ? 'L' : '-'; @@ -710,7 +713,7 @@ std::vector::const_iterator GDBStub::CommandEnd() const { const auto end{std::find(current_command.begin(), current_command.end(), GDB_STUB_END)}; // Require the checksum to be present - return std::min(end + 2, current_command.end()); + return (std::min)(end + 2, current_command.end()); } std::optional GDBStub::DetachCommand() { diff --git a/src/core/debugger/gdbstub_arch.cpp b/src/core/debugger/gdbstub_arch.cpp index 452f565bec..fec75c3432 100644 --- a/src/core/debugger/gdbstub_arch.cpp +++ b/src/core/debugger/gdbstub_arch.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ static T HexToValue(std::string_view hex) { static_assert(std::is_trivially_copyable_v); T value{}; const auto mem{Common::HexStringToVector(hex, false)}; - std::memcpy(&value, mem.data(), std::min(mem.size(), sizeof(T))); + std::memcpy(&value, mem.data(), (std::min)(mem.size(), sizeof(T))); return value; } diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index f104d495bb..52dff5df9a 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc @@ -388,7 +388,7 @@ void DeviceMemoryManager::WalkBlock(DAddr addr, std::size_t size, auto o while (remaining_size) { const size_t next_pages = static_cast(continuity_tracker[page_index]); const std::size_t copy_amount = - std::min((next_pages << Memory::YUZU_PAGEBITS) - page_offset, remaining_size); + (std::min)((next_pages << Memory::YUZU_PAGEBITS) - page_offset, remaining_size); const auto current_vaddr = static_cast((page_index << Memory::YUZU_PAGEBITS) + page_offset); SCOPE_EXIT{ diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp index 6652523589..4e3313f83c 100644 --- a/src/core/file_sys/content_archive.cpp +++ b/src/core/file_sys/content_archive.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "core/crypto/aes_util.h" #include "core/crypto/ctr_encryption_layer.h" #include "core/crypto/key_manager.h" @@ -34,13 +37,7 @@ NCA::NCA(VirtualFile file_, const NCA* base_nca) } reader = std::make_shared(); - if (Result rc = - reader->Initialize(file, GetCryptoConfiguration(), GetNcaCompressionConfiguration()); - R_FAILED(rc)) { - if (rc != ResultInvalidNcaSignature) { - LOG_ERROR(Loader, "File reader errored out during header read: {:#x}", - rc.GetInnerValue()); - } + if (Result rc = reader->Initialize(file, GetCryptoConfiguration(), GetNcaCompressionConfiguration()); R_FAILED(rc)) { status = Loader::ResultStatus::ErrorBadNCAHeader; return; } @@ -84,10 +81,7 @@ NCA::NCA(VirtualFile file_, const NCA* base_nca) std::vector filesystems(fs_count); for (s32 i = 0; i < fs_count; i++) { NcaFsHeaderReader header_reader; - const Result rc = fs.OpenStorage(&filesystems[i], &header_reader, i); - if (R_FAILED(rc)) { - LOG_ERROR(Loader, "File reader errored out during read of section {}: {:#x}", i, - rc.GetInnerValue()); + if (Result rc = fs.OpenStorage(&filesystems[i], &header_reader, i); R_FAILED(rc)) { status = Loader::ResultStatus::ErrorBadNCAHeader; return; } diff --git a/src/core/file_sys/fs_path_utility.h b/src/core/file_sys/fs_path_utility.h index cdfd8c7729..d0060c4fc6 100644 --- a/src/core/file_sys/fs_path_utility.h +++ b/src/core/file_sys/fs_path_utility.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -683,7 +686,7 @@ public: const auto max_mount_len = out_mount_name_buffer_size == 0 ? MountNameLengthMax + 1 - : std::min(MountNameLengthMax + 1, out_mount_name_buffer_size); + : (std::min)(MountNameLengthMax + 1, out_mount_name_buffer_size); // Parse the path until we see a drive separator size_t mount_len = 0; diff --git a/src/core/file_sys/fsa/fs_i_directory.h b/src/core/file_sys/fsa/fs_i_directory.h index c8e895eab0..8f28314860 100644 --- a/src/core/file_sys/fsa/fs_i_directory.h +++ b/src/core/file_sys/fsa/fs_i_directory.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -48,7 +51,7 @@ public: private: Result DoRead(s64* out_count, DirectoryEntry* out_entries, s64 max_entries) { const u64 actual_entries = - std::min(static_cast(max_entries), entries.size() - next_entry_index); + (std::min)(static_cast(max_entries), entries.size() - next_entry_index); const auto* begin = reinterpret_cast(entries.data() + next_entry_index); const auto* end = reinterpret_cast(entries.data() + next_entry_index + actual_entries); const auto range_size = static_cast(std::distance(begin, end)); diff --git a/src/core/file_sys/fsa/fs_i_file.h b/src/core/file_sys/fsa/fs_i_file.h index 1188ae8ca7..8b70185522 100644 --- a/src/core/file_sys/fsa/fs_i_file.h +++ b/src/core/file_sys/fsa/fs_i_file.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -93,7 +96,7 @@ protected: R_TRY(this->DoGetSize(std::addressof(file_size))); R_UNLESS(offset <= file_size, ResultOutOfRange); - *out = static_cast(std::min(file_size - offset, static_cast(size))); + *out = static_cast((std::min)(file_size - offset, static_cast(size))); R_SUCCEED(); } diff --git a/src/core/file_sys/fssystem/fs_types.h b/src/core/file_sys/fssystem/fs_types.h index 43aeaf447b..f11b7f1dae 100644 --- a/src/core/file_sys/fssystem/fs_types.h +++ b/src/core/file_sys/fssystem/fs_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp b/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp index bc1cddbb0c..506624669b 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp +++ b/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -213,7 +216,7 @@ size_t AesCtrCounterExtendedStorage::Read(u8* buffer, size_t size, size_t offset // Determine how much is left. const auto remaining_size = end_offset - cur_offset; - const auto cur_size = static_cast(std::min(remaining_size, data_size)); + const auto cur_size = static_cast((std::min)(remaining_size, data_size)); ASSERT(cur_size <= size); // If necessary, perform decryption. diff --git a/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.cpp b/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.cpp index b65aca18d9..aaf7788801 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.cpp +++ b/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.cpp @@ -1,10 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/alignment.h" #include "common/swap.h" #include "core/file_sys/fssystem/fssystem_aes_ctr_storage.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" #include "core/file_sys/fssystem/fssystem_utility.h" namespace FileSys { @@ -76,13 +78,6 @@ size_t AesCtrStorage::Write(const u8* buffer, size_t size, size_t offset) { ASSERT(Common::IsAligned(offset, BlockSize)); ASSERT(Common::IsAligned(size, BlockSize)); - // Get a pooled buffer. - PooledBuffer pooled_buffer; - const bool use_work_buffer = true; - if (use_work_buffer) { - pooled_buffer.Allocate(size, BlockSize); - } - // Setup the counter. std::array ctr; std::memcpy(ctr.data(), m_iv.data(), IvSize); @@ -91,25 +86,20 @@ size_t AesCtrStorage::Write(const u8* buffer, size_t size, size_t offset) { // Loop until all data is written. size_t remaining = size; s64 cur_offset = 0; + + // Get a pooled buffer. + std::vector pooled_buffer(BlockSize); while (remaining > 0) { // Determine data we're writing and where. - const size_t write_size = - use_work_buffer ? std::min(pooled_buffer.GetSize(), remaining) : remaining; - - void* write_buf; - if (use_work_buffer) { - write_buf = pooled_buffer.GetBuffer(); - } else { - write_buf = const_cast(buffer); - } + const size_t write_size = std::min(pooled_buffer.size(), remaining); + u8* write_buf = reinterpret_cast(pooled_buffer.data()); // Encrypt the data. m_cipher->SetIV(ctr); - m_cipher->Transcode(buffer, write_size, reinterpret_cast(write_buf), - Core::Crypto::Op::Encrypt); + m_cipher->Transcode(buffer, write_size, write_buf, Core::Crypto::Op::Encrypt); // Write the encrypted data. - m_base_storage->Write(reinterpret_cast(write_buf), write_size, offset + cur_offset); + m_base_storage->Write(write_buf, write_size, offset + cur_offset); // Advance. cur_offset += write_size; diff --git a/src/core/file_sys/fssystem/fssystem_aes_xts_storage.cpp b/src/core/file_sys/fssystem/fssystem_aes_xts_storage.cpp index efc5aa0b12..9e7a104c89 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_xts_storage.cpp +++ b/src/core/file_sys/fssystem/fssystem_aes_xts_storage.cpp @@ -1,11 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/alignment.h" #include "common/swap.h" -#include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fssystem_aes_xts_storage.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" #include "core/file_sys/fssystem/fssystem_utility.h" namespace FileSys { @@ -65,33 +66,30 @@ size_t AesXtsStorage::Read(u8* buffer, size_t size, size_t offset) const { // Determine the size of the pre-data read. const size_t skip_size = static_cast(offset - Common::AlignDown(offset, m_block_size)); - const size_t data_size = std::min(size, m_block_size - skip_size); + const size_t data_size = (std::min)(size, m_block_size - skip_size); // Decrypt into a pooled buffer. { - PooledBuffer tmp_buf(m_block_size, m_block_size); - ASSERT(tmp_buf.GetSize() >= m_block_size); - - std::memset(tmp_buf.GetBuffer(), 0, skip_size); - std::memcpy(tmp_buf.GetBuffer() + skip_size, buffer, data_size); + std::vector tmp_buf(m_block_size, 0); + std::memcpy(tmp_buf.data() + skip_size, buffer, data_size); m_cipher->SetIV(ctr); - m_cipher->Transcode(tmp_buf.GetBuffer(), m_block_size, tmp_buf.GetBuffer(), + m_cipher->Transcode(tmp_buf.data(), m_block_size, tmp_buf.data(), Core::Crypto::Op::Decrypt); - std::memcpy(buffer, tmp_buf.GetBuffer() + skip_size, data_size); + std::memcpy(buffer, tmp_buf.data() + skip_size, data_size); } AddCounter(ctr.data(), IvSize, 1); processed_size += data_size; - ASSERT(processed_size == std::min(size, m_block_size - skip_size)); + ASSERT(processed_size == (std::min)(size, m_block_size - skip_size)); } // Decrypt aligned chunks. char* cur = reinterpret_cast(buffer) + processed_size; size_t remaining = size - processed_size; while (remaining > 0) { - const size_t cur_size = std::min(m_block_size, remaining); + const size_t cur_size = (std::min)(m_block_size, remaining); m_cipher->SetIV(ctr); m_cipher->Transcode(cur, cur_size, cur, Core::Crypto::Op::Decrypt); diff --git a/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h b/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h index f96691d03d..60a6d24435 100644 --- a/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h +++ b/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h @@ -1,13 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "common/alignment.h" -#include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fs_i_storage.h" #include "core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" namespace FileSys { @@ -89,10 +90,11 @@ private: VirtualFile m_base_storage; s64 m_base_storage_size; size_t m_data_align; + mutable std::vector work_buffer; public: explicit AlignmentMatchingStoragePooledBuffer(VirtualFile bs, size_t da) - : m_base_storage(std::move(bs)), m_data_align(da) { + : m_base_storage(std::move(bs)), m_data_align(da), work_buffer(da) { ASSERT(Common::IsPowerOfTwo(da)); } @@ -104,16 +106,10 @@ public: // Validate arguments. ASSERT(buffer != nullptr); - s64 bs_size = this->GetSize(); ASSERT(R_SUCCEEDED(IStorage::CheckAccessRange(offset, size, bs_size))); - - // Allocate a pooled buffer. - PooledBuffer pooled_buffer; - pooled_buffer.AllocateParticularlyLarge(m_data_align, m_data_align); - - return AlignmentMatchingStorageImpl::Read(m_base_storage, pooled_buffer.GetBuffer(), - pooled_buffer.GetSize(), m_data_align, + return AlignmentMatchingStorageImpl::Read(m_base_storage, work_buffer.data(), + work_buffer.size(), m_data_align, BufferAlign, offset, buffer, size); } @@ -125,16 +121,10 @@ public: // Validate arguments. ASSERT(buffer != nullptr); - s64 bs_size = this->GetSize(); ASSERT(R_SUCCEEDED(IStorage::CheckAccessRange(offset, size, bs_size))); - - // Allocate a pooled buffer. - PooledBuffer pooled_buffer; - pooled_buffer.AllocateParticularlyLarge(m_data_align, m_data_align); - - return AlignmentMatchingStorageImpl::Write(m_base_storage, pooled_buffer.GetBuffer(), - pooled_buffer.GetSize(), m_data_align, + return AlignmentMatchingStorageImpl::Write(m_base_storage, work_buffer.data(), + work_buffer.size(), m_data_align, BufferAlign, offset, buffer, size); } diff --git a/src/core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.cpp b/src/core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.cpp index 641c888aed..322e6e05f2 100644 --- a/src/core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.cpp +++ b/src/core/file_sys/fssystem/fssystem_alignment_matching_storage_impl.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -104,7 +107,7 @@ size_t AlignmentMatchingStorageImpl::Read(VirtualFile base_storage, char* work_b while (remaining_tail_size > 0) { const auto aligned_tail_offset = Common::AlignDown(tail_offset, data_alignment); const auto cur_size = - std::min(static_cast(aligned_tail_offset + data_alignment - tail_offset), + (std::min)(static_cast(aligned_tail_offset + data_alignment - tail_offset), remaining_tail_size); base_storage->Read(reinterpret_cast(work_buf), data_alignment, aligned_tail_offset); @@ -186,7 +189,7 @@ size_t AlignmentMatchingStorageImpl::Write(VirtualFile base_storage, char* work_ const auto aligned_tail_offset = Common::AlignDown(tail_offset, data_alignment); const auto cur_size = - std::min(static_cast(aligned_tail_offset + data_alignment - tail_offset), + (std::min)(static_cast(aligned_tail_offset + data_alignment - tail_offset), remaining_tail_size); base_storage->Read(reinterpret_cast(work_buf), data_alignment, aligned_tail_offset); diff --git a/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp b/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp index af8541009e..ce3b62f26d 100644 --- a/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp +++ b/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp @@ -1,10 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fssystem_bucket_tree.h" #include "core/file_sys/fssystem/fssystem_bucket_tree_utils.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" namespace FileSys { @@ -233,6 +235,7 @@ Result BucketTree::Initialize(VirtualFile node_storage, VirtualFile entry_storag void BucketTree::Initialize(size_t node_size, s64 end_offset) { ASSERT(NodeSizeMin <= node_size && node_size <= NodeSizeMax); ASSERT(Common::IsPowerOfTwo(node_size)); + ASSERT(end_offset > 0); ASSERT(!this->IsInitialized()); @@ -461,16 +464,8 @@ Result BucketTree::Visitor::Find(s64 virtual_address) { } Result BucketTree::Visitor::FindEntrySet(s32* out_index, s64 virtual_address, s32 node_index) { - const auto node_size = m_tree->m_node_size; - - PooledBuffer pool(node_size, 1); - if (node_size <= pool.GetSize()) { - R_RETURN( - this->FindEntrySetWithBuffer(out_index, virtual_address, node_index, pool.GetBuffer())); - } else { - pool.Deallocate(); - R_RETURN(this->FindEntrySetWithoutBuffer(out_index, virtual_address, node_index)); - } + std::vector pool(m_tree->m_node_size); + R_RETURN(FindEntrySetWithBuffer(out_index, virtual_address, node_index, pool.data())); } Result BucketTree::Visitor::FindEntrySetWithBuffer(s32* out_index, s64 virtual_address, @@ -521,15 +516,8 @@ Result BucketTree::Visitor::FindEntrySetWithoutBuffer(s32* out_index, s64 virtua } Result BucketTree::Visitor::FindEntry(s64 virtual_address, s32 entry_set_index) { - const auto entry_set_size = m_tree->m_node_size; - - PooledBuffer pool(entry_set_size, 1); - if (entry_set_size <= pool.GetSize()) { - R_RETURN(this->FindEntryWithBuffer(virtual_address, entry_set_index, pool.GetBuffer())); - } else { - pool.Deallocate(); - R_RETURN(this->FindEntryWithoutBuffer(virtual_address, entry_set_index)); - } + std::vector pool(m_tree->m_node_size); + R_RETURN(FindEntryWithBuffer(virtual_address, entry_set_index, pool.data())); } Result BucketTree::Visitor::FindEntryWithBuffer(s64 virtual_address, s32 entry_set_index, diff --git a/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h b/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h index 030b2916b0..fac6c37214 100644 --- a/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h +++ b/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,6 @@ #include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fssystem_bucket_tree.h" #include "core/file_sys/fssystem/fssystem_bucket_tree_utils.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" namespace FileSys { @@ -35,23 +37,19 @@ Result BucketTree::ScanContinuousReading(ContinuousReadingInfo* out_info, R_UNLESS(entry.GetVirtualOffset() <= cur_offset, ResultOutOfRange); // Create a pooled buffer for our scan. - PooledBuffer pool(m_node_size, 1); - char* buffer = nullptr; - + std::vector pool(m_node_size); s64 entry_storage_size = m_entry_storage->GetSize(); // Read the node. - if (m_node_size <= pool.GetSize()) { - buffer = pool.GetBuffer(); - const auto ofs = param.entry_set.index * static_cast(m_node_size); - R_UNLESS(m_node_size + ofs <= static_cast(entry_storage_size), - ResultInvalidBucketTreeNodeEntryCount); + u8* buffer = reinterpret_cast(pool.data()); + const auto ofs = param.entry_set.index * s64(m_node_size); + R_UNLESS(m_node_size + ofs <= size_t(entry_storage_size), + ResultInvalidBucketTreeNodeEntryCount); - m_entry_storage->Read(reinterpret_cast(buffer), m_node_size, ofs); - } + m_entry_storage->Read(buffer, m_node_size, ofs); // Calculate extents. - const auto end_offset = cur_offset + static_cast(param.size); + const auto end_offset = cur_offset + s64(param.size); s64 phys_offset = entry.GetPhysicalOffset(); // Start merge tracking. @@ -76,14 +74,8 @@ Result BucketTree::ScanContinuousReading(ContinuousReadingInfo* out_info, s64 next_entry_offset; if (entry_index + 1 < entry_count) { - if (buffer != nullptr) { - const auto ofs = impl::GetBucketTreeEntryOffset(0, m_entry_size, entry_index + 1); - std::memcpy(std::addressof(next_entry), buffer + ofs, m_entry_size); - } else { - const auto ofs = impl::GetBucketTreeEntryOffset(param.entry_set.index, m_node_size, - m_entry_size, entry_index + 1); - m_entry_storage->ReadObject(std::addressof(next_entry), ofs); - } + const auto offset = impl::GetBucketTreeEntryOffset(0, m_entry_size, entry_index + 1); + std::memcpy(std::addressof(next_entry), buffer + offset, m_entry_size); next_entry_offset = next_entry.GetVirtualOffset(); R_UNLESS(param.offsets.IsInclude(next_entry_offset), ResultInvalidIndirectEntryOffset); diff --git a/src/core/file_sys/fssystem/fssystem_compressed_storage.h b/src/core/file_sys/fssystem/fssystem_compressed_storage.h index 74c98630ec..223d51647e 100644 --- a/src/core/file_sys/fssystem/fssystem_compressed_storage.h +++ b/src/core/file_sys/fssystem/fssystem_compressed_storage.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,8 +12,6 @@ #include "core/file_sys/fssystem/fs_i_storage.h" #include "core/file_sys/fssystem/fssystem_bucket_tree.h" #include "core/file_sys/fssystem/fssystem_compression_common.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" -#include "core/file_sys/vfs/vfs.h" namespace FileSys { @@ -317,23 +318,11 @@ private: R_SUCCEED_IF(entry_count == 0); // Get the remaining size in a convenient form. - const size_t total_required_size = - static_cast(required_access_physical_size); + const size_t total_required_size = size_t(required_access_physical_size); // Perform the read based on whether we need to allocate a buffer. if (will_allocate_pooled_buffer) { - // Allocate a pooled buffer. - PooledBuffer pooled_buffer; - if (pooled_buffer.GetAllocatableSizeMax() >= total_required_size) { - pooled_buffer.Allocate(total_required_size, m_block_size_max); - } else { - pooled_buffer.AllocateParticularlyLarge( - std::min( - total_required_size, - PooledBuffer::GetAllocatableParticularlyLargeSizeMax()), - m_block_size_max); - } - + std::vector pooled_buffer(std::max(m_block_size_max, total_required_size)); // Read each of the entries. for (s32 entry_idx = 0; entry_idx < entry_count; ++entry_idx) { // Determine the current read size. @@ -342,13 +331,13 @@ private: if (const size_t target_entry_size = static_cast(entries[entry_idx].physical_size) + static_cast(entries[entry_idx].gap_from_prev); - target_entry_size <= pooled_buffer.GetSize()) { + target_entry_size <= pooled_buffer.size()) { // We'll be using the pooled buffer. will_use_pooled_buffer = true; // Determine how much we can read. const size_t max_size = std::min( - required_access_physical_size, pooled_buffer.GetSize()); + required_access_physical_size, pooled_buffer.size()); size_t read_size = 0; for (auto n = entry_idx; n < entry_count; ++n) { @@ -376,7 +365,7 @@ private: // Perform the read based on whether or not we'll use the pooled buffer. if (will_use_pooled_buffer) { // Read the compressed data into the pooled buffer. - auto* const buffer = pooled_buffer.GetBuffer(); + auto* const buffer = pooled_buffer.data(); m_data_storage->Read(reinterpret_cast(buffer), cur_read_size, required_access_physical_offset); @@ -863,11 +852,9 @@ private: static_cast(unaligned_range->virtual_size)); // Get a pooled buffer for our read. - PooledBuffer pooled_buffer; - pooled_buffer.Allocate(size_buffer_required, size_buffer_required); - + std::vector pooled_buffer(size_buffer_required); // Perform read. - Result rc = read_impl(pooled_buffer.GetBuffer(), size_buffer_required); + Result rc = read_impl(pooled_buffer.data(), size_buffer_required); if (R_FAILED(rc)) { R_THROW(rc); } @@ -876,8 +863,7 @@ private: const size_t skip_size = cur_offset - unaligned_range->virtual_offset; const size_t copy_size = std::min( cur_size, unaligned_range->GetEndVirtualOffset() - cur_offset); - - std::memcpy(cur_dst, pooled_buffer.GetBuffer() + skip_size, copy_size); + std::memcpy(cur_dst, pooled_buffer.data() + skip_size, copy_size); // Advance. cur_dst += copy_size; diff --git a/src/core/file_sys/fssystem/fssystem_crypto_configuration.cpp b/src/core/file_sys/fssystem/fssystem_crypto_configuration.cpp index a4f0cde281..073508a18b 100644 --- a/src/core/file_sys/fssystem/fssystem_crypto_configuration.cpp +++ b/src/core/file_sys/fssystem/fssystem_crypto_configuration.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,12 +32,12 @@ void GenerateKey(void* dst_key, size_t dst_key_size, const void* src_key, size_t key_type == static_cast(KeyType::NcaHeaderKey2)) { const s32 key_index = static_cast(KeyType::NcaHeaderKey2) == key_type; const auto key = instance.GetKey(Core::Crypto::S256KeyType::Header); - std::memcpy(dst_key, key.data() + key_index * 0x10, std::min(dst_key_size, key.size() / 2)); + std::memcpy(dst_key, key.data() + key_index * 0x10, (std::min)(dst_key_size, key.size() / 2)); return; } const s32 key_generation = - std::max(key_type / NcaCryptoConfiguration::KeyAreaEncryptionKeyIndexCount, 1) - 1; + (std::max)(key_type / NcaCryptoConfiguration::KeyAreaEncryptionKeyIndexCount, 1) - 1; const s32 key_index = key_type % NcaCryptoConfiguration::KeyAreaEncryptionKeyIndexCount; Core::Crypto::AESCipher cipher( diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp b/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp index a68fd973c9..e8669a4a7d 100644 --- a/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.cpp @@ -5,23 +5,10 @@ #include "common/scope_exit.h" #include "core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.h" +#include + namespace FileSys { -namespace { - -s32 Log2(s32 value) { - ASSERT(value > 0); - ASSERT(Common::IsPowerOfTwo(value)); - - s32 log = 0; - while ((value >>= 1) > 0) { - ++log; - } - return log; -} - -} // namespace - Result HierarchicalSha256Storage::Initialize(VirtualFile* base_storages, s32 layer_count, size_t htbs, void* hash_buf, size_t hash_buf_size) { // Validate preconditions. @@ -31,7 +18,8 @@ Result HierarchicalSha256Storage::Initialize(VirtualFile* base_storages, s32 lay // Set size tracking members. m_hash_target_block_size = static_cast(htbs); - m_log_size_ratio = Log2(m_hash_target_block_size / HashSize); + m_log_size_ratio = + static_cast(std::log2(static_cast(m_hash_target_block_size) / HashSize)); // Get the base storage size. m_base_storage_size = base_storages[2]->GetSize(); diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.cpp b/src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.cpp new file mode 100644 index 0000000000..d58f2ee9be --- /dev/null +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.cpp @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "common/alignment.h" +#include "common/scope_exit.h" +#include "core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h" + +#include + +namespace FileSys { + +Result HierarchicalSha3Storage::Initialize(VirtualFile* base_storages, s32 layer_count, size_t htbs, + void* hash_buf, size_t hash_buf_size) { + ASSERT(layer_count == LayerCount); + ASSERT(Common::IsPowerOfTwo(htbs)); + ASSERT(hash_buf != nullptr); + + m_hash_target_block_size = static_cast(htbs); + m_log_size_ratio = + static_cast(std::log2(static_cast(m_hash_target_block_size) / HashSize)); + + m_base_storage_size = base_storages[2]->GetSize(); + { + auto size_guard = SCOPE_GUARD { + m_base_storage_size = 0; + }; + R_UNLESS(m_base_storage_size <= static_cast(HashSize) + << m_log_size_ratio << m_log_size_ratio, + ResultHierarchicalSha256BaseStorageTooLarge); + size_guard.Cancel(); + } + + m_base_storage = base_storages[2]; + m_hash_buffer = static_cast(hash_buf); + m_hash_buffer_size = hash_buf_size; + + std::array master_hash{}; + base_storages[0]->ReadObject(std::addressof(master_hash)); + + s64 hash_storage_size = base_storages[1]->GetSize(); + ASSERT(Common::IsAligned(hash_storage_size, HashSize)); + ASSERT(hash_storage_size <= m_hash_target_block_size); + ASSERT(hash_storage_size <= static_cast(m_hash_buffer_size)); + + base_storages[1]->Read(reinterpret_cast(m_hash_buffer), + static_cast(hash_storage_size), 0); + R_SUCCEED(); +} + +size_t HierarchicalSha3Storage::Read(u8* buffer, size_t size, size_t offset) const { + if (size == 0) + return size; + ASSERT(buffer != nullptr); + return m_base_storage->Read(buffer, size, offset); +} + +} // namespace FileSys diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h b/src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h new file mode 100644 index 0000000000..2db7bb28e1 --- /dev/null +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +#include "core/file_sys/errors.h" +#include "core/file_sys/fssystem/fs_i_storage.h" +#include "core/file_sys/vfs/vfs.h" + +namespace FileSys { + +class HierarchicalSha3Storage : public IReadOnlyStorage { + YUZU_NON_COPYABLE(HierarchicalSha3Storage); + YUZU_NON_MOVEABLE(HierarchicalSha3Storage); + +public: + static constexpr s32 LayerCount = 3; + static constexpr size_t HashSize = 256 / 8; // SHA3-256 + +public: + HierarchicalSha3Storage() : m_mutex() {} + + Result Initialize(VirtualFile* base_storages, s32 layer_count, size_t htbs, void* hash_buf, + size_t hash_buf_size); + + virtual size_t GetSize() const override { + return m_base_storage->GetSize(); + } + + virtual size_t Read(u8* buffer, size_t length, size_t offset) const override; + +private: + VirtualFile m_base_storage; + s64 m_base_storage_size{}; + char* m_hash_buffer{}; + size_t m_hash_buffer_size{}; + s32 m_hash_target_block_size{}; + s32 m_log_size_ratio{}; + std::mutex m_mutex; +}; + +} // namespace FileSys diff --git a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp index 046571e9ef..15bb609110 100644 --- a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp +++ b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.cpp @@ -1,26 +1,24 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "core/file_sys/fssystem/fssystem_integrity_verification_storage.h" #include "common/alignment.h" +#include "core/file_sys/fssystem/fssystem_integrity_verification_storage.h" namespace FileSys { -constexpr inline u32 ILog2(u32 val) -{ +constexpr inline u32 ILog2(u32 val) { ASSERT(val > 0); return static_cast((sizeof(u32) * 8) - 1 - std::countl_zero(val)); } -void IntegrityVerificationStorage::Initialize(VirtualFile hs, - VirtualFile ds, - s64 verif_block_size, - s64 upper_layer_verif_block_size, - bool is_real_data) -{ +void IntegrityVerificationStorage::Initialize(VirtualFile hs, VirtualFile ds, s64 verif_block_size, + s64 upper_layer_verif_block_size, bool is_real_data) { // Validate preconditions. ASSERT(verif_block_size >= HashSize); @@ -34,34 +32,28 @@ void IntegrityVerificationStorage::Initialize(VirtualFile hs, ASSERT(m_verification_block_size == 1ll << m_verification_block_order); // Set upper layer block sizes. - upper_layer_verif_block_size = std::max(upper_layer_verif_block_size, HashSize); + upper_layer_verif_block_size = (std::max)(upper_layer_verif_block_size, HashSize); m_upper_layer_verification_block_size = upper_layer_verif_block_size; m_upper_layer_verification_block_order = ILog2(static_cast(upper_layer_verif_block_size)); ASSERT(m_upper_layer_verification_block_size == 1ll << m_upper_layer_verification_block_order); // Validate sizes. - if (m_data_storage != nullptr) { + { s64 hash_size = m_hash_storage->GetSize(); s64 data_size = m_data_storage->GetSize(); ASSERT(((hash_size / HashSize) * m_verification_block_size) >= data_size); - } else { - LOG_ERROR(Loader, - "Failed to initialize integrity verification store. Game, update, or DLC may not " - "work."); } // Set data. m_is_real_data = is_real_data; } -void IntegrityVerificationStorage::Finalize() -{ +void IntegrityVerificationStorage::Finalize() { m_hash_storage = VirtualFile(); m_data_storage = VirtualFile(); } -size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset) const -{ +size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset) const { // Succeed if zero size. if (size == 0) { return size; @@ -70,13 +62,7 @@ size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset // Validate arguments. ASSERT(buffer != nullptr); - if (m_data_storage == nullptr) { - LOG_ERROR(Loader, - "Integrity verification store failed read operation. Game, update or DLC may not " - "work."); - return 0; - } - + // Validate the offset. s64 data_size = m_data_storage->GetSize(); ASSERT(offset <= static_cast(data_size)); @@ -104,8 +90,7 @@ size_t IntegrityVerificationStorage::Read(u8* buffer, size_t size, size_t offset return m_data_storage->Read(buffer, read_size, offset); } -size_t IntegrityVerificationStorage::GetSize() const -{ +size_t IntegrityVerificationStorage::GetSize() const { return m_data_storage->GetSize(); } diff --git a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp index ab5a7984e3..d496d58cec 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp +++ b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,6 +17,7 @@ #include "core/file_sys/fssystem/fssystem_nca_file_system_driver.h" #include "core/file_sys/fssystem/fssystem_sparse_storage.h" #include "core/file_sys/fssystem/fssystem_switch_storage.h" +#include "core/file_sys/fssystem/fssystem_hierarchical_sha3_storage.h" #include "core/file_sys/vfs/vfs_offset.h" #include "core/file_sys/vfs/vfs_vector.h" @@ -299,18 +303,24 @@ Result NcaFileSystemDriver::CreateStorageByRawStorage(VirtualFile* out, // Process hash/integrity layer. switch (header_reader->GetHashType()) { case NcaFsHeader::HashType::HierarchicalSha256Hash: - R_TRY(this->CreateSha256Storage(std::addressof(storage), std::move(storage), - header_reader->GetHashData().hierarchical_sha256_data)); + R_TRY(CreateSha256Storage(&storage, std::move(storage), + header_reader->GetHashData().hierarchical_sha256_data)); break; case NcaFsHeader::HashType::HierarchicalIntegrityHash: - R_TRY(this->CreateIntegrityVerificationStorage( - std::addressof(storage), std::move(storage), - header_reader->GetHashData().integrity_meta_info)); + R_TRY(CreateIntegrityVerificationStorage(&storage, std::move(storage), + header_reader->GetHashData().integrity_meta_info)); + break; + case NcaFsHeader::HashType::HierarchicalSha3256Hash: + R_TRY(CreateSha3Storage(&storage, std::move(storage), + header_reader->GetHashData().hierarchical_sha256_data)); break; default: + LOG_ERROR(Loader, "Unhandled Fs HashType enum={}", + static_cast(header_reader->GetHashType())); R_THROW(ResultInvalidNcaFsHeaderHashType); } + // Process compression layer. if (header_reader->ExistsCompressionLayer()) { R_TRY(this->CreateCompressedStorage( @@ -679,6 +689,7 @@ Result NcaFileSystemDriver::CreateSparseStorageMetaStorageWithVerification( // Create the verification storage. VirtualFile integrity_storage; + Result rc = this->CreateIntegrityVerificationStorageForMeta( std::addressof(integrity_storage), out_layer_info_storage, std::move(decrypted_storage), meta_offset, meta_data_hash_data_info); @@ -734,8 +745,26 @@ Result NcaFileSystemDriver::CreateSparseStorageWithVerification( NcaHeader::CtrBlockSize))); // Check the meta data hash type. - R_UNLESS(meta_data_hash_type == NcaFsHeader::MetaDataHashType::HierarchicalIntegrity, - ResultRomNcaInvalidSparseMetaDataHashType); + if (meta_data_hash_type != NcaFsHeader::MetaDataHashType::HierarchicalIntegrity) { + LOG_ERROR(Loader, "Sparse meta hash type {} not supported for verification; mounting sparse data WITHOUT verification (temporary).", static_cast(meta_data_hash_type)); + + R_TRY(this->CreateBodySubStorage(std::addressof(body_substorage), + sparse_info.physical_offset, + sparse_info.GetPhysicalSize())); + + // Create sparse core directly (no meta verification) + std::shared_ptr sparse_storage_fallback; + R_TRY(this->CreateSparseStorageCore(std::addressof(sparse_storage_fallback), + body_substorage, sparse_info.GetPhysicalSize(), + /*meta_storage*/ body_substorage, // dummy; not used + sparse_info, false)); + + if (out_sparse_storage) + *out_sparse_storage = sparse_storage_fallback; + *out_fs_data_offset = fs_offset; + *out = std::move(sparse_storage_fallback); + R_SUCCEED(); + } // Create the meta storage. VirtualFile meta_storage; @@ -1020,13 +1049,11 @@ Result NcaFileSystemDriver::CreatePatchMetaStorage( ASSERT(out_aes_ctr_ex_meta != nullptr); ASSERT(out_indirect_meta != nullptr); ASSERT(base_storage != nullptr); - ASSERT(patch_info.HasAesCtrExTable()); - ASSERT(patch_info.HasIndirectTable()); ASSERT(Common::IsAligned(patch_info.aes_ctr_ex_size, NcaHeader::XtsBlockSize)); // Validate patch info extents. - R_UNLESS(patch_info.indirect_size > 0, ResultInvalidNcaPatchInfoIndirectSize); - R_UNLESS(patch_info.aes_ctr_ex_size >= 0, ResultInvalidNcaPatchInfoAesCtrExSize); + R_UNLESS(patch_info.aes_ctr_ex_size >= 0 && patch_info.HasAesCtrExTable(), ResultInvalidNcaPatchInfoAesCtrExSize); + R_UNLESS(patch_info.indirect_size > 0 && patch_info.HasIndirectTable(), ResultInvalidNcaPatchInfoIndirectSize); R_UNLESS(patch_info.indirect_size + patch_info.indirect_offset <= patch_info.aes_ctr_ex_offset, ResultInvalidNcaPatchInfoAesCtrExOffset); R_UNLESS(patch_info.aes_ctr_ex_offset + patch_info.aes_ctr_ex_size <= @@ -1093,6 +1120,56 @@ Result NcaFileSystemDriver::CreatePatchMetaStorage( R_SUCCEED(); } +Result NcaFileSystemDriver::CreateSha3Storage( + VirtualFile* out, VirtualFile base_storage, + const NcaFsHeader::HashData::HierarchicalSha256Data& hash_data) { + ASSERT(out != nullptr); + ASSERT(base_storage != nullptr); + + using VerificationStorage = HierarchicalSha3Storage; + + R_UNLESS(Common::IsPowerOfTwo(hash_data.hash_block_size), + ResultInvalidHierarchicalSha256BlockSize); + R_UNLESS(hash_data.hash_layer_count == VerificationStorage::LayerCount - 1, + ResultInvalidHierarchicalSha256LayerCount); + + const auto& hash_region = hash_data.hash_layer_region[0]; + const auto& data_region = hash_data.hash_layer_region[1]; + + constexpr s32 CacheBlockCount = 2; + const auto hash_buffer_size = static_cast(hash_region.size); + const auto cache_buffer_size = CacheBlockCount * hash_data.hash_block_size; + const auto total_buffer_size = hash_buffer_size + cache_buffer_size; + + auto buffer_hold_storage = std::make_shared( + std::move(base_storage), total_buffer_size); + R_UNLESS(buffer_hold_storage != nullptr, ResultAllocationMemoryFailedAllocateShared); + R_UNLESS(buffer_hold_storage->IsValid(), ResultAllocationMemoryFailedInNcaFileSystemDriverI); + + s64 base_size = buffer_hold_storage->GetSize(); + R_UNLESS(hash_region.offset + hash_region.size <= base_size, ResultNcaBaseStorageOutOfRangeC); + R_UNLESS(data_region.offset + data_region.size <= base_size, ResultNcaBaseStorageOutOfRangeC); + + auto master_hash_storage = + std::make_shared>(hash_data.fs_data_master_hash.value); + + auto verification_storage = std::make_shared(); + R_UNLESS(verification_storage != nullptr, ResultAllocationMemoryFailedAllocateShared); + + std::array layer_storages{ + std::make_shared(master_hash_storage, sizeof(Hash), 0), + std::make_shared(buffer_hold_storage, hash_region.size, hash_region.offset), + std::make_shared(buffer_hold_storage, data_region.size, data_region.offset), + }; + + R_TRY(verification_storage->Initialize(layer_storages.data(), VerificationStorage::LayerCount, + hash_data.hash_block_size, + buffer_hold_storage->GetBuffer(), hash_buffer_size)); + + *out = std::move(verification_storage); + R_SUCCEED(); +} + Result NcaFileSystemDriver::CreateSha256Storage( VirtualFile* out, VirtualFile base_storage, const NcaFsHeader::HashData::HierarchicalSha256Data& hash_data) { @@ -1160,6 +1237,7 @@ Result NcaFileSystemDriver::CreateSha256Storage( Result NcaFileSystemDriver::CreateIntegrityVerificationStorage( VirtualFile* out, VirtualFile base_storage, const NcaFsHeader::HashData::IntegrityMetaInfo& meta_info) { + R_RETURN(this->CreateIntegrityVerificationStorageImpl( out, base_storage, meta_info, 0, IntegrityDataCacheCount, IntegrityHashCacheCount, HierarchicalIntegrityVerificationStorage::GetDefaultDataCacheBufferLevel( @@ -1209,7 +1287,7 @@ Result NcaFileSystemDriver::CreateIntegrityVerificationStorageImpl( VirtualFile* out, VirtualFile base_storage, const NcaFsHeader::HashData::IntegrityMetaInfo& meta_info, s64 layer_info_offset, int max_data_cache_entries, int max_hash_cache_entries, s8 buffer_level) { - // Validate preconditions. + // Preconditions ASSERT(out != nullptr); ASSERT(base_storage != nullptr); ASSERT(layer_info_offset >= 0); @@ -1220,7 +1298,8 @@ Result NcaFileSystemDriver::CreateIntegrityVerificationStorageImpl( // Validate the meta info. HierarchicalIntegrityVerificationInformation level_hash_info; - std::memcpy(std::addressof(level_hash_info), std::addressof(meta_info.level_hash_info), + std::memcpy(std::addressof(level_hash_info), + std::addressof(meta_info.level_hash_info), sizeof(level_hash_info)); R_UNLESS(IntegrityMinLayerCount <= level_hash_info.max_layers, @@ -1238,8 +1317,9 @@ Result NcaFileSystemDriver::CreateIntegrityVerificationStorageImpl( R_UNLESS(layer_info_offset + layer_info.offset + layer_info.size <= base_storage_size, ResultNcaBaseStorageOutOfRangeD); - storage_info[i + 1] = std::make_shared( - base_storage, layer_info.size, layer_info_offset + layer_info.offset); + storage_info[i + 1] = std::make_shared(base_storage, + layer_info.size, + layer_info_offset + layer_info.offset); } // Set the last layer info. @@ -1251,16 +1331,41 @@ Result NcaFileSystemDriver::CreateIntegrityVerificationStorageImpl( R_UNLESS(last_layer_info_offset + layer_info.size <= layer_info_offset, ResultRomNcaInvalidIntegrityLayerInfoOffset); } - storage_info.SetDataStorage(std::make_shared( - std::move(base_storage), layer_info.size, last_layer_info_offset)); + + switch (level_hash_info.max_layers - 1) { + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::MasterStorage: + storage_info.SetMasterHashStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::Layer1Storage: + storage_info.SetLayer1HashStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::Layer2Storage: + storage_info.SetLayer2HashStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::Layer3Storage: + storage_info.SetLayer3HashStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::Layer4Storage: + storage_info.SetLayer4HashStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::Layer5Storage: + storage_info.SetLayer5HashStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + case FileSys::HierarchicalIntegrityVerificationStorage::HierarchicalStorageInformation::DataStorage: + storage_info.SetDataStorage(std::make_shared(std::move(base_storage), layer_info.size, last_layer_info_offset)); + break; + } // Make the integrity romfs storage. auto integrity_storage = std::make_shared(); R_UNLESS(integrity_storage != nullptr, ResultAllocationMemoryFailedAllocateShared); // Initialize the integrity storage. - R_TRY(integrity_storage->Initialize(level_hash_info, meta_info.master_hash, storage_info, - max_data_cache_entries, max_hash_cache_entries, + R_TRY(integrity_storage->Initialize(level_hash_info, + meta_info.master_hash, + storage_info, + max_data_cache_entries, + max_hash_cache_entries, buffer_level)); // Set the output. diff --git a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h index 5bc838de64..e09bfc588a 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h +++ b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -329,6 +332,10 @@ private: const NcaPatchInfo& patch_info, const NcaMetaDataHashDataInfo& meta_data_hash_data_info); + + Result CreateSha3Storage(VirtualFile* out, VirtualFile base_storage, + const NcaFsHeader::HashData::HierarchicalSha256Data& hash_data); + Result CreateSha256Storage(VirtualFile* out, VirtualFile base_storage, const NcaFsHeader::HashData::HierarchicalSha256Data& sha256_data); diff --git a/src/core/file_sys/fssystem/fssystem_nca_header.cpp b/src/core/file_sys/fssystem/fssystem_nca_header.cpp index bf5742d39f..77042dfd43 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_header.cpp +++ b/src/core/file_sys/fssystem/fssystem_nca_header.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ namespace FileSys { u8 NcaHeader::GetProperKeyGeneration() const { - return std::max(this->key_generation, this->key_generation_2); + return (std::max)(this->key_generation, this->key_generation_2); } bool NcaPatchInfo::HasIndirectTable() const { diff --git a/src/core/file_sys/fssystem/fssystem_pooled_buffer.cpp b/src/core/file_sys/fssystem/fssystem_pooled_buffer.cpp deleted file mode 100644 index bbfaab2557..0000000000 --- a/src/core/file_sys/fssystem/fssystem_pooled_buffer.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/alignment.h" -#include "core/file_sys/fssystem/fssystem_pooled_buffer.h" - -namespace FileSys { - -namespace { - -constexpr size_t HeapBlockSize = BufferPoolAlignment; -static_assert(HeapBlockSize == 4_KiB); - -// A heap block is 4KiB. An order is a power of two. -// This gives blocks of the order 32KiB, 512KiB, 4MiB. -constexpr s32 HeapOrderMax = 7; -constexpr s32 HeapOrderMaxForLarge = HeapOrderMax + 3; - -constexpr size_t HeapAllocatableSizeMax = HeapBlockSize * (static_cast(1) << HeapOrderMax); -constexpr size_t HeapAllocatableSizeMaxForLarge = - HeapBlockSize * (static_cast(1) << HeapOrderMaxForLarge); - -} // namespace - -size_t PooledBuffer::GetAllocatableSizeMaxCore(bool large) { - return large ? HeapAllocatableSizeMaxForLarge : HeapAllocatableSizeMax; -} - -void PooledBuffer::AllocateCore(size_t ideal_size, size_t required_size, bool large) { - // Ensure preconditions. - ASSERT(m_buffer == nullptr); - - // Check that we can allocate this size. - ASSERT(required_size <= GetAllocatableSizeMaxCore(large)); - - const size_t target_size = - std::min(std::max(ideal_size, required_size), GetAllocatableSizeMaxCore(large)); - - // Dummy implementation for allocate. - if (target_size > 0) { - m_buffer = - reinterpret_cast(::operator new(target_size, std::align_val_t{HeapBlockSize})); - m_size = target_size; - - // Ensure postconditions. - ASSERT(m_buffer != nullptr); - } -} - -void PooledBuffer::Shrink(size_t ideal_size) { - ASSERT(ideal_size <= GetAllocatableSizeMaxCore(true)); - - // Shrinking to zero means that we have no buffer. - if (ideal_size == 0) { - ::operator delete(m_buffer, std::align_val_t{HeapBlockSize}); - m_buffer = nullptr; - m_size = ideal_size; - } -} - -} // namespace FileSys diff --git a/src/core/file_sys/fssystem/fssystem_pooled_buffer.h b/src/core/file_sys/fssystem/fssystem_pooled_buffer.h deleted file mode 100644 index 9a6adbcb5a..0000000000 --- a/src/core/file_sys/fssystem/fssystem_pooled_buffer.h +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/common_funcs.h" -#include "common/common_types.h" -#include "common/literals.h" -#include "core/hle/result.h" - -namespace FileSys { - -using namespace Common::Literals; - -constexpr inline size_t BufferPoolAlignment = 4_KiB; -constexpr inline size_t BufferPoolWorkSize = 320; - -class PooledBuffer { - YUZU_NON_COPYABLE(PooledBuffer); - -public: - // Constructor/Destructor. - constexpr PooledBuffer() : m_buffer(), m_size() {} - - PooledBuffer(size_t ideal_size, size_t required_size) : m_buffer(), m_size() { - this->Allocate(ideal_size, required_size); - } - - ~PooledBuffer() { - this->Deallocate(); - } - - // Move and assignment. - explicit PooledBuffer(PooledBuffer&& rhs) : m_buffer(rhs.m_buffer), m_size(rhs.m_size) { - rhs.m_buffer = nullptr; - rhs.m_size = 0; - } - - PooledBuffer& operator=(PooledBuffer&& rhs) { - PooledBuffer(std::move(rhs)).Swap(*this); - return *this; - } - - // Allocation API. - void Allocate(size_t ideal_size, size_t required_size) { - return this->AllocateCore(ideal_size, required_size, false); - } - - void AllocateParticularlyLarge(size_t ideal_size, size_t required_size) { - return this->AllocateCore(ideal_size, required_size, true); - } - - void Shrink(size_t ideal_size); - - void Deallocate() { - // Shrink the buffer to empty. - this->Shrink(0); - ASSERT(m_buffer == nullptr); - } - - char* GetBuffer() const { - ASSERT(m_buffer != nullptr); - return m_buffer; - } - - size_t GetSize() const { - ASSERT(m_buffer != nullptr); - return m_size; - } - -public: - static size_t GetAllocatableSizeMax() { - return GetAllocatableSizeMaxCore(false); - } - static size_t GetAllocatableParticularlyLargeSizeMax() { - return GetAllocatableSizeMaxCore(true); - } - -private: - static size_t GetAllocatableSizeMaxCore(bool large); - -private: - void Swap(PooledBuffer& rhs) { - std::swap(m_buffer, rhs.m_buffer); - std::swap(m_size, rhs.m_size); - } - - void AllocateCore(size_t ideal_size, size_t required_size, bool large); - -private: - char* m_buffer; - size_t m_size; -}; - -} // namespace FileSys diff --git a/src/core/file_sys/fssystem/fssystem_sparse_storage.h b/src/core/file_sys/fssystem/fssystem_sparse_storage.h index 6c196ec611..759a6b5092 100644 --- a/src/core/file_sys/fssystem/fssystem_sparse_storage.h +++ b/src/core/file_sys/fssystem/fssystem_sparse_storage.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,7 +21,7 @@ private: virtual ~ZeroStorage() {} virtual size_t GetSize() const override { - return std::numeric_limits::max(); + return (std::numeric_limits::max)(); } virtual size_t Read(u8* buffer, size_t size, size_t offset) const override { @@ -62,7 +65,7 @@ public: private: void SetZeroStorage() { - return this->SetStorage(1, m_zero_storage, 0, std::numeric_limits::max()); + return this->SetStorage(1, m_zero_storage, 0, (std::numeric_limits::max)()); } private: diff --git a/src/core/file_sys/nca_metadata.cpp b/src/core/file_sys/nca_metadata.cpp index 9e855c50d1..324ecbc8c9 100644 --- a/src/core/file_sys/nca_metadata.cpp +++ b/src/core/file_sys/nca_metadata.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -102,7 +105,7 @@ std::vector CNMT::Serialize() const { header.type >= TitleType::Application && header.type <= TitleType::AOC; const auto dead_zone = header.table_offset + sizeof(CNMTHeader); std::vector out( - std::max(sizeof(CNMTHeader) + (has_opt_header ? sizeof(OptionalHeader) : 0), dead_zone) + + (std::max)(sizeof(CNMTHeader) + (has_opt_header ? sizeof(OptionalHeader) : 0), dead_zone) + content_records.size() * sizeof(ContentRecord) + meta_records.size() * sizeof(MetaRecord)); memcpy(out.data(), &header, sizeof(CNMTHeader)); diff --git a/src/core/file_sys/program_metadata.cpp b/src/core/file_sys/program_metadata.cpp index 289969cc4c..f542a09d0e 100644 --- a/src/core/file_sys/program_metadata.cpp +++ b/src/core/file_sys/program_metadata.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -180,7 +183,7 @@ void ProgramMetadata::Print() const { LOG_DEBUG(Service_FS, "Magic: {:.4}", npdm_header.magic.data()); LOG_DEBUG(Service_FS, "Main thread priority: 0x{:02X}", npdm_header.main_thread_priority); LOG_DEBUG(Service_FS, "Main thread core: {}", npdm_header.main_thread_cpu); - LOG_DEBUG(Service_FS, "Main thread stack size: 0x{:X} bytes", npdm_header.main_stack_size); + LOG_DEBUG(Service_FS, "Main thread stack size: {:#X} bytes", npdm_header.main_stack_size); LOG_DEBUG(Service_FS, "Process category: {}", npdm_header.process_category); LOG_DEBUG(Service_FS, "Flags: 0x{:02X}", npdm_header.flags); LOG_DEBUG(Service_FS, " > 64-bit instructions: {}", diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index 85d30543c1..f750a2e871 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -64,7 +67,7 @@ static std::string GetRelativePathFromNcaID(const std::array& nca_id, bo } Core::Crypto::SHA256Hash hash{}; - mbedtls_sha256_ret(nca_id.data(), nca_id.size(), hash.data(), 0); + mbedtls_sha256(nca_id.data(), nca_id.size(), hash.data(), 0); const auto format_str = fmt::runtime(cnmt_suffix ? "/000000{:02X}/{}.cnmt.nca" : "/000000{:02X}/{}.nca"); @@ -146,7 +149,7 @@ bool PlaceholderCache::Create(const NcaID& id, u64 size) const { } Core::Crypto::SHA256Hash hash{}; - mbedtls_sha256_ret(id.data(), id.size(), hash.data(), 0); + mbedtls_sha256(id.data(), id.size(), hash.data(), 0); const auto dirname = fmt::format("000000{:02X}", hash[0]); const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname); @@ -170,7 +173,7 @@ bool PlaceholderCache::Delete(const NcaID& id) const { } Core::Crypto::SHA256Hash hash{}; - mbedtls_sha256_ret(id.data(), id.size(), hash.data(), 0); + mbedtls_sha256(id.data(), id.size(), hash.data(), 0); const auto dirname = fmt::format("000000{:02X}", hash[0]); const auto dir2 = GetOrCreateDirectoryRelative(dir, dirname); @@ -273,7 +276,7 @@ std::vector PlaceholderCache::List() const { NcaID PlaceholderCache::Generate() { std::random_device device; std::mt19937 gen(device()); - std::uniform_int_distribution distribution(1, std::numeric_limits::max()); + std::uniform_int_distribution distribution(1, (std::numeric_limits::max)()); NcaID out{}; @@ -665,7 +668,7 @@ InstallResult RegisteredCache::InstallEntry(const NCA& nca, TitleType type, const OptionalHeader opt_header{0, 0}; ContentRecord c_rec{{}, {}, {}, GetCRTypeFromNCAType(nca.GetType()), {}}; const auto& data = nca.GetBaseFile()->ReadBytes(0x100000); - mbedtls_sha256_ret(data.data(), data.size(), c_rec.hash.data(), 0); + mbedtls_sha256(data.data(), data.size(), c_rec.hash.data(), 0); std::memcpy(&c_rec.nca_id, &c_rec.hash, 16); const CNMT new_cnmt(header, opt_header, {c_rec}, {}); if (!RawInstallYuzuMeta(new_cnmt)) { @@ -776,7 +779,7 @@ InstallResult RegisteredCache::RawInstallNCA(const NCA& nca, const VfsCopyFuncti id = *override_id; } else { const auto& data = in->ReadBytes(0x100000); - mbedtls_sha256_ret(data.data(), data.size(), hash.data(), 0); + mbedtls_sha256(data.data(), data.size(), hash.data(), 0); memcpy(id.data(), hash.data(), 16); } diff --git a/src/core/file_sys/romfs.cpp b/src/core/file_sys/romfs.cpp index a2b2809734..9cf4928cd9 100644 --- a/src/core/file_sys/romfs.cpp +++ b/src/core/file_sys/romfs.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -75,7 +78,7 @@ std::pair GetEntry(const RomFSTraversalContext& ctx, siz } std::memcpy(&entry, data + offset, sizeof(EntryType)); - const size_t name_length = std::min(entry_end + entry.name_length, size) - entry_end; + const size_t name_length = (std::min)(entry_end + entry.name_length, size) - entry_end; std::string name(reinterpret_cast(data + entry_end), name_length); return {entry, std::move(name)}; diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 106922e04f..dda8d526d3 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -1,7 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include #include "common/assert.h" #include "common/common_types.h" #include "common/logging/log.h" diff --git a/src/core/file_sys/vfs/vfs.cpp b/src/core/file_sys/vfs/vfs.cpp index a04292760f..b85b843e3e 100644 --- a/src/core/file_sys/vfs/vfs.cpp +++ b/src/core/file_sys/vfs/vfs.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -507,9 +510,9 @@ bool VfsRawCopy(const VirtualFile& src, const VirtualFile& dest, std::size_t blo if (!dest->Resize(src->GetSize())) return false; - std::vector temp(std::min(block_size, src->GetSize())); + std::vector temp((std::min)(block_size, src->GetSize())); for (std::size_t i = 0; i < src->GetSize(); i += block_size) { - const auto read = std::min(block_size, src->GetSize() - i); + const auto read = (std::min)(block_size, src->GetSize() - i); if (src->Read(temp.data(), read, i) != read) { return false; diff --git a/src/core/file_sys/vfs/vfs_real.cpp b/src/core/file_sys/vfs/vfs_real.cpp index 052684e9db..4199667171 100644 --- a/src/core/file_sys/vfs/vfs_real.cpp +++ b/src/core/file_sys/vfs/vfs_real.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -442,11 +445,12 @@ std::vector RealVfsDirectory::GetFiles() const { FileTimeStampRaw RealVfsDirectory::GetFileTimeStamp(std::string_view path_) const { const auto full_path = FS::SanitizePath(path + '/' + std::string(path_)); const auto fs_path = std::filesystem::path{FS::ToU8String(full_path)}; - struct stat file_status; #ifdef _WIN32 + struct _stat64 file_status; const auto stat_result = _wstat64(fs_path.c_str(), &file_status); #else + struct stat file_status; const auto stat_result = stat(fs_path.c_str(), &file_status); #endif diff --git a/src/core/file_sys/vfs/vfs_static.h b/src/core/file_sys/vfs/vfs_static.h index bb53560ac7..b673ba1d2a 100644 --- a/src/core/file_sys/vfs/vfs_static.h +++ b/src/core/file_sys/vfs/vfs_static.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -43,7 +46,7 @@ public: } std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override { - const auto read = std::min(length, size - offset); + const auto read = (std::min)(length, size - offset); std::fill(data, data + read, value); return read; } @@ -61,7 +64,7 @@ public: } std::vector ReadBytes(std::size_t length, std::size_t offset) const override { - const auto read = std::min(length, size - offset); + const auto read = (std::min)(length, size - offset); return std::vector(read, value); } diff --git a/src/core/file_sys/vfs/vfs_vector.cpp b/src/core/file_sys/vfs/vfs_vector.cpp index 0d54461c8f..4d4a90f640 100644 --- a/src/core/file_sys/vfs/vfs_vector.cpp +++ b/src/core/file_sys/vfs/vfs_vector.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -37,7 +40,7 @@ bool VectorVfsFile::IsReadable() const { } std::size_t VectorVfsFile::Read(u8* data_, std::size_t length, std::size_t offset) const { - const auto read = std::min(length, data.size() - offset); + const auto read = (std::min)(length, data.size() - offset); std::memcpy(data_, data.data() + offset, read); return read; } @@ -45,7 +48,7 @@ std::size_t VectorVfsFile::Read(u8* data_, std::size_t length, std::size_t offse std::size_t VectorVfsFile::Write(const u8* data_, std::size_t length, std::size_t offset) { if (offset + length > data.size()) data.resize(offset + length); - const auto write = std::min(length, data.size() - offset); + const auto write = (std::min)(length, data.size() - offset); std::memcpy(data.data() + offset, data_, write); return write; } diff --git a/src/core/file_sys/vfs/vfs_vector.h b/src/core/file_sys/vfs/vfs_vector.h index 587187dd26..86beed931c 100644 --- a/src/core/file_sys/vfs/vfs_vector.h +++ b/src/core/file_sys/vfs/vfs_vector.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -45,7 +48,7 @@ public: } std::size_t Read(u8* data_, std::size_t length, std::size_t offset) const override { - const auto read = std::min(length, size - offset); + const auto read = (std::min)(length, size - offset); std::memcpy(data_, data.data() + offset, read); return read; } diff --git a/src/core/file_sys/xts_archive.cpp b/src/core/file_sys/xts_archive.cpp index 6692211e1d..c1912b2bda 100644 --- a/src/core/file_sys/xts_archive.cpp +++ b/src/core/file_sys/xts_archive.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -56,8 +59,8 @@ NAX::NAX(VirtualFile file_) return; } - const std::string two_dir = Common::ToUpper(match[1]); - const std::string nca_id = Common::ToLower(match[2]); + const std::string two_dir = Common::ToUpper(std::string{match[1]}); + const std::string nca_id = Common::ToLower(std::string{match[2]}); status = Parse(fmt::format("/registered/{}/{}.nca", two_dir, nca_id)); } @@ -65,7 +68,7 @@ NAX::NAX(VirtualFile file_, std::array nca_id) : header(std::make_unique()), file(std::move(file_)), keys{Core::Crypto::KeyManager::Instance()} { Core::Crypto::SHA256Hash hash{}; - mbedtls_sha256_ret(nca_id.data(), nca_id.size(), hash.data(), 0); + mbedtls_sha256(nca_id.data(), nca_id.size(), hash.data(), 0); status = Parse(fmt::format("/registered/000000{:02X}/{}.nca", hash[0], Common::HexToString(nca_id, false))); } diff --git a/src/core/frontend/applets/cabinet.h b/src/core/frontend/applets/cabinet.h index af3fc6c3d5..157bfe38c6 100644 --- a/src/core/frontend/applets/cabinet.h +++ b/src/core/frontend/applets/cabinet.h @@ -1,9 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include +#include + #include "core/frontend/applets/applet.h" #include "core/hle/service/nfp/nfp_types.h" diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index d1f1ca8c97..9b771ed092 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -28,11 +31,11 @@ std::pair EmuWindow::MapToTouchScreen(u32 framebuffer_x, u32 framebuff } std::pair EmuWindow::ClipToTouchScreen(u32 new_x, u32 new_y) const { - new_x = std::max(new_x, framebuffer_layout.screen.left); - new_x = std::min(new_x, framebuffer_layout.screen.right - 1); + new_x = (std::max)(new_x, framebuffer_layout.screen.left); + new_x = (std::min)(new_x, framebuffer_layout.screen.right - 1); - new_y = std::max(new_y, framebuffer_layout.screen.top); - new_y = std::min(new_y, framebuffer_layout.screen.bottom - 1); + new_y = (std::max)(new_y, framebuffer_layout.screen.top); + new_y = (std::min)(new_y, framebuffer_layout.screen.bottom - 1); return std::make_pair(new_x, new_y); } diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index 2590b20da4..63e17f9ceb 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,7 +17,7 @@ namespace Layout { template static Common::Rectangle MaxRectangle(Common::Rectangle window_area, float screen_aspect_ratio) { - const float scale = std::min(static_cast(window_area.GetWidth()), + const float scale = (std::min)(static_cast(window_area.GetWidth()), static_cast(window_area.GetHeight()) / screen_aspect_ratio); return Common::Rectangle{0, 0, static_cast(std::round(scale)), static_cast(std::round(scale * screen_aspect_ratio))}; diff --git a/src/core/hle/kernel/board/nintendo/nx/k_memory_layout.cpp b/src/core/hle/kernel/board/nintendo/nx/k_memory_layout.cpp index 24eb3f8866..3e98584216 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_memory_layout.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_memory_layout.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -133,7 +136,7 @@ void SetupPoolPartitionMemoryRegions(KMemoryLayout& memory_layout) { // Decide on starting addresses for our pools. const u64 application_pool_start = pool_end - application_pool_size; const u64 applet_pool_start = application_pool_start - applet_pool_size; - const u64 unsafe_system_pool_start = std::min( + const u64 unsafe_system_pool_start = (std::min)( kernel_dram_start + CarveoutSizeMax, Common::AlignDown(applet_pool_start - unsafe_system_pool_min_size, CarveoutAlignment)); const size_t unsafe_system_pool_size = applet_pool_start - unsafe_system_pool_start; diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp index f62f3e4767..1446653916 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -182,13 +185,13 @@ namespace { template u64 GenerateUniformRange(u64 min, u64 max, F f) { // Handle the case where the difference is too large to represent. - if (max == std::numeric_limits::max() && min == std::numeric_limits::min()) { + if (max == (std::numeric_limits::max)() && min == (std::numeric_limits::min)()) { return f(); } // Iterate until we get a value in range. const u64 range_size = ((max + 1) - min); - const u64 effective_max = (std::numeric_limits::max() / range_size) * range_size; + const u64 effective_max = ((std::numeric_limits::max)() / range_size) * range_size; while (true) { if (const u64 rnd = f(); rnd < effective_max) { return min + (rnd % range_size); @@ -201,7 +204,7 @@ u64 GenerateUniformRange(u64 min, u64 max, F f) { u64 KSystemControl::GenerateRandomU64() { std::random_device device; std::mt19937 gen(device()); - std::uniform_int_distribution distribution(1, std::numeric_limits::max()); + std::uniform_int_distribution distribution(1, (std::numeric_limits::max)()); return distribution(gen); } diff --git a/src/core/hle/kernel/k_dynamic_page_manager.h b/src/core/hle/kernel/k_dynamic_page_manager.h index ad11e84b71..16bd61a98a 100644 --- a/src/core/hle/kernel/k_dynamic_page_manager.h +++ b/src/core/hle/kernel/k_dynamic_page_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -110,7 +113,7 @@ public: // Update our tracking. m_page_bitmap.ClearBit(offset); - m_peak = std::max(m_peak, (++m_used)); + m_peak = (std::max)(m_peak, (++m_used)); return GetPointer(m_aligned_address) + offset; } @@ -131,7 +134,7 @@ public: // Update our tracking. m_page_bitmap.ClearRange(offset, count); m_used += count; - m_peak = std::max(m_peak, m_used); + m_peak = (std::max)(m_peak, m_used); return GetPointer(m_aligned_address) + offset; } diff --git a/src/core/hle/kernel/k_handle_table.h b/src/core/hle/kernel/k_handle_table.h index 1bf68e6b04..7381e951f5 100644 --- a/src/core/hle/kernel/k_handle_table.h +++ b/src/core/hle/kernel/k_handle_table.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -179,7 +182,7 @@ private: m_free_head_index = m_entry_infos[index].GetNextFreeIndex(); - m_max_count = std::max(m_max_count, ++m_count); + m_max_count = (std::max)(m_max_count, ++m_count); return index; } diff --git a/src/core/hle/kernel/k_hardware_timer.cpp b/src/core/hle/kernel/k_hardware_timer.cpp index 4e947dd6bc..019e709fbe 100644 --- a/src/core/hle/kernel/k_hardware_timer.cpp +++ b/src/core/hle/kernel/k_hardware_timer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -19,7 +22,7 @@ void KHardwareTimer::Initialize() { void KHardwareTimer::Finalize() { m_kernel.System().CoreTiming().UnscheduleEvent(m_event_type); - m_wakeup_time = std::numeric_limits::max(); + m_wakeup_time = (std::numeric_limits::max)(); m_event_type.reset(); } @@ -37,7 +40,7 @@ void KHardwareTimer::DoTask() { // Disable the timer interrupt while we handle this. // Not necessary due to core timing already having popped this event to call it. // this->DisableInterrupt(); - m_wakeup_time = std::numeric_limits::max(); + m_wakeup_time = (std::numeric_limits::max)(); if (const s64 next_time = this->DoInterruptTaskImpl(GetTick()); 0 < next_time && next_time <= m_wakeup_time) { @@ -63,7 +66,7 @@ void KHardwareTimer::EnableInterrupt(s64 wakeup_time) { void KHardwareTimer::DisableInterrupt() { m_kernel.System().CoreTiming().UnscheduleEvent(m_event_type, Core::Timing::UnscheduleEventType::NoWait); - m_wakeup_time = std::numeric_limits::max(); + m_wakeup_time = (std::numeric_limits::max)(); } s64 KHardwareTimer::GetTick() const { @@ -71,7 +74,7 @@ s64 KHardwareTimer::GetTick() const { } bool KHardwareTimer::GetInterruptEnabled() { - return m_wakeup_time != std::numeric_limits::max(); + return m_wakeup_time != (std::numeric_limits::max)(); } } // namespace Kernel diff --git a/src/core/hle/kernel/k_hardware_timer.h b/src/core/hle/kernel/k_hardware_timer.h index 27f43cd194..d39d6c3855 100644 --- a/src/core/hle/kernel/k_hardware_timer.h +++ b/src/core/hle/kernel/k_hardware_timer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -40,7 +43,7 @@ private: private: // Absolute time in nanoseconds - s64 m_wakeup_time{std::numeric_limits::max()}; + s64 m_wakeup_time{(std::numeric_limits::max)()}; std::shared_ptr m_event_type{}; }; diff --git a/src/core/hle/kernel/k_light_server_session.cpp b/src/core/hle/kernel/k_light_server_session.cpp index e5ceb01f2a..a4d2b11231 100644 --- a/src/core/hle/kernel/k_light_server_session.cpp +++ b/src/core/hle/kernel/k_light_server_session.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,7 +14,7 @@ namespace Kernel { namespace { -constexpr u64 InvalidThreadId = std::numeric_limits::max(); +constexpr u64 InvalidThreadId = (std::numeric_limits::max)(); class ThreadQueueImplForKLightServerSessionRequest final : public KThreadQueue { private: diff --git a/src/core/hle/kernel/k_light_server_session.h b/src/core/hle/kernel/k_light_server_session.h index 8eca3eab69..67db3f76ca 100644 --- a/src/core/hle/kernel/k_light_server_session.h +++ b/src/core/hle/kernel/k_light_server_session.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -19,7 +22,7 @@ private: KLightSession* m_parent{}; KThread::WaiterList m_request_list{}; KThread* m_current_request{}; - u64 m_server_thread_id{std::numeric_limits::max()}; + u64 m_server_thread_id{(std::numeric_limits::max)()}; KThread* m_server_thread{}; public: diff --git a/src/core/hle/kernel/k_memory_block.h b/src/core/hle/kernel/k_memory_block.h index d2b7e9a66e..f6543bdb3a 100644 --- a/src/core/hle/kernel/k_memory_block.h +++ b/src/core/hle/kernel/k_memory_block.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -551,7 +554,7 @@ public: } m_device_disable_merge_left_count = - std::min(m_device_disable_merge_left_count, m_device_use_count); + (std::min)(m_device_disable_merge_left_count, m_device_use_count); if (m_device_disable_merge_left_count == 0) { m_disable_merge_attribute = static_cast( diff --git a/src/core/hle/kernel/k_memory_layout.cpp b/src/core/hle/kernel/k_memory_layout.cpp index bec7146688..721a9cc5cb 100644 --- a/src/core/hle/kernel/k_memory_layout.cpp +++ b/src/core/hle/kernel/k_memory_layout.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -66,7 +69,7 @@ bool KMemoryRegionTree::Insert(u64 address, size_t size, u32 type_id, u32 new_at this->insert(*found); // Insert a new region for the split. - const u64 new_pair = (old_pair != std::numeric_limits::max()) + const u64 new_pair = (old_pair != (std::numeric_limits::max)()) ? old_pair + (address - old_address) : old_pair; this->insert(*AllocateRegion(m_memory_region_allocator, address, inserted_region_last, @@ -75,7 +78,7 @@ bool KMemoryRegionTree::Insert(u64 address, size_t size, u32 type_id, u32 new_at // If we need to insert a region after the region, do so. if (old_last != inserted_region_last) { - const u64 after_pair = (old_pair != std::numeric_limits::max()) + const u64 after_pair = (old_pair != (std::numeric_limits::max)()) ? old_pair + (inserted_region_end - old_address) : old_pair; this->insert(*AllocateRegion(m_memory_region_allocator, inserted_region_end, old_last, diff --git a/src/core/hle/kernel/k_memory_manager.cpp b/src/core/hle/kernel/k_memory_manager.cpp index d6bd272962..743e290541 100644 --- a/src/core/hle/kernel/k_memory_manager.cpp +++ b/src/core/hle/kernel/k_memory_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -323,7 +326,7 @@ Result KMemoryManager::AllocateAndOpen(KPageGroup* out, size_t num_pages, u32 op // Process part or all of the block. const size_t cur_pages = - std::min(remaining_pages, manager.GetPageOffsetToEnd(cur_address)); + (std::min)(remaining_pages, manager.GetPageOffsetToEnd(cur_address)); manager.OpenFirst(cur_address, cur_pages); // Advance. @@ -385,7 +388,7 @@ Result KMemoryManager::AllocateForProcess(KPageGroup* out, size_t num_pages, u32 // Process part or all of the block. const size_t cur_pages = - std::min(remaining_pages, manager.GetPageOffsetToEnd(cur_address)); + (std::min)(remaining_pages, manager.GetPageOffsetToEnd(cur_address)); any_new = manager.ProcessOptimizedAllocation(m_system.Kernel(), cur_address, cur_pages, fill_pattern); @@ -409,7 +412,7 @@ Result KMemoryManager::AllocateForProcess(KPageGroup* out, size_t num_pages, u32 // Track some or all of the current pages. const size_t cur_pages = - std::min(remaining_pages, manager.GetPageOffsetToEnd(cur_address)); + (std::min)(remaining_pages, manager.GetPageOffsetToEnd(cur_address)); manager.TrackOptimizedAllocation(m_system.Kernel(), cur_address, cur_pages); // Advance. diff --git a/src/core/hle/kernel/k_memory_manager.h b/src/core/hle/kernel/k_memory_manager.h index c5a487af92..2f4ae7f04f 100644 --- a/src/core/hle/kernel/k_memory_manager.h +++ b/src/core/hle/kernel/k_memory_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -68,7 +71,7 @@ public: // Repeatedly open references until we've done so for all pages. while (num_pages) { auto& manager = this->GetManager(address); - const size_t cur_pages = std::min(num_pages, manager.GetPageOffsetToEnd(address)); + const size_t cur_pages = (std::min)(num_pages, manager.GetPageOffsetToEnd(address)); { KScopedLightLock lk(m_pool_locks[static_cast(manager.GetPool())]); @@ -84,7 +87,7 @@ public: // Repeatedly open references until we've done so for all pages. while (num_pages) { auto& manager = this->GetManager(address); - const size_t cur_pages = std::min(num_pages, manager.GetPageOffsetToEnd(address)); + const size_t cur_pages = (std::min)(num_pages, manager.GetPageOffsetToEnd(address)); { KScopedLightLock lk(m_pool_locks[static_cast(manager.GetPool())]); @@ -100,7 +103,7 @@ public: // Repeatedly close references until we've done so for all pages. while (num_pages) { auto& manager = this->GetManager(address); - const size_t cur_pages = std::min(num_pages, manager.GetPageOffsetToEnd(address)); + const size_t cur_pages = (std::min)(num_pages, manager.GetPageOffsetToEnd(address)); { KScopedLightLock lk(m_pool_locks[static_cast(manager.GetPool())]); diff --git a/src/core/hle/kernel/k_memory_region.h b/src/core/hle/kernel/k_memory_region.h index e3044f0227..5188e92717 100644 --- a/src/core/hle/kernel/k_memory_region.h +++ b/src/core/hle/kernel/k_memory_region.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -28,7 +31,7 @@ public: : m_address(address), m_last_address(last_address), m_pair_address(pair_address), m_attributes(attributes), m_type_id(type_id) {} constexpr KMemoryRegion(u64 address, u64 last_address, u32 attributes, u32 type_id) - : KMemoryRegion(address, last_address, std::numeric_limits::max(), attributes, + : KMemoryRegion(address, last_address, (std::numeric_limits::max)(), attributes, type_id) {} ~KMemoryRegion() = default; diff --git a/src/core/hle/kernel/k_page_bitmap.h b/src/core/hle/kernel/k_page_bitmap.h index 0ff9877326..fc21b81574 100644 --- a/src/core/hle/kernel/k_page_bitmap.h +++ b/src/core/hle/kernel/k_page_bitmap.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -83,7 +86,7 @@ public: } // Determine how many bits to take this round. - const auto cur_bits = std::min(num_bits, m_bits_available); + const auto cur_bits = (std::min)(num_bits, m_bits_available); // Generate mask for our current bits. const u64 mask = (static_cast(1) << cur_bits) - 1; diff --git a/src/core/hle/kernel/k_page_heap.h b/src/core/hle/kernel/k_page_heap.h index c55225bac6..7d34509983 100644 --- a/src/core/hle/kernel/k_page_heap.h +++ b/src/core/hle/kernel/k_page_heap.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -75,7 +78,7 @@ public: } static constexpr s32 GetAlignedBlockIndex(size_t num_pages, size_t align_pages) { - const size_t target_pages = std::max(num_pages, align_pages); + const size_t target_pages = (std::max)(num_pages, align_pages); for (size_t i = 0; i < NumMemoryBlockPageShifts; i++) { if (target_pages <= (static_cast(1) << MemoryBlockPageShifts[i]) / PageSize) { return static_cast(i); diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 5e39fbeb14..6b3f60f52e 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -1731,7 +1731,7 @@ void KPageTableBase::RemapPageGroup(PageLinkedList* page_list, KProcessAddress a } // Map whatever we can. - const size_t cur_pages = std::min(pg_pages, map_pages); + const size_t cur_pages = (std::min)(pg_pages, map_pages); R_ASSERT(this->Operate(page_list, map_address, map_pages, pg_phys_addr, true, map_properties, OperationType::Map, true)); @@ -1929,7 +1929,7 @@ Result KPageTableBase::GetContiguousMemoryRangeWithState( } // Take the minimum size for our region. - size = std::min(size, contig_size); + size = (std::min)(size, contig_size); // Check that the memory is contiguous (modulo the reference count bit). const KMemoryState test_state_mask = state_mask | KMemoryState::FlagReferenceCounted; @@ -5297,7 +5297,7 @@ Result KPageTableBase::MapPhysicalMemory(KProcessAddress address, size_t size) { KMemoryPermission::None, false, false, DisableMergeAttribute::None}; const size_t cur_pages = - std::min(KProcessAddress(info.GetEndAddress()) - cur_address, + (std::min)(KProcessAddress(info.GetEndAddress()) - cur_address, last_unmap_address + 1 - cur_address) / PageSize; @@ -5345,7 +5345,7 @@ Result KPageTableBase::MapPhysicalMemory(KProcessAddress address, size_t size) { ? DisableMergeAttribute::DisableHead : DisableMergeAttribute::None}; size_t map_pages = - std::min(KProcessAddress(info.GetEndAddress()) - cur_address, + (std::min)(KProcessAddress(info.GetEndAddress()) - cur_address, last_address + 1 - cur_address) / PageSize; @@ -5373,7 +5373,7 @@ Result KPageTableBase::MapPhysicalMemory(KProcessAddress address, size_t size) { } // Add whatever we can to the current block. - const size_t cur_pages = std::min(pg_pages, remain_pages); + const size_t cur_pages = (std::min)(pg_pages, remain_pages); R_TRY(cur_pg.AddBlock(pg_phys_addr + ((pg_pages - cur_pages) * PageSize), cur_pages)); @@ -5535,7 +5535,7 @@ Result KPageTableBase::UnmapPhysicalMemory(KProcessAddress address, size_t size) // Determine the range to unmap. const KPageProperties unmap_properties = {KMemoryPermission::None, false, false, DisableMergeAttribute::None}; - const size_t cur_pages = std::min(KProcessAddress(info.GetEndAddress()) - cur_address, + const size_t cur_pages = (std::min)(KProcessAddress(info.GetEndAddress()) - cur_address, last_address + 1 - cur_address) / PageSize; @@ -5656,7 +5656,7 @@ Result KPageTableBase::UnmapProcessMemory(KProcessAddress dst_address, size_t si } // Update our current size. - m_cur_size = std::min(m_remaining_size, m_cur_size + m_entry.block_size); + m_cur_size = (std::min)(m_remaining_size, m_cur_size + m_entry.block_size); } } }; diff --git a/src/core/hle/kernel/k_priority_queue.h b/src/core/hle/kernel/k_priority_queue.h index 26677ec65c..99347b5aef 100644 --- a/src/core/hle/kernel/k_priority_queue.h +++ b/src/core/hle/kernel/k_priority_queue.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,10 +8,12 @@ #include #include +#include #include +#include +#include "common/alignment.h" #include "common/assert.h" -#include "common/bit_set.h" #include "common/common_types.h" #include "common/concepts.h" @@ -159,7 +164,7 @@ public: } if (m_queues[priority].PushBack(core, member)) { - m_available_priorities[core].SetBit(priority); + m_available_priorities[core].set(std::size_t(priority)); } } @@ -172,7 +177,7 @@ public: } if (m_queues[priority].PushFront(core, member)) { - m_available_priorities[core].SetBit(priority); + m_available_priorities[core].set(std::size_t(priority)); } } @@ -185,14 +190,19 @@ public: } if (m_queues[priority].Remove(core, member)) { - m_available_priorities[core].ClearBit(priority); + m_available_priorities[core].reset(std::size_t(priority)); } } constexpr Member* GetFront(s32 core) const { ASSERT(IsValidCore(core)); - const s32 priority = static_cast(m_available_priorities[core].CountLeadingZero()); + const s32 priority = s32([](auto const& e) { + for (size_t i = 0; i < e.size(); ++i) + if (e[i]) + return i; + return e.size(); + }(m_available_priorities[core])); if (priority <= LowestPriority) { return m_queues[priority].GetFront(core); } else { @@ -211,16 +221,22 @@ public: } } + template + constexpr size_t GetNextSet(std::bitset const& bit, size_t n) const { + for (size_t i = n + 1; i < bit.size(); i++) + if (bit[i]) + return i; + return bit.size(); + } + constexpr Member* GetNext(s32 core, const Member* member) const { ASSERT(IsValidCore(core)); Member* next = member->GetPriorityQueueEntry(core).GetNext(); if (next == nullptr) { - const s32 priority = static_cast( - m_available_priorities[core].GetNextSet(member->GetPriority())); - if (priority <= LowestPriority) { + s32 priority = s32(GetNextSet(m_available_priorities[core], member->GetPriority())); + if (priority <= LowestPriority) next = m_queues[priority].GetFront(core); - } } return next; } @@ -250,7 +266,7 @@ public: private: std::array m_queues{}; - std::array, NumCores> m_available_priorities{}; + std::array, NumCores> m_available_priorities{}; }; private: diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index cf03353f84..80566b7e77 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp @@ -1266,6 +1266,10 @@ void KProcess::InitializeInterfaces() { #ifdef HAS_NCE if (this->IsApplication() && Settings::IsNceEnabled()) { + // Register the scoped JIT handler before creating any NCE instances + // so that its signal handler will appear first in the signal chain. + Core::ScopedJitExecution::RegisterHandler(); + for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { m_arm_interfaces[i] = std::make_unique(m_kernel.System(), true, i); } diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index df3e540dc2..d9a128c804 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -59,7 +62,7 @@ public: static constexpr u64 InitialProcessIdMax = 0x50; static constexpr u64 ProcessIdMin = InitialProcessIdMax + 1; - static constexpr u64 ProcessIdMax = std::numeric_limits::max(); + static constexpr u64 ProcessIdMax = (std::numeric_limits::max)(); private: using SharedMemoryInfoList = Common::IntrusiveListBaseTraits::ListType; diff --git a/src/core/hle/kernel/k_resource_limit.cpp b/src/core/hle/kernel/k_resource_limit.cpp index d8a63aaf8c..e886f97ebd 100644 --- a/src/core/hle/kernel/k_resource_limit.cpp +++ b/src/core/hle/kernel/k_resource_limit.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -111,7 +114,7 @@ bool KResourceLimit::Reserve(LimitableResource which, s64 value, s64 timeout) { if (m_current_values[index] + value <= m_limit_values[index]) { m_current_values[index] += value; m_current_hints[index] += value; - m_peak_values[index] = std::max(m_peak_values[index], m_current_values[index]); + m_peak_values[index] = (std::max)(m_peak_values[index], m_current_values[index]); return true; } diff --git a/src/core/hle/kernel/k_slab_heap.h b/src/core/hle/kernel/k_slab_heap.h index 334afebb71..c91e7969a2 100644 --- a/src/core/hle/kernel/k_slab_heap.h +++ b/src/core/hle/kernel/k_slab_heap.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -149,7 +152,7 @@ public: size_t GetObjectIndex(const void* obj) const { if constexpr (SupportDynamicExpansion) { if (!this->Contains(reinterpret_cast(obj))) { - return std::numeric_limits::max(); + return (std::numeric_limits::max)(); } } diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 8a360a839b..6b68a56ab4 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -1016,7 +1019,7 @@ void KThread::RestorePriority(KernelCore& kernel, KThread* thread) { s32 new_priority = thread->GetBasePriority(); for (const auto& held_lock : thread->m_held_lock_info_list) { new_priority = - std::min(new_priority, held_lock.GetHighestPriorityWaiter()->GetPriority()); + (std::min)(new_priority, held_lock.GetHighestPriorityWaiter()->GetPriority()); } // If the priority we would inherit is not different from ours, don't do anything. diff --git a/src/core/hle/kernel/k_thread_local_page.h b/src/core/hle/kernel/k_thread_local_page.h index 813f32a7ef..2d438ceb1f 100644 --- a/src/core/hle/kernel/k_thread_local_page.h +++ b/src/core/hle/kernel/k_thread_local_page.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,7 +13,7 @@ #include "common/assert.h" #include "common/common_types.h" #include "common/intrusive_red_black_tree.h" -#include "common/polyfill_ranges.h" +#include #include "core/hle/kernel/memory_types.h" #include "core/hle/kernel/slab_helpers.h" #include "core/hle/result.h" diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 00177dc943..0ff81066e9 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -507,7 +507,7 @@ struct KernelCore::Impl { constexpr size_t MiscRegionAlign = KernelAslrAlignment; constexpr size_t MiscRegionMinimumSize = 32_MiB; const size_t misc_region_size = Common::AlignUp( - std::max(misc_region_needed_size, MiscRegionMinimumSize), MiscRegionAlign); + (std::max)(misc_region_needed_size, MiscRegionMinimumSize), MiscRegionAlign); ASSERT(misc_region_size > 0); // Setup the misc region. diff --git a/src/core/hle/kernel/svc/svc_address_arbiter.cpp b/src/core/hle/kernel/svc/svc_address_arbiter.cpp index 90ee435219..688d6abce0 100644 --- a/src/core/hle/kernel/svc/svc_address_arbiter.cpp +++ b/src/core/hle/kernel/svc/svc_address_arbiter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -40,7 +43,7 @@ constexpr bool IsValidArbitrationType(Svc::ArbitrationType type) { // Wait for an address (via Address Arbiter) Result WaitForAddress(Core::System& system, u64 address, ArbitrationType arb_type, s32 value, s64 timeout_ns) { - LOG_TRACE(Kernel_SVC, "called, address=0x{:X}, arb_type=0x{:X}, value=0x{:X}, timeout_ns={}", + LOG_TRACE(Kernel_SVC, "called, address={:#X}, arb_type=0x{:X}, value=0x{:X}, timeout_ns={}", address, arb_type, value, timeout_ns); // Validate input. @@ -55,10 +58,10 @@ Result WaitForAddress(Core::System& system, u64 address, ArbitrationType arb_typ if (offset_tick > 0) { timeout = system.Kernel().HardwareTimer().GetTick() + offset_tick + 2; if (timeout <= 0) { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { timeout = timeout_ns; @@ -71,7 +74,7 @@ Result WaitForAddress(Core::System& system, u64 address, ArbitrationType arb_typ // Signals to an address (via Address Arbiter) Result SignalToAddress(Core::System& system, u64 address, SignalType signal_type, s32 value, s32 count) { - LOG_TRACE(Kernel_SVC, "called, address=0x{:X}, signal_type=0x{:X}, value=0x{:X}, count=0x{:X}", + LOG_TRACE(Kernel_SVC, "called, address={:#X}, signal_type=0x{:X}, value=0x{:X}, count=0x{:X}", address, signal_type, value, count); // Validate input. diff --git a/src/core/hle/kernel/svc/svc_code_memory.cpp b/src/core/hle/kernel/svc/svc_code_memory.cpp index 7be2802f07..4e7af9f575 100644 --- a/src/core/hle/kernel/svc/svc_code_memory.cpp +++ b/src/core/hle/kernel/svc/svc_code_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,7 @@ constexpr bool IsValidUnmapFromOwnerCodeMemoryPermission(MemoryPermission perm) } // namespace Result CreateCodeMemory(Core::System& system, Handle* out, u64 address, uint64_t size) { - LOG_TRACE(Kernel_SVC, "called, address=0x{:X}, size=0x{:X}", address, size); + LOG_TRACE(Kernel_SVC, "called, address={:#X}, size=0x{:X}", address, size); // Get kernel instance. auto& kernel = system.Kernel(); @@ -70,8 +73,8 @@ Result ControlCodeMemory(Core::System& system, Handle code_memory_handle, MemoryPermission perm) { LOG_TRACE(Kernel_SVC, - "called, code_memory_handle=0x{:X}, operation=0x{:X}, address=0x{:X}, size=0x{:X}, " - "permission=0x{:X}", + "called, code_memory_handle={:#X}, operation=0x{:X}, address=0x{:X}, size=0x{:X}, " + "permission={:#X}", code_memory_handle, operation, address, size, perm); // Validate the address / size. diff --git a/src/core/hle/kernel/svc/svc_condition_variable.cpp b/src/core/hle/kernel/svc/svc_condition_variable.cpp index bb678e6c56..2aed6a77be 100644 --- a/src/core/hle/kernel/svc/svc_condition_variable.cpp +++ b/src/core/hle/kernel/svc/svc_condition_variable.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -28,10 +31,10 @@ Result WaitProcessWideKeyAtomic(Core::System& system, u64 address, u64 cv_key, u if (offset_tick > 0) { timeout = system.Kernel().HardwareTimer().GetTick() + offset_tick + 2; if (timeout <= 0) { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { timeout = timeout_ns; @@ -45,7 +48,7 @@ Result WaitProcessWideKeyAtomic(Core::System& system, u64 address, u64 cv_key, u /// Signal process wide key void SignalProcessWideKey(Core::System& system, u64 cv_key, s32 count) { - LOG_TRACE(Kernel_SVC, "called, cv_key=0x{:X}, count=0x{:08X}", cv_key, count); + LOG_TRACE(Kernel_SVC, "called, cv_key={:#X}, count=0x{:08X}", cv_key, count); // Signal the condition variable. return GetCurrentProcess(system.Kernel()) diff --git a/src/core/hle/kernel/svc/svc_info.cpp b/src/core/hle/kernel/svc/svc_info.cpp index 37f4eba69c..16271883f2 100644 --- a/src/core/hle/kernel/svc/svc_info.cpp +++ b/src/core/hle/kernel/svc/svc_info.cpp @@ -15,7 +15,7 @@ namespace Kernel::Svc { /// Gets system/memory information for the current process Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle handle, u64 info_sub_id) { - LOG_TRACE(Kernel_SVC, "called info_id=0x{:X}, info_sub_id=0x{:X}, handle=0x{:08X}", + LOG_TRACE(Kernel_SVC, "called info_id={:#X}, info_sub_id=0x{:X}, handle=0x{:08X}", info_id_type, info_sub_id, handle); u32 info_id = static_cast(info_id_type); diff --git a/src/core/hle/kernel/svc/svc_ipc.cpp b/src/core/hle/kernel/svc/svc_ipc.cpp index b619bd70ab..db912b71fb 100644 --- a/src/core/hle/kernel/svc/svc_ipc.cpp +++ b/src/core/hle/kernel/svc/svc_ipc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -61,10 +64,10 @@ Result ReplyAndReceiveImpl(KernelCore& kernel, int32_t* out_index, uintptr_t mes if (offset_tick > 0) { timeout = kernel.HardwareTimer().GetTick() + offset_tick + 2; if (timeout <= 0) { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { timeout = timeout_ns; diff --git a/src/core/hle/kernel/svc/svc_lock.cpp b/src/core/hle/kernel/svc/svc_lock.cpp index 5f0833fcbf..c44317617e 100644 --- a/src/core/hle/kernel/svc/svc_lock.cpp +++ b/src/core/hle/kernel/svc/svc_lock.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,7 +13,7 @@ namespace Kernel::Svc { /// Attempts to locks a mutex Result ArbitrateLock(Core::System& system, Handle thread_handle, u64 address, u32 tag) { - LOG_TRACE(Kernel_SVC, "called thread_handle=0x{:08X}, address=0x{:X}, tag=0x{:08X}", + LOG_TRACE(Kernel_SVC, "called thread_handle=0x{:08X}, address={:#X}, tag=0x{:08X}", thread_handle, address, tag); // Validate the input address. @@ -22,7 +25,7 @@ Result ArbitrateLock(Core::System& system, Handle thread_handle, u64 address, u3 /// Unlock a mutex Result ArbitrateUnlock(Core::System& system, u64 address) { - LOG_TRACE(Kernel_SVC, "called address=0x{:X}", address); + LOG_TRACE(Kernel_SVC, "called address={:#X}", address); // Validate the input address. R_UNLESS(!IsKernelAddress(address), ResultInvalidCurrentMemory); diff --git a/src/core/hle/kernel/svc/svc_memory.cpp b/src/core/hle/kernel/svc/svc_memory.cpp index 4ca62860d5..740e11ff87 100644 --- a/src/core/hle/kernel/svc/svc_memory.cpp +++ b/src/core/hle/kernel/svc/svc_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -77,7 +80,7 @@ Result MapUnmapMemorySanityChecks(const KProcessPageTable& manager, u64 dst_addr } // namespace Result SetMemoryPermission(Core::System& system, u64 address, u64 size, MemoryPermission perm) { - LOG_DEBUG(Kernel_SVC, "called, address=0x{:016X}, size=0x{:X}, perm=0x{:08X}", address, size, + LOG_DEBUG(Kernel_SVC, "called, address=0x{:016X}, size={:#X}, perm=0x{:08X}", address, size, perm); // Validate address / size. @@ -99,7 +102,7 @@ Result SetMemoryPermission(Core::System& system, u64 address, u64 size, MemoryPe Result SetMemoryAttribute(Core::System& system, u64 address, u64 size, u32 mask, u32 attr) { LOG_DEBUG(Kernel_SVC, - "called, address=0x{:016X}, size=0x{:X}, mask=0x{:08X}, attribute=0x{:08X}", address, + "called, address=0x{:016X}, size={:#X}, mask=0x{:08X}, attribute=0x{:08X}", address, size, mask, attr); // Validate address / size. @@ -130,7 +133,7 @@ Result SetMemoryAttribute(Core::System& system, u64 address, u64 size, u32 mask, /// Maps a memory range into a different range. Result MapMemory(Core::System& system, u64 dst_addr, u64 src_addr, u64 size) { - LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, + LOG_TRACE(Kernel_SVC, "called, dst_addr={:#X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, src_addr, size); auto& page_table{GetCurrentProcess(system.Kernel()).GetPageTable()}; @@ -145,7 +148,7 @@ Result MapMemory(Core::System& system, u64 dst_addr, u64 src_addr, u64 size) { /// Unmaps a region that was previously mapped with svcMapMemory Result UnmapMemory(Core::System& system, u64 dst_addr, u64 src_addr, u64 size) { - LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, + LOG_TRACE(Kernel_SVC, "called, dst_addr={:#X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, src_addr, size); auto& page_table{GetCurrentProcess(system.Kernel()).GetPageTable()}; diff --git a/src/core/hle/kernel/svc/svc_physical_memory.cpp b/src/core/hle/kernel/svc/svc_physical_memory.cpp index 793e9f8d01..facf8ee638 100644 --- a/src/core/hle/kernel/svc/svc_physical_memory.cpp +++ b/src/core/hle/kernel/svc/svc_physical_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ namespace Kernel::Svc { /// Set the process heap to a given Size. It can both extend and shrink the heap. Result SetHeapSize(Core::System& system, u64* out_address, u64 size) { - LOG_TRACE(Kernel_SVC, "called, heap_size=0x{:X}", size); + LOG_TRACE(Kernel_SVC, "called, heap_size={:#X}", size); // Validate size. R_UNLESS(Common::IsAligned(size, HeapSizeAlignment), ResultInvalidSize); @@ -28,7 +31,7 @@ Result SetHeapSize(Core::System& system, u64* out_address, u64 size) { /// Maps memory at a desired address Result MapPhysicalMemory(Core::System& system, u64 addr, u64 size) { - LOG_DEBUG(Kernel_SVC, "called, addr=0x{:016X}, size=0x{:X}", addr, size); + LOG_DEBUG(Kernel_SVC, "called, addr=0x{:016X}, size={:#X}", addr, size); if (!Common::Is4KBAligned(addr)) { LOG_ERROR(Kernel_SVC, "Address is not aligned to 4KB, 0x{:016X}", addr); @@ -36,7 +39,7 @@ Result MapPhysicalMemory(Core::System& system, u64 addr, u64 size) { } if (!Common::Is4KBAligned(size)) { - LOG_ERROR(Kernel_SVC, "Size is not aligned to 4KB, 0x{:X}", size); + LOG_ERROR(Kernel_SVC, "Size is not aligned to 4KB, {:#X}", size); R_THROW(ResultInvalidSize); } @@ -77,7 +80,7 @@ Result MapPhysicalMemory(Core::System& system, u64 addr, u64 size) { /// Unmaps memory previously mapped via MapPhysicalMemory Result UnmapPhysicalMemory(Core::System& system, u64 addr, u64 size) { - LOG_DEBUG(Kernel_SVC, "called, addr=0x{:016X}, size=0x{:X}", addr, size); + LOG_DEBUG(Kernel_SVC, "called, addr=0x{:016X}, size={:#X}", addr, size); if (!Common::Is4KBAligned(addr)) { LOG_ERROR(Kernel_SVC, "Address is not aligned to 4KB, 0x{:016X}", addr); @@ -85,7 +88,7 @@ Result UnmapPhysicalMemory(Core::System& system, u64 addr, u64 size) { } if (!Common::Is4KBAligned(size)) { - LOG_ERROR(Kernel_SVC, "Size is not aligned to 4KB, 0x{:X}", size); + LOG_ERROR(Kernel_SVC, "Size is not aligned to 4KB, {:#X}", size); R_THROW(ResultInvalidSize); } diff --git a/src/core/hle/kernel/svc/svc_process.cpp b/src/core/hle/kernel/svc/svc_process.cpp index 5c3e8829ff..6d63892a94 100644 --- a/src/core/hle/kernel/svc/svc_process.cpp +++ b/src/core/hle/kernel/svc/svc_process.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -79,7 +82,7 @@ Result GetProcessList(Core::System& system, s32* out_num_processes, u64 out_proc const auto num_processes = process_list.size(); const auto copy_amount = - std::min(static_cast(out_process_ids_size), num_processes); + (std::min)(static_cast(out_process_ids_size), num_processes); for (std::size_t i = 0; i < copy_amount && it != process_list.end(); ++i, ++it) { memory.Write64(out_process_ids, (*it)->GetProcessId()); @@ -92,7 +95,7 @@ Result GetProcessList(Core::System& system, s32* out_num_processes, u64 out_proc Result GetProcessInfo(Core::System& system, s64* out, Handle process_handle, ProcessInfoType info_type) { - LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type=0x{:X}", process_handle, info_type); + LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type={:#X}", process_handle, info_type); const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable(); KScopedAutoObject process = handle_table.GetObject(process_handle); diff --git a/src/core/hle/kernel/svc/svc_process_memory.cpp b/src/core/hle/kernel/svc/svc_process_memory.cpp index e1427947b0..3313118dfa 100644 --- a/src/core/hle/kernel/svc/svc_process_memory.cpp +++ b/src/core/hle/kernel/svc/svc_process_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,7 +32,7 @@ constexpr bool IsValidProcessMemoryPermission(Svc::MemoryPermission perm) { Result SetProcessMemoryPermission(Core::System& system, Handle process_handle, u64 address, u64 size, Svc::MemoryPermission perm) { LOG_TRACE(Kernel_SVC, - "called, process_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", + "called, process_handle={:#X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", process_handle, address, size, perm); // Validate the address/size. @@ -59,7 +62,7 @@ Result SetProcessMemoryPermission(Core::System& system, Handle process_handle, u Result MapProcessMemory(Core::System& system, u64 dst_address, Handle process_handle, u64 src_address, u64 size) { LOG_TRACE(Kernel_SVC, - "called, dst_address=0x{:X}, process_handle=0x{:X}, src_address=0x{:X}, size=0x{:X}", + "called, dst_address={:#X}, process_handle=0x{:X}, src_address=0x{:X}, size=0x{:X}", dst_address, process_handle, src_address, size); // Validate the address/size. @@ -100,7 +103,7 @@ Result MapProcessMemory(Core::System& system, u64 dst_address, Handle process_ha Result UnmapProcessMemory(Core::System& system, u64 dst_address, Handle process_handle, u64 src_address, u64 size) { LOG_TRACE(Kernel_SVC, - "called, dst_address=0x{:X}, process_handle=0x{:X}, src_address=0x{:X}, size=0x{:X}", + "called, dst_address={:#X}, process_handle=0x{:X}, src_address=0x{:X}, size=0x{:X}", dst_address, process_handle, src_address, size); // Validate the address/size. diff --git a/src/core/hle/kernel/svc/svc_shared_memory.cpp b/src/core/hle/kernel/svc/svc_shared_memory.cpp index 012b1ae2bc..3ca07abe8b 100644 --- a/src/core/hle/kernel/svc/svc_shared_memory.cpp +++ b/src/core/hle/kernel/svc/svc_shared_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,7 +32,7 @@ constexpr bool IsValidSharedMemoryPermission(MemoryPermission perm) { Result MapSharedMemory(Core::System& system, Handle shmem_handle, u64 address, u64 size, Svc::MemoryPermission map_perm) { LOG_TRACE(Kernel_SVC, - "called, shared_memory_handle=0x{:X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", + "called, shared_memory_handle={:#X}, addr=0x{:X}, size=0x{:X}, permissions=0x{:08X}", shmem_handle, address, size, map_perm); // Validate the address/size. diff --git a/src/core/hle/kernel/svc/svc_synchronization.cpp b/src/core/hle/kernel/svc/svc_synchronization.cpp index fb03908d73..fdd4408d4d 100644 --- a/src/core/hle/kernel/svc/svc_synchronization.cpp +++ b/src/core/hle/kernel/svc/svc_synchronization.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -105,7 +108,7 @@ Result WaitSynchronization(Core::System& system, int32_t* out_index, u64 user_ha /// Resumes a thread waiting on WaitSynchronization Result CancelSynchronization(Core::System& system, Handle handle) { - LOG_TRACE(Kernel_SVC, "called handle=0x{:X}", handle); + LOG_TRACE(Kernel_SVC, "called handle={:#X}", handle); // Get the thread from its handle. KScopedAutoObject thread = diff --git a/src/core/hle/kernel/svc/svc_thread.cpp b/src/core/hle/kernel/svc/svc_thread.cpp index 7517bb9d39..ca5ce6fe07 100644 --- a/src/core/hle/kernel/svc/svc_thread.cpp +++ b/src/core/hle/kernel/svc/svc_thread.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -114,10 +117,10 @@ void SleepThread(Core::System& system, s64 ns) { if (offset_tick > 0) { timeout = kernel.HardwareTimer().GetTick() + offset_tick + 2; if (timeout <= 0) { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } } else { - timeout = std::numeric_limits::max(); + timeout = (std::numeric_limits::max)(); } // Sleep. @@ -136,7 +139,7 @@ void SleepThread(Core::System& system, s64 ns) { /// Gets the thread context Result GetThreadContext3(Core::System& system, u64 out_context, Handle thread_handle) { - LOG_DEBUG(Kernel_SVC, "called, out_context=0x{:08X}, thread_handle=0x{:X}", out_context, + LOG_DEBUG(Kernel_SVC, "called, out_context=0x{:08X}, thread_handle={:#X}", out_context, thread_handle); auto& kernel = system.Kernel(); @@ -223,7 +226,7 @@ Result GetThreadList(Core::System& system, s32* out_num_threads, u64 out_thread_ auto& memory = GetCurrentMemory(system.Kernel()); const auto& thread_list = current_process->GetThreadList(); const auto num_threads = thread_list.size(); - const auto copy_amount = std::min(static_cast(out_thread_ids_size), num_threads); + const auto copy_amount = (std::min)(static_cast(out_thread_ids_size), num_threads); auto list_iter = thread_list.cbegin(); for (std::size_t i = 0; i < copy_amount; ++i, ++list_iter) { diff --git a/src/core/hle/result.h b/src/core/hle/result.h index 316370266d..495e6e32c2 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -24,6 +27,7 @@ enum class ErrorModule : u32 { HTCS = 4, NCM = 5, DD = 6, + OSDBG = 7, LR = 8, Loader = 9, CMIF = 10, @@ -51,6 +55,7 @@ enum class ErrorModule : u32 { Util = 33, TIPC = 35, ANIF = 37, + CRT = 39, ETHC = 100, I2C = 101, GPIO = 102, @@ -106,6 +111,7 @@ enum class ErrorModule : u32 { Audio = 153, NPNS = 154, NPNSHTTPSTREAM = 155, + IDLE = 156, ARP = 157, SWKBD = 158, BOOT = 159, @@ -115,6 +121,7 @@ enum class ErrorModule : u32 { Fatal = 163, NIMShop = 164, SPSM = 165, + AOC = 166, BGTC = 167, UserlandCrash = 168, SASBUS = 169, @@ -176,13 +183,22 @@ enum class ErrorModule : u32 { DP2HDMI = 244, Cradle = 245, SProfile = 246, + Icm42607p = 248, NDRM = 250, + Fst2 = 251, + Nex = 306, + NPLN = 321, TSPM = 499, DevMenu = 500, + Nverpt = 520, + Am_StuckMonitor = 521, + Pia = 618, + Eagle = 623, GeneralWebApplet = 800, WifiWebAuthApplet = 809, WhitelistedApplet = 810, ShopN = 811, + Coral = 815 }; /// Encapsulates a Horizon OS error code, allowing it to be separated into its constituent fields. diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 51a542e5e6..e8ccd483ab 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -11,7 +11,7 @@ #include "common/fs/file.h" #include "common/fs/path_util.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "common/stb.h" #include "common/string_util.h" #include "common/swap.h" @@ -72,7 +72,7 @@ static void SanitizeJPEGImageSize(std::vector& image) { } } - image.resize(std::min(image.size(), max_jpeg_image_size)); + image.resize((std::min)(image.size(), max_jpeg_image_size)); } class IManagerForSystemService final : public ServiceFramework { @@ -647,7 +647,8 @@ public: {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, {2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"}, - {3, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, + {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCache"}, + {4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, {136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+ {150, nullptr, "CreateAuthorizationRequest"}, @@ -683,12 +684,25 @@ private: rb.PushIpcInterface(ensure_token_id); } - void LoadIdTokenCache(HLERequestContext& ctx) { + void LoadIdTokenCacheDeprecated(HLERequestContext& ctx) { LOG_WARNING(Service_ACC, "(STUBBED) called"); ensure_token_id->LoadIdTokenCache(ctx); } + void LoadIdTokenCache(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + + std::vector token_data(0x100); + std::fill(token_data.begin(), token_data.end(), u8(0)); + + ctx.WriteBuffer(token_data, 0); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(token_data.size())); + } + void GetNintendoAccountUserResourceCacheForApplication(HLERequestContext& ctx) { LOG_WARNING(Service_ACC, "(STUBBED) called"); diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp index 54844bfe7d..df4e5ad00b 100644 --- a/src/core/hle/service/acc/acc_u0.cpp +++ b/src/core/hle/service/acc/acc_u0.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,7 +21,8 @@ ACC_U0::ACC_U0(std::shared_ptr module_, std::shared_ptr {5, &ACC_U0::GetProfile, "GetProfile"}, {6, nullptr, "GetProfileDigest"}, // 3.0.0+ {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - {51, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, + {51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + {52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, {60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, diff --git a/src/core/hle/service/acc/profile_manager.cpp b/src/core/hle/service/acc/profile_manager.cpp index 71bf89f43f..12ea5f7aa1 100644 --- a/src/core/hle/service/acc/profile_manager.cpp +++ b/src/core/hle/service/acc/profile_manager.cpp @@ -4,15 +4,19 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include +#include +#include #include #include #include "common/fs/file.h" #include "common/fs/fs.h" +#include "common/fs/fs_types.h" #include "common/fs/path_util.h" -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "common/string_util.h" #include "core/hle/service/acc/profile_manager.h" @@ -90,6 +94,11 @@ bool ProfileManager::RemoveProfileAtIndex(std::size_t index) { return true; } +void ProfileManager::RemoveAllProfiles() +{ + profiles = {}; +} + /// Helper function to register a user to the system Result ProfileManager::AddUser(const ProfileInfo& user) { if (!AddToProfiles(user)) { @@ -259,8 +268,9 @@ void ProfileManager::CloseUser(UUID uuid) { /// Gets all valid user ids on the system UserIDArray ProfileManager::GetAllUsers() const { UserIDArray output{}; - std::ranges::transform(profiles, output.begin(), - [](const ProfileInfo& p) { return p.user_uuid; }); + std::ranges::transform(profiles, output.begin(), [](const ProfileInfo& p) { + return p.user_uuid; + }); return output; } @@ -387,18 +397,19 @@ bool ProfileManager::SetProfileBaseAndData(Common::UUID uuid, const ProfileBase& void ProfileManager::ParseUserSaveFile() { const auto save_path(FS::GetEdenPath(FS::EdenPath::NANDDir) / ACC_SAVE_AVATORS_BASE_PATH / "profiles.dat"); + const FS::IOFile save(save_path, FS::FileAccessMode::Read, FS::FileType::BinaryFile); if (!save.IsOpen()) { LOG_WARNING(Service_ACC, "Failed to load profile data from save data... Generating new " - "user 'eden' with random UUID."); + "user 'Eden' with random UUID."); return; } ProfileDataRaw data; if (!save.ReadObject(data)) { LOG_WARNING(Service_ACC, "profiles.dat is smaller than expected... Generating new user " - "'eden' with random UUID."); + "'Eden' with random UUID."); return; } @@ -471,6 +482,82 @@ void ProfileManager::WriteUserSaveFile() { is_save_needed = false; } +void ProfileManager::ResetUserSaveFile() +{ + RemoveAllProfiles(); + ParseUserSaveFile(); +} + +std::vector ProfileManager::FindOrphanedProfiles() +{ + std::vector good_uuids; + + for (const ProfileInfo& p : profiles) { + std::string uuid_string = [p]() -> std::string { + auto uuid = p.user_uuid; + + // "ignore" invalid uuids + if (uuid.IsInvalid()) { + return "0"; + } + + auto user_id = uuid.AsU128(); + + return fmt::format("{:016X}{:016X}", user_id[1], user_id[0]); + }(); + + good_uuids.emplace_back(uuid_string); + } + + // used for acnh, etc + good_uuids.emplace_back("00000000000000000000000000000000"); + + // TODO: fetch save_id programmatically + const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) + / "user/save/0000000000000000"; + + std::vector orphaned_profiles; + + Common::FS::IterateDirEntries( + path, + [&good_uuids, &orphaned_profiles](const std::filesystem::directory_entry& entry) -> bool { + const std::string uuid = entry.path().stem().string(); + + // first off, we should always clear empty profiles + // 99% of the time these are useless. If not, they are recreated anyways... + namespace fs = std::filesystem; + + const auto is_empty = [&entry]() -> bool { + try { + for (const auto& file : fs::recursive_directory_iterator(entry.path())) { + if (file.is_regular_file()) { + return true; + } + } + } catch (const fs::filesystem_error& e) { + // if we get an error--no worries, just pretend it's not empty + return false; + } + return false; + }(); + + if (!is_empty) { + fs::remove_all(entry); + return true; + } + + // if profiles.dat contains the UUID--all good + // if not--it's an orphaned profile and should be resolved by the user + if (std::find(good_uuids.begin(), good_uuids.end(), uuid) == good_uuids.end()) { + orphaned_profiles.emplace_back(uuid); + } + return true; + }, + Common::FS::DirEntryFilter::Directory); + + return orphaned_profiles; +} + void ProfileManager::SetUserPosition(u64 position, Common::UUID uuid) { auto idxOpt = GetUserIndex(uuid); if (!idxOpt) diff --git a/src/core/hle/service/acc/profile_manager.h b/src/core/hle/service/acc/profile_manager.h index d64e42715c..b164ed011a 100644 --- a/src/core/hle/service/acc/profile_manager.h +++ b/src/core/hle/service/acc/profile_manager.h @@ -103,10 +103,15 @@ public: void WriteUserSaveFile(); + void ResetUserSaveFile(); + + std::vector FindOrphanedProfiles(); + private: void ParseUserSaveFile(); std::optional AddToProfiles(const ProfileInfo& profile); bool RemoveProfileAtIndex(std::size_t index); + void RemoveAllProfiles(); bool is_save_needed{}; std::array profiles{}; diff --git a/src/core/hle/service/am/applet.cpp b/src/core/hle/service/am/applet.cpp index 59ade29c8e..aa355b06d5 100644 --- a/src/core/hle/service/am/applet.cpp +++ b/src/core/hle/service/am/applet.cpp @@ -1,5 +1,8 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator +// Project// SPDX-License-Identifier: GPL-2.0-or-later #include "core/core.h" #include "core/hle/service/am/applet.h" @@ -12,7 +15,7 @@ Applet::Applet(Core::System& system, std::unique_ptr process_, bool is_ process(std::move(process_)), hid_registration(system, *process), gpu_error_detected_event(context), friend_invitation_storage_channel_event(context), notification_storage_channel_event(context), health_warning_disappeared_system_event(context), - acquired_sleep_lock_event(context), pop_from_general_channel_event(context), + unknown_event(context), acquired_sleep_lock_event(context), pop_from_general_channel_event(context), library_applet_launchable_event(context), accumulated_suspended_tick_changed_event(context), sleep_lock_event(context), state_changed_event(context) { diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h index 835cfe6ec8..ad84f39dc7 100644 --- a/src/core/hle/service/am/applet.h +++ b/src/core/hle/service/am/applet.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,6 +8,7 @@ #include #include +#include #include "common/math_util.h" #include "core/hle/service/apm/apm_controller.h" @@ -20,6 +24,7 @@ #include "core/hle/service/am/hid_registration.h" #include "core/hle/service/am/lifecycle_manager.h" #include "core/hle/service/am/process_holder.h" +#include "core/hle/service/am/service/storage.h" namespace Service::AM { @@ -94,6 +99,9 @@ struct Applet { std::deque> preselected_user_launch_parameter{}; std::deque> friend_invitation_storage_channel{}; + // Context Stack + std::stack> context_stack{}; + // Caller applet std::weak_ptr caller_applet{}; std::shared_ptr caller_applet_broker{}; @@ -120,6 +128,7 @@ struct Applet { Event friend_invitation_storage_channel_event; Event notification_storage_channel_event; Event health_warning_disappeared_system_event; + Event unknown_event; Event acquired_sleep_lock_event; Event pop_from_general_channel_event; Event library_applet_launchable_event; diff --git a/src/core/hle/service/am/frontend/applet_cabinet.cpp b/src/core/hle/service/am/frontend/applet_cabinet.cpp index 4cbc80d639..71fa2a0c17 100644 --- a/src/core/hle/service/am/frontend/applet_cabinet.cpp +++ b/src/core/hle/service/am/frontend/applet_cabinet.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -118,7 +121,7 @@ void Cabinet::DisplayCompleted(bool apply_changes, std::string_view amiibo_name) case Service::NFP::CabinetMode::StartNicknameAndOwnerSettings: { Service::NFP::RegisterInfoPrivate register_info{}; std::memcpy(register_info.amiibo_name.data(), amiibo_name.data(), - std::min(amiibo_name.size(), register_info.amiibo_name.size() - 1)); + (std::min)(amiibo_name.size(), register_info.amiibo_name.size() - 1)); register_info.mii_store_data.BuildRandom(Mii::Age::All, Mii::Gender::All, Mii::Race::All); register_info.mii_store_data.SetNickname({u'y', u'u', u'z', u'u'}); nfp_device->SetRegisterInfoPrivate(register_info); diff --git a/src/core/hle/service/am/frontend/applet_controller.cpp b/src/core/hle/service/am/frontend/applet_controller.cpp index 66f52686d7..d5699d7848 100644 --- a/src/core/hle/service/am/frontend/applet_controller.cpp +++ b/src/core/hle/service/am/frontend/applet_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -31,7 +34,7 @@ static Core::Frontend::ControllerParameters ConvertToFrontendParameters( npad_style_set.raw = private_arg.style_set; return { - .min_players = std::max(s8{1}, header.player_count_min), + .min_players = (std::max)(s8{1}, header.player_count_min), .max_players = header.player_count_max, .keep_controllers_connected = header.enable_take_over_connection, .enable_single_mode = header.enable_single_mode, diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp index 5a787494a8..d99482a45c 100644 --- a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp @@ -18,6 +18,7 @@ IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& sys // clang-format off static const FunctionInfo functions[] = { {100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"}, + {110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"}, {200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"}, {201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"}, {300, nullptr, "OpenOverlayAppletProxy"}, @@ -25,6 +26,7 @@ IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& sys {400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, {410, nullptr, "GetSystemAppletControllerForDebug"}, {450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions"}, // 19.0.0+ + {460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions"}, // 20.0.0+ {1000, nullptr, "GetDebugFunctions"}, }; // clang-format on @@ -99,6 +101,14 @@ Result IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions() { R_SUCCEED(); } +Result IAllSystemAppletProxiesService::GetAppletAlternativeFunctions() { + LOG_DEBUG(Service_AM, "(STUBBED) called."); + + // TODO (maufeat) + + R_SUCCEED(); +} + std::shared_ptr IAllSystemAppletProxiesService::GetAppletFromProcessId( ProcessId process_id) { return m_window_system.GetByAppletResourceUserId(process_id.pid); diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.h b/src/core/hle/service/am/service/all_system_applet_proxies_service.h index a3111c4c9b..525525c795 100644 --- a/src/core/hle/service/am/service/all_system_applet_proxies_service.h +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.h @@ -39,6 +39,7 @@ private: InCopyHandle process_handle, InLargeData attribute); Result GetSystemProcessCommonFunctions(); + Result GetAppletAlternativeFunctions(); private: std::shared_ptr GetAppletFromProcessId(ProcessId pid); diff --git a/src/core/hle/service/am/service/applet_common_functions.cpp b/src/core/hle/service/am/service/applet_common_functions.cpp index 1c9cd74533..6a73a896f9 100644 --- a/src/core/hle/service/am/service/applet_common_functions.cpp +++ b/src/core/hle/service/am/service/applet_common_functions.cpp @@ -35,6 +35,7 @@ IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_, {310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+ {320, nullptr, "SetGpuTimeSliceBoost"}, //19.0.0+ {321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+ + {350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+ }; // clang-format on @@ -70,4 +71,10 @@ Result IAppletCommonFunctions::GetCurrentApplicationId(Out out_application_ R_SUCCEED(); } +Result IAppletCommonFunctions::Unknown350(Out out_unknown) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_unknown = 0; + R_SUCCEED(); +} + } // namespace Service::AM diff --git a/src/core/hle/service/am/service/applet_common_functions.h b/src/core/hle/service/am/service/applet_common_functions.h index 376f85acf7..623efdb7fc 100644 --- a/src/core/hle/service/am/service/applet_common_functions.h +++ b/src/core/hle/service/am/service/applet_common_functions.h @@ -20,6 +20,7 @@ private: Result GetHomeButtonDoubleClickEnabled(Out out_home_button_double_click_enabled); Result SetCpuBoostRequestPriority(s32 priority); Result GetCurrentApplicationId(Out out_application_id); + Result Unknown350(Out out_unknown); const std::shared_ptr applet; }; diff --git a/src/core/hle/service/am/service/application_accessor.cpp b/src/core/hle/service/am/service/application_accessor.cpp index 986abc716a..88a1724fc6 100644 --- a/src/core/hle/service/am/service/application_accessor.cpp +++ b/src/core/hle/service/am/service/application_accessor.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -115,7 +118,7 @@ Result IApplicationAccessor::GetApplicationControlProperty( R_TRY(system.GetARPManager().GetControlProperty(&nacp, m_applet->program_id)); std::memcpy(out_control_property.data(), nacp.data(), - std::min(out_control_property.size(), nacp.size())); + (std::min)(out_control_property.size(), nacp.size())); R_SUCCEED(); } diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp index 560244c714..eacc345e15 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -85,6 +88,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ {181, nullptr, "UpgradeLaunchRequiredVersion"}, {190, nullptr, "SendServerMaintenanceOverlayNotification"}, {200, nullptr, "GetLastApplicationExitReason"}, + {210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"}, {500, nullptr, "StartContinuousRecordingFlushForDebug"}, {1000, nullptr, "CreateMovieMaker"}, {1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"}, @@ -212,7 +216,7 @@ Result IApplicationFunctions::GetDisplayVersion(Out out_display_ if (res.first != nullptr) { const auto& version = res.first->GetVersionString(); std::memcpy(out_display_version->string.data(), version.data(), - std::min(version.size(), out_display_version->string.size())); + (std::min)(version.size(), out_display_version->string.size())); } else { static constexpr char default_version[]{"1.0.0"}; std::memcpy(out_display_version->string.data(), default_version, sizeof(default_version)); @@ -280,7 +284,7 @@ Result IApplicationFunctions::GetCacheStorageMax(Out out_cache_storage_inde R_TRY(system.GetARPManager().GetControlProperty(&nacp, m_applet->program_id)); auto raw_nacp = std::make_unique(); - std::memcpy(raw_nacp.get(), nacp.data(), std::min(sizeof(*raw_nacp), nacp.size())); + std::memcpy(raw_nacp.get(), nacp.data(), (std::min)(sizeof(*raw_nacp), nacp.size())); *out_cache_storage_index_max = static_cast(raw_nacp->cache_storage_max_index); *out_max_journal_size = static_cast(raw_nacp->cache_storage_data_and_journal_max_size); @@ -487,6 +491,13 @@ Result IApplicationFunctions::GetHealthWarningDisappearedSystemEvent( R_SUCCEED(); } +Result IApplicationFunctions::GetUnknownEvent210( + OutCopyHandle out_event) { + LOG_DEBUG(Service_AM, "called"); + *out_event = m_applet->unknown_event.GetHandle(); + R_SUCCEED(); +} + Result IApplicationFunctions::PrepareForJit() { LOG_WARNING(Service_AM, "(STUBBED) called"); diff --git a/src/core/hle/service/am/service/application_functions.h b/src/core/hle/service/am/service/application_functions.h index 10025a152b..35b3e9505d 100644 --- a/src/core/hle/service/am/service/application_functions.h +++ b/src/core/hle/service/am/service/application_functions.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -76,6 +79,7 @@ private: Result TryPopFromFriendInvitationStorageChannel(Out> out_storage); Result GetNotificationStorageChannelEvent(OutCopyHandle out_event); Result GetHealthWarningDisappearedSystemEvent(OutCopyHandle out_event); + Result GetUnknownEvent210(OutCopyHandle out_event); Result PrepareForJit(); const std::shared_ptr m_applet; diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index 413388d40a..54790838e0 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -113,9 +113,11 @@ std::shared_ptr CreateGuestApplet(Core::System& system, Firmware1700 = 17, Firmware1800 = 18, Firmware1900 = 19, + Firmware2000 = 20, + Firmware2100 = 21, }; - auto process = CreateProcess(system, program_id, Firmware1400, Firmware1900); + auto process = CreateProcess(system, program_id, Firmware1400, Firmware2100); if (!process) { // Couldn't initialize the guest process return {}; diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp index cbe45189f8..4d36d306bd 100644 --- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -162,7 +165,7 @@ Result ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty( system.GetARPManager().GetControlProperty(&nacp, application.application_id); if (R_SUCCEEDED(result)) { - std::memcpy(out_nacp->data(), nacp.data(), std::min(nacp.size(), out_nacp->size())); + std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size())); } R_RETURN(result); diff --git a/src/core/hle/service/am/service/process_winding_controller.cpp b/src/core/hle/service/am/service/process_winding_controller.cpp index 10df830d70..30529de550 100644 --- a/src/core/hle/service/am/service/process_winding_controller.cpp +++ b/src/core/hle/service/am/service/process_winding_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,12 +18,12 @@ IProcessWindingController::IProcessWindingController(Core::System& system_, static const FunctionInfo functions[] = { {0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"}, {11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"}, - {21, nullptr, "PushContext"}, - {22, nullptr, "PopContext"}, - {23, nullptr, "CancelWindingReservation"}, - {30, nullptr, "WindAndDoReserved"}, - {40, nullptr, "ReserveToStartAndWaitAndUnwindThis"}, - {41, nullptr, "ReserveToStartAndWait"}, + {21, D<&IProcessWindingController::PushContext>, "PushContext"}, + {22, D<&IProcessWindingController::PopContext>, "PopContext"}, + {23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"}, + {30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"}, + {40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"}, + {41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"}, }; // clang-format on @@ -51,4 +54,43 @@ Result IProcessWindingController::OpenCallingLibraryApplet( R_SUCCEED(); } +Result IProcessWindingController::PushContext(SharedPointer context) { + LOG_INFO(Service_AM, "called"); + m_applet->context_stack.push(context); + R_SUCCEED(); +} + +Result IProcessWindingController::PopContext(Out> out_context) { + LOG_INFO(Service_AM, "called"); + + if (m_applet->context_stack.empty()) { + LOG_ERROR(Service_AM, "Context stack is empty"); + R_THROW(ResultUnknown); + } + + *out_context = m_applet->context_stack.top(); + m_applet->context_stack.pop(); + R_SUCCEED(); +} + +Result IProcessWindingController::CancelWindingReservation() { + LOG_WARNING(Service_AM, "STUBBED"); + R_SUCCEED(); +} + +Result IProcessWindingController::WindAndDoReserved() { + LOG_WARNING(Service_AM, "STUBBED"); + R_SUCCEED(); +} + +Result IProcessWindingController::ReserveToStartAndWaitAndUnwindThis() { + LOG_WARNING(Service_AM, "STUBBED"); + R_SUCCEED(); +} + +Result IProcessWindingController::ReserveToStartAndWait() { + LOG_WARNING(Service_AM, "STUBBED"); + R_SUCCEED(); +} + } // namespace Service::AM diff --git a/src/core/hle/service/am/service/process_winding_controller.h b/src/core/hle/service/am/service/process_winding_controller.h index 4408af1f1d..0d53223033 100644 --- a/src/core/hle/service/am/service/process_winding_controller.h +++ b/src/core/hle/service/am/service/process_winding_controller.h @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include "core/hle/service/am/service/storage.h" #include "core/hle/service/am/am_types.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" @@ -21,6 +25,12 @@ private: Result GetLaunchReason(Out out_launch_reason); Result OpenCallingLibraryApplet( Out> out_calling_library_applet); + Result PushContext(SharedPointer in_context); + Result PopContext(Out> out_context); + Result CancelWindingReservation(); + Result WindAndDoReserved(); + Result ReserveToStartAndWaitAndUnwindThis(); + Result ReserveToStartAndWait(); const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp index 1db02b88fd..1b58cbea27 100644 --- a/src/core/hle/service/am/service/self_controller.cpp +++ b/src/core/hle/service/am/service/self_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -67,6 +70,7 @@ ISelfController::ISelfController(Core::System& system_, std::shared_ptr {110, nullptr, "SetApplicationAlbumUserData"}, {120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"}, {130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"}, + {230, D<&ISelfController::Unknown230>, "Unknown230"}, {1000, nullptr, "GetDebugStorageChannel"}, }; // clang-format on @@ -404,4 +408,12 @@ Result ISelfController::SetRecordVolumeMuted(bool muted) { R_SUCCEED(); } +Result ISelfController::Unknown230(u32 in_val, Out out_val) { + LOG_WARNING(Service_AM, "(STUBBED) called, in_val={}", in_val); + + *out_val = 0; + + R_SUCCEED(); +} + } // namespace Service::AM diff --git a/src/core/hle/service/am/service/self_controller.h b/src/core/hle/service/am/service/self_controller.h index eca083cfe5..86cd9f1118 100644 --- a/src/core/hle/service/am/service/self_controller.h +++ b/src/core/hle/service/am/service/self_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -63,6 +66,7 @@ private: Result SetAlbumImageTakenNotificationEnabled(bool enabled); Result SaveCurrentScreenshot(Capture::AlbumReportOption album_report_option); Result SetRecordVolumeMuted(bool muted); + Result Unknown230(u32 in_val, Out out_val); Kernel::KProcess* const m_process; const std::shared_ptr m_applet; diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp index 63b1072d2a..253eff9d16 100644 --- a/src/core/hle/service/bcat/bcat_service.cpp +++ b/src/core/hle/service/bcat/bcat_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -102,7 +105,7 @@ Result IBcatService::SetPassphrase(u64 application_id, Passphrase passphrase{}; std::memcpy(passphrase.data(), passphrase_buffer.data(), - std::min(passphrase.size(), passphrase_buffer.size())); + (std::min)(passphrase.size(), passphrase_buffer.size())); backend.SetPassphrase(application_id, passphrase); R_SUCCEED(); diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp index 01f08a2fc5..70b875a2bf 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -15,7 +18,7 @@ namespace Service::BCAT { static BcatDigest DigestFile(const FileSys::VirtualFile& file) { BcatDigest out{}; const auto bytes = file->ReadAllBytes(); - mbedtls_md5_ret(bytes.data(), bytes.size(), out.data()); + mbedtls_md5(bytes.data(), bytes.size(), out.data()); return out; } @@ -57,12 +60,12 @@ Result IDeliveryCacheDirectoryService::Read( R_UNLESS(current_dir != nullptr, ResultNoOpenEntry); const auto files = current_dir->GetFiles(); - *out_count = static_cast(std::min(files.size(), out_buffer.size())); + *out_count = static_cast((std::min)(files.size(), out_buffer.size())); std::transform(files.begin(), files.begin() + *out_count, out_buffer.begin(), [](const auto& file) { FileName name{}; std::memcpy(name.data(), file->GetName().data(), - std::min(file->GetName().size(), name.size())); + (std::min)(file->GetName().size(), name.size())); return DeliveryCacheDirectoryEntry{name, file->GetSize(), DigestFile(file)}; }); R_SUCCEED(); diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp index 4c79d71f41..46ed4dae67 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -47,7 +50,7 @@ Result IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory( LOG_DEBUG(Service_BCAT, "called, size={:016X}", out_directories.size()); *out_directory_count = - static_cast(std::min(out_directories.size(), entries.size() - next_read_index)); + static_cast((std::min)(out_directories.size(), entries.size() - next_read_index)); memcpy(out_directories.data(), entries.data() + next_read_index, *out_directory_count * sizeof(DirectoryName)); next_read_index += *out_directory_count; diff --git a/src/core/hle/service/cmif_serialization.h b/src/core/hle/service/cmif_serialization.h index 5a5f610f34..cdbf32c8ee 100644 --- a/src/core/hle/service/cmif_serialization.h +++ b/src/core/hle/service/cmif_serialization.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -304,7 +307,7 @@ void ReadInArgument(bool is_domain, CallArguments& args, const u8* raw_data, HLE buffer = ctx.ReadBufferX(InBufferIndex); } - std::memcpy(&std::get(args), buffer.data(), std::min(BufferSize, buffer.size())); + std::memcpy(&std::get(args), buffer.data(), (std::min)(BufferSize, buffer.size())); return ReadInArgument(is_domain, args, raw_data, ctx, temp); } else if constexpr (ArgumentTraits::Type == ArgumentType::InBuffer) { diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 9eaae4c4bd..4b7d7dc753 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -203,7 +206,7 @@ private: std::transform(tickets.begin(), tickets.end(), std::back_inserter(ids), [](const auto& pair) { return pair.first; }); - out_entries = std::min(ids.size(), out_entries); + out_entries = (std::min)(ids.size(), out_entries); ctx.WriteBuffer(ids.data(), out_entries * sizeof(u128)); IPC::ResponseBuilder rb{ctx, 3}; @@ -225,7 +228,7 @@ private: std::transform(tickets.begin(), tickets.end(), std::back_inserter(ids), [](const auto& pair) { return pair.first; }); - out_entries = std::min(ids.size(), out_entries); + out_entries = (std::min)(ids.size(), out_entries); ctx.WriteBuffer(ids.data(), out_entries * sizeof(u128)); IPC::ResponseBuilder rb{ctx, 3}; diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index dfcac1ffda..360abf5da9 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -68,7 +71,7 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F std::string crash_report = fmt::format( "Yuzu {}-{} crash report\n" "Title ID: {:016x}\n" - "Result: 0x{:X} ({:04}-{:04d})\n" + "Result: {:#X} ({:04}-{:04d})\n" "Set flags: 0x{:16X}\n" "Program entry point: 0x{:16X}\n" "\n", @@ -108,7 +111,7 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F static void ThrowFatalError(Core::System& system, Result error_code, FatalType fatal_type, const FatalInfo& info) { - LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", fatal_type, + LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code {:#X}", fatal_type, error_code.raw); switch (fatal_type) { diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp index a355d46ae1..ef9dd60ae1 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,7 +30,7 @@ Result IFile::Read( FileSys::ReadOption option, Out out_size, s64 offset, const OutBuffer out_buffer, s64 size) { - LOG_DEBUG(Service_FS, "called, option={}, offset=0x{:X}, length={}", option.value, offset, + LOG_DEBUG(Service_FS, "called, option={}, offset={:#X}, length={}", option.value, offset, size); // Read the data from the Storage backend @@ -38,7 +41,7 @@ Result IFile::Read( Result IFile::Write( const InBuffer buffer, FileSys::WriteOption option, s64 offset, s64 size) { - LOG_DEBUG(Service_FS, "called, option={}, offset=0x{:X}, length={}", option.value, offset, + LOG_DEBUG(Service_FS, "called, option={}, offset={:#X}, length={}", option.value, offset, size); R_RETURN(backend->Write(offset, buffer.data(), size, option)); diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp index d881e144d3..352b8f77b0 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -38,7 +41,7 @@ IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGe Result IFileSystem::CreateFile(const InLargeData path, s32 option, s64 size) { - LOG_DEBUG(Service_FS, "called. file={}, option=0x{:X}, size=0x{:08X}", path->str, option, size); + LOG_DEBUG(Service_FS, "called. file={}, option={:#X}, size=0x{:08X}", path->str, option, size); R_RETURN(backend->CreateFile(FileSys::Path(path->str), size)); } diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp index ff823586b3..495b131df4 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -44,7 +47,7 @@ Result ISaveDataInfoReader::ReadSaveDataInfo( const u64 count_entries = out_entries.size(); // Cap at total number of entries. - const u64 actual_entries = std::min(count_entries, info.size() - next_entry_index); + const u64 actual_entries = (std::min)(count_entries, info.size() - next_entry_index); // Determine data start and end const auto* begin = reinterpret_cast(info.data() + next_entry_index); diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp index 213f198085..376a8bda29 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -23,7 +26,7 @@ IStorage::IStorage(Core::System& system_, FileSys::VirtualFile backend_) Result IStorage::Read( OutBuffer out_bytes, s64 offset, s64 length) { - LOG_DEBUG(Service_FS, "called, offset=0x{:X}, length={}", offset, length); + LOG_DEBUG(Service_FS, "called, offset={:#X}, length={}", offset, length); R_UNLESS(length >= 0, FileSys::ResultInvalidSize); R_UNLESS(offset >= 0, FileSys::ResultInvalidOffset); diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp index 5a03d34c12..3daec85210 100644 --- a/src/core/hle/service/glue/notif.cpp +++ b/src/core/hle/service/glue/notif.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -67,7 +70,7 @@ Result NotificationServiceImpl::ListAlarmSettings(s32* out_count, std::span out_alarms) { LOG_INFO(Service_NOTIF, "called, alarm_count={}", alarms.size()); - const auto count = std::min(out_alarms.size(), alarms.size()); + const auto count = (std::min)(out_alarms.size(), alarms.size()); for (size_t i = 0; i < count; i++) { out_alarms[i] = alarms[i]; } @@ -90,7 +93,7 @@ Result NotificationServiceImpl::LoadApplicationParameter(u32* out_size, LOG_WARNING(Service_NOTIF, "(STUBBED) called, alarm_setting_id={}", alarm_setting_id); std::memcpy(out_application_parameter.data(), application_parameter.data(), - std::min(sizeof(application_parameter), out_application_parameter.size())); + (std::min)(sizeof(application_parameter), out_application_parameter.size())); *out_size = static_cast(application_parameter.size()); R_SUCCEED(); diff --git a/src/core/hle/service/glue/time/manager.cpp b/src/core/hle/service/glue/time/manager.cpp index 77bf8896cd..0da790e1c8 100644 --- a/src/core/hle/service/glue/time/manager.cpp +++ b/src/core/hle/service/glue/time/manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,7 +32,7 @@ static s64 CalendarTimeToEpoch(Service::PSC::Time::CalendarTime calendar) { }; s16 month_s16{calendar.month}; - s8 month{static_cast(((month_s16 * 43) & ~std::numeric_limits::max()) + + s8 month{static_cast(((month_s16 * 43) & ~(std::numeric_limits::max)()) + ((month_s16 * 43) >> 9))}; s8 month_index{static_cast(calendar.month - 12 * month)}; if (month_index == 0) { @@ -71,13 +74,13 @@ static Service::PSC::Time::LocationName GetTimeZoneString( Service::PSC::Time::LocationName configured_name{}; std::memcpy(configured_name.data(), configured_zone.data(), - std::min(configured_name.size(), configured_zone.size())); + (std::min)(configured_name.size(), configured_zone.size())); if (!time_zone_binary.IsValid(configured_name)) { configured_zone = Common::TimeZone::FindSystemTimeZone(); configured_name = {}; std::memcpy(configured_name.data(), configured_zone.data(), - std::min(configured_name.size(), configured_zone.size())); + (std::min)(configured_name.size(), configured_zone.size())); } ASSERT_MSG(time_zone_binary.IsValid(configured_name), "Invalid time zone {}!", diff --git a/src/core/hle/service/hid/applet_resource.cpp b/src/core/hle/service/hid/applet_resource.cpp index 4814d7ad51..4c5df44be5 100644 --- a/src/core/hle/service/hid/applet_resource.cpp +++ b/src/core/hle/service/hid/applet_resource.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -27,7 +30,7 @@ Result IAppletResource::GetSharedMemoryHandle( OutCopyHandle out_shared_memory_handle) { const auto result = resource_manager->GetSharedMemoryHandle(out_shared_memory_handle, aruid); - LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, result=0x{:X}", aruid, result.raw); + LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, result={:#X}", aruid, result.raw); R_RETURN(result); } diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp index 738c6d9ae2..0a5d479094 100644 --- a/src/core/hle/service/hid/hid_debug_server.cpp +++ b/src/core/hle/service/hid/hid_debug_server.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -178,7 +181,7 @@ Result IHidDebugServer::SetTouchScreenAutoPilotState( AutoPilotState auto_pilot{}; auto_pilot.count = - static_cast(std::min(auto_pilot_buffer.size(), auto_pilot.state.size())); + static_cast((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size())); memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), auto_pilot.count * sizeof(TouchState)); diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp index ebda7fc3f2..1749c53ca2 100644 --- a/src/core/hle/service/hid/hid_server.cpp +++ b/src/core/hle/service/hid/hid_server.cpp @@ -200,7 +200,7 @@ Result IHidServer::CreateAppletResource(OutInterface out_applet ClientAppletResourceUserId aruid) { const auto result = GetResourceManager()->CreateAppletResource(aruid.pid); - LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, result=0x{:X}", aruid.pid, + LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, result={:#X}", aruid.pid, result.raw); *out_applet_resource = std::make_shared(system, resource_manager, aruid.pid); diff --git a/src/core/hle/service/jit/jit_context.cpp b/src/core/hle/service/jit/jit_context.cpp index 0090e8568d..8fd7db17c2 100644 --- a/src/core/hle/service/jit/jit_context.cpp +++ b/src/core/hle/service/jit/jit_context.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -107,7 +110,7 @@ public: void AddTicks(u64 ticks) override {} u64 GetTicksRemaining() override { - return std::numeric_limits::max(); + return (std::numeric_limits::max)(); } u64 GetCNTPCT() override { return 0; diff --git a/src/core/hle/service/ldn/lan_discovery.cpp b/src/core/hle/service/ldn/lan_discovery.cpp index 7d677e6664..f37dbe492f 100644 --- a/src/core/hle/service/ldn/lan_discovery.cpp +++ b/src/core/hle/service/ldn/lan_discovery.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/ldn/lan_discovery.h" #include "core/internal_network/network.h" diff --git a/src/core/hle/service/ldn/ldn_types.h b/src/core/hle/service/ldn/ldn_types.h index fa0cdcbfa7..975af5b6c8 100644 --- a/src/core/hle/service/ldn/ldn_types.h +++ b/src/core/hle/service/ldn/ldn_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -170,7 +173,7 @@ struct Ssid { Ssid() = default; constexpr explicit Ssid(std::string_view data) { - length = static_cast(std::min(data.size(), SsidLengthMax)); + length = static_cast((std::min)(data.size(), SsidLengthMax)); raw = {}; data.copy(raw.data(), length); raw[length] = 0; diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp index 69170a879d..b8770120a7 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.cpp +++ b/src/core/hle/service/ldn/user_local_communication_service.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index 20df002330..3fbde3db8e 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -180,7 +183,7 @@ private: if (length == 0) { return std::nullopt; } - const auto length_to_read = std::min(length, data.size() - offset); + const auto length_to_read = (std::min)(length, data.size() - offset); std::string output(length_to_read, '\0'); std::memcpy(output.data(), data.data() + offset, length_to_read); diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp index 30eab469a1..98ed7b97bc 100644 --- a/src/core/hle/service/nfc/common/device.cpp +++ b/src/core/hle/service/nfc/common/device.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -978,7 +981,7 @@ Result NfcDevice::GetApplicationArea(std::span data) const { } memcpy(data.data(), tag_data.application_area.data(), - std::min(data.size(), sizeof(NFP::ApplicationArea))); + (std::min)(data.size(), sizeof(NFP::ApplicationArea))); return ResultSuccess; } diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 4710167364..b486e56d68 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -32,8 +33,10 @@ #undef interface #include #pragma pop_macro("interface") +#ifdef _MSC_VER #pragma comment(lib, "wlanapi.lib") #endif +#endif namespace { @@ -378,7 +381,7 @@ public: private: void Submit(HLERequestContext& ctx) { - LOG_WARNING(Service_NIFM, "(STUBBED) called"); + LOG_DEBUG(Service_NIFM, "(STUBBED) called"); if (state == RequestState::NotSubmitted) { UpdateState(RequestState::OnHold); @@ -389,7 +392,7 @@ private: } void GetRequestState(HLERequestContext& ctx) { - LOG_WARNING(Service_NIFM, "(STUBBED) called"); + LOG_DEBUG(Service_NIFM, "(STUBBED) called"); IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); @@ -421,7 +424,7 @@ private: } void GetResult(HLERequestContext& ctx) { - LOG_WARNING(Service_NIFM, "(STUBBED) called"); + LOG_DEBUG(Service_NIFM, "(STUBBED) called"); const auto result = [this] { const auto has_connection = Network::GetHostIPv4Address().has_value() && @@ -483,7 +486,7 @@ private: } void UpdateState(RequestState new_state) { - LOG_WARNING(Service_NIFM, "(STUBBED) called"); + LOG_DEBUG(Service_NIFM, "(STUBBED) called"); state = new_state; event1->Signal(); } @@ -613,7 +616,7 @@ void IGeneralService::EnumerateNetworkInterfaces(HLERequestContext& ctx) { const size_t guest_bytes = ctx.GetWriteBufferSize(); if (guest_bytes && !blob.empty()) - ctx.WriteBuffer(blob.data(), std::min(guest_bytes, blob.size())); + ctx.WriteBuffer(blob.data(), (std::min)(guest_bytes, blob.size())); IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); @@ -639,7 +642,7 @@ void IGeneralService::EnumerateNetworkProfiles(HLERequestContext& ctx) { const size_t guest_sz = ctx.GetWriteBufferSize(); if (guest_sz && uuids.size()) { - const size_t to_copy = std::min(guest_sz, uuids.size() * sizeof(u128)); + const size_t to_copy = (std::min)(guest_sz, uuids.size() * sizeof(u128)); ctx.WriteBuffer(uuids.data(), to_copy); } diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index f1ddba8231..60ecd5c2b9 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -306,6 +306,9 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ {3013, nullptr, "IsGameCardEnabled"}, {3014, nullptr, "IsLocalContentShareEnabled"}, {3050, nullptr, "ListAssignELicenseTaskResult"}, + {4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022"}, + {4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023"}, + {4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088"}, {9999, nullptr, "GetApplicationCertificate"}, }; // clang-format on @@ -407,7 +410,7 @@ Result IApplicationManagerInterface::IsAnyApplicationEntityInstalled( Result IApplicationManagerInterface::GetApplicationView( OutArray out_application_views, InArray application_ids) { - const auto size = std::min(out_application_views.size(), application_ids.size()); + const auto size = (std::min)(out_application_views.size(), application_ids.size()); LOG_WARNING(Service_NS, "(STUBBED) called, size={}", application_ids.size()); for (size_t i = 0; i < size; i++) { @@ -425,7 +428,7 @@ Result IApplicationManagerInterface::GetApplicationView( Result IApplicationManagerInterface::GetApplicationViewWithPromotionInfo( OutArray out_application_views, InArray application_ids) { - const auto size = std::min(out_application_views.size(), application_ids.size()); + const auto size = (std::min)(out_application_views.size(), application_ids.size()); LOG_WARNING(Service_NS, "(STUBBED) called, size={}", application_ids.size()); for (size_t i = 0; i < size; i++) { @@ -523,4 +526,17 @@ Result IApplicationManagerInterface::GetApplicationTerminateResult(Out o R_SUCCEED(); } +Result IApplicationManagerInterface::Unknown4022( + OutCopyHandle out_event) { + LOG_WARNING(Service_NS, "(STUBBED) called"); + *out_event = gamecard_update_detection_event.GetHandle(); + R_SUCCEED(); +} + +Result IApplicationManagerInterface::Unknown4023(Out out_result) { + LOG_WARNING(Service_NS, "(STUBBED) called."); + *out_result = 0; + R_SUCCEED(); +} + } // namespace Service::NS diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index 2def50bd5c..251f93ee06 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -53,6 +53,8 @@ public: u64 application_id); Result CheckApplicationLaunchVersion(u64 application_id); Result GetApplicationTerminateResult(Out out_result, u64 application_id); + Result Unknown4022(OutCopyHandle out_event); + Result Unknown4023(Out out_result); private: KernelHelpers::ServiceContext service_context; diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index 23cf05005c..8468661b20 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -254,7 +257,7 @@ Result IPlatformServiceManager::GetSharedFontInOrderOfPriority( constexpr size_t MaxElementCount = 6; // TODO(ogniK): Have actual priority order - const auto max_size = std::min({MaxElementCount, out_font_codes.size(), out_font_offsets.size(), + const auto max_size = (std::min)({MaxElementCount, out_font_codes.size(), out_font_offsets.size(), out_font_sizes.size(), impl->shared_font_regions.size()}); for (size_t i = 0; i < max_size; i++) { diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp index 1384005415..a4632cb6c8 100644 --- a/src/core/hle/service/ns/query_service.cpp +++ b/src/core/hle/service/ns/query_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,7 +32,7 @@ IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, {14, nullptr, "QueryRecentlyPlayedApplication"}, {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, - {17, nullptr, "QueryLastPlayTime"}, + {17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"}, {18, nullptr, "QueryApplicationPlayStatisticsForSystem"}, {19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, }; @@ -53,4 +56,13 @@ Result IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId( R_SUCCEED(); } +Result IQueryService::QueryLastPlayTime( + Out out_entries, u8 unknown, + OutArray out_last_play_times, + InArray application_ids) { + *out_entries = 1; + *out_last_play_times = {}; + R_SUCCEED(); +} + } // namespace Service::NS diff --git a/src/core/hle/service/ns/query_service.h b/src/core/hle/service/ns/query_service.h index c4c82b752e..ba1cddd4ca 100644 --- a/src/core/hle/service/ns/query_service.h +++ b/src/core/hle/service/ns/query_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -23,6 +26,8 @@ struct PlayStatistics { }; static_assert(sizeof(PlayStatistics) == 0x28, "PlayStatistics is an invalid size"); +struct LastPlayTime {}; + class IQueryService final : public ServiceFramework { public: explicit IQueryService(Core::System& system_); @@ -31,6 +36,9 @@ public: private: Result QueryPlayStatisticsByApplicationIdAndUserAccountId( Out out_play_statistics, bool unknown, u64 application_id, Uid account_id); + Result QueryLastPlayTime(Out out_entries, u8 unknown, + OutArray out_last_play_times, + InArray application_ids); }; } // namespace Service::NS diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 029a9d9cd5..140c6eb6e3 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -93,7 +93,7 @@ void nvhost_as_gpu::OnOpen(NvCore::SessionId session_id, DeviceFD fd) {} void nvhost_as_gpu::OnClose(DeviceFD fd) {} NvResult nvhost_as_gpu::AllocAsEx(IoctlAllocAsEx& params) { - LOG_DEBUG(Service_NVDRV, "called, big_page_size=0x{:X}", params.big_page_size); + LOG_DEBUG(Service_NVDRV, "called, big_page_size={:#X}", params.big_page_size); std::scoped_lock lock(mutex); @@ -104,12 +104,12 @@ NvResult nvhost_as_gpu::AllocAsEx(IoctlAllocAsEx& params) { if (params.big_page_size) { if (!std::has_single_bit(params.big_page_size)) { - LOG_ERROR(Service_NVDRV, "Non power-of-2 big page size: 0x{:X}!", params.big_page_size); + LOG_ERROR(Service_NVDRV, "Non power-of-2 big page size: {:#X}!", params.big_page_size); return NvResult::BadValue; } if ((params.big_page_size & VM::SUPPORTED_BIG_PAGE_SIZES) == 0) { - LOG_ERROR(Service_NVDRV, "Unsupported big page size: 0x{:X}!", params.big_page_size); + LOG_ERROR(Service_NVDRV, "Unsupported big page size: {:#X}!", params.big_page_size); return NvResult::BadValue; } @@ -267,7 +267,7 @@ NvResult nvhost_as_gpu::FreeSpace(IoctlFreeSpace& params) { } NvResult nvhost_as_gpu::Remap(std::span entries) { - LOG_DEBUG(Service_NVDRV, "called, num_entries=0x{:X}", entries.size()); + LOG_DEBUG(Service_NVDRV, "called, num_entries={:#X}", entries.size()); if (!vm.initialised) { return NvResult::BadValue; @@ -315,7 +315,7 @@ NvResult nvhost_as_gpu::Remap(std::span entries) { NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { LOG_DEBUG(Service_NVDRV, "called, flags={:X}, nvmap_handle={:X}, buffer_offset={}, mapping_size={}" - ", offset=0x{:X}", + ", offset={:#X}", params.flags, params.handle, params.buffer_offset, params.mapping_size, params.offset); @@ -332,7 +332,7 @@ NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { if (mapping->size < params.mapping_size) { LOG_WARNING(Service_NVDRV, - "Cannot remap a partially mapped GPU address space region: 0x{:X}", + "Cannot remap a partially mapped GPU address space region: {:#X}", params.offset); return NvResult::BadValue; } @@ -345,7 +345,7 @@ NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { return NvResult::Success; } catch (const std::out_of_range&) { - LOG_WARNING(Service_NVDRV, "Cannot remap an unmapped GPU address space region: 0x{:X}", + LOG_WARNING(Service_NVDRV, "Cannot remap an unmapped GPU address space region: {:#X}", params.offset); return NvResult::BadValue; } @@ -416,7 +416,7 @@ NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { NvResult nvhost_as_gpu::UnmapBuffer(IoctlUnmapBuffer& params) { if (map_buffer_offsets.find(params.offset) != map_buffer_offsets.end()) { - LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset); + LOG_DEBUG(Service_NVDRV, "called, offset={:#X}", params.offset); std::scoped_lock lock(mutex); @@ -504,7 +504,7 @@ NvResult nvhost_as_gpu::GetVARegions3(IoctlGetVaRegions& params, std::span(std::countr_zero(YUZU_PAGESIZE))}; static constexpr u32 SUPPORTED_BIG_PAGE_SIZES{0x30000}; static constexpr u32 DEFAULT_BIG_PAGE_SIZE{0x20000}; u32 big_page_size{DEFAULT_BIG_PAGE_SIZE}; - u32 big_page_size_bits{std::countr_zero(DEFAULT_BIG_PAGE_SIZE)}; + u32 big_page_size_bits{static_cast(std::countr_zero(DEFAULT_BIG_PAGE_SIZE))}; static constexpr u32 VA_START_SHIFT{10}; static constexpr u64 DEFAULT_VA_SPLIT{1ULL << 34}; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index 45a4a402da..d7a65ce445 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -205,7 +208,7 @@ NvResult nvhost_ctrl_gpu::GetCharacteristics3( } NvResult nvhost_ctrl_gpu::GetTPCMasks1(IoctlGpuGetTpcMasksArgs& params) { - LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); + LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size={:#X}", params.mask_buffer_size); if (params.mask_buffer_size != 0) { params.tcp_mask = 3; } @@ -213,7 +216,7 @@ NvResult nvhost_ctrl_gpu::GetTPCMasks1(IoctlGpuGetTpcMasksArgs& params) { } NvResult nvhost_ctrl_gpu::GetTPCMasks3(IoctlGpuGetTpcMasksArgs& params, std::span tpc_mask) { - LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); + LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size={:#X}", params.mask_buffer_size); if (params.mask_buffer_size != 0) { params.tcp_mask = 3; } @@ -253,66 +256,108 @@ NvResult nvhost_ctrl_gpu::ZCullGetInfo(IoctlNvgpuGpuZcullGetInfoArgs& params) { } NvResult nvhost_ctrl_gpu::ZBCSetTable(IoctlZbcSetTable& params) { - LOG_DEBUG(Service_NVDRV, "called"); - ZbcEntry entry = {}; - std::memset(&entry, 0, sizeof(entry)); - // TODO(ogniK): What does this even actually do? - // TODO(myself): This thing I guess - if (params.type == 1) { - for (auto i = 0; i < 4; ++i) { - entry.color_ds[i] = params.color_ds[i]; - entry.color_l2[i] = params.color_l2[i]; - } - ASSERT(this->max_color_entries < 16); - this->color_entries[this->max_color_entries] = entry; - ++this->max_color_entries; - } else if (params.type == 2) { - entry.depth = params.depth; - ASSERT(this->max_depth_entries < 16); - this->depth_entries[this->max_depth_entries] = entry; - ++this->max_depth_entries; + if (params.type > supported_types) { + LOG_ERROR(Service_NVDRV, "ZBCSetTable: invalid type {:#X}", params.type); + return NvResult::BadParameter; } + + std::scoped_lock lk(zbc_mutex); + + switch (static_cast(params.type)) { + case ZBCTypes::color: { + ZbcColorEntry color_entry{}; + std::copy_n(std::begin(params.color_ds), color_entry.color_ds.size(), color_entry.color_ds.begin()); + std::copy_n(std::begin(params.color_l2), color_entry.color_l2.size(), color_entry.color_l2.begin()); + color_entry.format = params.format; + color_entry.ref_cnt = 1u; + + auto color_it = std::ranges::find_if(zbc_colors, + [&](const ZbcColorEntry& color_in_question) { + return color_entry.format == color_in_question.format && + color_entry.color_ds == color_in_question.color_ds && + color_entry.color_l2 == color_in_question.color_l2; + }); + + if (color_it != zbc_colors.end()) { + ++color_it->ref_cnt; + LOG_DEBUG(Service_NVDRV, "ZBCSetTable: reused color entry fmt={:#X}, ref_cnt={:#X}", + params.format, color_it->ref_cnt); + } else { + zbc_colors.push_back(color_entry); + LOG_DEBUG(Service_NVDRV, "ZBCSetTable: added color entry fmt={:#X}, index={:#X}", + params.format, zbc_colors.size() - 1); + } + break; + } + case ZBCTypes::depth: { + ZbcDepthEntry depth_entry{params.depth, params.format, 1u}; + + auto depth_it = std::ranges::find_if(zbc_depths, + [&](const ZbcDepthEntry& depth_entry_in_question) { + return depth_entry.format == depth_entry_in_question.format && + depth_entry.depth == depth_entry_in_question.depth; + }); + + if (depth_it != zbc_depths.end()) { + ++depth_it->ref_cnt; + LOG_DEBUG(Service_NVDRV, "ZBCSetTable: reused depth entry fmt={:#X}, ref_cnt={:#X}", + depth_entry.format, depth_it->ref_cnt); + } else { + zbc_depths.push_back(depth_entry); + LOG_DEBUG(Service_NVDRV, "ZBCSetTable: added depth entry fmt={:#X}, index={:#X}", + depth_entry.format, zbc_depths.size() - 1); + } + } + } + return NvResult::Success; } NvResult nvhost_ctrl_gpu::ZBCQueryTable(IoctlZbcQueryTable& params) { - LOG_DEBUG(Service_NVDRV, "called"); - struct ZbcQueryParams { - u32_le color_ds[4]; - u32_le color_l2[4]; - u32_le depth; - u32_le ref_cnt; - u32_le format; - u32_le type; - u32_le index_size; - } entry = {}; - std::memset(&entry, 0, sizeof(entry)); - auto const index = params.index_size; - if (params.type == 0) { //no - entry.index_size = 15; - } else if (params.type == 1) { //color - ASSERT(index < 16); - for (auto i = 0; i < 4; ++i) { - params.color_ds[i] = this->color_entries[index].color_ds[i]; - params.color_l2[i] = this->color_entries[index].color_l2[i]; - } - // TODO: Only if no error thrown (otherwise dont modify) - params.format = this->color_entries[index].format; - //params.ref_cnt = this->color_entries[index].ref_cnt; - } else if (params.type == 2) { //depth - ASSERT(index < 16); - params.depth = this->depth_entries[index].depth; - // TODO: Only if no error thrown (otherwise dont modify) - params.format = this->depth_entries[index].format; - //params.ref_cnt = this->depth_entries[index].ref_cnt; - } else { - UNREACHABLE(); + if (params.type > supported_types) { + LOG_ERROR(Service_NVDRV, "ZBCQueryTable: invalid type {:#X}", params.type); + return NvResult::BadParameter; } + + std::scoped_lock lk(zbc_mutex); + + switch (static_cast(params.type)) { + case ZBCTypes::color: { + if (params.index_size >= zbc_colors.size()) { + LOG_ERROR(Service_NVDRV, "ZBCQueryTable: invalid color index {:#X}", params.index_size); + return NvResult::BadParameter; + } + + const auto& colors = zbc_colors[params.index_size]; + std::copy_n(colors.color_ds.begin(), colors.color_ds.size(), std::begin(params.color_ds)); + std::copy_n(colors.color_l2.begin(), colors.color_l2.size(), std::begin(params.color_l2)); + params.depth = 0; + params.ref_cnt = colors.ref_cnt; + params.format = colors.format; + params.index_size = static_cast(zbc_colors.size()); + break; + } + case ZBCTypes::depth: { + if (params.index_size >= zbc_depths.size()) { + LOG_ERROR(Service_NVDRV, "ZBCQueryTable: invalid depth index {:#X}", params.index_size); + return NvResult::BadParameter; + } + + const auto& depth_entry = zbc_depths[params.index_size]; + std::fill(std::begin(params.color_ds), std::end(params.color_ds), 0); + std::fill(std::begin(params.color_l2), std::end(params.color_l2), 0); + params.depth = depth_entry.depth; + params.ref_cnt = depth_entry.ref_cnt; + params.format = depth_entry.format; + params.index_size = static_cast(zbc_depths.size()); + } + } + return NvResult::Success; } NvResult nvhost_ctrl_gpu::FlushL2(IoctlFlushL2& params) { - LOG_DEBUG(Service_NVDRV, "called 0x{:X}", params.flush); + LOG_DEBUG(Service_NVDRV, "called {:#X}", params.flush); // if ((params.flush & 0x01) != 0) //l2 flush // /* we dont emulate l2 */; // if ((params.flush & 0x04) != 0) //fb flush diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h index c36fcbaa69..e0603f9a71 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -34,6 +37,11 @@ public: Kernel::KEvent* QueryEvent(u32 event_id) override; private: + enum class ZBCTypes { + color = 1, + depth = 2, + }; + struct IoctlGpuCharacteristics { u32_le arch; // 0x120 (NVGPU_GPU_ARCH_GM200) u32_le impl; // 0xB (NVGPU_GPU_IMPL_GM20B) @@ -139,6 +147,21 @@ private: }; static_assert(sizeof(IoctlZbcQueryTable) == 52, "IoctlZbcQueryTable is incorrect size"); + struct ZbcColorEntry { + std::array color_ds{}; + std::array color_l2{}; + u32 format{}; + u32 ref_cnt{}; + }; + static_assert(sizeof(ZbcColorEntry) == 40, "ZbcColorEntry is incorrect size"); + + struct ZbcDepthEntry { + u32 depth{}; + u32 format{}; + u32 ref_cnt{}; + }; + static_assert(sizeof(ZbcDepthEntry) == 12, "ZbcDepthEntry is incorrect size"); + struct IoctlFlushL2 { u32_le flush; // l2_flush | l2_invalidate << 1 | fb_flush << 2 u32_le reserved; @@ -182,17 +205,11 @@ private: Kernel::KEvent* error_notifier_event; Kernel::KEvent* unknown_event; - struct ZbcEntry { - u32_le color_ds[4]; - u32_le color_l2[4]; - u32_le depth; - u32_le type; - u32_le format; - }; - std::array color_entries; - std::array depth_entries; - u8 max_color_entries; - u8 max_depth_entries; + // ZBC Tables + std::mutex zbc_mutex{}; + std::vector zbc_colors{}; + std::vector zbc_depths{}; + const u32 supported_types = 2u; }; } // namespace Service::Nvidia::Devices diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index d01642fe7c..5f754650d9 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp @@ -219,28 +219,55 @@ NvResult nvhost_gpu::AllocGPFIFOEx2(IoctlAllocGpfifoEx& params, DeviceFD fd) { return NvResult::Success; } -NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) { - LOG_DEBUG(Service_NVDRV, "called, class_num={:X}, flags={:X}, obj_id={:X}", params.class_num, - params.flags, params.obj_id); +s32_le nvhost_gpu::GetObjectContextClassNumberIndex(CtxClasses class_number) { + constexpr s32_le invalid_class_number_index = -1; + switch (class_number) { + case CtxClasses::Ctx2D: return 0; + case CtxClasses::Ctx3D: return 1; + case CtxClasses::CtxCompute: return 2; + case CtxClasses::CtxKepler: return 3; + case CtxClasses::CtxDMA: return 4; + case CtxClasses::CtxChannelGPFIFO: return 5; + default: return invalid_class_number_index; + } +} - if (!channel_state->initialized) { +NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) { + LOG_DEBUG(Service_NVDRV, "called, class_num={:#X}, flags={:#X}, obj_id={:#X}", params.class_num, + params.flags, params.obj_id); + + if (!channel_state || !channel_state->initialized) { LOG_CRITICAL(Service_NVDRV, "No address space bound to allocate a object context!"); return NvResult::NotInitialized; } - switch (static_cast(params.class_num)) { - case CtxClasses::Ctx2D: - case CtxClasses::Ctx3D: - case CtxClasses::CtxCompute: - case CtxClasses::CtxKepler: - case CtxClasses::CtxDMA: - case CtxClasses::CtxChannelGPFIFO: - ctxObj_params.push_back(params); - return NvResult::Success; - default: - LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:X}", params.class_num); + std::scoped_lock lk(channel_mutex); + + if (params.flags) { + LOG_WARNING(Service_NVDRV, "non-zero flags={:#X} for class={:#X}", params.flags, + params.class_num); + + constexpr u32 allowed_mask{}; + params.flags = allowed_mask; + } + + s32_le ctx_class_number_index = + GetObjectContextClassNumberIndex(static_cast(params.class_num)); + if (ctx_class_number_index < 0) { + LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:#X}", + params.class_num); return NvResult::BadParameter; } + + if (ctxObjs[ctx_class_number_index].has_value()) { + LOG_ERROR(Service_NVDRV, "Object context for class {:#X} already allocated on this channel", + params.class_num); + return NvResult::AlreadyAllocated; + } + + ctxObjs[ctx_class_number_index] = params; + + return NvResult::Success; } static boost::container::small_vector BuildWaitCommandList( @@ -360,20 +387,20 @@ NvResult nvhost_gpu::SubmitGPFIFOBase2(IoctlSubmitGpfifo& params, } NvResult nvhost_gpu::GetWaitbase(IoctlGetWaitbase& params) { - LOG_INFO(Service_NVDRV, "called, unknown=0x{:X}", params.unknown); + LOG_INFO(Service_NVDRV, "called, unknown={:#X}", params.unknown); params.value = 0; // Seems to be hard coded at 0 return NvResult::Success; } NvResult nvhost_gpu::ChannelSetTimeout(IoctlChannelSetTimeout& params) { - LOG_INFO(Service_NVDRV, "called, timeout=0x{:X}", params.timeout); + LOG_INFO(Service_NVDRV, "called, timeout={:#X}", params.timeout); return NvResult::Success; } NvResult nvhost_gpu::ChannelSetTimeslice(IoctlSetTimeslice& params) { - LOG_INFO(Service_NVDRV, "called, timeslice=0x{:X}", params.timeslice); + LOG_INFO(Service_NVDRV, "called, timeslice={:#X}", params.timeslice); channel_timeslice = params.timeslice; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index a017cc50d0..fb0a5be959 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h @@ -172,7 +172,7 @@ private: s32_le nvmap_fd{}; u64_le user_data{}; IoctlZCullBind zcull_params{}; - std::vector ctxObj_params{}; + std::array, 6> ctxObjs{}; u32_le channel_priority{}; u32_le channel_timeslice{}; @@ -184,9 +184,12 @@ private: NvResult SetChannelPriority(IoctlChannelSetPriority& params); NvResult AllocGPFIFOEx(IoctlAllocGpfifoEx& params, DeviceFD fd); NvResult AllocGPFIFOEx2(IoctlAllocGpfifoEx& params, DeviceFD fd); + + s32_le GetObjectContextClassNumberIndex(CtxClasses class_number); NvResult AllocateObjectContext(IoctlAllocObjCtx& params); NvResult SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, Tegra::CommandList&& entries); + NvResult SubmitGPFIFOBase1(IoctlSubmitGpfifo& params, std::span commands, bool kickoff = false); NvResult SubmitGPFIFOBase2(IoctlSubmitGpfifo& params, diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp index 9ca6308e6f..f7d6c33f77 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -132,14 +135,14 @@ NvResult nvhost_nvdec_common::GetSyncpoint(IoctlGetSyncpoint& params) { } NvResult nvhost_nvdec_common::GetWaitbase(IoctlGetWaitbase& params) { - LOG_CRITICAL(Service_NVDRV, "called WAITBASE"); - params.value = 0; // Seems to be hard coded at 0 + LOG_DEBUG(Service_NVDRV, "called WAITBASE"); + params.value = 0; return NvResult::Success; } NvResult nvhost_nvdec_common::MapBuffer(IoctlMapBuffer& params, std::span entries, DeviceFD fd) { - const size_t num_entries = std::min(params.num_entries, static_cast(entries.size())); + const size_t num_entries = (std::min)(params.num_entries, static_cast(entries.size())); for (size_t i = 0; i < num_entries; i++) { DAddr pin_address = nvmap.PinHandle(entries[i].map_handle, true); entries[i].map_address = static_cast(pin_address); @@ -150,7 +153,7 @@ NvResult nvhost_nvdec_common::MapBuffer(IoctlMapBuffer& params, std::span entries) { - const size_t num_entries = std::min(params.num_entries, static_cast(entries.size())); + const size_t num_entries = (std::min)(params.num_entries, static_cast(entries.size())); for (size_t i = 0; i < num_entries; i++) { nvmap.UnpinHandle(entries[i].map_handle); entries[i] = {}; diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index da61a3bfeb..b9131ee5ce 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -89,7 +92,7 @@ NvResult nvmap::IocCreate(IocCreateParams& params) { } handle_description->orig_size = params.size; // Orig size is the unaligned size params.handle = handle_description->id; - LOG_DEBUG(Service_NVDRV, "handle: {}, size: 0x{:X}", handle_description->id, params.size); + LOG_DEBUG(Service_NVDRV, "handle: {}, size: {:#X}", handle_description->id, params.size); return NvResult::Success; } diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp index 258970fd53..db9467f4d1 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -209,7 +212,7 @@ void NVDRV::QueryEvent(HLERequestContext& ctx) { void NVDRV::SetAruid(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; pid = rp.Pop(); - LOG_WARNING(Service_NVDRV, "(STUBBED) called, pid=0x{:X}", pid); + LOG_WARNING(Service_NVDRV, "(STUBBED) called, pid={:#X}", pid); IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp index 91ba35aef5..2913d25819 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -97,18 +100,18 @@ Status BufferQueueConsumer::AcquireBuffer(BufferItem* out_buffer, slots[slot].needs_cleanup_on_release = false; slots[slot].buffer_state = BufferState::Acquired; + // Mark tracked buffer history records as acquired + for (auto& buffer_history_record : core->buffer_history) { + if (buffer_history_record.frame_number == core->frame_counter) { + buffer_history_record.state = BufferState::Acquired; + break; + } + } + // TODO: for now, avoid resetting the fence, so that when we next return this // slot to the producer, it will wait for the fence to pass. We should fix this // by properly waiting for the fence in the BufferItemConsumer. // slots[slot].fence = Fence::NoFence(); - - const auto target_frame_number = slots[slot].frame_number; - for (size_t i = 0; i < core->history.size(); i++) { - if (core->history[i].frame_number == target_frame_number) { - core->history[i].state = BufferState::Acquired; - break; - } - } } // If the buffer has previously been acquired by the consumer, set graphic_buffer to nullptr to @@ -328,7 +331,7 @@ void BufferQueueConsumer::Transact(u32 code, std::span parcel_data, const auto serialized = parcel_out.Serialize(); std::memcpy(parcel_reply.data(), serialized.data(), - std::min(parcel_reply.size(), serialized.size())); + (std::min)(parcel_reply.size(), serialized.size())); } Kernel::KReadableEvent* BufferQueueConsumer::GetNativeHandle(u32 type_id) { diff --git a/src/core/hle/service/nvnflinger/buffer_queue_core.cpp b/src/core/hle/service/nvnflinger/buffer_queue_core.cpp index 30095b0f73..6120d8eae1 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_core.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_core.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -10,12 +13,19 @@ namespace Service::android { -BufferQueueCore::BufferQueueCore() { - history.resize(8); -}; - +BufferQueueCore::BufferQueueCore() = default; BufferQueueCore::~BufferQueueCore() = default; +void BufferQueueCore::PushHistory(u64 frame_number, s64 queue_time, s64 presentation_time, BufferState state) { + buffer_history_pos = (buffer_history_pos + 1) % BUFFER_HISTORY_SIZE; + buffer_history[buffer_history_pos] = BufferHistoryInfo{ + .frame_number = frame_number, + .queue_time = queue_time, + .presentation_time = presentation_time, + .state = state, + }; +} + void BufferQueueCore::SignalDequeueCondition() { dequeue_possible.store(true); dequeue_condition.notify_all(); diff --git a/src/core/hle/service/nvnflinger/buffer_queue_core.h b/src/core/hle/service/nvnflinger/buffer_queue_core.h index 341634352b..ed7d4b4069 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_core.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -15,6 +18,7 @@ #include "core/hle/service/nvnflinger/buffer_item.h" #include "core/hle/service/nvnflinger/buffer_queue_defs.h" +#include "core/hle/service/nvnflinger/buffer_slot.h" #include "core/hle/service/nvnflinger/pixel_format.h" #include "core/hle/service/nvnflinger/status.h" #include "core/hle/service/nvnflinger/window.h" @@ -23,22 +27,19 @@ namespace Service::android { #ifdef _MSC_VER #pragma pack(push, 1) +struct BufferHistoryInfo { +#elif defined(__GNUC__) || defined(__clang__) +struct __attribute__((packed)) BufferHistoryInfo { #endif -struct BufferInfo { u64 frame_number; s64 queue_time; - s64 presentation_time{}; - BufferState state{BufferState::Free}; -} -#if defined(__GNUC__) || defined(__clang__) -__attribute__((packed)) -#endif -; + s64 presentation_time; + BufferState state; +}; #ifdef _MSC_VER #pragma pack(pop) #endif -static_assert(sizeof(BufferInfo) == 0x1C, - "BufferInfo is an invalid size"); +static_assert(sizeof(BufferHistoryInfo) == 0x1C, "BufferHistoryInfo must be 28 bytes"); class IConsumerListener; class IProducerListener; @@ -49,10 +50,13 @@ class BufferQueueCore final { public: static constexpr s32 INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT; + static constexpr u32 BUFFER_HISTORY_SIZE = 8; BufferQueueCore(); ~BufferQueueCore(); + void PushHistory(u64 frame_number, s64 queue_time, s64 presentation_time, BufferState state); + private: void SignalDequeueCondition(); bool WaitForDequeueCondition(std::unique_lock& lk); @@ -88,11 +92,11 @@ private: const s32 max_acquired_buffer_count{}; // This is always zero on HOS bool buffer_has_been_queued{}; u64 frame_counter{}; + std::array buffer_history{}; + u32 buffer_history_pos{BUFFER_HISTORY_SIZE-1}; u32 transform_hint{}; bool is_allocating{}; mutable std::condition_variable_any is_allocating_condition; - - std::vector history{8}; }; } // namespace Service::android diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp index 1bb88a45fa..bc3076d20b 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -530,11 +533,6 @@ Status BufferQueueProducer::QueueBuffer(s32 slot, const QueueBufferInput& input, item.is_droppable = core->dequeue_buffer_cannot_block || async; item.swap_interval = swap_interval; - position = (position + 1) % 8; - core->history[position] = {.frame_number = core->frame_counter, - .queue_time = slots[slot].queue_time, - .state = BufferState::Queued}; - sticky_transform = sticky_transform_; if (core->queue.empty()) { @@ -551,6 +549,15 @@ Status BufferQueueProducer::QueueBuffer(s32 slot, const QueueBufferInput& input, // mark it as freed if (core->StillTracking(*front)) { slots[front->slot].buffer_state = BufferState::Free; + + // Mark tracked buffer history records as free + for (auto& buffer_history_record : core->buffer_history) { + if (buffer_history_record.frame_number == front->frame_number) { + buffer_history_record.state = BufferState::Free; + break; + } + } + // Reset the frame number of the freed buffer so that it is the first in line to // be dequeued again slots[front->slot].frame_number = 0; @@ -564,6 +571,7 @@ Status BufferQueueProducer::QueueBuffer(s32 slot, const QueueBufferInput& input, } } + core->PushHistory(core->frame_counter, slots[slot].queue_time, slots[slot].presentation_time, BufferState::Queued); core->buffer_has_been_queued = true; core->SignalDequeueCondition(); output->Inflate(core->default_width, core->default_height, core->transform_hint, @@ -938,33 +946,46 @@ void BufferQueueProducer::Transact(u32 code, std::span parcel_data, break; } case TransactionId::GetBufferHistory: { - LOG_WARNING(Service_Nvnflinger, "called, transaction=GetBufferHistory"); + LOG_DEBUG(Service_Nvnflinger, "called, transaction=GetBufferHistory"); - std::scoped_lock lock{core->mutex}; - - auto buffer_history_count = std::min(parcel_in.Read(), (s32)core->history.size()); - - if (buffer_history_count <= 0) { + const s32 request = parcel_in.Read(); + if (request <= 0) { parcel_out.Write(Status::BadValue); parcel_out.Write(0); - status = Status::None; break; } - auto info = new BufferInfo[buffer_history_count]; - auto pos = position; - for (int i = 0; i < buffer_history_count; i++) { - info[i] = core->history[(pos - i) % core->history.size()]; - LOG_WARNING(Service_Nvnflinger, "frame_number={}, state={}", - core->history[(pos - i) % core->history.size()].frame_number, - (u32)core->history[(pos - i) % core->history.size()].state); - pos--; + constexpr u32 history_max = BufferQueueCore::BUFFER_HISTORY_SIZE; + std::array buffer_history_snapshot{}; + s32 valid_index{}; + { + std::scoped_lock lk(core->mutex); + + const u32 current_history_pos = core->buffer_history_pos; + u32 index_reversed{}; + for (u32 i = 0; i < history_max; ++i) { + // Wrap values backwards e.g. 7, 6, 5, etc. in the range of 0-7 + index_reversed = (current_history_pos + history_max - i) % history_max; + const auto& current_history_buffer = core->buffer_history[index_reversed]; + + // Here we use the frame number as a terminator. + // Because a buffer without frame_number is not considered complete + if (current_history_buffer.frame_number == 0) { + break; + } + + buffer_history_snapshot[valid_index] = current_history_buffer; + ++valid_index; + } } + const s32 limit = std::min(request, valid_index); parcel_out.Write(Status::NoError); - parcel_out.Write(buffer_history_count); - parcel_out.WriteFlattenedObject(info); - status = Status::None; + parcel_out.Write(limit); + for (s32 i = 0; i < limit; ++i) { + parcel_out.Write(buffer_history_snapshot[i]); + } + break; } default: @@ -972,13 +993,11 @@ void BufferQueueProducer::Transact(u32 code, std::span parcel_data, break; } - if (status != Status::None) { - parcel_out.Write(status); - } + parcel_out.Write(status); const auto serialized = parcel_out.Serialize(); std::memcpy(parcel_reply.data(), serialized.data(), - std::min(parcel_reply.size(), serialized.size())); + (std::min)(parcel_reply.size(), serialized.size())); } diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.h b/src/core/hle/service/nvnflinger/buffer_queue_producer.h index 28195cd3c5..6610e0853a 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_slot.h b/src/core/hle/service/nvnflinger/buffer_slot.h index 5b5cbb6fbd..d348b331cb 100644 --- a/src/core/hle/service/nvnflinger/buffer_slot.h +++ b/src/core/hle/service/nvnflinger/buffer_slot.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -15,7 +18,7 @@ namespace Service::android { class GraphicBuffer; -enum class BufferState : s32 { +enum class BufferState : u32 { Free = 0, Dequeued = 1, Queued = 2, diff --git a/src/core/hle/service/nvnflinger/hardware_composer.cpp b/src/core/hle/service/nvnflinger/hardware_composer.cpp index 77622a7832..5c0515d473 100644 --- a/src/core/hle/service/nvnflinger/hardware_composer.cpp +++ b/src/core/hle/service/nvnflinger/hardware_composer.cpp @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +#include + #include #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" @@ -51,6 +53,19 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, // Set default speed limit to 100%. *out_speed_scale = 1.0f; + // If no layers are available, skip the logic. + bool any_visible = false; + for (auto& layer : display.stack.layers) { + if (layer->visible) { + any_visible = true; + break; + } + } + if (!any_visible) { + *out_speed_scale = 1.0f; + return 1; + } + // Determine the number of vsync periods to wait before composing again. std::optional swap_interval{}; bool has_acquired_buffer{}; @@ -101,14 +116,14 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, // only swap intervals of 0, 1 and 2 have been observed, but if 3 were // to be introduced, this would cause an issue. if (swap_interval) { - swap_interval = std::min(*swap_interval, item_swap_interval); + swap_interval = (std::min)(*swap_interval, item_swap_interval); } else { swap_interval = item_swap_interval; } } // If any new buffers were acquired, we can present. - if (has_acquired_buffer) { + if (has_acquired_buffer && !composition_stack.empty()) { // Sort by Z-index. std::stable_sort(composition_stack.begin(), composition_stack.end(), [&](auto& l, auto& r) { return l.z_index < r.z_index; }); @@ -117,6 +132,19 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, nvdisp.Composite(composition_stack); } + // Batch framebuffer releases, instead of one-into-one. + std::vector> to_release; + for (auto& [layer_id, framebuffer] : m_framebuffers) { + if (framebuffer.release_frame_number > m_frame_number || !framebuffer.is_acquired) + continue; + if (auto layer = display.stack.FindLayer(layer_id); layer) + to_release.emplace_back(layer.get(), &framebuffer); + } + for (auto& [layer, framebuffer] : to_release) { + layer->buffer_item_consumer->ReleaseBuffer(framebuffer->item, android::Fence::NoFence()); + framebuffer->is_acquired = false; + } + // Advance by at least one frame. const u32 frame_advance = swap_interval.value_or(1); m_frame_number += frame_advance; diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp index 1d990e66d7..82c65ac1fd 100644 --- a/src/core/hle/service/pctl/parental_control_service.cpp +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -80,11 +80,12 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"}, {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"}, {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"}, - {1454, nullptr, "GetPlayTimerRemainingTime"}, + {1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"}, {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"}, {1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"}, {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, + {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, {1472, nullptr, "CancelNetworkRequest"}, {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, @@ -378,6 +379,12 @@ Result IParentalControlService::IsPlayTimerEnabled(Out out_is_play_timer_e R_SUCCEED(); } +Result IParentalControlService::GetPlayTimerRemainingTime(Out out_remaining_time) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_remaining_time = std::numeric_limits::max(); + R_SUCCEED(); +} + Result IParentalControlService::IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer) { *out_is_restricted_by_play_timer = false; LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer); @@ -412,6 +419,11 @@ Result IParentalControlService::IsPlayTimerAlarmDisabled(Out out_play_time R_SUCCEED(); } +Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(/* Out 0x18 */) { + LOG_INFO(Service_PCTL, "called"); + R_SUCCEED(); +} + Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle out_event) { LOG_INFO(Service_PCTL, "called"); *out_event = unlinked_event.GetHandle(); diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h index 1b1884c4de..9d143fe2e2 100644 --- a/src/core/hle/service/pctl/parental_control_service.h +++ b/src/core/hle/service/pctl/parental_control_service.h @@ -49,10 +49,12 @@ private: Result StartPlayTimer(); Result StopPlayTimer(); Result IsPlayTimerEnabled(Out out_is_play_timer_enabled); + Result GetPlayTimerRemainingTime(Out out_remaining_time); Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer); Result GetPlayTimerSettingsOld(Out out_play_timer_settings); Result GetPlayTimerEventToRequestSuspension(OutCopyHandle out_event); Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled); + Result GetPlayTimerRemainingTimeDisplayInfo(); Result GetUnlinkedEvent(OutCopyHandle out_event); Result GetStereoVisionRestriction(Out out_stereo_vision_restriction); Result SetStereoVisionRestriction(bool stereo_vision_restriction); diff --git a/src/core/hle/service/psc/time/common.h b/src/core/hle/service/psc/time/common.h index 954aed666a..0ad2ed51f8 100644 --- a/src/core/hle/service/psc/time/common.h +++ b/src/core/hle/service/psc/time/common.h @@ -138,12 +138,12 @@ constexpr inline std::chrono::nanoseconds ConvertToTimeSpan(s64 ticks) { std::chrono::duration_cast(std::chrono::seconds(1)).count()}; constexpr s64 max{Common::WallClock::CNTFRQ * - (std::numeric_limits::max() / one_second_ns)}; + ((std::numeric_limits::max)() / one_second_ns)}; if (ticks > max) { - return std::chrono::nanoseconds(std::numeric_limits::max()); + return std::chrono::nanoseconds((std::numeric_limits::max)()); } else if (ticks < -max) { - return std::chrono::nanoseconds(std::numeric_limits::min()); + return std::chrono::nanoseconds((std::numeric_limits::min)()); } auto a{ticks / Common::WallClock::CNTFRQ * one_second_ns}; @@ -156,9 +156,9 @@ constexpr inline Result GetSpanBetweenTimePoints(s64* out_seconds, const SteadyC const SteadyClockTimePoint& b) { R_UNLESS(out_seconds, ResultInvalidArgument); R_UNLESS(a.IdMatches(b), ResultInvalidArgument); - R_UNLESS(a.time_point >= 0 || b.time_point <= a.time_point + std::numeric_limits::max(), + R_UNLESS(a.time_point >= 0 || b.time_point <= a.time_point + (std::numeric_limits::max)(), ResultOverflow); - R_UNLESS(a.time_point < 0 || b.time_point >= a.time_point + std::numeric_limits::min(), + R_UNLESS(a.time_point < 0 || b.time_point >= a.time_point + (std::numeric_limits::min)(), ResultOverflow); *out_seconds = b.time_point - a.time_point; diff --git a/src/core/hle/service/psc/time/power_state_request_manager.cpp b/src/core/hle/service/psc/time/power_state_request_manager.cpp index 17de0bf4dd..b28b513649 100644 --- a/src/core/hle/service/psc/time/power_state_request_manager.cpp +++ b/src/core/hle/service/psc/time/power_state_request_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,7 +20,7 @@ PowerStateRequestManager::~PowerStateRequestManager() { void PowerStateRequestManager::UpdatePendingPowerStateRequestPriority(u32 priority) { std::scoped_lock l{m_mutex}; if (m_has_pending_request) { - m_pending_request_priority = std::max(m_pending_request_priority, priority); + m_pending_request_priority = (std::max)(m_pending_request_priority, priority); } else { m_pending_request_priority = priority; m_has_pending_request = true; diff --git a/src/core/hle/service/psc/time/steady_clock.cpp b/src/core/hle/service/psc/time/steady_clock.cpp index 78dcf532ce..cfeaf0a653 100644 --- a/src/core/hle/service/psc/time/steady_clock.cpp +++ b/src/core/hle/service/psc/time/steady_clock.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -87,7 +90,7 @@ Result SteadyClock::IsRtcResetDetected(Out out_is_detected) { Result SteadyClock::GetSetupResultValue(Out out_result) { SCOPE_EXIT { - LOG_DEBUG(Service_Time, "called. out_result=0x{:X}", out_result->raw); + LOG_DEBUG(Service_Time, "called. out_result={:#X}", out_result->raw); }; R_UNLESS(m_can_write_uninitialized_clock || m_clock_core.IsInitialized(), diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 3d3ad2d62c..05806e9bf3 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -178,7 +181,7 @@ struct ProcessContext { std::vector nro_data(size); m_process->GetMemory().ReadBlock(base_address, nro_data.data(), size); - mbedtls_sha256_ret(nro_data.data(), size, hash.data(), 0); + mbedtls_sha256(nro_data.data(), size, hash.data(), 0); } for (size_t i = 0; i < MaxNrrInfos; i++) { diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index e5779de2fd..d70dc2978f 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,7 +30,7 @@ namespace Service { std::string function_string = fmt::format("function '{}': port={}", name, port_name); for (int i = 1; i <= num_params; ++i) { - function_string += fmt::format(", cmd_buff[{}]=0x{:X}", i, cmd_buff[i]); + function_string += fmt::format(", cmd_buff[{}]={:#X}", i, cmd_buff[i]); } return function_string; } @@ -66,10 +69,10 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, std::string function_name = info == nullptr ? "" : info->name; fmt::memory_buffer buf; - fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]=0x{:X}", + fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#X}", ctx.GetCommand(), function_name, service_name, cmd_buf[0]); for (int i = 1; i <= 8; ++i) { - fmt::format_to(std::back_inserter(buf), ", [{}]=0x{:X}", i, cmd_buf[i]); + fmt::format_to(std::back_inserter(buf), ", [{}]={:#X}", i, cmd_buf[i]); } buf.push_back('}'); diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp index aa873bc8c5..f6080926a7 100644 --- a/src/core/hle/service/set/settings_server.cpp +++ b/src/core/hle/service/set/settings_server.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -122,8 +125,8 @@ Result ISettingsServer::GetAvailableLanguageCodes( Out out_count, OutArray out_language_codes) { LOG_DEBUG(Service_SET, "called"); - const std::size_t max_amount = std::min(PRE_4_0_0_MAX_ENTRIES, out_language_codes.size()); - *out_count = static_cast(std::min(available_language_codes.size(), max_amount)); + const std::size_t max_amount = (std::min)(PRE_4_0_0_MAX_ENTRIES, out_language_codes.size()); + *out_count = static_cast((std::min)(available_language_codes.size(), max_amount)); memcpy(out_language_codes.data(), available_language_codes.data(), static_cast(*out_count) * sizeof(LanguageCode)); @@ -159,8 +162,8 @@ Result ISettingsServer::GetAvailableLanguageCodes2( Out out_count, OutArray language_codes) { LOG_DEBUG(Service_SET, "called"); - const std::size_t max_amount = std::min(POST_4_0_0_MAX_ENTRIES, language_codes.size()); - *out_count = static_cast(std::min(available_language_codes.size(), max_amount)); + const std::size_t max_amount = (std::min)(POST_4_0_0_MAX_ENTRIES, language_codes.size()); + *out_count = static_cast((std::min)(available_language_codes.size(), max_amount)); memcpy(language_codes.data(), available_language_codes.data(), static_cast(*out_count) * sizeof(LanguageCode)); @@ -233,7 +236,7 @@ Result ISettingsServer::GetDeviceNickName( LOG_DEBUG(Service_SET, "called"); const std::size_t string_size = - std::min(Settings::values.device_name.GetValue().size(), out_device_name->size()); + (std::min)(Settings::values.device_name.GetValue().size(), out_device_name->size()); *out_device_name = {}; memcpy(out_device_name->data(), Settings::values.device_name.GetValue().data(), string_size); diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index d246b95d0e..22e12b1b9c 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -533,7 +536,7 @@ Result ISystemSettingsServer::GetEulaVersions( LOG_INFO(Service_SET, "called, elements={}", m_system_settings.eula_version_count); *out_count = - std::min(m_system_settings.eula_version_count, static_cast(out_eula_versions.size())); + (std::min)(m_system_settings.eula_version_count, static_cast(out_eula_versions.size())); memcpy(out_eula_versions.data(), m_system_settings.eula_versions.data(), static_cast(*out_count) * sizeof(EulaVersion)); R_SUCCEED(); @@ -599,7 +602,7 @@ Result ISystemSettingsServer::GetAccountNotificationSettings( LOG_INFO(Service_SET, "called, elements={}", m_system_settings.account_notification_settings_count); - *out_count = std::min(m_system_settings.account_notification_settings_count, + *out_count = (std::min)(m_system_settings.account_notification_settings_count, static_cast(out_account_notification_settings.size())); memcpy(out_account_notification_settings.data(), m_system_settings.account_notification_settings.data(), diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp index 9e25eae4d4..d5245e80eb 100644 --- a/src/core/hle/service/sm/sm_controller.cpp +++ b/src/core/hle/service/sm/sm_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -74,9 +77,9 @@ void Controller::QueryPointerBufferSize(HLERequestContext& ctx) { ASSERT(process != nullptr); u32 buffer_size = process->GetPointerBufferSize(); - if (buffer_size > std::numeric_limits::max()) { + if (buffer_size > (std::numeric_limits::max)()) { LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); - buffer_size = std::numeric_limits::max(); + buffer_size = (std::numeric_limits::max)(); } IPC::ResponseBuilder rb{ctx, 3}; @@ -94,9 +97,9 @@ void Controller::SetPointerBufferSize(HLERequestContext& ctx) { u32 requested_size = rp.PopRaw(); - if (requested_size > std::numeric_limits::max()) { + if (requested_size > (std::numeric_limits::max)()) { LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); - requested_size = std::numeric_limits::max(); + requested_size = (std::numeric_limits::max)(); } process->SetPointerBufferSize(requested_size); diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index fffbc413bb..a31bf45238 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -45,13 +45,13 @@ bool IsConnectionBased(Type type) { template T GetValue(std::span buffer) { T t{}; - std::memcpy(&t, buffer.data(), std::min(sizeof(T), buffer.size())); + std::memcpy(&t, buffer.data(), (std::min)(sizeof(T), buffer.size())); return t; } template void PutValue(std::span buffer, const T& t) { - std::memcpy(buffer.data(), &t, std::min(sizeof(T), buffer.size())); + std::memcpy(buffer.data(), &t, (std::min)(sizeof(T), buffer.size())); } } // Anonymous namespace diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h index ed6b576a65..ccc6a7d7f2 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index b07bd3e58e..68d73f0a59 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -53,6 +53,19 @@ enum class NetDbError : s32 { NoData = 4, }; +static const constexpr std::array blockedDomains = {"srv.nintendo.net", + "battle.net", + "microsoft.com", + "mojang.com", + "xboxlive.com", + "minecraftservices.com"}; + +static bool IsBlockedHost(const std::string& host) { + return std::any_of( + blockedDomains.begin(), blockedDomains.end(), + [&host](const std::string& domain) { return host.find(domain) != std::string::npos; }); +} + static NetDbError GetAddrInfoErrorToNetDbError(GetAddrInfoError result) { // These combinations have been verified on console (but are not // exhaustive). @@ -154,7 +167,7 @@ static std::pair GetHostByNameRequestImpl(HLERequestConte // For now, ignore options, which are in input buffer 1 for GetHostByNameRequestWithOptions. // Prevent resolution of Nintendo servers - if (host.find("srv.nintendo.net") != std::string::npos) { + if (IsBlockedHost(host)) { LOG_WARNING(Network, "Resolution of hostname {} requested, returning EAI_AGAIN", host); return {0, GetAddrInfoError::AGAIN}; } @@ -271,7 +284,7 @@ static std::pair GetAddrInfoRequestImpl(HLERequestContext const std::string host = Common::StringFromBuffer(host_buffer); // Prevent resolution of Nintendo servers - if (host.find("srv.nintendo.net") != std::string::npos) { + if (IsBlockedHost(host)) { LOG_WARNING(Network, "Resolution of hostname {} requested, returning EAI_AGAIN", host); return {0, GetAddrInfoError::AGAIN}; } @@ -359,5 +372,4 @@ void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) { rb.Push(ResultSuccess); rb.Push(0); // bsd errno } - } // namespace Service::Sockets diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp index 549e6f4fa8..b8aa99ccd1 100644 --- a/src/core/hle/service/spl/spl_module.cpp +++ b/src/core/hle/service/spl/spl_module.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -68,7 +71,7 @@ void Module::Interface::GenerateRandomBytes(HLERequestContext& ctx) { const std::size_t size = ctx.GetWriteBufferSize(); - std::uniform_int_distribution distribution(0, std::numeric_limits::max()); + std::uniform_int_distribution distribution(0, (std::numeric_limits::max)()); std::vector data(size); std::generate(data.begin(), data.end(), [&] { return static_cast(distribution(rng)); }); diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 2d10bd04d2..0b0108bbd5 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -445,7 +448,7 @@ private: void GetNextAlpnProto(HLERequestContext& ctx) { const size_t writable = ctx.GetWriteBufferSize(); - const size_t to_write = std::min(next_alpn_proto.size(), writable); + const size_t to_write = (std::min)(next_alpn_proto.size(), writable); if (to_write != 0) { ctx.WriteBuffer(std::span(next_alpn_proto.data(), to_write)); diff --git a/src/core/hle/service/ssl/ssl_backend_openssl.cpp b/src/core/hle/service/ssl/ssl_backend_openssl.cpp index 5714e6f3c5..795b69a873 100644 --- a/src/core/hle/service/ssl/ssl_backend_openssl.cpp +++ b/src/core/hle/service/ssl/ssl_backend_openssl.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -286,7 +289,7 @@ Result CheckOpenSSLErrors() { msg.append(data); } Common::Log::FmtLogMessage(Common::Log::Class::Service_SSL, Common::Log::Level::Error, - Common::Log::TrimSourcePath(file), line, func, "OpenSSL: {}", + file, line, func, "OpenSSL: {}", msg); } return ResultInternalError; diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp index 289ad7073c..969c86f53b 100644 --- a/src/core/hle/service/vi/application_display_service.cpp +++ b/src/core/hle/service/vi/application_display_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -192,7 +195,7 @@ Result IApplicationDisplayService::OpenLayer(Out out_size, const auto buffer = parcel.Serialize(); std::memcpy(out_native_window.data(), buffer.data(), - std::min(out_native_window.size(), buffer.size())); + (std::min)(out_native_window.size(), buffer.size())); *out_size = buffer.size(); R_SUCCEED(); @@ -226,7 +229,7 @@ Result IApplicationDisplayService::CreateStrayLayer( const auto buffer = parcel.Serialize(); std::memcpy(out_native_window.data(), buffer.data(), - std::min(out_native_window.size(), buffer.size())); + (std::min)(out_native_window.size(), buffer.size())); *out_size = buffer.size(); diff --git a/src/core/internal_network/emu_net_state.cpp b/src/core/internal_network/emu_net_state.cpp index 17fa58fa08..d6d1a70a60 100644 --- a/src/core/internal_network/emu_net_state.cpp +++ b/src/core/internal_network/emu_net_state.cpp @@ -10,8 +10,10 @@ #define NOMINMAX #include #include +#ifdef _MSC_VER #pragma comment(lib, "wlanapi.lib") #endif +#endif #include #include diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index 6a3c6e9c41..b21d8a7a16 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -105,7 +108,7 @@ sockaddr TranslateFromSockAddrIn(SockAddrIn input) { } LINGER MakeLinger(bool enable, u32 linger_value) { - ASSERT(linger_value <= std::numeric_limits::max()); + ASSERT(linger_value <= (std::numeric_limits::max)()); LINGER value; value.l_onoff = enable ? 1 : 0; @@ -798,7 +801,7 @@ Errno Socket::Shutdown(ShutdownHow how) { std::pair Socket::Recv(int flags, std::span message) { ASSERT(flags == 0); - ASSERT(message.size() < static_cast(std::numeric_limits::max())); + ASSERT(message.size() < static_cast((std::numeric_limits::max)())); const auto result = recv(fd, reinterpret_cast(message.data()), static_cast(message.size()), 0); @@ -811,7 +814,7 @@ std::pair Socket::Recv(int flags, std::span message) { std::pair Socket::RecvFrom(int flags, std::span message, SockAddrIn* addr) { ASSERT(flags == 0); - ASSERT(message.size() < static_cast(std::numeric_limits::max())); + ASSERT(message.size() < static_cast((std::numeric_limits::max)())); sockaddr_in addr_in{}; socklen_t addrlen = sizeof(addr_in); @@ -831,7 +834,7 @@ std::pair Socket::RecvFrom(int flags, std::span message, SockAdd } std::pair Socket::Send(std::span message, int flags) { - ASSERT(message.size() < static_cast(std::numeric_limits::max())); + ASSERT(message.size() < static_cast((std::numeric_limits::max)())); ASSERT(flags == 0); int native_flags = 0; diff --git a/src/core/internal_network/network_interface.cpp b/src/core/internal_network/network_interface.cpp index f62381b9e3..7be9434afe 100644 --- a/src/core/internal_network/network_interface.cpp +++ b/src/core/internal_network/network_interface.cpp @@ -9,7 +9,7 @@ #include "common/bit_cast.h" #include "common/common_types.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "common/string_util.h" #include "core/internal_network/emu_net_state.h" @@ -147,7 +147,7 @@ std::vector GetAvailableNetworkInterfaces() { } // ignore header - file.ignore(std::numeric_limits::max(), '\n'); + file.ignore((std::numeric_limits::max)(), '\n'); bool gateway_found = false; diff --git a/src/core/internal_network/socket_proxy.cpp b/src/core/internal_network/socket_proxy.cpp index c263fb4ca8..f37fdc8795 100644 --- a/src/core/internal_network/socket_proxy.cpp +++ b/src/core/internal_network/socket_proxy.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include #include @@ -105,14 +104,14 @@ Errno ProxySocket::Shutdown(ShutdownHow how) { std::pair ProxySocket::Recv(int flags, std::span message) { LOG_WARNING(Network, "(STUBBED) called"); ASSERT(flags == 0); - ASSERT(message.size() < static_cast(std::numeric_limits::max())); + ASSERT(message.size() < static_cast((std::numeric_limits::max)())); return {static_cast(0), Errno::SUCCESS}; } std::pair ProxySocket::RecvFrom(int flags, std::span message, SockAddrIn* addr) { ASSERT(flags == 0); - ASSERT(message.size() < static_cast(std::numeric_limits::max())); + ASSERT(message.size() < static_cast((std::numeric_limits::max)())); // TODO (flTobi): Verify the timeout behavior and break when connection is lost const auto timestamp = std::chrono::steady_clock::now(); @@ -183,7 +182,7 @@ std::pair ProxySocket::ReceivePacket(int flags, std::span messag std::pair ProxySocket::Send(std::span message, int flags) { LOG_WARNING(Network, "(STUBBED) called"); - ASSERT(message.size() < static_cast(std::numeric_limits::max())); + ASSERT(message.size() < static_cast((std::numeric_limits::max)())); ASSERT(flags == 0); return {static_cast(0), Errno::SUCCESS}; diff --git a/src/core/internal_network/socket_proxy.h b/src/core/internal_network/socket_proxy.h index 93cf0757af..caf5d1ee23 100644 --- a/src/core/internal_network/socket_proxy.h +++ b/src/core/internal_network/socket_proxy.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/internal_network/wifi_scanner.cpp b/src/core/internal_network/wifi_scanner.cpp index f4b1738e69..127221099f 100644 --- a/src/core/internal_network/wifi_scanner.cpp +++ b/src/core/internal_network/wifi_scanner.cpp @@ -15,8 +15,10 @@ using namespace std::chrono_literals; #define NOMINMAX #include #include +#ifdef _MSC_VER #pragma comment(lib, "wlanapi.lib") #endif +#endif namespace Network { #ifdef ENABLE_WIFI_SCAN diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp index cd69829217..4dc98040ae 100644 --- a/src/core/loader/kip.cpp +++ b/src/core/loader/kip.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -101,7 +104,7 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::KProcess& process, const VAddr base_address = GetInteger(process.GetEntryPoint()); process.LoadModule(std::move(codeset), base_address); - LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", kip->GetName(), base_address); + LOG_DEBUG(Loader, "loaded module {} @ {:#X}", kip->GetName(), base_address); is_loaded = true; return {ResultStatus::Success, diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp index 6aabdc75e1..1f0bc4d2c1 100644 --- a/src/core/loader/loader.cpp +++ b/src/core/loader/loader.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -61,25 +64,23 @@ FileType IdentifyFile(FileSys::VirtualFile file) { FileType GuessFromFilename(const std::string& name) { if (name == "main") return FileType::DeconstructedRomDirectory; - if (name == "00") + else if (name == "00") return FileType::NCA; - const std::string extension = + auto const extension = Common::ToLower(std::string(Common::FS::GetExtensionFromFilename(name))); - if (extension == "nro") return FileType::NRO; - if (extension == "nso") + else if (extension == "nso") return FileType::NSO; - if (extension == "nca") + else if (extension == "nca") return FileType::NCA; - if (extension == "xci") + else if (extension == "xci") return FileType::XCI; - if (extension == "nsp") + else if (extension == "nsp") return FileType::NSP; - if (extension == "kip") + else if (extension == "kip") return FileType::KIP; - return FileType::Unknown; } diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp index 4a87ab53e7..1d4846df09 100644 --- a/src/core/loader/nca.cpp +++ b/src/core/loader/nca.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -150,7 +153,7 @@ ResultStatus AppLoader_NCA::VerifyIntegrity(std::function // Initialize sha256 verification context. mbedtls_sha256_context ctx; mbedtls_sha256_init(&ctx); - mbedtls_sha256_starts_ret(&ctx, 0); + mbedtls_sha256_starts(&ctx, 0); // Ensure we maintain a clean state on exit. SCOPE_EXIT { @@ -164,11 +167,11 @@ ResultStatus AppLoader_NCA::VerifyIntegrity(std::function // Begin iterating the file. while (processed_size < total_size) { // Refill the buffer. - const size_t intended_read_size = std::min(buffer.size(), total_size - processed_size); + const size_t intended_read_size = (std::min)(buffer.size(), total_size - processed_size); const size_t read_size = file->Read(buffer.data(), intended_read_size, processed_size); // Update the hash function with the buffer contents. - mbedtls_sha256_update_ret(&ctx, buffer.data(), read_size); + mbedtls_sha256_update(&ctx, buffer.data(), read_size); // Update counters. processed_size += read_size; @@ -181,7 +184,7 @@ ResultStatus AppLoader_NCA::VerifyIntegrity(std::function // Finalize context and compute the output hash. std::array output_hash; - mbedtls_sha256_finish_ret(&ctx, output_hash.data()); + mbedtls_sha256_finish(&ctx, output_hash.data()); // Compare to expected. if (std::memcmp(input_hash.data(), output_hash.data(), NcaSha256HalfHashLength) != 0) { diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 2cd62df072..e3e3f83ca2 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -223,7 +226,7 @@ AppLoader_NSO::LoadResult AppLoader_NSO::Load(Kernel::KProcess& process, Core::S } modules.insert_or_assign(base_address, file->GetName()); - LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address); + LOG_DEBUG(Loader, "loaded module {} @ {:#X}", file->GetName(), base_address); is_loaded = true; return {ResultStatus::Success, LoadParameters{Kernel::KThread::DefaultThreadPriority, diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 08391cd815..2583aae867 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -48,7 +48,7 @@ struct Memory::Impl { explicit Impl(Core::System& system_) : system{system_} { // Initialize thread count based on available cores for parallel memory operations const unsigned int hw_concurrency = std::thread::hardware_concurrency(); - thread_count = std::max(2u, std::min(hw_concurrency, 8u)); // Limit to 8 threads max + thread_count = (std::max)(2u, (std::min)(hw_concurrency, 8u)); // Limit to 8 threads max } void SetCurrentPageTable(Kernel::KProcess& process) { @@ -61,7 +61,8 @@ struct Memory::Impl { } #ifdef __linux__ - buffer.emplace(system.DeviceMemory().buffer); + heap_tracker.emplace(system.DeviceMemory().buffer); + buffer = std::addressof(*heap_tracker); #else buffer = std::addressof(system.DeviceMemory().buffer); #endif @@ -262,7 +263,7 @@ struct Memory::Impl { while (remaining_size) { const std::size_t copy_amount = - std::min(static_cast(YUZU_PAGESIZE) - page_offset, remaining_size); + (std::min)(static_cast(YUZU_PAGESIZE) - page_offset, remaining_size); const auto current_vaddr = static_cast((page_index << YUZU_PAGEBITS) + page_offset); @@ -947,7 +948,7 @@ struct Memory::Impl { const auto* p = GetPointerImpl( v_address, []() {}, []() {}); constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1; - const size_t core = std::min(system.GetCurrentHostThreadID(), + const size_t core = (std::min)(system.GetCurrentHostThreadID(), sys_core); // any other calls threads go to syscore. if (!gpu_device_memory) [[unlikely]] { gpu_device_memory = &system.Host1x().MemoryManager(); @@ -988,7 +989,7 @@ struct Memory::Impl { void InvalidateGPUMemory(u8* p, size_t size) { constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1; - const size_t core = std::min(system.GetCurrentHostThreadID(), + const size_t core = (std::min)(system.GetCurrentHostThreadID(), sys_core); // any other calls threads go to syscore. if (!gpu_device_memory) [[unlikely]] { gpu_device_memory = &system.Host1x().MemoryManager(); @@ -1023,8 +1024,9 @@ struct Memory::Impl { std::span gpu_dirty_managers; std::mutex sys_core_guard; + std::optional heap_tracker; #ifdef __linux__ - std::optional buffer; + Common::HeapTracker* buffer{}; #else Common::HostMemory* buffer{}; #endif @@ -1228,7 +1230,22 @@ bool Memory::InvalidateNCE(Common::ProcessAddress vaddr, size_t size) { if (rasterizer) { impl->InvalidateGPUMemory(ptr, size); } + +#ifdef __linux__ + if (!rasterizer && mapped) { + impl->buffer->DeferredMapSeparateHeap(GetInteger(vaddr)); + } +#endif + return mapped && ptr != nullptr; } +bool Memory::InvalidateSeparateHeap(void* fault_address) { +#ifdef __linux__ + return impl->buffer->DeferredMapSeparateHeap(static_cast(fault_address)); +#else + return false; +#endif +} + } // namespace Core::Memory diff --git a/src/core/memory.h b/src/core/memory.h index 99108ecf0d..dcca26892b 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -487,8 +487,13 @@ public: * marked as debug or non-debug. */ void MarkRegionDebug(Common::ProcessAddress vaddr, u64 size, bool debug); + void SetGPUDirtyManagers(std::span managers); + bool InvalidateNCE(Common::ProcessAddress vaddr, size_t size); + + bool InvalidateSeparateHeap(void* fault_address); + private: Core::System& system; diff --git a/src/core/memory/dmnt_cheat_vm.h b/src/core/memory/dmnt_cheat_vm.h index 1c1ed1259b..de5e81add2 100644 --- a/src/core/memory/dmnt_cheat_vm.h +++ b/src/core/memory/dmnt_cheat_vm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,6 +8,8 @@ #include #include +#include + #include #include "common/common_types.h" #include "core/memory/dmnt_cheat_types.h" diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp index 4439611d2e..35e76624f4 100644 --- a/src/core/perf_stats.cpp +++ b/src/core/perf_stats.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -41,7 +44,14 @@ PerfStats::~PerfStats() { const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::LogDir); // %F Date format expanded is "%Y-%m-%d" - const auto filename = fmt::format("{:%F-%H-%M}_{:016X}.csv", *std::localtime(&t), title_id); + const auto filename = fmt::format("{}_{:016X}.csv", + [&] { + std::ostringstream oss; + oss << std::put_time(std::localtime(&t), "%F-%H-%M"); + return oss.str(); + }(), + title_id); + const auto filepath = path / filename; if (Common::FS::CreateParentDir(filepath)) { diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp index 4bac8142c3..1723636811 100644 --- a/src/core/reporter.cpp +++ b/src/core/reporter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -33,7 +36,9 @@ std::filesystem::path GetPath(std::string_view type, u64 title_id, std::string_v std::string GetTimestamp() { const auto time = std::time(nullptr); - return fmt::format("{:%FT%H-%M-%S}", *std::localtime(&time)); + std::ostringstream oss; + oss << std::put_time(std::localtime(&time), "%FT%H-%M-%S"); + return oss.str(); } using namespace nlohmann; diff --git a/src/core/tools/renderdoc.cpp b/src/core/tools/renderdoc.cpp index 947fa6cb37..d3a47e1d96 100644 --- a/src/core/tools/renderdoc.cpp +++ b/src/core/tools/renderdoc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,10 +21,12 @@ namespace Tools { RenderdocAPI::RenderdocAPI() { #ifdef WIN32 if (HMODULE mod = GetModuleHandleA("renderdoc.dll")) { - const auto RENDERDOC_GetAPI = - reinterpret_cast(GetProcAddress(mod, "RENDERDOC_GetAPI")); - const s32 ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_6_0, (void**)&rdoc_api); - ASSERT(ret == 1); + void* proc = reinterpret_cast(GetProcAddress(mod, "RENDERDOC_GetAPI")); + if (proc) { + const auto RENDERDOC_GetAPI = reinterpret_cast(proc); + const s32 ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_6_0, (void**)&rdoc_api); + ASSERT(ret == 1); + } } #else #ifdef ANDROID diff --git a/src/dedicated_room/CMakeLists.txt b/src/dedicated_room/CMakeLists.txt index 9391a71b6c..5166329156 100644 --- a/src/dedicated_room/CMakeLists.txt +++ b/src/dedicated_room/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2017 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later @@ -13,11 +16,11 @@ add_library(yuzu-room STATIC EXCLUDE_FROM_ALL target_link_libraries(yuzu-room PRIVATE common network) if (ENABLE_WEB_SERVICE) - target_compile_definitions(yuzu-room PRIVATE -DENABLE_WEB_SERVICE) + target_compile_definitions(yuzu-room PRIVATE ENABLE_WEB_SERVICE) target_link_libraries(yuzu-room PRIVATE web_service) endif() -target_link_libraries(yuzu-room PRIVATE mbedtls mbedcrypto) +target_link_libraries(yuzu-room PRIVATE MbedTLS::mbedcrypto MbedTLS::mbedtls) if (MSVC) target_link_libraries(yuzu-room PRIVATE getopt) endif() diff --git a/src/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt index 5c28435f72..e5345ef458 100644 --- a/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + cmake_minimum_required(VERSION 3.12) project(dynarmic LANGUAGES C CXX ASM VERSION 6.7.0) @@ -14,18 +17,20 @@ endif() # Dynarmic project options option(DYNARMIC_ENABLE_CPU_FEATURE_DETECTION "Turning this off causes dynarmic to assume the host CPU doesn't support anything later than SSE3" ON) -option(DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT "Enables support for systems that require W^X" OFF) + +option(DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT "Enables support for systems that require W^X" ${PLATFORM_OPENBSD}) + option(DYNARMIC_FATAL_ERRORS "Errors are fatal" OFF) option(DYNARMIC_IGNORE_ASSERTS "Ignore asserts" OFF) option(DYNARMIC_TESTS_USE_UNICORN "Enable fuzzing tests against unicorn" OFF) -option(DYNARMIC_USE_LLVM "Support disassembly of jitted x86_64 code using LLVM" OFF) -option(DYNARMIC_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON) +CMAKE_DEPENDENT_OPTION(DYNARMIC_USE_LLVM "Support disassembly of jitted x86_64 code using LLVM" OFF "NOT YUZU_DISABLE_LLVM" OFF) + +option(DYNARMIC_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) + option(DYNARMIC_INSTALL "Install dynarmic headers and CMake files" OFF) option(DYNARMIC_USE_BUNDLED_EXTERNALS "Use all bundled externals (useful when e.g. cross-compiling)" OFF) option(DYNARMIC_WARNINGS_AS_ERRORS "Warnings as errors" ${MASTER_PROJECT}) -if (NOT DEFINED DYNARMIC_FRONTENDS) - set(DYNARMIC_FRONTENDS "A32;A64" CACHE STRING "Selects which frontends to enable") -endif() +option(DYNARMIC_ENABLE_LTO "Enable LTO" OFF) # Default to a Release build if (NOT CMAKE_BUILD_TYPE) @@ -72,7 +77,6 @@ if (MSVC) /wd4592 # Symbol will be dynamically initialized (implementation limitation) /permissive- # Stricter C++ standards conformance /MP - /Zi /Zo /EHsc /Zc:externConstexpr # Allows external linkage for variables declared "extern constexpr", as the standard permits. @@ -82,12 +86,17 @@ if (MSVC) /bigobj # Increase number of sections in .obj files /DNOMINMAX) + if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + endif() + if (DYNARMIC_WARNINGS_AS_ERRORS) list(APPEND DYNARMIC_CXX_FLAGS /WX) endif() - if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + if (CXX_CLANG) list(APPEND DYNARMIC_CXX_FLAGS -Qunused-arguments -Wno-missing-braces) @@ -115,7 +124,7 @@ else() -Wfatal-errors) endif() - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if (CXX_GCC) # GCC produces bogus -Warray-bounds warnings from xbyak headers for code paths that are not # actually reachable. Specifically, it happens in cases where some code casts an Operand& # to Address& after first checking isMEM(), and that code is inlined in a situation where @@ -125,7 +134,7 @@ else() list(APPEND DYNARMIC_CXX_FLAGS -Wstack-usage=4096) endif() - if (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") + if (CXX_CLANG) # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6. # And this in turns limits the size of a std::array. list(APPEND DYNARMIC_CXX_FLAGS -fbracket-depth=1024) @@ -134,28 +143,26 @@ else() endif() endif() -# Forced use of individual bundled libraries for non-REQUIRED library is possible with e.g. cmake -DCMAKE_DISABLE_FIND_PACKAGE_fmt=ON ... - -if (DYNARMIC_USE_BUNDLED_EXTERNALS) - set(CMAKE_DISABLE_FIND_PACKAGE_biscuit ON) - set(CMAKE_DISABLE_FIND_PACKAGE_fmt ON) - set(CMAKE_DISABLE_FIND_PACKAGE_mcl ON) - set(CMAKE_DISABLE_FIND_PACKAGE_oaknut ON) - set(CMAKE_DISABLE_FIND_PACKAGE_unordered_dense ON) - set(CMAKE_DISABLE_FIND_PACKAGE_xbyak ON) - set(CMAKE_DISABLE_FIND_PACKAGE_Zydis ON) - set(CMAKE_DISABLE_FIND_PACKAGE_Zycore ON) -endif() - find_package(Boost 1.57 REQUIRED) find_package(fmt 9 CONFIG) +# Pull in externals CMakeLists for libs where available +add_subdirectory(externals) + +find_package(mcl 0.1.12 REQUIRED) + if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS) find_package(oaknut 2.0.1 CONFIG) endif() +if ("riscv" IN_LIST ARCHITECTURE) + find_package(biscuit 0.9.1 REQUIRED) +endif() + if ("x86_64" IN_LIST ARCHITECTURE) find_package(xbyak 7 CONFIG) + find_package(zycore REQUIRED) + find_package(zydis 4 REQUIRED) endif() if (DYNARMIC_USE_LLVM) @@ -170,9 +177,6 @@ if (DYNARMIC_TESTS) endif() endif() -# Pull in externals CMakeLists for libs where available -add_subdirectory(externals) - # Dynarmic project files add_subdirectory(src/dynarmic) if (DYNARMIC_TESTS) diff --git a/src/dynarmic/docs/Design.md b/src/dynarmic/docs/Design.md index 3c0deb5972..ffa8ccecdb 100644 --- a/src/dynarmic/docs/Design.md +++ b/src/dynarmic/docs/Design.md @@ -273,52 +273,73 @@ Exclusive OR (i.e.: XOR) ### Callback: {Read,Write}Memory{8,16,32,64} - ReadMemory8( vaddr) - ReadMemory16( vaddr) - ReadMemory32( vaddr) - ReadMemory64( vaddr) - WriteMemory8( vaddr, value_to_store) - WriteMemory16( vaddr, value_to_store) - WriteMemory32( vaddr, value_to_store) - WriteMemory64( vaddr, value_to_store) +```c++ + ReadMemory8( vaddr) + ReadMemory16( vaddr) + ReadMemory32( vaddr) + ReadMemory64( vaddr) + WriteMemory8( vaddr, value_to_store) + WriteMemory16( vaddr, value_to_store) + WriteMemory32( vaddr, value_to_store) + WriteMemory64( vaddr, value_to_store) +``` Memory access. ### Terminal: Interpret - SetTerm(IR::Term::Interpret{next}) +```c++ +SetTerm(IR::Term::Interpret{next}) +``` This terminal instruction calls the interpreter, starting at `next`. The interpreter must interpret exactly one instruction. ### Terminal: ReturnToDispatch - SetTerm(IR::Term::ReturnToDispatch{}) +```c++ +SetTerm(IR::Term::ReturnToDispatch{}) +``` This terminal instruction returns control to the dispatcher. The dispatcher will use the value in R15 to determine what comes next. ### Terminal: LinkBlock - SetTerm(IR::Term::LinkBlock{next}) +```c++ +SetTerm(IR::Term::LinkBlock{next}) +``` This terminal instruction jumps to the basic block described by `next` if we have enough cycles remaining. If we do not have enough cycles remaining, we return to the dispatcher, which will return control to the host. +### Terminal: LinkBlockFast + +```c++ +SetTerm(IR::Term::LinkBlockFast{next}) +``` + +This terminal instruction jumps to the basic block described by `next` unconditionally. +This promises guarantees that must be held at runtime - i.e that the program wont hang, + ### Terminal: PopRSBHint - SetTerm(IR::Term::PopRSBHint{}) +```c++ +SetTerm(IR::Term::PopRSBHint{}) +``` This terminal instruction checks the top of the Return Stack Buffer against R15. If RSB lookup fails, control is returned to the dispatcher. This is an optimization for faster function calls. A backend that doesn't support this optimization or doesn't have a RSB may choose to implement this exactly as -ReturnToDispatch. +`ReturnToDispatch`. ### Terminal: If - SetTerm(IR::Term::If{cond, term_then, term_else}) +```c++ +SetTerm(IR::Term::If{cond, term_then, term_else}) +``` This terminal instruction conditionally executes one terminal or another depending on the run-time state of the ARM flags. diff --git a/src/dynarmic/docs/FastMemory.md b/src/dynarmic/docs/FastMemory.md new file mode 100644 index 0000000000..c4f57996ba --- /dev/null +++ b/src/dynarmic/docs/FastMemory.md @@ -0,0 +1,19 @@ +# Fast memory (Fastmem) + +The main way of accessing memory in JITed programs is via an invoked function, say "Read()" and "Write()". On our translator, such functions usually take a sizable amounts of code space (push + call + pop). Trash the i-cache (due to an indirect call) and overall make code emission more bloated. + +The solution? Delegate invalid accesses to a dedicated arena, similar to a swap. The main idea behind such mechanism is to allow the OS to transmit page faults from invalid accesses into the JIT translator directly, bypassing address space calls, while this sacrifices i-cache coherency, it allows for smaller code-size and "faster" throguhput. + +Many kernels however, do not support fast signal dispatching (Solaris, OpenBSD, FreeBSD). Only Linux and Windows support relatively "fast" signal dispatching. Hence this feature is better suited for them only. + +![Host to guest translation](./HostToGuest.svg) + +![Fastmem translation](./Fastmem.svg) + +In x86_64 for example, when a page fault occurs, the CPU will transmit via control registers and the stack (see `IRETQ`) the appropriate arguments for a page fault handler, the OS then will transform that into something that can be sent into userspace. + +Most modern OSes implement kernel-page-table-isolation, which means a set of system calls will invoke a context switch (not often used syscalls), whereas others are handled by the same process address space (the smaller kernel portion, often used syscalls) without needing a context switch. This effect can be negated on systems with PCID (up to 4096 unique IDs). + +Signal dispatching takes a performance hit from reloading `%cr3` - but Linux does something more clever to avoid reloads: VDSO will take care of the entire thing in the same address space. Making dispatching as costly as an indirect call - without the hazards of increased code size. + +The main downside from this is the constant i-cache trashing and pipeline hazards introduced by the VDSO signal handlers. However on most benchmarks fastmem does perform faster than without (Linux only). This also abuses the fact of continous address space emulation by using an arena - which can then be potentially transparently mapped into a hugepage, reducing TLB walk times. diff --git a/src/dynarmic/docs/Fastmem.svg b/src/dynarmic/docs/Fastmem.svg new file mode 100644 index 0000000000..a3ed0bb68b --- /dev/null +++ b/src/dynarmic/docs/Fastmem.svg @@ -0,0 +1,4 @@ + + + +
Emulator
Address Space
Guest Address Space
SIGSEGV Trap
Fastmem
Only needs to linearly offset from fastmem arena
Less codegen (SIGSEGV traps)
Is fast only if SIGSEGV handlers are sufficiently fast
\ No newline at end of file diff --git a/src/dynarmic/docs/HostToGuest.svg b/src/dynarmic/docs/HostToGuest.svg new file mode 100644 index 0000000000..6a15a44b46 --- /dev/null +++ b/src/dynarmic/docs/HostToGuest.svg @@ -0,0 +1,4 @@ + + + +
Emulator
Address Space
Guest Address Space
Resolver
Host to Guest translation
Looks up correct PTE
Translates each address 
Is slow
\ No newline at end of file diff --git a/src/dynarmic/docs/RegisterAllocator.md b/src/dynarmic/docs/RegisterAllocator.md index fea6f19e6a..f5bbaaf168 100644 --- a/src/dynarmic/docs/RegisterAllocator.md +++ b/src/dynarmic/docs/RegisterAllocator.md @@ -16,19 +16,34 @@ Note that `Use`ing a value decrements its `use_count` by one. When the `use_coun The member functions on `RegAlloc` are just a combination of the above concepts. +The following registers are reserved for internal use and should NOT participate in register allocation: +- `%xmm0`, `%xmm1`, `%xmm2`: Used as scratch in exclusive memory access. +- `%rsp`: Stack pointer. +- `%r15`: JIT pointer +- `%r14`: Page table pointer. +- `%r13`: Fastmem pointer. + +The layout convenes `%r15` as the JIT state pointer - while it may be tempting to turn it into a synthetic pointer, keeping an entire register (out of 12 available) is preferable over inlining a directly computed immediate. + +Do NEVER modify `%r15`, we must make it clear that this register is "immutable" for the entirety of the JIT block duration. + ### `Scratch` - Xbyak::Reg64 ScratchGpr(HostLocList desired_locations = any_gpr) - Xbyak::Xmm ScratchXmm(HostLocList desired_locations = any_xmm) +```c++ +Xbyak::Reg64 ScratchGpr(HostLocList desired_locations = any_gpr); +Xbyak::Xmm ScratchXmm(HostLocList desired_locations = any_xmm); +``` At runtime, allocate one of the registers in `desired_locations`. You are free to modify the register. The register is discarded at the end of the allocation scope. ### Pure `Use` - Xbyak::Reg64 UseGpr(Argument& arg); - Xbyak::Xmm UseXmm(Argument& arg); - OpArg UseOpArg(Argument& arg); - void Use(Argument& arg, HostLoc host_loc); +```c++ +Xbyak::Reg64 UseGpr(Argument& arg); +Xbyak::Xmm UseXmm(Argument& arg); +OpArg UseOpArg(Argument& arg); +void Use(Argument& arg, HostLoc host_loc); +``` At runtime, the value corresponding to `arg` will be placed a register. The actual register is determined by which one of the above functions is called. `UseGpr` places it in an unused GPR, `UseXmm` places it @@ -39,9 +54,11 @@ This register **must not** have it's value changed. ### `UseScratch` - Xbyak::Reg64 UseScratchGpr(Argument& arg); - Xbyak::Xmm UseScratchXmm(Argument& arg); - void UseScratch(Argument& arg, HostLoc host_loc); +```c++ +Xbyak::Reg64 UseScratchGpr(Argument& arg); +Xbyak::Xmm UseScratchXmm(Argument& arg); +void UseScratch(Argument& arg, HostLoc host_loc); +``` At runtime, the value corresponding to `arg` will be placed a register. The actual register is determined by which one of the above functions is called. `UseScratchGpr` places it in an unused GPR, `UseScratchXmm` places it @@ -55,7 +72,9 @@ You are free to modify the value in the register. The register is discarded at t A `Define` is the defintion of a value. This is the only time when a value may be set. - void DefineValue(IR::Inst* inst, const Xbyak::Reg& reg); +```c++ +void DefineValue(IR::Inst* inst, const Xbyak::Reg& reg); +``` By calling `DefineValue`, you are stating that you wish to define the value for `inst`, and you have written the value to the specified register `reg`. @@ -64,7 +83,9 @@ value to the specified register `reg`. Adding a `Define` to an existing value. - void DefineValue(IR::Inst* inst, Argument& arg); +```c++ +void DefineValue(IR::Inst* inst, Argument& arg); +``` You are declaring that the value for `inst` is the same as the value for `arg`. No host machine instructions are emitted. diff --git a/src/dynarmic/docs/ReturnStackBufferOptimization.md b/src/dynarmic/docs/ReturnStackBufferOptimization.md index 6ffe41bcc6..0e72c3bce8 100644 --- a/src/dynarmic/docs/ReturnStackBufferOptimization.md +++ b/src/dynarmic/docs/ReturnStackBufferOptimization.md @@ -23,15 +23,17 @@ One complication dynarmic has is that a compiled block is not uniquely identifia the PC alone, but bits in the FPSCR and CPSR are also relevant. We resolve this by computing a 64-bit `UniqueHash` that is guaranteed to uniquely identify a block. - u64 LocationDescriptor::UniqueHash() const { - // This value MUST BE UNIQUE. - // This calculation has to match up with EmitX64::EmitTerminalPopRSBHint - u64 pc_u64 = u64(arm_pc) << 32; - u64 fpscr_u64 = u64(fpscr.Value()); - u64 t_u64 = cpsr.T() ? 1 : 0; - u64 e_u64 = cpsr.E() ? 2 : 0; - return pc_u64 | fpscr_u64 | t_u64 | e_u64; - } +```c++ +u64 LocationDescriptor::UniqueHash() const { + // This value MUST BE UNIQUE. + // This calculation has to match up with EmitX64::EmitTerminalPopRSBHint + u64 pc_u64 = u64(arm_pc) << 32; + u64 fpscr_u64 = u64(fpscr.Value()); + u64 t_u64 = cpsr.T() ? 1 : 0; + u64 e_u64 = cpsr.E() ? 2 : 0; + return pc_u64 | fpscr_u64 | t_u64 | e_u64; +} +``` ## Our implementation isn't actually a stack @@ -49,97 +51,107 @@ host addresses for the corresponding the compiled blocks. size of the real RSB in hardware (which has 3 entries). Larger RSBs than 8 showed degraded performance. - struct JitState { - // ... +```c++ +struct JitState { + // ... - static constexpr size_t RSBSize = 8; // MUST be a power of 2. - u32 rsb_ptr = 0; - std::array rsb_location_descriptors; - std::array rsb_codeptrs; - void ResetRSB(); + static constexpr size_t RSBSize = 8; // MUST be a power of 2. + u32 rsb_ptr = 0; + std::array rsb_location_descriptors; + std::array rsb_codeptrs; + void ResetRSB(); - // ... - }; + // ... +}; +``` ### RSB Push We insert our prediction at the insertion point iff the RSB doesn't already contain a prediction with the same `UniqueHash`. - void EmitX64::EmitPushRSB(IR::Block&, IR::Inst* inst) { - using namespace Xbyak::util; +```c++ +void EmitX64::EmitPushRSB(IR::Block&, IR::Inst* inst) { + using namespace Xbyak::util; - ASSERT(inst->GetArg(0).IsImmediate()); - u64 imm64 = inst->GetArg(0).GetU64(); + ASSERT(inst->GetArg(0).IsImmediate()); + u64 imm64 = inst->GetArg(0).GetU64(); - Xbyak::Reg64 code_ptr_reg = reg_alloc.ScratchGpr({HostLoc::RCX}); - Xbyak::Reg64 loc_desc_reg = reg_alloc.ScratchGpr(); - Xbyak::Reg32 index_reg = reg_alloc.ScratchGpr().cvt32(); - u64 code_ptr = unique_hash_to_code_ptr.find(imm64) != unique_hash_to_code_ptr.end() - ? u64(unique_hash_to_code_ptr[imm64]) - : u64(code->GetReturnFromRunCodeAddress()); + Xbyak::Reg64 code_ptr_reg = reg_alloc.ScratchGpr({HostLoc::RCX}); + Xbyak::Reg64 loc_desc_reg = reg_alloc.ScratchGpr(); + Xbyak::Reg32 index_reg = reg_alloc.ScratchGpr().cvt32(); + u64 code_ptr = unique_hash_to_code_ptr.find(imm64) != unique_hash_to_code_ptr.end() + ? u64(unique_hash_to_code_ptr[imm64]) + : u64(code->GetReturnFromRunCodeAddress()); - code->mov(index_reg, dword[code.ABI_JIT_PTR + offsetof(JitState, rsb_ptr)]); - code->add(index_reg, 1); - code->and_(index_reg, u32(JitState::RSBSize - 1)); + code->mov(index_reg, dword[code.ABI_JIT_PTR + offsetof(JitState, rsb_ptr)]); + code->add(index_reg, 1); + code->and_(index_reg, u32(JitState::RSBSize - 1)); - code->mov(loc_desc_reg, u64(imm64)); - CodePtr patch_location = code->getCurr(); - patch_unique_hash_locations[imm64].emplace_back(patch_location); - code->mov(code_ptr_reg, u64(code_ptr)); // This line has to match up with EmitX64::Patch. - code->EnsurePatchLocationSize(patch_location, 10); + code->mov(loc_desc_reg, u64(imm64)); + CodePtr patch_location = code->getCurr(); + patch_unique_hash_locations[imm64].emplace_back(patch_location); + code->mov(code_ptr_reg, u64(code_ptr)); // This line has to match up with EmitX64::Patch. + code->EnsurePatchLocationSize(patch_location, 10); - Xbyak::Label label; - for (size_t i = 0; i < JitState::RSBSize; ++i) { - code->cmp(loc_desc_reg, qword[code.ABI_JIT_PTR + offsetof(JitState, rsb_location_descriptors) + i * sizeof(u64)]); - code->je(label, code->T_SHORT); - } - - code->mov(dword[code.ABI_JIT_PTR + offsetof(JitState, rsb_ptr)], index_reg); - code->mov(qword[code.ABI_JIT_PTR + index_reg.cvt64() * 8 + offsetof(JitState, rsb_location_descriptors)], loc_desc_reg); - code->mov(qword[code.ABI_JIT_PTR + index_reg.cvt64() * 8 + offsetof(JitState, rsb_codeptrs)], code_ptr_reg); - code->L(label); + Xbyak::Label label; + for (size_t i = 0; i < JitState::RSBSize; ++i) { + code->cmp(loc_desc_reg, qword[code.ABI_JIT_PTR + offsetof(JitState, rsb_location_descriptors) + i * sizeof(u64)]); + code->je(label, code->T_SHORT); } + code->mov(dword[code.ABI_JIT_PTR + offsetof(JitState, rsb_ptr)], index_reg); + code->mov(qword[code.ABI_JIT_PTR + index_reg.cvt64() * 8 + offsetof(JitState, rsb_location_descriptors)], loc_desc_reg); + code->mov(qword[code.ABI_JIT_PTR + index_reg.cvt64() * 8 + offsetof(JitState, rsb_codeptrs)], code_ptr_reg); + code->L(label); +} +``` + In pseudocode: - for (i := 0 .. RSBSize-1) - if (rsb_location_descriptors[i] == imm64) - goto label; - rsb_ptr++; - rsb_ptr %= RSBSize; - rsb_location_desciptors[rsb_ptr] = imm64; //< The UniqueHash - rsb_codeptr[rsb_ptr] = /* codeptr corresponding to the UniqueHash */; - label: +```c++ + for (i := 0 .. RSBSize-1) + if (rsb_location_descriptors[i] == imm64) + goto label; + rsb_ptr++; + rsb_ptr %= RSBSize; + rsb_location_desciptors[rsb_ptr] = imm64; //< The UniqueHash + rsb_codeptr[rsb_ptr] = /* codeptr corresponding to the UniqueHash */; +label: +``` ## RSB Pop To check if a predicition is in the RSB, we linearly scan the RSB. - void EmitX64::EmitTerminalPopRSBHint(IR::Term::PopRSBHint, IR::LocationDescriptor initial_location) { - using namespace Xbyak::util; +```c++ +void EmitX64::EmitTerminalPopRSBHint(IR::Term::PopRSBHint, IR::LocationDescriptor initial_location) { + using namespace Xbyak::util; - // This calculation has to match up with IREmitter::PushRSB - code->mov(ecx, MJitStateReg(Arm::Reg::PC)); - code->shl(rcx, 32); - code->mov(ebx, dword[code.ABI_JIT_PTR + offsetof(JitState, FPSCR_mode)]); - code->or_(ebx, dword[code.ABI_JIT_PTR + offsetof(JitState, CPSR_et)]); - code->or_(rbx, rcx); + // This calculation has to match up with IREmitter::PushRSB + code->mov(ecx, MJitStateReg(Arm::Reg::PC)); + code->shl(rcx, 32); + code->mov(ebx, dword[code.ABI_JIT_PTR + offsetof(JitState, FPSCR_mode)]); + code->or_(ebx, dword[code.ABI_JIT_PTR + offsetof(JitState, CPSR_et)]); + code->or_(rbx, rcx); - code->mov(rax, u64(code->GetReturnFromRunCodeAddress())); - for (size_t i = 0; i < JitState::RSBSize; ++i) { - code->cmp(rbx, qword[code.ABI_JIT_PTR + offsetof(JitState, rsb_location_descriptors) + i * sizeof(u64)]); - code->cmove(rax, qword[code.ABI_JIT_PTR + offsetof(JitState, rsb_codeptrs) + i * sizeof(u64)]); - } - - code->jmp(rax); + code->mov(rax, u64(code->GetReturnFromRunCodeAddress())); + for (size_t i = 0; i < JitState::RSBSize; ++i) { + code->cmp(rbx, qword[code.ABI_JIT_PTR + offsetof(JitState, rsb_location_descriptors) + i * sizeof(u64)]); + code->cmove(rax, qword[code.ABI_JIT_PTR + offsetof(JitState, rsb_codeptrs) + i * sizeof(u64)]); } + code->jmp(rax); +} +``` + In pseudocode: - rbx := ComputeUniqueHash() - rax := ReturnToDispatch - for (i := 0 .. RSBSize-1) - if (rbx == rsb_location_descriptors[i]) - rax = rsb_codeptrs[i] - goto rax \ No newline at end of file +```c++ +rbx := ComputeUniqueHash() +rax := ReturnToDispatch +for (i := 0 .. RSBSize-1) + if (rbx == rsb_location_descriptors[i]) + rax = rsb_codeptrs[i] +goto rax +``` diff --git a/src/dynarmic/externals/CMakeLists.txt b/src/dynarmic/externals/CMakeLists.txt index 072558a618..ea666ddc52 100644 --- a/src/dynarmic/externals/CMakeLists.txt +++ b/src/dynarmic/externals/CMakeLists.txt @@ -1,11 +1,12 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + include(CPMUtil) # Always build externals as static libraries, even when dynarmic is built as shared -if (BUILD_SHARED_LIBS) - set(BUILD_SHARED_LIBS OFF) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - set_property(DIRECTORY PROPERTY EXCLUDE_FROM_ALL ON) -endif() +set(BUILD_SHARED_LIBS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set_property(DIRECTORY PROPERTY EXCLUDE_FROM_ALL ON) # Allow options shadowing with normal variables when subproject use old cmake policy set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) @@ -20,106 +21,28 @@ set(BUILD_TESTING OFF) # biscuit if ("riscv" IN_LIST ARCHITECTURE) - add_subdirectory(biscuit) - - AddPackage( + AddJsonPackage( NAME biscuit - VERSION 0.9.1 - REPO "lioncash/biscuit" - SHA 76b0be8dae - HASH 47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489 BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} ) endif() -# catch - -# TODO(crueter): dedup -if (NOT TARGET Catch2::Catch2WithMain) - if (DYNARMIC_TESTS) - find_package(Catch2 3.0.1 REQUIRED) - endif() -endif() - -# fmt - -if (NOT TARGET fmt::fmt) - # fmtlib formatting library - set(FMT_INSTALL ON) - add_subdirectory(fmt) -endif() - # mcl -AddPackage( +AddJsonPackage( NAME mcl - VERSION 0.1.12 - REPO "azahar-emu/mcl" - SHA 7b08d83418 - HASH f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3 - OPTIONS - "MCL_INSTALL OFF" + BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} ) -# oaknut - -# if (NOT TARGET merry::oaknut) -# if ("arm64" IN_LIST ARCHITECTURE) -# add_subdirectory(oaknut) -# elseif (DYNARMIC_TESTS) -# add_subdirectory(oaknut EXCLUDE_FROM_ALL) -# endif() -# endif() - -# unordered_dense - -AddPackage( - NAME unordered_dense - REPO "Lizzie841/unordered_dense" - SHA e59d30b7b1 - HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0 - FIND_PACKAGE_ARGUMENTS "CONFIG" - OPTIONS - "UNORDERED_DENSE_INSTALL OFF" -) - -# xbyak -# uncomment if in an independent repo - -# if (NOT TARGET xbyak::xbyak) -# if ("x86_64" IN_LIST ARCHITECTURE) -# add_subdirectory(xbyak) -# endif() -# endif() - -# zydis - # TODO(crueter): maybe it's just Gentoo but zydis system package really sucks if ("x86_64" IN_LIST ARCHITECTURE) - # TODO(crueter): system zycore doesn't work with zydis - AddPackage( - NAME Zycore - REPO "zyantific/zycore-c" - SHA 75a36c45ae - HASH 15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924 - OPTIONS - "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON" - EXCLUDE_FROM_ALL ON - SYSTEM_PACKAGE OFF + set(CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON) + AddJsonPackage( + NAME zycore + BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} ) - AddPackage( - NAME Zydis - VERSION 4 - REPO "zyantific/zydis" - SHA c2d2bab025 - HASH 7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020 - FIND_PACKAGE_ARGUMENTS "CONFIG" - OPTIONS - "ZYDIS_BUILD_TOOLS OFF" - "ZYDIS_BUILD_EXAMPLES OFF" - "ZYDIS_BUILD_DOXYGEN OFF" - "ZYAN_SYSTEM_ZYCORE ON" - "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON" - EXCLUDE_FROM_ALL ON + AddJsonPackage( + NAME zydis + BUNDLED_PACKAGE ${DYNARMIC_USE_BUNDLED_EXTERNALS} ) endif() diff --git a/src/dynarmic/externals/cpmfile.json b/src/dynarmic/externals/cpmfile.json new file mode 100644 index 0000000000..099ded57a4 --- /dev/null +++ b/src/dynarmic/externals/cpmfile.json @@ -0,0 +1,37 @@ +{ + "biscuit": { + "repo": "lioncash/biscuit", + "tag": "v%VERSION%", + "hash": "1229f345b014f7ca544dedb4edb3311e41ba736f9aa9a67f88b5f26f3c983288c6bb6cdedcfb0b8a02c63088a37e6a0d7ba97d9c2a4d721b213916327cffe28a", + "version": "0.9.1", + "git_version": "0.19.0" + }, + "mcl": { + "version": "0.1.12", + "repo": "azahar-emu/mcl", + "sha": "7b08d83418", + "hash": "f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3", + "options": [ + "MCL_INSTALL OFF" + ] + }, + "zycore": { + "package": "zycore", + "repo": "zyantific/zycore-c", + "sha": "75a36c45ae", + "hash": "15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924" + }, + "zydis": { + "package": "zydis", + "version": "4", + "repo": "zyantific/zydis", + "sha": "c2d2bab025", + "hash": "7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020", + "options": [ + "ZYDIS_BUILD_TOOLS OFF", + "ZYDIS_BUILD_EXAMPLES OFF", + "ZYDIS_BUILD_DOXYGEN OFF", + "ZYAN_SYSTEM_ZYCORE ON" + ] + } +} diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index e060989f82..8aa0f41afa 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -1,6 +1,8 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later include(TargetArchitectureSpecificSources) -add_library(dynarmic +add_library(dynarmic STATIC backend/block_range_information.cpp backend/block_range_information.h backend/exception_handler.h @@ -87,84 +89,69 @@ add_library(dynarmic ir/opcodes.cpp ir/opcodes.h ir/opcodes.inc - ir/opt/constant_propagation_pass.cpp - ir/opt/dead_code_elimination_pass.cpp - ir/opt/identity_removal_pass.cpp - ir/opt/ir_matcher.h - ir/opt/naming_pass.cpp - ir/opt/passes.h - ir/opt/polyfill_pass.cpp - ir/opt/verification_pass.cpp + ir/opt_passes.cpp + ir/opt_passes.h ir/terminal.h ir/type.cpp ir/type.h ir/value.cpp ir/value.h + # A32 + frontend/A32/a32_ir_emitter.cpp + frontend/A32/a32_ir_emitter.h + frontend/A32/a32_location_descriptor.cpp + frontend/A32/a32_location_descriptor.h + frontend/A32/decoder/arm.h + frontend/A32/decoder/arm.inc + frontend/A32/decoder/asimd.h + frontend/A32/decoder/asimd.inc + frontend/A32/decoder/thumb16.h + frontend/A32/decoder/thumb16.inc + frontend/A32/decoder/thumb32.h + frontend/A32/decoder/thumb32.inc + frontend/A32/decoder/vfp.h + frontend/A32/decoder/vfp.inc + frontend/A32/disassembler/disassembler.h + frontend/A32/disassembler/disassembler_arm.cpp + frontend/A32/disassembler/disassembler_thumb.cpp + frontend/A32/FPSCR.h + frontend/A32/ITState.h + frontend/A32/PSR.h + frontend/A32/translate/a32_translate.cpp + frontend/A32/translate/a32_translate.h + frontend/A32/translate/conditional_state.cpp + frontend/A32/translate/conditional_state.h + frontend/A32/translate/translate_arm.cpp + frontend/A32/translate/translate_thumb.cpp + interface/A32/a32.h + interface/A32/arch_version.h + interface/A32/config.h + interface/A32/coprocessor.h + interface/A32/coprocessor_util.h + interface/A32/disassembler.h + # A64 + frontend/A64/a64_ir_emitter.cpp + frontend/A64/a64_ir_emitter.h + frontend/A64/a64_location_descriptor.cpp + frontend/A64/a64_location_descriptor.h + frontend/A64/decoder/a64.h + frontend/A64/decoder/a64.inc + frontend/A64/translate/a64_translate.cpp + frontend/A64/translate/a64_translate.h + interface/A64/a64.h + interface/A64/config.h ) -if ("A32" IN_LIST DYNARMIC_FRONTENDS) - target_sources(dynarmic PRIVATE - frontend/A32/a32_ir_emitter.cpp - frontend/A32/a32_ir_emitter.h - frontend/A32/a32_location_descriptor.cpp - frontend/A32/a32_location_descriptor.h - frontend/A32/decoder/arm.h - frontend/A32/decoder/arm.inc - frontend/A32/decoder/asimd.h - frontend/A32/decoder/asimd.inc - frontend/A32/decoder/thumb16.h - frontend/A32/decoder/thumb16.inc - frontend/A32/decoder/thumb32.h - frontend/A32/decoder/thumb32.inc - frontend/A32/decoder/vfp.h - frontend/A32/decoder/vfp.inc - frontend/A32/disassembler/disassembler.h - frontend/A32/disassembler/disassembler_arm.cpp - frontend/A32/disassembler/disassembler_thumb.cpp - frontend/A32/FPSCR.h - frontend/A32/ITState.h - frontend/A32/PSR.h - frontend/A32/translate/a32_translate.cpp - frontend/A32/translate/a32_translate.h - frontend/A32/translate/conditional_state.cpp - frontend/A32/translate/conditional_state.h - frontend/A32/translate/translate_arm.cpp - frontend/A32/translate/translate_thumb.cpp - interface/A32/a32.h - interface/A32/arch_version.h - interface/A32/config.h - interface/A32/coprocessor.h - interface/A32/coprocessor_util.h - interface/A32/disassembler.h - ir/opt/a32_constant_memory_reads_pass.cpp - ir/opt/a32_get_set_elimination_pass.cpp - ) -endif() - -if ("A64" IN_LIST DYNARMIC_FRONTENDS) - target_sources(dynarmic PRIVATE - frontend/A64/a64_ir_emitter.cpp - frontend/A64/a64_ir_emitter.h - frontend/A64/a64_location_descriptor.cpp - frontend/A64/a64_location_descriptor.h - frontend/A64/decoder/a64.h - frontend/A64/decoder/a64.inc - frontend/A64/translate/a64_translate.cpp - frontend/A64/translate/a64_translate.h - interface/A64/a64.h - interface/A64/config.h - ir/opt/a64_callback_config_pass.cpp - ir/opt/a64_get_set_elimination_pass.cpp - ir/opt/a64_merge_interpret_blocks.cpp - ) -endif() - if ("x86_64" IN_LIST ARCHITECTURE) + # Newer versions of xbyak (>= 7.25.0) have stricter checks that currently + # fail in dynarmic + target_compile_definitions(dynarmic PRIVATE XBYAK_STRICT_CHECK_MEM_REG_SIZE=0) + target_compile_definitions(dynarmic PRIVATE XBYAK_OLD_DISP_CHECK=1) target_link_libraries(dynarmic PRIVATE xbyak::xbyak - Zydis + Zydis::Zydis ) target_architecture_specific_sources(dynarmic "x86_64" @@ -211,29 +198,21 @@ if ("x86_64" IN_LIST ARCHITECTURE) common/spin_lock_x64.h common/x64_disassemble.cpp common/x64_disassemble.h + # A32 + backend/x64/a32_emit_x64.cpp + backend/x64/a32_emit_x64.h + backend/x64/a32_emit_x64_memory.cpp + backend/x64/a32_interface.cpp + backend/x64/a32_jitstate.cpp + backend/x64/a32_jitstate.h + # A64 + backend/x64/a64_emit_x64.cpp + backend/x64/a64_emit_x64.h + backend/x64/a64_emit_x64_memory.cpp + backend/x64/a64_interface.cpp + backend/x64/a64_jitstate.cpp + backend/x64/a64_jitstate.h ) - - if ("A32" IN_LIST DYNARMIC_FRONTENDS) - target_architecture_specific_sources(dynarmic "x86_64" - backend/x64/a32_emit_x64.cpp - backend/x64/a32_emit_x64.h - backend/x64/a32_emit_x64_memory.cpp - backend/x64/a32_interface.cpp - backend/x64/a32_jitstate.cpp - backend/x64/a32_jitstate.h - ) - endif() - - if ("A64" IN_LIST DYNARMIC_FRONTENDS) - target_architecture_specific_sources(dynarmic "x86_64" - backend/x64/a64_emit_x64.cpp - backend/x64/a64_emit_x64.h - backend/x64/a64_emit_x64_memory.cpp - backend/x64/a64_interface.cpp - backend/x64/a64_jitstate.cpp - backend/x64/a64_jitstate.h - ) - endif() endif() if ("arm64" IN_LIST ARCHITECTURE) @@ -277,25 +256,17 @@ if ("arm64" IN_LIST ARCHITECTURE) backend/arm64/verbose_debugging_output.h common/spin_lock_arm64.cpp common/spin_lock_arm64.h + # A32 + backend/arm64/a32_address_space.cpp + backend/arm64/a32_address_space.h + backend/arm64/a32_core.h + backend/arm64/a32_interface.cpp + # A64 + backend/arm64/a64_address_space.cpp + backend/arm64/a64_address_space.h + backend/arm64/a64_core.h + backend/arm64/a64_interface.cpp ) - - if ("A32" IN_LIST DYNARMIC_FRONTENDS) - target_architecture_specific_sources(dynarmic "arm64" - backend/arm64/a32_address_space.cpp - backend/arm64/a32_address_space.h - backend/arm64/a32_core.h - backend/arm64/a32_interface.cpp - ) - endif() - - if ("A64" IN_LIST DYNARMIC_FRONTENDS) - target_architecture_specific_sources(dynarmic "arm64" - backend/arm64/a64_address_space.cpp - backend/arm64/a64_address_space.h - backend/arm64/a64_core.h - backend/arm64/a64_interface.cpp - ) - endif() endif() if ("riscv" IN_LIST ARCHITECTURE) @@ -324,21 +295,14 @@ if ("riscv" IN_LIST ARCHITECTURE) backend/riscv64/reg_alloc.cpp backend/riscv64/reg_alloc.h backend/riscv64/stack_layout.h + # A32 + backend/riscv64/a32_address_space.cpp + backend/riscv64/a32_address_space.h + backend/riscv64/a32_core.h + backend/riscv64/a32_interface.cpp + backend/riscv64/code_block.h ) - - if ("A32" IN_LIST DYNARMIC_FRONTENDS) - target_sources(dynarmic PRIVATE - backend/riscv64/a32_address_space.cpp - backend/riscv64/a32_address_space.h - backend/riscv64/a32_core.h - backend/riscv64/a32_interface.cpp - backend/riscv64/code_block.h - ) - endif() - - if ("A64" IN_LIST DYNARMIC_FRONTENDS) - message(FATAL_ERROR "TODO: Unimplemented frontend for this host architecture") - endif() + message(FATAL_ERROR "TODO: Unimplemented frontend for this host architecture") endif() if (WIN32) @@ -410,13 +374,13 @@ endif() target_compile_options(dynarmic PRIVATE ${DYNARMIC_CXX_FLAGS}) target_link_libraries(dynarmic - PRIVATE + PUBLIC fmt::fmt merry::mcl ) if (BOOST_NO_HEADERS) -target_link_libraries(dynarmic PRIVATE Boost::variant Boost::icl Boost::pool) + target_link_libraries(dynarmic PRIVATE Boost::variant Boost::icl Boost::pool) else() target_link_libraries(dynarmic PRIVATE Boost::headers) endif() @@ -440,6 +404,10 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") endif() target_compile_definitions(dynarmic PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) +if (DYNARMIC_ENABLE_LTO) + set_property(TARGET dynarmic PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + if (DYNARMIC_USE_PRECOMPILED_HEADERS) set(PRECOMPILED_HEADERS "$<$:${CMAKE_CURRENT_SOURCE_DIR}/ir/ir_emitter.h>") if ("x86_64" IN_LIST ARCHITECTURE) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp index bbdf925ff4..01af361b27 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -16,7 +19,7 @@ #include "dynarmic/frontend/A32/translate/a32_translate.h" #include "dynarmic/interface/A32/config.h" #include "dynarmic/interface/exclusive_monitor.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" namespace Dynarmic::Backend::Arm64 { @@ -163,21 +166,7 @@ A32AddressSpace::A32AddressSpace(const A32::UserConfig& conf) IR::Block A32AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const { IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); - - Optimization::PolyfillPass(ir_block, {}); - Optimization::NamingPass(ir_block); - if (conf.HasOptimization(OptimizationFlag::GetSetElimination)) { - Optimization::A32GetSetElimination(ir_block, {.convert_nzc_to_nz = true}); - Optimization::DeadCodeElimination(ir_block); - } - if (conf.HasOptimization(OptimizationFlag::ConstProp)) { - Optimization::A32ConstantMemoryReads(ir_block, conf.callbacks); - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - } - Optimization::IdentityRemovalPass(ir_block); - Optimization::VerificationPass(ir_block); - + Optimization::Optimize(ir_block, conf, {}); return ir_block; } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index d4fe9a9cb7..c4c1c42792 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -15,7 +18,7 @@ #include "dynarmic/frontend/A64/translate/a64_translate.h" #include "dynarmic/interface/A64/config.h" #include "dynarmic/interface/exclusive_monitor.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" namespace Dynarmic::Backend::Arm64 { @@ -331,22 +334,7 @@ IR::Block A64AddressSpace::GenerateIR(IR::LocationDescriptor descriptor) const { const auto get_code = [this](u64 vaddr) { return conf.callbacks->MemoryReadCode(vaddr); }; IR::Block ir_block = A64::Translate(A64::LocationDescriptor{descriptor}, get_code, {conf.define_unpredictable_behaviour, conf.wall_clock_cntpct}); - - Optimization::A64CallbackConfigPass(ir_block, conf); - Optimization::NamingPass(ir_block); - if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) { - Optimization::A64GetSetElimination(ir_block); - Optimization::DeadCodeElimination(ir_block); - } - if (conf.HasOptimization(OptimizationFlag::ConstProp)) { - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - } - if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) { - Optimization::A64MergeInterpretBlocksPass(ir_block, conf.callbacks); - } - Optimization::VerificationPass(ir_block); - + Optimization::Optimize(ir_block, conf, {}); return ir_block; } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/abi.h b/src/dynarmic/src/dynarmic/backend/arm64/abi.h index ca7c9187db..635d64f062 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/abi.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/abi.h @@ -14,6 +14,7 @@ #include #include "dynarmic/common/common_types.h" +#include "dynarmic/common/assert.h" #include #include "dynarmic/common/always_false.h" diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_generic.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_generic.cpp index ad7df25ca6..23dc294511 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_generic.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_generic.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD @@ -13,15 +16,15 @@ struct ExceptionHandler::Impl final { ExceptionHandler::ExceptionHandler() = default; ExceptionHandler::~ExceptionHandler() = default; -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) void ExceptionHandler::Register(X64::BlockOfCode&) { // Do nothing } -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) void ExceptionHandler::Register(oaknut::CodeBlock&, std::size_t) { // Do nothing } -#elif defined(MCL_ARCHITECTURE_RISCV) +#elif defined(ARCHITECTURE_riscv64) void ExceptionHandler::Register(RV64::CodeBlock&, std::size_t) { // Do nothing } diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp index 52bcf5972f..76e517f05b 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_macos.cpp @@ -25,7 +25,7 @@ #include "dynarmic/backend/exception_handler.h" -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) # include "dynarmic/backend/x64/block_of_code.h" # define mig_external extern "C" @@ -36,7 +36,7 @@ using dynarmic_thread_state_t = x86_thread_state64_t; -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) # include # define mig_external extern "C" @@ -133,7 +133,7 @@ void MachHandler::MessagePump() { } } -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) kern_return_t MachHandler::HandleRequest(x86_thread_state64_t* ts) { std::lock_guard guard(code_block_infos_mutex); @@ -151,7 +151,7 @@ kern_return_t MachHandler::HandleRequest(x86_thread_state64_t* ts) { return KERN_SUCCESS; } -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) kern_return_t MachHandler::HandleRequest(arm_thread_state64_t* ts) { std::lock_guard guard(code_block_infos_mutex); @@ -269,13 +269,13 @@ private: ExceptionHandler::ExceptionHandler() = default; ExceptionHandler::~ExceptionHandler() = default; -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) void ExceptionHandler::Register(X64::BlockOfCode& code) { const u64 code_begin = mcl::bit_cast(code.getCode()); const u64 code_end = code_begin + code.GetTotalCodeSize(); impl = std::make_unique(code_begin, code_end); } -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) void ExceptionHandler::Register(oaknut::CodeBlock& mem, std::size_t size) { const u64 code_begin = mcl::bit_cast(mem.ptr()); const u64 code_end = code_begin + size; diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c b/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c index 762a80ca42..25678ab115 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_macos_mig.c @@ -5,9 +5,9 @@ #include -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) # include "dynarmic/backend/x64/mig/mach_exc_server.c" -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) # include "dynarmic/backend/arm64/mig/mach_exc_server.c" #else # error "Invalid architecture" diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp index 7695df57d2..f1f208179f 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_posix.cpp @@ -6,79 +6,101 @@ * SPDX-License-Identifier: 0BSD */ -#include "dynarmic/backend/exception_handler.h" - -#ifdef __APPLE__ -# include -# include -#else -# include -# ifndef __OpenBSD__ -# include -# endif -# ifdef __sun__ -# include -# endif -#endif - #include #include #include #include +#include #include -#include - +#include +#include "dynarmic/backend/exception_handler.h" #include "dynarmic/common/assert.h" -#include +#include "dynarmic/common/context.h" #include "dynarmic/common/common_types.h" - -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) # include "dynarmic/backend/x64/block_of_code.h" -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) # include - # include "dynarmic/backend/arm64/abi.h" -#elif defined(MCL_ARCHITECTURE_RISCV) +#elif defined(ARCHITECTURE_riscv64) # include "dynarmic/backend/riscv64/code_block.h" #else # error "Invalid architecture" #endif +#include namespace Dynarmic::Backend { namespace { struct CodeBlockInfo { - u64 code_begin, code_end; + u64 size; std::function cb; }; class SigHandler { -public: - SigHandler(); - ~SigHandler(); - - void AddCodeBlock(CodeBlockInfo info); - void RemoveCodeBlock(u64 host_pc); - - bool SupportsFastmem() const { return supports_fast_mem; } - -private: - auto FindCodeBlockInfo(u64 host_pc) { - return std::find_if(code_block_infos.begin(), code_block_infos.end(), [&](const auto& x) { return x.code_begin <= host_pc && x.code_end > host_pc; }); + auto FindCodeBlockInfo(u64 offset) noexcept { + return std::find_if(code_block_infos.begin(), code_block_infos.end(), [&](auto const& e) { + return e.first <= offset && e.first + e.second.size > offset; + }); } + static void SigAction(int sig, siginfo_t* info, void* raw_context); bool supports_fast_mem = true; - void* signal_stack_memory = nullptr; - - std::vector code_block_infos; - std::mutex code_block_infos_mutex; - + ankerl::unordered_dense::map code_block_infos; + std::shared_mutex code_block_infos_mutex; struct sigaction old_sa_segv; struct sigaction old_sa_bus; + std::size_t signal_stack_size; +public: + SigHandler() noexcept { + signal_stack_size = std::max(SIGSTKSZ, 2 * 1024 * 1024); + signal_stack_memory = mmap(nullptr, signal_stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - static void SigAction(int sig, siginfo_t* info, void* raw_context); + stack_t signal_stack{}; + signal_stack.ss_sp = signal_stack_memory; + signal_stack.ss_size = signal_stack_size; + signal_stack.ss_flags = 0; + if (sigaltstack(&signal_stack, nullptr) != 0) { + fmt::print(stderr, "dynarmic: POSIX SigHandler: init failure at sigaltstack\n"); + supports_fast_mem = false; + return; + } + + struct sigaction sa{}; + sa.sa_handler = nullptr; + sa.sa_sigaction = &SigHandler::SigAction; + sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART; + sigemptyset(&sa.sa_mask); + if (sigaction(SIGSEGV, &sa, &old_sa_segv) != 0) { + fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGSEGV handler\n"); + supports_fast_mem = false; + return; + } +#ifdef __APPLE__ + if (sigaction(SIGBUS, &sa, &old_sa_bus) != 0) { + fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGBUS handler\n"); + supports_fast_mem = false; + return; + } +#endif + } + + ~SigHandler() noexcept { + munmap(signal_stack_memory, signal_stack_size); + } + + void AddCodeBlock(u64 offset, CodeBlockInfo cbi) noexcept { + std::unique_lock guard(code_block_infos_mutex); + code_block_infos.insert_or_assign(offset, cbi); + } + void RemoveCodeBlock(u64 offset) noexcept { + std::unique_lock guard(code_block_infos_mutex); + code_block_infos.erase(offset); + } + + bool SupportsFastmem() const noexcept { return supports_fast_mem; } }; std::mutex handler_lock; @@ -91,179 +113,35 @@ void RegisterHandler() { } } -SigHandler::SigHandler() { - const size_t signal_stack_size = std::max(SIGSTKSZ, 2 * 1024 * 1024); - - signal_stack_memory = std::malloc(signal_stack_size); - - stack_t signal_stack; - signal_stack.ss_sp = signal_stack_memory; - signal_stack.ss_size = signal_stack_size; - signal_stack.ss_flags = 0; - if (sigaltstack(&signal_stack, nullptr) != 0) { - fmt::print(stderr, "dynarmic: POSIX SigHandler: init failure at sigaltstack\n"); - supports_fast_mem = false; - return; - } - - struct sigaction sa; - sa.sa_handler = nullptr; - sa.sa_sigaction = &SigHandler::SigAction; - sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART; - sigemptyset(&sa.sa_mask); - if (sigaction(SIGSEGV, &sa, &old_sa_segv) != 0) { - fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGSEGV handler\n"); - supports_fast_mem = false; - return; - } -#ifdef __APPLE__ - if (sigaction(SIGBUS, &sa, &old_sa_bus) != 0) { - fmt::print(stderr, "dynarmic: POSIX SigHandler: could not set SIGBUS handler\n"); - supports_fast_mem = false; - return; - } -#endif -} - -SigHandler::~SigHandler() { - std::free(signal_stack_memory); -} - -void SigHandler::AddCodeBlock(CodeBlockInfo cbi) { - std::lock_guard guard(code_block_infos_mutex); - if (auto iter = FindCodeBlockInfo(cbi.code_begin); iter != code_block_infos.end()) { - code_block_infos.erase(iter); - } - code_block_infos.push_back(cbi); -} - -void SigHandler::RemoveCodeBlock(u64 host_pc) { - std::lock_guard guard(code_block_infos_mutex); - const auto iter = FindCodeBlockInfo(host_pc); - if (iter == code_block_infos.end()) { - return; - } - code_block_infos.erase(iter); -} - void SigHandler::SigAction(int sig, siginfo_t* info, void* raw_context) { - ASSERT(sig == SIGSEGV || sig == SIGBUS); - -#ifndef MCL_ARCHITECTURE_RISCV - ucontext_t* ucontext = reinterpret_cast(raw_context); -#ifndef __OpenBSD__ - auto& mctx = ucontext->uc_mcontext; -#endif -#endif - -#if defined(MCL_ARCHITECTURE_X86_64) - -# if defined(__APPLE__) -# define CTX_RIP (mctx->__ss.__rip) -# define CTX_RSP (mctx->__ss.__rsp) -# elif defined(__linux__) -# define CTX_RIP (mctx.gregs[REG_RIP]) -# define CTX_RSP (mctx.gregs[REG_RSP]) -# elif defined(__FreeBSD__) -# define CTX_RIP (mctx.mc_rip) -# define CTX_RSP (mctx.mc_rsp) -# elif defined(__NetBSD__) -# define CTX_RIP (mctx.__gregs[_REG_RIP]) -# define CTX_RSP (mctx.__gregs[_REG_RSP]) -# elif defined(__OpenBSD__) -# define CTX_RIP (ucontext->sc_rip) -# define CTX_RSP (ucontext->sc_rsp) -# elif defined(__sun__) -# define CTX_RIP (mctx.gregs[REG_RIP]) -# define CTX_RSP (mctx.gregs[REG_RSP]) -# else -# error "Unknown platform" -# endif - + DEBUG_ASSERT(sig == SIGSEGV || sig == SIGBUS); + CTX_DECLARE(raw_context); +#if defined(ARCHITECTURE_x86_64) { - std::lock_guard guard(sig_handler->code_block_infos_mutex); - - const auto iter = sig_handler->FindCodeBlockInfo(CTX_RIP); - if (iter != sig_handler->code_block_infos.end()) { - FakeCall fc = iter->cb(CTX_RIP); - + std::shared_lock guard(sig_handler->code_block_infos_mutex); + if (auto const iter = sig_handler->FindCodeBlockInfo(CTX_RIP); iter != sig_handler->code_block_infos.end()) { + FakeCall fc = iter->second.cb(CTX_RIP); CTX_RSP -= sizeof(u64); *mcl::bit_cast(CTX_RSP) = fc.ret_rip; CTX_RIP = fc.call_rip; - return; } } - fmt::print(stderr, "Unhandled {} at rip {:#018x}\n", sig == SIGSEGV ? "SIGSEGV" : "SIGBUS", CTX_RIP); - -#elif defined(MCL_ARCHITECTURE_ARM64) - -# if defined(__APPLE__) -# define CTX_PC (mctx->__ss.__pc) -# define CTX_SP (mctx->__ss.__sp) -# define CTX_LR (mctx->__ss.__lr) -# define CTX_X(i) (mctx->__ss.__x[i]) -# define CTX_Q(i) (mctx->__ns.__v[i]) -# elif defined(__linux__) -# define CTX_PC (mctx.pc) -# define CTX_SP (mctx.sp) -# define CTX_LR (mctx.regs[30]) -# define CTX_X(i) (mctx.regs[i]) -# define CTX_Q(i) (fpctx->vregs[i]) - [[maybe_unused]] const auto fpctx = [&mctx] { - _aarch64_ctx* header = (_aarch64_ctx*)&mctx.__reserved; - while (header->magic != FPSIMD_MAGIC) { - ASSERT(header->magic && header->size); - header = (_aarch64_ctx*)((char*)header + header->size); - } - return (fpsimd_context*)header; - }(); -# elif defined(__FreeBSD__) -# define CTX_PC (mctx.mc_gpregs.gp_elr) -# define CTX_SP (mctx.mc_gpregs.gp_sp) -# define CTX_LR (mctx.mc_gpregs.gp_lr) -# define CTX_X(i) (mctx.mc_gpregs.gp_x[i]) -# define CTX_Q(i) (mctx.mc_fpregs.fp_q[i]) -# elif defined(__NetBSD__) -# define CTX_PC (mctx.mc_gpregs.gp_elr) -# define CTX_SP (mctx.mc_gpregs.gp_sp) -# define CTX_LR (mctx.mc_gpregs.gp_lr) -# define CTX_X(i) (mctx.mc_gpregs.gp_x[i]) -# define CTX_Q(i) (mctx.mc_fpregs.fp_q[i]) -# elif defined(__OpenBSD__) -# define CTX_PC (ucontext->sc_elr) -# define CTX_SP (ucontext->sc_sp) -# define CTX_LR (ucontext->sc_lr) -# define CTX_X(i) (ucontext->sc_x[i]) -# define CTX_Q(i) (ucontext->sc_q[i]) -# else -# error "Unknown platform" -# endif - +#elif defined(ARCHITECTURE_arm64) { - std::lock_guard guard(sig_handler->code_block_infos_mutex); - - const auto iter = sig_handler->FindCodeBlockInfo(CTX_PC); - if (iter != sig_handler->code_block_infos.end()) { - FakeCall fc = iter->cb(CTX_PC); - + std::shared_lock guard(sig_handler->code_block_infos_mutex); + if (const auto iter = sig_handler->FindCodeBlockInfo(CTX_PC); iter != sig_handler->code_block_infos.end()) { + FakeCall fc = iter->second.cb(CTX_PC); CTX_PC = fc.call_pc; - return; } } - fmt::print(stderr, "Unhandled {} at pc {:#018x}\n", sig == SIGSEGV ? "SIGSEGV" : "SIGBUS", CTX_PC); - -#elif defined(MCL_ARCHITECTURE_RISCV) - +#elif defined(ARCHITECTURE_riscv64) ASSERT_FALSE("Unimplemented"); - #else - # error "Invalid architecture" - #endif struct sigaction* retry_sa = sig == SIGSEGV ? &sig_handler->old_sa_segv : &sig_handler->old_sa_bus; @@ -284,26 +162,26 @@ void SigHandler::SigAction(int sig, siginfo_t* info, void* raw_context) { } // anonymous namespace struct ExceptionHandler::Impl final { - Impl(u64 code_begin_, u64 code_end_) - : code_begin(code_begin_) - , code_end(code_end_) { + Impl(u64 offset_, u64 size_) + : offset(offset_) + , size(size_) { RegisterHandler(); } void SetCallback(std::function cb) { - CodeBlockInfo cbi; - cbi.code_begin = code_begin; - cbi.code_end = code_end; - cbi.cb = cb; - sig_handler->AddCodeBlock(cbi); + sig_handler->AddCodeBlock(offset, CodeBlockInfo{ + .size = size, + .cb = cb + }); } ~Impl() { - sig_handler->RemoveCodeBlock(code_begin); + sig_handler->RemoveCodeBlock(offset); } private: - u64 code_begin, code_end; + u64 offset; + u64 size; }; ExceptionHandler::ExceptionHandler() = default; @@ -311,28 +189,22 @@ ExceptionHandler::~ExceptionHandler() = default; #if defined(MCL_ARCHITECTURE_X86_64) void ExceptionHandler::Register(X64::BlockOfCode& code) { - const u64 code_begin = mcl::bit_cast(code.getCode()); - const u64 code_end = code_begin + code.GetTotalCodeSize(); - impl = std::make_unique(code_begin, code_end); + impl = std::make_unique(mcl::bit_cast(code.getCode()), code.GetTotalCodeSize()); } #elif defined(MCL_ARCHITECTURE_ARM64) void ExceptionHandler::Register(oaknut::CodeBlock& mem, std::size_t size) { - const u64 code_begin = mcl::bit_cast(mem.ptr()); - const u64 code_end = code_begin + size; - impl = std::make_unique(code_begin, code_end); + impl = std::make_unique(mcl::bit_cast(mem.ptr()), size); } #elif defined(MCL_ARCHITECTURE_RISCV) void ExceptionHandler::Register(RV64::CodeBlock& mem, std::size_t size) { - const u64 code_begin = mcl::bit_cast(mem.ptr()); - const u64 code_end = code_begin + size; - impl = std::make_unique(code_begin, code_end); + impl = std::make_unique(mcl::bit_cast(mem.ptr()), size); } #else # error "Invalid architecture" #endif bool ExceptionHandler::SupportsFastmem() const noexcept { - return static_cast(impl) && sig_handler->SupportsFastmem(); + return bool(impl) && sig_handler->SupportsFastmem(); } void ExceptionHandler::SetFastmemCallback(std::function cb) { diff --git a/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp b/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp index 719c007594..58a3325e17 100644 --- a/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp +++ b/src/dynarmic/src/dynarmic/backend/exception_handler_windows.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2023 MerryMage * SPDX-License-Identifier: 0BSD @@ -5,9 +8,9 @@ #include -#if defined(MCL_ARCHITECTURE_X86_64) +#if defined(ARCHITECTURE_x86_64) # include "dynarmic/backend/x64/exception_handler_windows.cpp" -#elif defined(MCL_ARCHITECTURE_ARM64) +#elif defined(ARCHITECTURE_arm64) # include "dynarmic/backend/exception_handler_generic.cpp" #else # error "Invalid architecture" diff --git a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp index efa211618b..8a21aafcf8 100644 --- a/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/riscv64/a32_address_space.cpp @@ -15,7 +15,7 @@ #include "dynarmic/backend/riscv64/stack_layout.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/frontend/A32/translate/a32_translate.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" namespace Dynarmic::Backend::RV64 { diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp index b116ec180e..382eb70f3f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_interface.cpp @@ -29,7 +29,7 @@ #include "dynarmic/interface/A32/a32.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/location_descriptor.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" namespace Dynarmic::A32 { @@ -217,19 +217,7 @@ private: block_of_code.EnsureMemoryCommitted(MINIMUM_REMAINING_CODESIZE); IR::Block ir_block = A32::Translate(A32::LocationDescriptor{descriptor}, conf.callbacks, {conf.arch_version, conf.define_unpredictable_behaviour, conf.hook_hint_instructions}); - Optimization::PolyfillPass(ir_block, polyfill_options); - Optimization::NamingPass(ir_block); - if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) { - Optimization::A32GetSetElimination(ir_block, {.convert_nz_to_nzc = true}); - Optimization::DeadCodeElimination(ir_block); - } - if (conf.HasOptimization(OptimizationFlag::ConstProp)) { - Optimization::A32ConstantMemoryReads(ir_block, conf.callbacks); - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - } - Optimization::IdentityRemovalPass(ir_block); - Optimization::VerificationPass(ir_block); + Optimization::Optimize(ir_block, conf, polyfill_options); return emitter.Emit(ir_block); } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp index ddd2327395..c65b582982 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_interface.cpp @@ -25,7 +25,7 @@ #include "dynarmic/frontend/A64/translate/a64_translate.h" #include "dynarmic/interface/A64/a64.h" #include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" namespace Dynarmic::A64 { @@ -275,21 +275,7 @@ private: const auto get_code = [this](u64 vaddr) { return conf.callbacks->MemoryReadCode(vaddr); }; IR::Block ir_block = A64::Translate(A64::LocationDescriptor{current_location}, get_code, {conf.define_unpredictable_behaviour, conf.wall_clock_cntpct}); - Optimization::PolyfillPass(ir_block, polyfill_options); - Optimization::A64CallbackConfigPass(ir_block, conf); - Optimization::NamingPass(ir_block); - if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) { - Optimization::A64GetSetElimination(ir_block); - Optimization::DeadCodeElimination(ir_block); - } - if (conf.HasOptimization(OptimizationFlag::ConstProp)) { - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - } - if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) { - Optimization::A64MergeInterpretBlocksPass(ir_block, conf.callbacks); - } - Optimization::VerificationPass(ir_block); + Optimization::Optimize(ir_block, conf, polyfill_options); return emitter.Emit(ir_block).entrypoint; } diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 5a33ac7727..d5d5f089ff 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -225,8 +225,14 @@ bool IsUnderRosetta() { } // anonymous namespace +#ifdef DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT +static const auto default_cg_mode = Xbyak::DontSetProtectRWE; +#else +static const auto default_cg_mode = nullptr; //Allow RWE +#endif + BlockOfCode::BlockOfCode(RunCodeCallbacks cb, JitStateInfo jsi, size_t total_code_size, std::function rcp) - : Xbyak::CodeGenerator(total_code_size, nullptr, &s_allocator) + : Xbyak::CodeGenerator(total_code_size, default_cg_mode, &s_allocator) , cb(std::move(cb)) , jsi(jsi) , constant_pool(*this, CONSTANT_POOL_SIZE) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp index a13baa6a97..3bc93e6fd5 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64.cpp @@ -277,7 +277,7 @@ void EmitX64::EmitNZCVFromPackedFlags(EmitContext& ctx, IR::Inst* inst) { } void EmitX64::EmitAddCycles(size_t cycles) { - ASSERT(cycles < std::numeric_limits::max()); + ASSERT(cycles < (std::numeric_limits::max)()); code.sub(qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, cycles_remaining)], static_cast(cycles)); } diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp index e795181872..31231c02aa 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp @@ -38,7 +38,7 @@ void EmitSignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) Xbyak::Reg addend = ctx.reg_alloc.UseGpr(args[1]).changeBit(size); Xbyak::Reg overflow = ctx.reg_alloc.ScratchGpr().changeBit(size); - constexpr u64 int_max = static_cast(std::numeric_limits>::max()); + constexpr u64 int_max = static_cast((std::numeric_limits>::max)()); if constexpr (size < 64) { code.xor_(overflow.cvt32(), overflow.cvt32()); code.bt(result.cvt32(), size - 1); @@ -82,7 +82,7 @@ void EmitUnsignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst Xbyak::Reg op_result = ctx.reg_alloc.UseScratchGpr(args[0]).changeBit(size); Xbyak::Reg addend = ctx.reg_alloc.UseScratchGpr(args[1]).changeBit(size); - constexpr u64 boundary = op == Op::Add ? std::numeric_limits>::max() : 0; + constexpr u64 boundary = op == Op::Add ? (std::numeric_limits>::max)() : 0; if constexpr (op == Op::Add) { code.add(op_result, addend); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp index e1b9e54df8..99000c2a57 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp @@ -548,7 +548,7 @@ void EmitX64::EmitVectorArithmeticShiftRight32(EmitContext& ctx, IR::Inst* inst) void EmitX64::EmitVectorArithmeticShiftRight64(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(args[0]); - const u8 shift_amount = std::min(args[1].GetImmediateU8(), u8(63)); + const u8 shift_amount = (std::min)(args[1].GetImmediateU8(), u8(63)); if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { code.vpsraq(result, result, shift_amount); @@ -2139,7 +2139,7 @@ void EmitX64::EmitVectorMaxS64(EmitContext& ctx, IR::Inst* inst) { } EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return std::max(x, y); }); + std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::max)(x, y); }); }); } @@ -2201,7 +2201,7 @@ void EmitX64::EmitVectorMaxU64(EmitContext& ctx, IR::Inst* inst) { } EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return std::max(x, y); }); + std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::max)(x, y); }); }); } @@ -2259,7 +2259,7 @@ void EmitX64::EmitVectorMinS64(EmitContext& ctx, IR::Inst* inst) { } EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return std::min(x, y); }); + std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::min)(x, y); }); }); } @@ -2321,7 +2321,7 @@ void EmitX64::EmitVectorMinU64(EmitContext& ctx, IR::Inst* inst) { } EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray& result, const VectorArray& a, const VectorArray& b) { - std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return std::min(x, y); }); + std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](auto x, auto y) { return (std::min)(x, y); }); }); } @@ -2837,22 +2837,22 @@ static void LowerPairedOperation(VectorArray& result, const VectorArray& x template static void PairedMax(VectorArray& result, const VectorArray& x, const VectorArray& y) { - PairedOperation(result, x, y, [](auto a, auto b) { return std::max(a, b); }); + PairedOperation(result, x, y, [](auto a, auto b) { return (std::max)(a, b); }); } template static void PairedMin(VectorArray& result, const VectorArray& x, const VectorArray& y) { - PairedOperation(result, x, y, [](auto a, auto b) { return std::min(a, b); }); + PairedOperation(result, x, y, [](auto a, auto b) { return (std::min)(a, b); }); } template static void LowerPairedMax(VectorArray& result, const VectorArray& x, const VectorArray& y) { - LowerPairedOperation(result, x, y, [](auto a, auto b) { return std::max(a, b); }); + LowerPairedOperation(result, x, y, [](auto a, auto b) { return (std::max)(a, b); }); } template static void LowerPairedMin(VectorArray& result, const VectorArray& x, const VectorArray& y) { - LowerPairedOperation(result, x, y, [](auto a, auto b) { return std::min(a, b); }); + LowerPairedOperation(result, x, y, [](auto a, auto b) { return (std::min)(a, b); }); } template @@ -4933,7 +4933,7 @@ static bool VectorSignedSaturatedShiftLeft(VectorArray& dst, const VectorArra for (size_t i = 0; i < dst.size(); i++) { const T element = data[i]; const T shift = std::clamp(static_cast(mcl::bit::sign_extend<8>(static_cast(shift_values[i] & 0xFF))), - -static_cast(bit_size_minus_one), std::numeric_limits::max()); + -static_cast(bit_size_minus_one), (std::numeric_limits::max)()); if (element == 0) { dst[i] = 0; @@ -4995,7 +4995,7 @@ static bool VectorSignedSaturatedShiftLeftUnsigned(VectorArray& dst, const Ve const U shifted_test = shifted >> static_cast(shift); if (shifted_test != static_cast(element)) { - dst[i] = static_cast(std::numeric_limits::max()); + dst[i] = static_cast((std::numeric_limits::max)()); qc_flag = true; } else { dst[i] = shifted; @@ -5845,11 +5845,11 @@ static bool EmitVectorUnsignedSaturatedAccumulateSigned(VectorArray& result, const s64 y = static_cast(static_cast>(rhs[i])); const s64 sum = x + y; - if (sum > std::numeric_limits::max()) { - result[i] = std::numeric_limits::max(); + if (sum > (std::numeric_limits::max)()) { + result[i] = (std::numeric_limits::max)(); qc_flag = true; } else if (sum < 0) { - result[i] = std::numeric_limits::min(); + result[i] = (std::numeric_limits::min)(); qc_flag = true; } else { result[i] = static_cast(sum); @@ -5947,20 +5947,20 @@ static bool VectorUnsignedSaturatedShiftLeft(VectorArray& dst, const VectorAr for (size_t i = 0; i < dst.size(); i++) { const T element = data[i]; const S shift = std::clamp(static_cast(mcl::bit::sign_extend<8>(static_cast(shift_values[i] & 0xFF))), - negative_bit_size, std::numeric_limits::max()); + negative_bit_size, (std::numeric_limits::max)()); if (element == 0 || shift <= negative_bit_size) { dst[i] = 0; } else if (shift < 0) { dst[i] = static_cast(element >> -shift); } else if (shift >= static_cast(bit_size)) { - dst[i] = std::numeric_limits::max(); + dst[i] = (std::numeric_limits::max)(); qc_flag = true; } else { const T shifted = element << shift; if ((shifted >> shift) != element) { - dst[i] = std::numeric_limits::max(); + dst[i] = (std::numeric_limits::max)(); qc_flag = true; } else { dst[i] = shifted; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index c8f0d9575c..a368e6703f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -2116,7 +2116,7 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { } } else { using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC - constexpr u64 integer_max = static_cast(std::numeric_limits>>::max()); + constexpr u64 integer_max = static_cast((std::numeric_limits>>::max)()); code.movaps(xmm0, GetVectorOf(code)); FCODE(cmplep)(xmm0, src); diff --git a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp index fa6006ed2a..29eab7908b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.cpp @@ -85,7 +85,7 @@ void HostLocInfo::ReleaseOne() noexcept { if (current_references == 0) return; - ASSERT(size_t(accumulated_uses) + 1 < std::numeric_limits::max()); + ASSERT(size_t(accumulated_uses) + 1 < (std::numeric_limits::max)()); accumulated_uses++; current_references--; @@ -116,7 +116,7 @@ void HostLocInfo::AddValue(IR::Inst* inst) noexcept { values.clear(); } values.push_back(inst); - ASSERT(size_t(total_uses) + inst->UseCount() < std::numeric_limits::max()); + ASSERT(size_t(total_uses) + inst->UseCount() < (std::numeric_limits::max)()); total_uses += inst->UseCount(); max_bit_width = std::max(max_bit_width, GetBitWidth(inst->GetType())); } @@ -400,14 +400,14 @@ void RegAlloc::HostCall(IR::Inst* result_def, } void RegAlloc::AllocStackSpace(const size_t stack_space) noexcept { - ASSERT(stack_space < size_t(std::numeric_limits::max())); + ASSERT(stack_space < size_t((std::numeric_limits::max)())); ASSERT(reserved_stack_space == 0); reserved_stack_space = stack_space; code->sub(code->rsp, u32(stack_space)); } void RegAlloc::ReleaseStackSpace(const size_t stack_space) noexcept { - ASSERT(stack_space < size_t(std::numeric_limits::max())); + ASSERT(stack_space < size_t((std::numeric_limits::max)())); ASSERT(reserved_stack_space == stack_space); reserved_stack_space = 0; code->add(code->rsp, u32(stack_space)); diff --git a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h index f70329f471..bfacdcca52 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h +++ b/src/dynarmic/src/dynarmic/backend/x64/reg_alloc.h @@ -52,18 +52,18 @@ public: is_set_last_use = true; } inline void ReadLock() noexcept { - ASSERT(size_t(is_being_used_count) + 1 < std::numeric_limits::max()); + ASSERT(size_t(is_being_used_count) + 1 < (std::numeric_limits::max)()); ASSERT(!is_scratch); is_being_used_count++; } inline void WriteLock() noexcept { - ASSERT(size_t(is_being_used_count) + 1 < std::numeric_limits::max()); + ASSERT(size_t(is_being_used_count) + 1 < (std::numeric_limits::max)()); ASSERT(is_being_used_count == 0); is_being_used_count++; is_scratch = true; } inline void AddArgReference() noexcept { - ASSERT(size_t(current_references) + 1 < std::numeric_limits::max()); + ASSERT(size_t(current_references) + 1 < (std::numeric_limits::max)()); current_references++; ASSERT(accumulated_uses + current_references <= total_uses); } diff --git a/src/dynarmic/src/dynarmic/common/assert.h b/src/dynarmic/src/dynarmic/common/assert.h index 9973b8948d..0a3cb5331d 100644 --- a/src/dynarmic/src/dynarmic/common/assert.h +++ b/src/dynarmic/src/dynarmic/common/assert.h @@ -23,6 +23,12 @@ template } \ }()) #endif +#ifndef ASSERT_FALSE +#define ASSERT_FALSE(...) \ + ([&]() { \ + assert_terminate("false", __VA_ARGS__); \ + }()) +#endif #ifndef ASSERT #define ASSERT(_a_) ASSERT_MSG(_a_, "") diff --git a/src/dynarmic/src/dynarmic/common/common_types.h b/src/dynarmic/src/dynarmic/common/common_types.h index 8127df3623..711418d97f 100644 --- a/src/dynarmic/src/dynarmic/common/common_types.h +++ b/src/dynarmic/src/dynarmic/common/common_types.h @@ -1,9 +1,12 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// TODO(crueter): This is identical to root common_types.h + #pragma once #include +#include #include using u8 = std::uint8_t; ///< 8-bit unsigned byte diff --git a/src/dynarmic/src/dynarmic/common/context.h b/src/dynarmic/src/dynarmic/common/context.h new file mode 100644 index 0000000000..0eb128449c --- /dev/null +++ b/src/dynarmic/src/dynarmic/common/context.h @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#ifdef __APPLE__ +# include +# include +#else +# include +# ifndef __OpenBSD__ +# include +# endif +# ifdef __sun__ +# include +# endif +# ifdef __linux__ +# include +# endif +#endif + +#ifdef ARCHITECTURE_x86_64 +# ifdef __OpenBSD__ +# define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); +# else +# define CTX_DECLARE(raw_context) \ + ucontext_t* ucontext = reinterpret_cast(raw_context); \ + [[maybe_unused]] auto& mctx = ucontext->uc_mcontext; +# endif +#elif defined(ARCHITECTURE_arm64) +# ifdef __OpenBSD__ +# define CTX_DECLARE(raw_context) ucontext_t* ucontext = reinterpret_cast(raw_context); +# else +# define CTX_DECLARE(raw_context) \ + ucontext_t* ucontext = reinterpret_cast(raw_context); \ + [[maybe_unused]] auto& mctx = ucontext->uc_mcontext; \ + [[maybe_unused]] const auto fpctx = GetFloatingPointState(mctx); +# endif +#endif + +#if defined(ARCHITECTURE_x86_64) +# if defined(__APPLE__) +# define CTX_RIP (mctx->__ss.__rip) +# define CTX_RSP (mctx->__ss.__rsp) +# elif defined(__linux__) +# define CTX_RIP (mctx.gregs[REG_RIP]) +# define CTX_RSP (mctx.gregs[REG_RSP]) +# elif defined(__FreeBSD__) +# define CTX_RIP (mctx.mc_rip) +# define CTX_RSP (mctx.mc_rsp) +# elif defined(__NetBSD__) +# define CTX_RIP (mctx.__gregs[_REG_RIP]) +# define CTX_RSP (mctx.__gregs[_REG_RSP]) +# elif defined(__OpenBSD__) +# define CTX_RIP (ucontext->sc_rip) +# define CTX_RSP (ucontext->sc_rsp) +# elif defined(__sun__) +# define CTX_RIP (mctx.gregs[REG_RIP]) +# define CTX_RSP (mctx.gregs[REG_RSP]) +# else +# error "Unknown platform" +# endif +#elif defined(ARCHITECTURE_arm64) +# if defined(__APPLE__) +# define CTX_PC (mctx->__ss.__pc) +# define CTX_SP (mctx->__ss.__sp) +# define CTX_LR (mctx->__ss.__lr) +# define CTX_PSTATE (mctx->__ss.__cpsr) +# define CTX_X(i) (mctx->__ss.__x[i]) +# define CTX_Q(i) (mctx->__ns.__v[i]) +# define CTX_FPSR (mctx->__ns.__fpsr) +# define CTX_FPCR (mctx->__ns.__fpcr) +# elif defined(__linux__) +# define CTX_PC (mctx.pc) +# define CTX_SP (mctx.sp) +# define CTX_LR (mctx.regs[30]) +# define CTX_PSTATE (mctx.pstate) +# define CTX_X(i) (mctx.regs[i]) +# define CTX_Q(i) (fpctx->vregs[i]) +# define CTX_FPSR (fpctx->fpsr) +# define CTX_FPCR (fpctx->fpcr) +# elif defined(__FreeBSD__) +# define CTX_PC (mctx.mc_gpregs.gp_elr) +# define CTX_SP (mctx.mc_gpregs.gp_sp) +# define CTX_LR (mctx.mc_gpregs.gp_lr) +# define CTX_X(i) (mctx.mc_gpregs.gp_x[i]) +# define CTX_Q(i) (mctx.mc_fpregs.fp_q[i]) +# elif defined(__NetBSD__) +# define CTX_PC (mctx.mc_gpregs.gp_elr) +# define CTX_SP (mctx.mc_gpregs.gp_sp) +# define CTX_LR (mctx.mc_gpregs.gp_lr) +# define CTX_X(i) (mctx.mc_gpregs.gp_x[i]) +# define CTX_Q(i) (mctx.mc_fpregs.fp_q[i]) +# elif defined(__OpenBSD__) +# define CTX_PC (ucontext->sc_elr) +# define CTX_SP (ucontext->sc_sp) +# define CTX_LR (ucontext->sc_lr) +# define CTX_X(i) (ucontext->sc_x[i]) +# define CTX_Q(i) (ucontext->sc_q[i]) +# else +# error "Unknown platform" +# endif +#else +# error "unimplemented" +#endif + +#ifdef ARCHITECTURE_arm64 +#ifdef __APPLE__ +inline _STRUCT_ARM_NEON_STATE64* GetFloatingPointState(mcontext_t& host_ctx) { + return &(host_ctx->__ns); +} +#elif defined(__linux__) +inline fpsimd_context* GetFloatingPointState(mcontext_t& host_ctx) { + _aarch64_ctx* header = reinterpret_cast<_aarch64_ctx*>(&host_ctx.__reserved); + while (header->magic != FPSIMD_MAGIC) + header = reinterpret_cast<_aarch64_ctx*>(reinterpret_cast(header) + header->size); + return reinterpret_cast(header); +} +#endif +#endif diff --git a/src/dynarmic/src/dynarmic/common/lut_from_list.h b/src/dynarmic/src/dynarmic/common/lut_from_list.h index ed9e3dc046..c904e2c041 100644 --- a/src/dynarmic/src/dynarmic/common/lut_from_list.h +++ b/src/dynarmic/src/dynarmic/common/lut_from_list.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -19,6 +22,16 @@ namespace Dynarmic::Common { +// prevents this function from printing 56,000 character warning messages +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wno-stack-usage" +#endif +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wno-stack-usage" +#endif + template inline auto GenerateLookupTableFromList(Function f, mcl::mp::list) { #ifdef _MSC_VER @@ -34,4 +47,11 @@ inline auto GenerateLookupTableFromList(Function f, mcl::mp::list) { return MapT(pair_array.begin(), pair_array.end()); } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + } // namespace Dynarmic::Common diff --git a/src/dynarmic/src/dynarmic/common/memory_pool.h b/src/dynarmic/src/dynarmic/common/memory_pool.h index c99316e107..d0a5223db3 100644 --- a/src/dynarmic/src/dynarmic/common/memory_pool.h +++ b/src/dynarmic/src/dynarmic/common/memory_pool.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2016 MerryMage * SPDX-License-Identifier: 0BSD @@ -6,6 +9,7 @@ #pragma once #include +#include #include namespace Dynarmic::Common { diff --git a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp index 474c2f8404..da50179de9 100644 --- a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp +++ b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -11,6 +14,12 @@ #include "dynarmic/backend/x64/hostloc.h" #include "dynarmic/common/spin_lock.h" +#ifdef DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT +static const auto default_cg_mode = Xbyak::DontSetProtectRWE; +#else +static const auto default_cg_mode = nullptr; //Allow RWE +#endif + namespace Dynarmic { void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 tmp) { @@ -37,7 +46,7 @@ namespace { struct SpinLockImpl { void Initialize(); - Xbyak::CodeGenerator code; + Xbyak::CodeGenerator code = Xbyak::CodeGenerator(4096, default_cg_mode); void (*lock)(volatile int*); void (*unlock)(volatile int*); diff --git a/src/dynarmic/src/dynarmic/frontend/A32/a32_types.h b/src/dynarmic/src/dynarmic/frontend/A32/a32_types.h index fdadef8257..3f4501a528 100644 --- a/src/dynarmic/src/dynarmic/frontend/A32/a32_types.h +++ b/src/dynarmic/src/dynarmic/frontend/A32/a32_types.h @@ -106,6 +106,7 @@ inline size_t RegNumber(ExtReg reg) { } ASSERT_MSG(false, "Invalid extended register"); + return 0; } inline Reg operator+(Reg reg, size_t number) { diff --git a/src/dynarmic/src/dynarmic/interface/optimization_flags.h b/src/dynarmic/src/dynarmic/interface/optimization_flags.h index 743d902767..9e58197b47 100644 --- a/src/dynarmic/src/dynarmic/interface/optimization_flags.h +++ b/src/dynarmic/src/dynarmic/interface/optimization_flags.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2020 MerryMage * SPDX-License-Identifier: 0BSD @@ -34,6 +37,8 @@ enum class OptimizationFlag : std::uint32_t { MiscIROpt = 0x00000020, /// Optimize for code speed rather than for code size (this serves well for tight loops) CodeSpeed = 0x00000040, + /// Disable verification passes + DisableVerification = 0x00000080, /// This is an UNSAFE optimization that reduces accuracy of fused multiply-add operations. /// This unfuses fused instructions to improve performance on host CPUs without FMA support. diff --git a/src/dynarmic/src/dynarmic/ir/opt/a32_constant_memory_reads_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/a32_constant_memory_reads_pass.cpp deleted file mode 100644 index 9699f18345..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/a32_constant_memory_reads_pass.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include "dynarmic/interface/A32/config.h" -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -void A32ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { - for (auto& inst : block) { - switch (inst.GetOpcode()) { - case IR::Opcode::A32ReadMemory8: { - if (!inst.AreAllArgsImmediates()) { - break; - } - - const u32 vaddr = inst.GetArg(1).GetU32(); - if (cb->IsReadOnlyMemory(vaddr)) { - const u8 value_from_memory = cb->MemoryRead8(vaddr); - inst.ReplaceUsesWith(IR::Value{value_from_memory}); - } - break; - } - case IR::Opcode::A32ReadMemory16: { - if (!inst.AreAllArgsImmediates()) { - break; - } - - const u32 vaddr = inst.GetArg(1).GetU32(); - if (cb->IsReadOnlyMemory(vaddr)) { - const u16 value_from_memory = cb->MemoryRead16(vaddr); - inst.ReplaceUsesWith(IR::Value{value_from_memory}); - } - break; - } - case IR::Opcode::A32ReadMemory32: { - if (!inst.AreAllArgsImmediates()) { - break; - } - - const u32 vaddr = inst.GetArg(1).GetU32(); - if (cb->IsReadOnlyMemory(vaddr)) { - const u32 value_from_memory = cb->MemoryRead32(vaddr); - inst.ReplaceUsesWith(IR::Value{value_from_memory}); - } - break; - } - case IR::Opcode::A32ReadMemory64: { - if (!inst.AreAllArgsImmediates()) { - break; - } - - const u32 vaddr = inst.GetArg(1).GetU32(); - if (cb->IsReadOnlyMemory(vaddr)) { - const u64 value_from_memory = cb->MemoryRead64(vaddr); - inst.ReplaceUsesWith(IR::Value{value_from_memory}); - } - break; - } - default: - break; - } - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/a32_get_set_elimination_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/a32_get_set_elimination_pass.cpp deleted file mode 100644 index 499b38b120..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/a32_get_set_elimination_pass.cpp +++ /dev/null @@ -1,382 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include -#include -#include - -#include "dynarmic/common/assert.h" -#include "dynarmic/common/common_types.h" - -#include "dynarmic/frontend/A32/a32_ir_emitter.h" -#include "dynarmic/frontend/A32/a32_types.h" -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" -#include "dynarmic/ir/value.h" - -namespace Dynarmic::Optimization { - -namespace { - -void FlagsPass(IR::Block& block) { - using Iterator = std::reverse_iterator; - - struct FlagInfo { - bool set_not_required = false; - bool has_value_request = false; - Iterator value_request = {}; - }; - struct ValuelessFlagInfo { - bool set_not_required = false; - }; - ValuelessFlagInfo nzcvq; - ValuelessFlagInfo nzcv; - ValuelessFlagInfo nz; - FlagInfo c_flag; - FlagInfo ge; - - auto do_set = [&](FlagInfo& info, IR::Value value, Iterator inst) { - if (info.has_value_request) { - info.value_request->ReplaceUsesWith(value); - } - info.has_value_request = false; - - if (info.set_not_required) { - inst->Invalidate(); - } - info.set_not_required = true; - }; - - auto do_set_valueless = [&](ValuelessFlagInfo& info, Iterator inst) { - if (info.set_not_required) { - inst->Invalidate(); - } - info.set_not_required = true; - }; - - auto do_get = [](FlagInfo& info, Iterator inst) { - if (info.has_value_request) { - info.value_request->ReplaceUsesWith(IR::Value{&*inst}); - } - info.has_value_request = true; - info.value_request = inst; - }; - - A32::IREmitter ir{block, A32::LocationDescriptor{block.Location()}, {}}; - - for (auto inst = block.rbegin(); inst != block.rend(); ++inst) { - auto const opcode = inst->GetOpcode(); - switch (opcode) { - case IR::Opcode::A32GetCFlag: { - do_get(c_flag, inst); - break; - } - case IR::Opcode::A32SetCpsrNZCV: { - if (c_flag.has_value_request) { - ir.SetInsertionPointBefore(inst.base()); // base is one ahead - IR::U1 c = ir.GetCFlagFromNZCV(IR::NZCV{inst->GetArg(0)}); - c_flag.value_request->ReplaceUsesWith(c); - c_flag.has_value_request = false; - break; // This case will be executed again because of the above - } - - do_set_valueless(nzcv, inst); - - nz = {.set_not_required = true}; - c_flag = {.set_not_required = true}; - break; - } - case IR::Opcode::A32SetCpsrNZCVRaw: { - if (c_flag.has_value_request) { - nzcv.set_not_required = false; - } - - do_set_valueless(nzcv, inst); - - nzcvq = {}; - nz = {.set_not_required = true}; - c_flag = {.set_not_required = true}; - break; - } - case IR::Opcode::A32SetCpsrNZCVQ: { - if (c_flag.has_value_request) { - nzcvq.set_not_required = false; - } - - do_set_valueless(nzcvq, inst); - - nzcv = {.set_not_required = true}; - nz = {.set_not_required = true}; - c_flag = {.set_not_required = true}; - break; - } - case IR::Opcode::A32SetCpsrNZ: { - do_set_valueless(nz, inst); - - nzcvq = {}; - nzcv = {}; - break; - } - case IR::Opcode::A32SetCpsrNZC: { - if (c_flag.has_value_request) { - c_flag.value_request->ReplaceUsesWith(inst->GetArg(1)); - c_flag.has_value_request = false; - } - - if (!inst->GetArg(1).IsImmediate() && inst->GetArg(1).GetInstRecursive()->GetOpcode() == IR::Opcode::A32GetCFlag) { - const auto nz_value = inst->GetArg(0); - - inst->Invalidate(); - - ir.SetInsertionPointBefore(inst.base()); - ir.SetCpsrNZ(IR::NZCV{nz_value}); - - nzcvq = {}; - nzcv = {}; - nz = {.set_not_required = true}; - break; - } - - if (nz.set_not_required && c_flag.set_not_required) { - inst->Invalidate(); - } else if (nz.set_not_required) { - inst->SetArg(0, IR::Value::EmptyNZCVImmediateMarker()); - } - nz.set_not_required = true; - c_flag.set_not_required = true; - - nzcv = {}; - nzcvq = {}; - break; - } - case IR::Opcode::A32SetGEFlags: { - do_set(ge, inst->GetArg(0), inst); - break; - } - case IR::Opcode::A32GetGEFlags: { - do_get(ge, inst); - break; - } - case IR::Opcode::A32SetGEFlagsCompressed: { - ge = {.set_not_required = true}; - break; - } - case IR::Opcode::A32OrQFlag: { - break; - } - default: { - if (ReadsFromCPSR(opcode) || WritesToCPSR(opcode)) { - nzcvq = {}; - nzcv = {}; - nz = {}; - c_flag = {}; - ge = {}; - } - break; - } - } - } -} - -void RegisterPass(IR::Block& block) { - using Iterator = IR::Block::iterator; - - struct RegInfo { - IR::Value register_value; - std::optional last_set_instruction; - }; - std::array reg_info; - - const auto do_get = [](RegInfo& info, Iterator get_inst) { - if (info.register_value.IsEmpty()) { - info.register_value = IR::Value(&*get_inst); - return; - } - get_inst->ReplaceUsesWith(info.register_value); - }; - - const auto do_set = [](RegInfo& info, IR::Value value, Iterator set_inst) { - if (info.last_set_instruction) { - (*info.last_set_instruction)->Invalidate(); - } - info = { - .register_value = value, - .last_set_instruction = set_inst, - }; - }; - - enum class ExtValueType { - Empty, - Single, - Double, - VectorDouble, - VectorQuad, - }; - struct ExtRegInfo { - ExtValueType value_type = {}; - IR::Value register_value; - std::optional last_set_instruction; - }; - std::array ext_reg_info; - - const auto do_ext_get = [](ExtValueType type, std::initializer_list> infos, Iterator get_inst) { - if (!std::all_of(infos.begin(), infos.end(), [type](const auto& info) { return info.get().value_type == type; })) { - for (auto& info : infos) { - info.get() = { - .value_type = type, - .register_value = IR::Value(&*get_inst), - .last_set_instruction = std::nullopt, - }; - } - return; - } - get_inst->ReplaceUsesWith(std::data(infos)[0].get().register_value); - }; - - const auto do_ext_set = [](ExtValueType type, std::initializer_list> infos, IR::Value value, Iterator set_inst) { - if (std::all_of(infos.begin(), infos.end(), [type](const auto& info) { return info.get().value_type == type; })) { - if (std::data(infos)[0].get().last_set_instruction) { - (*std::data(infos)[0].get().last_set_instruction)->Invalidate(); - } - } - for (auto& info : infos) { - info.get() = { - .value_type = type, - .register_value = value, - .last_set_instruction = set_inst, - }; - } - }; - - // Location and version don't matter here. - A32::IREmitter ir{block, A32::LocationDescriptor{block.Location()}, {}}; - - for (auto inst = block.begin(); inst != block.end(); ++inst) { - auto const opcode = inst->GetOpcode(); - switch (opcode) { - case IR::Opcode::A32GetRegister: { - const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); - ASSERT(reg != A32::Reg::PC); - const size_t reg_index = static_cast(reg); - do_get(reg_info[reg_index], inst); - break; - } - case IR::Opcode::A32SetRegister: { - const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); - if (reg == A32::Reg::PC) { - break; - } - const auto reg_index = static_cast(reg); - do_set(reg_info[reg_index], inst->GetArg(1), inst); - break; - } - case IR::Opcode::A32GetExtendedRegister32: { - const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - const size_t reg_index = A32::RegNumber(reg); - do_ext_get(ExtValueType::Single, {ext_reg_info[reg_index]}, inst); - break; - } - case IR::Opcode::A32SetExtendedRegister32: { - const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - const size_t reg_index = A32::RegNumber(reg); - do_ext_set(ExtValueType::Single, {ext_reg_info[reg_index]}, inst->GetArg(1), inst); - break; - } - case IR::Opcode::A32GetExtendedRegister64: { - const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - const size_t reg_index = A32::RegNumber(reg); - do_ext_get(ExtValueType::Double, - { - ext_reg_info[reg_index * 2 + 0], - ext_reg_info[reg_index * 2 + 1], - }, - inst); - break; - } - case IR::Opcode::A32SetExtendedRegister64: { - const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - const size_t reg_index = A32::RegNumber(reg); - do_ext_set(ExtValueType::Double, - { - ext_reg_info[reg_index * 2 + 0], - ext_reg_info[reg_index * 2 + 1], - }, - inst->GetArg(1), - inst); - break; - } - case IR::Opcode::A32GetVector: { - const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - const size_t reg_index = A32::RegNumber(reg); - if (A32::IsDoubleExtReg(reg)) { - do_ext_get(ExtValueType::VectorDouble, - { - ext_reg_info[reg_index * 2 + 0], - ext_reg_info[reg_index * 2 + 1], - }, - inst); - } else { - DEBUG_ASSERT(A32::IsQuadExtReg(reg)); - do_ext_get(ExtValueType::VectorQuad, - { - ext_reg_info[reg_index * 4 + 0], - ext_reg_info[reg_index * 4 + 1], - ext_reg_info[reg_index * 4 + 2], - ext_reg_info[reg_index * 4 + 3], - }, - inst); - } - break; - } - case IR::Opcode::A32SetVector: { - const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); - const size_t reg_index = A32::RegNumber(reg); - if (A32::IsDoubleExtReg(reg)) { - ir.SetInsertionPointAfter(inst); - const IR::U128 stored_value = ir.VectorZeroUpper(IR::U128{inst->GetArg(1)}); - do_ext_set(ExtValueType::VectorDouble, - { - ext_reg_info[reg_index * 2 + 0], - ext_reg_info[reg_index * 2 + 1], - }, - stored_value, - inst); - } else { - DEBUG_ASSERT(A32::IsQuadExtReg(reg)); - do_ext_set(ExtValueType::VectorQuad, - { - ext_reg_info[reg_index * 4 + 0], - ext_reg_info[reg_index * 4 + 1], - ext_reg_info[reg_index * 4 + 2], - ext_reg_info[reg_index * 4 + 3], - }, - inst->GetArg(1), - inst); - } - break; - } - default: { - if (ReadsFromCoreRegister(opcode) || WritesToCoreRegister(opcode)) { - reg_info = {}; - ext_reg_info = {}; - } - break; - } - } - } -} - -} // namespace - -void A32GetSetElimination(IR::Block& block, A32GetSetEliminationOptions) { - FlagsPass(block); - RegisterPass(block); -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/a64_callback_config_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/a64_callback_config_pass.cpp deleted file mode 100644 index 79d9769520..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/a64_callback_config_pass.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2018 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include "dynarmic/frontend/A64/a64_ir_emitter.h" -#include "dynarmic/interface/A64/config.h" -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/microinstruction.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -void A64CallbackConfigPass(IR::Block& block, const A64::UserConfig& conf) { - if (conf.hook_data_cache_operations) { - return; - } - - for (auto& inst : block) { - if (inst.GetOpcode() != IR::Opcode::A64DataCacheOperationRaised) { - continue; - } - - const auto op = static_cast(inst.GetArg(1).GetU64()); - if (op == A64::DataCacheOperation::ZeroByVA) { - A64::IREmitter ir{block}; - ir.current_location = A64::LocationDescriptor{IR::LocationDescriptor{inst.GetArg(0).GetU64()}}; - ir.SetInsertionPointBefore(&inst); - - size_t bytes = 4 << static_cast(conf.dczid_el0 & 0b1111); - IR::U64 addr{inst.GetArg(2)}; - - const IR::U128 zero_u128 = ir.ZeroExtendToQuad(ir.Imm64(0)); - while (bytes >= 16) { - ir.WriteMemory128(addr, zero_u128, IR::AccType::DCZVA); - addr = ir.Add(addr, ir.Imm64(16)); - bytes -= 16; - } - - while (bytes >= 8) { - ir.WriteMemory64(addr, ir.Imm64(0), IR::AccType::DCZVA); - addr = ir.Add(addr, ir.Imm64(8)); - bytes -= 8; - } - - while (bytes >= 4) { - ir.WriteMemory32(addr, ir.Imm32(0), IR::AccType::DCZVA); - addr = ir.Add(addr, ir.Imm64(4)); - bytes -= 4; - } - } - inst.Invalidate(); - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/a64_get_set_elimination_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/a64_get_set_elimination_pass.cpp deleted file mode 100644 index 53e3b27176..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/a64_get_set_elimination_pass.cpp +++ /dev/null @@ -1,165 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include - -#include "dynarmic/common/common_types.h" - -#include "dynarmic/frontend/A64/a64_types.h" -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" -#include "dynarmic/ir/value.h" - -namespace Dynarmic::Optimization { - -void A64GetSetElimination(IR::Block& block) { - using Iterator = IR::Block::iterator; - - enum class TrackingType { - W, - X, - S, - D, - Q, - SP, - NZCV, - NZCVRaw, - }; - struct RegisterInfo { - IR::Value register_value; - TrackingType tracking_type; - bool set_instruction_present = false; - Iterator last_set_instruction; - }; - std::array reg_info; - std::array vec_info; - RegisterInfo sp_info; - RegisterInfo nzcv_info; - - const auto do_set = [&block](RegisterInfo& info, IR::Value value, Iterator set_inst, TrackingType tracking_type) { - if (info.set_instruction_present) { - info.last_set_instruction->Invalidate(); - block.Instructions().erase(info.last_set_instruction); - } - - info.register_value = value; - info.tracking_type = tracking_type; - info.set_instruction_present = true; - info.last_set_instruction = set_inst; - }; - - const auto do_get = [](RegisterInfo& info, Iterator get_inst, TrackingType tracking_type) { - const auto do_nothing = [&] { - info = {}; - info.register_value = IR::Value(&*get_inst); - info.tracking_type = tracking_type; - }; - - if (info.register_value.IsEmpty()) { - do_nothing(); - return; - } - - if (info.tracking_type == tracking_type) { - get_inst->ReplaceUsesWith(info.register_value); - return; - } - - do_nothing(); - }; - - for (auto inst = block.begin(); inst != block.end(); ++inst) { - auto const opcode = inst->GetOpcode(); - switch (opcode) { - case IR::Opcode::A64GetW: { - const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); - do_get(reg_info.at(index), inst, TrackingType::W); - break; - } - case IR::Opcode::A64GetX: { - const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); - do_get(reg_info.at(index), inst, TrackingType::X); - break; - } - case IR::Opcode::A64GetS: { - const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); - do_get(vec_info.at(index), inst, TrackingType::S); - break; - } - case IR::Opcode::A64GetD: { - const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); - do_get(vec_info.at(index), inst, TrackingType::D); - break; - } - case IR::Opcode::A64GetQ: { - const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); - do_get(vec_info.at(index), inst, TrackingType::Q); - break; - } - case IR::Opcode::A64GetSP: { - do_get(sp_info, inst, TrackingType::SP); - break; - } - case IR::Opcode::A64GetNZCVRaw: { - do_get(nzcv_info, inst, TrackingType::NZCVRaw); - break; - } - case IR::Opcode::A64SetW: { - const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); - do_set(reg_info.at(index), inst->GetArg(1), inst, TrackingType::W); - break; - } - case IR::Opcode::A64SetX: { - const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); - do_set(reg_info.at(index), inst->GetArg(1), inst, TrackingType::X); - break; - } - case IR::Opcode::A64SetS: { - const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); - do_set(vec_info.at(index), inst->GetArg(1), inst, TrackingType::S); - break; - } - case IR::Opcode::A64SetD: { - const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); - do_set(vec_info.at(index), inst->GetArg(1), inst, TrackingType::D); - break; - } - case IR::Opcode::A64SetQ: { - const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); - do_set(vec_info.at(index), inst->GetArg(1), inst, TrackingType::Q); - break; - } - case IR::Opcode::A64SetSP: { - do_set(sp_info, inst->GetArg(0), inst, TrackingType::SP); - break; - } - case IR::Opcode::A64SetNZCV: { - do_set(nzcv_info, inst->GetArg(0), inst, TrackingType::NZCV); - break; - } - case IR::Opcode::A64SetNZCVRaw: { - do_set(nzcv_info, inst->GetArg(0), inst, TrackingType::NZCVRaw); - break; - } - default: { - if (ReadsFromCPSR(opcode) || WritesToCPSR(opcode)) { - nzcv_info = {}; - } - if (ReadsFromCoreRegister(opcode) || WritesToCoreRegister(opcode)) { - reg_info = {}; - vec_info = {}; - sp_info = {}; - } - break; - } - } - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/a64_merge_interpret_blocks.cpp b/src/dynarmic/src/dynarmic/ir/opt/a64_merge_interpret_blocks.cpp deleted file mode 100644 index 25b7ef0ff1..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/a64_merge_interpret_blocks.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2018 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include -#include "dynarmic/common/common_types.h" - -#include "dynarmic/frontend/A64/a64_location_descriptor.h" -#include "dynarmic/frontend/A64/translate/a64_translate.h" -#include "dynarmic/interface/A64/config.h" -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -void A64MergeInterpretBlocksPass(IR::Block& block, A64::UserCallbacks* cb) { - const auto is_interpret_instruction = [cb](A64::LocationDescriptor location) { - const auto instruction = cb->MemoryReadCode(location.PC()); - if (!instruction) - return false; - - IR::Block new_block{location}; - A64::TranslateSingleInstruction(new_block, location, *instruction); - - if (!new_block.Instructions().empty()) - return false; - - const IR::Terminal terminal = new_block.GetTerminal(); - if (auto term = boost::get(&terminal)) { - return term->next == location; - } - - return false; - }; - - IR::Terminal terminal = block.GetTerminal(); - auto term = boost::get(&terminal); - if (!term) - return; - - A64::LocationDescriptor location{term->next}; - size_t num_instructions = 1; - - while (is_interpret_instruction(location.AdvancePC(static_cast(num_instructions * 4)))) { - num_instructions++; - } - - term->num_instructions = num_instructions; - block.ReplaceTerminal(terminal); - block.CycleCount() += num_instructions - 1; -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/constant_propagation_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/constant_propagation_pass.cpp deleted file mode 100644 index 86ebca87d2..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/constant_propagation_pass.cpp +++ /dev/null @@ -1,559 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include - -#include "dynarmic/common/assert.h" -#include -#include -#include "dynarmic/common/common_types.h" - -#include "dynarmic/common/safe_ops.h" -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/ir_emitter.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -using Op = Dynarmic::IR::Opcode; - -namespace { - -// Tiny helper to avoid the need to store based off the opcode -// bit size all over the place within folding functions. -void ReplaceUsesWith(IR::Inst& inst, bool is_32_bit, u64 value) { - if (is_32_bit) { - inst.ReplaceUsesWith(IR::Value{static_cast(value)}); - } else { - inst.ReplaceUsesWith(IR::Value{value}); - } -} - -IR::Value Value(bool is_32_bit, u64 value) { - return is_32_bit ? IR::Value{static_cast(value)} : IR::Value{value}; -} - -template -bool FoldCommutative(IR::Inst& inst, bool is_32_bit, ImmFn imm_fn) { - const auto lhs = inst.GetArg(0); - const auto rhs = inst.GetArg(1); - - const bool is_lhs_immediate = lhs.IsImmediate(); - const bool is_rhs_immediate = rhs.IsImmediate(); - - if (is_lhs_immediate && is_rhs_immediate) { - const u64 result = imm_fn(lhs.GetImmediateAsU64(), rhs.GetImmediateAsU64()); - ReplaceUsesWith(inst, is_32_bit, result); - return false; - } - - if (is_lhs_immediate && !is_rhs_immediate) { - const IR::Inst* rhs_inst = rhs.GetInstRecursive(); - if (rhs_inst->GetOpcode() == inst.GetOpcode() && rhs_inst->GetArg(1).IsImmediate()) { - const u64 combined = imm_fn(lhs.GetImmediateAsU64(), rhs_inst->GetArg(1).GetImmediateAsU64()); - inst.SetArg(0, rhs_inst->GetArg(0)); - inst.SetArg(1, Value(is_32_bit, combined)); - } else { - // Normalize - inst.SetArg(0, rhs); - inst.SetArg(1, lhs); - } - } - - if (!is_lhs_immediate && is_rhs_immediate) { - const IR::Inst* lhs_inst = lhs.GetInstRecursive(); - if (lhs_inst->GetOpcode() == inst.GetOpcode() && lhs_inst->GetArg(1).IsImmediate()) { - const u64 combined = imm_fn(rhs.GetImmediateAsU64(), lhs_inst->GetArg(1).GetImmediateAsU64()); - inst.SetArg(0, lhs_inst->GetArg(0)); - inst.SetArg(1, Value(is_32_bit, combined)); - } - } - - return true; -} - -void FoldAdd(IR::Inst& inst, bool is_32_bit) { - const auto lhs = inst.GetArg(0); - const auto rhs = inst.GetArg(1); - const auto carry = inst.GetArg(2); - - if (lhs.IsImmediate() && !rhs.IsImmediate()) { - // Normalize - inst.SetArg(0, rhs); - inst.SetArg(1, lhs); - FoldAdd(inst, is_32_bit); - return; - } - - if (inst.HasAssociatedPseudoOperation()) { - return; - } - - if (!lhs.IsImmediate() && rhs.IsImmediate()) { - const IR::Inst* lhs_inst = lhs.GetInstRecursive(); - if (lhs_inst->GetOpcode() == inst.GetOpcode() && lhs_inst->GetArg(1).IsImmediate() && lhs_inst->GetArg(2).IsImmediate()) { - const u64 combined = rhs.GetImmediateAsU64() + lhs_inst->GetArg(1).GetImmediateAsU64() + lhs_inst->GetArg(2).GetU1(); - if (combined == 0) { - inst.ReplaceUsesWith(lhs_inst->GetArg(0)); - return; - } - inst.SetArg(0, lhs_inst->GetArg(0)); - inst.SetArg(1, Value(is_32_bit, combined)); - return; - } - if (rhs.IsZero() && carry.IsZero()) { - inst.ReplaceUsesWith(lhs); - return; - } - } - - if (inst.AreAllArgsImmediates()) { - const u64 result = lhs.GetImmediateAsU64() + rhs.GetImmediateAsU64() + carry.GetU1(); - ReplaceUsesWith(inst, is_32_bit, result); - return; - } -} - -/// Folds AND operations based on the following: -/// -/// 1. imm_x & imm_y -> result -/// 2. x & 0 -> 0 -/// 3. 0 & y -> 0 -/// 4. x & y -> y (where x has all bits set to 1) -/// 5. x & y -> x (where y has all bits set to 1) -/// -void FoldAND(IR::Inst& inst, bool is_32_bit) { - if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a & b; })) { - const auto rhs = inst.GetArg(1); - if (rhs.IsZero()) { - ReplaceUsesWith(inst, is_32_bit, 0); - } else if (rhs.HasAllBitsSet()) { - inst.ReplaceUsesWith(inst.GetArg(0)); - } - } -} - -/// Folds byte reversal opcodes based on the following: -/// -/// 1. imm -> swap(imm) -/// -void FoldByteReverse(IR::Inst& inst, Op op) { - const auto operand = inst.GetArg(0); - - if (!operand.IsImmediate()) { - return; - } - - if (op == Op::ByteReverseWord) { - const u32 result = mcl::bit::swap_bytes_32(static_cast(operand.GetImmediateAsU64())); - inst.ReplaceUsesWith(IR::Value{result}); - } else if (op == Op::ByteReverseHalf) { - const u16 result = mcl::bit::swap_bytes_16(static_cast(operand.GetImmediateAsU64())); - inst.ReplaceUsesWith(IR::Value{result}); - } else { - const u64 result = mcl::bit::swap_bytes_64(operand.GetImmediateAsU64()); - inst.ReplaceUsesWith(IR::Value{result}); - } -} - -/// Folds division operations based on the following: -/// -/// 1. x / 0 -> 0 (NOTE: This is an ARM-specific behavior defined in the architecture reference manual) -/// 2. imm_x / imm_y -> result -/// 3. x / 1 -> x -/// -void FoldDivide(IR::Inst& inst, bool is_32_bit, bool is_signed) { - const auto rhs = inst.GetArg(1); - - if (rhs.IsZero()) { - ReplaceUsesWith(inst, is_32_bit, 0); - return; - } - - const auto lhs = inst.GetArg(0); - if (lhs.IsImmediate() && rhs.IsImmediate()) { - if (is_signed) { - const s64 result = lhs.GetImmediateAsS64() / rhs.GetImmediateAsS64(); - ReplaceUsesWith(inst, is_32_bit, static_cast(result)); - } else { - const u64 result = lhs.GetImmediateAsU64() / rhs.GetImmediateAsU64(); - ReplaceUsesWith(inst, is_32_bit, result); - } - } else if (rhs.IsUnsignedImmediate(1)) { - inst.ReplaceUsesWith(IR::Value{lhs}); - } -} - -// Folds EOR operations based on the following: -// -// 1. imm_x ^ imm_y -> result -// 2. x ^ 0 -> x -// 3. 0 ^ y -> y -// -void FoldEOR(IR::Inst& inst, bool is_32_bit) { - if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a ^ b; })) { - const auto rhs = inst.GetArg(1); - if (rhs.IsZero()) { - inst.ReplaceUsesWith(inst.GetArg(0)); - } - } -} - -void FoldLeastSignificantByte(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const auto operand = inst.GetArg(0); - inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64())}); -} - -void FoldLeastSignificantHalf(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const auto operand = inst.GetArg(0); - inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64())}); -} - -void FoldLeastSignificantWord(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const auto operand = inst.GetArg(0); - inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64())}); -} - -void FoldMostSignificantBit(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const auto operand = inst.GetArg(0); - inst.ReplaceUsesWith(IR::Value{(operand.GetImmediateAsU64() >> 31) != 0}); -} - -void FoldMostSignificantWord(IR::Inst& inst) { - IR::Inst* carry_inst = inst.GetAssociatedPseudoOperation(Op::GetCarryFromOp); - - if (!inst.AreAllArgsImmediates()) { - return; - } - - const auto operand = inst.GetArg(0); - if (carry_inst) { - carry_inst->ReplaceUsesWith(IR::Value{mcl::bit::get_bit<31>(operand.GetImmediateAsU64())}); - } - inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64() >> 32)}); -} - -// Folds multiplication operations based on the following: -// -// 1. imm_x * imm_y -> result -// 2. x * 0 -> 0 -// 3. 0 * y -> 0 -// 4. x * 1 -> x -// 5. 1 * y -> y -// -void FoldMultiply(IR::Inst& inst, bool is_32_bit) { - if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a * b; })) { - const auto rhs = inst.GetArg(1); - if (rhs.IsZero()) { - ReplaceUsesWith(inst, is_32_bit, 0); - } else if (rhs.IsUnsignedImmediate(1)) { - inst.ReplaceUsesWith(inst.GetArg(0)); - } - } -} - -// Folds NOT operations if the contained value is an immediate. -void FoldNOT(IR::Inst& inst, bool is_32_bit) { - const auto operand = inst.GetArg(0); - - if (!operand.IsImmediate()) { - return; - } - - const u64 result = ~operand.GetImmediateAsU64(); - ReplaceUsesWith(inst, is_32_bit, result); -} - -// Folds OR operations based on the following: -// -// 1. imm_x | imm_y -> result -// 2. x | 0 -> x -// 3. 0 | y -> y -// -void FoldOR(IR::Inst& inst, bool is_32_bit) { - if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a | b; })) { - const auto rhs = inst.GetArg(1); - if (rhs.IsZero()) { - inst.ReplaceUsesWith(inst.GetArg(0)); - } - } -} - -bool FoldShifts(IR::Inst& inst) { - IR::Inst* carry_inst = inst.GetAssociatedPseudoOperation(Op::GetCarryFromOp); - - // The 32-bit variants can contain 3 arguments, while the - // 64-bit variants only contain 2. - if (inst.NumArgs() == 3 && !carry_inst) { - inst.SetArg(2, IR::Value(false)); - } - - const auto shift_amount = inst.GetArg(1); - - if (shift_amount.IsZero()) { - if (carry_inst) { - carry_inst->ReplaceUsesWith(inst.GetArg(2)); - } - inst.ReplaceUsesWith(inst.GetArg(0)); - return false; - } - - if (inst.NumArgs() == 3 && shift_amount.IsImmediate() && !shift_amount.IsZero()) { - inst.SetArg(2, IR::Value(false)); - } - - if (!inst.AreAllArgsImmediates() || carry_inst) { - return false; - } - - return true; -} - -void FoldSignExtendXToWord(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const s64 value = inst.GetArg(0).GetImmediateAsS64(); - inst.ReplaceUsesWith(IR::Value{static_cast(value)}); -} - -void FoldSignExtendXToLong(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const s64 value = inst.GetArg(0).GetImmediateAsS64(); - inst.ReplaceUsesWith(IR::Value{static_cast(value)}); -} - -void FoldSub(IR::Inst& inst, bool is_32_bit) { - if (!inst.AreAllArgsImmediates() || inst.HasAssociatedPseudoOperation()) { - return; - } - - const auto lhs = inst.GetArg(0); - const auto rhs = inst.GetArg(1); - const auto carry = inst.GetArg(2); - - const u64 result = lhs.GetImmediateAsU64() + (~rhs.GetImmediateAsU64()) + carry.GetU1(); - ReplaceUsesWith(inst, is_32_bit, result); -} - -void FoldZeroExtendXToWord(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const u64 value = inst.GetArg(0).GetImmediateAsU64(); - inst.ReplaceUsesWith(IR::Value{static_cast(value)}); -} - -void FoldZeroExtendXToLong(IR::Inst& inst) { - if (!inst.AreAllArgsImmediates()) { - return; - } - - const u64 value = inst.GetArg(0).GetImmediateAsU64(); - inst.ReplaceUsesWith(IR::Value{value}); -} -} // Anonymous namespace - -void ConstantPropagation(IR::Block& block) { - for (auto& inst : block) { - const auto opcode = inst.GetOpcode(); - - switch (opcode) { - case Op::LeastSignificantWord: - FoldLeastSignificantWord(inst); - break; - case Op::MostSignificantWord: - FoldMostSignificantWord(inst); - break; - case Op::LeastSignificantHalf: - FoldLeastSignificantHalf(inst); - break; - case Op::LeastSignificantByte: - FoldLeastSignificantByte(inst); - break; - case Op::MostSignificantBit: - FoldMostSignificantBit(inst); - break; - case Op::IsZero32: - if (inst.AreAllArgsImmediates()) { - inst.ReplaceUsesWith(IR::Value{inst.GetArg(0).GetU32() == 0}); - } - break; - case Op::IsZero64: - if (inst.AreAllArgsImmediates()) { - inst.ReplaceUsesWith(IR::Value{inst.GetArg(0).GetU64() == 0}); - } - break; - case Op::LogicalShiftLeft32: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, true, Safe::LogicalShiftLeft(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); - } - break; - case Op::LogicalShiftLeft64: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, false, Safe::LogicalShiftLeft(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); - } - break; - case Op::LogicalShiftRight32: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, true, Safe::LogicalShiftRight(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); - } - break; - case Op::LogicalShiftRight64: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, false, Safe::LogicalShiftRight(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); - } - break; - case Op::ArithmeticShiftRight32: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, true, Safe::ArithmeticShiftRight(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); - } - break; - case Op::ArithmeticShiftRight64: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, false, Safe::ArithmeticShiftRight(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); - } - break; - case Op::RotateRight32: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, true, mcl::bit::rotate_right(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); - } - break; - case Op::RotateRight64: - if (FoldShifts(inst)) { - ReplaceUsesWith(inst, false, mcl::bit::rotate_right(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); - } - break; - case Op::LogicalShiftLeftMasked32: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, true, inst.GetArg(0).GetU32() << (inst.GetArg(1).GetU32() & 0x1f)); - } - break; - case Op::LogicalShiftLeftMasked64: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, false, inst.GetArg(0).GetU64() << (inst.GetArg(1).GetU64() & 0x3f)); - } - break; - case Op::LogicalShiftRightMasked32: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, true, inst.GetArg(0).GetU32() >> (inst.GetArg(1).GetU32() & 0x1f)); - } - break; - case Op::LogicalShiftRightMasked64: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, false, inst.GetArg(0).GetU64() >> (inst.GetArg(1).GetU64() & 0x3f)); - } - break; - case Op::ArithmeticShiftRightMasked32: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, true, static_cast(inst.GetArg(0).GetU32()) >> (inst.GetArg(1).GetU32() & 0x1f)); - } - break; - case Op::ArithmeticShiftRightMasked64: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, false, static_cast(inst.GetArg(0).GetU64()) >> (inst.GetArg(1).GetU64() & 0x3f)); - } - break; - case Op::RotateRightMasked32: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, true, mcl::bit::rotate_right(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU32())); - } - break; - case Op::RotateRightMasked64: - if (inst.AreAllArgsImmediates()) { - ReplaceUsesWith(inst, false, mcl::bit::rotate_right(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU64())); - } - break; - case Op::Add32: - case Op::Add64: - FoldAdd(inst, opcode == Op::Add32); - break; - case Op::Sub32: - case Op::Sub64: - FoldSub(inst, opcode == Op::Sub32); - break; - case Op::Mul32: - case Op::Mul64: - FoldMultiply(inst, opcode == Op::Mul32); - break; - case Op::SignedDiv32: - case Op::SignedDiv64: - FoldDivide(inst, opcode == Op::SignedDiv32, true); - break; - case Op::UnsignedDiv32: - case Op::UnsignedDiv64: - FoldDivide(inst, opcode == Op::UnsignedDiv32, false); - break; - case Op::And32: - case Op::And64: - FoldAND(inst, opcode == Op::And32); - break; - case Op::Eor32: - case Op::Eor64: - FoldEOR(inst, opcode == Op::Eor32); - break; - case Op::Or32: - case Op::Or64: - FoldOR(inst, opcode == Op::Or32); - break; - case Op::Not32: - case Op::Not64: - FoldNOT(inst, opcode == Op::Not32); - break; - case Op::SignExtendByteToWord: - case Op::SignExtendHalfToWord: - FoldSignExtendXToWord(inst); - break; - case Op::SignExtendByteToLong: - case Op::SignExtendHalfToLong: - case Op::SignExtendWordToLong: - FoldSignExtendXToLong(inst); - break; - case Op::ZeroExtendByteToWord: - case Op::ZeroExtendHalfToWord: - FoldZeroExtendXToWord(inst); - break; - case Op::ZeroExtendByteToLong: - case Op::ZeroExtendHalfToLong: - case Op::ZeroExtendWordToLong: - FoldZeroExtendXToLong(inst); - break; - case Op::ByteReverseWord: - case Op::ByteReverseHalf: - case Op::ByteReverseDual: - FoldByteReverse(inst, opcode); - break; - default: - break; - } - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/dead_code_elimination_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/dead_code_elimination_pass.cpp deleted file mode 100644 index bda9f6efd1..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/dead_code_elimination_pass.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include - -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -void DeadCodeElimination(IR::Block& block) { - // We iterate over the instructions in reverse order. - // This is because removing an instruction reduces the number of uses for earlier instructions. - for (auto& inst : mcl::iterator::reverse(block)) { - if (!inst.HasUses() && !MayHaveSideEffects(inst.GetOpcode())) { - inst.Invalidate(); - } - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/identity_removal_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/identity_removal_pass.cpp deleted file mode 100644 index e87fcc335b..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/identity_removal_pass.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2020 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include - -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -void IdentityRemovalPass(IR::Block& block) { - std::vector to_invalidate; - - auto iter = block.begin(); - while (iter != block.end()) { - IR::Inst& inst = *iter; - - const size_t num_args = inst.NumArgs(); - for (size_t i = 0; i < num_args; i++) { - while (true) { - IR::Value arg = inst.GetArg(i); - if (!arg.IsIdentity()) - break; - inst.SetArg(i, arg.GetInst()->GetArg(0)); - } - } - - if (inst.GetOpcode() == IR::Opcode::Identity || inst.GetOpcode() == IR::Opcode::Void) { - iter = block.Instructions().erase(inst); - to_invalidate.push_back(&inst); - } else { - ++iter; - } - } - - for (IR::Inst* inst : to_invalidate) { - inst->Invalidate(); - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/ir_matcher.h b/src/dynarmic/src/dynarmic/ir/opt/ir_matcher.h deleted file mode 100644 index 5eb1a55100..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/ir_matcher.h +++ /dev/null @@ -1,127 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2020 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#pragma once - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "dynarmic/ir/microinstruction.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/value.h" - -namespace Dynarmic::Optimization::IRMatcher { - -struct CaptureValue { - using ReturnType = std::tuple; - - static std::optional Match(IR::Value value) { - return std::tuple(value); - } -}; - -struct CaptureInst { - using ReturnType = std::tuple; - - static std::optional Match(IR::Value value) { - if (value.IsImmediate()) - return std::nullopt; - return std::tuple(value.GetInstRecursive()); - } -}; - -struct CaptureUImm { - using ReturnType = std::tuple; - - static std::optional Match(IR::Value value) { - return std::tuple(value.GetImmediateAsU64()); - } -}; - -struct CaptureSImm { - using ReturnType = std::tuple; - - static std::optional Match(IR::Value value) { - return std::tuple(value.GetImmediateAsS64()); - } -}; - -template -struct UImm { - using ReturnType = std::tuple<>; - - static std::optional> Match(IR::Value value) { - if (value.GetImmediateAsU64() == Value) - return std::tuple(); - return std::nullopt; - } -}; - -template -struct SImm { - using ReturnType = std::tuple<>; - - static std::optional> Match(IR::Value value) { - if (value.GetImmediateAsS64() == Value) - return std::tuple(); - return std::nullopt; - } -}; - -template -struct Inst { -public: - using ReturnType = mp::concat, typename Args::ReturnType...>; - - static std::optional Match(const IR::Inst& inst) { - if (inst.GetOpcode() != Opcode) - return std::nullopt; - if (inst.HasAssociatedPseudoOperation()) - return std::nullopt; - return MatchArgs<0>(inst); - } - - static std::optional Match(IR::Value value) { - if (value.IsImmediate()) - return std::nullopt; - return Match(*value.GetInstRecursive()); - } - -private: - template - static auto MatchArgs(const IR::Inst& inst) -> std::optional>, std::tuple<>>>> { - if constexpr (I >= sizeof...(Args)) { - return std::tuple(); - } else { - using Arg = mp::get>; - - if (const auto arg = Arg::Match(inst.GetArg(I))) { - if (const auto rest = MatchArgs(inst)) { - return std::tuple_cat(*arg, *rest); - } - } - - return std::nullopt; - } - } -}; - -inline bool IsSameInst(std::tuple t) { - return std::get<0>(t) == std::get<1>(t); -} - -inline bool IsSameInst(std::tuple t) { - return std::get<0>(t) == std::get<1>(t) && std::get<0>(t) == std::get<2>(t); -} - -} // namespace Dynarmic::Optimization::IRMatcher diff --git a/src/dynarmic/src/dynarmic/ir/opt/naming_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/naming_pass.cpp deleted file mode 100644 index a766bdc83f..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/naming_pass.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2023 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/microinstruction.h" - -namespace Dynarmic::Optimization { - -void NamingPass(IR::Block& block) { - unsigned name = 1; - for (auto& inst : block) { - inst.SetName(name++); - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/passes.h b/src/dynarmic/src/dynarmic/ir/opt/passes.h deleted file mode 100644 index 703145b556..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/passes.h +++ /dev/null @@ -1,47 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#pragma once - -namespace Dynarmic::A32 { -struct UserCallbacks; -} - -namespace Dynarmic::A64 { -struct UserCallbacks; -struct UserConfig; -} // namespace Dynarmic::A64 - -namespace Dynarmic::IR { -class Block; -} - -namespace Dynarmic::Optimization { - -struct PolyfillOptions { - bool sha256 = false; - bool vector_multiply_widen = false; - - bool operator==(const PolyfillOptions&) const = default; -}; - -struct A32GetSetEliminationOptions { - bool convert_nzc_to_nz = false; - bool convert_nz_to_nzc = false; -}; - -void PolyfillPass(IR::Block& block, const PolyfillOptions& opt); -void A32ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb); -void A32GetSetElimination(IR::Block& block, A32GetSetEliminationOptions opt); -void A64CallbackConfigPass(IR::Block& block, const A64::UserConfig& conf); -void A64GetSetElimination(IR::Block& block); -void A64MergeInterpretBlocksPass(IR::Block& block, A64::UserCallbacks* cb); -void ConstantPropagation(IR::Block& block); -void DeadCodeElimination(IR::Block& block); -void IdentityRemovalPass(IR::Block& block); -void VerificationPass(const IR::Block& block); -void NamingPass(IR::Block& block); - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/polyfill_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/polyfill_pass.cpp deleted file mode 100644 index 1aa3aea91e..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/polyfill_pass.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2022 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/ir_emitter.h" -#include "dynarmic/ir/microinstruction.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" - -namespace Dynarmic::Optimization { - -namespace { - -void PolyfillSHA256MessageSchedule0(IR::IREmitter& ir, IR::Inst& inst) { - const IR::U128 x = (IR::U128)inst.GetArg(0); - const IR::U128 y = (IR::U128)inst.GetArg(1); - - const IR::U128 t = ir.VectorExtract(x, y, 32); - - IR::U128 result = ir.ZeroVector(); - for (size_t i = 0; i < 4; i++) { - const IR::U32 modified_element = [&] { - const IR::U32 element = ir.VectorGetElement(32, t, i); - const IR::U32 tmp1 = ir.RotateRight(element, ir.Imm8(7)); - const IR::U32 tmp2 = ir.RotateRight(element, ir.Imm8(18)); - const IR::U32 tmp3 = ir.LogicalShiftRight(element, ir.Imm8(3)); - - return ir.Eor(tmp1, ir.Eor(tmp2, tmp3)); - }(); - - result = ir.VectorSetElement(32, result, i, modified_element); - } - result = ir.VectorAdd(32, result, x); - - inst.ReplaceUsesWith(result); -} - -void PolyfillSHA256MessageSchedule1(IR::IREmitter& ir, IR::Inst& inst) { - const IR::U128 x = (IR::U128)inst.GetArg(0); - const IR::U128 y = (IR::U128)inst.GetArg(1); - const IR::U128 z = (IR::U128)inst.GetArg(2); - - const IR::U128 T0 = ir.VectorExtract(y, z, 32); - - const IR::U128 lower_half = [&] { - const IR::U128 T = ir.VectorRotateWholeVectorRight(z, 64); - const IR::U128 tmp1 = ir.VectorRotateRight(32, T, 17); - const IR::U128 tmp2 = ir.VectorRotateRight(32, T, 19); - const IR::U128 tmp3 = ir.VectorLogicalShiftRight(32, T, 10); - const IR::U128 tmp4 = ir.VectorEor(tmp1, ir.VectorEor(tmp2, tmp3)); - const IR::U128 tmp5 = ir.VectorAdd(32, tmp4, ir.VectorAdd(32, x, T0)); - return ir.VectorZeroUpper(tmp5); - }(); - - const IR::U64 upper_half = [&] { - const IR::U128 tmp1 = ir.VectorRotateRight(32, lower_half, 17); - const IR::U128 tmp2 = ir.VectorRotateRight(32, lower_half, 19); - const IR::U128 tmp3 = ir.VectorLogicalShiftRight(32, lower_half, 10); - const IR::U128 tmp4 = ir.VectorEor(tmp1, ir.VectorEor(tmp2, tmp3)); - - // Shuffle the top two 32-bit elements downwards [3, 2, 1, 0] -> [1, 0, 3, 2] - const IR::U128 shuffled_d = ir.VectorRotateWholeVectorRight(x, 64); - const IR::U128 shuffled_T0 = ir.VectorRotateWholeVectorRight(T0, 64); - - const IR::U128 tmp5 = ir.VectorAdd(32, tmp4, ir.VectorAdd(32, shuffled_d, shuffled_T0)); - return ir.VectorGetElement(64, tmp5, 0); - }(); - - const IR::U128 result = ir.VectorSetElement(64, lower_half, 1, upper_half); - - inst.ReplaceUsesWith(result); -} - -IR::U32 SHAchoose(IR::IREmitter& ir, IR::U32 x, IR::U32 y, IR::U32 z) { - return ir.Eor(ir.And(ir.Eor(y, z), x), z); -} - -IR::U32 SHAmajority(IR::IREmitter& ir, IR::U32 x, IR::U32 y, IR::U32 z) { - return ir.Or(ir.And(x, y), ir.And(ir.Or(x, y), z)); -} - -IR::U32 SHAhashSIGMA0(IR::IREmitter& ir, IR::U32 x) { - const IR::U32 tmp1 = ir.RotateRight(x, ir.Imm8(2)); - const IR::U32 tmp2 = ir.RotateRight(x, ir.Imm8(13)); - const IR::U32 tmp3 = ir.RotateRight(x, ir.Imm8(22)); - - return ir.Eor(tmp1, ir.Eor(tmp2, tmp3)); -} - -IR::U32 SHAhashSIGMA1(IR::IREmitter& ir, IR::U32 x) { - const IR::U32 tmp1 = ir.RotateRight(x, ir.Imm8(6)); - const IR::U32 tmp2 = ir.RotateRight(x, ir.Imm8(11)); - const IR::U32 tmp3 = ir.RotateRight(x, ir.Imm8(25)); - - return ir.Eor(tmp1, ir.Eor(tmp2, tmp3)); -} - -void PolyfillSHA256Hash(IR::IREmitter& ir, IR::Inst& inst) { - IR::U128 x = (IR::U128)inst.GetArg(0); - IR::U128 y = (IR::U128)inst.GetArg(1); - const IR::U128 w = (IR::U128)inst.GetArg(2); - const bool part1 = inst.GetArg(3).GetU1(); - - for (size_t i = 0; i < 4; i++) { - const IR::U32 low_x = ir.VectorGetElement(32, x, 0); - const IR::U32 after_low_x = ir.VectorGetElement(32, x, 1); - const IR::U32 before_high_x = ir.VectorGetElement(32, x, 2); - const IR::U32 high_x = ir.VectorGetElement(32, x, 3); - - const IR::U32 low_y = ir.VectorGetElement(32, y, 0); - const IR::U32 after_low_y = ir.VectorGetElement(32, y, 1); - const IR::U32 before_high_y = ir.VectorGetElement(32, y, 2); - const IR::U32 high_y = ir.VectorGetElement(32, y, 3); - - const IR::U32 choice = SHAchoose(ir, low_y, after_low_y, before_high_y); - const IR::U32 majority = SHAmajority(ir, low_x, after_low_x, before_high_x); - - const IR::U32 t = [&] { - const IR::U32 w_element = ir.VectorGetElement(32, w, i); - const IR::U32 sig = SHAhashSIGMA1(ir, low_y); - - return ir.Add(high_y, ir.Add(sig, ir.Add(choice, w_element))); - }(); - - const IR::U32 new_low_x = ir.Add(t, ir.Add(SHAhashSIGMA0(ir, low_x), majority)); - const IR::U32 new_low_y = ir.Add(t, high_x); - - // Shuffle all words left by 1 element: [3, 2, 1, 0] -> [2, 1, 0, 3] - const IR::U128 shuffled_x = ir.VectorRotateWholeVectorRight(x, 96); - const IR::U128 shuffled_y = ir.VectorRotateWholeVectorRight(y, 96); - - x = ir.VectorSetElement(32, shuffled_x, 0, new_low_x); - y = ir.VectorSetElement(32, shuffled_y, 0, new_low_y); - } - - inst.ReplaceUsesWith(part1 ? x : y); -} - -template -void PolyfillVectorMultiplyWiden(IR::IREmitter& ir, IR::Inst& inst) { - IR::U128 n = (IR::U128)inst.GetArg(0); - IR::U128 m = (IR::U128)inst.GetArg(1); - - const IR::U128 wide_n = is_signed ? ir.VectorSignExtend(esize, n) : ir.VectorZeroExtend(esize, n); - const IR::U128 wide_m = is_signed ? ir.VectorSignExtend(esize, m) : ir.VectorZeroExtend(esize, m); - - const IR::U128 result = ir.VectorMultiply(esize * 2, wide_n, wide_m); - - inst.ReplaceUsesWith(result); -} - -} // namespace - -void PolyfillPass(IR::Block& block, const PolyfillOptions& polyfill) { - if (polyfill == PolyfillOptions{}) { - return; - } - - IR::IREmitter ir{block}; - - for (auto& inst : block) { - ir.SetInsertionPointBefore(&inst); - - switch (inst.GetOpcode()) { - case IR::Opcode::SHA256MessageSchedule0: - if (polyfill.sha256) { - PolyfillSHA256MessageSchedule0(ir, inst); - } - break; - case IR::Opcode::SHA256MessageSchedule1: - if (polyfill.sha256) { - PolyfillSHA256MessageSchedule1(ir, inst); - } - break; - case IR::Opcode::SHA256Hash: - if (polyfill.sha256) { - PolyfillSHA256Hash(ir, inst); - } - break; - case IR::Opcode::VectorMultiplySignedWiden8: - if (polyfill.vector_multiply_widen) { - PolyfillVectorMultiplyWiden<8, true>(ir, inst); - } - break; - case IR::Opcode::VectorMultiplySignedWiden16: - if (polyfill.vector_multiply_widen) { - PolyfillVectorMultiplyWiden<16, true>(ir, inst); - } - break; - case IR::Opcode::VectorMultiplySignedWiden32: - if (polyfill.vector_multiply_widen) { - PolyfillVectorMultiplyWiden<32, true>(ir, inst); - } - break; - case IR::Opcode::VectorMultiplyUnsignedWiden8: - if (polyfill.vector_multiply_widen) { - PolyfillVectorMultiplyWiden<8, false>(ir, inst); - } - break; - case IR::Opcode::VectorMultiplyUnsignedWiden16: - if (polyfill.vector_multiply_widen) { - PolyfillVectorMultiplyWiden<16, false>(ir, inst); - } - break; - case IR::Opcode::VectorMultiplyUnsignedWiden32: - if (polyfill.vector_multiply_widen) { - PolyfillVectorMultiplyWiden<32, false>(ir, inst); - } - break; - default: - break; - } - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt/verification_pass.cpp b/src/dynarmic/src/dynarmic/ir/opt/verification_pass.cpp deleted file mode 100644 index c6c2cff231..0000000000 --- a/src/dynarmic/src/dynarmic/ir/opt/verification_pass.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -/* This file is part of the dynarmic project. - * Copyright (c) 2016 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#include -#include - -#include "dynarmic/common/assert.h" -#include "dynarmic/common/common_types.h" -#include - -#include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/microinstruction.h" -#include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" -#include "dynarmic/ir/type.h" - -namespace Dynarmic::Optimization { - -void VerificationPass(const IR::Block& block) { - for (const auto& inst : block) { - for (size_t i = 0; i < inst.NumArgs(); i++) { - const IR::Type t1 = inst.GetArg(i).GetType(); - const IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i); - if (!IR::AreTypesCompatible(t1, t2)) { - std::puts(IR::DumpBlock(block).c_str()); - ASSERT_FALSE("above block failed validation"); - } - } - } - - ankerl::unordered_dense::map actual_uses; - for (const auto& inst : block) { - for (size_t i = 0; i < inst.NumArgs(); i++) { - const auto arg = inst.GetArg(i); - if (!arg.IsImmediate()) { - actual_uses[arg.GetInst()]++; - } - } - } - - for (const auto& pair : actual_uses) { - ASSERT(pair.first->UseCount() == pair.second); - } -} - -} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp new file mode 100644 index 0000000000..25afde9b5d --- /dev/null +++ b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp @@ -0,0 +1,1520 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/* This file is part of the dynarmic project. + * Copyright (c) 2016 MerryMage + * SPDX-License-Identifier: 0BSD + */ + +#include +#include +#include + +#include +#include "boost/container/small_vector.hpp" +#include "dynarmic/frontend/A32/a32_ir_emitter.h" +#include "dynarmic/frontend/A32/a32_location_descriptor.h" +#include "dynarmic/frontend/A32/a32_types.h" +#include "dynarmic/frontend/A64/a64_ir_emitter.h" +#include "dynarmic/frontend/A64/a64_location_descriptor.h" +#include "dynarmic/frontend/A64/translate/a64_translate.h" +#include "dynarmic/interface/A32/config.h" +#include "dynarmic/interface/A64/config.h" +#include "dynarmic/interface/optimization_flags.h" +#include "dynarmic/common/safe_ops.h" +#include "dynarmic/ir/basic_block.h" +#include "dynarmic/ir/microinstruction.h" +#include "dynarmic/ir/opcodes.h" +#include "dynarmic/ir/opt_passes.h" +#include "dynarmic/ir/type.h" +#include "mcl/bit/swap.hpp" +#include "mcl/bit/rotate.hpp" + +namespace Dynarmic::Optimization { + +static void ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { + for (auto& inst : block) { + switch (inst.GetOpcode()) { + case IR::Opcode::A32ReadMemory8: + case IR::Opcode::A64ReadMemory8: { + if (inst.AreAllArgsImmediates()) { + const u32 vaddr = inst.GetArg(1).GetU32(); + if (cb->IsReadOnlyMemory(vaddr)) { + const u8 value_from_memory = cb->MemoryRead8(vaddr); + inst.ReplaceUsesWith(IR::Value{value_from_memory}); + } + } + break; + } + case IR::Opcode::A32ReadMemory16: + case IR::Opcode::A64ReadMemory16: { + if (inst.AreAllArgsImmediates()) { + const u32 vaddr = inst.GetArg(1).GetU32(); + if (cb->IsReadOnlyMemory(vaddr)) { + const u16 value_from_memory = cb->MemoryRead16(vaddr); + inst.ReplaceUsesWith(IR::Value{value_from_memory}); + } + } + break; + } + case IR::Opcode::A32ReadMemory32: + case IR::Opcode::A64ReadMemory32: { + if (inst.AreAllArgsImmediates()) { + const u32 vaddr = inst.GetArg(1).GetU32(); + if (cb->IsReadOnlyMemory(vaddr)) { + const u32 value_from_memory = cb->MemoryRead32(vaddr); + inst.ReplaceUsesWith(IR::Value{value_from_memory}); + } + } + break; + } + case IR::Opcode::A32ReadMemory64: + case IR::Opcode::A64ReadMemory64: { + if (inst.AreAllArgsImmediates()) { + const u32 vaddr = inst.GetArg(1).GetU32(); + if (cb->IsReadOnlyMemory(vaddr)) { + const u64 value_from_memory = cb->MemoryRead64(vaddr); + inst.ReplaceUsesWith(IR::Value{value_from_memory}); + } + } + break; + } + default: + break; + } + } +} + +static void FlagsPass(IR::Block& block) { + using Iterator = std::reverse_iterator; + + struct FlagInfo { + bool set_not_required = false; + bool has_value_request = false; + Iterator value_request = {}; + }; + struct ValuelessFlagInfo { + bool set_not_required = false; + }; + ValuelessFlagInfo nzcvq; + ValuelessFlagInfo nzcv; + ValuelessFlagInfo nz; + FlagInfo c_flag; + FlagInfo ge; + + auto do_set = [&](FlagInfo& info, IR::Value value, Iterator inst) { + if (info.has_value_request) { + info.value_request->ReplaceUsesWith(value); + } + info.has_value_request = false; + + if (info.set_not_required) { + inst->Invalidate(); + } + info.set_not_required = true; + }; + + auto do_set_valueless = [&](ValuelessFlagInfo& info, Iterator inst) { + if (info.set_not_required) { + inst->Invalidate(); + } + info.set_not_required = true; + }; + + auto do_get = [](FlagInfo& info, Iterator inst) { + if (info.has_value_request) { + info.value_request->ReplaceUsesWith(IR::Value{&*inst}); + } + info.has_value_request = true; + info.value_request = inst; + }; + + A32::IREmitter ir{block, A32::LocationDescriptor{block.Location()}, {}}; + + for (auto inst = block.rbegin(); inst != block.rend(); ++inst) { + auto const opcode = inst->GetOpcode(); + switch (opcode) { + case IR::Opcode::A32GetCFlag: { + do_get(c_flag, inst); + break; + } + case IR::Opcode::A32SetCpsrNZCV: { + if (c_flag.has_value_request) { + ir.SetInsertionPointBefore(inst.base()); // base is one ahead + IR::U1 c = ir.GetCFlagFromNZCV(IR::NZCV{inst->GetArg(0)}); + c_flag.value_request->ReplaceUsesWith(c); + c_flag.has_value_request = false; + break; // This case will be executed again because of the above + } + + do_set_valueless(nzcv, inst); + + nz = {.set_not_required = true}; + c_flag = {.set_not_required = true}; + break; + } + case IR::Opcode::A32SetCpsrNZCVRaw: { + if (c_flag.has_value_request) { + nzcv.set_not_required = false; + } + + do_set_valueless(nzcv, inst); + + nzcvq = {}; + nz = {.set_not_required = true}; + c_flag = {.set_not_required = true}; + break; + } + case IR::Opcode::A32SetCpsrNZCVQ: { + if (c_flag.has_value_request) { + nzcvq.set_not_required = false; + } + + do_set_valueless(nzcvq, inst); + + nzcv = {.set_not_required = true}; + nz = {.set_not_required = true}; + c_flag = {.set_not_required = true}; + break; + } + case IR::Opcode::A32SetCpsrNZ: { + do_set_valueless(nz, inst); + + nzcvq = {}; + nzcv = {}; + break; + } + case IR::Opcode::A32SetCpsrNZC: { + if (c_flag.has_value_request) { + c_flag.value_request->ReplaceUsesWith(inst->GetArg(1)); + c_flag.has_value_request = false; + } + + if (!inst->GetArg(1).IsImmediate() && inst->GetArg(1).GetInstRecursive()->GetOpcode() == IR::Opcode::A32GetCFlag) { + const auto nz_value = inst->GetArg(0); + + inst->Invalidate(); + + ir.SetInsertionPointBefore(inst.base()); + ir.SetCpsrNZ(IR::NZCV{nz_value}); + + nzcvq = {}; + nzcv = {}; + nz = {.set_not_required = true}; + break; + } + + if (nz.set_not_required && c_flag.set_not_required) { + inst->Invalidate(); + } else if (nz.set_not_required) { + inst->SetArg(0, IR::Value::EmptyNZCVImmediateMarker()); + } + nz.set_not_required = true; + c_flag.set_not_required = true; + + nzcv = {}; + nzcvq = {}; + break; + } + case IR::Opcode::A32SetGEFlags: { + do_set(ge, inst->GetArg(0), inst); + break; + } + case IR::Opcode::A32GetGEFlags: { + do_get(ge, inst); + break; + } + case IR::Opcode::A32SetGEFlagsCompressed: { + ge = {.set_not_required = true}; + break; + } + case IR::Opcode::A32OrQFlag: { + break; + } + default: { + if (ReadsFromCPSR(opcode) || WritesToCPSR(opcode)) { + nzcvq = {}; + nzcv = {}; + nz = {}; + c_flag = {}; + ge = {}; + } + break; + } + } + } +} + +static void RegisterPass(IR::Block& block) { + using Iterator = IR::Block::iterator; + + struct RegInfo { + IR::Value register_value; + std::optional last_set_instruction; + }; + std::array reg_info; + + const auto do_get = [](RegInfo& info, Iterator get_inst) { + if (info.register_value.IsEmpty()) { + info.register_value = IR::Value(&*get_inst); + return; + } + get_inst->ReplaceUsesWith(info.register_value); + }; + + const auto do_set = [](RegInfo& info, IR::Value value, Iterator set_inst) { + if (info.last_set_instruction) { + (*info.last_set_instruction)->Invalidate(); + } + info = { + .register_value = value, + .last_set_instruction = set_inst, + }; + }; + + enum class ExtValueType { + Empty, + Single, + Double, + VectorDouble, + VectorQuad, + }; + struct ExtRegInfo { + ExtValueType value_type = {}; + IR::Value register_value; + std::optional last_set_instruction; + }; + std::array ext_reg_info; + + const auto do_ext_get = [](ExtValueType type, std::initializer_list> infos, Iterator get_inst) { + if (!std::all_of(infos.begin(), infos.end(), [type](const auto& info) { return info.get().value_type == type; })) { + for (auto& info : infos) { + info.get() = { + .value_type = type, + .register_value = IR::Value(&*get_inst), + .last_set_instruction = std::nullopt, + }; + } + return; + } + get_inst->ReplaceUsesWith(std::data(infos)[0].get().register_value); + }; + + const auto do_ext_set = [](ExtValueType type, std::initializer_list> infos, IR::Value value, Iterator set_inst) { + if (std::all_of(infos.begin(), infos.end(), [type](const auto& info) { return info.get().value_type == type; })) { + if (std::data(infos)[0].get().last_set_instruction) { + (*std::data(infos)[0].get().last_set_instruction)->Invalidate(); + } + } + for (auto& info : infos) { + info.get() = { + .value_type = type, + .register_value = value, + .last_set_instruction = set_inst, + }; + } + }; + + // Location and version don't matter here. + A32::IREmitter ir{block, A32::LocationDescriptor{block.Location()}, {}}; + + for (auto inst = block.begin(); inst != block.end(); ++inst) { + auto const opcode = inst->GetOpcode(); + switch (opcode) { + case IR::Opcode::A32GetRegister: { + const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); + ASSERT(reg != A32::Reg::PC); + const size_t reg_index = size_t(reg); + do_get(reg_info[reg_index], inst); + break; + } + case IR::Opcode::A32SetRegister: { + const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); + if (reg == A32::Reg::PC) { + break; + } + const auto reg_index = size_t(reg); + do_set(reg_info[reg_index], inst->GetArg(1), inst); + break; + } + case IR::Opcode::A32GetExtendedRegister32: { + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); + do_ext_get(ExtValueType::Single, {ext_reg_info[reg_index]}, inst); + break; + } + case IR::Opcode::A32SetExtendedRegister32: { + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); + do_ext_set(ExtValueType::Single, {ext_reg_info[reg_index]}, inst->GetArg(1), inst); + break; + } + case IR::Opcode::A32GetExtendedRegister64: { + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); + do_ext_get(ExtValueType::Double, + { + ext_reg_info[reg_index * 2 + 0], + ext_reg_info[reg_index * 2 + 1], + }, + inst); + break; + } + case IR::Opcode::A32SetExtendedRegister64: { + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); + do_ext_set(ExtValueType::Double, + { + ext_reg_info[reg_index * 2 + 0], + ext_reg_info[reg_index * 2 + 1], + }, + inst->GetArg(1), + inst); + break; + } + case IR::Opcode::A32GetVector: { + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); + if (A32::IsDoubleExtReg(reg)) { + do_ext_get(ExtValueType::VectorDouble, + { + ext_reg_info[reg_index * 2 + 0], + ext_reg_info[reg_index * 2 + 1], + }, + inst); + } else { + DEBUG_ASSERT(A32::IsQuadExtReg(reg)); + do_ext_get(ExtValueType::VectorQuad, + { + ext_reg_info[reg_index * 4 + 0], + ext_reg_info[reg_index * 4 + 1], + ext_reg_info[reg_index * 4 + 2], + ext_reg_info[reg_index * 4 + 3], + }, + inst); + } + break; + } + case IR::Opcode::A32SetVector: { + const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); + const size_t reg_index = A32::RegNumber(reg); + if (A32::IsDoubleExtReg(reg)) { + ir.SetInsertionPointAfter(inst); + const IR::U128 stored_value = ir.VectorZeroUpper(IR::U128{inst->GetArg(1)}); + do_ext_set(ExtValueType::VectorDouble, + { + ext_reg_info[reg_index * 2 + 0], + ext_reg_info[reg_index * 2 + 1], + }, + stored_value, + inst); + } else { + DEBUG_ASSERT(A32::IsQuadExtReg(reg)); + do_ext_set(ExtValueType::VectorQuad, + { + ext_reg_info[reg_index * 4 + 0], + ext_reg_info[reg_index * 4 + 1], + ext_reg_info[reg_index * 4 + 2], + ext_reg_info[reg_index * 4 + 3], + }, + inst->GetArg(1), + inst); + } + break; + } + default: { + if (ReadsFromCoreRegister(opcode) || WritesToCoreRegister(opcode)) { + reg_info = {}; + ext_reg_info = {}; + } + break; + } + } + } +} + +struct A32GetSetEliminationOptions { + bool convert_nzc_to_nz = false; + bool convert_nz_to_nzc = false; +}; + +static void A32GetSetElimination(IR::Block& block, A32GetSetEliminationOptions) { + FlagsPass(block); + RegisterPass(block); +} + +static void A64CallbackConfigPass(IR::Block& block, const A64::UserConfig& conf) { + if (conf.hook_data_cache_operations) { + return; + } + + for (auto& inst : block) { + if (inst.GetOpcode() != IR::Opcode::A64DataCacheOperationRaised) { + continue; + } + + const auto op = static_cast(inst.GetArg(1).GetU64()); + if (op == A64::DataCacheOperation::ZeroByVA) { + A64::IREmitter ir{block}; + ir.current_location = A64::LocationDescriptor{IR::LocationDescriptor{inst.GetArg(0).GetU64()}}; + ir.SetInsertionPointBefore(&inst); + + size_t bytes = 4 << static_cast(conf.dczid_el0 & 0b1111); + IR::U64 addr{inst.GetArg(2)}; + + const IR::U128 zero_u128 = ir.ZeroExtendToQuad(ir.Imm64(0)); + while (bytes >= 16) { + ir.WriteMemory128(addr, zero_u128, IR::AccType::DCZVA); + addr = ir.Add(addr, ir.Imm64(16)); + bytes -= 16; + } + + while (bytes >= 8) { + ir.WriteMemory64(addr, ir.Imm64(0), IR::AccType::DCZVA); + addr = ir.Add(addr, ir.Imm64(8)); + bytes -= 8; + } + + while (bytes >= 4) { + ir.WriteMemory32(addr, ir.Imm32(0), IR::AccType::DCZVA); + addr = ir.Add(addr, ir.Imm64(4)); + bytes -= 4; + } + } + inst.Invalidate(); + } +} + +static void A64GetSetElimination(IR::Block& block) { + using Iterator = IR::Block::iterator; + + enum class TrackingType { + W, + X, + S, + D, + Q, + SP, + NZCV, + NZCVRaw, + }; + struct RegisterInfo { + IR::Value register_value; + TrackingType tracking_type; + bool set_instruction_present = false; + Iterator last_set_instruction; + }; + std::array reg_info; + std::array vec_info; + RegisterInfo sp_info; + RegisterInfo nzcv_info; + + const auto do_set = [&block](RegisterInfo& info, IR::Value value, Iterator set_inst, TrackingType tracking_type) { + if (info.set_instruction_present) { + info.last_set_instruction->Invalidate(); + block.Instructions().erase(info.last_set_instruction); + } + + info.register_value = value; + info.tracking_type = tracking_type; + info.set_instruction_present = true; + info.last_set_instruction = set_inst; + }; + + const auto do_get = [](RegisterInfo& info, Iterator get_inst, TrackingType tracking_type) { + const auto do_nothing = [&] { + info = {}; + info.register_value = IR::Value(&*get_inst); + info.tracking_type = tracking_type; + }; + + if (info.register_value.IsEmpty()) { + do_nothing(); + return; + } + + if (info.tracking_type == tracking_type) { + get_inst->ReplaceUsesWith(info.register_value); + return; + } + + do_nothing(); + }; + + for (auto inst = block.begin(); inst != block.end(); ++inst) { + auto const opcode = inst->GetOpcode(); + switch (opcode) { + case IR::Opcode::A64GetW: { + const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); + do_get(reg_info.at(index), inst, TrackingType::W); + break; + } + case IR::Opcode::A64GetX: { + const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); + do_get(reg_info.at(index), inst, TrackingType::X); + break; + } + case IR::Opcode::A64GetS: { + const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); + do_get(vec_info.at(index), inst, TrackingType::S); + break; + } + case IR::Opcode::A64GetD: { + const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); + do_get(vec_info.at(index), inst, TrackingType::D); + break; + } + case IR::Opcode::A64GetQ: { + const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); + do_get(vec_info.at(index), inst, TrackingType::Q); + break; + } + case IR::Opcode::A64GetSP: { + do_get(sp_info, inst, TrackingType::SP); + break; + } + case IR::Opcode::A64GetNZCVRaw: { + do_get(nzcv_info, inst, TrackingType::NZCVRaw); + break; + } + case IR::Opcode::A64SetW: { + const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); + do_set(reg_info.at(index), inst->GetArg(1), inst, TrackingType::W); + break; + } + case IR::Opcode::A64SetX: { + const size_t index = A64::RegNumber(inst->GetArg(0).GetA64RegRef()); + do_set(reg_info.at(index), inst->GetArg(1), inst, TrackingType::X); + break; + } + case IR::Opcode::A64SetS: { + const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); + do_set(vec_info.at(index), inst->GetArg(1), inst, TrackingType::S); + break; + } + case IR::Opcode::A64SetD: { + const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); + do_set(vec_info.at(index), inst->GetArg(1), inst, TrackingType::D); + break; + } + case IR::Opcode::A64SetQ: { + const size_t index = A64::VecNumber(inst->GetArg(0).GetA64VecRef()); + do_set(vec_info.at(index), inst->GetArg(1), inst, TrackingType::Q); + break; + } + case IR::Opcode::A64SetSP: { + do_set(sp_info, inst->GetArg(0), inst, TrackingType::SP); + break; + } + case IR::Opcode::A64SetNZCV: { + do_set(nzcv_info, inst->GetArg(0), inst, TrackingType::NZCV); + break; + } + case IR::Opcode::A64SetNZCVRaw: { + do_set(nzcv_info, inst->GetArg(0), inst, TrackingType::NZCVRaw); + break; + } + default: { + if (ReadsFromCPSR(opcode) || WritesToCPSR(opcode)) { + nzcv_info = {}; + } + if (ReadsFromCoreRegister(opcode) || WritesToCoreRegister(opcode)) { + reg_info = {}; + vec_info = {}; + sp_info = {}; + } + break; + } + } + } +} + +static void A64MergeInterpretBlocksPass(IR::Block& block, A64::UserCallbacks* cb) { + const auto is_interpret_instruction = [cb](A64::LocationDescriptor location) { + const auto instruction = cb->MemoryReadCode(location.PC()); + if (!instruction) + return false; + + IR::Block new_block{location}; + A64::TranslateSingleInstruction(new_block, location, *instruction); + + if (!new_block.Instructions().empty()) + return false; + + const IR::Terminal terminal = new_block.GetTerminal(); + if (auto term = boost::get(&terminal)) { + return term->next == location; + } + + return false; + }; + + IR::Terminal terminal = block.GetTerminal(); + auto term = boost::get(&terminal); + if (!term) + return; + + A64::LocationDescriptor location{term->next}; + size_t num_instructions = 1; + + while (is_interpret_instruction(location.AdvancePC(static_cast(num_instructions * 4)))) { + num_instructions++; + } + + term->num_instructions = num_instructions; + block.ReplaceTerminal(terminal); + block.CycleCount() += num_instructions - 1; +} + +using Op = Dynarmic::IR::Opcode; + +// Tiny helper to avoid the need to store based off the opcode +// bit size all over the place within folding functions. +static void ReplaceUsesWith(IR::Inst& inst, bool is_32_bit, u64 value) { + if (is_32_bit) { + inst.ReplaceUsesWith(IR::Value{u32(value)}); + } else { + inst.ReplaceUsesWith(IR::Value{value}); + } +} + +static IR::Value Value(bool is_32_bit, u64 value) { + return is_32_bit ? IR::Value{u32(value)} : IR::Value{value}; +} + +template +static bool FoldCommutative(IR::Inst& inst, bool is_32_bit, ImmFn imm_fn) { + const auto lhs = inst.GetArg(0); + const auto rhs = inst.GetArg(1); + + const bool is_lhs_immediate = lhs.IsImmediate(); + const bool is_rhs_immediate = rhs.IsImmediate(); + + if (is_lhs_immediate && is_rhs_immediate) { + const u64 result = imm_fn(lhs.GetImmediateAsU64(), rhs.GetImmediateAsU64()); + ReplaceUsesWith(inst, is_32_bit, result); + return false; + } + + if (is_lhs_immediate && !is_rhs_immediate) { + const IR::Inst* rhs_inst = rhs.GetInstRecursive(); + if (rhs_inst->GetOpcode() == inst.GetOpcode() && rhs_inst->GetArg(1).IsImmediate()) { + const u64 combined = imm_fn(lhs.GetImmediateAsU64(), rhs_inst->GetArg(1).GetImmediateAsU64()); + inst.SetArg(0, rhs_inst->GetArg(0)); + inst.SetArg(1, Value(is_32_bit, combined)); + } else { + // Normalize + inst.SetArg(0, rhs); + inst.SetArg(1, lhs); + } + } + + if (!is_lhs_immediate && is_rhs_immediate) { + const IR::Inst* lhs_inst = lhs.GetInstRecursive(); + if (lhs_inst->GetOpcode() == inst.GetOpcode() && lhs_inst->GetArg(1).IsImmediate()) { + const u64 combined = imm_fn(rhs.GetImmediateAsU64(), lhs_inst->GetArg(1).GetImmediateAsU64()); + inst.SetArg(0, lhs_inst->GetArg(0)); + inst.SetArg(1, Value(is_32_bit, combined)); + } + } + + return true; +} + +static void FoldAdd(IR::Inst& inst, bool is_32_bit) { + const auto lhs = inst.GetArg(0); + const auto rhs = inst.GetArg(1); + const auto carry = inst.GetArg(2); + + if (lhs.IsImmediate() && !rhs.IsImmediate()) { + // Normalize + inst.SetArg(0, rhs); + inst.SetArg(1, lhs); + FoldAdd(inst, is_32_bit); + return; + } + + if (inst.HasAssociatedPseudoOperation()) { + return; + } + + if (!lhs.IsImmediate() && rhs.IsImmediate()) { + const IR::Inst* lhs_inst = lhs.GetInstRecursive(); + if (lhs_inst->GetOpcode() == inst.GetOpcode() && lhs_inst->GetArg(1).IsImmediate() && lhs_inst->GetArg(2).IsImmediate()) { + const u64 combined = rhs.GetImmediateAsU64() + lhs_inst->GetArg(1).GetImmediateAsU64() + lhs_inst->GetArg(2).GetU1(); + if (combined == 0) { + inst.ReplaceUsesWith(lhs_inst->GetArg(0)); + return; + } + inst.SetArg(0, lhs_inst->GetArg(0)); + inst.SetArg(1, Value(is_32_bit, combined)); + return; + } + if (rhs.IsZero() && carry.IsZero()) { + inst.ReplaceUsesWith(lhs); + return; + } + } + + if (inst.AreAllArgsImmediates()) { + const u64 result = lhs.GetImmediateAsU64() + rhs.GetImmediateAsU64() + carry.GetU1(); + ReplaceUsesWith(inst, is_32_bit, result); + return; + } +} + +/// Folds AND operations based on the following: +/// +/// 1. imm_x & imm_y -> result +/// 2. x & 0 -> 0 +/// 3. 0 & y -> 0 +/// 4. x & y -> y (where x has all bits set to 1) +/// 5. x & y -> x (where y has all bits set to 1) +/// +static void FoldAND(IR::Inst& inst, bool is_32_bit) { + if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a & b; })) { + const auto rhs = inst.GetArg(1); + if (rhs.IsZero()) { + ReplaceUsesWith(inst, is_32_bit, 0); + } else if (rhs.HasAllBitsSet()) { + inst.ReplaceUsesWith(inst.GetArg(0)); + } + } +} + +/// Folds byte reversal opcodes based on the following: +/// +/// 1. imm -> swap(imm) +/// +static void FoldByteReverse(IR::Inst& inst, Op op) { + const auto operand = inst.GetArg(0); + + if (!operand.IsImmediate()) { + return; + } + + if (op == Op::ByteReverseWord) { + const u32 result = mcl::bit::swap_bytes_32(u32(operand.GetImmediateAsU64())); + inst.ReplaceUsesWith(IR::Value{result}); + } else if (op == Op::ByteReverseHalf) { + const u16 result = mcl::bit::swap_bytes_16(u16(operand.GetImmediateAsU64())); + inst.ReplaceUsesWith(IR::Value{result}); + } else { + const u64 result = mcl::bit::swap_bytes_64(operand.GetImmediateAsU64()); + inst.ReplaceUsesWith(IR::Value{result}); + } +} + +/// Folds leading zero population count +/// +/// 1. imm -> countl_zero(imm) +/// +static void FoldCountLeadingZeros(IR::Inst& inst, bool is_32_bit) { + const auto operand = inst.GetArg(0); + if (operand.IsImmediate()) { + if (is_32_bit) { + const u32 result = std::countl_zero(u32(operand.GetImmediateAsU64())); + inst.ReplaceUsesWith(IR::Value{result}); + } else { + const u64 result = std::countl_zero(operand.GetImmediateAsU64()); + inst.ReplaceUsesWith(IR::Value{result}); + } + } +} + +/// Folds division operations based on the following: +/// +/// 1. x / 0 -> 0 (NOTE: This is an ARM-specific behavior defined in the architecture reference manual) +/// 2. imm_x / imm_y -> result +/// 3. x / 1 -> x +/// +static void FoldDivide(IR::Inst& inst, bool is_32_bit, bool is_signed) { + const auto rhs = inst.GetArg(1); + + if (rhs.IsZero()) { + ReplaceUsesWith(inst, is_32_bit, 0); + return; + } + + const auto lhs = inst.GetArg(0); + if (lhs.IsImmediate() && rhs.IsImmediate()) { + if (is_signed) { + const s64 result = lhs.GetImmediateAsS64() / rhs.GetImmediateAsS64(); + ReplaceUsesWith(inst, is_32_bit, static_cast(result)); + } else { + const u64 result = lhs.GetImmediateAsU64() / rhs.GetImmediateAsU64(); + ReplaceUsesWith(inst, is_32_bit, result); + } + } else if (rhs.IsUnsignedImmediate(1)) { + inst.ReplaceUsesWith(IR::Value{lhs}); + } +} + +// Folds EOR operations based on the following: +// +// 1. imm_x ^ imm_y -> result +// 2. x ^ 0 -> x +// 3. 0 ^ y -> y +// +static void FoldEOR(IR::Inst& inst, bool is_32_bit) { + if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a ^ b; })) { + const auto rhs = inst.GetArg(1); + if (rhs.IsZero()) { + inst.ReplaceUsesWith(inst.GetArg(0)); + } + } +} + +static void FoldLeastSignificantByte(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const auto operand = inst.GetArg(0); + inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64())}); +} + +static void FoldLeastSignificantHalf(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const auto operand = inst.GetArg(0); + inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64())}); +} + +static void FoldLeastSignificantWord(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const auto operand = inst.GetArg(0); + inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64())}); +} + +static void FoldMostSignificantBit(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const auto operand = inst.GetArg(0); + inst.ReplaceUsesWith(IR::Value{(operand.GetImmediateAsU64() >> 31) != 0}); +} + +static void FoldMostSignificantWord(IR::Inst& inst) { + IR::Inst* carry_inst = inst.GetAssociatedPseudoOperation(Op::GetCarryFromOp); + + if (!inst.AreAllArgsImmediates()) { + return; + } + + const auto operand = inst.GetArg(0); + if (carry_inst) { + carry_inst->ReplaceUsesWith(IR::Value{mcl::bit::get_bit<31>(operand.GetImmediateAsU64())}); + } + inst.ReplaceUsesWith(IR::Value{static_cast(operand.GetImmediateAsU64() >> 32)}); +} + +// Folds multiplication operations based on the following: +// +// 1. imm_x * imm_y -> result +// 2. x * 0 -> 0 +// 3. 0 * y -> 0 +// 4. x * 1 -> x +// 5. 1 * y -> y +// +static void FoldMultiply(IR::Inst& inst, bool is_32_bit) { + if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a * b; })) { + const auto rhs = inst.GetArg(1); + if (rhs.IsZero()) { + ReplaceUsesWith(inst, is_32_bit, 0); + } else if (rhs.IsUnsignedImmediate(1)) { + inst.ReplaceUsesWith(inst.GetArg(0)); + } + } +} + +// Folds NOT operations if the contained value is an immediate. +static void FoldNOT(IR::Inst& inst, bool is_32_bit) { + const auto operand = inst.GetArg(0); + + if (!operand.IsImmediate()) { + return; + } + + const u64 result = ~operand.GetImmediateAsU64(); + ReplaceUsesWith(inst, is_32_bit, result); +} + +// Folds OR operations based on the following: +// +// 1. imm_x | imm_y -> result +// 2. x | 0 -> x +// 3. 0 | y -> y +// +static void FoldOR(IR::Inst& inst, bool is_32_bit) { + if (FoldCommutative(inst, is_32_bit, [](u64 a, u64 b) { return a | b; })) { + const auto rhs = inst.GetArg(1); + if (rhs.IsZero()) { + inst.ReplaceUsesWith(inst.GetArg(0)); + } + } +} + +static bool FoldShifts(IR::Inst& inst) { + IR::Inst* carry_inst = inst.GetAssociatedPseudoOperation(Op::GetCarryFromOp); + + // The 32-bit variants can contain 3 arguments, while the + // 64-bit variants only contain 2. + if (inst.NumArgs() == 3 && !carry_inst) { + inst.SetArg(2, IR::Value(false)); + } + + const auto shift_amount = inst.GetArg(1); + + if (shift_amount.IsZero()) { + if (carry_inst) { + carry_inst->ReplaceUsesWith(inst.GetArg(2)); + } + inst.ReplaceUsesWith(inst.GetArg(0)); + return false; + } + + if (inst.NumArgs() == 3 && shift_amount.IsImmediate() && !shift_amount.IsZero()) { + inst.SetArg(2, IR::Value(false)); + } + + if (!inst.AreAllArgsImmediates() || carry_inst) { + return false; + } + + return true; +} + +static void FoldSignExtendXToWord(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const s64 value = inst.GetArg(0).GetImmediateAsS64(); + inst.ReplaceUsesWith(IR::Value{static_cast(value)}); +} + +static void FoldSignExtendXToLong(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const s64 value = inst.GetArg(0).GetImmediateAsS64(); + inst.ReplaceUsesWith(IR::Value{static_cast(value)}); +} + +static void FoldSub(IR::Inst& inst, bool is_32_bit) { + if (!inst.AreAllArgsImmediates() || inst.HasAssociatedPseudoOperation()) { + return; + } + + const auto lhs = inst.GetArg(0); + const auto rhs = inst.GetArg(1); + const auto carry = inst.GetArg(2); + + const u64 result = lhs.GetImmediateAsU64() + (~rhs.GetImmediateAsU64()) + carry.GetU1(); + ReplaceUsesWith(inst, is_32_bit, result); +} + +static void FoldZeroExtendXToWord(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const u64 value = inst.GetArg(0).GetImmediateAsU64(); + inst.ReplaceUsesWith(IR::Value{static_cast(value)}); +} + +static void FoldZeroExtendXToLong(IR::Inst& inst) { + if (!inst.AreAllArgsImmediates()) { + return; + } + + const u64 value = inst.GetArg(0).GetImmediateAsU64(); + inst.ReplaceUsesWith(IR::Value{value}); +} + +static void ConstantPropagation(IR::Block& block) { + for (auto& inst : block) { + auto const opcode = inst.GetOpcode(); + switch (opcode) { + case Op::LeastSignificantWord: + FoldLeastSignificantWord(inst); + break; + case Op::MostSignificantWord: + FoldMostSignificantWord(inst); + break; + case Op::LeastSignificantHalf: + FoldLeastSignificantHalf(inst); + break; + case Op::LeastSignificantByte: + FoldLeastSignificantByte(inst); + break; + case Op::MostSignificantBit: + FoldMostSignificantBit(inst); + break; + case Op::IsZero32: + if (inst.AreAllArgsImmediates()) { + inst.ReplaceUsesWith(IR::Value{inst.GetArg(0).GetU32() == 0}); + } + break; + case Op::IsZero64: + if (inst.AreAllArgsImmediates()) { + inst.ReplaceUsesWith(IR::Value{inst.GetArg(0).GetU64() == 0}); + } + break; + case Op::LogicalShiftLeft32: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, true, Safe::LogicalShiftLeft(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); + } + break; + case Op::LogicalShiftLeft64: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, false, Safe::LogicalShiftLeft(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); + } + break; + case Op::LogicalShiftRight32: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, true, Safe::LogicalShiftRight(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); + } + break; + case Op::LogicalShiftRight64: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, false, Safe::LogicalShiftRight(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); + } + break; + case Op::ArithmeticShiftRight32: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, true, Safe::ArithmeticShiftRight(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); + } + break; + case Op::ArithmeticShiftRight64: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, false, Safe::ArithmeticShiftRight(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); + } + break; + case Op::RotateRight32: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, true, mcl::bit::rotate_right(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU8())); + } + break; + case Op::RotateRight64: + if (FoldShifts(inst)) { + ReplaceUsesWith(inst, false, mcl::bit::rotate_right(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU8())); + } + break; + case Op::LogicalShiftLeftMasked32: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, true, inst.GetArg(0).GetU32() << (inst.GetArg(1).GetU32() & 0x1f)); + } + break; + case Op::LogicalShiftLeftMasked64: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, false, inst.GetArg(0).GetU64() << (inst.GetArg(1).GetU64() & 0x3f)); + } + break; + case Op::LogicalShiftRightMasked32: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, true, inst.GetArg(0).GetU32() >> (inst.GetArg(1).GetU32() & 0x1f)); + } + break; + case Op::LogicalShiftRightMasked64: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, false, inst.GetArg(0).GetU64() >> (inst.GetArg(1).GetU64() & 0x3f)); + } + break; + case Op::ArithmeticShiftRightMasked32: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, true, s32(inst.GetArg(0).GetU32()) >> (inst.GetArg(1).GetU32() & 0x1f)); + } + break; + case Op::ArithmeticShiftRightMasked64: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, false, s64(inst.GetArg(0).GetU64()) >> (inst.GetArg(1).GetU64() & 0x3f)); + } + break; + case Op::RotateRightMasked32: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, true, mcl::bit::rotate_right(inst.GetArg(0).GetU32(), inst.GetArg(1).GetU32())); + } + break; + case Op::RotateRightMasked64: + if (inst.AreAllArgsImmediates()) { + ReplaceUsesWith(inst, false, mcl::bit::rotate_right(inst.GetArg(0).GetU64(), inst.GetArg(1).GetU64())); + } + break; + case Op::Add32: + case Op::Add64: + FoldAdd(inst, opcode == Op::Add32); + break; + case Op::Sub32: + case Op::Sub64: + FoldSub(inst, opcode == Op::Sub32); + break; + case Op::Mul32: + case Op::Mul64: + FoldMultiply(inst, opcode == Op::Mul32); + break; + case Op::SignedDiv32: + case Op::SignedDiv64: + FoldDivide(inst, opcode == Op::SignedDiv32, true); + break; + case Op::UnsignedDiv32: + case Op::UnsignedDiv64: + FoldDivide(inst, opcode == Op::UnsignedDiv32, false); + break; + case Op::And32: + case Op::And64: + FoldAND(inst, opcode == Op::And32); + break; + case Op::Eor32: + case Op::Eor64: + FoldEOR(inst, opcode == Op::Eor32); + break; + case Op::Or32: + case Op::Or64: + FoldOR(inst, opcode == Op::Or32); + break; + case Op::Not32: + case Op::Not64: + FoldNOT(inst, opcode == Op::Not32); + break; + case Op::SignExtendByteToWord: + case Op::SignExtendHalfToWord: + FoldSignExtendXToWord(inst); + break; + case Op::SignExtendByteToLong: + case Op::SignExtendHalfToLong: + case Op::SignExtendWordToLong: + FoldSignExtendXToLong(inst); + break; + case Op::ZeroExtendByteToWord: + case Op::ZeroExtendHalfToWord: + FoldZeroExtendXToWord(inst); + break; + case Op::ZeroExtendByteToLong: + case Op::ZeroExtendHalfToLong: + case Op::ZeroExtendWordToLong: + FoldZeroExtendXToLong(inst); + break; + case Op::ByteReverseWord: + case Op::ByteReverseHalf: + case Op::ByteReverseDual: + FoldByteReverse(inst, opcode); + break; + case Op::CountLeadingZeros32: + case Op::CountLeadingZeros64: + FoldCountLeadingZeros(inst, opcode == Op::CountLeadingZeros32); + break; + default: + break; + } + } +} + +static void DeadCodeElimination(IR::Block& block) { + // We iterate over the instructions in reverse order. + // This is because removing an instruction reduces the number of uses for earlier instructions. + for (auto it = block.rbegin(); it != block.rend(); ++it) + if (!it->HasUses() && !MayHaveSideEffects(it->GetOpcode())) + it->Invalidate(); +} + +static void IdentityRemovalPass(IR::Block& block) { + boost::container::small_vector to_invalidate; + + auto iter = block.begin(); + while (iter != block.end()) { + IR::Inst& inst = *iter; + + const size_t num_args = inst.NumArgs(); + for (size_t i = 0; i < num_args; i++) { + while (true) { + IR::Value arg = inst.GetArg(i); + if (!arg.IsIdentity()) + break; + inst.SetArg(i, arg.GetInst()->GetArg(0)); + } + } + + if (inst.GetOpcode() == IR::Opcode::Identity || inst.GetOpcode() == IR::Opcode::Void) { + iter = block.Instructions().erase(inst); + to_invalidate.push_back(&inst); + } else { + ++iter; + } + } + for (IR::Inst* inst : to_invalidate) { + inst->Invalidate(); + } +} + +static void NamingPass(IR::Block& block) { + u32 name = 1; + for (auto& inst : block) + inst.SetName(name++); +} + +static void PolyfillSHA256MessageSchedule0(IR::IREmitter& ir, IR::Inst& inst) { + const IR::U128 x = (IR::U128)inst.GetArg(0); + const IR::U128 y = (IR::U128)inst.GetArg(1); + + const IR::U128 t = ir.VectorExtract(x, y, 32); + + IR::U128 result = ir.ZeroVector(); + for (size_t i = 0; i < 4; i++) { + const IR::U32 modified_element = [&] { + const IR::U32 element = ir.VectorGetElement(32, t, i); + const IR::U32 tmp1 = ir.RotateRight(element, ir.Imm8(7)); + const IR::U32 tmp2 = ir.RotateRight(element, ir.Imm8(18)); + const IR::U32 tmp3 = ir.LogicalShiftRight(element, ir.Imm8(3)); + + return ir.Eor(tmp1, ir.Eor(tmp2, tmp3)); + }(); + + result = ir.VectorSetElement(32, result, i, modified_element); + } + result = ir.VectorAdd(32, result, x); + + inst.ReplaceUsesWith(result); +} + +static void PolyfillSHA256MessageSchedule1(IR::IREmitter& ir, IR::Inst& inst) { + const IR::U128 x = (IR::U128)inst.GetArg(0); + const IR::U128 y = (IR::U128)inst.GetArg(1); + const IR::U128 z = (IR::U128)inst.GetArg(2); + + const IR::U128 T0 = ir.VectorExtract(y, z, 32); + + const IR::U128 lower_half = [&] { + const IR::U128 T = ir.VectorRotateWholeVectorRight(z, 64); + const IR::U128 tmp1 = ir.VectorRotateRight(32, T, 17); + const IR::U128 tmp2 = ir.VectorRotateRight(32, T, 19); + const IR::U128 tmp3 = ir.VectorLogicalShiftRight(32, T, 10); + const IR::U128 tmp4 = ir.VectorEor(tmp1, ir.VectorEor(tmp2, tmp3)); + const IR::U128 tmp5 = ir.VectorAdd(32, tmp4, ir.VectorAdd(32, x, T0)); + return ir.VectorZeroUpper(tmp5); + }(); + + const IR::U64 upper_half = [&] { + const IR::U128 tmp1 = ir.VectorRotateRight(32, lower_half, 17); + const IR::U128 tmp2 = ir.VectorRotateRight(32, lower_half, 19); + const IR::U128 tmp3 = ir.VectorLogicalShiftRight(32, lower_half, 10); + const IR::U128 tmp4 = ir.VectorEor(tmp1, ir.VectorEor(tmp2, tmp3)); + + // Shuffle the top two 32-bit elements downwards [3, 2, 1, 0] -> [1, 0, 3, 2] + const IR::U128 shuffled_d = ir.VectorRotateWholeVectorRight(x, 64); + const IR::U128 shuffled_T0 = ir.VectorRotateWholeVectorRight(T0, 64); + + const IR::U128 tmp5 = ir.VectorAdd(32, tmp4, ir.VectorAdd(32, shuffled_d, shuffled_T0)); + return ir.VectorGetElement(64, tmp5, 0); + }(); + + const IR::U128 result = ir.VectorSetElement(64, lower_half, 1, upper_half); + + inst.ReplaceUsesWith(result); +} + +static IR::U32 SHAchoose(IR::IREmitter& ir, IR::U32 x, IR::U32 y, IR::U32 z) { + return ir.Eor(ir.And(ir.Eor(y, z), x), z); +} + +static IR::U32 SHAmajority(IR::IREmitter& ir, IR::U32 x, IR::U32 y, IR::U32 z) { + return ir.Or(ir.And(x, y), ir.And(ir.Or(x, y), z)); +} + +static IR::U32 SHAhashSIGMA0(IR::IREmitter& ir, IR::U32 x) { + const IR::U32 tmp1 = ir.RotateRight(x, ir.Imm8(2)); + const IR::U32 tmp2 = ir.RotateRight(x, ir.Imm8(13)); + const IR::U32 tmp3 = ir.RotateRight(x, ir.Imm8(22)); + + return ir.Eor(tmp1, ir.Eor(tmp2, tmp3)); +} + +static IR::U32 SHAhashSIGMA1(IR::IREmitter& ir, IR::U32 x) { + const IR::U32 tmp1 = ir.RotateRight(x, ir.Imm8(6)); + const IR::U32 tmp2 = ir.RotateRight(x, ir.Imm8(11)); + const IR::U32 tmp3 = ir.RotateRight(x, ir.Imm8(25)); + + return ir.Eor(tmp1, ir.Eor(tmp2, tmp3)); +} + +static void PolyfillSHA256Hash(IR::IREmitter& ir, IR::Inst& inst) { + IR::U128 x = (IR::U128)inst.GetArg(0); + IR::U128 y = (IR::U128)inst.GetArg(1); + const IR::U128 w = (IR::U128)inst.GetArg(2); + const bool part1 = inst.GetArg(3).GetU1(); + + for (size_t i = 0; i < 4; i++) { + const IR::U32 low_x = ir.VectorGetElement(32, x, 0); + const IR::U32 after_low_x = ir.VectorGetElement(32, x, 1); + const IR::U32 before_high_x = ir.VectorGetElement(32, x, 2); + const IR::U32 high_x = ir.VectorGetElement(32, x, 3); + + const IR::U32 low_y = ir.VectorGetElement(32, y, 0); + const IR::U32 after_low_y = ir.VectorGetElement(32, y, 1); + const IR::U32 before_high_y = ir.VectorGetElement(32, y, 2); + const IR::U32 high_y = ir.VectorGetElement(32, y, 3); + + const IR::U32 choice = SHAchoose(ir, low_y, after_low_y, before_high_y); + const IR::U32 majority = SHAmajority(ir, low_x, after_low_x, before_high_x); + + const IR::U32 t = [&] { + const IR::U32 w_element = ir.VectorGetElement(32, w, i); + const IR::U32 sig = SHAhashSIGMA1(ir, low_y); + + return ir.Add(high_y, ir.Add(sig, ir.Add(choice, w_element))); + }(); + + const IR::U32 new_low_x = ir.Add(t, ir.Add(SHAhashSIGMA0(ir, low_x), majority)); + const IR::U32 new_low_y = ir.Add(t, high_x); + + // Shuffle all words left by 1 element: [3, 2, 1, 0] -> [2, 1, 0, 3] + const IR::U128 shuffled_x = ir.VectorRotateWholeVectorRight(x, 96); + const IR::U128 shuffled_y = ir.VectorRotateWholeVectorRight(y, 96); + + x = ir.VectorSetElement(32, shuffled_x, 0, new_low_x); + y = ir.VectorSetElement(32, shuffled_y, 0, new_low_y); + } + + inst.ReplaceUsesWith(part1 ? x : y); +} + +template +static void PolyfillVectorMultiplyWiden(IR::IREmitter& ir, IR::Inst& inst) { + IR::U128 n = (IR::U128)inst.GetArg(0); + IR::U128 m = (IR::U128)inst.GetArg(1); + + const IR::U128 wide_n = is_signed ? ir.VectorSignExtend(esize, n) : ir.VectorZeroExtend(esize, n); + const IR::U128 wide_m = is_signed ? ir.VectorSignExtend(esize, m) : ir.VectorZeroExtend(esize, m); + + const IR::U128 result = ir.VectorMultiply(esize * 2, wide_n, wide_m); + + inst.ReplaceUsesWith(result); +} + +static void PolyfillPass(IR::Block& block, const PolyfillOptions& polyfill) { + if (polyfill == PolyfillOptions{}) { + return; + } + + IR::IREmitter ir{block}; + + for (auto& inst : block) { + ir.SetInsertionPointBefore(&inst); + + switch (inst.GetOpcode()) { + case IR::Opcode::SHA256MessageSchedule0: + if (polyfill.sha256) { + PolyfillSHA256MessageSchedule0(ir, inst); + } + break; + case IR::Opcode::SHA256MessageSchedule1: + if (polyfill.sha256) { + PolyfillSHA256MessageSchedule1(ir, inst); + } + break; + case IR::Opcode::SHA256Hash: + if (polyfill.sha256) { + PolyfillSHA256Hash(ir, inst); + } + break; + case IR::Opcode::VectorMultiplySignedWiden8: + if (polyfill.vector_multiply_widen) { + PolyfillVectorMultiplyWiden<8, true>(ir, inst); + } + break; + case IR::Opcode::VectorMultiplySignedWiden16: + if (polyfill.vector_multiply_widen) { + PolyfillVectorMultiplyWiden<16, true>(ir, inst); + } + break; + case IR::Opcode::VectorMultiplySignedWiden32: + if (polyfill.vector_multiply_widen) { + PolyfillVectorMultiplyWiden<32, true>(ir, inst); + } + break; + case IR::Opcode::VectorMultiplyUnsignedWiden8: + if (polyfill.vector_multiply_widen) { + PolyfillVectorMultiplyWiden<8, false>(ir, inst); + } + break; + case IR::Opcode::VectorMultiplyUnsignedWiden16: + if (polyfill.vector_multiply_widen) { + PolyfillVectorMultiplyWiden<16, false>(ir, inst); + } + break; + case IR::Opcode::VectorMultiplyUnsignedWiden32: + if (polyfill.vector_multiply_widen) { + PolyfillVectorMultiplyWiden<32, false>(ir, inst); + } + break; + default: + break; + } + } +} + +static void VerificationPass(const IR::Block& block) { + for (auto const& inst : block) { + for (size_t i = 0; i < inst.NumArgs(); i++) { + const IR::Type t1 = inst.GetArg(i).GetType(); + const IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i); + ASSERT_MSG(IR::AreTypesCompatible(t1, t2), "Block failed:\n{}", IR::DumpBlock(block)); + } + } + ankerl::unordered_dense::map actual_uses; + for (auto const& inst : block) { + for (size_t i = 0; i < inst.NumArgs(); i++) + if (IR::Value const arg = inst.GetArg(i); !arg.IsImmediate()) + actual_uses[arg.GetInst()]++; + } + for (auto const& pair : actual_uses) + ASSERT(pair.first->UseCount() == pair.second); +} + +void Optimize(IR::Block& block, const A32::UserConfig& conf, const Optimization::PolyfillOptions& polyfill_options) { + Optimization::PolyfillPass(block, polyfill_options); + Optimization::NamingPass(block); + if (conf.HasOptimization(OptimizationFlag::GetSetElimination)) [[likely]] { + Optimization::A32GetSetElimination(block, {.convert_nzc_to_nz = true}); + Optimization::DeadCodeElimination(block); + } + if (conf.HasOptimization(OptimizationFlag::ConstProp)) [[likely]] { + Optimization::ConstantMemoryReads(block, conf.callbacks); + Optimization::ConstantPropagation(block); + Optimization::DeadCodeElimination(block); + } + Optimization::IdentityRemovalPass(block); + if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) { + Optimization::VerificationPass(block); + } +} + +void Optimize(IR::Block& block, const A64::UserConfig& conf, const Optimization::PolyfillOptions& polyfill_options) { + Optimization::PolyfillPass(block, polyfill_options); + Optimization::A64CallbackConfigPass(block, conf); + Optimization::NamingPass(block); + if (conf.HasOptimization(OptimizationFlag::GetSetElimination) && !conf.check_halt_on_memory_access) [[likely]] { + Optimization::A64GetSetElimination(block); + Optimization::DeadCodeElimination(block); + } + if (conf.HasOptimization(OptimizationFlag::ConstProp)) [[likely]] { + Optimization::ConstantPropagation(block); + Optimization::DeadCodeElimination(block); + } + if (conf.HasOptimization(OptimizationFlag::MiscIROpt)) [[likely]] { + Optimization::A64MergeInterpretBlocksPass(block, conf.callbacks); + } + if (!conf.HasOptimization(OptimizationFlag::DisableVerification)) { + Optimization::VerificationPass(block); + } +} + +} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/src/dynarmic/ir/opt_passes.h b/src/dynarmic/src/dynarmic/ir/opt_passes.h new file mode 100644 index 0000000000..88b8020031 --- /dev/null +++ b/src/dynarmic/src/dynarmic/ir/opt_passes.h @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/* This file is part of the dynarmic project. + * Copyright (c) 2016 MerryMage + * SPDX-License-Identifier: 0BSD + */ + +#pragma once + +namespace Dynarmic::A32 { +struct UserCallbacks; +struct UserConfig; +} + +namespace Dynarmic::A64 { +struct UserCallbacks; +struct UserConfig; +} + +namespace Dynarmic::IR { +class Block; +} + +namespace Dynarmic::Optimization { + +struct PolyfillOptions { + bool sha256 = false; + bool vector_multiply_widen = false; + + bool operator==(const PolyfillOptions&) const = default; +}; + +void Optimize(IR::Block& block, const A32::UserConfig& conf, const Optimization::PolyfillOptions& polyfill_options); +void Optimize(IR::Block& block, const A64::UserConfig& conf, const Optimization::PolyfillOptions& polyfill_options); + +} // namespace Dynarmic::Optimization diff --git a/src/dynarmic/tests/A32/fuzz_arm.cpp b/src/dynarmic/tests/A32/fuzz_arm.cpp index 087ce54813..bef473a491 100644 --- a/src/dynarmic/tests/A32/fuzz_arm.cpp +++ b/src/dynarmic/tests/A32/fuzz_arm.cpp @@ -24,6 +24,7 @@ #include "../rand_int.h" #include "../unicorn_emu/a32_unicorn.h" #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/llvm_disassemble.h" @@ -46,7 +47,7 @@ using namespace Dynarmic; template bool AnyLocationDescriptorForTerminalHas(IR::Terminal terminal, Fn fn) { - return Common::VisitVariant(terminal, [&](auto t) -> bool { + return boost::apply_visitor([&](auto t) -> bool { using T = std::decay_t; if constexpr (std::is_same_v) { return false; @@ -72,7 +73,7 @@ bool AnyLocationDescriptorForTerminalHas(IR::Terminal terminal, Fn fn) { ASSERT_MSG(false, "Invalid terminal type"); return false; } - }); + }, terminal); } bool ShouldTestInst(u32 instruction, u32 pc, bool is_thumb, bool is_last_inst, A32::ITState it_state = {}) { diff --git a/src/dynarmic/tests/A32/fuzz_thumb.cpp b/src/dynarmic/tests/A32/fuzz_thumb.cpp index 4d14141bbf..7f64cb0ccb 100644 --- a/src/dynarmic/tests/A32/fuzz_thumb.cpp +++ b/src/dynarmic/tests/A32/fuzz_thumb.cpp @@ -22,6 +22,7 @@ #include "../rand_int.h" #include "../unicorn_emu/a32_unicorn.h" #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/frontend/A32/FPSCR.h" #include "dynarmic/frontend/A32/PSR.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" @@ -29,7 +30,7 @@ #include "dynarmic/frontend/A32/translate/a32_translate.h" #include "dynarmic/interface/A32/a32.h" #include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" using namespace Dynarmic; @@ -179,13 +180,7 @@ static void RunInstance(size_t run_number, ThumbTestEnv& test_env, A32Unicorn #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/interface/A32/a32.h" diff --git a/src/dynarmic/tests/A32/test_coprocessor.cpp b/src/dynarmic/tests/A32/test_coprocessor.cpp index 98da0e5d34..3888d2c68b 100644 --- a/src/dynarmic/tests/A32/test_coprocessor.cpp +++ b/src/dynarmic/tests/A32/test_coprocessor.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,6 +11,7 @@ #include #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/interface/A32/a32.h" #include "dynarmic/interface/A32/coprocessor.h" diff --git a/src/dynarmic/tests/A32/test_svc.cpp b/src/dynarmic/tests/A32/test_svc.cpp index 8b55d6537c..0be2432c7b 100644 --- a/src/dynarmic/tests/A32/test_svc.cpp +++ b/src/dynarmic/tests/A32/test_svc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -8,6 +11,7 @@ #include #include "./testenv.h" +#include "../native/testenv.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A32/test_thumb_instructions.cpp b/src/dynarmic/tests/A32/test_thumb_instructions.cpp index 3501d5419f..d509acdd8d 100644 --- a/src/dynarmic/tests/A32/test_thumb_instructions.cpp +++ b/src/dynarmic/tests/A32/test_thumb_instructions.cpp @@ -10,6 +10,7 @@ #include "dynarmic/common/common_types.h" #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A32/a32.h" static Dynarmic::A32::UserConfig GetUserConfig(ThumbTestEnv* testenv) { diff --git a/src/dynarmic/tests/A32/testenv.h b/src/dynarmic/tests/A32/testenv.h index a6df2017ce..72eaafce14 100644 --- a/src/dynarmic/tests/A32/testenv.h +++ b/src/dynarmic/tests/A32/testenv.h @@ -17,7 +17,6 @@ #include "dynarmic/common/assert.h" #include "dynarmic/common/common_types.h" #include "dynarmic/interface/A32/a32.h" -#include "../native/testenv.h" template class A32TestEnv : public Dynarmic::A32::UserCallbacks { diff --git a/src/dynarmic/tests/A64/a64.cpp b/src/dynarmic/tests/A64/a64.cpp index 40eff1f071..bc51eca164 100644 --- a/src/dynarmic/tests/A64/a64.cpp +++ b/src/dynarmic/tests/A64/a64.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -7,6 +10,7 @@ #include #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/interface/exclusive_monitor.h" diff --git a/src/dynarmic/tests/A64/fp_min_max.cpp b/src/dynarmic/tests/A64/fp_min_max.cpp index d8b45db807..1669b63071 100644 --- a/src/dynarmic/tests/A64/fp_min_max.cpp +++ b/src/dynarmic/tests/A64/fp_min_max.cpp @@ -12,6 +12,7 @@ #include "dynarmic/common/common_types.h" #include "./testenv.h" +#include "../native/testenv.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp index 885bf3c0e7..2fb5a7b35e 100644 --- a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp +++ b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp @@ -19,6 +19,7 @@ #include "../rand_int.h" #include "../unicorn_emu/a64_unicorn.h" #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/llvm_disassemble.h" @@ -28,7 +29,7 @@ #include "dynarmic/frontend/A64/translate/a64_translate.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/opcodes.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" // Must be declared last for all necessary operator<< to be declared prior to this. #include @@ -271,17 +272,9 @@ static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv const auto get_code = [&jit_env](u64 vaddr) { return jit_env.MemoryReadCode(vaddr); }; IR::Block ir_block = A64::Translate({instructions_start, FP::FPCR{fpcr}}, get_code, {}); - Optimization::A64CallbackConfigPass(ir_block, GetUserConfig(jit_env)); - Optimization::NamingPass(ir_block); - fmt::print("IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); - - Optimization::A64GetSetElimination(ir_block); - Optimization::DeadCodeElimination(ir_block); - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - + Optimization::Optimize(ir_block, conf, {}); fmt::print("Optimized IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); diff --git a/src/dynarmic/tests/A64/misaligned_page_table.cpp b/src/dynarmic/tests/A64/misaligned_page_table.cpp index 8235e14a67..fc0bc77428 100644 --- a/src/dynarmic/tests/A64/misaligned_page_table.cpp +++ b/src/dynarmic/tests/A64/misaligned_page_table.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -6,6 +9,7 @@ #include #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A64/a64.h" TEST_CASE("misaligned load/store do not use page_table when detect_misaligned_access_via_page_table is set", "[a64]") { diff --git a/src/dynarmic/tests/A64/real_world.cpp b/src/dynarmic/tests/A64/real_world.cpp index 07532d95af..a083f16d61 100644 --- a/src/dynarmic/tests/A64/real_world.cpp +++ b/src/dynarmic/tests/A64/real_world.cpp @@ -5,6 +5,7 @@ #include #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A64/a64.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A64/test_invalidation.cpp b/src/dynarmic/tests/A64/test_invalidation.cpp index 168043c1cb..0c92f5f606 100644 --- a/src/dynarmic/tests/A64/test_invalidation.cpp +++ b/src/dynarmic/tests/A64/test_invalidation.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * SPDX-License-Identifier: 0BSD @@ -6,6 +9,7 @@ #include #include "./testenv.h" +#include "../native/testenv.h" #include "dynarmic/interface/A64/a64.h" using namespace Dynarmic; diff --git a/src/dynarmic/tests/A64/testenv.h b/src/dynarmic/tests/A64/testenv.h index 31e338b138..fcdadb23e6 100644 --- a/src/dynarmic/tests/A64/testenv.h +++ b/src/dynarmic/tests/A64/testenv.h @@ -12,7 +12,6 @@ #include "dynarmic/common/assert.h" #include "dynarmic/common/common_types.h" #include "dynarmic/interface/A64/a64.h" -#include "../native/testenv.h" using Vector = Dynarmic::A64::Vector; diff --git a/src/dynarmic/tests/CMakeLists.txt b/src/dynarmic/tests/CMakeLists.txt index 85d86c7966..df90168a52 100644 --- a/src/dynarmic/tests/CMakeLists.txt +++ b/src/dynarmic/tests/CMakeLists.txt @@ -1,3 +1,5 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later include(TargetArchitectureSpecificSources) add_executable(dynarmic_tests @@ -6,33 +8,24 @@ add_executable(dynarmic_tests fp/mantissa_util_tests.cpp fp/unpacked_tests.cpp rand_int.h + # A32 + A32/test_arm_disassembler.cpp + A32/test_arm_instructions.cpp + A32/test_coprocessor.cpp + A32/test_svc.cpp + A32/test_thumb_instructions.cpp + A32/testenv.h + decoder_tests.cpp + # A64 + A64/a64.cpp + A64/fibonacci.cpp + A64/fp_min_max.cpp + A64/misaligned_page_table.cpp + A64/test_invalidation.cpp + A64/real_world.cpp + A64/testenv.h ) - -if ("A32" IN_LIST DYNARMIC_FRONTENDS) - target_sources(dynarmic_tests PRIVATE - A32/test_arm_disassembler.cpp - A32/test_arm_instructions.cpp - A32/test_coprocessor.cpp - A32/test_svc.cpp - A32/test_thumb_instructions.cpp - A32/testenv.h - decoder_tests.cpp - ) -endif() - -if ("A64" IN_LIST DYNARMIC_FRONTENDS) - target_link_libraries(dynarmic_tests PRIVATE merry::oaknut) - - target_sources(dynarmic_tests PRIVATE - A64/a64.cpp - A64/fibonacci.cpp - A64/fp_min_max.cpp - A64/misaligned_page_table.cpp - A64/test_invalidation.cpp - A64/real_world.cpp - A64/testenv.h - ) -endif() +target_link_libraries(dynarmic_tests PRIVATE merry::oaknut) if (DYNARMIC_TESTS_USE_UNICORN) target_link_libraries(dynarmic_tests PRIVATE Unicorn::Unicorn) @@ -40,25 +33,17 @@ if (DYNARMIC_TESTS_USE_UNICORN) target_sources(dynarmic_tests PRIVATE fuzz_util.cpp fuzz_util.h + # A32 + A32/fuzz_arm.cpp + A32/fuzz_thumb.cpp + unicorn_emu/a32_unicorn.cpp + unicorn_emu/a32_unicorn.h + # A64 + A64/fuzz_with_unicorn.cpp + A64/verify_unicorn.cpp + unicorn_emu/a64_unicorn.cpp + unicorn_emu/a64_unicorn.h ) - - if ("A32" IN_LIST DYNARMIC_FRONTENDS) - target_sources(dynarmic_tests PRIVATE - A32/fuzz_arm.cpp - A32/fuzz_thumb.cpp - unicorn_emu/a32_unicorn.cpp - unicorn_emu/a32_unicorn.h - ) - endif() - - if ("A64" IN_LIST DYNARMIC_FRONTENDS) - target_sources(dynarmic_tests PRIVATE - A64/fuzz_with_unicorn.cpp - A64/verify_unicorn.cpp - unicorn_emu/a64_unicorn.cpp - unicorn_emu/a64_unicorn.h - ) - endif() endif() if ("riscv" IN_LIST ARCHITECTURE) @@ -69,9 +54,6 @@ if ("x86_64" IN_LIST ARCHITECTURE) target_link_libraries(dynarmic_tests PRIVATE xbyak::xbyak) target_architecture_specific_sources(dynarmic_tests "x86_64" x64_cpu_info.cpp - ) - - target_architecture_specific_sources(dynarmic_tests "x86_64" native/preserve_xmm.cpp ) @@ -85,54 +67,76 @@ endif() include(CreateDirectoryGroups) -if (("A32" IN_LIST DYNARMIC_FRONTENDS) AND ("A64" IN_LIST DYNARMIC_FRONTENDS)) - add_executable(dynarmic_print_info - print_info.cpp - ) - - create_target_directory_groups(dynarmic_print_info) - - target_link_libraries(dynarmic_print_info PRIVATE dynarmic Boost::headers fmt::fmt merry::mcl) - target_include_directories(dynarmic_print_info PRIVATE . ../src) - target_compile_options(dynarmic_print_info PRIVATE ${DYNARMIC_CXX_FLAGS}) - target_compile_definitions(dynarmic_print_info PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) +# +# dynarmic_print_info +# +add_executable(dynarmic_print_info + print_info.cpp +) +create_target_directory_groups(dynarmic_print_info) +target_link_libraries(dynarmic_print_info PRIVATE dynarmic fmt::fmt merry::mcl) +if (BOOST_NO_HEADERS) + target_link_libraries(dynarmic_print_info PRIVATE Boost::variant Boost::icl Boost::pool) +else() + target_link_libraries(dynarmic_print_info PRIVATE Boost::headers) endif() +target_include_directories(dynarmic_print_info PRIVATE . ../src) +target_compile_options(dynarmic_print_info PRIVATE ${DYNARMIC_CXX_FLAGS}) +target_compile_definitions(dynarmic_print_info PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) -if (("A32" IN_LIST DYNARMIC_FRONTENDS) AND ("A64" IN_LIST DYNARMIC_FRONTENDS)) - add_executable(dynarmic_test_generator - fuzz_util.cpp - fuzz_util.h - test_generator.cpp - ) +# +# dynarmic_test_generator +# +add_executable(dynarmic_test_generator + fuzz_util.cpp + fuzz_util.h + test_generator.cpp +) - create_target_directory_groups(dynarmic_test_generator) +create_target_directory_groups(dynarmic_test_generator) - target_link_libraries(dynarmic_test_generator PRIVATE dynarmic Boost::headers fmt::fmt merry::mcl) - target_include_directories(dynarmic_test_generator PRIVATE . ../src) - target_compile_options(dynarmic_test_generator PRIVATE ${DYNARMIC_CXX_FLAGS}) - target_compile_definitions(dynarmic_test_generator PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) +target_link_libraries(dynarmic_test_generator PRIVATE dynarmic fmt::fmt merry::mcl) +if (BOOST_NO_HEADERS) + target_link_libraries(dynarmic_test_generator PRIVATE Boost::variant Boost::icl Boost::pool) +else() + target_link_libraries(dynarmic_test_generator PRIVATE Boost::headers) endif() +target_include_directories(dynarmic_test_generator PRIVATE . ../src) +target_compile_options(dynarmic_test_generator PRIVATE ${DYNARMIC_CXX_FLAGS}) +target_compile_definitions(dynarmic_test_generator PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) -if (("A32" IN_LIST DYNARMIC_FRONTENDS) AND ("A64" IN_LIST DYNARMIC_FRONTENDS)) - add_executable(dynarmic_test_reader - test_reader.cpp - ) - - create_target_directory_groups(dynarmic_test_reader) - - target_link_libraries(dynarmic_test_reader PRIVATE dynarmic Boost::headers fmt::fmt merry::mcl) - target_include_directories(dynarmic_test_reader PRIVATE . ../src) - target_compile_options(dynarmic_test_reader PRIVATE ${DYNARMIC_CXX_FLAGS}) - target_compile_definitions(dynarmic_test_reader PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) +# +# dynarmic_test_reader +# +add_executable(dynarmic_test_reader + test_reader.cpp +) +create_target_directory_groups(dynarmic_test_reader) +target_link_libraries(dynarmic_test_reader PRIVATE dynarmic fmt::fmt merry::mcl) +if (BOOST_NO_HEADERS) + target_link_libraries(dynarmic_test_reader PRIVATE Boost::variant Boost::icl Boost::pool) +else() + target_link_libraries(dynarmic_test_reader PRIVATE Boost::headers) endif() +target_include_directories(dynarmic_test_reader PRIVATE . ../src) +target_compile_options(dynarmic_test_reader PRIVATE ${DYNARMIC_CXX_FLAGS}) +target_compile_definitions(dynarmic_test_reader PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) +# create_target_directory_groups(dynarmic_tests) -target_link_libraries(dynarmic_tests PRIVATE dynarmic Boost::headers Catch2::Catch2WithMain fmt::fmt merry::mcl) +target_link_libraries(dynarmic_tests PRIVATE dynarmic Catch2::Catch2WithMain fmt::fmt merry::mcl) +if (BOOST_NO_HEADERS) + target_link_libraries(dynarmic_tests PRIVATE Boost::variant Boost::icl Boost::pool) +else() + target_link_libraries(dynarmic_tests PRIVATE Boost::headers) +endif() target_include_directories(dynarmic_tests PRIVATE . ../src) target_compile_options(dynarmic_tests PRIVATE ${DYNARMIC_CXX_FLAGS}) target_compile_definitions(dynarmic_tests PRIVATE FMT_USE_USER_DEFINED_LITERALS=1) -target_compile_options(dynarmic_tests PRIVATE -mavx2) +if ("x86_64" IN_LIST ARCHITECTURE) + target_compile_options(dynarmic_tests PRIVATE -mavx2) +endif() add_test(dynarmic_tests dynarmic_tests --durations yes) diff --git a/src/dynarmic/tests/decoder_tests.cpp b/src/dynarmic/tests/decoder_tests.cpp index e545309960..cdd2c70cd9 100644 --- a/src/dynarmic/tests/decoder_tests.cpp +++ b/src/dynarmic/tests/decoder_tests.cpp @@ -36,22 +36,12 @@ TEST_CASE("ASIMD Decoder: Ensure table order correctness", "[decode][a32][.]") { const auto is_decode_error = [&get_ir](const A32::ASIMDMatcher& matcher, u32 instruction) { const auto block = get_ir(matcher, instruction); - - for (const auto& ir_inst : block) { - if (ir_inst.GetOpcode() == IR::Opcode::A32ExceptionRaised) { - if (static_cast(ir_inst.GetArg(1).GetU64()) == A32::Exception::DecodeError) { - return true; - } - } - } - return false; + return std::find_if(block.cbegin(), block.cend(), [](auto const& e) { + return e.GetOpcode() == IR::Opcode::A32ExceptionRaised && A32::Exception(e.GetArg(1).GetU64()) == A32::Exception::DecodeError; + }) != block.cend(); }; for (auto iter = table.cbegin(); iter != table.cend(); ++iter) { - if (std::strncmp(iter->GetName(), "UNALLOCATED", 11) == 0) { - continue; - } - const u32 expect = iter->GetExpected(); const u32 mask = iter->GetMask(); u32 x = 0; @@ -59,15 +49,17 @@ TEST_CASE("ASIMD Decoder: Ensure table order correctness", "[decode][a32][.]") { const u32 instruction = expect | x; const bool iserr = is_decode_error(*iter, instruction); - const auto alternative = std::find_if(table.cbegin(), iter, [instruction](const auto& m) { return m.Matches(instruction); }); + const auto alternative = std::find_if(table.cbegin(), iter, [instruction](const auto& m) { + return m.Matches(instruction); + }); const bool altiserr = is_decode_error(*alternative, instruction); INFO("Instruction: " << std::hex << std::setfill('0') << std::setw(8) << instruction); INFO("Expect: " << std::hex << std::setfill('0') << std::setw(8) << expect); INFO("Fill: " << std::hex << std::setfill('0') << std::setw(8) << x); - INFO("Name: " << iter->GetName()); + //INFO("Name: " << *A32::GetNameASIMD(instruction)); INFO("iserr: " << iserr); - INFO("alternative: " << alternative->GetName()); + //INFO("alternative: " << alternative->GetName()); INFO("altiserr: " << altiserr); REQUIRE(((!iserr && alternative == iter) || (iserr && alternative != iter && !altiserr))); @@ -75,4 +67,4 @@ TEST_CASE("ASIMD Decoder: Ensure table order correctness", "[decode][a32][.]") { x = ((x | mask) + 1) & ~mask; } while (x != 0); } -} +} \ No newline at end of file diff --git a/src/dynarmic/tests/native/preserve_xmm.cpp b/src/dynarmic/tests/native/preserve_xmm.cpp index 0f69697b7a..7421252063 100644 --- a/src/dynarmic/tests/native/preserve_xmm.cpp +++ b/src/dynarmic/tests/native/preserve_xmm.cpp @@ -6,6 +6,7 @@ #include #include "../A64/testenv.h" +#include "../native/testenv.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/interface/exclusive_monitor.h" diff --git a/src/dynarmic/tests/print_info.cpp b/src/dynarmic/tests/print_info.cpp index ef8b87bbd1..3d1268f467 100644 --- a/src/dynarmic/tests/print_info.cpp +++ b/src/dynarmic/tests/print_info.cpp @@ -32,27 +32,26 @@ #include "dynarmic/frontend/A64/translate/a64_translate.h" #include "dynarmic/frontend/A64/translate/impl/impl.h" #include "dynarmic/interface/A32/a32.h" +#include "dynarmic/interface/A32/config.h" #include "dynarmic/interface/A32/disassembler.h" #include "dynarmic/ir/basic_block.h" -#include "dynarmic/ir/opt/passes.h" +#include "dynarmic/ir/opt_passes.h" using namespace Dynarmic; -const char* GetNameOfA32Instruction(u32 instruction) { - if (auto vfp_decoder = A32::DecodeVFP(instruction)) { - return vfp_decoder->get().GetName(); - } else if (auto asimd_decoder = A32::DecodeASIMD(instruction)) { - return asimd_decoder->get().GetName(); - } else if (auto decoder = A32::DecodeArm(instruction)) { - return decoder->get().GetName(); - } +std::string_view GetNameOfA32Instruction(u32 instruction) { + //if (auto const vfp_decoder = A32::DecodeVFP(instruction)) + // return *A32::GetNameVFP(instruction); + //else if (auto const asimd_decoder = A32::DecodeASIMD(instruction)) + // return *A32::GetNameASIMD(instruction); + //else if (auto const decoder = A32::DecodeArm(instruction)) + // return *A32::GetNameARM(instruction); return ""; } -const char* GetNameOfA64Instruction(u32 instruction) { - if (auto decoder = A64::Decode(instruction)) { - return decoder->get().GetName(); - } +std::string_view GetNameOfA64Instruction(u32 instruction) { + //if (auto const decoder = A64::Decode(instruction)) + // return *A64::GetName(instruction); return ""; } @@ -64,18 +63,9 @@ void PrintA32Instruction(u32 instruction) { IR::Block ir_block{location}; const bool should_continue = A32::TranslateSingleInstruction(ir_block, location, instruction); fmt::print("should_continue: {}\n\n", should_continue); - - Optimization::NamingPass(ir_block); - fmt::print("IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); - - Optimization::A32GetSetElimination(ir_block, {}); - Optimization::DeadCodeElimination(ir_block); - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - Optimization::IdentityRemovalPass(ir_block); - + Optimization::Optimize(ir_block, A32::UserConfig{}, {}); fmt::print("Optimized IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); } @@ -88,18 +78,9 @@ void PrintA64Instruction(u32 instruction) { IR::Block ir_block{location}; const bool should_continue = A64::TranslateSingleInstruction(ir_block, location, instruction); fmt::print("should_continue: {}\n\n", should_continue); - - Optimization::NamingPass(ir_block); - fmt::print("IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); - - Optimization::A64GetSetElimination(ir_block); - Optimization::DeadCodeElimination(ir_block); - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - Optimization::IdentityRemovalPass(ir_block); - + Optimization::Optimize(ir_block, A64::UserConfig{}, {}); fmt::print("Optimized IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); } @@ -115,18 +96,9 @@ void PrintThumbInstruction(u32 instruction) { IR::Block ir_block{location}; const bool should_continue = A32::TranslateSingleInstruction(ir_block, location, instruction); fmt::print("should_continue: {}\n\n", should_continue); - - Optimization::NamingPass(ir_block); - fmt::print("IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); - - Optimization::A32GetSetElimination(ir_block, {}); - Optimization::DeadCodeElimination(ir_block); - Optimization::ConstantPropagation(ir_block); - Optimization::DeadCodeElimination(ir_block); - Optimization::IdentityRemovalPass(ir_block); - + Optimization::Optimize(ir_block, A32::UserConfig{}, {}); fmt::print("Optimized IR:\n"); fmt::print("{}\n", IR::DumpBlock(ir_block)); } diff --git a/src/frontend_common/content_manager.h b/src/frontend_common/content_manager.h index c4e97a47b8..4f3112e3fb 100644 --- a/src/frontend_common/content_manager.h +++ b/src/frontend_common/content_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -160,7 +163,7 @@ inline InstallResult InstallNSP(Core::System& system, FileSys::VfsFilesystem& vf std::shared_ptr nsp; FileSys::VirtualFile file = vfs.OpenFile(filename, FileSys::OpenMode::Read); - if (boost::to_lower_copy(file->GetName()).ends_with(std::string("nsp"))) { + if (boost::to_lower_copy(file->GetName()).ends_with("nsp")) { nsp = std::make_shared(file); if (nsp->IsExtractedType()) { return InstallResult::Failure; diff --git a/src/frontend_common/firmware_manager.h b/src/frontend_common/firmware_manager.h index 20f3b41478..23fce59eb3 100644 --- a/src/frontend_common/firmware_manager.h +++ b/src/frontend_common/firmware_manager.h @@ -7,6 +7,7 @@ #include "common/common_types.h" #include "core/core.h" #include "core/file_sys/nca_metadata.h" +#include "core/file_sys/content_archive.h" #include "core/file_sys/registered_cache.h" #include "core/hle/service/filesystem/filesystem.h" #include @@ -143,6 +144,8 @@ inline std::pair GetFirmwareVersion return {firmware_data, result}; } + +// TODO(crueter): GET AS STRING } -#endif // FIRMWARE_MANAGER_H +#endif diff --git a/src/hid_core/frontend/emulated_controller.cpp b/src/hid_core/frontend/emulated_controller.cpp index 5bdad4a0ad..0ddab89da3 100644 --- a/src/hid_core/frontend/emulated_controller.cpp +++ b/src/hid_core/frontend/emulated_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include -#include "common/polyfill_ranges.h" +#include #include "common/thread.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/frontend/input_converter.h" @@ -574,7 +577,7 @@ void EmulatedController::UnloadInput() { } void EmulatedController::EnableConfiguration() { - std::scoped_lock lock{connect_mutex, npad_mutex}; + std::unique_lock lock1{connect_mutex}, lock2{npad_mutex}; is_configuring = true; tmp_is_connected = is_connected; tmp_npad_type = npad_type; @@ -611,19 +614,19 @@ void EmulatedController::DisableConfiguration() { } void EmulatedController::EnableSystemButtons() { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; system_buttons_enabled = true; } void EmulatedController::DisableSystemButtons() { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; system_buttons_enabled = false; controller.home_button_state.raw = 0; controller.capture_button_state.raw = 0; } void EmulatedController::ResetSystemButtons() { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; controller.home_button_state.home.Assign(false); controller.capture_button_state.capture.Assign(false); } @@ -934,7 +937,7 @@ void EmulatedController::SetStick(const Common::Input::CallbackStatus& callback, auto trigger_guard = SCOPE_GUARD { TriggerOnChange(ControllerTriggerType::Stick, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; const auto stick_value = TransformToStick(callback); // Only read stick values that have the same uuid or are over the threshold to avoid flapping @@ -991,7 +994,7 @@ void EmulatedController::SetTrigger(const Common::Input::CallbackStatus& callbac auto trigger_guard = SCOPE_GUARD { TriggerOnChange(ControllerTriggerType::Trigger, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; const auto trigger_value = TransformToTrigger(callback); // Only read trigger values that have the same uuid or are pressed once @@ -1039,7 +1042,7 @@ void EmulatedController::SetMotion(const Common::Input::CallbackStatus& callback SCOPE_EXIT { TriggerOnChange(ControllerTriggerType::Motion, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; auto& raw_status = controller.motion_values[index].raw_status; auto& emulated = controller.motion_values[index].emulated; @@ -1075,7 +1078,7 @@ void EmulatedController::SetColors(const Common::Input::CallbackStatus& callback auto trigger_guard = SCOPE_GUARD { TriggerOnChange(ControllerTriggerType::Color, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; controller.color_values[index] = TransformToColor(callback); if (is_configuring) { @@ -1126,7 +1129,7 @@ void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callbac SCOPE_EXIT { TriggerOnChange(ControllerTriggerType::Battery, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; controller.battery_values[index] = TransformToBattery(callback); if (is_configuring) { @@ -1191,7 +1194,7 @@ void EmulatedController::SetCamera(const Common::Input::CallbackStatus& callback SCOPE_EXIT { TriggerOnChange(ControllerTriggerType::IrSensor, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; controller.camera_values = TransformToCamera(callback); if (is_configuring) { @@ -1208,7 +1211,7 @@ void EmulatedController::SetRingAnalog(const Common::Input::CallbackStatus& call SCOPE_EXIT { TriggerOnChange(ControllerTriggerType::RingController, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; const auto force_value = TransformToStick(callback); controller.ring_analog_value = force_value.x; @@ -1224,7 +1227,7 @@ void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) { SCOPE_EXIT { TriggerOnChange(ControllerTriggerType::Nfc, !is_configuring); }; - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; controller.nfc_values = TransformToNfc(callback); if (is_configuring) { @@ -1308,9 +1311,9 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV : Common::Input::VibrationAmplificationType::Linear; const Common::Input::VibrationStatus status = { - .low_amplitude = std::min(vibration.low_amplitude * strength, 1.0f), + .low_amplitude = (std::min)(vibration.low_amplitude * strength, 1.0f), .low_frequency = vibration.low_frequency, - .high_amplitude = std::min(vibration.high_amplitude * strength, 1.0f), + .high_amplitude = (std::min)(vibration.high_amplitude * strength, 1.0f), .high_frequency = vibration.high_frequency, .type = type, }; @@ -1659,7 +1662,7 @@ void EmulatedController::SetSupportedNpadStyleTag(NpadStyleTag supported_styles) } bool EmulatedController::IsControllerFullkey(bool use_temporary_value) const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type; switch (type) { case NpadStyleIndex::Fullkey: @@ -1675,7 +1678,7 @@ bool EmulatedController::IsControllerFullkey(bool use_temporary_value) const { } bool EmulatedController::IsControllerSupported(bool use_temporary_value) const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type; switch (type) { case NpadStyleIndex::Fullkey: @@ -1715,7 +1718,7 @@ void EmulatedController::Connect(bool use_temporary_value) { auto trigger_guard = SCOPE_GUARD { TriggerOnChange(ControllerTriggerType::Connected, !is_configuring); }; - std::scoped_lock lock{connect_mutex, mutex}; + std::unique_lock lock1{connect_mutex}, lock2{mutex}; if (is_configuring) { tmp_is_connected = true; return; @@ -1732,7 +1735,7 @@ void EmulatedController::Disconnect() { auto trigger_guard = SCOPE_GUARD { TriggerOnChange(ControllerTriggerType::Disconnected, !is_configuring); }; - std::scoped_lock lock{connect_mutex, mutex}; + std::unique_lock lock1{connect_mutex}, lock2{mutex}; if (is_configuring) { tmp_is_connected = false; return; @@ -1746,23 +1749,21 @@ void EmulatedController::Disconnect() { } bool EmulatedController::IsConnected(bool get_temporary_value) const { - std::scoped_lock lock{connect_mutex}; - if (get_temporary_value && is_configuring) { + std::shared_lock lock{connect_mutex}; + if (get_temporary_value && is_configuring) return tmp_is_connected; - } return is_connected; } NpadIdType EmulatedController::GetNpadIdType() const { - std::scoped_lock lock{mutex}; + std::shared_lock lock{mutex}; return npad_id_type; } NpadStyleIndex EmulatedController::GetNpadStyleIndex(bool get_temporary_value) const { - std::scoped_lock lock{npad_mutex}; - if (get_temporary_value && is_configuring) { + std::shared_lock lock{npad_mutex}; + if (get_temporary_value && is_configuring) return tmp_npad_type; - } return npad_type; } @@ -1770,7 +1771,7 @@ void EmulatedController::SetNpadStyleIndex(NpadStyleIndex npad_type_) { auto trigger_guard = SCOPE_GUARD { TriggerOnChange(ControllerTriggerType::Type, !is_configuring); }; - std::scoped_lock lock{mutex, npad_mutex}; + std::unique_lock lock1{mutex}, lock2{npad_mutex}; if (is_configuring) { if (tmp_npad_type == npad_type_) { @@ -1816,37 +1817,37 @@ LedPattern EmulatedController::GetLedPattern() const { } ButtonValues EmulatedController::GetButtonsValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.button_values; } SticksValues EmulatedController::GetSticksValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.stick_values; } TriggerValues EmulatedController::GetTriggersValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.trigger_values; } ControllerMotionValues EmulatedController::GetMotionValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.motion_values; } ColorValues EmulatedController::GetColorsValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.color_values; } BatteryValues EmulatedController::GetBatteryValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.battery_values; } CameraValues EmulatedController::GetCameraValues() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.camera_values; } @@ -1855,7 +1856,7 @@ RingAnalogValue EmulatedController::GetRingSensorValues() const { } HomeButtonState EmulatedController::GetHomeButtons() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; if (is_configuring) { return {}; } @@ -1863,7 +1864,7 @@ HomeButtonState EmulatedController::GetHomeButtons() const { } CaptureButtonState EmulatedController::GetCaptureButtons() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; if (is_configuring) { return {}; } @@ -1871,7 +1872,7 @@ CaptureButtonState EmulatedController::GetCaptureButtons() const { } NpadButtonState EmulatedController::GetNpadButtons() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; if (is_configuring) { return {}; } @@ -1879,7 +1880,7 @@ NpadButtonState EmulatedController::GetNpadButtons() const { } DebugPadButton EmulatedController::GetDebugPadButtons() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; if (is_configuring) { return {}; } @@ -1887,7 +1888,7 @@ DebugPadButton EmulatedController::GetDebugPadButtons() const { } AnalogSticks EmulatedController::GetSticks() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; if (is_configuring) { return {}; @@ -1897,7 +1898,7 @@ AnalogSticks EmulatedController::GetSticks() const { } NpadGcTriggerState EmulatedController::GetTriggers() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; if (is_configuring) { return {}; } @@ -1910,17 +1911,17 @@ MotionState EmulatedController::GetMotions() const { } ControllerColors EmulatedController::GetColors() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.colors_state; } BatteryLevelState EmulatedController::GetBattery() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.battery_state; } const CameraState& EmulatedController::GetCamera() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.camera_state; } @@ -1929,7 +1930,7 @@ RingSensorForce EmulatedController::GetRingSensorForce() const { } const NfcState& EmulatedController::GetNfc() const { - std::scoped_lock lock{mutex}; + std::unique_lock lock{mutex}; return controller.nfc_state; } @@ -1943,7 +1944,7 @@ NpadColor EmulatedController::GetNpadColor(u32 color) { } void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) { - std::scoped_lock lock{callback_mutex}; + std::unique_lock lock{callback_mutex}; for (const auto& poller_pair : callback_list) { const ControllerUpdateCallback& poller = poller_pair.second; if (!is_npad_service_update && poller.is_npad_service) { @@ -1956,13 +1957,13 @@ void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npa } int EmulatedController::SetCallback(ControllerUpdateCallback update_callback) { - std::scoped_lock lock{callback_mutex}; + std::unique_lock lock{callback_mutex}; callback_list.insert_or_assign(last_callback_key, std::move(update_callback)); return last_callback_key++; } void EmulatedController::DeleteCallback(int key) { - std::scoped_lock lock{callback_mutex}; + std::unique_lock lock{callback_mutex}; const auto& iterator = callback_list.find(key); if (iterator == callback_list.end()) { LOG_ERROR(Input, "Tried to delete non-existent callback {}", key); diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h index 17ad6069e0..677b363157 100644 --- a/src/hid_core/frontend/emulated_controller.h +++ b/src/hid_core/frontend/emulated_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,6 +10,7 @@ #include #include #include +#include #include #include @@ -626,10 +630,10 @@ private: StickDevices virtual_stick_devices; ControllerMotionDevices virtual_motion_devices; - mutable std::mutex mutex; - mutable std::mutex callback_mutex; - mutable std::mutex npad_mutex; - mutable std::mutex connect_mutex; + mutable std::shared_mutex mutex; + mutable std::shared_mutex callback_mutex; + mutable std::shared_mutex npad_mutex; + mutable std::shared_mutex connect_mutex; std::unordered_map callback_list; int last_callback_key = 0; diff --git a/src/hid_core/hidbus/ringcon.cpp b/src/hid_core/hidbus/ringcon.cpp index 4f5eaa5053..1927a6f856 100644 --- a/src/hid_core/hidbus/ringcon.cpp +++ b/src/hid_core/hidbus/ringcon.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -283,7 +286,7 @@ u8 RingController::GetCrcValue(const std::vector& data) const { template u64 RingController::GetData(const T& reply, std::span out_data) const { static_assert(std::is_trivially_copyable_v); - const auto data_size = static_cast(std::min(sizeof(reply), out_data.size())); + const auto data_size = static_cast((std::min)(sizeof(reply), out_data.size())); std::memcpy(out_data.data(), &reply, data_size); return data_size; } diff --git a/src/hid_core/irsensor/image_transfer_processor.cpp b/src/hid_core/irsensor/image_transfer_processor.cpp index 2b5a50ef6f..fb3e424d91 100644 --- a/src/hid_core/irsensor/image_transfer_processor.cpp +++ b/src/hid_core/irsensor/image_transfer_processor.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -146,7 +149,7 @@ void ImageTransferProcessor::SetTransferMemoryAddress(Common::ProcessAddress t_m Core::IrSensor::ImageTransferProcessorState ImageTransferProcessor::GetState( std::span data) const { - const auto size = std::min(GetDataSize(current_config.trimming_format), data.size()); + const auto size = (std::min)(GetDataSize(current_config.trimming_format), data.size()); system.ApplicationMemory().ReadBlock(transfer_memory, data.data(), size); return processor_state; } diff --git a/src/hid_core/resources/abstracted_pad/abstract_battery_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_battery_handler.cpp index 62fbbb0a7e..d5f37247e1 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_battery_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_battery_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -30,7 +33,7 @@ void NpadAbstractBatteryHandler::SetPropertiesHandler(NpadAbstractPropertiesHand } Result NpadAbstractBatteryHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp index 5871694335..36deb25c94 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -30,7 +33,7 @@ void NpadAbstractButtonHandler::SetPropertiesHandler(NpadAbstractPropertiesHandl } Result NpadAbstractButtonHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp index e399edfd70..16ec2257fb 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_ir_sensor_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -24,7 +27,7 @@ void NpadAbstractIrSensorHandler::SetPropertiesHandler(NpadAbstractPropertiesHan } Result NpadAbstractIrSensorHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp index 0b2bfe88da..813d3d3188 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_led_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -29,7 +32,7 @@ void NpadAbstractLedHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler* } Result NpadAbstractLedHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_mcu_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_mcu_handler.cpp index 6f35bd95cc..2b763d8e0f 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_mcu_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_mcu_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -22,7 +25,7 @@ void NpadAbstractMcuHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler* } Result NpadAbstractMcuHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_nfc_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_nfc_handler.cpp index bd9b79333c..80f5f3ba62 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_nfc_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_nfc_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -24,7 +27,7 @@ void NpadAbstractNfcHandler::SetPropertiesHandler(NpadAbstractPropertiesHandler* } Result NpadAbstractNfcHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp index 435b095f02..d7cf2bba9b 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_pad.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_pad.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -68,7 +71,7 @@ void AbstractPad::SetNpadId(Core::HID::NpadIdType npad_id) { } Result AbstractPad::Activate() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } diff --git a/src/hid_core/resources/abstracted_pad/abstract_pad_holder.cpp b/src/hid_core/resources/abstracted_pad/abstract_pad_holder.cpp index 8334dc34f6..d9b20ecb66 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_pad_holder.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_pad_holder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -73,7 +76,7 @@ u64 NpadAbstractedPadHolder::RemoveAbstractPadByAssignmentStyle( } u32 NpadAbstractedPadHolder::GetAbstractedPads(std::span list) const { - u32 num_elements = std::min(static_cast(list.size()), list_size); + u32 num_elements = (std::min)(static_cast(list.size()), list_size); for (std::size_t i = 0; i < num_elements; i++) { list[i] = assignment_list[i].abstracted_pad; } diff --git a/src/hid_core/resources/abstracted_pad/abstract_palma_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_palma_handler.cpp index 04d276d617..7766bedfd0 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_palma_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_palma_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -25,7 +28,7 @@ void NpadAbstractPalmaHandler::SetPalmaResource(PalmaResource* resource) { } Result NpadAbstractPalmaHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_properties_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_properties_handler.cpp index 36b630c7f4..c225670043 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_properties_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_properties_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -38,7 +41,7 @@ Core::HID::NpadIdType NpadAbstractPropertiesHandler::GetNpadId() const { } Result NpadAbstractPropertiesHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } diff --git a/src/hid_core/resources/abstracted_pad/abstract_sixaxis_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_sixaxis_handler.cpp index 0dde244ef8..a8d2e5b2a0 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_sixaxis_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_sixaxis_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -33,7 +36,7 @@ void NpadAbstractSixAxisHandler::SetSixaxisResource(SixAxisResource* resource) { } Result NpadAbstractSixAxisHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp index ca64b0a437..3266422133 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_vibration_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -55,7 +58,7 @@ void NpadAbstractVibrationHandler::SetGcVibration(NpadGcVibrationDevice* gc_devi } Result NpadAbstractVibrationHandler::IncrementRefCounter() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadHandlerOverflow; } ref_counter++; diff --git a/src/hid_core/resources/applet_resource.cpp b/src/hid_core/resources/applet_resource.cpp index 243beb1c7f..31480a0e90 100644 --- a/src/hid_core/resources/applet_resource.cpp +++ b/src/hid_core/resources/applet_resource.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -271,7 +274,7 @@ void AppletResource::EnablePalmaBoostMode(u64 aruid, bool is_enabled) { } Result AppletResource::RegisterCoreAppletResource() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultAppletResourceOverflow; } if (ref_counter == 0) { diff --git a/src/hid_core/resources/applet_resource.h b/src/hid_core/resources/applet_resource.h index 69ea46b957..4b7584b962 100644 --- a/src/hid_core/resources/applet_resource.h +++ b/src/hid_core/resources/applet_resource.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -5,6 +8,7 @@ #include #include +#include #include "common/bit_field.h" #include "common/common_types.h" diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index ca1ccd659c..a0f72ab298 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -55,7 +58,7 @@ NPad::~NPad() { } Result NPad::Activate() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultNpadResourceOverflow; } diff --git a/src/hid_core/resources/npad/npad_data.cpp b/src/hid_core/resources/npad/npad_data.cpp index 29ad5cb08c..a4b46a1ecf 100644 --- a/src/hid_core/resources/npad/npad_data.cpp +++ b/src/hid_core/resources/npad/npad_data.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -46,7 +49,7 @@ Result NPadData::SetSupportedNpadIdType(std::span l } std::size_t NPadData::GetSupportedNpadIdType(std::span out_list) const { - std::size_t out_size = std::min(supported_npad_id_types_count, out_list.size()); + std::size_t out_size = (std::min)(supported_npad_id_types_count, out_list.size()); memcpy(out_list.data(), supported_npad_id_types.data(), out_size * sizeof(Core::HID::NpadIdType)); diff --git a/src/hid_core/resources/npad/npad_resource.cpp b/src/hid_core/resources/npad/npad_resource.cpp index 79f7d74c0c..08546f8dc4 100644 --- a/src/hid_core/resources/npad/npad_resource.cpp +++ b/src/hid_core/resources/npad/npad_resource.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -126,7 +129,7 @@ Result NPadResource::Activate(u64 aruid) { } Result NPadResource::Activate() { - if (ref_counter == std::numeric_limits::max() - 1) { + if (ref_counter == (std::numeric_limits::max)() - 1) { return ResultAppletResourceOverflow; } if (ref_counter == 0) { diff --git a/src/hid_core/resources/npad/npad_vibration.h b/src/hid_core/resources/npad/npad_vibration.h index 6412ca4ab0..59e29b9f90 100644 --- a/src/hid_core/resources/npad/npad_vibration.h +++ b/src/hid_core/resources/npad/npad_vibration.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include +#include #include "common/common_types.h" #include "core/hle/result.h" diff --git a/src/hid_core/resources/palma/palma.cpp b/src/hid_core/resources/palma/palma.cpp index be3d3c0edd..0652455f5f 100644 --- a/src/hid_core/resources/palma/palma.cpp +++ b/src/hid_core/resources/palma/palma.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -62,7 +65,7 @@ Result Palma::GetPalmaOperationInfo(const PalmaConnectionHandle& handle, } operation_type = static_cast(operation.operation); std::memcpy(out_data.data(), operation.data.data(), - std::min(out_data.size(), operation.data.size())); + (std::min)(out_data.size(), operation.data.size())); return ResultSuccess; } diff --git a/src/hid_core/resources/touch_screen/gesture.h b/src/hid_core/resources/touch_screen/gesture.h index d92912bb6e..3fa1933fe8 100644 --- a/src/hid_core/resources/touch_screen/gesture.h +++ b/src/hid_core/resources/touch_screen/gesture.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include +#include #include "common/common_types.h" #include "core/hle/result.h" diff --git a/src/hid_core/resources/touch_screen/gesture_handler.cpp b/src/hid_core/resources/touch_screen/gesture_handler.cpp index 4fcaf6ecf1..8e5ed8ff7e 100644 --- a/src/hid_core/resources/touch_screen/gesture_handler.cpp +++ b/src/hid_core/resources/touch_screen/gesture_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -16,7 +19,7 @@ GestureHandler::~GestureHandler() {} void GestureHandler::SetTouchState(std::span touch_state, u32 count, s64 timestamp) { gesture = {}; - gesture.active_points = std::min(MaxPoints, static_cast(count)); + gesture.active_points = (std::min)(MaxPoints, static_cast(count)); for (size_t id = 0; id < gesture.active_points; ++id) { const auto& [active_x, active_y] = touch_state[id].position; diff --git a/src/hid_core/resources/touch_screen/touch_screen.h b/src/hid_core/resources/touch_screen/touch_screen.h index 2fcb6247f1..f56f7b3839 100644 --- a/src/hid_core/resources/touch_screen/touch_screen.h +++ b/src/hid_core/resources/touch_screen/touch_screen.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include +#include #include "common/common_types.h" #include "core/hle/result.h" diff --git a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp index 79ddaa4dfa..5d45f861c6 100644 --- a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp +++ b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -25,8 +28,8 @@ TouchResource::~TouchResource() { }; Result TouchResource::ActivateTouch() { - if (global_ref_counter == std::numeric_limits::max() - 1 || - touch_ref_counter == std::numeric_limits::max() - 1) { + if (global_ref_counter == (std::numeric_limits::max)() - 1 || + touch_ref_counter == (std::numeric_limits::max)() - 1) { return ResultTouchOverflow; } @@ -91,8 +94,8 @@ Result TouchResource::ActivateTouch(u64 aruid) { } Result TouchResource::ActivateGesture() { - if (global_ref_counter == std::numeric_limits::max() - 1 || - gesture_ref_counter == std::numeric_limits::max() - 1) { + if (global_ref_counter == (std::numeric_limits::max)() - 1 || + gesture_ref_counter == (std::numeric_limits::max)() - 1) { return ResultGestureOverflow; } diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index 43f3d6078e..fb2d75e384 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/param_package.h" -#include "common/polyfill_ranges.h" +#include #include "common/polyfill_thread.h" #include "common/settings.h" #include "common/thread.h" diff --git a/src/input_common/drivers/mouse.cpp b/src/input_common/drivers/mouse.cpp index 4af2dd36f5..0949e1e2ad 100644 --- a/src/input_common/drivers/mouse.cpp +++ b/src/input_common/drivers/mouse.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -102,11 +105,11 @@ void Mouse::UpdateStickInput() { SetAxis(identifier, mouse_axis_y, -last_mouse_change.y); // Decay input over time - const float clamped_length = std::min(1.0f, length); + const float clamped_length = (std::min)(1.0f, length); const float decay_strength = Settings::values.mouse_panning_decay_strength.GetValue(); const float decay = 1 - clamped_length * clamped_length * decay_strength * 0.01f; const float min_decay = Settings::values.mouse_panning_min_decay.GetValue(); - const float clamped_decay = std::min(1 - min_decay / 100.0f, decay); + const float clamped_decay = (std::min)(1 - min_decay / 100.0f, decay); last_mouse_change *= clamped_decay; } diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 51169c6f2b..972abec9fe 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -120,7 +120,7 @@ public: f32 low_frequency_scale = 1.0f; if (vibration.low_frequency > low_start_sensitivity_limit) { low_frequency_scale = - std::max(1.0f - (vibration.low_frequency - low_start_sensitivity_limit) / + (std::max)(1.0f - (vibration.low_frequency - low_start_sensitivity_limit) / low_width_sensitivity_limit, 0.3f); } @@ -129,7 +129,7 @@ public: f32 high_frequency_scale = 1.0f; if (vibration.high_frequency > high_start_sensitivity_limit) { high_frequency_scale = - std::max(1.0f - (vibration.high_frequency - high_start_sensitivity_limit) / + (std::max)(1.0f - (vibration.high_frequency - high_start_sensitivity_limit) / high_width_sensitivity_limit, 0.3f); } diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp index d483cd3490..fea33335ae 100644 --- a/src/input_common/drivers/udp_client.cpp +++ b/src/input_common/drivers/udp_client.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -615,8 +618,8 @@ CalibrationConfigurationJob::CalibrationConfigurationJob( } LOG_DEBUG(Input, "Current touch: {} {}", data.touch[0].x, data.touch[0].y); - min_x = std::min(min_x, static_cast(data.touch[0].x)); - min_y = std::min(min_y, static_cast(data.touch[0].y)); + min_x = (std::min)(min_x, static_cast(data.touch[0].x)); + min_y = (std::min)(min_y, static_cast(data.touch[0].y)); if (current_status == Status::Ready) { // First touch - min data (min_x/min_y) current_status = Status::Stage1Completed; diff --git a/src/input_common/helpers/joycon_protocol/calibration.cpp b/src/input_common/helpers/joycon_protocol/calibration.cpp index 1300ecaf53..105172c352 100644 --- a/src/input_common/helpers/joycon_protocol/calibration.cpp +++ b/src/input_common/helpers/joycon_protocol/calibration.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -140,8 +143,8 @@ Common::Input::DriverResult CalibrationProtocol::GetRingCalibration(RingCalibrat ring_data_min = current_value - DefaultRingRange; ring_data_default = current_value; } - ring_data_max = std::max(ring_data_max, current_value); - ring_data_min = std::min(ring_data_min, current_value); + ring_data_max = (std::max)(ring_data_max, current_value); + ring_data_min = (std::min)(ring_data_min, current_value); calibration = { .default_value = ring_data_default, .max_value = ring_data_max, diff --git a/src/input_common/helpers/joycon_protocol/nfc.cpp b/src/input_common/helpers/joycon_protocol/nfc.cpp index db83f9ef48..67f789edd8 100644 --- a/src/input_common/helpers/joycon_protocol/nfc.cpp +++ b/src/input_common/helpers/joycon_protocol/nfc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -327,7 +330,7 @@ Common::Input::DriverResult NfcProtocol::IsTagInRange(TagFoundData& data, (output.mcu_data[6] != 0x09 && output.mcu_data[6] != 0x04)); data.type = output.mcu_data[12]; - data.uuid_size = std::min(output.mcu_data[14], static_cast(sizeof(TagUUID))); + data.uuid_size = (std::min)(output.mcu_data[14], static_cast(sizeof(TagUUID))); memcpy(data.uuid.data(), output.mcu_data.data() + 15, data.uuid.size()); return Common::Input::DriverResult::Success; @@ -433,7 +436,7 @@ Common::Input::DriverResult NfcProtocol::WriteAmiiboData(const TagUUID& tag_uuid // Send Data. Nfc buffer size is 31, Send the data in smaller packages while (current_position < buffer.size() && tries++ < timeout_limit) { const std::size_t next_position = - std::min(current_position + sizeof(NFCRequestState::raw_data), buffer.size()); + (std::min)(current_position + sizeof(NFCRequestState::raw_data), buffer.size()); const std::size_t block_size = next_position - current_position; const bool is_last_packet = block_size < sizeof(NFCRequestState::raw_data); @@ -479,7 +482,7 @@ Common::Input::DriverResult NfcProtocol::GetMifareData( // Send data request. Nfc buffer size is 31, Send the data in smaller packages while (current_position < buffer.size() && tries++ < timeout_limit) { const std::size_t next_position = - std::min(current_position + sizeof(NFCRequestState::raw_data), buffer.size()); + (std::min)(current_position + sizeof(NFCRequestState::raw_data), buffer.size()); const std::size_t block_size = next_position - current_position; const bool is_last_packet = block_size < sizeof(NFCRequestState::raw_data); @@ -559,7 +562,7 @@ Common::Input::DriverResult NfcProtocol::WriteMifareData( // Send data request. Nfc buffer size is 31, Send the data in smaller packages while (current_position < buffer.size() && tries++ < timeout_limit) { const std::size_t next_position = - std::min(current_position + sizeof(NFCRequestState::raw_data), buffer.size()); + (std::min)(current_position + sizeof(NFCRequestState::raw_data), buffer.size()); const std::size_t block_size = next_position - current_position; const bool is_last_packet = block_size < sizeof(NFCRequestState::raw_data); @@ -731,7 +734,7 @@ Common::Input::DriverResult NfcProtocol::SendWriteDataAmiiboRequest(MCUCommandRe u8 block_id, bool is_last_packet, std::span data) { - const auto data_size = std::min(data.size(), sizeof(NFCRequestState::raw_data)); + const auto data_size = (std::min)(data.size(), sizeof(NFCRequestState::raw_data)); NFCRequestState request{ .command_argument = NFCCommand::WriteNtag, .block_id = block_id, @@ -754,7 +757,7 @@ Common::Input::DriverResult NfcProtocol::SendWriteDataAmiiboRequest(MCUCommandRe Common::Input::DriverResult NfcProtocol::SendReadDataMifareRequest(MCUCommandResponse& output, u8 block_id, bool is_last_packet, std::span data) { - const auto data_size = std::min(data.size(), sizeof(NFCRequestState::raw_data)); + const auto data_size = (std::min)(data.size(), sizeof(NFCRequestState::raw_data)); NFCRequestState request{ .command_argument = NFCCommand::Mifare, .block_id = block_id, diff --git a/src/input_common/helpers/joycon_protocol/rumble.cpp b/src/input_common/helpers/joycon_protocol/rumble.cpp index 9fd0b84708..62ad0fada0 100644 --- a/src/input_common/helpers/joycon_protocol/rumble.cpp +++ b/src/input_common/helpers/joycon_protocol/rumble.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,7 +32,7 @@ Common::Input::DriverResult RumbleProtocol::SendVibration(const VibrationValue& // Protect joycons from damage from strong vibrations const f32 clamp_amplitude = - 1.0f / std::max(1.0f, vibration.high_amplitude + vibration.low_amplitude); + 1.0f / (std::max)(1.0f, vibration.high_amplitude + vibration.low_amplitude); const u16 encoded_high_frequency = EncodeHighFrequency(vibration.high_frequency); const u8 encoded_high_amplitude = diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index d0787b0936..598cc2e1be 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later @@ -19,9 +22,9 @@ add_library(network STATIC create_target_directory_groups(network) -target_link_libraries(network PRIVATE common enet Boost::headers) +target_link_libraries(network PRIVATE common enet::enet Boost::headers) if (ENABLE_WEB_SERVICE) - target_compile_definitions(network PRIVATE -DENABLE_WEB_SERVICE) + target_compile_definitions(network PRIVATE ENABLE_WEB_SERVICE) target_link_libraries(network PRIVATE web_service) endif() diff --git a/src/network/announce_multiplayer_session.h b/src/network/announce_multiplayer_session.h index 9d9673d97a..4e5cd33e1f 100644 --- a/src/network/announce_multiplayer_session.h +++ b/src/network/announce_multiplayer_session.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/network/network.cpp b/src/network/network.cpp index 0314b51d2c..7d04c2241e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" #include "common/logging/log.h" diff --git a/src/network/network.h b/src/network/network.h index 1e1a19a3b9..84db8d6d17 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/network/room.cpp b/src/network/room.cpp index 99dcf0c3b4..1a3ad75d2b 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -951,7 +951,7 @@ void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) { } // Limit the size of chat messages to MaxMessageSize - message.resize(std::min(static_cast(message.size()), MaxMessageSize)); + message.resize((std::min)(static_cast(message.size()), MaxMessageSize)); Packet out_packet; out_packet.Write(static_cast(IdChatMessage)); diff --git a/src/qt_common/CMakeLists.txt b/src/qt_common/CMakeLists.txt new file mode 100644 index 0000000000..aa931f113e --- /dev/null +++ b/src/qt_common/CMakeLists.txt @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +find_package(Qt6 REQUIRED COMPONENTS Core) +find_package(Qt6 REQUIRED COMPONENTS Core) + +add_library(qt_common STATIC + qt_common.h + qt_common.cpp + + uisettings.cpp + uisettings.h + + qt_config.cpp + qt_config.h + + shared_translation.cpp + shared_translation.h + qt_path_util.h qt_path_util.cpp + qt_game_util.h qt_game_util.cpp + qt_frontend_util.h qt_frontend_util.cpp + qt_meta.h qt_meta.cpp + qt_content_util.h qt_content_util.cpp + qt_rom_util.h qt_rom_util.cpp + qt_applet_util.h qt_applet_util.cpp + qt_progress_dialog.h qt_progress_dialog.cpp + +) + +create_target_directory_groups(qt_common) + +# TODO(crueter) +if (ENABLE_QT) + target_link_libraries(qt_common PRIVATE Qt6::Widgets) +endif() + +add_subdirectory(externals) + +target_link_libraries(qt_common PRIVATE core Qt6::Core SimpleIni::SimpleIni QuaZip::QuaZip) + +if (NOT APPLE AND ENABLE_OPENGL) + target_compile_definitions(qt_common PUBLIC HAS_OPENGL) +endif() + +if (NOT WIN32) + target_include_directories(qt_common PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) +endif() diff --git a/src/yuzu/externals/CMakeLists.txt b/src/qt_common/externals/CMakeLists.txt similarity index 57% rename from src/yuzu/externals/CMakeLists.txt rename to src/qt_common/externals/CMakeLists.txt index d7f3f1457a..e7b2e7b3e6 100644 --- a/src/yuzu/externals/CMakeLists.txt +++ b/src/qt_common/externals/CMakeLists.txt @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -# cpm include(CPMUtil) # Disable tests/tools in all externals supporting the standard option name @@ -14,12 +13,8 @@ set(BUILD_SHARED_LIBS OFF) set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) # QuaZip -AddPackage( - NAME QuaZip-Qt6 - VERSION 1.3 - REPO "crueter/quazip-qt6" - SHA f838774d63 - HASH 9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e - OPTIONS - "QUAZIP_INSTALL OFF" -) +AddJsonPackage(quazip) + +# frozen +# TODO(crueter): Qt String Lookup +# AddJsonPackage(frozen) diff --git a/src/qt_common/externals/cpmfile.json b/src/qt_common/externals/cpmfile.json new file mode 100644 index 0000000000..0b464b95b2 --- /dev/null +++ b/src/qt_common/externals/cpmfile.json @@ -0,0 +1,19 @@ +{ + "quazip": { + "package": "QuaZip-Qt6", + "repo": "crueter/quazip-qt6", + "sha": "f838774d63", + "hash": "9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e", + "version": "1.3", + "options": [ + "QUAZIP_INSTALL OFF" + ] + }, + "frozen": { + "package": "frozen", + "repo": "serge-sans-paille/frozen", + "sha": "61dce5ae18", + "hash": "1ae3d073e659c1f24b2cdd76379c90d6af9e06bc707d285a4fafce05f7a4c9e592ff208c94a9ae0f0d07620b3c6cec191f126b03d70ad4dfa496a86ed5658a6d", + "bundled": true + } +} diff --git a/src/qt_common/qt_applet_util.cpp b/src/qt_common/qt_applet_util.cpp new file mode 100644 index 0000000000..1b0189392e --- /dev/null +++ b/src/qt_common/qt_applet_util.cpp @@ -0,0 +1,4 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_applet_util.h" diff --git a/src/qt_common/qt_applet_util.h b/src/qt_common/qt_applet_util.h new file mode 100644 index 0000000000..2b48d16698 --- /dev/null +++ b/src/qt_common/qt_applet_util.h @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_APPLET_UTIL_H +#define QT_APPLET_UTIL_H + +// TODO +namespace QtCommon::Applets { + +} +#endif // QT_APPLET_UTIL_H diff --git a/src/yuzu/qt_common.cpp b/src/qt_common/qt_common.cpp similarity index 55% rename from src/yuzu/qt_common.cpp rename to src/qt_common/qt_common.cpp index 413402165c..6be241c740 100644 --- a/src/yuzu/qt_common.cpp +++ b/src/qt_common/qt_common.cpp @@ -1,12 +1,19 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_common.h" +#include "common/fs/fs.h" #include #include -#include #include "common/logging/log.h" #include "core/frontend/emu_window.h" -#include "yuzu/qt_common.h" + +#include + +#include + +#include #if !defined(WIN32) && !defined(__APPLE__) #include @@ -15,7 +22,19 @@ #endif namespace QtCommon { -Core::Frontend::WindowSystemType GetWindowSystemType() { + +#ifdef YUZU_QT_WIDGETS +QWidget* rootObject = nullptr; +#else +QObject* rootObject = nullptr; +#endif + +std::unique_ptr system = nullptr; +std::shared_ptr vfs = nullptr; +std::unique_ptr provider = nullptr; + +Core::Frontend::WindowSystemType GetWindowSystemType() +{ // Determine WSI type based on Qt platform. QString platform_name = QGuiApplication::platformName(); if (platform_name == QStringLiteral("windows")) @@ -35,7 +54,8 @@ Core::Frontend::WindowSystemType GetWindowSystemType() { return Core::Frontend::WindowSystemType::Windows; } // namespace Core::Frontend::WindowSystemType -Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) { +Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) +{ Core::Frontend::EmuWindow::WindowSystemInfo wsi; wsi.type = GetWindowSystemType(); @@ -43,8 +63,8 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) // Our Win32 Qt external doesn't have the private API. wsi.render_surface = reinterpret_cast(window->winId()); #elif defined(__APPLE__) - wsi.render_surface = reinterpret_cast(objc_msgSend)( - reinterpret_cast(window->winId()), sel_registerName("layer")); + wsi.render_surface = reinterpret_cast( + objc_msgSend)(reinterpret_cast(window->winId()), sel_registerName("layer")); #else QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface(); wsi.display_connection = pni->nativeResourceForWindow("display", window); @@ -57,4 +77,46 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) return wsi; } + +const QString tr(const char* str) +{ + return QGuiApplication::tr(str); +} + +const QString tr(const std::string& str) +{ + return QGuiApplication::tr(str.c_str()); +} + +#ifdef YUZU_QT_WIDGETS +void Init(QWidget* root) +#else +void Init(QObject* root) +#endif +{ + system = std::make_unique(); + rootObject = root; + vfs = std::make_unique(); + provider = std::make_unique(); +} + +std::filesystem::path GetEdenCommand() { + std::filesystem::path command; + + QString appimage = QString::fromLocal8Bit(getenv("APPIMAGE")); + if (!appimage.isEmpty()) { + command = std::filesystem::path{appimage.toStdString()}; + } else { + const QStringList args = QGuiApplication::arguments(); + command = args[0].toStdString(); + } + + // If relative path, make it an absolute path + if (command.c_str()[0] == '.') { + command = Common::FS::GetCurrentDir() / command; + } + + return command; +} + } // namespace QtCommon diff --git a/src/qt_common/qt_common.h b/src/qt_common/qt_common.h new file mode 100644 index 0000000000..a2700427ab --- /dev/null +++ b/src/qt_common/qt_common.h @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_COMMON_H +#define QT_COMMON_H + +#include +#include "core/core.h" +#include "core/file_sys/registered_cache.h" +#include +#include + +#include + +namespace QtCommon { + +#ifdef YUZU_QT_WIDGETS +extern QWidget *rootObject; +#else +extern QObject *rootObject; +#endif + +extern std::unique_ptr system; +extern std::shared_ptr vfs; +extern std::unique_ptr provider; + +typedef std::function QtProgressCallback; + +Core::Frontend::WindowSystemType GetWindowSystemType(); + +Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow *window); + +#ifdef YUZU_QT_WIDGETS +void Init(QWidget *root); +#else +void Init(QObject *root); +#endif + +const QString tr(const char *str); +const QString tr(const std::string &str); + +std::filesystem::path GetEdenCommand(); +} // namespace QtCommon +#endif diff --git a/src/yuzu/configuration/qt_config.cpp b/src/qt_common/qt_config.cpp similarity index 99% rename from src/yuzu/configuration/qt_config.cpp rename to src/qt_common/qt_config.cpp index ae5b330e23..f787873cf6 100644 --- a/src/yuzu/configuration/qt_config.cpp +++ b/src/qt_common/qt_config.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/yuzu/configuration/qt_config.h b/src/qt_common/qt_config.h similarity index 94% rename from src/yuzu/configuration/qt_config.h rename to src/qt_common/qt_config.h index dc2dceb4d7..a8c80dd273 100644 --- a/src/yuzu/configuration/qt_config.h +++ b/src/qt_common/qt_config.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/qt_common/qt_content_util.cpp b/src/qt_common/qt_content_util.cpp new file mode 100644 index 0000000000..2f659cf1b2 --- /dev/null +++ b/src/qt_common/qt_content_util.cpp @@ -0,0 +1,351 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_common/qt_game_util.h" +#include "qt_content_util.h" +#include "common/fs/fs.h" +#include "core/hle/service/acc/profile_manager.h" +#include "frontend_common/content_manager.h" +#include "frontend_common/firmware_manager.h" +#include "qt_common/qt_common.h" +#include "qt_common/qt_progress_dialog.h" +#include "qt_frontend_util.h" + +#include + +namespace QtCommon::Content { + +bool CheckGameFirmware(u64 program_id, QObject* parent) +{ + if (FirmwareManager::GameRequiresFirmware(program_id) + && !FirmwareManager::CheckFirmwarePresence(*system)) { + auto result = QtCommon::Frontend::ShowMessage( + QMessageBox::Warning, + "Game Requires Firmware", + "The game you are trying to launch requires firmware to boot or to get past the " + "opening menu. Please " + "dump and install firmware, or press \"OK\" to launch anyways.", + QMessageBox::Ok | QMessageBox::Cancel, + parent); + + return result == QMessageBox::Ok; + } + + return true; +} + +void InstallFirmware(const QString& location, bool recursive) +{ + QtCommon::Frontend::QtProgressDialog progress(tr("Installing Firmware..."), + tr("Cancel"), + 0, + 100, + rootObject); + progress.setWindowModality(Qt::WindowModal); + progress.setMinimumDuration(100); + progress.setAutoClose(false); + progress.setAutoReset(false); + progress.show(); + + // Declare progress callback. + auto callback = [&](size_t total_size, size_t processed_size) { + progress.setValue(static_cast((processed_size * 100) / total_size)); + return progress.wasCanceled(); + }; + + static constexpr const char* failedTitle = "Firmware Install Failed"; + static constexpr const char* successTitle = "Firmware Install Succeeded"; + QMessageBox::Icon icon; + FirmwareInstallResult result; + + const auto ShowMessage = [&]() { + QtCommon::Frontend::ShowMessage(icon, + failedTitle, + GetFirmwareInstallResultString(result)); + }; + + LOG_INFO(Frontend, "Installing firmware from {}", location.toStdString()); + + // Check for a reasonable number of .nca files (don't hardcode them, just see if there's some in + // there.) + std::filesystem::path firmware_source_path = location.toStdString(); + if (!Common::FS::IsDir(firmware_source_path)) { + return; + } + + std::vector out; + const Common::FS::DirEntryCallable dir_callback = + [&out](const std::filesystem::directory_entry& entry) { + if (entry.path().has_extension() && entry.path().extension() == ".nca") { + out.emplace_back(entry.path()); + } + + return true; + }; + + callback(100, 10); + + if (recursive) { + Common::FS::IterateDirEntriesRecursively(firmware_source_path, + dir_callback, + Common::FS::DirEntryFilter::File); + } else { + Common::FS::IterateDirEntries(firmware_source_path, + dir_callback, + Common::FS::DirEntryFilter::File); + } + + if (out.size() <= 0) { + result = FirmwareInstallResult::NoNCAs; + icon = QMessageBox::Warning; + ShowMessage(); + return; + } + + // Locate and erase the content of nand/system/Content/registered/*.nca, if any. + auto sysnand_content_vdir = system->GetFileSystemController().GetSystemNANDContentDirectory(); + if (sysnand_content_vdir->IsWritable() + && !sysnand_content_vdir->CleanSubdirectoryRecursive("registered")) { + result = FirmwareInstallResult::FailedDelete; + icon = QMessageBox::Critical; + ShowMessage(); + return; + } + + LOG_INFO(Frontend, + "Cleaned nand/system/Content/registered folder in preparation for new firmware."); + + callback(100, 20); + + auto firmware_vdir = sysnand_content_vdir->GetDirectoryRelative("registered"); + + bool success = true; + int i = 0; + for (const auto& firmware_src_path : out) { + i++; + auto firmware_src_vfile = vfs->OpenFile(firmware_src_path.generic_string(), + FileSys::OpenMode::Read); + auto firmware_dst_vfile = firmware_vdir + ->CreateFileRelative(firmware_src_path.filename().string()); + + if (!VfsRawCopy(firmware_src_vfile, firmware_dst_vfile)) { + LOG_ERROR(Frontend, + "Failed to copy firmware file {} to {} in registered folder!", + firmware_src_path.generic_string(), + firmware_src_path.filename().string()); + success = false; + } + + if (callback(100, 20 + static_cast(((i) / static_cast(out.size())) * 70.0))) { + result = FirmwareInstallResult::FailedCorrupted; + icon = QMessageBox::Warning; + ShowMessage(); + return; + } + } + + if (!success) { + result = FirmwareInstallResult::FailedCopy; + icon = QMessageBox::Critical; + ShowMessage(); + return; + } + + // Re-scan VFS for the newly placed firmware files. + system->GetFileSystemController().CreateFactories(*vfs); + + auto VerifyFirmwareCallback = [&](size_t total_size, size_t processed_size) { + progress.setValue(90 + static_cast((processed_size * 10) / total_size)); + return progress.wasCanceled(); + }; + + auto results = ContentManager::VerifyInstalledContents(*QtCommon::system, + *QtCommon::provider, + VerifyFirmwareCallback, + true); + + if (results.size() > 0) { + const auto failed_names = QString::fromStdString( + fmt::format("{}", fmt::join(results, "\n"))); + progress.close(); + QtCommon::Frontend::Critical(tr("Firmware integrity verification failed!"), + tr("Verification failed for the following files:\n\n%1") + .arg(failed_names)); + return; + } + + progress.close(); + + const auto pair = FirmwareManager::GetFirmwareVersion(*system); + const auto firmware_data = pair.first; + const std::string display_version(firmware_data.display_version.data()); + + result = FirmwareInstallResult::Success; + QtCommon::Frontend::Information(rootObject, + tr(successTitle), + tr(GetFirmwareInstallResultString(result)) + .arg(QString::fromStdString(display_version))); +} + +QString UnzipFirmwareToTmp(const QString& location) +{ + namespace fs = std::filesystem; + fs::path tmp{fs::temp_directory_path()}; + + if (!fs::create_directories(tmp / "eden" / "firmware")) { + return ""; + } + + tmp /= "eden"; + tmp /= "firmware"; + + QString qCacheDir = QString::fromStdString(tmp.string()); + + QFile zip(location); + + QStringList result = JlCompress::extractDir(&zip, qCacheDir); + if (result.isEmpty()) { + return ""; + } + + return qCacheDir; +} + +// Content // +void VerifyGameContents(const std::string& game_path) +{ + QtCommon::Frontend::QtProgressDialog progress(tr("Verifying integrity..."), + tr("Cancel"), + 0, + 100, + rootObject); + progress.setWindowModality(Qt::WindowModal); + progress.setMinimumDuration(100); + progress.setAutoClose(false); + progress.setAutoReset(false); + + const auto callback = [&](size_t total_size, size_t processed_size) { + progress.setValue(static_cast((processed_size * 100) / total_size)); + return progress.wasCanceled(); + }; + + const auto result = ContentManager::VerifyGameContents(*system, game_path, callback); + + switch (result) { + case ContentManager::GameVerificationResult::Success: + QtCommon::Frontend::Information(rootObject, + tr("Integrity verification succeeded!"), + tr("The operation completed successfully.")); + break; + case ContentManager::GameVerificationResult::Failed: + QtCommon::Frontend::Critical(rootObject, + tr("Integrity verification failed!"), + tr("File contents may be corrupt or missing.")); + break; + case ContentManager::GameVerificationResult::NotImplemented: + QtCommon::Frontend::Warning( + rootObject, + tr("Integrity verification couldn't be performed"), + tr("Firmware installation cancelled, firmware may be in a bad state or corrupted. " + "File contents could not be checked for validity.")); + } +} + +void InstallKeys() +{ + const QString key_source_location + = QtCommon::Frontend::GetOpenFileName(tr("Select Dumped Keys Location"), + {}, + QStringLiteral("Decryption Keys (*.keys)"), + {}, + QtCommon::Frontend::Option::ReadOnly); + + if (key_source_location.isEmpty()) { + return; + } + + FirmwareManager::KeyInstallResult result = FirmwareManager::InstallKeys(key_source_location + .toStdString(), + "keys"); + + system->GetFileSystemController().CreateFactories(*QtCommon::vfs); + + switch (result) { + case FirmwareManager::KeyInstallResult::Success: + QtCommon::Frontend::Information(tr("Decryption Keys install succeeded"), + tr("Decryption Keys were successfully installed")); + break; + default: + QtCommon::Frontend::Critical(tr("Decryption Keys install failed"), + tr(FirmwareManager::GetKeyInstallResultString(result))); + break; + } +} + +void VerifyInstalledContents() { + // Initialize a progress dialog. + QtCommon::Frontend::QtProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, QtCommon::rootObject); + progress.setWindowModality(Qt::WindowModal); + progress.setMinimumDuration(100); + progress.setAutoClose(false); + progress.setAutoReset(false); + + // Declare progress callback. + auto QtProgressCallback = [&](size_t total_size, size_t processed_size) { + progress.setValue(static_cast((processed_size * 100) / total_size)); + return progress.wasCanceled(); + }; + + const std::vector result = + ContentManager::VerifyInstalledContents(*QtCommon::system, *QtCommon::provider, QtProgressCallback); + progress.close(); + + if (result.empty()) { + QtCommon::Frontend::Information(tr("Integrity verification succeeded!"), + tr("The operation completed successfully.")); + } else { + const auto failed_names = + QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); + QtCommon::Frontend::Critical( + tr("Integrity verification failed!"), + tr("Verification failed for the following files:\n\n%1").arg(failed_names)); + } +} + +void FixProfiles() +{ + // Reset user save files after config is initialized and migration is done. + // Doing it at init time causes profiles to read from the wrong place entirely if NAND dir is not default + // TODO: better solution + system->GetProfileManager().ResetUserSaveFile(); + std::vector orphaned = system->GetProfileManager().FindOrphanedProfiles(); + + // no orphaned dirs--all good :) + if (orphaned.empty()) + return; + + // otherwise, let the user know + QString qorphaned; + + // max. of 8 orphaned profiles is fair, I think + // 33 = 32 (UUID) + 1 (\n) + qorphaned.reserve(8 * 33); + + for (const std::string& s : orphaned) { + qorphaned += "\n" + QString::fromStdString(s); + } + + QtCommon::Frontend::Critical( + tr("Orphaned Profiles Detected!"), + tr("UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!\n" + "Eden has detected the following save directories with no attached profile:\n" + "%1\n\n" + "Click \"OK\" to open your save folder and fix up your profiles.\n" + "Hint: copy the contents of the largest or last-modified folder elsewhere, " + "delete all orphaned profiles, and move your copied contents to the good profile.") + .arg(qorphaned)); + + QtCommon::Game::OpenSaveFolder(); +} + +} // namespace QtCommon::Content diff --git a/src/qt_common/qt_content_util.h b/src/qt_common/qt_content_util.h new file mode 100644 index 0000000000..b95e78c0a0 --- /dev/null +++ b/src/qt_common/qt_content_util.h @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_CONTENT_UTIL_H +#define QT_CONTENT_UTIL_H + +#include +#include "common/common_types.h" + +namespace QtCommon::Content { + +// +bool CheckGameFirmware(u64 program_id, QObject *parent); + +static constexpr std::array FIRMWARE_RESULTS + = {"Successfully installed firmware version %1", + "", + "Unable to locate potential firmware NCA files", + "Failed to delete one or more firmware files.", + "One or more firmware files failed to copy into NAND.", + "Firmware installation cancelled, firmware may be in a bad state or corrupted." + "Restart Eden or re-install firmware."}; + +enum class FirmwareInstallResult { + Success, + NoOp, + NoNCAs, + FailedDelete, + FailedCopy, + FailedCorrupted, +}; + +inline constexpr const char *GetFirmwareInstallResultString(FirmwareInstallResult result) +{ + return FIRMWARE_RESULTS.at(static_cast(result)); +} + +void InstallFirmware(const QString &location, bool recursive); + +QString UnzipFirmwareToTmp(const QString &location); + +// Keys // +void InstallKeys(); + +// Content // +void VerifyGameContents(const std::string &game_path); +void VerifyInstalledContents(); + +// Profiles // +void FixProfiles(); +} +#endif // QT_CONTENT_UTIL_H diff --git a/src/qt_common/qt_frontend_util.cpp b/src/qt_common/qt_frontend_util.cpp new file mode 100644 index 0000000000..d519669ad5 --- /dev/null +++ b/src/qt_common/qt_frontend_util.cpp @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_frontend_util.h" +#include "qt_common/qt_common.h" + +#ifdef YUZU_QT_WIDGETS +#include +#endif + +namespace QtCommon::Frontend { + +StandardButton ShowMessage( + Icon icon, const QString &title, const QString &text, StandardButtons buttons, QObject *parent) +{ +#ifdef YUZU_QT_WIDGETS + QMessageBox *box = new QMessageBox(icon, title, text, buttons, (QWidget *) parent); + return static_cast(box->exec()); +#endif + // TODO(crueter): If Qt Widgets is disabled... + // need a way to reference icon/buttons too +} + +const QString GetOpenFileName(const QString &title, + const QString &dir, + const QString &filter, + QString *selectedFilter, + Options options) +{ +#ifdef YUZU_QT_WIDGETS + return QFileDialog::getOpenFileName((QWidget *) rootObject, title, dir, filter, selectedFilter, options); +#endif +} + +} // namespace QtCommon::Frontend diff --git a/src/qt_common/qt_frontend_util.h b/src/qt_common/qt_frontend_util.h new file mode 100644 index 0000000000..f86b9e1357 --- /dev/null +++ b/src/qt_common/qt_frontend_util.h @@ -0,0 +1,148 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_FRONTEND_UTIL_H +#define QT_FRONTEND_UTIL_H + +#include +#include "qt_common/qt_common.h" + +#ifdef YUZU_QT_WIDGETS +#include +#include +#include +#endif + +/** + * manages common functionality e.g. message boxes and such for Qt/QML + */ +namespace QtCommon::Frontend { + +Q_NAMESPACE + +#ifdef YUZU_QT_WIDGETS +using Options = QFileDialog::Options; +using Option = QFileDialog::Option; + +using StandardButton = QMessageBox::StandardButton; +using StandardButtons = QMessageBox::StandardButtons; + +using Icon = QMessageBox::Icon; +#else +enum Option { + ShowDirsOnly = 0x00000001, + DontResolveSymlinks = 0x00000002, + DontConfirmOverwrite = 0x00000004, + DontUseNativeDialog = 0x00000008, + ReadOnly = 0x00000010, + HideNameFilterDetails = 0x00000020, + DontUseCustomDirectoryIcons = 0x00000040 +}; +Q_ENUM_NS(Option) +Q_DECLARE_FLAGS(Options, Option) +Q_FLAG_NS(Options) + +enum StandardButton { + // keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton + NoButton = 0x00000000, + Ok = 0x00000400, + Save = 0x00000800, + SaveAll = 0x00001000, + Open = 0x00002000, + Yes = 0x00004000, + YesToAll = 0x00008000, + No = 0x00010000, + NoToAll = 0x00020000, + Abort = 0x00040000, + Retry = 0x00080000, + Ignore = 0x00100000, + Close = 0x00200000, + Cancel = 0x00400000, + Discard = 0x00800000, + Help = 0x01000000, + Apply = 0x02000000, + Reset = 0x04000000, + RestoreDefaults = 0x08000000, + + FirstButton = Ok, // internal + LastButton = RestoreDefaults, // internal + + YesAll = YesToAll, // obsolete + NoAll = NoToAll, // obsolete + + Default = 0x00000100, // obsolete + Escape = 0x00000200, // obsolete + FlagMask = 0x00000300, // obsolete + ButtonMask = ~FlagMask // obsolete +}; +Q_ENUM_NS(StandardButton) + +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) +typedef StandardButton Button; +#endif +Q_DECLARE_FLAGS(StandardButtons, StandardButton) +Q_FLAG_NS(StandardButtons) + +enum Icon { + // keep this in sync with QMessageDialogOptions::StandardIcon + NoIcon = 0, + Information = 1, + Warning = 2, + Critical = 3, + Question = 4 +}; +Q_ENUM_NS(Icon) + +#endif + +// TODO(crueter) widgets-less impl, choices et al. +StandardButton ShowMessage(Icon icon, + const QString &title, + const QString &text, + StandardButtons buttons = StandardButton::NoButton, + QObject *parent = nullptr); + +#define UTIL_OVERRIDES(level) \ + inline StandardButton level(QObject *parent, \ + const QString &title, \ + const QString &text, \ + StandardButtons buttons = StandardButton::Ok) \ + { \ + return ShowMessage(Icon::level, title, text, buttons, parent); \ + } \ + inline StandardButton level(QObject *parent, \ + const char *title, \ + const char *text, \ + StandardButtons buttons \ + = StandardButton::Ok) \ + { \ + return ShowMessage(Icon::level, tr(title), tr(text), buttons, parent); \ + } \ + inline StandardButton level(const char *title, \ + const char *text, \ + StandardButtons buttons \ + = StandardButton::Ok) \ + { \ + return ShowMessage(Icon::level, tr(title), tr(text), buttons, rootObject); \ + } \ + inline StandardButton level(const QString title, \ + const QString &text, \ + StandardButtons buttons \ + = StandardButton::Ok) \ + { \ + return ShowMessage(Icon::level, title, text, buttons, rootObject); \ + } + +UTIL_OVERRIDES(Information) +UTIL_OVERRIDES(Warning) +UTIL_OVERRIDES(Critical) +UTIL_OVERRIDES(Question) + +const QString GetOpenFileName(const QString &title, + const QString &dir, + const QString &filter, + QString *selectedFilter = nullptr, + Options options = Options()); + +} // namespace QtCommon::Frontend +#endif // QT_FRONTEND_UTIL_H diff --git a/src/qt_common/qt_game_util.cpp b/src/qt_common/qt_game_util.cpp new file mode 100644 index 0000000000..ac922ea967 --- /dev/null +++ b/src/qt_common/qt_game_util.cpp @@ -0,0 +1,582 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_game_util.h" +#include "common/fs/fs.h" +#include "common/fs/path_util.h" +#include "core/file_sys/savedata_factory.h" +#include "core/hle/service/am/am_types.h" +#include "frontend_common/content_manager.h" +#include "qt_common.h" +#include "qt_common/uisettings.h" +#include "qt_frontend_util.h" +#include "yuzu/util/util.h" + +#include +#include +#include + +#ifdef _WIN32 +#include "common/scope_exit.h" +#include "common/string_util.h" +#include +#include +#else +#include "fmt/ostream.h" +#include +#endif + +namespace QtCommon::Game { + +bool CreateShortcutLink(const std::filesystem::path& shortcut_path, + const std::string& comment, + const std::filesystem::path& icon_path, + const std::filesystem::path& command, + const std::string& arguments, + const std::string& categories, + const std::string& keywords, + const std::string& name) +try { +#ifdef _WIN32 // Windows + HRESULT hr = CoInitialize(nullptr); + if (FAILED(hr)) { + LOG_ERROR(Frontend, "CoInitialize failed"); + return false; + } + SCOPE_EXIT + { + CoUninitialize(); + }; + IShellLinkW* ps1 = nullptr; + IPersistFile* persist_file = nullptr; + SCOPE_EXIT + { + if (persist_file != nullptr) { + persist_file->Release(); + } + if (ps1 != nullptr) { + ps1->Release(); + } + }; + HRESULT hres = CoCreateInstance(CLSID_ShellLink, + nullptr, + CLSCTX_INPROC_SERVER, + IID_IShellLinkW, + reinterpret_cast(&ps1)); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to create IShellLinkW instance"); + return false; + } + hres = ps1->SetPath(command.c_str()); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to set path"); + return false; + } + if (!arguments.empty()) { + hres = ps1->SetArguments(Common::UTF8ToUTF16W(arguments).data()); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to set arguments"); + return false; + } + } + if (!comment.empty()) { + hres = ps1->SetDescription(Common::UTF8ToUTF16W(comment).data()); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to set description"); + return false; + } + } + if (std::filesystem::is_regular_file(icon_path)) { + hres = ps1->SetIconLocation(icon_path.c_str(), 0); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to set icon location"); + return false; + } + } + hres = ps1->QueryInterface(IID_IPersistFile, reinterpret_cast(&persist_file)); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to get IPersistFile interface"); + return false; + } + hres = persist_file->Save(std::filesystem::path{shortcut_path / (name + ".lnk")}.c_str(), TRUE); + if (FAILED(hres)) { + LOG_ERROR(Frontend, "Failed to save shortcut"); + return false; + } + return true; +#elif defined(__unix__) && !defined(__APPLE__) && !defined(__ANDROID__) // Any desktop NIX + std::filesystem::path shortcut_path_full = shortcut_path / (name + ".desktop"); + std::ofstream shortcut_stream(shortcut_path_full, std::ios::binary | std::ios::trunc); + if (!shortcut_stream.is_open()) { + LOG_ERROR(Frontend, "Failed to create shortcut"); + return false; + } + // TODO: Migrate fmt::print to std::print in futures STD C++ 23. + fmt::print(shortcut_stream, "[Desktop Entry]\n"); + fmt::print(shortcut_stream, "Type=Application\n"); + fmt::print(shortcut_stream, "Version=1.0\n"); + fmt::print(shortcut_stream, "Name={}\n", name); + if (!comment.empty()) { + fmt::print(shortcut_stream, "Comment={}\n", comment); + } + if (std::filesystem::is_regular_file(icon_path)) { + fmt::print(shortcut_stream, "Icon={}\n", icon_path.string()); + } + fmt::print(shortcut_stream, "TryExec={}\n", command.string()); + fmt::print(shortcut_stream, "Exec={} {}\n", command.string(), arguments); + if (!categories.empty()) { + fmt::print(shortcut_stream, "Categories={}\n", categories); + } + if (!keywords.empty()) { + fmt::print(shortcut_stream, "Keywords={}\n", keywords); + } + return true; +#else // Unsupported platform + return false; +#endif +} catch (const std::exception& e) { + LOG_ERROR(Frontend, "Failed to create shortcut: {}", e.what()); + return false; +} + +bool MakeShortcutIcoPath(const u64 program_id, + const std::string_view game_file_name, + std::filesystem::path& out_icon_path) +{ + // Get path to Yuzu icons directory & icon extension + std::string ico_extension = "png"; +#if defined(_WIN32) + out_icon_path = Common::FS::GetEdenPath(Common::FS::EdenPath::IconsDir); + ico_extension = "ico"; +#elif defined(__linux__) || defined(__FreeBSD__) + out_icon_path = Common::FS::GetDataDirectory("XDG_DATA_HOME") / "icons/hicolor/256x256"; +#endif + // Create icons directory if it doesn't exist + if (!Common::FS::CreateDirs(out_icon_path)) { + out_icon_path.clear(); + return false; + } + + // Create icon file path + out_icon_path /= (program_id == 0 ? fmt::format("eden-{}.{}", game_file_name, ico_extension) + : fmt::format("eden-{:016X}.{}", program_id, ico_extension)); + return true; +} + +void OpenEdenFolder(const Common::FS::EdenPath& path) +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(Common::FS::GetEdenPathString(path)))); +} + +void OpenRootDataFolder() +{ + OpenEdenFolder(Common::FS::EdenPath::EdenDir); +} + +void OpenNANDFolder() +{ + OpenEdenFolder(Common::FS::EdenPath::NANDDir); +} + +void OpenSaveFolder() +{ + const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) / "user/save/0000000000000000"; + QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(path.string()))); +} + +void OpenSDMCFolder() +{ + OpenEdenFolder(Common::FS::EdenPath::SDMCDir); +} + +void OpenModFolder() +{ + OpenEdenFolder(Common::FS::EdenPath::LoadDir); +} + +void OpenLogFolder() +{ + OpenEdenFolder(Common::FS::EdenPath::LogDir); +} + +static QString GetGameListErrorRemoving(QtCommon::Game::InstalledEntryType type) +{ + switch (type) { + case QtCommon::Game::InstalledEntryType::Game: + return tr("Error Removing Contents"); + case QtCommon::Game::InstalledEntryType::Update: + return tr("Error Removing Update"); + case QtCommon::Game::InstalledEntryType::AddOnContent: + return tr("Error Removing DLC"); + default: + return QStringLiteral("Error Removing "); + } +} + +// Game Content // +void RemoveBaseContent(u64 program_id, InstalledEntryType type) +{ + const auto res = ContentManager::RemoveBaseContent(system->GetFileSystemController(), + program_id); + if (res) { + QtCommon::Frontend::Information(rootObject, + "Successfully Removed", + "Successfully removed the installed base game."); + } else { + QtCommon::Frontend::Warning( + rootObject, + GetGameListErrorRemoving(type), + tr("The base game is not installed in the NAND and cannot be removed.")); + } +} + +void RemoveUpdateContent(u64 program_id, InstalledEntryType type) +{ + const auto res = ContentManager::RemoveUpdate(system->GetFileSystemController(), program_id); + if (res) { + QtCommon::Frontend::Information(rootObject, + "Successfully Removed", + "Successfully removed the installed update."); + } else { + QtCommon::Frontend::Warning(rootObject, + GetGameListErrorRemoving(type), + tr("There is no update installed for this title.")); + } +} + +void RemoveAddOnContent(u64 program_id, InstalledEntryType type) +{ + const size_t count = ContentManager::RemoveAllDLC(*system, program_id); + if (count == 0) { + QtCommon::Frontend::Warning(rootObject, + GetGameListErrorRemoving(type), + tr("There are no DLCs installed for this title.")); + return; + } + + QtCommon::Frontend::Information(rootObject, + tr("Successfully Removed"), + tr("Successfully removed %1 installed DLC.").arg(count)); +} + +// Global Content // + +void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target) +{ + const auto target_file_name = [target] { + switch (target) { + case GameListRemoveTarget::GlShaderCache: + return "opengl.bin"; + case GameListRemoveTarget::VkShaderCache: + return "vulkan.bin"; + default: + return ""; + } + }(); + const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + const auto shader_cache_folder_path = shader_cache_dir / fmt::format("{:016x}", program_id); + const auto target_file = shader_cache_folder_path / target_file_name; + + if (!Common::FS::Exists(target_file)) { + QtCommon::Frontend::Warning(rootObject, + tr("Error Removing Transferable Shader Cache"), + tr("A shader cache for this title does not exist.")); + return; + } + if (Common::FS::RemoveFile(target_file)) { + QtCommon::Frontend::Information(rootObject, + tr("Successfully Removed"), + tr("Successfully removed the transferable shader cache.")); + } else { + QtCommon::Frontend::Warning(rootObject, + tr("Error Removing Transferable Shader Cache"), + tr("Failed to remove the transferable shader cache.")); + } +} + +void RemoveVulkanDriverPipelineCache(u64 program_id) +{ + static constexpr std::string_view target_file_name = "vulkan_pipelines.bin"; + + const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + const auto shader_cache_folder_path = shader_cache_dir / fmt::format("{:016x}", program_id); + const auto target_file = shader_cache_folder_path / target_file_name; + + if (!Common::FS::Exists(target_file)) { + return; + } + if (!Common::FS::RemoveFile(target_file)) { + QtCommon::Frontend::Warning(rootObject, + tr("Error Removing Vulkan Driver Pipeline Cache"), + tr("Failed to remove the driver pipeline cache.")); + } +} + +void RemoveAllTransferableShaderCaches(u64 program_id) +{ + const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + const auto program_shader_cache_dir = shader_cache_dir / fmt::format("{:016x}", program_id); + + if (!Common::FS::Exists(program_shader_cache_dir)) { + QtCommon::Frontend::Warning(rootObject, + tr("Error Removing Transferable Shader Caches"), + tr("A shader cache for this title does not exist.")); + return; + } + if (Common::FS::RemoveDirRecursively(program_shader_cache_dir)) { + QtCommon::Frontend::Information(rootObject, + tr("Successfully Removed"), + tr("Successfully removed the transferable shader caches.")); + } else { + QtCommon::Frontend::Warning( + rootObject, + tr("Error Removing Transferable Shader Caches"), + tr("Failed to remove the transferable shader cache directory.")); + } +} + +void RemoveCustomConfiguration(u64 program_id, const std::string& game_path) +{ + const auto file_path = std::filesystem::path(Common::FS::ToU8String(game_path)); + const auto config_file_name = program_id == 0 + ? Common::FS::PathToUTF8String(file_path.filename()) + .append(".ini") + : fmt::format("{:016X}.ini", program_id); + const auto custom_config_file_path = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir) + / "custom" / config_file_name; + + if (!Common::FS::Exists(custom_config_file_path)) { + QtCommon::Frontend::Warning(rootObject, + tr("Error Removing Custom Configuration"), + tr("A custom configuration for this title does not exist.")); + return; + } + + if (Common::FS::RemoveFile(custom_config_file_path)) { + QtCommon::Frontend::Information(rootObject, + tr("Successfully Removed"), + tr("Successfully removed the custom game configuration.")); + } else { + QtCommon::Frontend::Warning(rootObject, + tr("Error Removing Custom Configuration"), + tr("Failed to remove the custom game configuration.")); + } +} + +void RemoveCacheStorage(u64 program_id) +{ + const auto nand_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir); + auto vfs_nand_dir = vfs->OpenDirectory(Common::FS::PathToUTF8String(nand_dir), + FileSys::OpenMode::Read); + + const auto cache_storage_path + = FileSys::SaveDataFactory::GetFullPath({}, + vfs_nand_dir, + FileSys::SaveDataSpaceId::User, + FileSys::SaveDataType::Cache, + 0 /* program_id */, + {}, + 0); + + const auto path = Common::FS::ConcatPathSafe(nand_dir, cache_storage_path); + + // Not an error if it wasn't cleared. + Common::FS::RemoveDirRecursively(path); +} + +// Metadata // +void ResetMetadata(bool show_message) +{ + const QString title = tr("Reset Metadata Cache"); + + if (!Common::FS::Exists(Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) + / "game_list/")) { + if (show_message) QtCommon::Frontend::Warning(rootObject, title, tr("The metadata cache is already empty.")); + } else if (Common::FS::RemoveDirRecursively( + Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) / "game_list")) { + if (show_message) QtCommon::Frontend::Information(rootObject, + title, + tr("The operation completed successfully.")); + UISettings::values.is_game_list_reload_pending.exchange(true); + } else { + if (show_message) QtCommon::Frontend::Warning( + rootObject, + title, + tr("The metadata cache couldn't be deleted. It might be in use or non-existent.")); + } +} + +// Uhhh // + +// Messages in pre-defined message boxes for less code spaghetti +inline constexpr bool CreateShortcutMessagesGUI(ShortcutMessages imsg, const QString& game_title) +{ + int result = 0; + QMessageBox::StandardButtons buttons; + switch (imsg) { + case ShortcutMessages::Fullscreen: + buttons = QMessageBox::Yes | QMessageBox::No; + result + = QtCommon::Frontend::Information(tr("Create Shortcut"), + tr("Do you want to launch the game in fullscreen?"), + buttons); + return result == QMessageBox::Yes; + case ShortcutMessages::Success: + QtCommon::Frontend::Information(tr("Shortcut Created"), + tr("Successfully created a shortcut to %1").arg(game_title)); + return false; + case ShortcutMessages::Volatile: + buttons = QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::Cancel; + result = QtCommon::Frontend::Warning( + tr("Shortcut may be Volatile!"), + tr("This will create a shortcut to the current AppImage. This may " + "not work well if you update. Continue?"), + buttons); + return result == QMessageBox::Ok; + default: + buttons = QMessageBox::Ok; + QtCommon::Frontend::Critical(tr("Failed to Create Shortcut"), + tr("Failed to create a shortcut to %1").arg(game_title), + buttons); + return false; + } +} + +void CreateShortcut(const std::string& game_path, + const u64 program_id, + const std::string& game_title_, + const ShortcutTarget &target, + std::string arguments_, + const bool needs_title) +{ + // Get path to Eden executable + std::filesystem::path command = GetEdenCommand(); + + // Shortcut path + std::filesystem::path shortcut_path = GetShortcutPath(target); + + if (!std::filesystem::exists(shortcut_path)) { + CreateShortcutMessagesGUI(ShortcutMessages::Failed, + QString::fromStdString(shortcut_path.generic_string())); + LOG_ERROR(Frontend, "Invalid shortcut target {}", shortcut_path.generic_string()); + return; + } + + const FileSys::PatchManager pm{program_id, QtCommon::system->GetFileSystemController(), + QtCommon::system->GetContentProvider()}; + const auto control = pm.GetControlMetadata(); + const auto loader = + Loader::GetLoader(*QtCommon::system, QtCommon::vfs->OpenFile(game_path, FileSys::OpenMode::Read)); + + std::string game_title{game_title_}; + + // Delete illegal characters from title + if (needs_title) { + game_title = fmt::format("{:016X}", program_id); + if (control.first != nullptr) { + game_title = control.first->GetApplicationName(); + } else { + loader->ReadTitle(game_title); + } + } + + const std::string illegal_chars = "<>:\"/\\|?*."; + for (auto it = game_title.rbegin(); it != game_title.rend(); ++it) { + if (illegal_chars.find(*it) != std::string::npos) { + game_title.erase(it.base() - 1); + } + } + + const QString qgame_title = QString::fromStdString(game_title); + + // Get icon from game file + std::vector icon_image_file{}; + if (control.second != nullptr) { + icon_image_file = control.second->ReadAllBytes(); + } else if (loader->ReadIcon(icon_image_file) != Loader::ResultStatus::Success) { + LOG_WARNING(Frontend, "Could not read icon from {:s}", game_path); + } + + QImage icon_data = + QImage::fromData(icon_image_file.data(), static_cast(icon_image_file.size())); + std::filesystem::path out_icon_path; + if (QtCommon::Game::MakeShortcutIcoPath(program_id, game_title, out_icon_path)) { + if (!SaveIconToFile(out_icon_path, icon_data)) { + LOG_ERROR(Frontend, "Could not write icon to file"); + } + } else { + QtCommon::Frontend::Critical( + tr("Create Icon"), + tr("Cannot create icon file. Path \"%1\" does not exist and cannot be created.") + .arg(QString::fromStdString(out_icon_path.string()))); + } + +#if defined(__unix__) && !defined(__APPLE__) && !defined(__ANDROID__) + // Special case for AppImages + // Warn once if we are making a shortcut to a volatile AppImage + if (command.string().ends_with(".AppImage") && !UISettings::values.shortcut_already_warned) { + if (!CreateShortcutMessagesGUI(ShortcutMessages::Volatile, qgame_title)) { + return; + } + UISettings::values.shortcut_already_warned = true; + } +#endif + + // Create shortcut + std::string arguments{arguments_}; + if (CreateShortcutMessagesGUI(ShortcutMessages::Fullscreen, qgame_title)) { + arguments = "-f " + arguments; + } + const std::string comment = fmt::format("Start {:s} with the Eden Emulator", game_title); + const std::string categories = "Game;Emulator;Qt;"; + const std::string keywords = "Switch;Nintendo;"; + + if (QtCommon::Game::CreateShortcutLink(shortcut_path, comment, out_icon_path, command, + arguments, categories, keywords, game_title)) { + CreateShortcutMessagesGUI(ShortcutMessages::Success, + qgame_title); + return; + } + CreateShortcutMessagesGUI(ShortcutMessages::Failed, + qgame_title); +} + +constexpr std::string GetShortcutPath(ShortcutTarget target) { + { + std::string shortcut_path{}; + if (target == ShortcutTarget::Desktop) { + shortcut_path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + .toStdString(); + } else if (target == ShortcutTarget::Applications) { + shortcut_path = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + .toStdString(); + } + + return shortcut_path; + } +} + +void CreateHomeMenuShortcut(ShortcutTarget target) { + constexpr u64 QLaunchId = static_cast(Service::AM::AppletProgramId::QLaunch); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); + if (!bis_system) { + QtCommon::Frontend::Warning(tr("No firmware available"), + tr("Please install firmware to use the home menu.")); + return; + } + + auto qlaunch_nca = bis_system->GetEntry(QLaunchId, FileSys::ContentRecordType::Program); + if (!qlaunch_nca) { + QtCommon::Frontend::Warning(tr("Home Menu Applet"), + tr("Home Menu is not available. Please reinstall firmware.")); + return; + } + + auto qlaunch_applet_nca = bis_system->GetEntry(QLaunchId, FileSys::ContentRecordType::Program); + const auto game_path = qlaunch_applet_nca->GetFullPath(); + + // TODO(crueter): Make this use the Eden icon + CreateShortcut(game_path, QLaunchId, "Switch Home Menu", target, "-qlaunch", false); +} + +} // namespace QtCommon::Game diff --git a/src/qt_common/qt_game_util.h b/src/qt_common/qt_game_util.h new file mode 100644 index 0000000000..5c6bb24910 --- /dev/null +++ b/src/qt_common/qt_game_util.h @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_GAME_UTIL_H +#define QT_GAME_UTIL_H + +#include +#include +#include "common/fs/path_util.h" + +namespace QtCommon::Game { + +enum class InstalledEntryType { + Game, + Update, + AddOnContent, +}; + +enum class GameListRemoveTarget { + GlShaderCache, + VkShaderCache, + AllShaderCache, + CustomConfiguration, + CacheStorage, +}; + +enum class ShortcutTarget { + Desktop, + Applications, +}; + +enum class ShortcutMessages{ + Fullscreen = 0, + Success = 1, + Volatile = 2, + Failed = 3 +}; + +bool CreateShortcutLink(const std::filesystem::path& shortcut_path, + const std::string& comment, + const std::filesystem::path& icon_path, + const std::filesystem::path& command, + const std::string& arguments, + const std::string& categories, + const std::string& keywords, + const std::string& name); + +bool MakeShortcutIcoPath(const u64 program_id, + const std::string_view game_file_name, + std::filesystem::path& out_icon_path); + +void OpenEdenFolder(const Common::FS::EdenPath &path); +void OpenRootDataFolder(); +void OpenNANDFolder(); +void OpenSaveFolder(); +void OpenSDMCFolder(); +void OpenModFolder(); +void OpenLogFolder(); + +void RemoveBaseContent(u64 program_id, InstalledEntryType type); +void RemoveUpdateContent(u64 program_id, InstalledEntryType type); +void RemoveAddOnContent(u64 program_id, InstalledEntryType type); + +void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target); +void RemoveVulkanDriverPipelineCache(u64 program_id); +void RemoveAllTransferableShaderCaches(u64 program_id); +void RemoveCustomConfiguration(u64 program_id, const std::string& game_path); +void RemoveCacheStorage(u64 program_id); + +// Metadata // +void ResetMetadata(bool show_message = true); + +// Shortcuts // +void CreateShortcut(const std::string& game_path, + const u64 program_id, + const std::string& game_title_, + const ShortcutTarget& target, + std::string arguments_, + const bool needs_title); + +constexpr std::string GetShortcutPath(ShortcutTarget target); +void CreateHomeMenuShortcut(ShortcutTarget target); + +} + +#endif // QT_GAME_UTIL_H diff --git a/src/qt_common/qt_meta.cpp b/src/qt_common/qt_meta.cpp new file mode 100644 index 0000000000..67ae659771 --- /dev/null +++ b/src/qt_common/qt_meta.cpp @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_meta.h" +#include "common/common_types.h" +#include "core/core.h" +#include "core/frontend/applets/cabinet.h" +#include "core/frontend/applets/controller.h" +#include "core/frontend/applets/profile_select.h" +#include "core/frontend/applets/software_keyboard.h" +#include "core/hle/service/am/frontend/applet_web_browser_types.h" + +namespace QtCommon::Meta { + +void RegisterMetaTypes() +{ + // Register integral and floating point types + qRegisterMetaType("u8"); + qRegisterMetaType("u16"); + qRegisterMetaType("u32"); + qRegisterMetaType("u64"); + qRegisterMetaType("u128"); + qRegisterMetaType("s8"); + qRegisterMetaType("s16"); + qRegisterMetaType("s32"); + qRegisterMetaType("s64"); + qRegisterMetaType("f32"); + qRegisterMetaType("f64"); + + // Register string types + qRegisterMetaType("std::string"); + qRegisterMetaType("std::wstring"); + qRegisterMetaType("std::u8string"); + qRegisterMetaType("std::u16string"); + qRegisterMetaType("std::u32string"); + qRegisterMetaType("std::string_view"); + qRegisterMetaType("std::wstring_view"); + qRegisterMetaType("std::u8string_view"); + qRegisterMetaType("std::u16string_view"); + qRegisterMetaType("std::u32string_view"); + + // Register applet types + + // Cabinet Applet + qRegisterMetaType("Core::Frontend::CabinetParameters"); + qRegisterMetaType>( + "std::shared_ptr"); + + // Controller Applet + qRegisterMetaType("Core::Frontend::ControllerParameters"); + + // Profile Select Applet + qRegisterMetaType( + "Core::Frontend::ProfileSelectParameters"); + + // Software Keyboard Applet + qRegisterMetaType( + "Core::Frontend::KeyboardInitializeParameters"); + qRegisterMetaType( + "Core::Frontend::InlineAppearParameters"); + qRegisterMetaType("Core::Frontend::InlineTextParameters"); + qRegisterMetaType("Service::AM::Frontend::SwkbdResult"); + qRegisterMetaType( + "Service::AM::Frontend::SwkbdTextCheckResult"); + qRegisterMetaType( + "Service::AM::Frontend::SwkbdReplyType"); + + // Web Browser Applet + qRegisterMetaType("Service::AM::Frontend::WebExitReason"); + + // Register loader types + qRegisterMetaType("Core::SystemResultStatus"); +} + +} diff --git a/src/qt_common/qt_meta.h b/src/qt_common/qt_meta.h new file mode 100644 index 0000000000..c0a37db983 --- /dev/null +++ b/src/qt_common/qt_meta.h @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_META_H +#define QT_META_H + +#include + +namespace QtCommon::Meta { + +// +void RegisterMetaTypes(); + +} +#endif // QT_META_H diff --git a/src/qt_common/qt_path_util.cpp b/src/qt_common/qt_path_util.cpp new file mode 100644 index 0000000000..761e6e8405 --- /dev/null +++ b/src/qt_common/qt_path_util.cpp @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_path_util.h" +#include +#include +#include +#include "common/fs/fs.h" +#include "common/fs/path_util.h" +#include "qt_common/qt_frontend_util.h" +#include + +namespace QtCommon::Path { + +bool OpenShaderCache(u64 program_id, QObject *parent) +{ + const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + const auto shader_cache_folder_path{shader_cache_dir / fmt::format("{:016x}", program_id)}; + if (!Common::FS::CreateDirs(shader_cache_folder_path)) { + QtCommon::Frontend::ShowMessage(QMessageBox::Warning, "Error Opening Shader Cache", "Failed to create or open shader cache for this title, ensure your app data directory has write permissions.", QMessageBox::Ok, parent); + } + + const auto shader_path_string{Common::FS::PathToUTF8String(shader_cache_folder_path)}; + const auto qt_shader_cache_path = QString::fromStdString(shader_path_string); + return QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_path)); +} + +} diff --git a/src/qt_common/qt_path_util.h b/src/qt_common/qt_path_util.h new file mode 100644 index 0000000000..855b06caa9 --- /dev/null +++ b/src/qt_common/qt_path_util.h @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_PATH_UTIL_H +#define QT_PATH_UTIL_H + +#include "common/common_types.h" +#include + +namespace QtCommon::Path { bool OpenShaderCache(u64 program_id, QObject *parent); } + +#endif // QT_PATH_UTIL_H diff --git a/src/qt_common/qt_progress_dialog.cpp b/src/qt_common/qt_progress_dialog.cpp new file mode 100644 index 0000000000..b4bf74c8bd --- /dev/null +++ b/src/qt_common/qt_progress_dialog.cpp @@ -0,0 +1,4 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_progress_dialog.h" diff --git a/src/qt_common/qt_progress_dialog.h b/src/qt_common/qt_progress_dialog.h new file mode 100644 index 0000000000..17f6817ffa --- /dev/null +++ b/src/qt_common/qt_progress_dialog.h @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_PROGRESS_DIALOG_H +#define QT_PROGRESS_DIALOG_H + +#include + +#ifdef YUZU_QT_WIDGETS +#include +#endif + +namespace QtCommon::Frontend { +#ifdef YUZU_QT_WIDGETS + +using QtProgressDialog = QProgressDialog; + +// TODO(crueter): QML impl +#else +class QtProgressDialog +{ +public: + QtProgressDialog(const QString &labelText, + const QString &cancelButtonText, + int minimum, + int maximum, + QObject *parent = nullptr, + Qt::WindowFlags f = Qt::WindowFlags()); + + bool wasCanceled() const; + void setWindowModality(Qt::WindowModality modality); + void setMinimumDuration(int durationMs); + void setAutoClose(bool autoClose); + void setAutoReset(bool autoReset); + +public slots: + void setLabelText(QString &text); + void setRange(int min, int max); + void setValue(int progress); + bool close(); + + void show(); +}; +#endif // YUZU_QT_WIDGETS + +} +#endif // QT_PROGRESS_DIALOG_H diff --git a/src/qt_common/qt_rom_util.cpp b/src/qt_common/qt_rom_util.cpp new file mode 100644 index 0000000000..08ccb05a97 --- /dev/null +++ b/src/qt_common/qt_rom_util.cpp @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_rom_util.h" + +#include + +namespace QtCommon::ROM { + +bool RomFSRawCopy(size_t total_size, + size_t& read_size, + QtProgressCallback callback, + const FileSys::VirtualDir& src, + const FileSys::VirtualDir& dest, + bool full) +{ + // TODO(crueter) + // if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) + // return false; + // if (dialog.wasCanceled()) + // return false; + + // std::vector buffer(CopyBufferSize); + // auto last_timestamp = std::chrono::steady_clock::now(); + + // const auto QtRawCopy = [&](const FileSys::VirtualFile& src_file, + // const FileSys::VirtualFile& dest_file) { + // if (src_file == nullptr || dest_file == nullptr) { + // return false; + // } + // if (!dest_file->Resize(src_file->GetSize())) { + // return false; + // } + + // for (std::size_t i = 0; i < src_file->GetSize(); i += buffer.size()) { + // if (dialog.wasCanceled()) { + // dest_file->Resize(0); + // return false; + // } + + // using namespace std::literals::chrono_literals; + // const auto new_timestamp = std::chrono::steady_clock::now(); + + // if ((new_timestamp - last_timestamp) > 33ms) { + // last_timestamp = new_timestamp; + // dialog.setValue( + // static_cast(std::min(read_size, total_size) * 100 / total_size)); + // QCoreApplication::processEvents(); + // } + + // const auto read = src_file->Read(buffer.data(), buffer.size(), i); + // dest_file->Write(buffer.data(), read, i); + + // read_size += read; + // } + + // return true; + // }; + + // if (full) { + // for (const auto& file : src->GetFiles()) { + // const auto out = VfsDirectoryCreateFileWrapper(dest, file->GetName()); + // if (!QtRawCopy(file, out)) + // return false; + // } + // } + + // for (const auto& dir : src->GetSubdirectories()) { + // const auto out = dest->CreateSubdirectory(dir->GetName()); + // if (!RomFSRawCopy(total_size, read_size, dialog, dir, out, full)) + // return false; + // } + + // return true; + return true; +} + +} diff --git a/src/qt_common/qt_rom_util.h b/src/qt_common/qt_rom_util.h new file mode 100644 index 0000000000..f76b09753d --- /dev/null +++ b/src/qt_common/qt_rom_util.h @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef QT_ROM_UTIL_H +#define QT_ROM_UTIL_H + +#include "qt_common/qt_common.h" +#include + +namespace QtCommon::ROM { + +bool RomFSRawCopy(size_t total_size, + size_t& read_size, + QtProgressCallback callback, + const FileSys::VirtualDir& src, + const FileSys::VirtualDir& dest, + bool full); + +} +#endif // QT_ROM_UTIL_H diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/qt_common/shared_translation.cpp similarity index 73% rename from src/yuzu/configuration/shared_translation.cpp rename to src/qt_common/shared_translation.cpp index f6d590c0ee..054d28e8e2 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/qt_common/shared_translation.cpp @@ -7,23 +7,21 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "yuzu/configuration/shared_translation.h" +#include "shared_translation.h" #include -#include #include "common/settings.h" #include "common/settings_enums.h" #include "common/settings_setting.h" #include "common/time_zone.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include #include -#include #include namespace ConfigurationShared { -std::unique_ptr InitializeTranslations(QWidget* parent) +std::unique_ptr InitializeTranslations(QObject* parent) { std::unique_ptr translations = std::make_unique(); const auto& tr = [parent](const char* text) -> QString { return parent->tr(text); }; @@ -64,22 +62,20 @@ std::unique_ptr InitializeTranslations(QWidget* parent) Settings, use_multi_core, tr("Multicore CPU Emulation"), - tr("This option increases CPU emulation thread use from 1 to the Switch’s maximum of 4.\n" - "This is mainly a debug option and shouldn’t be disabled.")); + tr("This option increases CPU emulation thread use from 1 to the maximum of 4.\n" + "This is mainly a debug option and shouldn't be disabled.")); INSERT( Settings, memory_layout_mode, tr("Memory Layout"), - tr("Increases the amount of emulated RAM from the stock 4GB of the retail Switch to the " - "developer kit's 8/6GB.\nIt’s doesn’t improve stability or performance and is intended " - "to let big texture mods fit in emulated RAM.\nEnabling it will increase memory " - "use. It is not recommended to enable unless a specific game with a texture mod needs " - "it.")); + tr("Increases the amount of emulated RAM from 4GB of the board to the " + "devkit 8/6GB.\nDoesn't affect performance/stability but may allow HD texture " + "mods to load.")); INSERT(Settings, use_speed_limit, QString(), QString()); INSERT(Settings, speed_limit, tr("Limit Speed Percent"), - tr("Controls the game's maximum rendering speed, but it’s up to each game if it runs " + tr("Controls the game's maximum rendering speed, but it's up to each game if it runs " "faster or not.\n200% for a 30 FPS game is 60 FPS, and for a " "60 FPS game it will be 120 FPS.\nDisabling it means unlocking the framerate to the " "maximum your PC can reach.")); @@ -88,15 +84,13 @@ std::unique_ptr InitializeTranslations(QWidget* parent) tr("Synchronize Core Speed"), tr("Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS " "without affecting game speed (animations, physics, etc.).\n" - "Compatibility varies by game; many (especially older ones) may not respond well.\n" "Can help reduce stuttering at lower framerates.")); // Cpu INSERT(Settings, cpu_accuracy, tr("Accuracy:"), - tr("This setting controls the accuracy of the emulated CPU.\nDon't change this unless " - "you know what you are doing.")); + tr("Change the accuracy of the emulated CPU (for debugging only).")); INSERT(Settings, cpu_backend, tr("Backend:"), QString()); INSERT(Settings, use_fast_cpu_time, QString(), QString()); @@ -112,12 +106,14 @@ std::unique_ptr InitializeTranslations(QWidget* parent) cpu_ticks, tr("Custom CPU Ticks"), tr("Set a custom value of CPU ticks. Higher values can increase performance, but may " - "also cause the game to freeze. A range of 77–21000 is recommended.")); + "cause deadlocks. A range of 77-21000 is recommended.")); INSERT(Settings, cpu_backend, tr("Backend:"), QString()); // Cpu Debug // Cpu Unsafe + INSERT(Settings, cpuopt_unsafe_host_mmu, tr("Enable Host MMU Emulation (fastmem)"), + tr("This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.\nDisabling this forces all memory accesses to use Software MMU Emulation.")); INSERT( Settings, cpuopt_unsafe_unfuse_fma, @@ -144,8 +140,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) cpuopt_unsafe_fastmem_check, tr("Disable address space checks"), tr("This option improves speed by eliminating a safety check before every memory " - "read/write in guest.\nDisabling it may allow a game to read/write the emulator's " - "memory.")); + "operation.\nDisabling it may allow arbitrary code execution.")); INSERT( Settings, cpuopt_unsafe_ignore_global_monitor, @@ -159,36 +154,31 @@ std::unique_ptr InitializeTranslations(QWidget* parent) Settings, renderer_backend, tr("API:"), - tr("Switches between the available graphics APIs.\nVulkan is recommended in most cases.")); + tr("Changes the output graphics API.\nVulkan is recommended.")); INSERT(Settings, vulkan_device, tr("Device:"), - tr("This setting selects the GPU to use with the Vulkan backend.")); + tr("This setting selects the GPU to use (Vulkan only).")); INSERT(Settings, shader_backend, tr("Shader Backend:"), - tr("The shader backend to use for the OpenGL renderer.\nGLSL is the fastest in " - "performance and the best in rendering accuracy.\n" - "GLASM is a deprecated NVIDIA-only backend that offers much better shader building " - "performance at the cost of FPS and rendering accuracy.\n" - "SPIR-V compiles the fastest, but yields poor results on most GPU drivers.")); + tr("The shader backend to use with OpenGL.\nGLSL is recommended.")); INSERT(Settings, resolution_setup, tr("Resolution:"), - tr("Forces the game to render at a different resolution.\nHigher resolutions require " - "much more VRAM and bandwidth.\n" - "Options lower than 1X can cause rendering issues.")); + tr("Forces to render at a different resolution.\n" + "Higher resolutions require more VRAM and bandwidth.\n" + "Options lower than 1X can cause artifacts.")); INSERT(Settings, scaling_filter, tr("Window Adapting Filter:"), QString()); INSERT(Settings, fsr_sharpening_slider, tr("FSR Sharpness:"), - tr("Determines how sharpened the image will look while using FSR’s dynamic contrast.")); + tr("Determines how sharpened the image will look using FSR's dynamic contrast.")); INSERT(Settings, anti_aliasing, tr("Anti-Aliasing Method:"), - tr("The anti-aliasing method to use.\nSMAA offers the best quality.\nFXAA has a " - "lower performance impact and can produce a better and more stable picture under " - "very low resolutions.")); + tr("The anti-aliasing method to use.\nSMAA offers the best quality.\nFXAA " + "can produce a more stable picture in lower resolutions.")); INSERT(Settings, fullscreen_mode, tr("Fullscreen Mode:"), @@ -199,18 +189,17 @@ std::unique_ptr InitializeTranslations(QWidget* parent) INSERT(Settings, aspect_ratio, tr("Aspect Ratio:"), - tr("Stretches the game to fit the specified aspect ratio.\nSwitch games only support " - "16:9, so custom game mods are required to get other ratios.\nAlso controls the " + tr("Stretches the renderer to fit the specified aspect ratio.\nMost games only support " + "16:9, so modifications are required to get other ratios.\nAlso controls the " "aspect ratio of captured screenshots.")); INSERT(Settings, use_disk_shader_cache, - tr("Use disk pipeline cache"), + tr("Use persistent pipeline cache"), tr("Allows saving shaders to storage for faster loading on following game " - "boots.\nDisabling " - "it is only intended for debugging.")); + "boots.\nDisabling it is only intended for debugging.")); INSERT(Settings, optimize_spirv_output, - tr("Optimize SPIRV output shader"), + tr("Optimize SPIRV output"), tr("Runs an additional optimization pass over generated SPIRV shaders.\n" "Will increase time required for shader compilation.\nMay slightly improve " "performance.\nThis feature is experimental.")); @@ -229,40 +218,35 @@ std::unique_ptr InitializeTranslations(QWidget* parent) accelerate_astc, tr("ASTC Decoding Method:"), tr("This option controls how ASTC textures should be decoded.\n" - "CPU: Use the CPU for decoding, slowest but safest method.\n" - "GPU: Use the GPU's compute shaders to decode ASTC textures, recommended for most " - "games and users.\n" - "CPU Asynchronously: Use the CPU to decode ASTC textures as they arrive. Completely " - "eliminates ASTC decoding\nstuttering at the cost of rendering issues while the " - "texture is being decoded.")); + "CPU: Use the CPU for decoding.\n" + "GPU: Use the GPU's compute shaders to decode ASTC textures (recommended).\n" + "CPU Asynchronously: Use the CPU to decode ASTC textures on demand. Eliminates" + "ASTC decoding\nstuttering but may present artifacts.")); INSERT( Settings, astc_recompression, tr("ASTC Recompression Method:"), - tr("Almost all desktop and laptop dedicated GPUs lack support for ASTC textures, forcing " - "the emulator to decompress to an intermediate format any card supports, RGBA8.\n" - "This option recompresses RGBA8 to either the BC1 or BC3 format, saving VRAM but " - "negatively affecting image quality.")); + tr("Most GPUs lack support for ASTC textures and must decompress to an" + "intermediate format: RGBA8.\n" + "BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format,\n" + " saving VRAM but degrading image quality.")); INSERT(Settings, vram_usage_mode, tr("VRAM Usage Mode:"), - tr("Selects whether the emulator should prefer to conserve memory or make maximum usage " - "of available video memory for performance.\nHas no effect on integrated graphics. " - "Aggressive mode may severely impact the performance of other applications such as " - "recording software.")); + tr("Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance.\nAggressive mode may impact performance of other applications such as recording software.")); INSERT(Settings, skip_cpu_inner_invalidation, tr("Skip CPU Inner Invalidation"), - tr("Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and " - "improving it's performance. This may cause glitches or crashes on some games.")); + tr("Skips certain cache invalidations during memory updates, reducing CPU usage and " + "improving latency. This may cause soft-crashes.")); INSERT( Settings, vsync_mode, tr("VSync Mode:"), tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen " - "refresh rate.\nFIFO Relaxed is similar to FIFO but allows tearing as it recovers from " - "a slow down.\nMailbox can have lower latency than FIFO and does not tear but may drop " - "frames.\nImmediate (no synchronization) just presents whatever is available and can " + "refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n" + "Mailbox can have lower latency than FIFO and does not tear but may drop " + "frames.\nImmediate (no synchronization) presents whatever is available and can " "exhibit tearing.")); INSERT(Settings, bg_red, QString(), QString()); INSERT(Settings, bg_green, QString(), QString()); @@ -270,7 +254,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) // Renderer (Advanced Graphics) INSERT(Settings, sync_memory_operations, tr("Sync Memory Operations"), - tr("Ensures data consistency between compute and memory operations.\nThis option should fix issues in some games, but may also reduce performance in some cases.\nUnreal Engine 4 games often see the most significant changes thereof.")); + tr("Ensures data consistency between compute and memory operations.\nThis option fixes issues in games, but may degrade performance.\nUnreal Engine 4 games often see the most significant changes thereof.")); INSERT(Settings, async_presentation, tr("Enable asynchronous presentation (Vulkan only)"), @@ -284,26 +268,21 @@ std::unique_ptr InitializeTranslations(QWidget* parent) INSERT(Settings, max_anisotropy, tr("Anisotropic Filtering:"), - tr("Controls the quality of texture rendering at oblique angles.\nIt’s a light setting " - "and safe to set at 16x on most GPUs.")); + tr("Controls the quality of texture rendering at oblique angles.\nSafe to set at 16x on most GPUs.")); INSERT(Settings, gpu_accuracy, - tr("GPU Level:"), + tr("GPU Accuracy:"), tr("Controls the GPU emulation accuracy.\nMost games render fine with Normal, but High is still " "required for some.\nParticles tend to only render correctly with High " - "accuracy.\nExtreme should only be used for debugging.\nThis option can " - "be changed while playing.\nSome games may require booting on high to render " - "properly.")); + "accuracy.\nExtreme should only be used as a last resort.")); INSERT(Settings, dma_accuracy, - tr("DMA Level:"), - tr("Controls the DMA precision accuracy. Higher precision can fix issues in some games, but it can also impact performance in some cases.\nIf unsure, leave it at Default.")); + tr("DMA Accuracy:"), + tr("Controls the DMA precision accuracy. Safe precision fixes issues in some games but may degrade performance.")); INSERT(Settings, use_asynchronous_shaders, - tr("Use asynchronous shader building (Hack)"), - tr("Enables asynchronous shader compilation, which may reduce shader stutter.\nThis " - "feature " - "is experimental.")); + tr("Enable asynchronous shader compilation (Hack)"), + tr("May reduce shader stutter.")); INSERT(Settings, use_fast_gpu_time, QString(), QString()); INSERT(Settings, fast_gpu_time, @@ -321,8 +300,8 @@ std::unique_ptr InitializeTranslations(QWidget* parent) Settings, enable_compute_pipelines, tr("Enable Compute Pipelines (Intel Vulkan Only)"), - tr("Enable compute pipelines, required by some games.\nThis setting only exists for Intel " - "proprietary drivers, and may crash if enabled.\nCompute pipelines are always enabled " + tr("Required by some games.\nThis setting only exists for Intel " + "proprietary drivers and may crash if enabled.\nCompute pipelines are always enabled " "on all other drivers.")); INSERT( Settings, @@ -341,21 +320,15 @@ std::unique_ptr InitializeTranslations(QWidget* parent) tr("Improves rendering of transparency effects in specific games.")); // Renderer (Extensions) - INSERT(Settings, - enable_raii, - tr("RAII"), - tr("A method of automatic resource management in Vulkan " - "that ensures proper release of resources " - "when they are no longer needed, but may cause crashes in bundled games.")); INSERT(Settings, dyna_state, tr("Extended Dynamic State"), - tr("Controls the number of features that can be used in Extended Dynamic State.\nHigher numbers allow for more features and can increase performance, but may cause issues with some drivers and vendors.\nThe default value may vary depending on your system and hardware capabilities.\nThis value can be changed until stability and a better visual quality are achieved.")); + tr("Controls the number of features that can be used in Extended Dynamic State.\nHigher numbers allow for more features and can increase performance, but may cause issues.\nThe default value is per-system.")); INSERT(Settings, provoking_vertex, tr("Provoking Vertex"), - tr("Improves lighting and vertex handling in certain games.\n" + tr("Improves lighting and vertex handling in some games.\n" "Only Vulkan 1.0+ devices support this extension.")); INSERT(Settings, @@ -370,8 +343,8 @@ std::unique_ptr InitializeTranslations(QWidget* parent) sample_shading_fraction, tr("Sample Shading"), tr("Allows the fragment shader to execute per sample in a multi-sampled fragment " - "instead once per fragment. Improves graphics quality at the cost of some performance.\n" - "Higher values improve quality more but also reduce performance to a greater extent.")); + "instead of once per fragment. Improves graphics quality at the cost of performance.\n" + "Higher values improve quality but degrade performance.")); // Renderer (Debug) @@ -379,31 +352,30 @@ std::unique_ptr InitializeTranslations(QWidget* parent) INSERT(Settings, rng_seed, tr("RNG Seed"), - tr("Controls the seed of the random number generator.\nMainly used for speedrunning " - "purposes.")); + tr("Controls the seed of the random number generator.\nMainly used for speedrunning.")); INSERT(Settings, rng_seed_enabled, QString(), QString()); - INSERT(Settings, device_name, tr("Device Name"), tr("The name of the emulated Switch.")); + INSERT(Settings, device_name, tr("Device Name"), tr("The name of the console.")); INSERT(Settings, custom_rtc, tr("Custom RTC Date:"), - tr("This option allows to change the emulated clock of the Switch.\n" + tr("This option allows to change the clock of the console.\n" "Can be used to manipulate time in games.")); INSERT(Settings, custom_rtc_enabled, QString(), QString()); INSERT(Settings, custom_rtc_offset, QStringLiteral(" "), - QStringLiteral("The number of seconds from the current unix time")); + tr("The number of seconds from the current unix time")); INSERT(Settings, language_index, tr("Language:"), - tr("Note: this can be overridden when region setting is auto-select")); - INSERT(Settings, region_index, tr("Region:"), tr("The region of the emulated Switch.")); - INSERT(Settings, time_zone_index, tr("Time Zone:"), tr("The time zone of the emulated Switch.")); + tr("This option can be overridden when region setting is auto-select")); + INSERT(Settings, region_index, tr("Region:"), tr("The region of the console.")); + INSERT(Settings, time_zone_index, tr("Time Zone:"), tr("The time zone of the console.")); INSERT(Settings, sound_index, tr("Sound Output Mode:"), QString()); INSERT(Settings, use_docked_mode, tr("Console Mode:"), - tr("Selects if the console is emulated in Docked or Handheld mode.\nGames will change " + tr("Selects if the console is in Docked or Handheld mode.\nGames will change " "their resolution, details and supported controllers and depending on this setting.\n" "Setting to Handheld can help improve performance for low end systems.")); INSERT(Settings, current_user, QString(), QString()); @@ -425,27 +397,26 @@ std::unique_ptr InitializeTranslations(QWidget* parent) // Ui General INSERT(UISettings, select_user_on_boot, - tr("Prompt for user on game boot"), - tr("Ask to select a user profile on each boot, useful if multiple people use Eden on " - "the same PC.")); + tr("Prompt for user profile on boot"), + tr("Useful if multiple people use the same PC.")); INSERT(UISettings, pause_when_in_background, - tr("Pause emulation when in background"), - tr("This setting pauses Eden when focusing other windows.")); + tr("Pause when not in focus"), + tr("Pauses emulation when focusing on other windows.")); INSERT(UISettings, confirm_before_stopping, tr("Confirm before stopping emulation"), - tr("This setting overrides game prompts asking to confirm stopping the game.\nEnabling " + tr("Overrides prompts asking to confirm stopping the emulation.\nEnabling " "it bypasses such prompts and directly exits the emulation.")); INSERT(UISettings, hide_mouse, tr("Hide mouse on inactivity"), - tr("This setting hides the mouse after 2.5s of inactivity.")); + tr("Hides the mouse after 2.5s of inactivity.")); INSERT(UISettings, controller_applet_disabled, tr("Disable controller applet"), - tr("Forcibly disables the use of the controller applet by guests.\nWhen a guest " - "attempts to open the controller applet, it is immediately closed.")); + tr("Forcibly disables the use of the controller applet in emulated programs.\n" + "When a program attempts to open the controller applet, it is immediately closed.")); INSERT(UISettings, check_for_updates, tr("Check for updates"), @@ -465,7 +436,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) return translations; } -std::unique_ptr ComboboxEnumeration(QWidget* parent) +std::unique_ptr ComboboxEnumeration(QObject* parent) { std::unique_ptr translations = std::make_unique(); const auto& tr = [&](const char* text, const char* context = "") { @@ -529,9 +500,8 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) translations->insert({Settings::EnumMetadata::Index(), { PAIR(DmaAccuracy, Default, tr("Default")), - PAIR(DmaAccuracy, Normal, tr("Normal")), - PAIR(DmaAccuracy, High, tr("High")), - PAIR(DmaAccuracy, Extreme, tr("Extreme")), + PAIR(DmaAccuracy, Unsafe, tr("Unsafe (fast)")), + PAIR(DmaAccuracy, Safe, tr("Safe (stable)")), }}); translations->insert( {Settings::EnumMetadata::Index(), @@ -564,6 +534,7 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) PAIR(ResolutionSetup, Res1_2X, tr("0.5X (360p/540p) [EXPERIMENTAL]")), PAIR(ResolutionSetup, Res3_4X, tr("0.75X (540p/810p) [EXPERIMENTAL]")), PAIR(ResolutionSetup, Res1X, tr("1X (720p/1080p)")), + PAIR(ResolutionSetup, Res5_4X, tr("1.25X (900p/1350p) [EXPERIMENTAL]")), PAIR(ResolutionSetup, Res3_2X, tr("1.5X (1080p/1620p) [EXPERIMENTAL]")), PAIR(ResolutionSetup, Res2X, tr("2X (1440p/2160p)")), PAIR(ResolutionSetup, Res3X, tr("3X (2160p/3240p)")), @@ -579,9 +550,15 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) PAIR(ScalingFilter, Bilinear, tr("Bilinear")), PAIR(ScalingFilter, Bicubic, tr("Bicubic")), PAIR(ScalingFilter, Gaussian, tr("Gaussian")), + PAIR(ScalingFilter, Lanczos, tr("Lanczos")), PAIR(ScalingFilter, ScaleForce, tr("ScaleForce")), PAIR(ScalingFilter, Fsr, tr("AMD FidelityFX™️ Super Resolution")), PAIR(ScalingFilter, Area, tr("Area")), + PAIR(ScalingFilter, Mmpx, tr("MMPX")), + PAIR(ScalingFilter, ZeroTangent, tr("Zero-Tangent")), + PAIR(ScalingFilter, BSpline, tr("B-Spline")), + PAIR(ScalingFilter, Mitchell, tr("Mitchell")), + PAIR(ScalingFilter, Spline1, tr("Spline-1")), }}); translations->insert({Settings::EnumMetadata::Index(), { @@ -642,58 +619,58 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) translations->insert( {Settings::EnumMetadata::Index(), { - {static_cast(Settings::TimeZone::Auto), - tr("Auto (%1)", "Auto select time zone") - .arg(QString::fromStdString( - Settings::GetTimeZoneString(Settings::TimeZone::Auto)))}, - {static_cast(Settings::TimeZone::Default), - tr("Default (%1)", "Default time zone") - .arg(QString::fromStdString(Common::TimeZone::GetDefaultTimeZone()))}, - PAIR(TimeZone, Cet, tr("CET")), - PAIR(TimeZone, Cst6Cdt, tr("CST6CDT")), - PAIR(TimeZone, Cuba, tr("Cuba")), - PAIR(TimeZone, Eet, tr("EET")), - PAIR(TimeZone, Egypt, tr("Egypt")), - PAIR(TimeZone, Eire, tr("Eire")), - PAIR(TimeZone, Est, tr("EST")), - PAIR(TimeZone, Est5Edt, tr("EST5EDT")), - PAIR(TimeZone, Gb, tr("GB")), - PAIR(TimeZone, GbEire, tr("GB-Eire")), - PAIR(TimeZone, Gmt, tr("GMT")), - PAIR(TimeZone, GmtPlusZero, tr("GMT+0")), - PAIR(TimeZone, GmtMinusZero, tr("GMT-0")), - PAIR(TimeZone, GmtZero, tr("GMT0")), - PAIR(TimeZone, Greenwich, tr("Greenwich")), - PAIR(TimeZone, Hongkong, tr("Hongkong")), - PAIR(TimeZone, Hst, tr("HST")), - PAIR(TimeZone, Iceland, tr("Iceland")), - PAIR(TimeZone, Iran, tr("Iran")), - PAIR(TimeZone, Israel, tr("Israel")), - PAIR(TimeZone, Jamaica, tr("Jamaica")), - PAIR(TimeZone, Japan, tr("Japan")), - PAIR(TimeZone, Kwajalein, tr("Kwajalein")), - PAIR(TimeZone, Libya, tr("Libya")), - PAIR(TimeZone, Met, tr("MET")), - PAIR(TimeZone, Mst, tr("MST")), - PAIR(TimeZone, Mst7Mdt, tr("MST7MDT")), - PAIR(TimeZone, Navajo, tr("Navajo")), - PAIR(TimeZone, Nz, tr("NZ")), - PAIR(TimeZone, NzChat, tr("NZ-CHAT")), - PAIR(TimeZone, Poland, tr("Poland")), - PAIR(TimeZone, Portugal, tr("Portugal")), - PAIR(TimeZone, Prc, tr("PRC")), - PAIR(TimeZone, Pst8Pdt, tr("PST8PDT")), - PAIR(TimeZone, Roc, tr("ROC")), - PAIR(TimeZone, Rok, tr("ROK")), - PAIR(TimeZone, Singapore, tr("Singapore")), - PAIR(TimeZone, Turkey, tr("Turkey")), - PAIR(TimeZone, Uct, tr("UCT")), - PAIR(TimeZone, Universal, tr("Universal")), - PAIR(TimeZone, Utc, tr("UTC")), - PAIR(TimeZone, WSu, tr("W-SU")), - PAIR(TimeZone, Wet, tr("WET")), - PAIR(TimeZone, Zulu, tr("Zulu")), - }}); + {static_cast(Settings::TimeZone::Auto), + tr("Auto (%1)", "Auto select time zone") + .arg(QString::fromStdString( + Settings::GetTimeZoneString(Settings::TimeZone::Auto)))}, + {static_cast(Settings::TimeZone::Default), + tr("Default (%1)", "Default time zone") + .arg(QString::fromStdString(Common::TimeZone::GetDefaultTimeZone()))}, + PAIR(TimeZone, Cet, tr("CET")), + PAIR(TimeZone, Cst6Cdt, tr("CST6CDT")), + PAIR(TimeZone, Cuba, tr("Cuba")), + PAIR(TimeZone, Eet, tr("EET")), + PAIR(TimeZone, Egypt, tr("Egypt")), + PAIR(TimeZone, Eire, tr("Eire")), + PAIR(TimeZone, Est, tr("EST")), + PAIR(TimeZone, Est5Edt, tr("EST5EDT")), + PAIR(TimeZone, Gb, tr("GB")), + PAIR(TimeZone, GbEire, tr("GB-Eire")), + PAIR(TimeZone, Gmt, tr("GMT")), + PAIR(TimeZone, GmtPlusZero, tr("GMT+0")), + PAIR(TimeZone, GmtMinusZero, tr("GMT-0")), + PAIR(TimeZone, GmtZero, tr("GMT0")), + PAIR(TimeZone, Greenwich, tr("Greenwich")), + PAIR(TimeZone, Hongkong, tr("Hongkong")), + PAIR(TimeZone, Hst, tr("HST")), + PAIR(TimeZone, Iceland, tr("Iceland")), + PAIR(TimeZone, Iran, tr("Iran")), + PAIR(TimeZone, Israel, tr("Israel")), + PAIR(TimeZone, Jamaica, tr("Jamaica")), + PAIR(TimeZone, Japan, tr("Japan")), + PAIR(TimeZone, Kwajalein, tr("Kwajalein")), + PAIR(TimeZone, Libya, tr("Libya")), + PAIR(TimeZone, Met, tr("MET")), + PAIR(TimeZone, Mst, tr("MST")), + PAIR(TimeZone, Mst7Mdt, tr("MST7MDT")), + PAIR(TimeZone, Navajo, tr("Navajo")), + PAIR(TimeZone, Nz, tr("NZ")), + PAIR(TimeZone, NzChat, tr("NZ-CHAT")), + PAIR(TimeZone, Poland, tr("Poland")), + PAIR(TimeZone, Portugal, tr("Portugal")), + PAIR(TimeZone, Prc, tr("PRC")), + PAIR(TimeZone, Pst8Pdt, tr("PST8PDT")), + PAIR(TimeZone, Roc, tr("ROC")), + PAIR(TimeZone, Rok, tr("ROK")), + PAIR(TimeZone, Singapore, tr("Singapore")), + PAIR(TimeZone, Turkey, tr("Turkey")), + PAIR(TimeZone, Uct, tr("UCT")), + PAIR(TimeZone, Universal, tr("Universal")), + PAIR(TimeZone, Utc, tr("UTC")), + PAIR(TimeZone, WSu, tr("W-SU")), + PAIR(TimeZone, Wet, tr("WET")), + PAIR(TimeZone, Zulu, tr("Zulu")), + }}); translations->insert({Settings::EnumMetadata::Index(), { PAIR(AudioMode, Mono, tr("Mono")), @@ -738,3 +715,4 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) return translations; } } // namespace ConfigurationShared + diff --git a/src/yuzu/configuration/shared_translation.h b/src/qt_common/shared_translation.h similarity index 80% rename from src/yuzu/configuration/shared_translation.h rename to src/qt_common/shared_translation.h index 574b1e2c78..a25887bb87 100644 --- a/src/yuzu/configuration/shared_translation.h +++ b/src/qt_common/shared_translation.h @@ -11,23 +11,20 @@ #include #include -#include #include #include #include #include "common/common_types.h" -#include "common/settings.h" - -class QWidget; +#include "common/settings_enums.h" namespace ConfigurationShared { using TranslationMap = std::map>; using ComboboxTranslations = std::vector>; using ComboboxTranslationMap = std::map; -std::unique_ptr InitializeTranslations(QWidget* parent); +std::unique_ptr InitializeTranslations(QObject *parent); -std::unique_ptr ComboboxEnumeration(QWidget* parent); +std::unique_ptr ComboboxEnumeration(QObject* parent); static const std::map anti_aliasing_texts_map = { {Settings::AntiAliasing::None, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "None"))}, @@ -41,12 +38,20 @@ static const std::map scaling_filter_texts_map {Settings::ScalingFilter::Bilinear, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Bilinear"))}, {Settings::ScalingFilter::Bicubic, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Bicubic"))}, + {Settings::ScalingFilter::ZeroTangent, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Zero-Tangent"))}, + {Settings::ScalingFilter::BSpline, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "B-Spline"))}, + {Settings::ScalingFilter::Mitchell, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Mitchell"))}, + {Settings::ScalingFilter::Spline1, + QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Spline-1"))}, {Settings::ScalingFilter::Gaussian, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Gaussian"))}, + {Settings::ScalingFilter::Lanczos, + QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Lanczos"))}, {Settings::ScalingFilter::ScaleForce, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "ScaleForce"))}, {Settings::ScalingFilter::Fsr, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "FSR"))}, {Settings::ScalingFilter::Area, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "Area"))}, + {Settings::ScalingFilter::Mmpx, QStringLiteral(QT_TRANSLATE_NOOP("GMainWindow", "MMPX"))}, }; static const std::map use_docked_mode_texts_map = { diff --git a/src/yuzu/uisettings.cpp b/src/qt_common/uisettings.cpp similarity index 99% rename from src/yuzu/uisettings.cpp rename to src/qt_common/uisettings.cpp index 6da5424775..a17f3c0a4a 100644 --- a/src/yuzu/uisettings.cpp +++ b/src/qt_common/uisettings.cpp @@ -7,7 +7,7 @@ #include #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #ifndef CANNOT_EXPLICITLY_INSTANTIATE namespace Settings { diff --git a/src/yuzu/uisettings.h b/src/qt_common/uisettings.h similarity index 99% rename from src/yuzu/uisettings.h rename to src/qt_common/uisettings.h index 85de0ae72d..4981d98dbf 100644 --- a/src/yuzu/uisettings.h +++ b/src/qt_common/uisettings.h @@ -17,7 +17,7 @@ #include "common/common_types.h" #include "common/settings.h" #include "common/settings_enums.h" -#include "configuration/qt_config.h" +#include "qt_common/qt_config.h" using Settings::Category; using Settings::ConfirmStop; @@ -212,6 +212,9 @@ struct Values { // Play time Setting show_play_time{linkage, true, "show_play_time", Category::UiGameList}; + // misc + Setting show_fw_warning{linkage, true, "show_fw_warning", Category::Miscellaneous}; + bool configuration_applied; bool reset_to_defaults; bool shortcut_already_warned{false}; diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index 5d896db93d..79a4bf4fd2 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt @@ -246,7 +246,7 @@ add_library(shader_recompiler STATIC ) -target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit SPIRV-Tools-opt SPIRV-Tools SPIRV-Tools-link) +target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit::sirit SPIRV-Tools::SPIRV-Tools) if (MSVC) target_compile_options(shader_recompiler PRIVATE diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.cpp b/src/shader_recompiler/backend/glasm/reg_alloc.cpp index 3919d63268..e78aee23d1 100644 --- a/src/shader_recompiler/backend/glasm/reg_alloc.cpp +++ b/src/shader_recompiler/backend/glasm/reg_alloc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -123,7 +126,7 @@ Id RegAlloc::Alloc(bool is_long) { if (use[reg]) { continue; } - num_regs = std::max(num_regs, reg + 1); + num_regs = (std::max)(num_regs, reg + 1); use[reg] = true; Id ret{}; ret.is_valid.Assign(1); diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp index 49397c9b2e..77e644440b 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_integer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -39,7 +42,7 @@ void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::strin // which may be overwritten by the result of the addition if (IR::Inst * overflow{inst.GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp)}) { // https://stackoverflow.com/questions/55468823/how-to-detect-integer-overflow-in-c - constexpr u32 s32_max{static_cast(std::numeric_limits::max())}; + constexpr u32 s32_max{static_cast((std::numeric_limits::max)())}; const auto sub_a{fmt::format("{}u-{}", s32_max, a)}; const auto positive_result{fmt::format("int({})>int({})", b, sub_a)}; const auto negative_result{fmt::format("int({})::max())), + ctx.OpBitcast(ctx.F32[1], ctx.Const((std::numeric_limits::max)())), ctx.f32_zero_value); case IR::Attribute::PointSpriteS: return ctx.OpLoad(ctx.F32[1], diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp index 960bdea6f1..000d193689 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,7 +45,7 @@ Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { SetSignFlag(ctx, inst, result); if (IR::Inst * overflow{inst->GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp)}) { // https://stackoverflow.com/questions/55468823/how-to-detect-integer-overflow-in-c - constexpr u32 s32_max{static_cast(std::numeric_limits::max())}; + constexpr u32 s32_max{static_cast((std::numeric_limits::max)())}; const Id is_positive{ctx.OpSGreaterThanEqual(ctx.U1, a, ctx.u32_zero_value)}; const Id sub_a{ctx.OpISub(ctx.U32[1], ctx.Const(s32_max), a)}; diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 388ddce2c8..4c3e101433 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -1593,7 +1596,7 @@ void EmitContext::DefineOutputs(const IR::Program& program) { throw NotImplementedException("Storing ClipDistance in fragment stage"); } if (profile.max_user_clip_distances > 0) { - const u32 used{std::min(profile.max_user_clip_distances, 8u)}; + const u32 used{(std::min)(profile.max_user_clip_distances, 8u)}; const std::array zero{f32_zero_value, f32_zero_value, f32_zero_value, f32_zero_value, f32_zero_value, f32_zero_value, f32_zero_value, f32_zero_value}; diff --git a/src/shader_recompiler/frontend/ir/opcodes.h b/src/shader_recompiler/frontend/ir/opcodes.h index 3376daf128..3d6a3539bb 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.h +++ b/src/shader_recompiler/frontend/ir/opcodes.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include -#include "common/polyfill_ranges.h" +#include #include "shader_recompiler/frontend/ir/type.h" namespace Shader::IR { diff --git a/src/shader_recompiler/frontend/maxwell/control_flow.cpp b/src/shader_recompiler/frontend/maxwell/control_flow.cpp index a2ad56cc49..7dabfbf16e 100644 --- a/src/shader_recompiler/frontend/maxwell/control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/control_flow.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include -#include "common/polyfill_ranges.h" +#include #include "shader_recompiler/exception.h" #include "shader_recompiler/frontend/maxwell/control_flow.h" #include "shader_recompiler/frontend/maxwell/decode.h" diff --git a/src/shader_recompiler/frontend/maxwell/decode.cpp b/src/shader_recompiler/frontend/maxwell/decode.cpp index 47111a0501..601dcfdfa8 100644 --- a/src/shader_recompiler/frontend/maxwell/decode.cpp +++ b/src/shader_recompiler/frontend/maxwell/decode.cpp @@ -9,7 +9,7 @@ #include #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include #include "shader_recompiler/exception.h" #include "shader_recompiler/frontend/maxwell/decode.h" #include "shader_recompiler/frontend/maxwell/opcodes.h" @@ -73,7 +73,7 @@ constexpr auto ENCODINGS{SortedEncodings()}; constexpr int WidestLeftBits() { int bits{64}; for (const InstEncoding& encoding : ENCODINGS) { - bits = std::min(bits, std::countr_zero(encoding.mask_value.mask)); + bits = (std::min)(bits, std::countr_zero(encoding.mask_value.mask)); } return 64 - bits; } @@ -87,7 +87,7 @@ constexpr size_t ToFastLookupIndex(u64 value) { constexpr size_t FastLookupSize() { size_t max_width{}; for (const InstEncoding& encoding : ENCODINGS) { - max_width = std::max(max_width, ToFastLookupIndex(encoding.mask_value.mask)); + max_width = (std::max)(max_width, ToFastLookupIndex(encoding.mask_value.mask)); } return max_width + 1; } diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp index 3c18f49982..6d325b4aad 100644 --- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ #include -#include "common/polyfill_ranges.h" +#include #include "shader_recompiler/environment.h" #include "shader_recompiler/frontend/ir/basic_block.h" #include "shader_recompiler/frontend/ir/ir_emitter.h" @@ -988,6 +991,7 @@ IR::AbstractSyntaxList BuildASL(ObjectPool& inst_pool, ObjectPool ClampBounds(DestFormat format, bool is_signed) { if (is_signed) { switch (format) { case DestFormat::I16: - return {static_cast(std::numeric_limits::max()), - static_cast(std::numeric_limits::min())}; + return {static_cast((std::numeric_limits::max)()), + static_cast((std::numeric_limits::min)())}; case DestFormat::I32: - return {static_cast(std::numeric_limits::max()), - static_cast(std::numeric_limits::min())}; + return {static_cast((std::numeric_limits::max)()), + static_cast((std::numeric_limits::min)())}; case DestFormat::I64: - return {static_cast(std::numeric_limits::max()), - static_cast(std::numeric_limits::min())}; + return {static_cast((std::numeric_limits::max)()), + static_cast((std::numeric_limits::min)())}; default: break; } } else { switch (format) { case DestFormat::I16: - return {static_cast(std::numeric_limits::max()), - static_cast(std::numeric_limits::min())}; + return {static_cast((std::numeric_limits::max)()), + static_cast((std::numeric_limits::min)())}; case DestFormat::I32: - return {static_cast(std::numeric_limits::max()), - static_cast(std::numeric_limits::min())}; + return {static_cast((std::numeric_limits::max)()), + static_cast((std::numeric_limits::min)())}; case DestFormat::I64: - return {static_cast(std::numeric_limits::max()), - static_cast(std::numeric_limits::min())}; + return {static_cast((std::numeric_limits::max)()), + static_cast((std::numeric_limits::min)())}; default: break; } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp index 157e5dfaaf..8b5a103006 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp @@ -271,40 +271,4 @@ void TranslatorVisitor::ResetOFlag() { SetOFlag(ir.Imm1(false)); } -IR::U32 TranslatorVisitor::apply_ISBERD_shift(IR::U32 result, Isberd::Shift shift_value) { - if (shift_value != Isberd::Shift::Default) { - return ir.ShiftLeftLogical(result, ir.Imm32(1)); - } - return result; -} - -IR::U32 TranslatorVisitor::apply_ISBERD_size_read(IR::U32 address, Isberd::SZ sz) { - switch (sz) { - case Isberd::SZ::U8: - return ir.LoadGlobalU8(ir.UConvert(64, address)); - case Isberd::SZ::U16: - return ir.LoadGlobalU16(ir.UConvert(64, address)); - case Isberd::SZ::U32: - case Isberd::SZ::F32: - return ir.LoadGlobal32(ir.UConvert(64, address)); - default: - UNREACHABLE(); - } -} - -IR::U32 TranslatorVisitor::compute_ISBERD_address(IR::Reg src_reg, u32 src_reg_num, u32 imm, u64 skew_value) { - IR::U32 address{}; - if (src_reg_num == 0xFF) { - address = ir.Imm32(imm); - } else { - auto offset = ir.Imm32(imm); - address = ir.IAdd(X(src_reg), offset); - if (skew_value != 0) { - address = ir.IAdd(address, ir.LaneId()); - } - } - - return address; -}; - } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h index 1b2547a1bd..37963dc777 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h @@ -56,30 +56,6 @@ enum class FPCompareOp : u64 { T, }; -namespace Isberd { -enum class Mode : u64 { - Default, - Patch, - Prim, - Attr, -}; - -enum class Shift : u64 { - Default, - U16, - B32, -}; - -enum class SZ : u64 { - U8, - U16, - U32, - F32, -}; - -} // namespace Isberd - - class TranslatorVisitor { public: explicit TranslatorVisitor(Environment& env_, IR::Block& block) : env{env_}, ir(block) {} @@ -408,12 +384,6 @@ public: void ResetSFlag(); void ResetCFlag(); void ResetOFlag(); - -private: - // Helper functions for various translator visitors - IR::U32 apply_ISBERD_shift(IR::U32 result, Isberd::Shift shift_value); - IR::U32 apply_ISBERD_size_read(IR::U32 address, Isberd::SZ sz_value); - IR::U32 compute_ISBERD_address(IR::Reg src_reg, u32 src_reg_num, u32 imm, u64 skew_value); }; } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp index a2dc0f4a6e..1f98b073be 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -114,9 +117,9 @@ void I2F(TranslatorVisitor& v, u64 insn, IR::U32U64 src) { // Only negate if the input isn't the lowest value IR::U1 is_least; if (src_bitsize == 64) { - is_least = v.ir.IEqual(src, v.ir.Imm64(std::numeric_limits::min())); + is_least = v.ir.IEqual(src, v.ir.Imm64((std::numeric_limits::min)())); } else if (src_bitsize == 32) { - is_least = v.ir.IEqual(src, v.ir.Imm32(std::numeric_limits::min())); + is_least = v.ir.IEqual(src, v.ir.Imm32((std::numeric_limits::min)())); } else { const IR::U32 least_value{v.ir.Imm32(-(1 << (src_bitsize - 1)))}; is_least = v.ir.IEqual(src, least_value); diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp index 2aaf85772d..e6345de65e 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp @@ -9,9 +9,52 @@ #include "shader_recompiler/frontend/maxwell/translate/impl/impl.h" namespace Shader::Maxwell { +namespace { +enum class Mode : u64 { + Default, + Patch, + Prim, + Attr, +}; + +enum class SZ : u64 { + U8, + U16, + U32, + F32 +}; + +enum class Shift : u64 { + Default, + U16, + B32, +}; + +IR::U32 scaleIndex(IR::IREmitter& ir, IR::U32 index, Shift shift) { + switch (shift) { + case Shift::Default: return index; + case Shift::U16: return ir.ShiftLeftLogical(index, ir.Imm32(1)); + case Shift::B32: return ir.ShiftLeftLogical(index, ir.Imm32(2)); + default: UNREACHABLE(); + } +} + +IR::U32 skewBytes(IR::IREmitter& ir, SZ sizeRead) { + const IR::U32 lane = ir.LaneId(); + switch (sizeRead) { + case SZ::U8: return lane; + case SZ::U16: return ir.ShiftLeftLogical(lane, ir.Imm32(1)); + case SZ::U32: + case SZ::F32: return ir.ShiftLeftLogical(lane, ir.Imm32(2)); + default: UNREACHABLE(); + } +} + +} // Anonymous namespace -// Valid only for GS, TI, VS and trap void TranslatorVisitor::ISBERD(u64 insn) { + LOG_DEBUG(Shader, "called with insn={:#X}", insn); + union { u64 raw; BitField<0, 8, IR::Reg> dest_reg; @@ -20,49 +63,66 @@ void TranslatorVisitor::ISBERD(u64 insn) { BitField<24, 8, u32> imm; BitField<31, 1, u64> skew; BitField<32, 1, u64> o; - BitField<33, 2, Isberd::Mode> mode; - BitField<36, 4, Isberd::SZ> sz; - BitField<47, 2, Isberd::Shift> shift; + BitField<33, 2, Mode> mode; + BitField<36, 4, SZ> sz; + BitField<47, 2, Shift> shift; } const isberd{insn}; - auto address = compute_ISBERD_address(isberd.src_reg, isberd.src_reg_num, isberd.imm, isberd.skew); - if (isberd.o != 0) { - auto result = apply_ISBERD_size_read(address, isberd.sz.Value()); - X(isberd.dest_reg, apply_ISBERD_shift(result, isberd.shift.Value())); - - return; + IR::U32 index{}; + if (isberd.src_reg_num.Value() == 0xFF) { + index = ir.Imm32(isberd.imm.Value()); + } else { + const IR::U32 scaledIndex = scaleIndex(ir, X(isberd.src_reg.Value()), isberd.shift.Value()); + index = ir.IAdd(scaledIndex, ir.Imm32(isberd.imm.Value())); } - if (isberd.mode != Isberd::Mode::Default) { - IR::F32 result_f32{}; - switch (isberd.mode.Value()) { - case Isberd::Mode::Patch: - result_f32 = ir.GetPatch(address.Patch()); - break; - case Isberd::Mode::Prim: - result_f32 = ir.GetAttribute(address.Attribute()); - break; - case Isberd::Mode::Attr: - result_f32 = ir.GetAttributeIndexed(address); - break; - default: - UNREACHABLE(); + if (isberd.o.Value()) { + if (isberd.skew.Value()) { + index = ir.IAdd(index, skewBytes(ir, isberd.sz.Value())); } - auto result_u32 = ir.BitCast(result_f32); - X(isberd.dest_reg, apply_ISBERD_shift(result_u32, isberd.shift.Value())); - return; - } - - if (isberd.skew != 0) { - auto result = ir.IAdd(X(isberd.src_reg), ir.LaneId()); - X(isberd.dest_reg, result); + const IR::U64 index64 = ir.UConvert(64, index); + IR::U32 globalLoaded{}; + switch (isberd.sz.Value()) { + case SZ::U8: globalLoaded = ir.LoadGlobalU8 (index64); break; + case SZ::U16: globalLoaded = ir.LoadGlobalU16(index64); break; + case SZ::U32: + case SZ::F32: globalLoaded = ir.LoadGlobal32(index64); break; + default: UNREACHABLE(); + } + X(isberd.dest_reg.Value(), globalLoaded); return; } - // Fallback if nothing else applies - X(isberd.dest_reg, X(isberd.src_reg)); + if (isberd.mode.Value() != Mode::Default) { + if (isberd.skew.Value()) { + index = ir.IAdd(index, skewBytes(ir, SZ::U32)); + } + + IR::F32 float_index{}; + switch (isberd.mode.Value()) { + case Mode::Patch: float_index = ir.GetPatch(index.Patch()); + break; + case Mode::Prim: float_index = ir.GetAttribute(index.Attribute()); + break; + case Mode::Attr: float_index = ir.GetAttributeIndexed(index); + break; + default: UNREACHABLE(); + } + X(isberd.dest_reg.Value(), ir.BitCast(float_index)); + + return; + } + + if (isberd.skew.Value()) { + X(isberd.dest_reg.Value(), ir.IAdd(X(isberd.src_reg.Value()), ir.LaneId())); + + return; + } + + // Fallback copy + X(isberd.dest_reg.Value(), X(isberd.src_reg.Value())); } } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index 321ea625bc..97b9b0cf07 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -336,7 +339,7 @@ IR::Program MergeDualVertexPrograms(IR::Program& vertex_a, IR::Program& vertex_b } result.stage = Stage::VertexB; result.info = vertex_a.info; - result.local_memory_size = std::max(vertex_a.local_memory_size, vertex_b.local_memory_size); + result.local_memory_size = (std::max)(vertex_a.local_memory_size, vertex_b.local_memory_size); result.info.loads.mask |= vertex_b.info.loads.mask; result.info.stores.mask |= vertex_b.info.stores.mask; diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp index cb82a326c1..2bfa3227a8 100644 --- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp +++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -509,7 +512,7 @@ void VisitUsages(Info& info, IR::Inst& inst) { u32 element_size = GetElementSize(info.used_constant_buffer_types, inst.GetOpcode()); u32& size{info.constant_buffer_used_sizes[index.U32()]}; if (offset.IsImmediate()) { - size = Common::AlignUp(std::max(size, offset.U32() + element_size), 16u); + size = Common::AlignUp((std::max)(size, offset.U32() + element_size), 16u); } else { size = 0x10'000; } diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp index 12d7b2d7fa..2791703307 100644 --- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -905,7 +908,7 @@ void FoldConstBuffer(Environment& env, IR::Block& block, IR::Inst& inst) { } void FoldDriverConstBuffer(Environment& env, IR::Block& block, IR::Inst& inst, u32 which_bank, - u32 offset_start = 0, u32 offset_end = std::numeric_limits::max()) { + u32 offset_start = 0, u32 offset_end = (std::numeric_limits::max)()) { const IR::Value bank{inst.Arg(0)}; const IR::Value offset{inst.Arg(1)}; if (!bank.IsImmediate() || !offset.IsImmediate()) { diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index afd880526a..7ff1961172 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -7,7 +7,9 @@ #include #include #include - +#include +#include +#include #include #include "shader_recompiler/environment.h" @@ -177,6 +179,93 @@ bool IsBindless(const IR::Inst& inst) { bool IsTextureInstruction(const IR::Inst& inst) { return IndexedInstruction(inst) != IR::Opcode::Void; } +// Per-pass caches + struct CbufWordKey { + u32 index; + u32 offset; + bool operator==(const CbufWordKey& o) const noexcept { + return index == o.index && offset == o.offset; + } + }; + struct CbufWordKeyHash { + size_t operator()(const CbufWordKey& k) const noexcept { + return (static_cast(k.index) << 32) ^ k.offset; + } + }; + + struct HandleKey { + u32 index, offset, shift_left; + u32 sec_index, sec_offset, sec_shift_left; + bool has_secondary; + bool operator==(const HandleKey& o) const noexcept { + return std::tie(index, offset, shift_left, + sec_index, sec_offset, sec_shift_left, has_secondary) + == std::tie(o.index, o.offset, o.shift_left, + o.sec_index, o.sec_offset, o.sec_shift_left, o.has_secondary); + } + }; + struct HandleKeyHash { + size_t operator()(const HandleKey& k) const noexcept { + size_t h = (static_cast(k.index) << 32) ^ k.offset; + h ^= (static_cast(k.shift_left) << 1); + h ^= (static_cast(k.sec_index) << 33) ^ (static_cast(k.sec_offset) << 2); + h ^= (static_cast(k.sec_shift_left) << 3); + h ^= k.has_secondary ? 0x9e3779b97f4a7c15ULL : 0ULL; + return h; + } + }; + +// Thread-local(may implement multithreading in future *wink*) + thread_local std::unordered_map g_cbuf_word_cache; + thread_local std::unordered_map g_handle_cache; + thread_local std::unordered_map g_track_cache; + + static inline u32 ReadCbufCached(Environment& env, u32 index, u32 offset) { + const CbufWordKey k{index, offset}; + if (auto it = g_cbuf_word_cache.find(k); it != g_cbuf_word_cache.end()) return it->second; + const u32 v = env.ReadCbufValue(index, offset); + g_cbuf_word_cache.emplace(k, v); + return v; + } + + static inline u32 GetTextureHandleCached(Environment& env, const ConstBufferAddr& cbuf) { + const u32 sec_idx = cbuf.has_secondary ? cbuf.secondary_index : cbuf.index; + const u32 sec_off = cbuf.has_secondary ? cbuf.secondary_offset : cbuf.offset; + const HandleKey hk{cbuf.index, cbuf.offset, cbuf.shift_left, + sec_idx, sec_off, cbuf.secondary_shift_left, cbuf.has_secondary}; + if (auto it = g_handle_cache.find(hk); it != g_handle_cache.end()) return it->second; + + const u32 lhs = ReadCbufCached(env, cbuf.index, cbuf.offset) << cbuf.shift_left; + const u32 rhs = ReadCbufCached(env, sec_idx, sec_off) << cbuf.secondary_shift_left; + const u32 handle = lhs | rhs; + g_handle_cache.emplace(hk, handle); + return handle; + } + +// Cached variants of existing helpers + static inline TextureType ReadTextureTypeCached(Environment& env, const ConstBufferAddr& cbuf) { + return env.ReadTextureType(GetTextureHandleCached(env, cbuf)); + } + static inline TexturePixelFormat ReadTexturePixelFormatCached(Environment& env, + const ConstBufferAddr& cbuf) { + return env.ReadTexturePixelFormat(GetTextureHandleCached(env, cbuf)); + } + static inline bool IsTexturePixelFormatIntegerCached(Environment& env, + const ConstBufferAddr& cbuf) { + return env.IsTexturePixelFormatInteger(GetTextureHandleCached(env, cbuf)); + } + + + std::optional Track(const IR::Value& value, Environment& env); + static inline std::optional TrackCached(const IR::Value& v, Environment& env) { + if (const IR::Inst* key = v.InstRecursive()) { + if (auto it = g_track_cache.find(key); it != g_track_cache.end()) return it->second; + auto found = Track(v, env); + if (found) g_track_cache.emplace(key, *found); + return found; + } + return Track(v, env); + } std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env); @@ -203,7 +292,7 @@ std::optional TryGetConstant(IR::Value& value, Environment& env) { return std::nullopt; } const auto offset_number = offset.U32(); - return env.ReadCbufValue(index_number, offset_number); + return ReadCbufCached(env, index_number, offset_number); } std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env) { @@ -211,8 +300,8 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme default: return std::nullopt; case IR::Opcode::BitwiseOr32: { - std::optional lhs{Track(inst->Arg(0), env)}; - std::optional rhs{Track(inst->Arg(1), env)}; + std::optional lhs{TrackCached(inst->Arg(0), env)}; + std::optional rhs{TrackCached(inst->Arg(1), env)}; if (!lhs || !rhs) { return std::nullopt; } @@ -242,7 +331,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme if (!shift.IsImmediate()) { return std::nullopt; } - std::optional lhs{Track(inst->Arg(0), env)}; + std::optional lhs{TrackCached(inst->Arg(0), env)}; if (lhs) { lhs->shift_left = shift.U32(); } @@ -271,7 +360,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme return std::nullopt; } while (false); } - std::optional lhs{Track(op1, env)}; + std::optional lhs{TrackCached(op1, env)}; if (lhs) { lhs->shift_left = static_cast(std::countr_zero(op2.U32())); } @@ -346,7 +435,7 @@ static ConstBufferAddr last_valid_addr = ConstBufferAddr{ TextureInst MakeInst(Environment& env, IR::Block* block, IR::Inst& inst) { ConstBufferAddr addr; if (IsBindless(inst)) { - const std::optional track_addr{Track(inst.Arg(0), env)}; + const std::optional track_addr{TrackCached(inst.Arg(0), env)}; if (!track_addr) { //throw NotImplementedException("Failed to track bindless texture constant buffer"); @@ -384,15 +473,15 @@ u32 GetTextureHandle(Environment& env, const ConstBufferAddr& cbuf) { return lhs_raw | rhs_raw; } -TextureType ReadTextureType(Environment& env, const ConstBufferAddr& cbuf) { + [[maybe_unused]]TextureType ReadTextureType(Environment& env, const ConstBufferAddr& cbuf) { return env.ReadTextureType(GetTextureHandle(env, cbuf)); } -TexturePixelFormat ReadTexturePixelFormat(Environment& env, const ConstBufferAddr& cbuf) { + [[maybe_unused]]TexturePixelFormat ReadTexturePixelFormat(Environment& env, const ConstBufferAddr& cbuf) { return env.ReadTexturePixelFormat(GetTextureHandle(env, cbuf)); } -bool IsTexturePixelFormatInteger(Environment& env, const ConstBufferAddr& cbuf) { + [[maybe_unused]]bool IsTexturePixelFormatInteger(Environment& env, const ConstBufferAddr& cbuf) { return env.IsTexturePixelFormatInteger(GetTextureHandle(env, cbuf)); } @@ -517,11 +606,11 @@ void PatchTexelFetch(IR::Block& block, IR::Inst& inst, TexturePixelFormat pixel_ case TexturePixelFormat::A8B8G8R8_SNORM: case TexturePixelFormat::R8G8_SNORM: case TexturePixelFormat::R8_SNORM: - return 1.f / std::numeric_limits::max(); + return 1.f / (std::numeric_limits::max)(); case TexturePixelFormat::R16G16B16A16_SNORM: case TexturePixelFormat::R16G16_SNORM: case TexturePixelFormat::R16_SNORM: - return 1.f / std::numeric_limits::max(); + return 1.f / (std::numeric_limits::max)(); default: throw InvalidArgument("Invalid texture pixel format"); } @@ -543,6 +632,10 @@ void PatchTexelFetch(IR::Block& block, IR::Inst& inst, TexturePixelFormat pixel_ } // Anonymous namespace void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo& host_info) { + // reset per-pass caches + g_cbuf_word_cache.clear(); + g_handle_cache.clear(); + g_track_cache.clear(); TextureInstVector to_replace; for (IR::Block* const block : program.post_order_blocks) { for (IR::Inst& inst : block->Instructions()) { @@ -553,11 +646,9 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo } } // Sort instructions to visit textures by constant buffer index, then by offset - std::ranges::sort(to_replace, [](const auto& lhs, const auto& rhs) { - return lhs.cbuf.offset < rhs.cbuf.offset; - }); - std::stable_sort(to_replace.begin(), to_replace.end(), [](const auto& lhs, const auto& rhs) { - return lhs.cbuf.index < rhs.cbuf.index; + std::ranges::sort(to_replace, [](const auto& a, const auto& b) { + if (a.cbuf.index != b.cbuf.index) return a.cbuf.index < b.cbuf.index; + return a.cbuf.offset < b.cbuf.offset; }); Descriptors descriptors{ program.info.texture_buffer_descriptors, @@ -575,14 +666,14 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo bool is_multisample{false}; switch (inst->GetOpcode()) { case IR::Opcode::ImageQueryDimensions: - flags.type.Assign(ReadTextureType(env, cbuf)); + flags.type.Assign(ReadTextureTypeCached(env, cbuf)); inst->SetFlags(flags); break; case IR::Opcode::ImageSampleImplicitLod: if (flags.type != TextureType::Color2D) { break; } - if (ReadTextureType(env, cbuf) == TextureType::Color2DRect) { + if (ReadTextureTypeCached(env, cbuf) == TextureType::Color2DRect) { PatchImageSampleImplicitLod(*texture_inst.block, *texture_inst.inst); } break; @@ -596,7 +687,7 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo if (flags.type != TextureType::Color1D) { break; } - if (ReadTextureType(env, cbuf) == TextureType::Buffer) { + if (ReadTextureTypeCached(env, cbuf) == TextureType::Buffer) { // Replace with the bound texture type only when it's a texture buffer // If the instruction is 1D and the bound type is 2D, don't change the code and let // the rasterizer robustness handle it @@ -627,7 +718,7 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo } const bool is_written{inst->GetOpcode() != IR::Opcode::ImageRead}; const bool is_read{inst->GetOpcode() != IR::Opcode::ImageWrite}; - const bool is_integer{IsTexturePixelFormatInteger(env, cbuf)}; + const bool is_integer{IsTexturePixelFormatIntegerCached(env, cbuf)}; if (flags.type == TextureType::Buffer) { index = descriptors.Add(ImageBufferDescriptor{ .format = flags.image_format, @@ -691,16 +782,16 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo if (cbuf.count > 1) { const auto insert_point{IR::Block::InstructionList::s_iterator_to(*inst)}; IR::IREmitter ir{*texture_inst.block, insert_point}; - const IR::U32 shift{ir.Imm32(std::countr_zero(DESCRIPTOR_SIZE))}; - inst->SetArg(0, ir.UMin(ir.ShiftRightArithmetic(cbuf.dynamic_offset, shift), - ir.Imm32(DESCRIPTOR_SIZE - 1))); + const IR::U32 shift{ir.Imm32(DESCRIPTOR_SIZE_SHIFT)}; + inst->SetArg(0, ir.UMin(ir.ShiftRightLogical(cbuf.dynamic_offset, shift), + ir.Imm32(DESCRIPTOR_SIZE - 1))); } else { inst->SetArg(0, IR::Value{}); } if (!host_info.support_snorm_render_buffer && inst->GetOpcode() == IR::Opcode::ImageFetch && flags.type == TextureType::Buffer) { - const auto pixel_format = ReadTexturePixelFormat(env, cbuf); + const auto pixel_format = ReadTexturePixelFormatCached(env, cbuf); if (IsPixelFormatSNorm(pixel_format)) { PatchTexelFetch(*texture_inst.block, *texture_inst.inst, pixel_format); } diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 1e158f3759..c1fdd374ef 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later @@ -21,7 +24,7 @@ add_executable(tests create_target_directory_groups(tests) -target_link_libraries(tests PRIVATE common core input_common) +target_link_libraries(tests PRIVATE common core input_common video_core) target_link_libraries(tests PRIVATE ${PLATFORM_LIBRARIES} Catch2::Catch2WithMain Threads::Threads) add_test(NAME tests COMMAND tests) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 89fe7a35f9..4a168241a4 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -321,18 +321,22 @@ add_library(video_core STATIC target_link_libraries(video_core PUBLIC common core) target_link_libraries(video_core PUBLIC glad shader_recompiler stb bc_decoder) -if (YUZU_USE_BUNDLED_FFMPEG AND NOT (WIN32 OR ANDROID)) +if (YUZU_USE_EXTERNAL_FFMPEG) add_dependencies(video_core ffmpeg-build) endif() target_include_directories(video_core PRIVATE ${FFmpeg_INCLUDE_DIR}) + target_link_libraries(video_core PRIVATE ${FFmpeg_LIBRARIES}) target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS}) add_dependencies(video_core host_shaders) target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE}) -target_link_libraries(video_core PRIVATE sirit Vulkan::Headers Vulkan::UtilityHeaders GPUOpen::VulkanMemoryAllocator) +target_link_libraries(video_core PRIVATE sirit::sirit) + +# Header-only stuff needed by all dependent targets +target_link_libraries(video_core PUBLIC Vulkan::UtilityHeaders GPUOpen::VulkanMemoryAllocator) if (ENABLE_NSIGHT_AFTERMATH) if (NOT DEFINED ENV{NSIGHT_AFTERMATH_SDK}) @@ -370,7 +374,7 @@ else() set_source_files_properties(vulkan_common/vma.cpp PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-unused-variable;-Wno-unused-parameter;-Wno-missing-field-initializers") # Get around GCC failing with intrinsics in Debug - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_BUILD_TYPE MATCHES "Debug") + if (CXX_GCC AND CMAKE_BUILD_TYPE MATCHES "Debug") set_source_files_properties(host1x/vic.cpp PROPERTIES COMPILE_OPTIONS "-O2") endif() endif() @@ -395,10 +399,6 @@ if (YUZU_USE_PRECOMPILED_HEADERS) target_precompile_headers(video_core PRIVATE precompiled_headers.h) endif() -if (YUZU_ENABLE_LTO) - set_property(TARGET video_core PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) -endif() - if (ANDROID AND ARCHITECTURE_arm64) target_link_libraries(video_core PRIVATE adrenotools) endif() diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 0cd6861b6d..5223afe937 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -26,7 +26,9 @@ BufferCache

::BufferCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, R void(slot_buffers.insert(runtime, NullBufferParams{})); gpu_modified_ranges.Clear(); inline_buffer_id = NULL_BUFFER_ID; - +#ifdef YUZU_LEGACY + immediately_free = (Settings::values.vram_usage_mode.GetValue() == Settings::VramUsageMode::Aggressive); +#endif if (!runtime.CanReportMemoryUsage()) { minimum_memory = DEFAULT_EXPECTED_MEMORY; critical_memory = DEFAULT_CRITICAL_MEMORY; @@ -36,14 +38,14 @@ BufferCache

::BufferCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, R const s64 device_local_memory = static_cast(runtime.GetDeviceLocalMemory()); const s64 min_spacing_expected = device_local_memory - 1_GiB; const s64 min_spacing_critical = device_local_memory - 512_MiB; - const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD); + const s64 mem_threshold = (std::min)(device_local_memory, TARGET_THRESHOLD); const s64 min_vacancy_expected = (6 * mem_threshold) / 10; const s64 min_vacancy_critical = (2 * mem_threshold) / 10; minimum_memory = static_cast( - std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected), + (std::max)((std::min)(device_local_memory - min_vacancy_expected, min_spacing_expected), DEFAULT_EXPECTED_MEMORY)); critical_memory = static_cast( - std::max(std::min(device_local_memory - min_vacancy_critical, min_spacing_critical), + (std::max)((std::min)(device_local_memory - min_vacancy_critical, min_spacing_critical), DEFAULT_CRITICAL_MEMORY)); } @@ -553,8 +555,8 @@ void BufferCache

::CommitAsyncFlushesHigh() { ForEachBufferInRange(device_addr, size, [&](BufferId buffer_id, Buffer& buffer) { const DAddr buffer_start = buffer.CpuAddr(); const DAddr buffer_end = buffer_start + buffer.SizeBytes(); - const DAddr new_start = std::max(buffer_start, device_addr); - const DAddr new_end = std::min(buffer_end, device_addr + size); + const DAddr new_start = (std::max)(buffer_start, device_addr); + const DAddr new_end = (std::min)(buffer_end, device_addr + size); memory_tracker.ForEachDownloadRange( new_start, new_end - new_start, false, [&](u64 device_addr_out, u64 range_size) { @@ -574,7 +576,7 @@ void BufferCache

::CommitAsyncFlushesHigh() { constexpr u64 align = 64ULL; constexpr u64 mask = ~(align - 1ULL); total_size_bytes += (new_size + align - 1) & mask; - largest_copy = std::max(largest_copy, new_size); + largest_copy = (std::max)(largest_copy, new_size); }; gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, @@ -729,8 +731,8 @@ void BufferCache

::BindHostVertexBuffers() { } flags[Dirty::VertexBuffer0 + index] = false; - host_bindings.min_index = std::min(host_bindings.min_index, index); - host_bindings.max_index = std::max(host_bindings.max_index, index); + host_bindings.min_index = (std::min)(host_bindings.min_index, index); + host_bindings.max_index = (std::max)(host_bindings.max_index, index); any_valid = true; } @@ -785,11 +787,11 @@ void BufferCache

::BindHostGraphicsUniformBuffers(size_t stage) { } template -void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 binding_index, - bool needs_bind) { +void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 binding_index, bool needs_bind) { + ++channel_state->uniform_cache_shots[0]; const Binding& binding = channel_state->uniform_buffers[stage][index]; const DAddr device_addr = binding.device_addr; - const u32 size = std::min(binding.size, (*channel_state->uniform_buffer_sizes)[stage][index]); + const u32 size = (std::min)(binding.size, (*channel_state->uniform_buffer_sizes)[stage][index]); Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); const bool use_fast_buffer = binding.buffer_id != NULL_BUFFER_ID && @@ -823,12 +825,9 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 return; } // Classic cached path - const bool sync_cached = SynchronizeBuffer(buffer, device_addr, size); - if (sync_cached) { + if (SynchronizeBuffer(buffer, device_addr, size)) { ++channel_state->uniform_cache_hits[0]; } - ++channel_state->uniform_cache_shots[0]; - // Skip binding if it's not needed and if the bound buffer is not the fast version // This exists to avoid instances where the fast buffer is bound and a GPU write happens needs_bind |= HasFastUniformBufferBound(stage, binding_index); @@ -956,7 +955,7 @@ void BufferCache

::BindHostComputeUniformBuffers() { Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); const u32 size = - std::min(binding.size, (*channel_state->compute_uniform_buffer_sizes)[index]); + (std::min)(binding.size, (*channel_state->compute_uniform_buffer_sizes)[index]); SynchronizeBuffer(buffer, binding.device_addr, size); const u32 offset = buffer.Offset(binding.device_addr); @@ -1090,7 +1089,7 @@ void BufferCache

::UpdateIndexBuffer() { const u32 address_size = static_cast(gpu_addr_end - gpu_addr_begin); const u32 draw_size = (index_buffer_ref.count + index_buffer_ref.first) * index_buffer_ref.FormatSizeInBytes(); - const u32 size = std::min(address_size, draw_size); + const u32 size = (std::min)(address_size, draw_size); if (size == 0 || !device_addr) { channel_state->index_buffer = NULL_BINDING; return; @@ -1381,6 +1380,10 @@ void BufferCache

::JoinOverlap(BufferId new_buffer_id, BufferId overlap_id, }); new_buffer.MarkUsage(copies[0].dst_offset, copies[0].size); runtime.CopyBuffer(new_buffer, overlap, copies, true); +#ifdef YUZU_LEGACY + if (immediately_free) + runtime.Finish(); +#endif DeleteBuffer(overlap_id, true); } @@ -1459,7 +1462,7 @@ bool BufferCache

::SynchronizeBuffer(Buffer& buffer, DAddr device_addr, u32 si .size = range_size, }); total_size_bytes += range_size; - largest_copy = std::max(largest_copy, range_size); + largest_copy = (std::max)(largest_copy, range_size); }); if (total_size_bytes == 0) { return true; @@ -1594,7 +1597,7 @@ void BufferCache

::DownloadBufferMemory(Buffer& buffer, DAddr device_addr, u64 constexpr u64 align = 64ULL; constexpr u64 mask = ~(align - 1ULL); total_size_bytes += (new_size + align - 1) & mask; - largest_copy = std::max(largest_copy, new_size); + largest_copy = (std::max)(largest_copy, new_size); }; gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, add_download); @@ -1671,7 +1674,12 @@ void BufferCache

::DeleteBuffer(BufferId buffer_id, bool do_not_mark) { } Unregister(buffer_id); - delayed_destruction_ring.Push(std::move(slot_buffers[buffer_id])); + +#ifdef YUZU_LEGACY + if (!do_not_mark || !immediately_free) +#endif + delayed_destruction_ring.Push(std::move(slot_buffers[buffer_id])); + slot_buffers.erase(buffer_id); if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) { @@ -1715,7 +1723,7 @@ Binding BufferCache

::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, // cbufs, which do not store the sizes adjacent to the addresses, so use the fully // mapped buffer size for now. const u32 memory_layout_size = static_cast(gpu_memory->GetMemoryLayoutSize(gpu_addr)); - return std::min(memory_layout_size, static_cast(8_MiB)); + return (std::min)(memory_layout_size, static_cast(8_MiB)); }(); // Alignment only applies to the offset of the buffer const u32 alignment = runtime.GetStorageBufferAlignment(); diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index a45e9b35f1..486d19fb79 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -154,7 +154,11 @@ template class BufferCache : public VideoCommon::ChannelSetupCaches { // Page size for caching purposes. // This is unrelated to the CPU page size and it can be changed as it seems optimal. +#ifdef YUZU_LEGACY + static constexpr u32 CACHING_PAGEBITS = 12; +#else static constexpr u32 CACHING_PAGEBITS = 16; +#endif static constexpr u64 CACHING_PAGESIZE = u64{1} << CACHING_PAGEBITS; static constexpr bool IS_OPENGL = P::IS_OPENGL; @@ -168,9 +172,14 @@ class BufferCache : public VideoCommon::ChannelSetupCaches slot_buffers; - DelayedDestructionRing delayed_destruction_ring; +#ifdef YUZU_LEGACY + static constexpr size_t TICKS_TO_DESTROY = 6; +#else + static constexpr size_t TICKS_TO_DESTROY = 8; +#endif + DelayedDestructionRing delayed_destruction_ring; const Tegra::Engines::DrawManager::IndirectParams* current_draw_indirect{}; @@ -478,6 +492,9 @@ private: u64 minimum_memory = 0; u64 critical_memory = 0; BufferId inline_buffer_id; +#ifdef YUZU_LEGACY + bool immediately_free = false; +#endif std::array> CACHING_PAGEBITS)> page_table; Common::ScratchBuffer tmp_buffer; diff --git a/src/video_core/buffer_cache/memory_tracker_base.h b/src/video_core/buffer_cache/memory_tracker_base.h index c95eed1f62..99e6c161a3 100644 --- a/src/video_core/buffer_cache/memory_tracker_base.h +++ b/src/video_core/buffer_cache/memory_tracker_base.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -230,7 +233,7 @@ private: std::size_t remaining_size{size}; std::size_t page_index{cpu_address >> HIGHER_PAGE_BITS}; u64 page_offset{cpu_address & HIGHER_PAGE_MASK}; - u64 begin = std::numeric_limits::max(); + u64 begin = (std::numeric_limits::max)(); u64 end = 0; while (remaining_size > 0) { const std::size_t copy_amount{ @@ -240,8 +243,8 @@ private: auto [new_begin, new_end] = func(manager, page_offset, copy_amount); if (new_begin != 0 || new_end != 0) { const u64 base_address = page_index << HIGHER_PAGE_BITS; - begin = std::min(new_begin + base_address, begin); - end = std::max(new_end + base_address, end); + begin = (std::min)(new_begin + base_address, begin); + end = (std::max)(new_end + base_address, end); } }; if (manager) { diff --git a/src/video_core/buffer_cache/word_manager.h b/src/video_core/buffer_cache/word_manager.h index 3db9d8b423..b93bd57089 100644 --- a/src/video_core/buffer_cache/word_manager.h +++ b/src/video_core/buffer_cache/word_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -181,7 +184,7 @@ public: static u64 ExtractBits(u64 word, size_t page_start, size_t page_end) { constexpr size_t number_bits = sizeof(u64) * 8; - const size_t limit_page_end = number_bits - std::min(page_end, number_bits); + const size_t limit_page_end = number_bits - (std::min)(page_end, number_bits); u64 bits = (word >> page_start) << page_start; bits = (bits << limit_page_end) >> limit_page_end; return bits; @@ -206,11 +209,11 @@ public: auto [start_word, start_page] = GetWordPage(start); auto [end_word, end_page] = GetWordPage(end + BYTES_PER_PAGE - 1ULL); const size_t num_words = NumWords(); - start_word = std::min(start_word, num_words); - end_word = std::min(end_word, num_words); + start_word = (std::min)(start_word, num_words); + end_word = (std::min)(end_word, num_words); const size_t diff = end_word - start_word; end_word += (end_page + PAGES_PER_WORD - 1ULL) / PAGES_PER_WORD; - end_word = std::min(end_word, num_words); + end_word = (std::min)(end_word, num_words); end_page += diff * PAGES_PER_WORD; constexpr u64 base_mask{~0ULL}; for (size_t word_index = start_word; word_index < end_word; word_index++) { @@ -382,7 +385,7 @@ public: const std::span state_words = words.template Span(); [[maybe_unused]] const std::span untracked_words = words.template Span(); - u64 begin = std::numeric_limits::max(); + u64 begin = (std::numeric_limits::max)(); u64 end = 0; IterateWords(offset, size, [&](size_t index, u64 mask) { if constexpr (type == Type::GPU) { @@ -395,7 +398,7 @@ public: const u64 local_page_begin = std::countr_zero(word); const u64 local_page_end = PAGES_PER_WORD - std::countl_zero(word); const u64 page_index = index * PAGES_PER_WORD; - begin = std::min(begin, page_index + local_page_begin); + begin = (std::min)(begin, page_index + local_page_begin); end = page_index + local_page_end; }); static constexpr std::pair EMPTY{0, 0}; diff --git a/src/video_core/cdma_pusher.cpp b/src/video_core/cdma_pusher.cpp index 2a13594719..b9140d9335 100644 --- a/src/video_core/cdma_pusher.cpp +++ b/src/video_core/cdma_pusher.cpp @@ -39,8 +39,8 @@ void CDmaPusher::ProcessEntries(std::stop_token stop_token) { while (!stop_token.stop_requested()) { { std::unique_lock l{command_mutex}; - Common::CondvarWait(command_cv, l, stop_token, - [this]() { return command_lists.size() > 0; }); + command_cv.wait(l, stop_token, + [this]() { return command_lists.size() > 0; }); if (stop_token.stop_requested()) { return; } @@ -90,7 +90,7 @@ void CDmaPusher::ProcessEntries(std::stop_token stop_token) { break; } default: - LOG_ERROR(HW_GPU, "Bad command at index {} (bytes 0x{:X}), buffer size {}", i - 1, + LOG_ERROR(HW_GPU, "Bad command at index {} (bytes {:#X}), buffer size {}", i - 1, (i - 1) * sizeof(u32), command_list.size()); UNIMPLEMENTED_MSG("ChSubmission mode {} is not implemented!", static_cast(mode)); @@ -103,7 +103,7 @@ void CDmaPusher::ProcessEntries(std::stop_token stop_token) { void CDmaPusher::ExecuteCommand(u32 method, u32 arg) { switch (current_class) { case ChClassId::Control: - LOG_TRACE(Service_NVDRV, "Class {} method 0x{:X} arg 0x{:X}", + LOG_TRACE(Service_NVDRV, "Class {} method {:#X} arg 0x{:X}", static_cast(current_class), method, arg); host_processor->ProcessMethod(static_cast(method), arg); break; @@ -121,7 +121,7 @@ void CDmaPusher::ExecuteCommand(u32 method, u32 arg) { break; } case ThiMethod::SetMethod1: - LOG_TRACE(Service_NVDRV, "Class {} method 0x{:X} arg 0x{:X}", + LOG_TRACE(Service_NVDRV, "Class {} method {:#X} arg 0x{:X}", static_cast(current_class), static_cast(thi_regs.method_0), arg); ProcessMethod(thi_regs.method_0, arg); break; diff --git a/src/video_core/control/channel_state_cache.h b/src/video_core/control/channel_state_cache.h index 7480d60d13..58f6a34c16 100644 --- a/src/video_core/control/channel_state_cache.h +++ b/src/video_core/control/channel_state_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -73,7 +76,7 @@ public: } protected: - static constexpr size_t UNSET_CHANNEL{std::numeric_limits::max()}; + static constexpr size_t UNSET_CHANNEL{(std::numeric_limits::max)()}; P* channel_state; size_t current_channel_id{UNSET_CHANNEL}; diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 4b9a506cdf..a9bcd150e6 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -102,23 +102,10 @@ bool DmaPusher::Step() { ProcessCommands(headers); }; - const Settings::DmaAccuracy accuracy = Settings::values.dma_accuracy.GetValue(); - const bool use_gpu_accuracy = accuracy == Settings::DmaAccuracy::Default; + const bool use_safe = Settings::IsDMALevelDefault() ? Settings::IsGPULevelHigh() : Settings::IsDMALevelSafe(); - // reduces eye bleeding but also macros are dumb so idk -#define CHECK_LEVEL(level) use_gpu_accuracy ? Settings::IsGPULevel##level() : accuracy == Settings::DmaAccuracy::level; - const bool force_safe = CHECK_LEVEL(Extreme) - const bool unsafe_compute = CHECK_LEVEL(High) -#undef CHECK_LEVEL - - if (force_safe) { + if (use_safe) { safe_process(); - } else if (unsafe_compute) { - if (dma_state.method >= MacroRegistersStart) { - unsafe_process(); - } else { - safe_process(); - } } else { unsafe_process(); } diff --git a/src/video_core/engines/engine_interface.h b/src/video_core/engines/engine_interface.h index 54631ee6cc..e271ecab59 100644 --- a/src/video_core/engines/engine_interface.h +++ b/src/video_core/engines/engine_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -37,7 +40,7 @@ public: ConsumeSinkImpl(); } - std::bitset::max()> execution_mask{}; + std::bitset<(std::numeric_limits::max)()> execution_mask{}; std::vector> method_sink{}; bool current_dirty{}; GPUVAddr current_dma_segment; diff --git a/src/video_core/engines/engine_upload.cpp b/src/video_core/engines/engine_upload.cpp index e5cc04ec4f..ba21eec4c4 100644 --- a/src/video_core/engines/engine_upload.cpp +++ b/src/video_core/engines/engine_upload.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,7 @@ void State::ProcessExec(const bool is_linear_) { } void State::ProcessData(const u32 data, const bool is_last_call) { - const u32 sub_copy_size = std::min(4U, copy_size - write_offset); + const u32 sub_copy_size = (std::min)(4U, copy_size - write_offset); std::memcpy(&inner_buffer[write_offset], &data, sub_copy_size); write_offset += sub_copy_size; if (!is_last_call) { @@ -58,7 +61,7 @@ void State::ProcessData(std::span read_buffer) { u32 x_elements = regs.line_length_in; u32 x_offset = regs.dest.x; const u32 bpp_shift = Common::FoldRight( - 4U, [](u32 x, u32 y) { return std::min(x, static_cast(std::countr_zero(y))); }, + 4U, [](u32 x, u32 y) { return (std::min)(x, static_cast(std::countr_zero(y))); }, width, x_elements, x_offset, static_cast(address)); width >>= bpp_shift; x_elements >>= bpp_shift; diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 0d47b032c8..77729fd5b6 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -245,15 +248,15 @@ u32 Maxwell3D::GetMaxCurrentVertices() { } const auto& attribute = regs.vertex_attrib_format[index]; if (attribute.constant) { - num_vertices = std::max(num_vertices, 1U); + num_vertices = (std::max)(num_vertices, 1U); continue; } const auto& limit = regs.vertex_stream_limits[index]; const GPUVAddr gpu_addr_begin = array.Address(); const GPUVAddr gpu_addr_end = limit.Address() + 1; const u32 address_size = static_cast(gpu_addr_end - gpu_addr_begin); - num_vertices = std::max( - num_vertices, address_size / std::max(attribute.SizeInBytes(), array.stride.Value())); + num_vertices = (std::max)( + num_vertices, address_size / (std::max)(attribute.SizeInBytes(), array.stride.Value())); break; } return num_vertices; @@ -262,9 +265,9 @@ u32 Maxwell3D::GetMaxCurrentVertices() { size_t Maxwell3D::EstimateIndexBufferSize() { GPUVAddr start_address = regs.index_buffer.StartAddress(); GPUVAddr end_address = regs.index_buffer.EndAddress(); - static constexpr std::array max_sizes = {std::numeric_limits::max(), - std::numeric_limits::max(), - std::numeric_limits::max()}; + static constexpr std::array max_sizes = {(std::numeric_limits::max)(), + (std::numeric_limits::max)(), + (std::numeric_limits::max)()}; const size_t byte_size = regs.index_buffer.FormatSizeInBytes(); const size_t log2_byte_size = Common::Log2Ceil64(byte_size); const size_t cap{GetMaxCurrentVertices() * 4 * byte_size}; diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 6b4f1c570e..ae2e7a84c4 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -1180,11 +1183,11 @@ public: } f32 GetX() const { - return std::max(0.0f, translate_x - std::fabs(scale_x)); + return (std::max)(0.0f, translate_x - std::fabs(scale_x)); } f32 GetY() const { - return std::max(0.0f, translate_y - std::fabs(scale_y)); + return (std::max)(0.0f, translate_y - std::fabs(scale_y)); } f32 GetWidth() const { @@ -3091,7 +3094,7 @@ public: } struct DirtyState { - using Flags = std::bitset::max()>; + using Flags = std::bitset<(std::numeric_limits::max)()>; using Table = std::array; using Tables = std::array; diff --git a/src/video_core/engines/maxwell_dma.cpp b/src/video_core/engines/maxwell_dma.cpp index a4b2c1098b..e2aa6c7e49 100644 --- a/src/video_core/engines/maxwell_dma.cpp +++ b/src/video_core/engines/maxwell_dma.cpp @@ -7,7 +7,7 @@ #include "common/algorithm.h" #include "common/assert.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "core/core.h" #include "video_core/engines/maxwell_3d.h" @@ -64,7 +64,6 @@ void MaxwellDMA::Launch() { // TODO(Subv): Perform more research and implement all features of this engine. const LaunchDMA& launch = regs.launch_dma; ASSERT(launch.interrupt_type == LaunchDMA::InterruptType::NONE); - ASSERT(launch.data_transfer_type == LaunchDMA::DataTransferType::NON_PIPELINED); if (launch.multi_line_enable) { const bool is_src_pitch = launch.src_memory_layout == LaunchDMA::MemoryLayout::PITCH; @@ -157,7 +156,7 @@ void MaxwellDMA::Launch() { } void MaxwellDMA::CopyBlockLinearToPitch() { - UNIMPLEMENTED_IF(regs.launch_dma.remap_enable != 0); + u32 bytes_per_pixel = 1; DMA::ImageOperand src_operand; @@ -198,7 +197,7 @@ void MaxwellDMA::CopyBlockLinearToPitch() { u32 bpp_shift = 0U; if (!is_remapping) { bpp_shift = Common::FoldRight( - 4U, [](u32 x, u32 y) { return std::min(x, static_cast(std::countr_zero(y))); }, + 4U, [](u32 x, u32 y) { return (std::min)(x, static_cast(std::countr_zero(y))); }, width, x_elements, x_offset, static_cast(regs.offset_in)); width >>= bpp_shift; x_elements >>= bpp_shift; @@ -261,7 +260,7 @@ void MaxwellDMA::CopyPitchToBlockLinear() { u32 bpp_shift = 0U; if (!is_remapping) { bpp_shift = Common::FoldRight( - 4U, [](u32 x, u32 y) { return std::min(x, static_cast(std::countr_zero(y))); }, + 4U, [](u32 x, u32 y) { return (std::min)(x, static_cast(std::countr_zero(y))); }, width, x_elements, x_offset, static_cast(regs.offset_out)); width >>= bpp_shift; x_elements >>= bpp_shift; @@ -312,7 +311,7 @@ void MaxwellDMA::CopyBlockLinearToBlockLinear() { u32 bpp_shift = 0U; if (!is_remapping) { bpp_shift = Common::FoldRight( - 4U, [](u32 x, u32 y) { return std::min(x, static_cast(std::countr_zero(y))); }, + 4U, [](u32 x, u32 y) { return (std::min)(x, static_cast(std::countr_zero(y))); }, src_width, dst_width, x_elements, src_x_offset, dst_x_offset, static_cast(regs.offset_in), static_cast(regs.offset_out)); src_width >>= bpp_shift; diff --git a/src/video_core/engines/sw_blitter/converter.cpp b/src/video_core/engines/sw_blitter/converter.cpp index 2419b56321..1d1d3b2087 100644 --- a/src/video_core/engines/sw_blitter/converter.cpp +++ b/src/video_core/engines/sw_blitter/converter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -771,7 +774,7 @@ private: }; const auto to_fp_n = [](f32 base_value, size_t bits, size_t mantissa) { constexpr size_t fp32_mantissa_bits = 23; - u32 tmp_value = Common::BitCast(std::max(base_value, 0.0f)); + u32 tmp_value = Common::BitCast((std::max)(base_value, 0.0f)); size_t shift_towards = fp32_mantissa_bits - mantissa; return tmp_value >> shift_towards; }; diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 9392534e7d..8739905d99 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -116,7 +116,7 @@ u64 ThreadManager::PushCommand(CommandData&& command_data, bool block) { state.queue.EmplaceWait(std::move(command_data), fence, block); if (block) { - Common::CondvarWait(state.cv, lk, thread.get_stop_token(), [this, fence] { + state.cv.wait(lk, thread.get_stop_token(), [this, fence] { return fence <= state.signaled_fence.load(std::memory_order_relaxed); }); } diff --git a/src/video_core/host1x/codecs/decoder.cpp b/src/video_core/host1x/codecs/decoder.cpp index 391bfabc1e..887eb28c8c 100755 --- a/src/video_core/host1x/codecs/decoder.cpp +++ b/src/video_core/host1x/codecs/decoder.cpp @@ -38,13 +38,17 @@ void Decoder::Decode() { // Receive output frames from decoder. auto frame = decode_api.ReceiveFrame(); + if (!frame) { + return; + } + if (IsInterlaced()) { auto [luma_top, luma_bottom, chroma_top, chroma_bottom] = GetInterlacedOffsets(); auto frame_copy = frame; if (!frame.get()) { LOG_ERROR(HW_GPU, - "Nvdec {} failed to decode interlaced frame for top 0x{:X} bottom 0x{:X}", id, + "Nvdec {} failed to decode interlaced frame for top {:#X} bottom 0x{:X}", id, luma_top, luma_bottom); } @@ -59,7 +63,7 @@ void Decoder::Decode() { auto [luma_offset, chroma_offset] = GetProgressiveOffsets(); if (!frame.get()) { - LOG_ERROR(HW_GPU, "Nvdec {} failed to decode progressive frame for luma 0x{:X}", id, + LOG_ERROR(HW_GPU, "Nvdec {} failed to decode progressive frame for luma {:#X}", id, luma_offset); } diff --git a/src/video_core/host1x/codecs/h264.cpp b/src/video_core/host1x/codecs/h264.cpp index 782d11d725..0896fa6001 100644 --- a/src/video_core/host1x/codecs/h264.cpp +++ b/src/video_core/host1x/codecs/h264.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -117,7 +120,7 @@ std::span H264::ComposeFrame() { (current_context.h264_parameter_set.frame_mbs_only_flag ? 1 : 2); u32 max_num_ref_frames = - std::max(std::max(current_context.h264_parameter_set.num_refidx_l0_default_active, + (std::max)((std::max)(current_context.h264_parameter_set.num_refidx_l0_default_active, current_context.h264_parameter_set.num_refidx_l1_default_active) + 1, 4); diff --git a/src/video_core/host1x/codecs/vp9.cpp b/src/video_core/host1x/codecs/vp9.cpp index c70d0a506f..f80709d785 100644 --- a/src/video_core/host1x/codecs/vp9.cpp +++ b/src/video_core/host1x/codecs/vp9.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -228,10 +231,10 @@ constexpr std::array map_lut{ std::size_t index{}; if (old_prob * 2 <= 0xff) { - index = static_cast(std::max(0, RecenterNonNeg(new_prob, old_prob) - 1)); + index = static_cast((std::max)(0, RecenterNonNeg(new_prob, old_prob) - 1)); } else { index = static_cast( - std::max(0, RecenterNonNeg(0xff - 1 - new_prob, 0xff - 1 - old_prob) - 1)); + (std::max)(0, RecenterNonNeg(0xff - 1 - new_prob, 0xff - 1 - old_prob) - 1)); } return static_cast(map_lut[index]); diff --git a/src/video_core/host1x/control.cpp b/src/video_core/host1x/control.cpp index bd0ce91609..53b3063557 100644 --- a/src/video_core/host1x/control.cpp +++ b/src/video_core/host1x/control.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -21,7 +24,7 @@ void Control::ProcessMethod(Method method, u32 argument) { Execute(argument); break; default: - UNIMPLEMENTED_MSG("Control method 0x{:X}", static_cast(method)); + UNIMPLEMENTED_MSG("Control method {:#X}", static_cast(method)); break; } } diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.cpp b/src/video_core/host1x/ffmpeg/ffmpeg.cpp index 6609752bdb..bbbbe615ce 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.cpp +++ b/src/video_core/host1x/ffmpeg/ffmpeg.cpp @@ -28,7 +28,7 @@ constexpr AVPixelFormat PreferredCpuFormat = AV_PIX_FMT_YUV420P; constexpr std::array PreferredGpuDecoders = { #if defined (_WIN32) AV_HWDEVICE_TYPE_CUDA, - AV_HWDEVICE_TYPE_D3D11VA, + AV_HWDEVICE_TYPE_D3D11VA, AV_HWDEVICE_TYPE_DXVA2, #elif defined(__FreeBSD__) AV_HWDEVICE_TYPE_VDPAU, @@ -37,7 +37,7 @@ constexpr std::array PreferredGpuDecoders = { AV_HWDEVICE_TYPE_VAAPI, AV_HWDEVICE_TYPE_VDPAU, #endif - AV_HWDEVICE_TYPE_VULKAN, + AV_HWDEVICE_TYPE_VULKAN, }; AVPixelFormat GetGpuFormat(AVCodecContext* codec_context, const AVPixelFormat* pix_fmts) { @@ -233,7 +233,7 @@ bool DecoderContext::OpenContext(const Decoder& decoder) { } bool DecoderContext::SendPacket(const Packet& packet) { - if (const int ret = avcodec_send_packet(m_codec_context, packet.GetPacket()); ret < 0 && ret != AVERROR_EOF) { + if (const int ret = avcodec_send_packet(m_codec_context, packet.GetPacket()); ret < 0 && ret != AVERROR_EOF && ret != AVERROR(EAGAIN)) { LOG_ERROR(HW_GPU, "avcodec_send_packet error: {}", AVError(ret)); return false; } @@ -242,31 +242,31 @@ bool DecoderContext::SendPacket(const Packet& packet) { } std::shared_ptr DecoderContext::ReceiveFrame() { - auto ReceiveImpl = [&](AVFrame* frame) -> bool { - if (const int ret = avcodec_receive_frame(m_codec_context, frame); ret < 0 && ret != AVERROR_EOF) { + auto ReceiveImpl = [&](AVFrame* frame) -> int { + const int ret = avcodec_receive_frame(m_codec_context, frame); + if (ret < 0 && ret != AVERROR_EOF && ret != AVERROR(EAGAIN)) { LOG_ERROR(HW_GPU, "avcodec_receive_frame error: {}", AVError(ret)); - return false; } - return true; + return ret; }; std::shared_ptr intermediate_frame = std::make_shared(); - if (!ReceiveImpl(intermediate_frame->GetFrame())) { + if (ReceiveImpl(intermediate_frame->GetFrame()) < 0) { return {}; } - m_temp_frame = std::make_shared(); + m_final_frame = std::make_shared(); if (m_codec_context->hw_device_ctx) { - m_temp_frame->SetFormat(PreferredGpuFormat); - if (int ret = av_hwframe_transfer_data(m_temp_frame->GetFrame(), intermediate_frame->GetFrame(), 0); ret < 0) { + m_final_frame->SetFormat(PreferredGpuFormat); + if (const int ret = av_hwframe_transfer_data(m_final_frame->GetFrame(), intermediate_frame->GetFrame(), 0); ret < 0) { LOG_ERROR(HW_GPU, "av_hwframe_transfer_data error: {}", AVError(ret)); return {}; } } else { - m_temp_frame = std::move(intermediate_frame); + m_final_frame = std::move(intermediate_frame); } - return std::move(m_temp_frame); + return std::move(m_final_frame); } void DecodeApi::Reset() { diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.h b/src/video_core/host1x/ffmpeg/ffmpeg.h index 0dd7c7cb04..d60a8ac4a7 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.h +++ b/src/video_core/host1x/ffmpeg/ffmpeg.h @@ -194,7 +194,7 @@ public: private: const Decoder& m_decoder; AVCodecContext* m_codec_context{}; - std::shared_ptr m_temp_frame{}; + std::shared_ptr m_final_frame{}; bool m_decode_order{}; }; diff --git a/src/video_core/host1x/host1x.cpp b/src/video_core/host1x/host1x.cpp index 293bca6d79..cec5104144 100644 --- a/src/video_core/host1x/host1x.cpp +++ b/src/video_core/host1x/host1x.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -18,9 +21,15 @@ Host1x::~Host1x() = default; void Host1x::StartDevice(s32 fd, ChannelType type, u32 syncpt) { switch (type) { case ChannelType::NvDec: +#ifdef YUZU_LEGACY + std::call_once(nvdec_first_init, []() {std::this_thread::sleep_for(std::chrono::milliseconds{500});}); // HACK: For Astroneer +#endif devices[fd] = std::make_unique(*this, fd, syncpt, frame_queue); break; case ChannelType::VIC: +#ifdef YUZU_LEGACY + std::call_once(vic_first_init, []() {std::this_thread::sleep_for(std::chrono::milliseconds{500});}); // HACK: For Astroneer +#endif devices[fd] = std::make_unique(*this, fd, syncpt, frame_queue); break; default: diff --git a/src/video_core/host1x/host1x.h b/src/video_core/host1x/host1x.h index 8debac93dd..4eea214ec6 100644 --- a/src/video_core/host1x/host1x.h +++ b/src/video_core/host1x/host1x.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -201,6 +204,10 @@ private: std::unique_ptr> allocator; FrameQueue frame_queue; std::unordered_map> devices; +#ifdef YUZU_LEGACY + std::once_flag nvdec_first_init; + std::once_flag vic_first_init; +#endif }; } // namespace Tegra::Host1x diff --git a/src/video_core/host1x/vic.cpp b/src/video_core/host1x/vic.cpp index 3ad56bb80c..3dbbfa5552 100644 --- a/src/video_core/host1x/vic.cpp +++ b/src/video_core/host1x/vic.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,6 +17,8 @@ #elif defined(ARCHITECTURE_arm64) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-int-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wshadow" #include #pragma GCC diagnostic pop #endif @@ -105,7 +110,7 @@ Vic::~Vic() { } void Vic::ProcessMethod(u32 method, u32 arg) { - LOG_TRACE(HW_GPU, "Vic {} method 0x{:X}", id, static_cast(method)); + LOG_TRACE(HW_GPU, "Vic {} method {:#X}", id, static_cast(method)); regs.reg_array[method] = arg; switch (static_cast(method * sizeof(u32))) { @@ -141,8 +146,13 @@ void Vic::Execute() { } auto frame = frame_queue.GetFrame(nvdec_id, luma_offset); + + if (!frame) { + continue; + } + if (!frame.get()) { - LOG_ERROR(HW_GPU, "Vic {} failed to get frame with offset 0x{:X}", id, luma_offset); + LOG_ERROR(HW_GPU, "Vic {} failed to get frame with offset {:#X}", id, luma_offset); continue; } @@ -196,8 +206,8 @@ void Vic::ReadProgressiveY8__V8U8_N420(const SlotStruct& slot, slot_surface.resize_destructive(out_luma_width * out_luma_height); - const auto in_luma_width{std::min(frame->GetWidth(), static_cast(out_luma_width))}; - const auto in_luma_height{std::min(frame->GetHeight(), static_cast(out_luma_height))}; + const auto in_luma_width{(std::min)(frame->GetWidth(), static_cast(out_luma_width))}; + const auto in_luma_height{(std::min)(frame->GetHeight(), static_cast(out_luma_height))}; const auto in_luma_stride{frame->GetStride(0)}; const auto in_chroma_stride{frame->GetStride(1)}; @@ -420,9 +430,9 @@ void Vic::ReadInterlacedY8__V8U8_N420(const SlotStruct& slot, std::spanGetWidth(), static_cast(out_luma_width))}; + const auto in_luma_width{(std::min)(frame->GetWidth(), static_cast(out_luma_width))}; [[maybe_unused]] const auto in_luma_height{ - std::min(frame->GetHeight(), static_cast(out_luma_height))}; + (std::min)(frame->GetHeight(), static_cast(out_luma_height))}; const auto in_luma_stride{frame->GetStride(0)}; [[maybe_unused]] const auto in_chroma_width{(frame->GetWidth() + 1) / 2}; @@ -538,15 +548,15 @@ void Vic::Blend(const ConfigStruct& config, const SlotStruct& slot) { auto rect_top{add_one(config.output_config.target_rect_top.Value())}; auto rect_bottom{add_one(config.output_config.target_rect_bottom.Value())}; - rect_left = std::max(rect_left, dest_left); - rect_right = std::min(rect_right, dest_right); - rect_top = std::max(rect_top, dest_top); - rect_bottom = std::min(rect_bottom, dest_bottom); + rect_left = (std::max)(rect_left, dest_left); + rect_right = (std::min)(rect_right, dest_right); + rect_top = (std::max)(rect_top, dest_top); + rect_bottom = (std::min)(rect_bottom, dest_bottom); - source_left = std::max(source_left, rect_left); - source_right = std::min(source_right, rect_right); - source_top = std::max(source_top, rect_top); - source_bottom = std::min(source_bottom, rect_bottom); + source_left = (std::max)(source_left, rect_left); + source_right = (std::min)(source_right, rect_right); + source_top = (std::max)(source_top, rect_top); + source_bottom = (std::min)(source_bottom, rect_bottom); if (source_left >= source_right || source_top >= source_bottom) { return; @@ -557,14 +567,14 @@ void Vic::Blend(const ConfigStruct& config, const SlotStruct& slot) { 1}; const auto in_surface_width{slot.surface_config.slot_surface_width + 1}; - source_bottom = std::min(source_bottom, out_surface_height); - source_right = std::min(source_right, out_surface_width); + source_bottom = (std::min)(source_bottom, out_surface_height); + source_right = (std::min)(source_right, out_surface_width); // TODO Alpha blending. No games I've seen use more than a single surface or supply an alpha // below max, so it's ignored for now. if (!slot.color_matrix.matrix_enable) { - const auto copy_width = std::min(source_right - source_left, rect_right - rect_left); + const auto copy_width = (std::min)(source_right - source_left, rect_right - rect_left); for (u32 y = source_top; y < source_bottom; y++) { const auto dst_line = y * out_surface_width; @@ -813,8 +823,8 @@ void Vic::WriteY8__V8U8_N420(const OutputSurfaceConfig& output_surface_config) { const auto out_chroma_stride = Common::AlignUp(out_chroma_width * BytesPerPixel * 2, 0x10); const auto out_chroma_size = out_chroma_height * out_chroma_stride; - surface_width = std::min(surface_width, out_luma_width); - surface_height = std::min(surface_height, out_luma_height); + surface_width = (std::min)(surface_width, out_luma_width); + surface_height = (std::min)(surface_height, out_luma_height); [[maybe_unused]] auto DecodeLinear = [&](std::span out_luma, std::span out_chroma) { for (u32 y = 0; y < surface_height; ++y) { @@ -999,9 +1009,9 @@ void Vic::WriteY8__V8U8_N420(const OutputSurfaceConfig& output_surface_config) { LOG_TRACE( HW_GPU, "Writing Y8__V8U8_N420 swizzled frame\n" - "\tinput surface {}x{} stride {} size 0x{:X}\n" - "\toutput luma {}x{} stride {} size 0x{:X} block height {} swizzled size 0x{:X}\n", - "\toutput chroma {}x{} stride {} size 0x{:X} block height {} swizzled size 0x{:X}", + "\tinput surface {}x{} stride {} size {:#X}\n" + "\toutput luma {}x{} stride {} size {:#X} block height {} swizzled size 0x{:X}\n", + "\toutput chroma {}x{} stride {} size {:#X} block height {} swizzled size 0x{:X}", surface_width, surface_height, surface_stride * BytesPerPixel, surface_stride * surface_height * BytesPerPixel, out_luma_width, out_luma_height, out_luma_stride, out_luma_size, block_height, out_luma_swizzle_size, out_chroma_width, @@ -1041,9 +1051,9 @@ void Vic::WriteY8__V8U8_N420(const OutputSurfaceConfig& output_surface_config) { LOG_TRACE( HW_GPU, "Writing Y8__V8U8_N420 swizzled frame\n" - "\tinput surface {}x{} stride {} size 0x{:X}\n" - "\toutput luma {}x{} stride {} size 0x{:X} block height {} swizzled size 0x{:X}\n", - "\toutput chroma {}x{} stride {} size 0x{:X} block height {} swizzled size 0x{:X}", + "\tinput surface {}x{} stride {} size {:#X}\n" + "\toutput luma {}x{} stride {} size {:#X} block height {} swizzled size 0x{:X}\n", + "\toutput chroma {}x{} stride {} size {:#X} block height {} swizzled size 0x{:X}", surface_width, surface_height, surface_stride * BytesPerPixel, surface_stride * surface_height * BytesPerPixel, out_luma_width, out_luma_height, out_luma_stride, out_luma_size, out_chroma_width, out_chroma_height, out_chroma_stride, @@ -1084,8 +1094,8 @@ void Vic::WriteABGR(const OutputSurfaceConfig& output_surface_config) { const auto out_luma_stride = Common ::AlignUp(out_luma_width * BytesPerPixel, 0x10); const auto out_luma_size = out_luma_height * out_luma_stride; - surface_width = std::min(surface_width, out_luma_width); - surface_height = std::min(surface_height, out_luma_height); + surface_width = (std::min)(surface_width, out_luma_width); + surface_height = (std::min)(surface_height, out_luma_height); [[maybe_unused]] auto DecodeLinear = [&](std::span out_buffer) { for (u32 y = 0; y < surface_height; y++) { @@ -1212,8 +1222,8 @@ void Vic::WriteABGR(const OutputSurfaceConfig& output_surface_config) { LOG_TRACE( HW_GPU, "Writing ABGR swizzled frame\n" - "\tinput surface {}x{} stride {} size 0x{:X}\n" - "\toutput surface {}x{} stride {} size 0x{:X} block height {} swizzled size 0x{:X}", + "\tinput surface {}x{} stride {} size {:#X}\n" + "\toutput surface {}x{} stride {} size {:#X} block height {} swizzled size 0x{:X}", surface_width, surface_height, surface_stride * BytesPerPixel, surface_stride * surface_height * BytesPerPixel, out_luma_width, out_luma_height, out_luma_stride, out_luma_size, block_height, out_swizzle_size); @@ -1237,8 +1247,8 @@ void Vic::WriteABGR(const OutputSurfaceConfig& output_surface_config) { case BLK_KIND::PITCH: { LOG_TRACE(HW_GPU, "Writing ABGR pitch frame\n" - "\tinput surface {}x{} stride {} size 0x{:X}" - "\toutput surface {}x{} stride {} size 0x{:X}", + "\tinput surface {}x{} stride {} size {:#X}" + "\toutput surface {}x{} stride {} size {:#X}", surface_width, surface_height, surface_stride, surface_stride * surface_height * BytesPerPixel, out_luma_width, out_luma_height, out_luma_stride, out_luma_size); diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 688e10d2e4..9f7b9edd5a 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -1,5 +1,5 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later set(FIDELITYFX_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/externals/FidelityFX-FSR/ffx-fsr) @@ -44,7 +44,13 @@ set(SHADER_FILES pitch_unswizzle.comp present_area.frag present_bicubic.frag + present_zero_tangent.frag + present_bspline.frag + present_mitchell.frag present_gaussian.frag + present_lanczos.frag + present_spline1.frag + present_mmpx.frag queries_prefix_scan_sum.comp queries_prefix_scan_sum_nosubgroups.comp resolve_conditional_render.comp diff --git a/src/video_core/host_shaders/present_bicubic.frag b/src/video_core/host_shaders/present_bicubic.frag index a9d9d40a38..5347fd2ef7 100644 --- a/src/video_core/host_shaders/present_bicubic.frag +++ b/src/video_core/host_shaders/present_bicubic.frag @@ -1,56 +1,37 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later - #version 460 core - - layout (location = 0) in vec2 frag_tex_coord; - layout (location = 0) out vec4 color; - layout (binding = 0) uniform sampler2D color_texture; - -vec4 cubic(float v) { - vec4 n = vec4(1.0, 2.0, 3.0, 4.0) - v; - vec4 s = n * n * n; - float x = s.x; - float y = s.y - 4.0 * s.x; - float z = s.z - 4.0 * s.y + 6.0 * s.x; - float w = 6.0 - x - y - z; - return vec4(x, y, z, w) * (1.0 / 6.0); +vec4 cubic(float x) { + float x2 = x * x; + float x3 = x2 * x; + return vec4(1.0, x, x2, x3) * transpose(mat4x4( + 0.0, 2.0, 0.0, 0.0, + -1.0, 0.0, 1.0, 0.0, + 2.0, -5.0, 4.0, -1.0, + -1.0, 3.0, -3.0, 1.0 + ) * (1.0 / 2.0)); } - -vec4 textureBicubic( sampler2D textureSampler, vec2 texCoords ) { - - vec2 texSize = textureSize(textureSampler, 0); - vec2 invTexSize = 1.0 / texSize; - - texCoords = texCoords * texSize - 0.5; - - vec2 fxy = fract(texCoords); - texCoords -= fxy; - - vec4 xcubic = cubic(fxy.x); - vec4 ycubic = cubic(fxy.y); - - vec4 c = texCoords.xxyy + vec2(-0.5, +1.5).xyxy; - - vec4 s = vec4(xcubic.xz + xcubic.yw, ycubic.xz + ycubic.yw); - vec4 offset = c + vec4(xcubic.yw, ycubic.yw) / s; - - offset *= invTexSize.xxyy; - - vec4 sample0 = texture(textureSampler, offset.xz); - vec4 sample1 = texture(textureSampler, offset.yz); - vec4 sample2 = texture(textureSampler, offset.xw); - vec4 sample3 = texture(textureSampler, offset.yw); - - float sx = s.x / (s.x + s.y); - float sy = s.z / (s.z + s.w); - - return mix(mix(sample3, sample2, sx), mix(sample1, sample0, sx), sy); +vec4 textureBicubic(sampler2D samp, vec2 uv) { + vec2 tex_size = vec2(textureSize(samp, 0)); + vec2 cc_tex = uv * tex_size - 0.5f; + vec2 fex = cc_tex - floor(cc_tex); + vec4 xcubic = cubic(fex.x); + vec4 ycubic = cubic(fex.y); + vec4 c = floor(cc_tex).xxyy + vec2(-0.5f, 1.5f).xyxy; + vec4 z = vec4(xcubic.yw, ycubic.yw); + vec4 s = vec4(xcubic.xz, ycubic.xz) + z; + vec4 offset = (c + z / s) * (1.0f / tex_size).xxyy; + vec2 n = vec2(s.x / (s.x + s.y), s.z / (s.z + s.w)); + return mix( + mix(texture(samp, offset.yw), texture(samp, offset.xw), n.x), + mix(texture(samp, offset.yz), texture(samp, offset.xz), n.x), + n.y); } - void main() { color = textureBicubic(color_texture, frag_tex_coord); } diff --git a/src/video_core/host_shaders/present_bspline.frag b/src/video_core/host_shaders/present_bspline.frag new file mode 100644 index 0000000000..f229de6030 --- /dev/null +++ b/src/video_core/host_shaders/present_bspline.frag @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later +#version 460 core +layout (location = 0) in vec2 frag_tex_coord; +layout (location = 0) out vec4 color; +layout (binding = 0) uniform sampler2D color_texture; +vec4 cubic(float x) { + float x2 = x * x; + float x3 = x2 * x; + return vec4(1.0, x, x2, x3) * transpose(mat4x4( + 1.0, 4.0, 1.0, 0.0, + -3.0, 0.0, 3.0, 0.0, + 3.0, -6.0, 3.0, 0.0, + -1.0, 3.0, -3.0, 1.0 + ) * (1.0 / 6.0)); +} +vec4 textureBicubic(sampler2D samp, vec2 uv) { + vec2 tex_size = vec2(textureSize(samp, 0)); + vec2 cc_tex = uv * tex_size - 0.5f; + vec2 fex = cc_tex - floor(cc_tex); + vec4 xcubic = cubic(fex.x); + vec4 ycubic = cubic(fex.y); + vec4 c = floor(cc_tex).xxyy + vec2(-0.5f, 1.5f).xyxy; + vec4 z = vec4(xcubic.yw, ycubic.yw); + vec4 s = vec4(xcubic.xz, ycubic.xz) + z; + vec4 offset = (c + z / s) * (1.0f / tex_size).xxyy; + vec2 n = vec2(s.x / (s.x + s.y), s.z / (s.z + s.w)); + return mix( + mix(texture(samp, offset.yw), texture(samp, offset.xw), n.x), + mix(texture(samp, offset.yz), texture(samp, offset.xz), n.x), + n.y); +} +void main() { + color = textureBicubic(color_texture, frag_tex_coord); +} diff --git a/src/video_core/host_shaders/present_lanczos.frag b/src/video_core/host_shaders/present_lanczos.frag new file mode 100644 index 0000000000..b69b329c1b --- /dev/null +++ b/src/video_core/host_shaders/present_lanczos.frag @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// https://en.wikipedia.org/wiki/Lanczos_resampling + +#version 460 core + +layout (location = 0) in vec2 frag_tex_coord; +layout (location = 0) out vec4 color; +layout (binding = 0) uniform sampler2D color_texture; + +#define PI 3.1415926535897932384626433 +float sinc(float x) { + return x == 0.0f ? 1.0f : sin(PI * x) / (PI * x); +} +float lanczos(vec2 v, float a) { + float d = length(v); + return sinc(d) / sinc(d / a); +} +vec4 textureLanczos(sampler2D textureSampler, vec2 p) { + vec3 c_sum = vec3(0.0f); + float w_sum = 0.0f; + vec2 res = vec2(textureSize(textureSampler, 0)); + vec2 cc = floor(p * res) / res; + // kernel size = (2r + 1)^2 + const int r = 3; //radius (1 = 3 steps) + for (int x = -r; x <= r; x++) + for (int y = -r; y <= r; y++) { + vec2 kp = 0.5f * (vec2(x, y) / res); // 0.5 = half-pixel level resampling + vec2 uv = cc + kp; + float w = lanczos(kp, float(r)); + c_sum += w * texture(textureSampler, p + kp).rgb; + w_sum += w; + } + return vec4(c_sum / w_sum, 1.0f); +} + +void main() { + color = textureLanczos(color_texture, frag_tex_coord); +} diff --git a/src/video_core/host_shaders/present_mitchell.frag b/src/video_core/host_shaders/present_mitchell.frag new file mode 100644 index 0000000000..4ca65cd6f0 --- /dev/null +++ b/src/video_core/host_shaders/present_mitchell.frag @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later +#version 460 core +layout (location = 0) in vec2 frag_tex_coord; +layout (location = 0) out vec4 color; +layout (binding = 0) uniform sampler2D color_texture; +vec4 cubic(float x) { + float x2 = x * x; + float x3 = x2 * x; + return vec4(1.0, x, x2, x3) * transpose(mat4x4( + 1.0, 16.0, 1.0, 0.0, + -9.0, 0.0, 9.0, 0.0, + 15.0, -36.0, 27.0, -6.0, + -7.0, 21.0, -21.0, 7.0 + ) * (1.0 / 18.0)); +} +vec4 textureBicubic(sampler2D samp, vec2 uv) { + vec2 tex_size = vec2(textureSize(samp, 0)); + vec2 cc_tex = uv * tex_size - 0.5f; + vec2 fex = cc_tex - floor(cc_tex); + vec4 xcubic = cubic(fex.x); + vec4 ycubic = cubic(fex.y); + vec4 c = floor(cc_tex).xxyy + vec2(-0.5f, 1.5f).xyxy; + vec4 z = vec4(xcubic.yw, ycubic.yw); + vec4 s = vec4(xcubic.xz, ycubic.xz) + z; + vec4 offset = (c + z / s) * (1.0f / tex_size).xxyy; + vec2 n = vec2(s.x / (s.x + s.y), s.z / (s.z + s.w)); + return mix( + mix(texture(samp, offset.yw), texture(samp, offset.xw), n.x), + mix(texture(samp, offset.yz), texture(samp, offset.xz), n.x), + n.y); +} +void main() { + color = textureBicubic(color_texture, frag_tex_coord); +} diff --git a/src/video_core/host_shaders/present_mmpx.frag b/src/video_core/host_shaders/present_mmpx.frag new file mode 100644 index 0000000000..6c2c05a63a --- /dev/null +++ b/src/video_core/host_shaders/present_mmpx.frag @@ -0,0 +1,131 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright 2023 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#version 460 core +layout(location = 0) in vec2 tex_coord; +layout(location = 0) out vec4 frag_color; +layout(binding = 0) uniform sampler2D tex; + +#define src(x, y) texture(tex, coord + vec2(x, y) * 1.0 / source_size) + +float luma(vec4 col) { + return dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)) * (1.0 - col.a); +} + +bool same(vec4 B, vec4 A0) { + return all(equal(B, A0)); +} + +bool notsame(vec4 B, vec4 A0) { + return any(notEqual(B, A0)); +} + +bool all_eq2(vec4 B, vec4 A0, vec4 A1) { + return (same(B,A0) && same(B,A1)); +} + +bool all_eq3(vec4 B, vec4 A0, vec4 A1, vec4 A2) { + return (same(B,A0) && same(B,A1) && same(B,A2)); +} + +bool all_eq4(vec4 B, vec4 A0, vec4 A1, vec4 A2, vec4 A3) { + return (same(B,A0) && same(B,A1) && same(B,A2) && same(B,A3)); +} + +bool any_eq3(vec4 B, vec4 A0, vec4 A1, vec4 A2) { + return (same(B,A0) || same(B,A1) || same(B,A2)); +} + +bool none_eq2(vec4 B, vec4 A0, vec4 A1) { + return (notsame(B,A0) && notsame(B,A1)); +} + +bool none_eq4(vec4 B, vec4 A0, vec4 A1, vec4 A2, vec4 A3) { + return (notsame(B,A0) && notsame(B,A1) && notsame(B,A2) && notsame(B,A3)); +} + +void main() +{ + vec2 source_size = vec2(textureSize(tex, 0)); + vec2 pos = fract(tex_coord * source_size) - vec2(0.5, 0.5); + vec2 coord = tex_coord - pos / source_size; + + vec4 E = src(0.0,0.0); + + vec4 A = src(-1.0,-1.0); + vec4 B = src(0.0,-1.0); + vec4 C = src(1.0,-1.0); + + vec4 D = src(-1.0,0.0); + vec4 F = src(1.0,0.0); + + vec4 G = src(-1.0,1.0); + vec4 H = src(0.0,1.0); + vec4 I = src(1.0,1.0); + + vec4 J = E; + vec4 K = E; + vec4 L = E; + vec4 M = E; + + frag_color = E; + + if(same(E,A) && same(E,B) && same(E,C) && same(E,D) && same(E,F) && same(E,G) && same(E,H) && same(E,I)) return; + + vec4 P = src(0.0,2.0); + vec4 Q = src(-2.0,0.0); + vec4 R = src(2.0,0.0); + vec4 S = src(0.0,2.0); + + float Bl = luma(B); + float Dl = luma(D); + float El = luma(E); + float Fl = luma(F); + float Hl = luma(H); + + if (((same(D,B) && notsame(D,H) && notsame(D,F))) && ((El>=Dl) || same(E,A)) && any_eq3(E,A,C,G) && ((El=Bl) || same(E,C)) && any_eq3(E,A,C,I) && ((El=Hl) || same(E,G)) && any_eq3(E,A,G,I) && ((El=Fl) || same(E,I)) && any_eq3(E,C,G,I) && ((El(*address); } -#ifdef _MSC_VER // no need for gcc / clang but msvc's compiler is more conservative with inlining. +#if defined(_MSC_VER) && !defined(__clang__) // no need for gcc / clang but msvc's compiler is more conservative with inlining. #pragma inline_recursion(on) #endif @@ -329,7 +332,7 @@ inline void MemoryManager::MemoryOperation(GPUVAddr gpu_src_addr, std::size_t si while (remaining_size > 0) { const std::size_t copy_amount{ - std::min(static_cast(used_page_size) - page_offset, remaining_size)}; + (std::min)(static_cast(used_page_size) - page_offset, remaining_size)}; auto entry = GetEntry(current_address); if (entry == EntryType::Mapped) [[likely]] { if constexpr (BOOL_BREAK_MAPPED) { diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 448624aa99..1be67b2d0c 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -152,7 +155,7 @@ public: PTEKind GetPageKind(GPUVAddr gpu_addr) const; size_t GetMemoryLayoutSize(GPUVAddr gpu_addr, - size_t max_size = std::numeric_limits::max()) const; + size_t max_size = (std::numeric_limits::max)()) const; void FlushCaching(); diff --git a/src/video_core/renderer_opengl/blit_image.cpp b/src/video_core/renderer_opengl/blit_image.cpp index 3b03e8d5ac..d5f5b612c2 100644 --- a/src/video_core/renderer_opengl/blit_image.cpp +++ b/src/video_core/renderer_opengl/blit_image.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -45,8 +48,8 @@ void BlitImageHelper::BlitColor(GLuint dst_framebuffer, GLuint src_image_view, G static_cast(src_region.start.x) / static_cast(src_size.width), static_cast(src_region.start.y) / static_cast(src_size.height)); - glViewport(std::min(dst_region.start.x, dst_region.end.x), - std::min(dst_region.start.y, dst_region.end.y), + glViewport((std::min)(dst_region.start.x, dst_region.end.x), + (std::min)(dst_region.start.y, dst_region.end.y), std::abs(dst_region.end.x - dst_region.start.x), std::abs(dst_region.end.y - dst_region.start.y)); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dst_framebuffer); diff --git a/src/video_core/renderer_opengl/gl_blit_screen.cpp b/src/video_core/renderer_opengl/gl_blit_screen.cpp index 2071fe8d15..4b75e1b949 100644 --- a/src/video_core/renderer_opengl/gl_blit_screen.cpp +++ b/src/video_core/renderer_opengl/gl_blit_screen.cpp @@ -8,6 +8,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/settings.h" +#include "common/settings_enums.h" #include "video_core/present.h" #include "video_core/renderer_opengl/gl_blit_screen.h" #include "video_core/renderer_opengl/gl_state_tracker.h" @@ -86,15 +87,33 @@ void BlitScreen::CreateWindowAdapt() { case Settings::ScalingFilter::Bicubic: window_adapt = MakeBicubic(device); break; + case Settings::ScalingFilter::ZeroTangent: + window_adapt = MakeZeroTangent(device); + break; + case Settings::ScalingFilter::BSpline: + window_adapt = MakeBSpline(device); + break; + case Settings::ScalingFilter::Mitchell: + window_adapt = MakeMitchell(device); + break; case Settings::ScalingFilter::Gaussian: window_adapt = MakeGaussian(device); break; + case Settings::ScalingFilter::Spline1: + window_adapt = MakeSpline1(device); + break; + case Settings::ScalingFilter::Lanczos: + window_adapt = MakeLanczos(device); + break; case Settings::ScalingFilter::ScaleForce: window_adapt = MakeScaleForce(device); break; case Settings::ScalingFilter::Area: window_adapt = MakeArea(device); break; + case Settings::ScalingFilter::Mmpx: + window_adapt = MakeMmpx(device); + break; case Settings::ScalingFilter::Fsr: case Settings::ScalingFilter::Bilinear: default: diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index ade72e1f95..59829b667f 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -248,7 +251,7 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bi std::ranges::transform(bindings.strides, buffer_strides.begin(), [](u64 stride) { return static_cast(stride); }); const u32 count = - std::min(static_cast(bindings.buffers.size()), max_attributes - bindings.min_index); + (std::min)(static_cast(bindings.buffers.size()), max_attributes - bindings.min_index); if (has_unified_vertex_buffers) { for (u32 index = 0; index < count; ++index) { Buffer& buffer = *bindings.buffers[index]; diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index fd471e9795..4188dec7cc 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -59,7 +62,7 @@ class BufferCacheRuntime { friend Buffer; public: - static constexpr u8 INVALID_BINDING = std::numeric_limits::max(); + static constexpr u8 INVALID_BINDING = (std::numeric_limits::max)(); explicit BufferCacheRuntime(const Device& device_, StagingBufferPool& staging_buffer_pool_); diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp index 3cb7529a64..f3d884f0eb 100644 --- a/src/video_core/renderer_opengl/gl_device.cpp +++ b/src/video_core/renderer_opengl/gl_device.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,7 +17,7 @@ #include "common/literals.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "shader_recompiler/stage.h" #include "video_core/renderer_opengl/gl_device.h" diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 2ea42abf4b..2746177fab 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -1266,7 +1266,7 @@ void RasterizerOpenGL::SyncPointState() { oglEnable(GL_PROGRAM_POINT_SIZE, maxwell3d->regs.point_size_attribute.enabled); const bool is_rescaling{texture_cache.IsRescaling()}; const float scale = is_rescaling ? Settings::values.resolution_info.up_factor : 1.0f; - glPointSize(std::max(1.0f, maxwell3d->regs.point_size * scale)); + glPointSize((std::max)(1.0f, maxwell3d->regs.point_size * scale)); } void RasterizerOpenGL::SyncLineState() { diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index edf0bdd2f1..45f729698e 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -54,7 +54,7 @@ using VideoCommon::LoadPipelines; using VideoCommon::SerializePipeline; using Context = ShaderContext::Context; -constexpr u32 CACHE_VERSION = 10; +constexpr u32 CACHE_VERSION = 13; template auto MakeSpan(Container& container) { @@ -399,11 +399,6 @@ GraphicsPipeline* ShaderCache::BuiltPipeline(GraphicsPipeline* pipeline) const n if (!use_asynchronous_shaders) { return pipeline; } - // If something is using depth, we can assume that games are not rendering anything which - // will be used one time. - if (maxwell3d->regs.zeta_enable) { - return nullptr; - } // If games are using a small index count, we can assume these are full screen quads. // Usually these shaders are only used once for building textures so we can assume they // can't be built async @@ -617,7 +612,7 @@ std::unique_ptr ShaderCache::CreateComputePipeline( } std::unique_ptr ShaderCache::CreateWorkers() const { - return std::make_unique(std::max(std::thread::hardware_concurrency(), 2U) - 1, + return std::make_unique((std::max)(std::thread::hardware_concurrency(), 2U) - 1, "GlShaderBuilder", [this] { return Context{emu_window}; }); } diff --git a/src/video_core/renderer_opengl/gl_staging_buffer_pool.cpp b/src/video_core/renderer_opengl/gl_staging_buffer_pool.cpp index 5767d6b7de..d9535c277d 100644 --- a/src/video_core/renderer_opengl/gl_staging_buffer_pool.cpp +++ b/src/video_core/renderer_opengl/gl_staging_buffer_pool.cpp @@ -68,7 +68,7 @@ size_t StagingBuffers::RequestBuffer(size_t requested_size) { std::optional StagingBuffers::FindBuffer(size_t requested_size) { size_t known_unsignaled_index = current_sync_index + 1; - size_t smallest_buffer = std::numeric_limits::max(); + size_t smallest_buffer = (std::numeric_limits::max)(); std::optional found; const size_t num_buffers = allocs.size(); for (size_t index = 0; index < num_buffers; ++index) { @@ -88,7 +88,7 @@ std::optional StagingBuffers::FindBuffer(size_t requested_size) { if (!alloc.sync.IsSignaled()) { // Since this fence hasn't been signaled, it's safe to assume all later // fences haven't been signaled either - known_unsignaled_index = std::min(known_unsignaled_index, alloc.sync_index); + known_unsignaled_index = (std::min)(known_unsignaled_index, alloc.sync_index); continue; } alloc.sync.Release(); @@ -120,7 +120,7 @@ std::pair, size_t> StreamBuffer::Request(size_t size) noexcept { used_iterator = iterator; for (size_t region = Region(free_iterator) + 1, - region_end = std::min(Region(iterator + size) + 1, NUM_SYNCS); + region_end = (std::min)(Region(iterator + size) + 1, NUM_SYNCS); region < region_end; ++region) { glClientWaitSync(fences[region].handle, 0, GL_TIMEOUT_IGNORED); fences[region].Release(); diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h index 19bcf3f355..94ef975606 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -79,7 +82,7 @@ enum : u8 { Last }; -static_assert(Last <= std::numeric_limits::max()); +static_assert(Last <= (std::numeric_limits::max)()); } // namespace Dirty diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index be14494ca5..a3957e4d9f 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -717,7 +720,7 @@ Image::Image(TextureCacheRuntime& runtime_, const VideoCommon::ImageInfo& info_, gl_type = tuple.type; } const int max_host_mip_levels = std::bit_width(info.size.width); - gl_num_levels = std::min(info.resources.levels, max_host_mip_levels); + gl_num_levels = (std::min)(info.resources.levels, max_host_mip_levels); texture = MakeImage(info, gl_internal_format, gl_num_levels); current_texture = texture.handle; if (runtime->device.HasDebuggingToolAttached()) { @@ -742,8 +745,8 @@ void Image::UploadMemory(GLuint buffer_handle, size_t buffer_offset, glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - u32 current_row_length = std::numeric_limits::max(); - u32 current_image_height = std::numeric_limits::max(); + u32 current_row_length = (std::numeric_limits::max)(); + u32 current_image_height = (std::numeric_limits::max)(); for (const VideoCommon::BufferImageCopy& copy : copies) { if (copy.image_subresource.base_level >= gl_num_levels) { @@ -788,8 +791,8 @@ void Image::DownloadMemory(std::span buffer_handles, std::span b glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer_handle); glPixelStorei(GL_PACK_ALIGNMENT, 1); - u32 current_row_length = std::numeric_limits::max(); - u32 current_image_height = std::numeric_limits::max(); + u32 current_row_length = (std::numeric_limits::max)(); + u32 current_image_height = (std::numeric_limits::max)(); for (const VideoCommon::BufferImageCopy& copy : copies) { if (copy.image_subresource.base_level >= gl_num_levels) { @@ -1033,10 +1036,10 @@ void Image::Scale(bool up_scale) { const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle; for (s32 layer = 0; layer < info.resources.layers; ++layer) { for (s32 level = 0; level < info.resources.levels; ++level) { - const u32 src_level_width = std::max(1u, src_width >> level); - const u32 src_level_height = std::max(1u, src_height >> level); - const u32 dst_level_width = std::max(1u, dst_width >> level); - const u32 dst_level_height = std::max(1u, dst_height >> level); + const u32 src_level_width = (std::max)(1u, src_width >> level); + const u32 src_level_height = (std::max)(1u, src_height >> level); + const u32 dst_level_width = (std::max)(1u, dst_width >> level); + const u32 dst_level_height = (std::max)(1u, dst_height >> level); glNamedFramebufferTextureLayer(read_fbo, attachment, src_handle, level, layer); glNamedFramebufferTextureLayer(draw_fbo, attachment, dst_handle, level, layer); diff --git a/src/video_core/renderer_opengl/present/filters.cpp b/src/video_core/renderer_opengl/present/filters.cpp index c5ac8e7823..e47593fc80 100644 --- a/src/video_core/renderer_opengl/present/filters.cpp +++ b/src/video_core/renderer_opengl/present/filters.cpp @@ -12,6 +12,12 @@ #include "video_core/host_shaders/present_area_frag.h" #include "video_core/host_shaders/present_bicubic_frag.h" #include "video_core/host_shaders/present_gaussian_frag.h" +#include "video_core/host_shaders/present_lanczos_frag.h" +#include "video_core/host_shaders/present_spline1_frag.h" +#include "video_core/host_shaders/present_mitchell_frag.h" +#include "video_core/host_shaders/present_bspline_frag.h" +#include "video_core/host_shaders/present_zero_tangent_frag.h" +#include "video_core/host_shaders/present_mmpx_frag.h" #include "video_core/renderer_opengl/present/filters.h" #include "video_core/renderer_opengl/present/util.h" @@ -27,16 +33,41 @@ std::unique_ptr MakeBilinear(const Device& device) { HostShaders::OPENGL_PRESENT_FRAG); } +std::unique_ptr MakeSpline1(const Device& device) { + return std::make_unique(device, CreateBilinearSampler(), + HostShaders::PRESENT_SPLINE1_FRAG); +} + std::unique_ptr MakeBicubic(const Device& device) { return std::make_unique(device, CreateBilinearSampler(), HostShaders::PRESENT_BICUBIC_FRAG); } +std::unique_ptr MakeMitchell(const Device& device) { + return std::make_unique(device, CreateBilinearSampler(), + HostShaders::PRESENT_MITCHELL_FRAG); +} + +std::unique_ptr MakeZeroTangent(const Device& device) { + return std::make_unique(device, CreateBilinearSampler(), + HostShaders::PRESENT_ZERO_TANGENT_FRAG); +} + +std::unique_ptr MakeBSpline(const Device& device) { + return std::make_unique(device, CreateBilinearSampler(), + HostShaders::PRESENT_BSPLINE_FRAG); +} + std::unique_ptr MakeGaussian(const Device& device) { return std::make_unique(device, CreateBilinearSampler(), HostShaders::PRESENT_GAUSSIAN_FRAG); } +std::unique_ptr MakeLanczos(const Device& device) { + return std::make_unique(device, CreateBilinearSampler(), + HostShaders::PRESENT_LANCZOS_FRAG); +} + std::unique_ptr MakeScaleForce(const Device& device) { return std::make_unique( device, CreateBilinearSampler(), @@ -48,4 +79,9 @@ std::unique_ptr MakeArea(const Device& device) { HostShaders::PRESENT_AREA_FRAG); } +std::unique_ptr MakeMmpx(const Device& device) { + return std::make_unique(device, CreateNearestNeighborSampler(), + HostShaders::PRESENT_MMPX_FRAG); +} + } // namespace OpenGL diff --git a/src/video_core/renderer_opengl/present/filters.h b/src/video_core/renderer_opengl/present/filters.h index be2ce24842..187d0f1298 100644 --- a/src/video_core/renderer_opengl/present/filters.h +++ b/src/video_core/renderer_opengl/present/filters.h @@ -17,8 +17,14 @@ namespace OpenGL { std::unique_ptr MakeNearestNeighbor(const Device& device); std::unique_ptr MakeBilinear(const Device& device); std::unique_ptr MakeBicubic(const Device& device); +std::unique_ptr MakeZeroTangent(const Device& device); +std::unique_ptr MakeMitchell(const Device& device); +std::unique_ptr MakeBSpline(const Device& device); std::unique_ptr MakeGaussian(const Device& device); +std::unique_ptr MakeSpline1(const Device& device); +std::unique_ptr MakeLanczos(const Device& device); std::unique_ptr MakeScaleForce(const Device& device); std::unique_ptr MakeArea(const Device& device); +std::unique_ptr MakeMmpx(const Device& device); } // namespace OpenGL diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index 596323fb32..68543bdd48 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp @@ -46,6 +46,38 @@ namespace Vulkan { using VideoCommon::ImageViewType; namespace { + +[[nodiscard]] VkImageAspectFlags AspectMaskFromFormat(VideoCore::Surface::PixelFormat format) { + using VideoCore::Surface::SurfaceType; + switch (VideoCore::Surface::GetFormatType(format)) { + case SurfaceType::ColorTexture: + return VK_IMAGE_ASPECT_COLOR_BIT; + case SurfaceType::Depth: + return VK_IMAGE_ASPECT_DEPTH_BIT; + case SurfaceType::Stencil: + return VK_IMAGE_ASPECT_STENCIL_BIT; + case SurfaceType::DepthStencil: + return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + default: + return VK_IMAGE_ASPECT_COLOR_BIT; + } +} + +[[nodiscard]] VkImageSubresourceRange SubresourceRangeFromView(const ImageView& image_view) { + auto range = image_view.range; + if ((image_view.flags & VideoCommon::ImageViewFlagBits::Slice) != VideoCommon::ImageViewFlagBits{}) { + range.base.layer = 0; + range.extent.layers = 1; + } + return VkImageSubresourceRange{ + .aspectMask = AspectMaskFromFormat(image_view.format), + .baseMipLevel = static_cast(range.base.level), + .levelCount = static_cast(range.extent.levels), + .baseArrayLayer = static_cast(range.base.layer), + .layerCount = static_cast(range.extent.layers), + }; +} + struct PushConstants { std::array tex_scale; std::array tex_offset; @@ -102,13 +134,16 @@ constexpr VkPipelineVertexInputStateCreateInfo PIPELINE_VERTEX_INPUT_STATE_CREAT .vertexAttributeDescriptionCount = 0, .pVertexAttributeDescriptions = nullptr, }; -constexpr VkPipelineInputAssemblyStateCreateInfo PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO{ - .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, - .pNext = nullptr, - .flags = 0, - .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - .primitiveRestartEnable = VK_FALSE, -}; + +VkPipelineInputAssemblyStateCreateInfo GetPipelineInputAssemblyStateCreateInfo(const Device& device) { + return VkPipelineInputAssemblyStateCreateInfo{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + .primitiveRestartEnable = device.IsMoltenVK() ? VK_TRUE : VK_FALSE, + }; +} constexpr VkPipelineViewportStateCreateInfo PIPELINE_VIEWPORT_STATE_CREATE_INFO{ .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pNext = nullptr, @@ -337,8 +372,8 @@ void UpdateTwoTexturesDescriptorSet(const Device& device, VkDescriptorSet descri void BindBlitState(vk::CommandBuffer cmdbuf, const Region2D& dst_region) { const VkOffset2D offset{ - .x = std::min(dst_region.start.x, dst_region.end.x), - .y = std::min(dst_region.start.y, dst_region.end.y), + .x = (std::min)(dst_region.start.x, dst_region.end.x), + .y = (std::min)(dst_region.start.y, dst_region.end.y), }; const VkExtent2D extent{ .width = static_cast(std::abs(dst_region.end.x - dst_region.start.x)), @@ -414,6 +449,40 @@ void TransitionImageLayout(vk::CommandBuffer& cmdbuf, VkImage image, VkImageLayo 0, barrier); } +void RecordShaderReadBarrier(Scheduler& scheduler, const ImageView& image_view) { + const VkImage image = image_view.ImageHandle(); + const VkImageSubresourceRange subresource_range = SubresourceRangeFromView(image_view); + scheduler.RequestOutsideRenderPassOperationContext(); + scheduler.Record([image, subresource_range](vk::CommandBuffer cmdbuf) { + const VkImageMemoryBarrier barrier{ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .pNext = nullptr, + .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | + VK_ACCESS_SHADER_WRITE_BIT | + VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, + .oldLayout = VK_IMAGE_LAYOUT_GENERAL, + .newLayout = VK_IMAGE_LAYOUT_GENERAL, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = image, + .subresourceRange = subresource_range, + }; + cmdbuf.PipelineBarrier( + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + 0, + barrier); + }); +} + void BeginRenderPass(vk::CommandBuffer& cmdbuf, const Framebuffer* framebuffer) { const VkRenderPass render_pass = framebuffer->RenderPass(); const VkFramebuffer framebuffer_handle = framebuffer->Handle(); @@ -481,7 +550,7 @@ BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_, BlitImageHelper::~BlitImageHelper() = default; -void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_view, +void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, const ImageView& src_image_view, const Region2D& dst_region, const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, Tegra::Engines::Fermi2D::Operation operation) { @@ -493,10 +562,12 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView const VkPipelineLayout layout = *one_texture_pipeline_layout; const VkSampler sampler = is_linear ? *linear_sampler : *nearest_sampler; const VkPipeline pipeline = FindOrEmplaceColorPipeline(key); + const VkImageView src_view = src_image_view.Handle(Shader::TextureType::Color2D); + + RecordShaderReadBarrier(scheduler, src_image_view); scheduler.RequestRenderpass(dst_framebuffer); scheduler.Record([this, dst_region, src_region, pipeline, layout, sampler, src_view](vk::CommandBuffer cmdbuf) { - // TODO: Barriers const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); UpdateOneTextureDescriptorSet(device, descriptor_set, sampler, src_view); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); @@ -535,7 +606,7 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView } void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer, - VkImageView src_depth_view, VkImageView src_stencil_view, + ImageView& src_image_view, const Region2D& dst_region, const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, Tegra::Engines::Fermi2D::Operation operation) { @@ -551,10 +622,13 @@ void BlitImageHelper::BlitDepthStencil(const Framebuffer* dst_framebuffer, const VkPipelineLayout layout = *two_textures_pipeline_layout; const VkSampler sampler = *nearest_sampler; const VkPipeline pipeline = FindOrEmplaceDepthStencilPipeline(key); + const VkImageView src_depth_view = src_image_view.DepthView(); + const VkImageView src_stencil_view = src_image_view.StencilView(); + + RecordShaderReadBarrier(scheduler, src_image_view); scheduler.RequestRenderpass(dst_framebuffer); scheduler.Record([dst_region, src_region, pipeline, layout, sampler, src_depth_view, src_stencil_view, this](vk::CommandBuffer cmdbuf) { - // TODO: Barriers const VkDescriptorSet descriptor_set = two_textures_descriptor_allocator.Commit(); UpdateTwoTexturesDescriptorSet(device, descriptor_set, sampler, src_depth_view, src_stencil_view); @@ -689,6 +763,7 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb const VkSampler sampler = *nearest_sampler; const VkExtent2D extent = GetConversionExtent(src_image_view); + RecordShaderReadBarrier(scheduler, src_image_view); scheduler.RequestRenderpass(dst_framebuffer); scheduler.Record([pipeline, layout, sampler, src_view, extent, this](vk::CommandBuffer cmdbuf) { const VkOffset2D offset{ @@ -714,7 +789,6 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); UpdateOneTextureDescriptorSet(device, descriptor_set, sampler, src_view); - // TODO: Barriers cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set, nullptr); @@ -734,6 +808,7 @@ void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer const VkSampler sampler = *nearest_sampler; const VkExtent2D extent = GetConversionExtent(src_image_view); + RecordShaderReadBarrier(scheduler, src_image_view); scheduler.RequestRenderpass(dst_framebuffer); scheduler.Record([pipeline, layout, sampler, src_depth_view, src_stencil_view, extent, this](vk::CommandBuffer cmdbuf) { @@ -760,7 +835,6 @@ void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer const VkDescriptorSet descriptor_set = two_textures_descriptor_allocator.Commit(); UpdateTwoTexturesDescriptorSet(device, descriptor_set, sampler, src_depth_view, src_stencil_view); - // TODO: Barriers cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set, nullptr); @@ -802,6 +876,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceColorPipeline(const BlitImagePipelineKe .pAttachments = &blend_attachment, .blendConstants = {0.0f, 0.0f, 0.0f, 0.0f}, }; + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); blit_color_pipelines.push_back(device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -809,7 +884,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceColorPipeline(const BlitImagePipelineKe .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -833,6 +908,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceDepthStencilPipeline(const BlitImagePip } blit_depth_stencil_keys.push_back(key); const std::array stages = MakeStages(*full_screen_vert, *blit_depth_stencil_frag); + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); blit_depth_stencil_pipelines.push_back(device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -840,7 +916,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceDepthStencilPipeline(const BlitImagePip .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -885,6 +961,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceClearColorPipeline(const BlitImagePipel .pAttachments = &color_blend_attachment_state, .blendConstants = {0.0f, 0.0f, 0.0f, 0.0f}, }; + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); clear_color_pipelines.push_back(device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -892,7 +969,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceClearColorPipeline(const BlitImagePipel .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -940,6 +1017,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceClearStencilPipeline( .minDepthBounds = 0.0f, .maxDepthBounds = 0.0f, }; + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); clear_stencil_pipelines.push_back(device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -947,7 +1025,7 @@ VkPipeline BlitImageHelper::FindOrEmplaceClearStencilPipeline( .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -970,6 +1048,7 @@ void BlitImageHelper::ConvertDepthToColorPipeline(vk::Pipeline& pipeline, VkRend } VkShaderModule frag_shader = *convert_float_to_depth_frag; const std::array stages = MakeStages(*full_screen_vert, frag_shader); + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); pipeline = device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -977,7 +1056,7 @@ void BlitImageHelper::ConvertDepthToColorPipeline(vk::Pipeline& pipeline, VkRend .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -999,6 +1078,7 @@ void BlitImageHelper::ConvertColorToDepthPipeline(vk::Pipeline& pipeline, VkRend } VkShaderModule frag_shader = *convert_depth_to_float_frag; const std::array stages = MakeStages(*full_screen_vert, frag_shader); + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); pipeline = device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -1006,7 +1086,7 @@ void BlitImageHelper::ConvertColorToDepthPipeline(vk::Pipeline& pipeline, VkRend .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -1029,6 +1109,7 @@ void BlitImageHelper::ConvertPipelineEx(vk::Pipeline& pipeline, VkRenderPass ren return; } const std::array stages = MakeStages(*full_screen_vert, *module); + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); pipeline = device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -1036,7 +1117,7 @@ void BlitImageHelper::ConvertPipelineEx(vk::Pipeline& pipeline, VkRenderPass ren .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, @@ -1070,6 +1151,7 @@ void BlitImageHelper::ConvertPipeline(vk::Pipeline& pipeline, VkRenderPass rende VkShaderModule frag_shader = is_target_depth ? *convert_float_to_depth_frag : *convert_depth_to_float_frag; const std::array stages = MakeStages(*full_screen_vert, frag_shader); + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci = GetPipelineInputAssemblyStateCreateInfo(device); pipeline = device.GetLogical().CreateGraphicsPipeline({ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, .pNext = nullptr, @@ -1077,7 +1159,7 @@ void BlitImageHelper::ConvertPipeline(vk::Pipeline& pipeline, VkRenderPass rende .stageCount = static_cast(stages.size()), .pStages = stages.data(), .pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pInputAssemblyState = &input_assembly_ci, .pTessellationState = nullptr, .pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO, diff --git a/src/video_core/renderer_vulkan/blit_image.h b/src/video_core/renderer_vulkan/blit_image.h index 3d400be6a9..bdb8cce883 100644 --- a/src/video_core/renderer_vulkan/blit_image.h +++ b/src/video_core/renderer_vulkan/blit_image.h @@ -1,4 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -43,7 +46,7 @@ public: StateTracker& state_tracker, DescriptorPool& descriptor_pool); ~BlitImageHelper(); - void BlitColor(const Framebuffer* dst_framebuffer, VkImageView src_image_view, + void BlitColor(const Framebuffer* dst_framebuffer, const ImageView& src_image_view, const Region2D& dst_region, const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, Tegra::Engines::Fermi2D::Operation operation); @@ -52,9 +55,9 @@ public: VkImage src_image, VkSampler src_sampler, const Region2D& dst_region, const Region2D& src_region, const Extent3D& src_size); - void BlitDepthStencil(const Framebuffer* dst_framebuffer, VkImageView src_depth_view, - VkImageView src_stencil_view, const Region2D& dst_region, - const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, + void BlitDepthStencil(const Framebuffer* dst_framebuffer, ImageView& src_image_view, + const Region2D& dst_region, const Region2D& src_region, + Tegra::Engines::Fermi2D::Filter filter, Tegra::Engines::Fermi2D::Operation operation); void ConvertD32ToR32(const Framebuffer* dst_framebuffer, const ImageView& src_image_view); diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 39f4fc6993..7cb8acec89 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include "common/bit_cast.h" #include "common/cityhash.h" #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/engines/draw_manager.h" #include "video_core/renderer_vulkan/fixed_pipeline_state.h" #include "video_core/renderer_vulkan/vk_state_tracker.h" diff --git a/src/video_core/renderer_vulkan/present/filters.cpp b/src/video_core/renderer_vulkan/present/filters.cpp index 7843f38d2c..0a28ea6349 100644 --- a/src/video_core/renderer_vulkan/present/filters.cpp +++ b/src/video_core/renderer_vulkan/present/filters.cpp @@ -7,11 +7,19 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include "common/assert.h" #include "common/common_types.h" #include "video_core/host_shaders/present_area_frag_spv.h" #include "video_core/host_shaders/present_bicubic_frag_spv.h" #include "video_core/host_shaders/present_gaussian_frag_spv.h" +#include "video_core/host_shaders/present_lanczos_frag_spv.h" +#include "video_core/host_shaders/present_spline1_frag_spv.h" +#include "video_core/host_shaders/present_mitchell_frag_spv.h" +#include "video_core/host_shaders/present_bspline_frag_spv.h" +#include "video_core/host_shaders/present_zero_tangent_frag_spv.h" +#include "video_core/host_shaders/present_mmpx_frag_spv.h" #include "video_core/host_shaders/vulkan_present_frag_spv.h" #include "video_core/host_shaders/vulkan_present_scaleforce_fp16_frag_spv.h" #include "video_core/host_shaders/vulkan_present_scaleforce_fp32_frag_spv.h" @@ -45,13 +53,33 @@ std::unique_ptr MakeBilinear(const Device& device, VkFormat fra BuildShader(device, VULKAN_PRESENT_FRAG_SPV)); } -std::unique_ptr MakeBicubic(const Device& device, VkFormat frame_format) { - // No need for handrolled shader -- if the VK impl can do it for us ;) - if (device.IsExtFilterCubicSupported()) - return std::make_unique(device, frame_format, CreateCubicSampler(device), - BuildShader(device, VULKAN_PRESENT_FRAG_SPV)); +std::unique_ptr MakeSpline1(const Device& device, VkFormat frame_format) { return std::make_unique(device, frame_format, CreateBilinearSampler(device), - BuildShader(device, PRESENT_BICUBIC_FRAG_SPV)); + BuildShader(device, PRESENT_SPLINE1_FRAG_SPV)); +} + +std::unique_ptr MakeBicubic(const Device& device, VkFormat frame_format, VkCubicFilterWeightsQCOM qcom_weights) { + // No need for handrolled shader -- if the VK impl can do it for us ;) + // Catmull-Rom is default bicubic for all implementations... + if (device.IsExtFilterCubicSupported() && (device.IsQcomFilterCubicWeightsSupported() || qcom_weights == VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM)) { + return std::make_unique(device, frame_format, CreateCubicSampler(device, + qcom_weights), BuildShader(device, VULKAN_PRESENT_FRAG_SPV)); + } else { + return std::make_unique(device, frame_format, CreateBilinearSampler(device), [&](){ + switch (qcom_weights) { + case VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM: + return BuildShader(device, PRESENT_BICUBIC_FRAG_SPV); + case VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM: + return BuildShader(device, PRESENT_ZERO_TANGENT_FRAG_SPV); + case VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM: + return BuildShader(device, PRESENT_BSPLINE_FRAG_SPV); + case VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM: + return BuildShader(device, PRESENT_MITCHELL_FRAG_SPV); + default: + UNREACHABLE(); + } + }()); + } } std::unique_ptr MakeGaussian(const Device& device, VkFormat frame_format) { @@ -59,6 +87,11 @@ std::unique_ptr MakeGaussian(const Device& device, VkFormat fra BuildShader(device, PRESENT_GAUSSIAN_FRAG_SPV)); } +std::unique_ptr MakeLanczos(const Device& device, VkFormat frame_format) { + return std::make_unique(device, frame_format, CreateBilinearSampler(device), + BuildShader(device, PRESENT_LANCZOS_FRAG_SPV)); +} + std::unique_ptr MakeScaleForce(const Device& device, VkFormat frame_format) { return std::make_unique(device, frame_format, CreateBilinearSampler(device), SelectScaleForceShader(device)); @@ -69,4 +102,9 @@ std::unique_ptr MakeArea(const Device& device, VkFormat frame_f BuildShader(device, PRESENT_AREA_FRAG_SPV)); } +std::unique_ptr MakeMmpx(const Device& device, VkFormat frame_format) { + return std::make_unique(device, frame_format, CreateNearestNeighborSampler(device), + BuildShader(device, PRESENT_MMPX_FRAG_SPV)); +} + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/present/filters.h b/src/video_core/renderer_vulkan/present/filters.h index c8259487f8..afc3ba29a0 100644 --- a/src/video_core/renderer_vulkan/present/filters.h +++ b/src/video_core/renderer_vulkan/present/filters.h @@ -17,9 +17,12 @@ class MemoryAllocator; std::unique_ptr MakeNearestNeighbor(const Device& device, VkFormat frame_format); std::unique_ptr MakeBilinear(const Device& device, VkFormat frame_format); -std::unique_ptr MakeBicubic(const Device& device, VkFormat frame_format); +std::unique_ptr MakeBicubic(const Device& device, VkFormat frame_format, VkCubicFilterWeightsQCOM qcom_weights); +std::unique_ptr MakeSpline1(const Device& device, VkFormat frame_format); std::unique_ptr MakeGaussian(const Device& device, VkFormat frame_format); +std::unique_ptr MakeLanczos(const Device& device, VkFormat frame_format); std::unique_ptr MakeScaleForce(const Device& device, VkFormat frame_format); std::unique_ptr MakeArea(const Device& device, VkFormat frame_format); +std::unique_ptr MakeMmpx(const Device& device, VkFormat frame_format); } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index fa7c457573..fee19a69c2 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -280,6 +280,7 @@ void Layer::UpdateRawImage(const Tegra::FramebufferConfig& framebuffer, size_t i Tegra::Texture::UnswizzleTexture( mapped_span.subspan(image_offset, linear_size), std::span(host_ptr, tiled_size), bytes_per_pixel, framebuffer.width, framebuffer.height, 1, block_height_log2, 0); + buffer.Flush(); // Ensure host writes are visible before the GPU copy. } const VkBufferImageCopy copy{ @@ -331,7 +332,7 @@ void Layer::UpdateRawImage(const Tegra::FramebufferConfig& framebuffer, size_t i write_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; write_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, read_barrier); cmdbuf.CopyBufferToImage(*buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, copy); cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, diff --git a/src/video_core/renderer_vulkan/present/smaa.cpp b/src/video_core/renderer_vulkan/present/smaa.cpp index 39645fd1d7..686112f2f0 100644 --- a/src/video_core/renderer_vulkan/present/smaa.cpp +++ b/src/video_core/renderer_vulkan/present/smaa.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/assert.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/renderer_vulkan/present/smaa.h" #include "video_core/renderer_vulkan/present/util.h" diff --git a/src/video_core/renderer_vulkan/present/util.cpp b/src/video_core/renderer_vulkan/present/util.cpp index 6874bbae99..29a1c34976 100644 --- a/src/video_core/renderer_vulkan/present/util.cpp +++ b/src/video_core/renderer_vulkan/present/util.cpp @@ -5,7 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/renderer_vulkan/present/util.h" namespace Vulkan { @@ -400,12 +400,12 @@ static vk::Pipeline CreateWrappedPipelineImpl( .pVertexAttributeDescriptions = nullptr, }; - constexpr VkPipelineInputAssemblyStateCreateInfo input_assembly_ci{ + const VkPipelineInputAssemblyStateCreateInfo input_assembly_ci{ .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, .pNext = nullptr, .flags = 0, .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, - .primitiveRestartEnable = VK_FALSE, + .primitiveRestartEnable = device.IsMoltenVK() ? VK_TRUE : VK_FALSE, }; constexpr VkPipelineViewportStateCreateInfo viewport_state_ci{ @@ -624,8 +624,8 @@ vk::Sampler CreateNearestNeighborSampler(const Device& device) { return device.GetLogical().CreateSampler(ci_nn); } -vk::Sampler CreateCubicSampler(const Device& device) { - const VkSamplerCreateInfo ci_nn{ +vk::Sampler CreateCubicSampler(const Device& device, VkCubicFilterWeightsQCOM qcom_weights) { + VkSamplerCreateInfo ci_nn{ .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, .pNext = nullptr, .flags = 0, @@ -645,7 +645,14 @@ vk::Sampler CreateCubicSampler(const Device& device) { .borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK, .unnormalizedCoordinates = VK_FALSE, }; - + const VkSamplerCubicWeightsCreateInfoQCOM ci_qcom_nn{ + .sType = VK_STRUCTURE_TYPE_SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM, + .pNext = nullptr, + .cubicWeights = qcom_weights + }; + // If not specified, assume Catmull-Rom + if (qcom_weights != VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM) + ci_nn.pNext = &ci_qcom_nn; return device.GetLogical().CreateSampler(ci_nn); } diff --git a/src/video_core/renderer_vulkan/present/util.h b/src/video_core/renderer_vulkan/present/util.h index 11810352df..38cc6203c5 100644 --- a/src/video_core/renderer_vulkan/present/util.h +++ b/src/video_core/renderer_vulkan/present/util.h @@ -57,7 +57,7 @@ VkWriteDescriptorSet CreateWriteDescriptorSet(std::vector VkDescriptorSet set, u32 binding); vk::Sampler CreateBilinearSampler(const Device& device); vk::Sampler CreateNearestNeighborSampler(const Device& device); -vk::Sampler CreateCubicSampler(const Device& device); +vk::Sampler CreateCubicSampler(const Device& device, VkCubicFilterWeightsQCOM qcom_weights); void BeginRenderPass(vk::CommandBuffer& cmdbuf, VkRenderPass render_pass, VkFramebuffer framebuffer, VkExtent2D extent); diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index a91fba6725..e6e72cdca7 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -15,7 +15,7 @@ #include #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "common/scope_exit.h" #include "common/settings.h" #include "core/core_timing.h" @@ -164,15 +164,6 @@ try PresentFiltersForAppletCapture) , rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler) { - // Initialize RAII wrappers after creating the main objects - if (Settings::values.enable_raii.GetValue()) { - managed_instance = MakeManagedInstance(instance, dld); - if (Settings::values.renderer_debug) { - managed_debug_messenger = MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld); - } - managed_surface = MakeManagedSurface(surface, instance, dld); - } - if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { turbo_mode.emplace(instance, dld); scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); }); diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index c1e6d5db7f..4fb88b29de 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,7 +23,6 @@ #include "video_core/vulkan_common/vulkan_device.h" #include "video_core/vulkan_common/vulkan_memory_allocator.h" #include "video_core/vulkan_common/vulkan_wrapper.h" -#include "video_core/vulkan_common/vulkan_raii.h" namespace Core::Memory { class Memory; @@ -78,16 +80,10 @@ private: // Keep original handles for compatibility with existing code vk::Instance instance; - // RAII wrapper for instance - ManagedInstance managed_instance; vk::DebugUtilsMessenger debug_messenger; - // RAII wrapper for debug messenger - ManagedDebugUtilsMessenger managed_debug_messenger; vk::SurfaceKHR surface; - // RAII wrapper for surface - ManagedSurface managed_surface; Device device; MemoryAllocator memory_allocator; diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index 39f07b966d..0f54dd5ade 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -7,6 +7,7 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "video_core/framebuffer_config.h" #include "video_core/present.h" #include "video_core/renderer_vulkan/present/filters.h" @@ -41,17 +42,35 @@ void BlitScreen::SetWindowAdaptPass() { window_adapt = MakeNearestNeighbor(device, swapchain_view_format); break; case Settings::ScalingFilter::Bicubic: - window_adapt = MakeBicubic(device, swapchain_view_format); + window_adapt = MakeBicubic(device, swapchain_view_format, VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM); + break; + case Settings::ScalingFilter::ZeroTangent: + window_adapt = MakeBicubic(device, swapchain_view_format, VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM); + break; + case Settings::ScalingFilter::BSpline: + window_adapt = MakeBicubic(device, swapchain_view_format, VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM); + break; + case Settings::ScalingFilter::Mitchell: + window_adapt = MakeBicubic(device, swapchain_view_format, VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM); + break; + case Settings::ScalingFilter::Spline1: + window_adapt = MakeSpline1(device, swapchain_view_format); break; case Settings::ScalingFilter::Gaussian: window_adapt = MakeGaussian(device, swapchain_view_format); break; + case Settings::ScalingFilter::Lanczos: + window_adapt = MakeLanczos(device, swapchain_view_format); + break; case Settings::ScalingFilter::ScaleForce: window_adapt = MakeScaleForce(device, swapchain_view_format); break; case Settings::ScalingFilter::Area: window_adapt = MakeArea(device, swapchain_view_format); break; + case Settings::ScalingFilter::Mmpx: + window_adapt = MakeMmpx(device, swapchain_view_format); + break; case Settings::ScalingFilter::Fsr: case Settings::ScalingFilter::Bilinear: default: diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index e5e1e3ab63..55565e3d79 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -573,8 +576,8 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bi buffer_handles.push_back(handle); } const u32 device_max = device.GetMaxVertexInputBindings(); - const u32 min_binding = std::min(bindings.min_index, device_max); - const u32 max_binding = std::min(bindings.max_index, device_max); + const u32 min_binding = (std::min)(bindings.min_index, device_max); + const u32 max_binding = (std::min)(bindings.max_index, device_max); const u32 binding_count = max_binding - min_binding; if (binding_count == 0) { return; diff --git a/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp b/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp index 6048a301fa..3af9758a31 100644 --- a/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/renderer_vulkan/vk_descriptor_pool.h" #include "video_core/renderer_vulkan/vk_resource_pool.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -28,7 +31,7 @@ struct DescriptorBank { bool DescriptorBankInfo::IsSuperset(const DescriptorBankInfo& subset) const noexcept { return uniform_buffers >= subset.uniform_buffers && storage_buffers >= subset.storage_buffers && texture_buffers >= subset.texture_buffers && image_buffers >= subset.image_buffers && - textures >= subset.textures && images >= subset.image_buffers; + textures >= subset.textures && images >= subset.images; } template diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 0226eb2c14..745389213e 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -562,7 +562,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { static_vector vertex_binding_divisors; static_vector vertex_attributes; if (!key.state.dynamic_vertex_input) { - const size_t num_vertex_arrays = std::min( + const size_t num_vertex_arrays = (std::min)( Maxwell::NumVertexArrays, static_cast(device.GetMaxVertexInputBindings())); for (size_t index = 0; index < num_vertex_arrays; ++index) { const bool instanced = key.state.binding_divisors[index] != 0; @@ -635,14 +635,16 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { .flags = 0, .topology = input_assembly_topology, .primitiveRestartEnable = - dynamic.primitive_restart_enable != 0 && + // MoltenVK/Metal always has primitive restart enabled and cannot disable it + device.IsMoltenVK() ? VK_TRUE : + (dynamic.primitive_restart_enable != 0 && ((input_assembly_topology != VK_PRIMITIVE_TOPOLOGY_PATCH_LIST && device.IsTopologyListPrimitiveRestartSupported()) || SupportsPrimitiveRestart(input_assembly_topology) || (input_assembly_topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST && device.IsPatchListPrimitiveRestartSupported())) ? VK_TRUE - : VK_FALSE, + : VK_FALSE), }; const VkPipelineTessellationStateCreateInfo tessellation_ci{ .sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, @@ -894,11 +896,6 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { .pName = "main", .pSpecializationInfo = nullptr, }); - /* - if (program[stage]->entries.uses_warps && device.IsGuestWarpSizeSupported(stage_ci.stage)) { - stage_ci.pNext = &subgroup_size_ci; - } - */ } VkPipelineCreateFlags flags{}; if (device.IsKhrPipelineExecutablePropertiesEnabled() && Settings::values.renderer_debug.GetValue()) { diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index 4e5a2ff049..e65755de64 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp @@ -6,7 +6,7 @@ #include -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "video_core/renderer_vulkan/vk_master_semaphore.h" #include "video_core/vulkan_common/vulkan_device.h" @@ -208,7 +208,7 @@ void MasterSemaphore::WaitThread(std::stop_token token) { vk::Fence fence; { std::unique_lock lock{wait_mutex}; - Common::CondvarWait(wait_cv, lock, token, [this] { return !wait_queue.empty(); }); + wait_cv.wait(lock, token, [this] { return !wait_queue.empty(); }); if (token.stop_requested()) { return; } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index e4b6527db0..9cdbe5611b 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -55,7 +55,7 @@ using VideoCommon::FileEnvironment; using VideoCommon::GenericEnvironment; using VideoCommon::GraphicsEnvironment; -constexpr u32 CACHE_VERSION = 12; +constexpr u32 CACHE_VERSION = 13; constexpr std::array VULKAN_CACHE_MAGIC_NUMBER{'y', 'u', 'z', 'u', 'v', 'k', 'c', 'h'}; template @@ -603,11 +603,6 @@ GraphicsPipeline* PipelineCache::BuiltPipeline(GraphicsPipeline* pipeline) const if (!use_asynchronous_shaders) { return pipeline; } - // If something is using depth, we can assume that games are not rendering anything which - // will be used one time. - if (maxwell3d->regs.zeta_enable) { - return nullptr; - } // If games are using a small index count, we can assume these are full screen quads. // Usually these shaders are only used once for building textures so we can assume they // can't be built async diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 9422110895..161f6c8b9f 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -86,8 +86,8 @@ bool CanBlitToSwapchain(const vk::PhysicalDevice& physical_device, VkFormat form }, .extent = { - .width = std::min(frame_width, swapchain_width), - .height = std::min(frame_height, swapchain_height), + .width = (std::min)(frame_width, swapchain_width), + .height = (std::min)(frame_height, swapchain_height), .depth = 1, }, }; @@ -279,7 +279,7 @@ void PresentManager::PresentThread(std::stop_token token) { std::unique_lock lock{queue_mutex}; // Wait for presentation frames - Common::CondvarWait(frame_cv, lock, token, [this] { return !present_queue.empty(); }); + frame_cv.wait(lock, token, [this] { return !present_queue.empty(); }); if (token.stop_requested()) { return; } @@ -412,7 +412,7 @@ void PresentManager::CopyToSwapchainImpl(Frame* frame) { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = 0, .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -460,7 +460,7 @@ void PresentManager::CopyToSwapchainImpl(Frame* frame) { MakeImageCopy(frame->width, frame->height, extent.width, extent.height)); } - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, {}, + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, {}, {}, {}, post_barriers); cmdbuf.End(); @@ -470,8 +470,8 @@ void PresentManager::CopyToSwapchainImpl(Frame* frame) { const std::array wait_semaphores = {present_semaphore, *frame->render_ready}; static constexpr std::array wait_stage_masks{ - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, }; const VkSubmitInfo submit_info{ diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index d6ecc2b65c..89e0b1114e 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -202,8 +202,8 @@ public: }); rasterizer->SyncOperation(std::move(func)); accumulation_since_last_sync = false; - first_accumulation_checkpoint = std::min(first_accumulation_checkpoint, num_slots_used); - last_accumulation_checkpoint = std::max(last_accumulation_checkpoint, num_slots_used); + first_accumulation_checkpoint = (std::min)(first_accumulation_checkpoint, num_slots_used); + last_accumulation_checkpoint = (std::max)(last_accumulation_checkpoint, num_slots_used); } void CloseCounter() override { @@ -311,9 +311,9 @@ public: if (has_multi_queries) { const size_t min_accumulation_limit = - std::min(first_accumulation_checkpoint, num_slots_used); + (std::min)(first_accumulation_checkpoint, num_slots_used); const size_t max_accumulation_limit = - std::max(last_accumulation_checkpoint, num_slots_used); + (std::max)(last_accumulation_checkpoint, num_slots_used); const size_t intermediary_buffer_index = ObtainBuffer(num_slots_used); resolve_buffers.push_back(intermediary_buffer_index); queries_prefix_scan_pass->Run(*accumulation_buffer, *buffers[intermediary_buffer_index], @@ -332,7 +332,7 @@ public: rasterizer->SyncOperation(std::move(func)); AbandonCurrentQuery(); num_slots_used = 0; - first_accumulation_checkpoint = std::numeric_limits::max(); + first_accumulation_checkpoint = (std::numeric_limits::max)(); last_accumulation_checkpoint = 0; accumulation_since_last_sync = has_multi_queries; pending_sync.clear(); @@ -414,7 +414,7 @@ private: size_t start_slot = query->start_slot; for (size_t i = 0; i < banks_set; i++) { auto& the_bank = bank_pool.GetBank(bank_id); - size_t amount = std::min(the_bank.Size() - start_slot, size_slots); + size_t amount = (std::min)(the_bank.Size() - start_slot, size_slots); func(&the_bank, start_slot, amount); bank_id = the_bank.next_bank - 1; start_slot = 0; @@ -431,11 +431,11 @@ private: auto* query = GetQuery(q); ApplyBankOp(query, [&indexer](SamplesQueryBank* bank, size_t start, size_t amount) { auto id_ = bank->GetIndex(); - auto pair = indexer.try_emplace(id_, std::numeric_limits::max(), - std::numeric_limits::min()); + auto pair = indexer.try_emplace(id_, (std::numeric_limits::max)(), + (std::numeric_limits::min)()); auto& current_pair = pair.first->second; - current_pair.first = std::min(current_pair.first, start); - current_pair.second = std::max(current_pair.second, amount + start); + current_pair.first = (std::min)(current_pair.first, start); + current_pair.second = (std::max)(current_pair.second, amount + start); }); } for (auto& cont : indexer) { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 2d12fc658f..70ca9583f9 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -131,8 +131,8 @@ VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u3 s32 max_y = lower_left ? (clip_height - src.min_y) : src.max_y.Value(); // Bound to render area - min_y = std::max(min_y, 0); - max_y = std::max(max_y, 0); + min_y = (std::max)(min_y, 0); + max_y = (std::max)(max_y, 0); if (src.enable) { scissor.offset.x = scale_up(src.min_x); @@ -142,8 +142,8 @@ VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u3 } else { scissor.offset.x = 0; scissor.offset.y = 0; - scissor.extent.width = std::numeric_limits::max(); - scissor.extent.height = std::numeric_limits::max(); + scissor.extent.width = (std::numeric_limits::max)(); + scissor.extent.height = (std::numeric_limits::max)(); } return scissor; } @@ -380,8 +380,8 @@ void RasterizerVulkan::Clear(u32 layer_count) { VkRect2D default_scissor; default_scissor.offset.x = 0; default_scissor.offset.y = 0; - default_scissor.extent.width = std::numeric_limits::max(); - default_scissor.extent.height = std::numeric_limits::max(); + default_scissor.extent.width = (std::numeric_limits::max)(); + default_scissor.extent.height = (std::numeric_limits::max)(); VkClearRect clear_rect{ .rect = regs.clear_control.use_scissor ? GetScissorState(regs, 0, up_scale, down_shift) @@ -393,8 +393,8 @@ void RasterizerVulkan::Clear(u32 layer_count) { return; } clear_rect.rect.extent = VkExtent2D{ - .width = std::min(clear_rect.rect.extent.width, render_area.width), - .height = std::min(clear_rect.rect.extent.height, render_area.height), + .width = (std::min)(clear_rect.rect.extent.width, render_area.width), + .height = (std::min)(clear_rect.rect.extent.height, render_area.height), }; const u32 color_attachment = regs.clear_surface.RT; diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 530d161dfe..d109d22cab 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -166,7 +166,7 @@ void Scheduler::WorkerThread(std::stop_token stop_token) { std::unique_lock lk{queue_mutex}; // Wait for work. - Common::CondvarWait(event_cv, lk, stop_token, [&] { return TryPopQueue(work); }); + event_cv.wait(lk, stop_token, [&] { return TryPopQueue(work); }); // If we've been asked to stop, we're done. if (stop_token.stop_requested()) { diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index 72d5ec35f9..08513d1534 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -31,7 +34,7 @@ size_t GetStreamBufferSize(const Device& device) { VkDeviceSize size{0}; if (device.HasDebuggingToolAttached()) { ForEachDeviceLocalHostVisibleHeap(device, [&size](size_t index, VkMemoryHeap& heap) { - size = std::max(size, heap.size); + size = (std::max)(size, heap.size); }); // If rebar is not supported, cut the max heap size to 40%. This will allow 2 captures to be // loaded at the same time in RenderDoc. If rebar is supported, this shouldn't be an issue @@ -42,7 +45,7 @@ size_t GetStreamBufferSize(const Device& device) { } else { size = MAX_STREAM_BUFFER_SIZE; } - return std::min(Common::AlignUp(size, MAX_ALIGNMENT), MAX_STREAM_BUFFER_SIZE); + return (std::min)(Common::AlignUp(size, MAX_ALIGNMENT), MAX_STREAM_BUFFER_SIZE); } } // Anonymous namespace @@ -104,7 +107,7 @@ void StagingBufferPool::TickFrame() { StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { if (AreRegionsActive(Region(free_iterator) + 1, - std::min(Region(iterator + size) + 1, NUM_SYNCS))) { + (std::min)(Region(iterator + size) + 1, NUM_SYNCS))) { // Avoid waiting for the previous usages to be free return GetStagingBuffer(size, MemoryUsage::Upload); } @@ -112,7 +115,7 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { std::fill(sync_ticks.begin() + Region(used_iterator), sync_ticks.begin() + Region(iterator), current_tick); used_iterator = iterator; - free_iterator = std::max(free_iterator, iterator + size); + free_iterator = (std::max)(free_iterator, iterator + size); if (iterator + size >= stream_buffer_size) { std::fill(sync_ticks.begin() + Region(used_iterator), sync_ticks.begin() + NUM_SYNCS, @@ -170,7 +173,7 @@ std::optional StagingBufferPool::TryGetReservedBuffer(size_t s } } cache_level.iterate_index = std::distance(entries.begin(), it) + 1; - it->tick = deferred ? std::numeric_limits::max() : scheduler.CurrentTick(); + it->tick = deferred ? (std::numeric_limits::max)() : scheduler.CurrentTick(); ASSERT(!it->deferred); it->deferred = deferred; return it->Ref(); @@ -206,7 +209,7 @@ StagingBufferRef StagingBufferPool::CreateStagingBuffer(size_t size, MemoryUsage .usage = usage, .log2_level = log2, .index = unique_ids++, - .tick = deferred ? std::numeric_limits::max() : scheduler.CurrentTick(), + .tick = deferred ? (std::numeric_limits::max)() : scheduler.CurrentTick(), .deferred = deferred, }); return entry.Ref(); @@ -240,7 +243,7 @@ void StagingBufferPool::ReleaseLevel(StagingBuffersCache& cache, size_t log2) { return scheduler.IsFree(entry.tick); }; const size_t begin_offset = staging.delete_index; - const size_t end_offset = std::min(begin_offset + deletions_per_tick, old_size); + const size_t end_offset = (std::min)(begin_offset + deletions_per_tick, old_size); const auto begin = entries.begin() + begin_offset; const auto end = entries.begin() + end_offset; entries.erase(std::remove_if(begin, end, is_deletable), end); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index a78d2113fb..aef726658a 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -70,7 +70,7 @@ enum : u8 { Last, }; -static_assert(Last <= std::numeric_limits::max()); +static_assert(Last <= (std::numeric_limits::max)()); } // namespace Dirty diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index a002ca83a0..fdd2de2379 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "core/core.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -79,15 +82,15 @@ static VkPresentModeKHR ChooseSwapPresentMode(bool has_imm, bool has_mailbox, } VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, u32 width, u32 height) { - constexpr auto undefined_size{std::numeric_limits::max()}; + constexpr auto undefined_size{(std::numeric_limits::max)()}; if (capabilities.currentExtent.width != undefined_size) { return capabilities.currentExtent; } VkExtent2D extent; - extent.width = std::max(capabilities.minImageExtent.width, - std::min(capabilities.maxImageExtent.width, width)); - extent.height = std::max(capabilities.minImageExtent.height, - std::min(capabilities.maxImageExtent.height, height)); + extent.width = (std::max)(capabilities.minImageExtent.width, + (std::min)(capabilities.maxImageExtent.width, width)); + extent.height = (std::max)(capabilities.minImageExtent.height, + (std::min)(capabilities.maxImageExtent.height, height)); return extent; } @@ -172,7 +175,7 @@ void Swapchain::Create( bool Swapchain::AcquireNextImage() { const VkResult result = device.GetLogical().AcquireNextImageKHR( - *swapchain, std::numeric_limits::max(), *present_semaphores[frame_index], + *swapchain, (std::numeric_limits::max)(), *present_semaphores[frame_index], VK_NULL_HANDLE, &image_index); switch (result) { case VK_SUCCESS: @@ -261,10 +264,10 @@ void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities) { requested_image_count = capabilities.maxImageCount; } else { requested_image_count = - std::max(requested_image_count, std::min(3U, capabilities.maxImageCount)); + (std::max)(requested_image_count, (std::min)(3U, capabilities.maxImageCount)); } } else { - requested_image_count = std::max(requested_image_count, 3U); + requested_image_count = (std::max)(requested_image_count, 3U); } VkSwapchainCreateInfoKHR swapchain_ci{ .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, @@ -348,6 +351,7 @@ void Swapchain::CreateSemaphores() { void Swapchain::Destroy() { frame_index = 0; present_semaphores.clear(); + render_semaphores.clear(); swapchain.reset(); } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index ba58060d20..50a73ea76d 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -509,16 +509,16 @@ TransformBufferCopies(std::span copies, size_t bu } } struct RangedBarrierRange { - u32 min_mip = std::numeric_limits::max(); - u32 max_mip = std::numeric_limits::min(); - u32 min_layer = std::numeric_limits::max(); - u32 max_layer = std::numeric_limits::min(); + u32 min_mip = (std::numeric_limits::max)(); + u32 max_mip = (std::numeric_limits::min)(); + u32 min_layer = (std::numeric_limits::max)(); + u32 max_layer = (std::numeric_limits::min)(); void AddLayers(const VkImageSubresourceLayers& layers) { - min_mip = std::min(min_mip, layers.mipLevel); - max_mip = std::max(max_mip, layers.mipLevel + 1); - min_layer = std::min(min_layer, layers.baseArrayLayer); - max_layer = std::max(max_layer, layers.baseArrayLayer + layers.layerCount); + min_mip = (std::min)(min_mip, layers.mipLevel); + max_mip = (std::max)(max_mip, layers.mipLevel + 1); + min_layer = (std::min)(min_layer, layers.baseArrayLayer); + max_layer = (std::max)(max_layer, layers.baseArrayLayer + layers.layerCount); } VkImageSubresourceRange SubresourceRange(VkImageAspectFlags aspect_mask) const noexcept { @@ -747,8 +747,8 @@ void BlitScale(Scheduler& scheduler, VkImage src_image, VkImage dst_image, const .z = 0, }, { - .x = std::max(1, src_size.x >> level), - .y = std::max(1, src_size.y >> level), + .x = (std::max)(1, src_size.x >> level), + .y = (std::max)(1, src_size.y >> level), .z = 1, }, }, @@ -765,8 +765,8 @@ void BlitScale(Scheduler& scheduler, VkImage src_image, VkImage dst_image, const .z = 0, }, { - .x = std::max(1, dst_size.x >> level), - .y = std::max(1, dst_size.y >> level), + .x = (std::max)(1, dst_size.x >> level), + .y = (std::max)(1, dst_size.y >> level), .z = 1, }, }, @@ -1068,7 +1068,7 @@ void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER, {}, middle_out_barrier); - cmdbuf.CopyBufferToImage(copy_buffer, dst_image, VK_IMAGE_LAYOUT_GENERAL, vk_out_copies); + cmdbuf.CopyBufferToImage(copy_buffer, dst_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_out_copies); cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, {}, {}, post_barriers); }); @@ -1086,8 +1086,8 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst return; } if (aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT && !is_src_msaa && !is_dst_msaa) { - blit_image_helper.BlitColor(dst_framebuffer, src.Handle(Shader::TextureType::Color2D), - dst_region, src_region, filter, operation); + blit_image_helper.BlitColor(dst_framebuffer, src, dst_region, src_region, filter, + operation); return; } ASSERT(src.format == dst.format); @@ -1106,8 +1106,8 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst }(); if (!can_blit_depth_stencil) { UNIMPLEMENTED_IF(is_src_msaa || is_dst_msaa); - blit_image_helper.BlitDepthStencil(dst_framebuffer, src.DepthView(), src.StencilView(), - dst_region, src_region, filter, operation); + blit_image_helper.BlitDepthStencil(dst_framebuffer, src, dst_region, src_region, + filter, operation); return; } } @@ -1377,6 +1377,9 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, // As per the size-compatible formats section of vulkan, copy manually via ReinterpretImage // these images that aren't size-compatible if (BytesPerBlock(src.info.format) != BytesPerBlock(dst.info.format)) { + if (src.info.type == ImageType::Linear || dst.info.type == ImageType::Linear) { + return; + } auto oneCopy = VideoCommon::ImageCopy{ .src_offset = VideoCommon::Offset3D(0, 0, 0), .dst_offset = VideoCommon::Offset3D(0, 0, 0), @@ -1561,10 +1564,10 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, since tropic didn't want to touch it for a long time, so it needs a rewrite from someone better than me at vulkan. */ // CHANGE: Gate the MSAA path more strictly and only use it for color, when the pass and device - // support are available. Avoid running the MSAA path when prerequisites aren't met, preventing - // validation and runtime issues. + // support are available. Avoid running the MSAA path when prerequisites aren't met, + // preventing validation and runtime issues. const bool wants_msaa_upload = info.num_samples > 1 && - aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT && + (aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != 0 && runtime->CanUploadMSAA() && runtime->msaa_copy_pass != nullptr && runtime->device.IsStorageImageMultisampleSupported(); @@ -1574,7 +1577,8 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, temp_info.num_samples = 1; // CHANGE: Build a fresh VkImageCreateInfo with robust usage flags for the temp image. - // Using the target image's usage as-is could miss STORAGE/TRANSFER bits and trigger validation errors. + // Using the target image's usage as-is could miss STORAGE/TRANSFER bits and trigger + // validation errors. VkImageCreateInfo image_ci = MakeImageCreateInfo(runtime->device, temp_info); image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT; @@ -1584,7 +1588,7 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, auto temp_wrapper = std::make_shared(*runtime, temp_info, 0, 0); temp_wrapper->original_image = runtime->memory_allocator.CreateImage(image_ci); temp_wrapper->current_image = &Image::original_image; - temp_wrapper->aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT; + temp_wrapper->aspect_mask = aspect_mask; temp_wrapper->initialized = true; // Upload to the temporary non-MSAA image @@ -1593,18 +1597,17 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, const VkBuffer src_buffer = buffer; const VkImage temp_vk_image = *temp_wrapper->original_image; const VkImageAspectFlags vk_aspect_mask = temp_wrapper->aspect_mask; + scheduler->Record([src_buffer, temp_vk_image, vk_aspect_mask, vk_copies, - // CHANGE: capture shared_ptr to pin lifetime through submission keep = temp_wrapper](vk::CommandBuffer cmdbuf) { CopyBufferToImage(cmdbuf, src_buffer, temp_vk_image, vk_aspect_mask, false, vk_copies); }); // Use MSAACopyPass to convert from non-MSAA to MSAA - // CHANGE: only lifetime and usage were fixed. std::vector image_copies; image_copies.reserve(copies.size()); for (const auto& copy : copies) { - VideoCommon::ImageCopy image_copy; + VideoCommon::ImageCopy image_copy{}; image_copy.src_offset = {0, 0, 0}; // Use zero offset for source image_copy.dst_offset = copy.image_offset; image_copy.src_subresource = copy.image_subresource; @@ -1617,11 +1620,9 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, /*msaa_to_non_msaa=*/false); std::exchange(initialized, true); - // CHANGE: Add a no-op recording that captures temp_wrapper to ensure it stays alive - // at least until commands are submitted/recorded. - scheduler->Record([keep = std::move(temp_wrapper)](vk::CommandBuffer) {}); + const u64 tick = scheduler->Flush(); + scheduler->Wait(tick); - // CHANGE: Restore scaling before returning from the MSAA path. if (is_rescaled) { ScaleUp(); } @@ -1634,10 +1635,11 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, const VkBuffer src_buffer = buffer; const VkImage vk_image = *original_image; const VkImageAspectFlags vk_aspect_mask = aspect_mask; - const bool is_initialized = std::exchange(initialized, true); - scheduler->Record([src_buffer, vk_image, vk_aspect_mask, is_initialized, + const bool was_initialized = std::exchange(initialized, true); + + scheduler->Record([src_buffer, vk_image, vk_aspect_mask, was_initialized, vk_copies](vk::CommandBuffer cmdbuf) { - CopyBufferToImage(cmdbuf, src_buffer, vk_image, vk_aspect_mask, is_initialized, vk_copies); + CopyBufferToImage(cmdbuf, src_buffer, vk_image, vk_aspect_mask, was_initialized, vk_copies); }); if (is_rescaled) { @@ -1956,8 +1958,8 @@ bool Image::BlitScaleHelper(bool scale_up) { .end = {static_cast(dst_width), static_cast(dst_height)}, }; const VkExtent2D extent{ - .width = std::max(scaled_width, info.size.width), - .height = std::max(scaled_height, info.size.height), + .width = (std::max)(scaled_width, info.size.width), + .height = (std::max)(scaled_height, info.size.height), }; auto* view_ptr = blit_view.get(); @@ -1966,18 +1968,17 @@ bool Image::BlitScaleHelper(bool scale_up) { blit_framebuffer = std::make_unique(*runtime, view_ptr, nullptr, extent, scale_up); } - const auto color_view = blit_view->Handle(Shader::TextureType::Color2D); - runtime->blit_image_helper.BlitColor(blit_framebuffer.get(), color_view, dst_region, + runtime->blit_image_helper.BlitColor(blit_framebuffer.get(), *blit_view, dst_region, src_region, operation, BLIT_OPERATION); } else if (aspect_mask == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if (!blit_framebuffer) { blit_framebuffer = std::make_unique(*runtime, nullptr, view_ptr, extent, scale_up); } - runtime->blit_image_helper.BlitDepthStencil(blit_framebuffer.get(), blit_view->DepthView(), - blit_view->StencilView(), dst_region, - src_region, operation, BLIT_OPERATION); + runtime->blit_image_helper.BlitDepthStencil(blit_framebuffer.get(), *blit_view, + dst_region, src_region, operation, + BLIT_OPERATION); } else { // TODO: Use helper blits where applicable flags &= ~ImageFlagBits::Rescaled; @@ -2296,21 +2297,21 @@ void Framebuffer::CreateFramebuffer(TextureCacheRuntime& runtime, is_rescaled = is_rescaled_; const auto& resolution = runtime.resolution; - u32 width = std::numeric_limits::max(); - u32 height = std::numeric_limits::max(); + u32 width = (std::numeric_limits::max)(); + u32 height = (std::numeric_limits::max)(); for (size_t index = 0; index < NUM_RT; ++index) { const ImageView* const color_buffer = color_buffers[index]; if (!color_buffer) { renderpass_key.color_formats[index] = PixelFormat::Invalid; continue; } - width = std::min(width, is_rescaled ? resolution.ScaleUp(color_buffer->size.width) + width = (std::min)(width, is_rescaled ? resolution.ScaleUp(color_buffer->size.width) : color_buffer->size.width); - height = std::min(height, is_rescaled ? resolution.ScaleUp(color_buffer->size.height) + height = (std::min)(height, is_rescaled ? resolution.ScaleUp(color_buffer->size.height) : color_buffer->size.height); attachments.push_back(color_buffer->RenderTarget()); renderpass_key.color_formats[index] = color_buffer->format; - num_layers = std::max(num_layers, color_buffer->range.extent.layers); + num_layers = (std::max)(num_layers, color_buffer->range.extent.layers); images[num_images] = color_buffer->ImageHandle(); image_ranges[num_images] = MakeSubresourceRange(color_buffer); rt_map[index] = num_images; @@ -2319,13 +2320,13 @@ void Framebuffer::CreateFramebuffer(TextureCacheRuntime& runtime, } const size_t num_colors = attachments.size(); if (depth_buffer) { - width = std::min(width, is_rescaled ? resolution.ScaleUp(depth_buffer->size.width) + width = (std::min)(width, is_rescaled ? resolution.ScaleUp(depth_buffer->size.width) : depth_buffer->size.width); - height = std::min(height, is_rescaled ? resolution.ScaleUp(depth_buffer->size.height) + height = (std::min)(height, is_rescaled ? resolution.ScaleUp(depth_buffer->size.height) : depth_buffer->size.height); attachments.push_back(depth_buffer->RenderTarget()); renderpass_key.depth_format = depth_buffer->format; - num_layers = std::max(num_layers, depth_buffer->range.extent.layers); + num_layers = (std::max)(num_layers, depth_buffer->range.extent.layers); images[num_images] = depth_buffer->ImageHandle(); const VkImageSubresourceRange subresource_range = MakeSubresourceRange(depth_buffer); image_ranges[num_images] = subresource_range; @@ -2339,8 +2340,8 @@ void Framebuffer::CreateFramebuffer(TextureCacheRuntime& runtime, renderpass_key.samples = samples; renderpass = runtime.render_pass_cache.Get(renderpass_key); - render_area.width = std::min(render_area.width, width); - render_area.height = std::min(render_area.height, height); + render_area.width = (std::min)(render_area.width, width); + render_area.height = (std::min)(render_area.height, height); num_color_buffers = static_cast(num_colors); framebuffer = runtime.device.GetLogical().CreateFramebuffer({ @@ -2352,7 +2353,7 @@ void Framebuffer::CreateFramebuffer(TextureCacheRuntime& runtime, .pAttachments = attachments.data(), .width = render_area.width, .height = render_area.height, - .layers = static_cast(std::max(num_layers, 1)), + .layers = static_cast((std::max)(num_layers, 1)), }); } diff --git a/src/video_core/renderer_vulkan/vk_turbo_mode.cpp b/src/video_core/renderer_vulkan/vk_turbo_mode.cpp index 04a51f2d1e..54183be12c 100644 --- a/src/video_core/renderer_vulkan/vk_turbo_mode.cpp +++ b/src/video_core/renderer_vulkan/vk_turbo_mode.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -224,7 +227,7 @@ void TurboMode::Run(std::stop_token stop_token) { #endif // Wait for the next graphics queue submission if necessary. std::unique_lock lk{m_submission_lock}; - Common::CondvarWait(m_submission_cv, lk, stop_token, [this] { + m_submission_cv.wait(lk, stop_token, [this] { return (std::chrono::steady_clock::now() - m_submission_time) <= std::chrono::milliseconds{100}; }); diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h index fd9bf2562e..18b5df3bbc 100644 --- a/src/video_core/shader_cache.h +++ b/src/video_core/shader_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ #include #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/control/channel_state_cache.h" #include "video_core/host1x/gpu_device_memory_manager.h" #include "video_core/rasterizer_interface.h" diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index baeb8b23a0..28357bf10b 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,7 +18,7 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "shader_recompiler/environment.h" #include "video_core/engines/kepler_compute.h" #include "video_core/memory_manager.h" @@ -139,8 +142,8 @@ std::array GenericEnvironment::WorkgroupSize() const { } u64 GenericEnvironment::ReadInstruction(u32 address) { - read_lowest = std::min(read_lowest, address); - read_highest = std::max(read_highest, address); + read_lowest = (std::min)(read_lowest, address); + read_highest = (std::max)(read_highest, address); if (address >= cached_lowest && address < cached_highest) { return code[(address - cached_lowest) / INST_SIZE]; @@ -319,7 +322,7 @@ GraphicsEnvironment::GraphicsEnvironment(Tegra::Engines::Maxwell3D& maxwell3d_, break; } const u64 local_size{sph.LocalMemorySize()}; - ASSERT(local_size <= std::numeric_limits::max()); + ASSERT(local_size <= (std::numeric_limits::max)()); local_memory_size = static_cast(local_size) + sph.common3.shader_local_memory_crs_size; texture_bound = maxwell3d->regs.bindless_texture_const_buffer_slot; is_proprietary_driver = texture_bound == 2; diff --git a/src/video_core/shader_environment.h b/src/video_core/shader_environment.h index 6b372e3365..95c2d79277 100644 --- a/src/video_core/shader_environment.h +++ b/src/video_core/shader_environment.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -86,10 +89,10 @@ protected: u32 shared_memory_size{}; std::array workgroup_size{}; - u32 read_lowest = std::numeric_limits::max(); + u32 read_lowest = (std::numeric_limits::max)(); u32 read_highest = 0; - u32 cached_lowest = std::numeric_limits::max(); + u32 cached_lowest = (std::numeric_limits::max)(); u32 cached_highest = 0; u32 initial_offset = 0; diff --git a/src/video_core/texture_cache/decode_bc.cpp b/src/video_core/texture_cache/decode_bc.cpp index a018c6df46..4242cb0fd3 100644 --- a/src/video_core/texture_cache/decode_bc.cpp +++ b/src/video_core/texture_cache/decode_bc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -67,8 +70,8 @@ void DecompressBlocks(std::span input, std::span output, BufferIma const u32 width = copy.image_extent.width; const u32 height = copy.image_extent.height * copy.image_subresource.num_layers; const u32 depth = copy.image_extent.depth; - const u32 block_width = std::min(width, BLOCK_SIZE); - const u32 block_height = std::min(height, BLOCK_SIZE); + const u32 block_width = (std::min)(width, BLOCK_SIZE); + const u32 block_height = (std::min)(height, BLOCK_SIZE); const u32 pitch = width * out_bpp; size_t input_offset = 0; size_t output_offset = 0; diff --git a/src/video_core/texture_cache/formatter.cpp b/src/video_core/texture_cache/formatter.cpp index 2b7e0df72a..6e89864f45 100644 --- a/src/video_core/texture_cache/formatter.cpp +++ b/src/video_core/texture_cache/formatter.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "common/polyfill_ranges.h" +#include #include "video_core/texture_cache/formatter.h" #include "video_core/texture_cache/image_base.h" #include "video_core/texture_cache/image_info.h" @@ -60,25 +63,25 @@ std::string Name(const ImageViewBase& image_view, GPUVAddr addr) { const std::string level = num_levels > 1 ? fmt::format(":{}", num_levels) : ""; switch (image_view.type) { case ImageViewType::e1D: - return fmt::format("ImageView 1D 0x{:X} {}{}", addr, width, level); + return fmt::format("ImageView 1D {:#X} {}{}", addr, width, level); case ImageViewType::e2D: - return fmt::format("ImageView 2D 0x{:X} {}x{}{}", addr, width, height, level); + return fmt::format("ImageView 2D {:#X} {}x{}{}", addr, width, height, level); case ImageViewType::Cube: - return fmt::format("ImageView Cube 0x{:X} {}x{}{}", addr, width, height, level); + return fmt::format("ImageView Cube {:#X} {}x{}{}", addr, width, height, level); case ImageViewType::e3D: - return fmt::format("ImageView 3D 0x{:X} {}x{}x{}{}", addr, width, height, depth, level); + return fmt::format("ImageView 3D {:#X} {}x{}x{}{}", addr, width, height, depth, level); case ImageViewType::e1DArray: - return fmt::format("ImageView 1DArray 0x{:X} {}{}|{}", addr, width, level, num_layers); + return fmt::format("ImageView 1DArray {:#X} {}{}|{}", addr, width, level, num_layers); case ImageViewType::e2DArray: - return fmt::format("ImageView 2DArray 0x{:X} {}x{}{}|{}", addr, width, height, level, + return fmt::format("ImageView 2DArray {:#X} {}x{}{}|{}", addr, width, height, level, num_layers); case ImageViewType::CubeArray: - return fmt::format("ImageView CubeArray 0x{:X} {}x{}{}|{}", addr, width, height, level, + return fmt::format("ImageView CubeArray {:#X} {}x{}{}|{}", addr, width, height, level, num_layers); case ImageViewType::Rect: - return fmt::format("ImageView Rect 0x{:X} {}x{}{}", addr, width, height, level); + return fmt::format("ImageView Rect {:#X} {}x{}{}", addr, width, height, level); case ImageViewType::Buffer: - return fmt::format("BufferView 0x{:X} {}", addr, width); + return fmt::format("BufferView {:#X} {}", addr, width); } return "Invalid"; } diff --git a/src/video_core/texture_cache/image_base.cpp b/src/video_core/texture_cache/image_base.cpp index d79594ce55..077df28fb3 100644 --- a/src/video_core/texture_cache/image_base.cpp +++ b/src/video_core/texture_cache/image_base.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -185,7 +188,7 @@ bool AddImageAlias(ImageBase& lhs, ImageBase& rhs, ImageId lhs_id, ImageId rhs_i const bool is_rhs_compressed = rhs_block.width > 1 || rhs_block.height > 1; const s32 lhs_mips = lhs.info.resources.levels; const s32 rhs_mips = rhs.info.resources.levels; - const s32 num_mips = std::min(lhs_mips - base->level, rhs_mips); + const s32 num_mips = (std::min)(lhs_mips - base->level, rhs_mips); AliasedImage lhs_alias; AliasedImage rhs_alias; lhs_alias.id = rhs_id; @@ -204,9 +207,9 @@ bool AddImageAlias(ImageBase& lhs, ImageBase& rhs, ImageId lhs_id, ImageId rhs_i rhs_size.height = Common::DivCeil(rhs_size.height, rhs_block.height); } const Extent3D copy_size{ - .width = std::min(lhs_size.width, rhs_size.width), - .height = std::min(lhs_size.height, rhs_size.height), - .depth = std::min(lhs_size.depth, rhs_size.depth), + .width = (std::min)(lhs_size.width, rhs_size.width), + .height = (std::min)(lhs_size.height, rhs_size.height), + .depth = (std::min)(lhs_size.depth, rhs_size.depth), }; if (copy_size.width == 0 || copy_size.height == 0) { LOG_WARNING(HW_GPU, "Copy size is smaller than block size. Mip cannot be aliased."); @@ -218,7 +221,7 @@ bool AddImageAlias(ImageBase& lhs, ImageBase& rhs, ImageId lhs_id, ImageId rhs_i const Offset3D rhs_offset{0, 0, is_rhs_3d ? base->layer : 0}; const s32 lhs_layers = is_lhs_3d ? 1 : lhs.info.resources.layers - base->layer; const s32 rhs_layers = is_rhs_3d ? 1 : rhs.info.resources.layers; - const s32 num_layers = std::min(lhs_layers, rhs_layers); + const s32 num_layers = (std::min)(lhs_layers, rhs_layers); const SubresourceLayers lhs_subresource{ .base_level = mip_level, .base_layer = 0, diff --git a/src/video_core/texture_cache/image_view_base.cpp b/src/video_core/texture_cache/image_view_base.cpp index 18b9250f91..b812b61b55 100644 --- a/src/video_core/texture_cache/image_view_base.cpp +++ b/src/video_core/texture_cache/image_view_base.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,9 +21,9 @@ ImageViewBase::ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_i ImageId image_id_, GPUVAddr addr) : image_id{image_id_}, gpu_addr{addr}, format{info.format}, type{info.type}, range{info.range}, size{ - .width = std::max(image_info.size.width >> range.base.level, 1u), - .height = std::max(image_info.size.height >> range.base.level, 1u), - .depth = std::max(image_info.size.depth >> range.base.level, 1u), + .width = (std::max)(image_info.size.width >> range.base.level, 1u), + .height = (std::max)(image_info.size.height >> range.base.level, 1u), + .depth = (std::max)(image_info.size.depth >> range.base.level, 1u), } { ASSERT_MSG(VideoCore::Surface::IsViewCompatible(image_info.format, info.format, false, true), "Image view format {} is incompatible with image format {}", info.format, diff --git a/src/video_core/texture_cache/image_view_info.cpp b/src/video_core/texture_cache/image_view_info.cpp index 0766a3b79a..8dac8383e0 100644 --- a/src/video_core/texture_cache/image_view_info.cpp +++ b/src/video_core/texture_cache/image_view_info.cpp @@ -19,7 +19,7 @@ namespace { using Tegra::Texture::TextureType; -constexpr u8 RENDER_TARGET_SWIZZLE = std::numeric_limits::max(); +constexpr u8 RENDER_TARGET_SWIZZLE = (std::numeric_limits::max)(); [[nodiscard]] u8 CastSwizzle(SwizzleSource source) { const u8 casted = static_cast(source); diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 6c733fe902..e5d559b591 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -56,14 +56,14 @@ TextureCache

::TextureCache(Runtime& runtime_, Tegra::MaxwellDeviceMemoryManag const s64 device_local_memory = static_cast(runtime.GetDeviceLocalMemory()); const s64 min_spacing_expected = device_local_memory - 1_GiB; const s64 min_spacing_critical = device_local_memory - 512_MiB; - const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD); + const s64 mem_threshold = (std::min)(device_local_memory, TARGET_THRESHOLD); const s64 min_vacancy_expected = (6 * mem_threshold) / 10; const s64 min_vacancy_critical = (2 * mem_threshold) / 10; expected_memory = static_cast( - std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected), + (std::max)((std::min)(device_local_memory - min_vacancy_expected, min_spacing_expected), DEFAULT_EXPECTED_MEMORY)); critical_memory = static_cast( - std::max(std::min(device_local_memory - min_vacancy_critical, min_spacing_critical), + (std::max)((std::min)(device_local_memory - min_vacancy_critical, min_spacing_critical), DEFAULT_CRITICAL_MEMORY)); minimum_memory = static_cast((device_local_memory - mem_threshold) / 2); } else { @@ -586,8 +586,8 @@ std::optional TextureCache

::GetFlushArea(D area->end_address = cpu_addr + size; area->preemtive = true; } - area->start_address = std::min(area->start_address, image.cpu_addr); - area->end_address = std::max(area->end_address, image.cpu_addr_end); + area->start_address = (std::min)(area->start_address, image.cpu_addr); + area->end_address = (std::max)(area->end_address, image.cpu_addr_end); for (auto image_view_id : image.image_view_ids) { auto& image_view = slot_image_views[image_view_id]; image_view.flags |= ImageViewFlagBits::PreemtiveDownload; @@ -1273,7 +1273,7 @@ u64 TextureCache

::GetScaledImageSizeBytes(const ImageBase& image) { const u64 down_shift = static_cast(Settings::values.resolution_info.down_shift + Settings::values.resolution_info.down_shift); const u64 image_size_bytes = - static_cast(std::max(image.guest_size_bytes, image.unswizzled_size_bytes)); + static_cast((std::max)(image.guest_size_bytes, image.unswizzled_size_bytes)); const u64 tentative_size = (image_size_bytes * scale_up) >> down_shift; const u64 fitted_size = Common::AlignUp(tentative_size, 1024); return fitted_size; @@ -1994,7 +1994,7 @@ void TextureCache

::RegisterImage(ImageId image_id) { ASSERT_MSG(False(image.flags & ImageFlagBits::Registered), "Trying to register an already registered image"); image.flags |= ImageFlagBits::Registered; - u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); + u64 tentative_size = (std::max)(image.guest_size_bytes, image.unswizzled_size_bytes); if ((IsPixelFormatASTC(image.info.format) && True(image.flags & ImageFlagBits::AcceleratedUpload)) || True(image.flags & ImageFlagBits::Converted)) { @@ -2168,7 +2168,7 @@ void TextureCache

::DeleteImage(ImageId image_id, bool immediate_delete) { if (image.HasScaled()) { total_used_memory -= GetScaledImageSizeBytes(image); } - u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); + u64 tentative_size = (std::max)(image.guest_size_bytes, image.unswizzled_size_bytes); if ((IsPixelFormatASTC(image.info.format) && True(image.flags & ImageFlagBits::AcceleratedUpload)) || True(image.flags & ImageFlagBits::Converted)) { @@ -2302,7 +2302,7 @@ void TextureCache

::SynchronizeAliases(ImageId image_id) { for (const AliasedImage& aliased : image.aliased_images) { ImageBase& aliased_image = slot_images[aliased.id]; if (image.modification_tick < aliased_image.modification_tick) { - most_recent_tick = std::max(most_recent_tick, aliased_image.modification_tick); + most_recent_tick = (std::max)(most_recent_tick, aliased_image.modification_tick); aliased_images.push_back(&aliased); any_rescaled |= True(aliased_image.flags & ImageFlagBits::Rescaled); any_modified |= True(aliased_image.flags & ImageFlagBits::GpuModified); @@ -2443,9 +2443,9 @@ void TextureCache

::CopyImage(ImageId dst_id, ImageId src_id, std::vector #include "common/scratch_buffer.h" #include "common/slot_vector.h" #include "common/thread_worker.h" @@ -108,9 +108,14 @@ class TextureCache : public VideoCommon::ChannelSetupCaches::max()}; + static constexpr size_t UNSET_CHANNEL{(std::numeric_limits::max)()}; +#ifdef YUZU_LEGACY + static constexpr s64 TARGET_THRESHOLD = 3_GiB; +#else static constexpr s64 TARGET_THRESHOLD = 4_GiB; +#endif + static constexpr s64 DEFAULT_EXPECTED_MEMORY = 1_GiB + 125_MiB; static constexpr s64 DEFAULT_CRITICAL_MEMORY = 1_GiB + 625_MiB; static constexpr size_t GC_EMERGENCY_COUNTS = 2; @@ -479,7 +484,11 @@ private: }; Common::LeastRecentlyUsedCache lru_cache; + #ifdef YUZU_LEGACY + static constexpr size_t TICKS_TO_DESTROY = 6; + #else static constexpr size_t TICKS_TO_DESTROY = 8; +#endif DelayedDestructionRing sentenced_images; DelayedDestructionRing sentenced_image_view; DelayedDestructionRing sentenced_framebuffers; diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index e3faa5bf95..ede451b166 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp @@ -327,8 +327,8 @@ template } const SubresourceExtent resources = new_info.resources; return SubresourceExtent{ - .levels = std::max(resources.levels, info.resources.levels), - .layers = std::max(resources.layers, info.resources.layers), + .levels = (std::max)(resources.levels, info.resources.levels), + .layers = (std::max)(resources.layers, info.resources.layers), }; } @@ -354,7 +354,7 @@ template return std::nullopt; } return SubresourceExtent{ - .levels = std::max(new_info.resources.levels, info.resources.levels + base.level), + .levels = (std::max)(new_info.resources.levels, info.resources.levels + base.level), .layers = 1, }; } @@ -388,8 +388,8 @@ template return std::nullopt; } return SubresourceExtent{ - .levels = std::max(new_info.resources.levels, info.resources.levels + base.level), - .layers = std::max(new_info.resources.layers, info.resources.layers + base.layer), + .levels = (std::max)(new_info.resources.levels, info.resources.levels + base.level), + .layers = (std::max)(new_info.resources.layers, info.resources.layers + base.layer), }; } @@ -439,14 +439,14 @@ template } layers = 1; } else { - layers = std::max(resources.layers, info.resources.layers + base->layer); + layers = (std::max)(resources.layers, info.resources.layers + base->layer); } return OverlapResult{ .gpu_addr = overlap.gpu_addr, .cpu_addr = overlap.cpu_addr, .resources = { - .levels = std::max(resources.levels + base->level, info.resources.levels), + .levels = (std::max)(resources.levels + base->level, info.resources.levels), .layers = layers, }, }; diff --git a/src/video_core/textures/astc.cpp b/src/video_core/textures/astc.cpp index fef0be31d8..b7b5f5bd4a 100644 --- a/src/video_core/textures/astc.cpp +++ b/src/video_core/textures/astc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 The University of North Carolina at Chapel Hill // SPDX-License-Identifier: Apache-2.0 @@ -15,7 +18,7 @@ #include "common/alignment.h" #include "common/common_types.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/textures/astc.h" #include "video_core/textures/workers.h" @@ -1291,7 +1294,7 @@ static void ComputeEndpoints(Pixel& ep1, Pixel& ep2, const u32*& colorValues, case 1: { READ_UINT_VALUES(2) u32 L0 = (v[0] >> 2) | (v[1] & 0xC0); - u32 L1 = std::min(L0 + (v[1] & 0x3F), 0xFFU); + u32 L1 = (std::min)(L0 + (v[1] & 0x3F), 0xFFU); ep1 = Pixel(0xFF, L0, L0, L0); ep2 = Pixel(0xFF, L1, L1, L1); } break; @@ -1522,7 +1525,7 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, // Read color data... u32 colorDataBits = remainingBits; while (remainingBits > 0) { - u32 nb = std::min(remainingBits, 8); + u32 nb = (std::min)(remainingBits, 8); u32 b = strm.ReadBits(nb); colorEndpointStream.WriteBits(b, nb); remainingBits -= 8; @@ -1603,7 +1606,7 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, texelWeightData[clearByteStart - 1] &= static_cast((1 << (weightParams.GetPackedBitSize() % 8)) - 1); std::memset(texelWeightData.data() + clearByteStart, 0, - std::min(16U - clearByteStart, 16U)); + (std::min)(16U - clearByteStart, 16U)); } IntegerEncodedVector texelWeightValues; @@ -1674,8 +1677,8 @@ void Decompress(std::span data, uint32_t width, uint32_t height, std::array uncompData; DecompressBlock(blockPtr, block_width, block_height, uncompData); - u32 decompWidth = std::min(block_width, width - x); - u32 decompHeight = std::min(block_height, height - y); + u32 decompWidth = (std::min)(block_width, width - x); + u32 decompHeight = (std::min)(block_height, height - y); const std::span outRow = output.subspan(depth_offset + (y * width + x) * 4); for (u32 h = 0; h < decompHeight; ++h) { diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp index 95bcdd37b2..25b0860b0f 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -111,13 +114,13 @@ void SwizzleSubrectImpl(std::span output, std::span input, u32 wid const u32 x_shift = GOB_SIZE_SHIFT + block_height + block_depth; u32 unprocessed_lines = num_lines; - u32 extent_y = std::min(num_lines, height - origin_y); + u32 extent_y = (std::min)(num_lines, height - origin_y); for (u32 slice = 0; slice < depth; ++slice) { const u32 z = slice + origin_z; const u32 offset_z = (z >> block_depth) * slice_size + ((z & block_depth_mask) << (GOB_SIZE_SHIFT + block_height)); - const u32 lines_in_y = std::min(unprocessed_lines, extent_y); + const u32 lines_in_y = (std::min)(unprocessed_lines, extent_y); for (u32 line = 0; line < lines_in_y; ++line) { const u32 y = line + origin_y; const u32 swizzled_y = pdep(y); @@ -180,7 +183,7 @@ void UnswizzleTexture(std::span output, std::span input, u32 bytes u32 width, u32 height, u32 depth, u32 block_height, u32 block_depth, u32 stride_alignment) { const u32 stride = Common::AlignUpLog2(width, stride_alignment) * bytes_per_pixel; - const u32 new_bpp = std::min(4U, static_cast(std::countr_zero(width * bytes_per_pixel))); + const u32 new_bpp = (std::min)(4U, static_cast(std::countr_zero(width * bytes_per_pixel))); width = (width * bytes_per_pixel) >> new_bpp; bytes_per_pixel = 1U << new_bpp; Swizzle(output, input, bytes_per_pixel, width, height, depth, block_height, block_depth, @@ -191,7 +194,7 @@ void SwizzleTexture(std::span output, std::span input, u32 bytes_p u32 height, u32 depth, u32 block_height, u32 block_depth, u32 stride_alignment) { const u32 stride = Common::AlignUpLog2(width, stride_alignment) * bytes_per_pixel; - const u32 new_bpp = std::min(4U, static_cast(std::countr_zero(width * bytes_per_pixel))); + const u32 new_bpp = (std::min)(4U, static_cast(std::countr_zero(width * bytes_per_pixel))); width = (width * bytes_per_pixel) >> new_bpp; bytes_per_pixel = 1U << new_bpp; Swizzle(output, input, bytes_per_pixel, width, height, depth, block_height, block_depth, diff --git a/src/video_core/textures/texture.cpp b/src/video_core/textures/texture.cpp index 39c08b5ae1..b51441bdfe 100644 --- a/src/video_core/textures/texture.cpp +++ b/src/video_core/textures/texture.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -75,7 +78,7 @@ float TSCEntry::MaxAnisotropy() const noexcept { if (anisotropic_settings == Settings::AnisotropyMode::Automatic) { added_anisotropic = Settings::values.resolution_info.up_scale >> Settings::values.resolution_info.down_shift; - added_anisotropic = std::max(added_anisotropic - 1, 0); + added_anisotropic = (std::max)(added_anisotropic - 1, 0); } else { added_anisotropic = static_cast(Settings::values.max_anisotropy.GetValue()) - 1U; } diff --git a/src/video_core/textures/workers.cpp b/src/video_core/textures/workers.cpp index a71c305f49..780e0c4da9 100644 --- a/src/video_core/textures/workers.cpp +++ b/src/video_core/textures/workers.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ namespace Tegra::Texture { Common::ThreadWorker& GetThreadWorkers() { - static Common::ThreadWorker workers{std::max(std::thread::hardware_concurrency(), 2U) / 2, + static Common::ThreadWorker workers{(std::max)(std::thread::hardware_concurrency(), 2U) / 2, "ImageTranscode"}; return workers; diff --git a/src/video_core/transform_feedback.cpp b/src/video_core/transform_feedback.cpp index 1f353d2df0..a8f9da9853 100644 --- a/src/video_core/transform_feedback.cpp +++ b/src/video_core/transform_feedback.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include "common/alignment.h" #include "common/assert.h" -#include "common/polyfill_ranges.h" +#include #include "shader_recompiler/shader_info.h" #include "video_core/transform_feedback.h" @@ -104,8 +107,8 @@ std::pair, u32> MakeTransformF } } xfb[attribute] = varying; - count = std::max(count, attribute); - highest = std::max(highest, (base_offset + varying.components) * 4); + count = (std::max)(count, attribute); + highest = (std::max)(highest, (base_offset + varying.components) * 4); } UNIMPLEMENTED_IF(highest != layout.stride); } diff --git a/src/video_core/vulkan_common/vma.h b/src/video_core/vulkan_common/vma.h index 6e25aa1bdf..e022b2bf7d 100644 --- a/src/video_core/vulkan_common/vma.h +++ b/src/video_core/vulkan_common/vma.h @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,4 +10,12 @@ #define VMA_STATIC_VULKAN_FUNCTIONS 0 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 -#include +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4189 ) +#endif +#include "vk_mem_alloc.h" + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 6bd6eab009..0e0bec2ce3 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -15,7 +15,7 @@ #include "common/assert.h" #include "common/literals.h" -#include "common/polyfill_ranges.h" +#include #include "common/settings.h" #include "video_core/vulkan_common/nsight_aftermath_tracker.h" #include "video_core/vulkan_common/vma.h" @@ -699,9 +699,9 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR LOG_WARNING(Render_Vulkan, "MVK driver breaks when using more than 16 vertex attributes/bindings"); properties.properties.limits.maxVertexInputAttributes = - std::min(properties.properties.limits.maxVertexInputAttributes, 16U); + (std::min)(properties.properties.limits.maxVertexInputAttributes, 16U); properties.properties.limits.maxVertexInputBindings = - std::min(properties.properties.limits.maxVertexInputBindings, 16U); + (std::min)(properties.properties.limits.maxVertexInputBindings, 16U); } if (is_turnip) { @@ -725,6 +725,11 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR dynamic_state3_enables = true; } + if (is_mvk && Settings::values.dyna_state.GetValue() != 0) { + LOG_WARNING(Render_Vulkan, "MoltenVK detected: Forcing dynamic state to 0 to prevent black screen issues"); + Settings::values.dyna_state.SetValue(0); + } + if (Settings::values.dyna_state.GetValue() == 0) { must_emulate_scaled_formats = true; LOG_INFO(Render_Vulkan, "Dynamic state is disabled (dyna_state = 0), forcing scaled format emulation ON"); @@ -753,18 +758,24 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR functions.vkGetInstanceProcAddr = dld.vkGetInstanceProcAddr; functions.vkGetDeviceProcAddr = dld.vkGetDeviceProcAddr; - const VmaAllocatorCreateInfo allocator_info = { - .flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT, - .physicalDevice = physical, - .device = *logical, - .preferredLargeHeapBlockSize = 0, - .pAllocationCallbacks = nullptr, - .pDeviceMemoryCallbacks = nullptr, - .pHeapSizeLimit = nullptr, - .pVulkanFunctions = &functions, - .instance = instance, - .vulkanApiVersion = VK_API_VERSION_1_1, - .pTypeExternalMemoryHandleTypes = nullptr, + VmaAllocatorCreateFlags flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT; + if (extensions.memory_budget) { + flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT; + } + const VmaAllocatorCreateInfo allocator_info{ + .flags = flags, + .physicalDevice = physical, + .device = *logical, + .preferredLargeHeapBlockSize = is_integrated + ? (64u * 1024u * 1024u) + : (256u * 1024u * 1024u), + .pAllocationCallbacks = nullptr, + .pDeviceMemoryCallbacks = nullptr, + .pHeapSizeLimit = nullptr, + .pVulkanFunctions = &functions, + .instance = instance, + .vulkanApiVersion = ApiVersion(), + .pTypeExternalMemoryHandleTypes = nullptr, }; vk::Check(vmaCreateAllocator(&allocator_info, &allocator)); @@ -1090,8 +1101,15 @@ bool Device::GetSuitability(bool requires_swapchain) { // Some features are mandatory. Check those. #define CHECK_FEATURE(feature, name) \ if (!features.feature.name) { \ - LOG_ERROR(Render_Vulkan, "Missing required feature {}", #name); \ - suitable = false; \ + if (IsMoltenVK() && (strcmp(#name, "geometryShader") == 0 || \ + strcmp(#name, "logicOp") == 0 || \ + strcmp(#name, "shaderCullDistance") == 0 || \ + strcmp(#name, "wideLines") == 0)) { \ + LOG_INFO(Render_Vulkan, "MoltenVK missing feature {} - using fallback", #name); \ + } else { \ + LOG_ERROR(Render_Vulkan, "Missing required feature {}", #name); \ + suitable = false; \ + } \ } #define LOG_FEATURE(feature, name) \ @@ -1377,23 +1395,20 @@ void Device::CollectPhysicalMemoryInfo() { } device_access_memory += mem_properties.memoryHeaps[element].size; } - if (!is_integrated) { + if (is_integrated) { + const s64 available_memory = static_cast(device_access_memory - device_initial_usage); + const u64 memory_size = Settings::values.vram_usage_mode.GetValue() == Settings::VramUsageMode::Aggressive ? 6_GiB : 4_GiB; + device_access_memory = static_cast(std::max(std::min(available_memory - 8_GiB, memory_size), std::min(local_memory, memory_size))); + } else { const u64 reserve_memory = std::min(device_access_memory / 8, 1_GiB); device_access_memory -= reserve_memory; - if (Settings::values.vram_usage_mode.GetValue() != Settings::VramUsageMode::Aggressive) { // Account for resolution scaling in memory limits const size_t normal_memory = 6_GiB; const size_t scaler_memory = 1_GiB * Settings::values.resolution_info.ScaleUp(1); - device_access_memory = - std::min(device_access_memory, normal_memory + scaler_memory); + device_access_memory = std::min(device_access_memory, normal_memory + scaler_memory); } - - return; } - const s64 available_memory = static_cast(device_access_memory - device_initial_usage); - device_access_memory = static_cast(std::max( - std::min(available_memory - 8_GiB, 4_GiB), std::min(local_memory, 4_GiB))); } void Device::CollectToolingInfo() { diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 9b78f2e599..cb13f28523 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -89,7 +89,8 @@ VK_DEFINE_HANDLE(VmaAllocator) EXTENSION(NV, VIEWPORT_ARRAY2, viewport_array2) \ EXTENSION(NV, VIEWPORT_SWIZZLE, viewport_swizzle) \ EXTENSION(EXT, DESCRIPTOR_INDEXING, descriptor_indexing) \ - EXTENSION(EXT, FILTER_CUBIC, filter_cubic) + EXTENSION(EXT, FILTER_CUBIC, filter_cubic) \ + EXTENSION(QCOM, FILTER_CUBIC_WEIGHTS, filter_cubic_weights) // Define extensions which must be supported. #define FOR_EACH_VK_MANDATORY_EXTENSION(EXTENSION_NAME) \ @@ -558,6 +559,11 @@ public: return extensions.filter_cubic; } + /// Returns true if the device supports VK_QCOM_filter_cubic_weights + bool IsQcomFilterCubicWeightsSupported() const { + return extensions.filter_cubic_weights; + } + /// Returns true if the device supports VK_EXT_line_rasterization. bool IsExtLineRasterizationSupported() const { return extensions.line_rasterization; @@ -717,6 +723,10 @@ public: return properties.driver.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY; } + bool IsMoltenVK() const noexcept { + return properties.driver.driverID == VK_DRIVER_ID_MOLTENVK; + } + NvidiaArchitecture GetNvidiaArch() const noexcept { return nvidia_arch; } diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index 180657a75a..1948e0030a 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "common/common_types.h" #include "common/dynamic_library.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "core/frontend/emu_window.h" #include "video_core/vulkan_common/vulkan_instance.h" #include "video_core/vulkan_common/vulkan_wrapper.h" diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp index 4c92d4bfa0..4cd3442d97 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp @@ -6,7 +6,10 @@ #include #include +#include #include +#include +#include #include #include "common/alignment.h" @@ -14,465 +17,314 @@ #include "common/common_types.h" #include "common/literals.h" #include "common/logging/log.h" -#include "common/polyfill_ranges.h" +#include #include "video_core/vulkan_common/vma.h" #include "video_core/vulkan_common/vulkan_device.h" #include "video_core/vulkan_common/vulkan_memory_allocator.h" #include "video_core/vulkan_common/vulkan_wrapper.h" namespace Vulkan { -namespace { -struct Range { - u64 begin; - u64 end; + namespace { - [[nodiscard]] bool Contains(u64 iterator, u64 size) const noexcept { - return iterator < end && begin < iterator + size; - } -}; +// Helpers translating MemoryUsage to flags/usage -[[nodiscard]] u64 AllocationChunkSize(u64 required_size) { - static constexpr std::array sizes{ - 0x1000ULL << 10, 0x1400ULL << 10, 0x1800ULL << 10, 0x1c00ULL << 10, 0x2000ULL << 10, - 0x3200ULL << 10, 0x4000ULL << 10, 0x6000ULL << 10, 0x8000ULL << 10, 0xA000ULL << 10, - 0x10000ULL << 10, 0x18000ULL << 10, 0x20000ULL << 10, - }; - static_assert(std::is_sorted(sizes.begin(), sizes.end())); - - const auto it = std::ranges::lower_bound(sizes, required_size); - return it != sizes.end() ? *it : Common::AlignUp(required_size, 4ULL << 20); -} - -[[nodiscard]] VkMemoryPropertyFlags MemoryUsagePropertyFlags(MemoryUsage usage) { - switch (usage) { - case MemoryUsage::DeviceLocal: - return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - case MemoryUsage::Upload: - return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - case MemoryUsage::Download: - return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | - VK_MEMORY_PROPERTY_HOST_CACHED_BIT; - case MemoryUsage::Stream: - return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - } - ASSERT_MSG(false, "Invalid memory usage={}", usage); - return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; -} - -[[nodiscard]] VkMemoryPropertyFlags MemoryUsagePreferredVmaFlags(MemoryUsage usage) { - return usage != MemoryUsage::DeviceLocal ? VK_MEMORY_PROPERTY_HOST_COHERENT_BIT - : VkMemoryPropertyFlagBits{}; -} - -[[nodiscard]] VmaAllocationCreateFlags MemoryUsageVmaFlags(MemoryUsage usage) { - switch (usage) { - case MemoryUsage::Upload: - case MemoryUsage::Stream: - return VMA_ALLOCATION_CREATE_MAPPED_BIT | - VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; - case MemoryUsage::Download: - return VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; - case MemoryUsage::DeviceLocal: - return {}; - } - return {}; -} - -[[nodiscard]] VmaMemoryUsage MemoryUsageVma(MemoryUsage usage) { - switch (usage) { - case MemoryUsage::DeviceLocal: - case MemoryUsage::Stream: - return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; - case MemoryUsage::Upload: - case MemoryUsage::Download: - return VMA_MEMORY_USAGE_AUTO_PREFER_HOST; - } - return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; -} - -} // Anonymous namespace - -class MemoryAllocation { -public: - explicit MemoryAllocation(MemoryAllocator* const allocator_, vk::DeviceMemory memory_, - VkMemoryPropertyFlags properties, u64 allocation_size_, u32 type) - : allocator{allocator_}, memory{std::move(memory_)}, allocation_size{allocation_size_}, - property_flags{properties}, shifted_memory_type{1U << type} {} - - MemoryAllocation& operator=(const MemoryAllocation&) = delete; - MemoryAllocation(const MemoryAllocation&) = delete; - - MemoryAllocation& operator=(MemoryAllocation&&) = delete; - MemoryAllocation(MemoryAllocation&&) = delete; - - [[nodiscard]] std::optional Commit(VkDeviceSize size, VkDeviceSize alignment) { - const std::optional alloc = FindFreeRegion(size, alignment); - if (!alloc) { - // Signal out of memory, it'll try to do more allocations. - return std::nullopt; - } - const Range range{ - .begin = *alloc, - .end = *alloc + size, - }; - commits.insert(std::ranges::upper_bound(commits, *alloc, {}, &Range::begin), range); - return std::make_optional(this, *memory, *alloc, *alloc + size); - } - - void Free(u64 begin) { - const auto it = std::ranges::find(commits, begin, &Range::begin); - ASSERT_MSG(it != commits.end(), "Invalid commit"); - commits.erase(it); - if (commits.empty()) { - // Do not call any code involving 'this' after this call, the object will be destroyed - allocator->ReleaseMemory(this); - } - } - - [[nodiscard]] std::span Map() { - if (memory_mapped_span.empty()) { - u8* const raw_pointer = memory.Map(0, allocation_size); - memory_mapped_span = std::span(raw_pointer, allocation_size); - } - return memory_mapped_span; - } - - /// Returns whether this allocation is compatible with the arguments. - [[nodiscard]] bool IsCompatible(VkMemoryPropertyFlags flags, u32 type_mask) const { - return (flags & property_flags) == flags && (type_mask & shifted_memory_type) != 0; - } - - [[nodiscard]] bool IsEmpty() const noexcept { - return commits.empty(); - } - -private: - [[nodiscard]] static constexpr u32 ShiftType(u32 type) { - return 1U << type; - } - - [[nodiscard]] std::optional FindFreeRegion(u64 size, u64 alignment) noexcept { - ASSERT(std::has_single_bit(alignment)); - const u64 alignment_log2 = std::countr_zero(alignment); - std::optional candidate; - u64 iterator = 0; - auto commit = commits.begin(); - while (iterator + size <= allocation_size) { - candidate = candidate.value_or(iterator); - if (commit == commits.end()) { - break; + [[maybe_unused]] VkMemoryPropertyFlags MemoryUsagePropertyFlags(MemoryUsage usage) { + switch (usage) { + case MemoryUsage::DeviceLocal: + return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + case MemoryUsage::Upload: + return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + case MemoryUsage::Download: + return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | + VK_MEMORY_PROPERTY_HOST_CACHED_BIT; + case MemoryUsage::Stream: + return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; } - if (commit->Contains(*candidate, size)) { - candidate = std::nullopt; + ASSERT_MSG(false, "Invalid memory usage={}", usage); + return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + } + + [[nodiscard]] VkMemoryPropertyFlags MemoryUsagePreferredVmaFlags(MemoryUsage usage) { + if (usage == MemoryUsage::Download) { + return VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; } - iterator = Common::AlignUpLog2(commit->end, alignment_log2); - ++commit; + return usage != MemoryUsage::DeviceLocal ? VK_MEMORY_PROPERTY_HOST_COHERENT_BIT + : VkMemoryPropertyFlagBits{}; } - return candidate; - } - MemoryAllocator* const allocator; ///< Parent memory allocation. - const vk::DeviceMemory memory; ///< Vulkan memory allocation handler. - const u64 allocation_size; ///< Size of this allocation. - const VkMemoryPropertyFlags property_flags; ///< Vulkan memory property flags. - const u32 shifted_memory_type; ///< Shifted Vulkan memory type. - std::vector commits; ///< All commit ranges done from this allocation. - std::span memory_mapped_span; ///< Memory mapped span. Empty if not queried before. -}; - -MemoryCommit::MemoryCommit(MemoryAllocation* allocation_, VkDeviceMemory memory_, u64 begin_, - u64 end_) noexcept - : allocation{allocation_}, memory{memory_}, begin{begin_}, end{end_} {} - -MemoryCommit::~MemoryCommit() { - Release(); -} - -MemoryCommit& MemoryCommit::operator=(MemoryCommit&& rhs) noexcept { - Release(); - allocation = std::exchange(rhs.allocation, nullptr); - memory = rhs.memory; - begin = rhs.begin; - end = rhs.end; - span = std::exchange(rhs.span, std::span{}); - return *this; -} - -MemoryCommit::MemoryCommit(MemoryCommit&& rhs) noexcept - : allocation{std::exchange(rhs.allocation, nullptr)}, memory{rhs.memory}, begin{rhs.begin}, - end{rhs.end}, span{std::exchange(rhs.span, std::span{})} {} - -std::span MemoryCommit::Map() { - if (span.empty()) { - span = allocation->Map().subspan(begin, end - begin); - } - return span; -} - -void MemoryCommit::Release() { - if (allocation) { - allocation->Free(begin); - } -} - -MemoryAllocator::MemoryAllocator(const Device& device_) - : device{device_}, allocator{device.GetAllocator()}, - properties{device_.GetPhysical().GetMemoryProperties().memoryProperties}, - buffer_image_granularity{ - device_.GetPhysical().GetProperties().limits.bufferImageGranularity} { - // GPUs not supporting rebar may only have a region with less than 256MB host visible/device - // local memory. In that case, opening 2 RenderDoc captures side-by-side is not possible due to - // the heap running out of memory. With RenderDoc attached and only a small host/device region, - // only allow the stream buffer in this memory heap. - if (device.HasDebuggingToolAttached()) { - using namespace Common::Literals; - ForEachDeviceLocalHostVisibleHeap(device, [this](size_t index, VkMemoryHeap& heap) { - if (heap.size <= 256_MiB) { - valid_memory_types &= ~(1u << index); + [[nodiscard]] VmaAllocationCreateFlags MemoryUsageVmaFlags(MemoryUsage usage) { + switch (usage) { + case MemoryUsage::Upload: + case MemoryUsage::Stream: + return VMA_ALLOCATION_CREATE_MAPPED_BIT | + VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; + case MemoryUsage::Download: + return VMA_ALLOCATION_CREATE_MAPPED_BIT | + VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; + case MemoryUsage::DeviceLocal: + return {}; } - }); - } -} - -MemoryAllocator::~MemoryAllocator() = default; - -vk::Image MemoryAllocator::CreateImage(const VkImageCreateInfo& ci) const { - const VmaAllocationCreateInfo alloc_ci = { - .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT, - .usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, - .requiredFlags = 0, - .preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - .memoryTypeBits = 0, - .pool = VK_NULL_HANDLE, - .pUserData = nullptr, - .priority = 0.f, - }; - - VkImage handle{}; - VmaAllocation allocation{}; - - vk::Check(vmaCreateImage(allocator, &ci, &alloc_ci, &handle, &allocation, nullptr)); - - return vk::Image(handle, ci.usage, *device.GetLogical(), allocator, allocation, - device.GetDispatchLoader()); -} - -vk::Buffer MemoryAllocator::CreateBuffer(const VkBufferCreateInfo& ci, MemoryUsage usage) const { - const VmaAllocationCreateInfo alloc_ci = { - .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage), - .usage = MemoryUsageVma(usage), - .requiredFlags = 0, - .preferredFlags = MemoryUsagePreferredVmaFlags(usage), - .memoryTypeBits = usage == MemoryUsage::Stream ? 0u : valid_memory_types, - .pool = VK_NULL_HANDLE, - .pUserData = nullptr, - .priority = 0.f, - }; - - VkBuffer handle{}; - VmaAllocationInfo alloc_info{}; - VmaAllocation allocation{}; - VkMemoryPropertyFlags property_flags{}; - - vk::Check(vmaCreateBuffer(allocator, &ci, &alloc_ci, &handle, &allocation, &alloc_info)); - vmaGetAllocationMemoryProperties(allocator, allocation, &property_flags); - - u8* data = reinterpret_cast(alloc_info.pMappedData); - const std::span mapped_data = data ? std::span{data, ci.size} : std::span{}; - const bool is_coherent = property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - - return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, is_coherent, - device.GetDispatchLoader()); -} - -MemoryCommit MemoryAllocator::Commit(const VkMemoryRequirements& requirements, MemoryUsage usage) { - // Find the fastest memory flags we can afford with the current requirements - const u32 type_mask = requirements.memoryTypeBits; - const VkMemoryPropertyFlags usage_flags = MemoryUsagePropertyFlags(usage); - const VkMemoryPropertyFlags flags = MemoryPropertyFlags(type_mask, usage_flags); - if (std::optional commit = TryCommit(requirements, flags)) { - return std::move(*commit); - } - - // Commit has failed, try progressive fallback strategy - u64 chunk_size = AllocationChunkSize(requirements.size); - const u64 minimum_size = std::max(requirements.size, 4ULL << 20); // 4MB minimum - - // try 1: Try allocating with original chunk size - if (TryAllocMemory(flags, type_mask, chunk_size)) { - return TryCommit(requirements, flags).value(); - } - - // try 2: Clean up empty allocations and try again - bool cleaned_up = false; - for (auto it = allocations.begin(); it != allocations.end();) { - if ((*it)->IsEmpty()) { - it = allocations.erase(it); - cleaned_up = true; - } else { - ++it; - } - } - - if (cleaned_up && TryAllocMemory(flags, type_mask, chunk_size)) { - LOG_INFO(Render_Vulkan, "Memory allocation succeeded after cleanup"); - return TryCommit(requirements, flags).value(); - } - - // try 3: Progressive size reduction with cleanup between attempts - while (chunk_size > minimum_size) { - chunk_size >>= 1; // Halve the chunk size - chunk_size = std::max(chunk_size, minimum_size); - - if (TryAllocMemory(flags, type_mask, chunk_size)) { - LOG_WARNING(Render_Vulkan, "Memory allocation succeeded with reduced chunk size: {} MB", - chunk_size >> 20); - return TryCommit(requirements, flags).value(); + return {}; } - // Clean up again between size reduction attempts - for (auto it = allocations.begin(); it != allocations.end();) { - if ((*it)->IsEmpty()) { - it = allocations.erase(it); + [[nodiscard]] VmaMemoryUsage MemoryUsageVma(MemoryUsage usage) { + switch (usage) { + case MemoryUsage::DeviceLocal: + case MemoryUsage::Stream: + return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + case MemoryUsage::Upload: + case MemoryUsage::Download: + return VMA_MEMORY_USAGE_AUTO_PREFER_HOST; + } + return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + } + + +// This avoids calling vkGetBufferMemoryRequirements* directly. + template + static VkBuffer GetVkHandleFromBuffer(const T &buf) { + if constexpr (requires { static_cast(buf); }) { + return static_cast(buf); + } else if constexpr (requires {{ buf.GetHandle() } -> std::convertible_to; }) { + return buf.GetHandle(); + } else if constexpr (requires {{ buf.Handle() } -> std::convertible_to; }) { + return buf.Handle(); + } else if constexpr (requires {{ buf.vk_handle() } -> std::convertible_to; }) { + return buf.vk_handle(); } else { - ++it; + static_assert(sizeof(T) == 0, "Cannot extract VkBuffer handle from vk::Buffer"); + return VK_NULL_HANDLE; } } + + } // namespace + +//MemoryCommit is now VMA-backed + MemoryCommit::MemoryCommit(VmaAllocator alloc, VmaAllocation a, + const VmaAllocationInfo &info) noexcept + : allocator{alloc}, allocation{a}, memory{info.deviceMemory}, + offset{info.offset}, size{info.size}, mapped_ptr{info.pMappedData} {} + + MemoryCommit::~MemoryCommit() { Release(); } + + MemoryCommit::MemoryCommit(MemoryCommit &&rhs) noexcept + : allocator{std::exchange(rhs.allocator, nullptr)}, + allocation{std::exchange(rhs.allocation, nullptr)}, + memory{std::exchange(rhs.memory, VK_NULL_HANDLE)}, + offset{std::exchange(rhs.offset, 0)}, + size{std::exchange(rhs.size, 0)}, + mapped_ptr{std::exchange(rhs.mapped_ptr, nullptr)} {} + + MemoryCommit &MemoryCommit::operator=(MemoryCommit &&rhs) noexcept { + if (this != &rhs) { + Release(); + allocator = std::exchange(rhs.allocator, nullptr); + allocation = std::exchange(rhs.allocation, nullptr); + memory = std::exchange(rhs.memory, VK_NULL_HANDLE); + offset = std::exchange(rhs.offset, 0); + size = std::exchange(rhs.size, 0); + mapped_ptr = std::exchange(rhs.mapped_ptr, nullptr); + } + return *this; + } + + std::span MemoryCommit::Map() + { + if (!allocation) return {}; + if (!mapped_ptr) { + if (vmaMapMemory(allocator, allocation, &mapped_ptr) != VK_SUCCESS) return {}; + } + const size_t n = static_cast(std::min(size, + (std::numeric_limits::max)())); + return std::span{static_cast(mapped_ptr), n}; + } + + std::span MemoryCommit::Map() const + { + if (!allocation) return {}; + if (!mapped_ptr) { + void *p = nullptr; + if (vmaMapMemory(allocator, allocation, &p) != VK_SUCCESS) return {}; + const_cast(this)->mapped_ptr = p; + } + const size_t n = static_cast(std::min(size, + (std::numeric_limits::max)())); + return std::span{static_cast(mapped_ptr), n}; + } + + void MemoryCommit::Unmap() + { + if (allocation && mapped_ptr) { + vmaUnmapMemory(allocator, allocation); + mapped_ptr = nullptr; + } } - // try 4: Try minimum size allocation - if (chunk_size <= minimum_size && TryAllocMemory(flags, type_mask, minimum_size)) { - LOG_WARNING(Render_Vulkan, "Memory allocation succeeded with minimum size: {} MB", - minimum_size >> 20); - return TryCommit(requirements, flags).value(); - } - // try 5: Fallback to non-device-local memory if original was device-local - if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) { - const VkMemoryPropertyFlags fallback_flags = flags & ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - - // Try with original chunk size first - u64 fallback_chunk_size = AllocationChunkSize(requirements.size); - if (TryAllocMemory(fallback_flags, type_mask, fallback_chunk_size)) { - if (auto commit = TryCommit(requirements, fallback_flags)) { - LOG_WARNING(Render_Vulkan, "Falling back to non-device-local memory due to OOM"); - return std::move(*commit); - } + void MemoryCommit::Release() { + if (allocation && allocator) { + if (mapped_ptr) { + vmaUnmapMemory(allocator, allocation); + mapped_ptr = nullptr; } + vmaFreeMemory(allocator, allocation); + } + allocation = nullptr; + allocator = nullptr; + memory = VK_NULL_HANDLE; + offset = 0; + size = 0; + } - // Progressive size reduction for non-device-local memory - while (fallback_chunk_size > minimum_size) { - fallback_chunk_size >>= 1; - fallback_chunk_size = std::max(fallback_chunk_size, minimum_size); + MemoryAllocator::MemoryAllocator(const Device &device_) + : device{device_}, allocator{device.GetAllocator()}, + properties{device_.GetPhysical().GetMemoryProperties().memoryProperties}, + buffer_image_granularity{ + device_.GetPhysical().GetProperties().limits.bufferImageGranularity} { - if (TryAllocMemory(fallback_flags, type_mask, fallback_chunk_size)) { - if (auto commit = TryCommit(requirements, fallback_flags)) { - LOG_WARNING(Render_Vulkan, - "Falling back to non-device-local memory with reduced size: {} MB", - fallback_chunk_size >> 20); - return std::move(*commit); + // Preserve the previous "RenderDoc small heap" trimming behavior that we had in original vma minus the heap bug + if (device.HasDebuggingToolAttached()) + { + using namespace Common::Literals; + ForEachDeviceLocalHostVisibleHeap(device, [this](size_t heap_idx, VkMemoryHeap &heap) { + if (heap.size <= 256_MiB) { + for (u32 t = 0; t < properties.memoryTypeCount; ++t) { + if (properties.memoryTypes[t].heapIndex == heap_idx) { + valid_memory_types &= ~(1u << t); + } } } + }); + } + } + + MemoryAllocator::~MemoryAllocator() = default; + + vk::Image MemoryAllocator::CreateImage(const VkImageCreateInfo &ci) const + { + const VmaAllocationCreateInfo alloc_ci = { + .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT, + .usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, + .requiredFlags = 0, + .preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + .memoryTypeBits = 0, + .pool = VK_NULL_HANDLE, + .pUserData = nullptr, + .priority = 0.f, + }; + + VkImage handle{}; + VmaAllocation allocation{}; + vk::Check(vmaCreateImage(allocator, &ci, &alloc_ci, &handle, &allocation, nullptr)); + return vk::Image(handle, ci.usage, *device.GetLogical(), allocator, allocation, + device.GetDispatchLoader()); + } + + vk::Buffer + MemoryAllocator::CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage) const + { + const VmaAllocationCreateInfo alloc_ci = { + .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage), + .usage = MemoryUsageVma(usage), + .requiredFlags = 0, + .preferredFlags = MemoryUsagePreferredVmaFlags(usage), + .memoryTypeBits = usage == MemoryUsage::Stream ? 0u : valid_memory_types, + .pool = VK_NULL_HANDLE, + .pUserData = nullptr, + .priority = 0.f, + }; + + VkBuffer handle{}; + VmaAllocationInfo alloc_info{}; + VmaAllocation allocation{}; + VkMemoryPropertyFlags property_flags{}; + + vk::Check(vmaCreateBuffer(allocator, &ci, &alloc_ci, &handle, &allocation, &alloc_info)); + vmaGetAllocationMemoryProperties(allocator, allocation, &property_flags); + + u8 *data = reinterpret_cast(alloc_info.pMappedData); + const std::span mapped_data = data ? std::span{data, ci.size} : std::span{}; + const bool is_coherent = (property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; + + return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, + is_coherent, + device.GetDispatchLoader()); + } + + MemoryCommit MemoryAllocator::Commit(const VkMemoryRequirements &reqs, MemoryUsage usage) + { + const auto vma_usage = MemoryUsageVma(usage); + VmaAllocationCreateInfo ci{}; + ci.flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage); + ci.usage = vma_usage; + ci.memoryTypeBits = reqs.memoryTypeBits & valid_memory_types; + ci.requiredFlags = 0; + ci.preferredFlags = MemoryUsagePreferredVmaFlags(usage); + + VmaAllocation a{}; + VmaAllocationInfo info{}; + + VkResult res = vmaAllocateMemory(allocator, &reqs, &ci, &a, &info); + + if (res != VK_SUCCESS) { + // Relax 1: drop budget constraint + auto ci2 = ci; + ci2.flags &= ~VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT; + res = vmaAllocateMemory(allocator, &reqs, &ci2, &a, &info); + + // Relax 2: if we preferred DEVICE_LOCAL, drop that preference + if (res != VK_SUCCESS && (ci.preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) { + auto ci3 = ci2; + ci3.preferredFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + res = vmaAllocateMemory(allocator, &reqs, &ci3, &a, &info); } - } - - - LOG_CRITICAL(Render_Vulkan, "Vulkan memory allocation failed - exhausted all strategies"); - throw vk::Exception(VK_ERROR_OUT_OF_DEVICE_MEMORY); -} - -bool MemoryAllocator::TryAllocMemory(VkMemoryPropertyFlags flags, u32 type_mask, u64 size) { - const auto type_opt = FindType(flags, type_mask); - if (!type_opt) { - return false; - } - - // Adreno requires 4KB alignment(subject to review) - const u64 aligned_size = (device.GetDriverID() == VK_DRIVER_ID_QUALCOMM_PROPRIETARY) ? - Common::AlignUp(size, 4096) : - size; - - vk::DeviceMemory memory = device.GetLogical().TryAllocateMemory({ - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .pNext = nullptr, - .allocationSize = aligned_size, - .memoryTypeIndex = *type_opt, - }); - - if (!memory) { - return false; - } - - allocations.push_back( - std::make_unique(this, std::move(memory), flags, aligned_size, *type_opt)); - return true; -} - -void MemoryAllocator::ReleaseMemory(MemoryAllocation* alloc) { - const auto it = std::ranges::find(allocations, alloc, &std::unique_ptr::get); - ASSERT(it != allocations.end()); - allocations.erase(it); -} - -std::optional MemoryAllocator::TryCommit(const VkMemoryRequirements& requirements, - VkMemoryPropertyFlags flags) { - // Conservative, spec-compliant alignment for suballocation - VkDeviceSize eff_align = requirements.alignment; - const auto& limits = device.GetPhysical().GetProperties().limits; - if ((flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) && - !(flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { - // Non-coherent memory must be invalidated on atom boundary - if (limits.nonCoherentAtomSize > eff_align) eff_align = limits.nonCoherentAtomSize; - } - // Separate buffers to avoid stalls on tilers - if (buffer_image_granularity > eff_align) { - eff_align = buffer_image_granularity; - } - eff_align = std::bit_ceil(eff_align); - - for (auto& allocation : allocations) { - if (!allocation->IsCompatible(flags, requirements.memoryTypeBits)) { - continue; } - if (auto commit = allocation->Commit(requirements.size, eff_align)) { - return commit; - } - } - if ((flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0) { - // Look for non device local commits on failure - return TryCommit(requirements, flags & ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - } - return std::nullopt; -} -VkMemoryPropertyFlags MemoryAllocator::MemoryPropertyFlags(u32 type_mask, - VkMemoryPropertyFlags flags) const { - if (FindType(flags, type_mask)) { - // Found a memory type with those requirements - return flags; + vk::Check(res); + return MemoryCommit(allocator, a, info); } - if ((flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0) { - // Remove host cached bit in case it's not supported - return MemoryPropertyFlags(type_mask, flags & ~VK_MEMORY_PROPERTY_HOST_CACHED_BIT); - } - if ((flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0) { - // Remove device local, if it's not supported by the requested resource - return MemoryPropertyFlags(type_mask, flags & ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - } - ASSERT_MSG(false, "No compatible memory types found"); - return 0; -} -std::optional MemoryAllocator::FindType(VkMemoryPropertyFlags flags, u32 type_mask) const { - for (u32 type_index = 0; type_index < properties.memoryTypeCount; ++type_index) { - const VkMemoryPropertyFlags type_flags = properties.memoryTypes[type_index].propertyFlags; - if ((type_mask & (1U << type_index)) != 0 && (type_flags & flags) == flags) { - // The type matches in type and in the wanted properties. - return type_index; + MemoryCommit MemoryAllocator::Commit(const vk::Buffer &buffer, MemoryUsage usage) { + // Allocate memory appropriate for this buffer automatically + const auto vma_usage = MemoryUsageVma(usage); + + VmaAllocationCreateInfo ci{}; + ci.flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage); + ci.usage = vma_usage; + ci.requiredFlags = 0; + ci.preferredFlags = MemoryUsagePreferredVmaFlags(usage); + ci.pool = VK_NULL_HANDLE; + ci.pUserData = nullptr; + ci.priority = 0.0f; + + const VkBuffer raw = *buffer; + + VmaAllocation a{}; + VmaAllocationInfo info{}; + + // Let VMA infer memory requirements from the buffer + VkResult res = vmaAllocateMemoryForBuffer(allocator, raw, &ci, &a, &info); + + if (res != VK_SUCCESS) { + auto ci2 = ci; + ci2.flags &= ~VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT; + res = vmaAllocateMemoryForBuffer(allocator, raw, &ci2, &a, &info); + + if (res != VK_SUCCESS && (ci.preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) { + auto ci3 = ci2; + ci3.preferredFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + res = vmaAllocateMemoryForBuffer(allocator, raw, &ci3, &a, &info); + } } + + vk::Check(res); + vk::Check(vmaBindBufferMemory2(allocator, a, 0, raw, nullptr)); + return MemoryCommit(allocator, a, info); } - // Failed to find index - return std::nullopt; -} + + } // namespace Vulkan diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.h b/src/video_core/vulkan_common/vulkan_memory_allocator.h index 38a182bcba..581f2e66d2 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.h +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,138 +9,134 @@ #include #include #include + #include "common/common_types.h" #include "video_core/vulkan_common/vulkan_device.h" #include "video_core/vulkan_common/vulkan_wrapper.h" - -VK_DEFINE_HANDLE(VmaAllocator) +#include "video_core/vulkan_common/vma.h" namespace Vulkan { -class Device; -class MemoryMap; -class MemoryAllocation; + class Device; /// Hints and requirements for the backing memory type of a commit -enum class MemoryUsage { - DeviceLocal, ///< Requests device local host visible buffer, falling back to device local - ///< memory. - Upload, ///< Requires a host visible memory type optimized for CPU to GPU uploads - Download, ///< Requires a host visible memory type optimized for GPU to CPU readbacks - Stream, ///< Requests device local host visible buffer, falling back host memory. -}; + enum class MemoryUsage { + DeviceLocal, ///< Requests device local host visible buffer, falling back to device local memory. + Upload, ///< Requires a host visible memory type optimized for CPU to GPU uploads + Download, ///< Requires a host visible memory type optimized for GPU to CPU readbacks + Stream, ///< Requests device local host visible buffer, falling back host memory. + }; -template -void ForEachDeviceLocalHostVisibleHeap(const Device& device, F&& f) { - auto memory_props = device.GetPhysical().GetMemoryProperties().memoryProperties; - for (size_t i = 0; i < memory_props.memoryTypeCount; i++) { - auto& memory_type = memory_props.memoryTypes[i]; - if ((memory_type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) && - (memory_type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) { - f(memory_type.heapIndex, memory_props.memoryHeaps[memory_type.heapIndex]); + template + void ForEachDeviceLocalHostVisibleHeap(const Device &device, F &&f) { + auto memory_props = device.GetPhysical().GetMemoryProperties().memoryProperties; + for (size_t i = 0; i < memory_props.memoryTypeCount; i++) { + auto &memory_type = memory_props.memoryTypes[i]; + if ((memory_type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) && + (memory_type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) { + f(memory_type.heapIndex, memory_props.memoryHeaps[memory_type.heapIndex]); + } } } -} -/// Ownership handle of a memory commitment. -/// Points to a subregion of a memory allocation. -class MemoryCommit { -public: - explicit MemoryCommit() noexcept = default; - explicit MemoryCommit(MemoryAllocation* allocation_, VkDeviceMemory memory_, u64 begin_, - u64 end_) noexcept; - ~MemoryCommit(); +/// Ownership handle of a memory commitment (real VMA allocation). + class MemoryCommit { + public: + MemoryCommit() noexcept = default; - MemoryCommit& operator=(MemoryCommit&&) noexcept; - MemoryCommit(MemoryCommit&&) noexcept; + MemoryCommit(VmaAllocator allocator, VmaAllocation allocation, + const VmaAllocationInfo &info) noexcept; - MemoryCommit& operator=(const MemoryCommit&) = delete; - MemoryCommit(const MemoryCommit&) = delete; + ~MemoryCommit(); - /// Returns a host visible memory map. - /// It will map the backing allocation if it hasn't been mapped before. - std::span Map(); + MemoryCommit(const MemoryCommit &) = delete; - /// Returns the Vulkan memory handler. - VkDeviceMemory Memory() const { - return memory; - } + MemoryCommit &operator=(const MemoryCommit &) = delete; - /// Returns the start position of the commit relative to the allocation. - VkDeviceSize Offset() const { - return static_cast(begin); - } + MemoryCommit(MemoryCommit &&) noexcept; -private: - void Release(); + MemoryCommit &operator=(MemoryCommit &&) noexcept; - MemoryAllocation* allocation{}; ///< Pointer to the large memory allocation. - VkDeviceMemory memory{}; ///< Vulkan device memory handler. - u64 begin{}; ///< Beginning offset in bytes to where the commit exists. - u64 end{}; ///< Offset in bytes where the commit ends. - std::span span; ///< Host visible memory span. Empty if not queried before. -}; + [[nodiscard]] std::span Map(); + + [[nodiscard]] std::span Map() const; + + void Unmap(); + + explicit operator bool() const noexcept { return allocation != nullptr; } + + VkDeviceMemory Memory() const noexcept { return memory; } + + VkDeviceSize Offset() const noexcept { return offset; } + + VkDeviceSize Size() const noexcept { return size; } + + VmaAllocation Allocation() const noexcept { return allocation; } + + private: + void Release(); + + VmaAllocator allocator{}; ///< VMA allocator + VmaAllocation allocation{}; ///< VMA allocation handle + VkDeviceMemory memory{}; ///< Underlying VkDeviceMemory chosen by VMA + VkDeviceSize offset{}; ///< Offset of this allocation inside VkDeviceMemory + VkDeviceSize size{}; ///< Size of the allocation + void *mapped_ptr{}; ///< Optional persistent mapped pointer + }; /// Memory allocator container. /// Allocates and releases memory allocations on demand. -class MemoryAllocator { - friend MemoryAllocation; + class MemoryAllocator { + public: + /** + * Construct memory allocator + * + * @param device_ Device to allocate from + * + * @throw vk::Exception on failure + */ + explicit MemoryAllocator(const Device &device_); -public: - /** - * Construct memory allocator - * - * @param device_ Device to allocate from - * - * @throw vk::Exception on failure - */ - explicit MemoryAllocator(const Device& device_); - ~MemoryAllocator(); + ~MemoryAllocator(); - MemoryAllocator& operator=(const MemoryAllocator&) = delete; - MemoryAllocator(const MemoryAllocator&) = delete; + MemoryAllocator &operator=(const MemoryAllocator &) = delete; - vk::Image CreateImage(const VkImageCreateInfo& ci) const; + MemoryAllocator(const MemoryAllocator &) = delete; - vk::Buffer CreateBuffer(const VkBufferCreateInfo& ci, MemoryUsage usage) const; + vk::Image CreateImage(const VkImageCreateInfo &ci) const; - /** - * Commits a memory with the specified requirements. - * - * @param requirements Requirements returned from a Vulkan call. - * @param usage Indicates how the memory will be used. - * - * @returns A memory commit. - */ - MemoryCommit Commit(const VkMemoryRequirements& requirements, MemoryUsage usage); + vk::Buffer CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage) const; - /// Commits memory required by the buffer and binds it. - MemoryCommit Commit(const vk::Buffer& buffer, MemoryUsage usage); + /** + * Commits a memory with the specified requirements. + * + * @param requirements Requirements returned from a Vulkan call. + * @param usage Indicates how the memory will be used. + * + * @returns A memory commit. + */ + MemoryCommit Commit(const VkMemoryRequirements &requirements, MemoryUsage usage); -private: - /// Tries to allocate a chunk of memory. - bool TryAllocMemory(VkMemoryPropertyFlags flags, u32 type_mask, u64 size); + /// Commits memory required by the buffer and binds it (for buffers created outside VMA). + MemoryCommit Commit(const vk::Buffer &buffer, MemoryUsage usage); - /// Releases a chunk of memory. - void ReleaseMemory(MemoryAllocation* alloc); + private: + static bool IsAutoUsage(VmaMemoryUsage u) noexcept { + switch (u) { + case VMA_MEMORY_USAGE_AUTO: + case VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE: + case VMA_MEMORY_USAGE_AUTO_PREFER_HOST: + return true; + default: + return false; + } + } - /// Tries to allocate a memory commit. - std::optional TryCommit(const VkMemoryRequirements& requirements, - VkMemoryPropertyFlags flags); - - /// Returns the fastest compatible memory property flags from the wanted flags. - VkMemoryPropertyFlags MemoryPropertyFlags(u32 type_mask, VkMemoryPropertyFlags flags) const; - - /// Returns index to the fastest memory type compatible with the passed requirements. - std::optional FindType(VkMemoryPropertyFlags flags, u32 type_mask) const; - - const Device& device; ///< Device handle. - VmaAllocator allocator; ///< Vma allocator. - const VkPhysicalDeviceMemoryProperties properties; ///< Physical device properties. - std::vector> allocations; ///< Current allocations. - VkDeviceSize buffer_image_granularity; // The granularity for adjacent offsets between buffers - // and optimal images - u32 valid_memory_types{~0u}; -}; + const Device &device; ///< Device handle. + VmaAllocator allocator; ///< VMA allocator. + const VkPhysicalDeviceMemoryProperties properties; ///< Physical device memory properties. + VkDeviceSize buffer_image_granularity; ///< Adjacent buffer/image granularity + u32 valid_memory_types{~0u}; + }; } // namespace Vulkan diff --git a/src/video_core/vulkan_common/vulkan_raii.h b/src/video_core/vulkan_common/vulkan_raii.h deleted file mode 100644 index cf5e268b68..0000000000 --- a/src/video_core/vulkan_common/vulkan_raii.h +++ /dev/null @@ -1,231 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include - -#include "common/logging/log.h" - -#include "video_core/vulkan_common/vulkan_wrapper.h" - -namespace Vulkan { - -/** - * RAII wrapper for Vulkan resources. - * Automatically manages the lifetime of Vulkan objects using RAII principles. - */ -template -class VulkanRaii { -public: - using DeleterFunc = std::function; - - // Default constructor - creates a null handle - VulkanRaii() : handle{}, deleter{}, dispatch{} {} - - // Constructor with handle and deleter - VulkanRaii(T handle_, DeleterFunc deleter_, const Dispatch& dispatch_, const char* resource_name = "Vulkan resource") - : handle{handle_}, deleter{std::move(deleter_)}, dispatch{dispatch_} { - LOG_DEBUG(Render_Vulkan, "RAII wrapper created for {}", resource_name); - } - - // Move constructor - VulkanRaii(VulkanRaii&& other) noexcept - : handle{std::exchange(other.handle, VK_NULL_HANDLE)}, - deleter{std::move(other.deleter)}, - dispatch{other.dispatch} { - } - - // Move assignment - VulkanRaii& operator=(VulkanRaii&& other) noexcept { - if (this != &other) { - cleanup(); - handle = std::exchange(other.handle, VK_NULL_HANDLE); - deleter = std::move(other.deleter); - dispatch = other.dispatch; - } - return *this; - } - - // Destructor - automatically cleans up the resource - ~VulkanRaii() { - cleanup(); - } - - // Disallow copying - VulkanRaii(const VulkanRaii&) = delete; - VulkanRaii& operator=(const VulkanRaii&) = delete; - - // Get the underlying handle - T get() const noexcept { - return handle; - } - - // Check if the handle is valid - bool valid() const noexcept { - return handle != VK_NULL_HANDLE; - } - - // Release ownership of the handle without destroying it - T release() noexcept { - return std::exchange(handle, VK_NULL_HANDLE); - } - - // Reset the handle (destroying the current one if it exists) - void reset(T new_handle = VK_NULL_HANDLE, DeleterFunc new_deleter = {}) { - cleanup(); - handle = new_handle; - deleter = std::move(new_deleter); - } - - // Implicit conversion to handle type - operator T() const noexcept { - return handle; - } - - // Dereference operator for pointer-like access - T operator->() const noexcept { - return handle; - } - -private: - // Optimized cleanup function - void cleanup() noexcept { - if (handle != VK_NULL_HANDLE && deleter) { - deleter(handle, dispatch); - handle = VK_NULL_HANDLE; - } - } - - T handle; - DeleterFunc deleter; - Dispatch dispatch; -}; - -// Common type aliases for Vulkan RAII wrappers with clearer names -using ManagedInstance = VulkanRaii; -using ManagedDevice = VulkanRaii; -using ManagedSurface = VulkanRaii; -using ManagedSwapchain = VulkanRaii; -using ManagedCommandPool = VulkanRaii; -using ManagedBuffer = VulkanRaii; -using ManagedImage = VulkanRaii; -using ManagedImageView = VulkanRaii; -using ManagedSampler = VulkanRaii; -using ManagedShaderModule = VulkanRaii; -using ManagedPipeline = VulkanRaii; -using ManagedPipelineLayout = VulkanRaii; -using ManagedDescriptorSetLayout = VulkanRaii; -using ManagedDescriptorPool = VulkanRaii; -using ManagedSemaphore = VulkanRaii; -using ManagedFence = VulkanRaii; -using ManagedDebugUtilsMessenger = VulkanRaii; - -// Helper functions to create RAII wrappers - -/** - * Creates an RAII wrapper for a Vulkan instance - */ -inline ManagedInstance MakeManagedInstance(const vk::Instance& instance, const vk::InstanceDispatch& dispatch) { - auto deleter = [](VkInstance handle, const vk::InstanceDispatch& dld) { - dld.vkDestroyInstance(handle, nullptr); - }; - return ManagedInstance(*instance, deleter, dispatch, "VkInstance"); -} - -/** - * Creates an RAII wrapper for a Vulkan device - */ -inline ManagedDevice MakeManagedDevice(const vk::Device& device, const vk::DeviceDispatch& dispatch) { - auto deleter = [](VkDevice handle, const vk::DeviceDispatch& dld) { - dld.vkDestroyDevice(handle, nullptr); - }; - return ManagedDevice(*device, deleter, dispatch, "VkDevice"); -} - -/** - * Creates an RAII wrapper for a Vulkan surface - */ -inline ManagedSurface MakeManagedSurface(const vk::SurfaceKHR& surface, const vk::Instance& instance, const vk::InstanceDispatch& dispatch) { - auto deleter = [instance_ptr = *instance](VkSurfaceKHR handle, const vk::InstanceDispatch& dld) { - dld.vkDestroySurfaceKHR(instance_ptr, handle, nullptr); - }; - return ManagedSurface(*surface, deleter, dispatch, "VkSurfaceKHR"); -} - -/** - * Creates an RAII wrapper for a Vulkan debug messenger - */ -inline ManagedDebugUtilsMessenger MakeManagedDebugUtilsMessenger(const vk::DebugUtilsMessenger& messenger, - const vk::Instance& instance, - const vk::InstanceDispatch& dispatch) { - auto deleter = [instance_ptr = *instance](VkDebugUtilsMessengerEXT handle, const vk::InstanceDispatch& dld) { - dld.vkDestroyDebugUtilsMessengerEXT(instance_ptr, handle, nullptr); - }; - return ManagedDebugUtilsMessenger(*messenger, deleter, dispatch, "VkDebugUtilsMessengerEXT"); -} - -/** - * Creates an RAII wrapper for a Vulkan swapchain - */ -inline ManagedSwapchain MakeManagedSwapchain(VkSwapchainKHR swapchain_handle, VkDevice device_handle, const vk::DeviceDispatch& dispatch) { - auto deleter = [device_handle](VkSwapchainKHR handle, const vk::DeviceDispatch& dld) { - dld.vkDestroySwapchainKHR(device_handle, handle, nullptr); - }; - return ManagedSwapchain(swapchain_handle, deleter, dispatch, "VkSwapchainKHR"); -} - -/** - * Creates an RAII wrapper for a Vulkan buffer - */ -inline ManagedBuffer MakeManagedBuffer(VkBuffer buffer_handle, VkDevice device_handle, const vk::DeviceDispatch& dispatch) { - auto deleter = [device_handle](VkBuffer handle, const vk::DeviceDispatch& dld) { - dld.vkDestroyBuffer(device_handle, handle, nullptr); - }; - return ManagedBuffer(buffer_handle, deleter, dispatch, "VkBuffer"); -} - -/** - * Creates an RAII wrapper for a Vulkan image - */ -inline ManagedImage MakeManagedImage(VkImage image_handle, VkDevice device_handle, const vk::DeviceDispatch& dispatch) { - auto deleter = [device_handle](VkImage handle, const vk::DeviceDispatch& dld) { - dld.vkDestroyImage(device_handle, handle, nullptr); - }; - return ManagedImage(image_handle, deleter, dispatch, "VkImage"); -} - -/** - * Creates an RAII wrapper for a Vulkan image view - */ -inline ManagedImageView MakeManagedImageView(VkImageView view_handle, VkDevice device_handle, const vk::DeviceDispatch& dispatch) { - auto deleter = [device_handle](VkImageView handle, const vk::DeviceDispatch& dld) { - dld.vkDestroyImageView(device_handle, handle, nullptr); - }; - return ManagedImageView(view_handle, deleter, dispatch, "VkImageView"); -} - -/** - * Creates an RAII wrapper for a Vulkan semaphore - */ -inline ManagedSemaphore MakeManagedSemaphore(VkSemaphore semaphore_handle, VkDevice device_handle, const vk::DeviceDispatch& dispatch) { - auto deleter = [device_handle](VkSemaphore handle, const vk::DeviceDispatch& dld) { - dld.vkDestroySemaphore(device_handle, handle, nullptr); - }; - return ManagedSemaphore(semaphore_handle, deleter, dispatch, "VkSemaphore"); -} - -/** - * Creates an RAII wrapper for a Vulkan fence - */ -inline ManagedFence MakeManagedFence(VkFence fence_handle, VkDevice device_handle, const vk::DeviceDispatch& dispatch) { - auto deleter = [device_handle](VkFence handle, const vk::DeviceDispatch& dld) { - dld.vkDestroyFence(device_handle, handle, nullptr); - }; - return ManagedFence(fence_handle, deleter, dispatch, "VkFence"); -} - -} // namespace Vulkan \ No newline at end of file diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 106630182f..b77d01711a 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -12,7 +12,6 @@ #include "common/common_types.h" #include "common/logging/log.h" -#include "common/settings.h" #include "video_core/vulkan_common/vk_enum_string_helper.h" #include "video_core/vulkan_common/vma.h" #include "video_core/vulkan_common/vulkan_wrapper.h" @@ -311,10 +310,7 @@ const char* Exception::what() const noexcept { } void Destroy(VkInstance instance, const InstanceDispatch& dld) noexcept { - // FIXME: A double free occurs here if RAII is enabled. - if (!Settings::values.enable_raii.GetValue()) { - dld.vkDestroyInstance(instance, nullptr); - } + dld.vkDestroyInstance(instance, nullptr); } void Destroy(VkDevice device, const InstanceDispatch& dld) noexcept { @@ -417,10 +413,7 @@ void Destroy(VkInstance instance, VkDebugReportCallbackEXT handle, } void Destroy(VkInstance instance, VkSurfaceKHR handle, const InstanceDispatch& dld) noexcept { - // FIXME: A double free occurs here if RAII is enabled. - if (!Settings::values.enable_raii.GetValue()) { - dld.vkDestroySurfaceKHR(instance, handle, nullptr); - } + dld.vkDestroySurfaceKHR(instance, handle, nullptr); } VkResult Free(VkDevice device, VkDescriptorPool handle, Span sets, @@ -580,6 +573,7 @@ DescriptorSets DescriptorPool::Allocate(const VkDescriptorSetAllocateInfo& ai) c case VK_SUCCESS: return DescriptorSets(std::move(sets), num, owner, handle, *dld); case VK_ERROR_OUT_OF_POOL_MEMORY: + case VK_ERROR_FRAGMENTED_POOL: return {}; default: throw Exception(result); @@ -604,6 +598,7 @@ CommandBuffers CommandPool::Allocate(std::size_t num_buffers, VkCommandBufferLev case VK_SUCCESS: return CommandBuffers(std::move(buffers), num_buffers, owner, handle, *dld); case VK_ERROR_OUT_OF_POOL_MEMORY: + case VK_ERROR_FRAGMENTED_POOL: return {}; default: throw Exception(result); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 8fd0bff6af..39396b3279 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -516,7 +516,7 @@ public: } /// Returns true when there's a held object. - operator bool() const noexcept { + explicit operator bool() const noexcept { return handle != nullptr; } @@ -627,7 +627,7 @@ class Instance : public Handle { public: /// Creates a Vulkan instance. /// @throw Exception on initialization error. - static Instance Create(u32 version, Span layers, Span extensions, + [[nodiscard]] static Instance Create(u32 version, Span layers, Span extensions, InstanceDispatch& dispatch); /// Enumerates physical devices. @@ -637,12 +637,12 @@ public: /// Creates a debug callback messenger. /// @throw Exception on creation failure. - DebugUtilsMessenger CreateDebugUtilsMessenger( + [[nodiscard]] DebugUtilsMessenger CreateDebugUtilsMessenger( const VkDebugUtilsMessengerCreateInfoEXT& create_info) const; /// Creates a debug report callback. /// @throw Exception on creation failure. - DebugReportCallback CreateDebugReportCallback( + [[nodiscard]] DebugReportCallback CreateDebugReportCallback( const VkDebugReportCallbackCreateInfoEXT& create_info) const; /// Returns dispatch table. @@ -860,7 +860,7 @@ public: /// Set object name. void SetObjectNameEXT(const char* name) const; - VkResult Wait(u64 timeout = std::numeric_limits::max()) const noexcept { + VkResult Wait(u64 timeout = (std::numeric_limits::max)()) const noexcept { return dld->vkWaitForFences(owner, 1, &handle, true, timeout); } @@ -961,7 +961,7 @@ public: * @param timeout Time in nanoseconds to timeout * @return True on successful wait, false on timeout */ - bool Wait(u64 value, u64 timeout = std::numeric_limits::max()) const { + bool Wait(u64 value, u64 timeout = (std::numeric_limits::max)()) const { const VkSemaphoreWaitInfo wait_info{ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, .pNext = nullptr, @@ -986,58 +986,60 @@ class Device : public Handle { using Handle::Handle; public: - static Device Create(VkPhysicalDevice physical_device, Span queues_ci, - Span enabled_extensions, const void* next, - DeviceDispatch& dispatch); + [[nodiscard]] static Device Create(VkPhysicalDevice physical_device, + Span queues_ci, + Span enabled_extensions, const void* next, + DeviceDispatch& dispatch); - Queue GetQueue(u32 family_index) const noexcept; + [[nodiscard]] Queue GetQueue(u32 family_index) const noexcept; - BufferView CreateBufferView(const VkBufferViewCreateInfo& ci) const; + [[nodiscard]] BufferView CreateBufferView(const VkBufferViewCreateInfo& ci) const; - ImageView CreateImageView(const VkImageViewCreateInfo& ci) const; + [[nodiscard]] ImageView CreateImageView(const VkImageViewCreateInfo& ci) const; - Semaphore CreateSemaphore() const; + [[nodiscard]] Semaphore CreateSemaphore() const; - Semaphore CreateSemaphore(const VkSemaphoreCreateInfo& ci) const; + [[nodiscard]] Semaphore CreateSemaphore(const VkSemaphoreCreateInfo& ci) const; - Fence CreateFence(const VkFenceCreateInfo& ci) const; + [[nodiscard]] Fence CreateFence(const VkFenceCreateInfo& ci) const; - DescriptorPool CreateDescriptorPool(const VkDescriptorPoolCreateInfo& ci) const; + [[nodiscard]] DescriptorPool CreateDescriptorPool(const VkDescriptorPoolCreateInfo& ci) const; - RenderPass CreateRenderPass(const VkRenderPassCreateInfo& ci) const; + [[nodiscard]] RenderPass CreateRenderPass(const VkRenderPassCreateInfo& ci) const; - DescriptorSetLayout CreateDescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo& ci) const; + [[nodiscard]] DescriptorSetLayout CreateDescriptorSetLayout( + const VkDescriptorSetLayoutCreateInfo& ci) const; - PipelineCache CreatePipelineCache(const VkPipelineCacheCreateInfo& ci) const; + [[nodiscard]] PipelineCache CreatePipelineCache(const VkPipelineCacheCreateInfo& ci) const; - PipelineLayout CreatePipelineLayout(const VkPipelineLayoutCreateInfo& ci) const; + [[nodiscard]] PipelineLayout CreatePipelineLayout(const VkPipelineLayoutCreateInfo& ci) const; - Pipeline CreateGraphicsPipeline(const VkGraphicsPipelineCreateInfo& ci, - VkPipelineCache cache = nullptr) const; + [[nodiscard]] Pipeline CreateGraphicsPipeline(const VkGraphicsPipelineCreateInfo& ci, + VkPipelineCache cache = nullptr) const; - Pipeline CreateComputePipeline(const VkComputePipelineCreateInfo& ci, - VkPipelineCache cache = nullptr) const; + [[nodiscard]] Pipeline CreateComputePipeline(const VkComputePipelineCreateInfo& ci, + VkPipelineCache cache = nullptr) const; - Sampler CreateSampler(const VkSamplerCreateInfo& ci) const; + [[nodiscard]] Sampler CreateSampler(const VkSamplerCreateInfo& ci) const; - Framebuffer CreateFramebuffer(const VkFramebufferCreateInfo& ci) const; + [[nodiscard]] Framebuffer CreateFramebuffer(const VkFramebufferCreateInfo& ci) const; - CommandPool CreateCommandPool(const VkCommandPoolCreateInfo& ci) const; + [[nodiscard]] CommandPool CreateCommandPool(const VkCommandPoolCreateInfo& ci) const; - DescriptorUpdateTemplate CreateDescriptorUpdateTemplate( + [[nodiscard]] DescriptorUpdateTemplate CreateDescriptorUpdateTemplate( const VkDescriptorUpdateTemplateCreateInfo& ci) const; - QueryPool CreateQueryPool(const VkQueryPoolCreateInfo& ci) const; + [[nodiscard]] QueryPool CreateQueryPool(const VkQueryPoolCreateInfo& ci) const; - ShaderModule CreateShaderModule(const VkShaderModuleCreateInfo& ci) const; + [[nodiscard]] ShaderModule CreateShaderModule(const VkShaderModuleCreateInfo& ci) const; - Event CreateEvent() const; + [[nodiscard]] Event CreateEvent() const; - SwapchainKHR CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const; + [[nodiscard]] SwapchainKHR CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const; - DeviceMemory TryAllocateMemory(const VkMemoryAllocateInfo& ai) const noexcept; + [[nodiscard]] DeviceMemory TryAllocateMemory(const VkMemoryAllocateInfo& ai) const noexcept; - DeviceMemory AllocateMemory(const VkMemoryAllocateInfo& ai) const; + [[nodiscard]] DeviceMemory AllocateMemory(const VkMemoryAllocateInfo& ai) const; VkMemoryRequirements GetBufferMemoryRequirements(VkBuffer buffer, void* pnext = nullptr) const noexcept; diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index f979a5c181..c03f7a3abf 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -150,12 +150,8 @@ add_executable(yuzu configuration/configure_web.ui configuration/input_profiles.cpp configuration/input_profiles.h - configuration/shared_translation.cpp - configuration/shared_translation.h configuration/shared_widget.cpp configuration/shared_widget.h - configuration/qt_config.cpp - configuration/qt_config.h debugger/console.cpp debugger/console.h debugger/controller.cpp @@ -205,12 +201,8 @@ add_executable(yuzu play_time_manager.cpp play_time_manager.h precompiled_headers.h - qt_common.cpp - qt_common.h startup_checks.cpp startup_checks.h - uisettings.cpp - uisettings.h util/clickable_label.cpp util/clickable_label.h util/controller_navigation.cpp @@ -256,7 +248,7 @@ if (YUZU_CRASH_DUMPS) target_compile_definitions(yuzu PRIVATE YUZU_CRASH_DUMPS) endif() -if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +if (CXX_CLANG) target_compile_definitions(yuzu PRIVATE $<$,15>:CANNOT_EXPLICITLY_INSTANTIATE> ) @@ -374,10 +366,10 @@ if (APPLE) set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE TRUE) set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) - if (NOT USE_SYSTEM_MOLTENVK) + if (YUZU_USE_BUNDLED_MOLTENVK) set(MOLTENVK_PLATFORM "macOS") set(MOLTENVK_VERSION "v1.3.0") - download_moltenvk_external(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION}) + download_moltenvk(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION}) endif() find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED) message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.") @@ -396,15 +388,15 @@ elseif(WIN32) endif() endif() -target_link_libraries(yuzu PRIVATE common core input_common frontend_common network video_core) target_link_libraries(yuzu PRIVATE nlohmann_json::nlohmann_json) +target_link_libraries(yuzu PRIVATE common core input_common frontend_common network video_core qt_common) target_link_libraries(yuzu PRIVATE Boost::headers glad Qt6::Widgets) target_link_libraries(yuzu PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) -target_link_libraries(yuzu PRIVATE Vulkan::Headers) if (NOT WIN32) target_include_directories(yuzu PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) endif() + if (UNIX AND NOT APPLE) target_link_libraries(yuzu PRIVATE Qt6::DBus) @@ -416,24 +408,24 @@ endif() target_compile_definitions(yuzu PRIVATE # Use QStringBuilder for string concatenation to reduce # the overall number of temporary strings created. - -DQT_USE_QSTRINGBUILDER + QT_USE_QSTRINGBUILDER # Disable implicit conversions from/to C strings - -DQT_NO_CAST_FROM_ASCII - -DQT_NO_CAST_TO_ASCII + QT_NO_CAST_FROM_ASCII + QT_NO_CAST_TO_ASCII # Disable implicit type narrowing in signal/slot connect() calls. - -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT + QT_NO_NARROWING_CONVERSIONS_IN_CONNECT # Disable unsafe overloads of QProcess' start() function. - -DQT_NO_PROCESS_COMBINED_ARGUMENT_START + QT_NO_PROCESS_COMBINED_ARGUMENT_START # Disable implicit QString->QUrl conversions to enforce use of proper resolving functions. - -DQT_NO_URL_CAST_FROM_STRING + QT_NO_URL_CAST_FROM_STRING ) if (YUZU_ENABLE_COMPATIBILITY_REPORTING) - target_compile_definitions(yuzu PRIVATE -DYUZU_ENABLE_COMPATIBILITY_REPORTING) + target_compile_definitions(yuzu PRIVATE YUZU_ENABLE_COMPATIBILITY_REPORTING) endif() if (USE_DISCORD_PRESENCE) @@ -441,22 +433,22 @@ if (USE_DISCORD_PRESENCE) discord_impl.cpp discord_impl.h ) - target_link_libraries(yuzu PRIVATE DiscordRPC::discord-rpc httplib::httplib Qt${QT_MAJOR_VERSION}::Network) - target_compile_definitions(yuzu PRIVATE -DUSE_DISCORD_PRESENCE) + target_link_libraries(yuzu PRIVATE DiscordRPC::discord-rpc httplib::httplib Qt6::Network) + target_compile_definitions(yuzu PRIVATE USE_DISCORD_PRESENCE) endif() if (ENABLE_WEB_SERVICE) - target_compile_definitions(yuzu PRIVATE -DENABLE_WEB_SERVICE) + target_compile_definitions(yuzu PRIVATE ENABLE_WEB_SERVICE) endif() if (YUZU_USE_QT_MULTIMEDIA) - target_link_libraries(yuzu PRIVATE Qt${QT_MAJOR_VERSION}::Multimedia) - target_compile_definitions(yuzu PRIVATE -DYUZU_USE_QT_MULTIMEDIA) + target_link_libraries(yuzu PRIVATE Qt6::Multimedia) + target_compile_definitions(yuzu PRIVATE YUZU_USE_QT_MULTIMEDIA) endif () if (YUZU_USE_QT_WEB_ENGINE) - target_link_libraries(yuzu PRIVATE Qt${QT_MAJOR_VERSION}::WebEngineCore Qt${QT_MAJOR_VERSION}::WebEngineWidgets) - target_compile_definitions(yuzu PRIVATE -DYUZU_USE_QT_WEB_ENGINE) + target_link_libraries(yuzu PRIVATE Qt6::WebEngineCore Qt6::WebEngineWidgets) + target_compile_definitions(yuzu PRIVATE YUZU_USE_QT_WEB_ENGINE) endif () if(UNIX AND NOT APPLE) @@ -468,6 +460,7 @@ if (WIN32 AND NOT YUZU_USE_BUNDLED_QT AND QT_VERSION VERSION_GREATER_EQUAL 6) add_custom_command(TARGET yuzu POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} "${YUZU_EXE_DIR}/eden.exe" --dir "${YUZU_EXE_DIR}" --libdir "${YUZU_EXE_DIR}" --plugindir "${YUZU_EXE_DIR}/plugins" --no-compiler-runtime --no-opengl-sw --no-system-d3d-compiler --no-translations --verbose 0) endif() +# TODO(crueter): this can be done with system qt in a better way if (YUZU_USE_BUNDLED_QT) include(CopyYuzuQt6Deps) copy_yuzu_Qt6_deps(yuzu) @@ -485,10 +478,6 @@ if (MSVC) copy_yuzu_FFmpeg_deps(yuzu) endif() -if (NOT APPLE AND ENABLE_OPENGL) - target_compile_definitions(yuzu PRIVATE HAS_OPENGL) -endif() - if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) target_link_libraries(yuzu PRIVATE dynarmic::dynarmic) endif() @@ -501,13 +490,4 @@ if (YUZU_ROOM) target_link_libraries(yuzu PRIVATE yuzu-room) endif() -# Explicit linking required -if (PLATFORM_SUN) - target_link_libraries(yuzu PRIVATE X11 "/usr/lib/xorg/amd64/libdrm.so") -endif() - -# Extra deps -add_subdirectory(externals) -target_link_libraries(yuzu PRIVATE QuaZip::QuaZip) - create_target_directory_groups(yuzu) diff --git a/src/yuzu/Info.plist b/src/yuzu/Info.plist index 96096c84d1..773c4ee302 100644 --- a/src/yuzu/Info.plist +++ b/src/yuzu/Info.plist @@ -45,9 +45,31 @@ SPDX-License-Identifier: GPL-2.0-or-later NSHumanReadableCopyright + + LSApplicationCategoryType + public.app-category.games + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + nsp + xci + nro + + CFBundleTypeName + Switch File + CFBundleTypeRole + Viewer + LSHandlerRank + Default + + NSPrincipalClass NSApplication NSHighResolutionCapable True + UIDesignRequiresCompatibility + diff --git a/src/yuzu/about_dialog.cpp b/src/yuzu/about_dialog.cpp index 5b6e32149d..9f7597f471 100644 --- a/src/yuzu/about_dialog.cpp +++ b/src/yuzu/about_dialog.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,15 +14,12 @@ AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent) , ui{std::make_unique()} { - const auto description = std::string(Common::g_build_version); - const auto build_id = std::string(Common::g_build_id); - - std::string yuzu_build; - if (Common::g_is_dev_build) { - yuzu_build = fmt::format("Eden Nightly | {}-{}", description, build_id); - } else { - yuzu_build = fmt::format("Eden | {}", description); - } + static const std::string build_id = std::string{Common::g_build_id}; + static const std::string yuzu_build = fmt::format("{} | {} | {}", + std::string{Common::g_build_name}, + std::string{Common::g_build_version}, + std::string{Common::g_compiler_id} + ); const auto override_build = fmt::format(fmt::runtime( std::string(Common::g_title_bar_format_idle)), diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp index 8245c12ba2..a287ea16df 100644 --- a/src/yuzu/applets/qt_web_browser.cpp +++ b/src/yuzu/applets/qt_web_browser.cpp @@ -17,15 +17,16 @@ #include "yuzu/applets/qt_web_browser_scripts.h" #endif +#include "yuzu/applets/qt_web_browser.h" +#include "yuzu/main.h" + +#ifdef YUZU_USE_QT_WEB_ENGINE + #include "common/fs/path_util.h" #include "core/core.h" #include "input_common/drivers/keyboard.h" -#include "yuzu/applets/qt_web_browser.h" -#include "yuzu/main.h" #include "yuzu/util/url_request_interceptor.h" -#ifdef YUZU_USE_QT_WEB_ENGINE - namespace { constexpr int HIDButtonToKey(Core::HID::NpadButton button) { diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index b1ca497e32..cdc4e4024a 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -12,7 +12,7 @@ #include #include "common/settings_enums.h" -#include "uisettings.h" +#include "qt_common/uisettings.h" #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && YUZU_USE_QT_MULTIMEDIA #include #include @@ -58,7 +58,7 @@ #include "video_core/renderer_base.h" #include "yuzu/bootmanager.h" #include "yuzu/main.h" -#include "yuzu/qt_common.h" +#include "qt_common/qt_common.h" class QObject; class QPaintEngine; @@ -108,13 +108,13 @@ void EmuThread::run() { m_system.Run(); m_stopped.Reset(); - Common::CondvarWait(m_should_run_cv, lk, stop_token, [&] { return !m_should_run; }); + m_should_run_cv.wait(lk, stop_token, [&] { return !m_should_run; }); } else { m_system.Pause(); m_stopped.Set(); EmulationPaused(lk); - Common::CondvarWait(m_should_run_cv, lk, stop_token, [&] { return m_should_run; }); + m_should_run_cv.wait(lk, stop_token, [&] { return m_should_run; }); EmulationResumed(lk); } } @@ -234,7 +234,7 @@ class DummyContext : public Core::Frontend::GraphicsContext {}; class RenderWidget : public QWidget { public: - explicit RenderWidget(GRenderWindow* parent) : QWidget(parent), render_window(parent) { + explicit RenderWidget(GRenderWindow* parent) : QWidget(parent) { setAttribute(Qt::WA_NativeWindow); setAttribute(Qt::WA_PaintOnScreen); if (QtCommon::GetWindowSystemType() == Core::Frontend::WindowSystemType::Wayland) { @@ -247,9 +247,6 @@ public: QPaintEngine* paintEngine() const override { return nullptr; } - -private: - GRenderWindow* render_window; }; struct OpenGLRenderWidget : public RenderWidget { @@ -381,8 +378,8 @@ qreal GRenderWindow::windowPixelRatio() const { std::pair GRenderWindow::ScaleTouch(const QPointF& pos) const { const qreal pixel_ratio = windowPixelRatio(); - return {static_cast(std::max(std::round(pos.x() * pixel_ratio), qreal{0.0})), - static_cast(std::max(std::round(pos.y() * pixel_ratio), qreal{0.0}))}; + return {static_cast((std::max)(std::round(pos.x() * pixel_ratio), qreal{0.0})), + static_cast((std::max)(std::round(pos.y() * pixel_ratio), qreal{0.0}))}; } void GRenderWindow::closeEvent(QCloseEvent* event) { diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp index c235b0fca4..af81ef552e 100644 --- a/src/yuzu/configuration/configure_audio.cpp +++ b/src/yuzu/configuration/configure_audio.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,9 +19,9 @@ #include "ui_configure_audio.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_audio.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" #include "yuzu/configuration/shared_widget.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigureAudio::ConfigureAudio(const Core::System& system_, std::shared_ptr> group_, @@ -267,10 +270,8 @@ void ConfigureAudio::UpdateAudioDevices(int sink_index) { void ConfigureAudio::InitializeAudioSinkComboBox() { sink_combo_box->clear(); sink_combo_box->addItem(QString::fromUtf8(AudioCore::Sink::auto_device_name)); - - for (const auto& id : AudioCore::Sink::GetSinkIDs()) { - sink_combo_box->addItem(QString::fromStdString(Settings::CanonicalizeEnum(id))); - } + for (const auto& id : AudioCore::Sink::GetSinkIDs()) + sink_combo_box->addItem(QString::fromStdString(std::string{Settings::CanonicalizeEnum(id)})); } void ConfigureAudio::RetranslateUI() { diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index 74def6fc60..6407efbb26 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -90,15 +90,15 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { unsafe_layout->addWidget(widget); } - UpdateGroup(accuracy_combobox->currentIndex()); - UpdateGroup(backend_combobox->currentIndex()); + UpdateGroup(); } -void ConfigureCpu::UpdateGroup(int index) { - const auto accuracy = static_cast( - combobox_translations.at(Settings::EnumMetadata::Index())[index] - .first); - ui->unsafe_group->setVisible(accuracy == Settings::CpuAccuracy::Unsafe); +void ConfigureCpu::UpdateGroup() +{ + const u32 accuracy = accuracy_combobox->currentIndex(); + const u32 backend = backend_combobox->currentIndex(); + // TODO(crueter): see if this works on NCE + ui->unsafe_group->setVisible(accuracy == (u32) Settings::CpuAccuracy::Unsafe && backend == (u32) Settings::CpuBackend::Dynarmic); } void ConfigureCpu::ApplyConfiguration() { diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h index 7bbeac4963..bbc6096f9b 100644 --- a/src/yuzu/configuration/configure_cpu.h +++ b/src/yuzu/configuration/configure_cpu.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include #include "yuzu/configuration/configuration_shared.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" class QComboBox; @@ -39,7 +42,7 @@ private: void changeEvent(QEvent* event) override; void RetranslateUI(); - void UpdateGroup(int index); + void UpdateGroup(); void Setup(const ConfigurationShared::Builder& builder); diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index 10607ee233..b825348760 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ #include "ui_configure_debug.h" #include "yuzu/configuration/configure_debug.h" #include "yuzu/debugger/console.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigureDebug::ConfigureDebug(const Core::System& system_, QWidget* parent) : QScrollArea(parent), ui{std::make_unique()}, system{system_} { @@ -39,7 +42,7 @@ void ConfigureDebug::SetConfiguration() { ui->toggle_console->setEnabled(runtime_lock); ui->toggle_console->setChecked(UISettings::values.show_console.GetValue()); ui->log_filter_edit->setText(QString::fromStdString(Settings::values.log_filter.GetValue())); - ui->flush_line->setChecked(Settings::values.log_flush_lines.GetValue()); + ui->flush_line->setChecked(Settings::values.log_flush_line.GetValue()); ui->censor_username->setChecked(Settings::values.censor_username.GetValue()); ui->homebrew_args_edit->setText( QString::fromStdString(Settings::values.program_args.GetValue())); @@ -80,8 +83,7 @@ void ConfigureDebug::SetConfiguration() { #ifdef YUZU_USE_QT_WEB_ENGINE ui->disable_web_applet->setChecked(UISettings::values.disable_web_applet.GetValue()); #else - ui->disable_web_applet->setEnabled(false); - ui->disable_web_applet->setText(tr("Web applet not compiled")); + ui->disable_web_applet->setVisible(false); #endif } @@ -90,7 +92,7 @@ void ConfigureDebug::ApplyConfiguration() { Settings::values.gdbstub_port = ui->gdbport_spinbox->value(); UISettings::values.show_console = ui->toggle_console->isChecked(); Settings::values.log_filter = ui->log_filter_edit->text().toStdString(); - Settings::values.log_flush_lines = ui->flush_line->isChecked(); + Settings::values.log_flush_line = ui->flush_line->isChecked(); Settings::values.censor_username = ui->censor_username->isChecked(); Settings::values.program_args = ui->homebrew_args_edit->text().toStdString(); Settings::values.enable_fs_access_log = ui->fs_access_log->isChecked(); diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 987b1462db..0816782282 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,7 +30,7 @@ #include "yuzu/configuration/configure_ui.h" #include "yuzu/configuration/configure_web.h" #include "yuzu/hotkeys.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, InputCommon::InputSubsystem* input_subsystem, diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index 0b6b285678..c1e148fc8e 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include #include "configuration/shared_widget.h" #include "yuzu/configuration/configuration_shared.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" #include "yuzu/vk_device_info.h" namespace Core { diff --git a/src/yuzu/configuration/configure_filesystem.cpp b/src/yuzu/configuration/configure_filesystem.cpp index f25f14708b..d461bd2cc9 100644 --- a/src/yuzu/configuration/configure_filesystem.cpp +++ b/src/yuzu/configuration/configure_filesystem.cpp @@ -1,14 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "yuzu/configuration/configure_filesystem.h" #include #include #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/settings.h" +#include "qt_common/qt_common.h" +#include "qt_common/qt_game_util.h" +#include "qt_common/uisettings.h" #include "ui_configure_filesystem.h" -#include "yuzu/configuration/configure_filesystem.h" -#include "yuzu/uisettings.h" ConfigureFilesystem::ConfigureFilesystem(QWidget* parent) : QWidget(parent), ui(std::make_unique()) { @@ -126,20 +131,7 @@ void ConfigureFilesystem::SetDirectory(DirectoryTarget target, QLineEdit* edit) } void ConfigureFilesystem::ResetMetadata() { - if (!Common::FS::Exists(Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) / - "game_list/")) { - QMessageBox::information(this, tr("Reset Metadata Cache"), - tr("The metadata cache is already empty.")); - } else if (Common::FS::RemoveDirRecursively( - Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) / "game_list")) { - QMessageBox::information(this, tr("Reset Metadata Cache"), - tr("The operation completed successfully.")); - UISettings::values.is_game_list_reload_pending.exchange(true); - } else { - QMessageBox::warning( - this, tr("Reset Metadata Cache"), - tr("The metadata cache couldn't be deleted. It might be in use or non-existent.")); - } + QtCommon::Game::ResetMetadata(); } void ConfigureFilesystem::UpdateEnabledControls() { diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 918fa15d4d..18c2c9cb77 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,7 +14,7 @@ #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_general.h" #include "yuzu/configuration/shared_widget.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigureGeneral::ConfigureGeneral(const Core::System& system_, std::shared_ptr> group_, diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 16846878f9..cd806e5ef8 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -40,8 +43,8 @@ #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/shared_widget.h" -#include "yuzu/qt_common.h" -#include "yuzu/uisettings.h" +#include "qt_common/qt_common.h" +#include "qt_common/uisettings.h" #include "yuzu/vk_device_info.h" static const std::vector default_present_modes{VK_PRESENT_MODE_IMMEDIATE_KHR, diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index b92b4496ba..38d97aae80 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,7 +18,7 @@ #include #include "common/common_types.h" #include "common/settings_enums.h" -#include "configuration/shared_translation.h" +#include "qt_common/shared_translation.h" #include "vk_device_info.h" #include "yuzu/configuration/configuration_shared.h" diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 4db18673d4..e07ad8c466 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "ui_configure_graphics_advanced.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics_advanced.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" #include "yuzu/configuration/shared_widget.h" ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced( diff --git a/src/yuzu/configuration/configure_graphics_extensions.cpp b/src/yuzu/configuration/configure_graphics_extensions.cpp index c8dee6b073..f165e703d9 100644 --- a/src/yuzu/configuration/configure_graphics_extensions.cpp +++ b/src/yuzu/configuration/configure_graphics_extensions.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,7 +14,7 @@ #include "ui_configure_graphics_extensions.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics_extensions.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" #include "yuzu/configuration/shared_widget.h" ConfigureGraphicsExtensions::ConfigureGraphicsExtensions( @@ -60,6 +63,10 @@ void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& buil if (setting->Id() == Settings::values.dyna_state.Id()) { widget->slider->setTickInterval(1); widget->slider->setTickPosition(QSlider::TicksAbove); +#ifdef __APPLE__ + widget->setEnabled(false); + widget->setToolTip(tr("Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens.")); +#endif } } diff --git a/src/yuzu/configuration/configure_hotkeys.cpp b/src/yuzu/configuration/configure_hotkeys.cpp index 3f68de12d8..a5c1ee009a 100644 --- a/src/yuzu/configuration/configure_hotkeys.cpp +++ b/src/yuzu/configuration/configure_hotkeys.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,7 +16,7 @@ #include "ui_configure_hotkeys.h" #include "yuzu/configuration/configure_hotkeys.h" #include "yuzu/hotkeys.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include "yuzu/util/sequence_dialog/sequence_dialog.h" constexpr int name_column = 0; diff --git a/src/yuzu/configuration/configure_input_per_game.h b/src/yuzu/configuration/configure_input_per_game.h index 4420e856cb..dcd6dd841b 100644 --- a/src/yuzu/configuration/configure_input_per_game.h +++ b/src/yuzu/configuration/configure_input_per_game.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "ui_configure_input_per_game.h" #include "yuzu/configuration/input_profiles.h" -#include "yuzu/configuration/qt_config.h" +#include "qt_common/qt_config.h" class QComboBox; diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index d0dc0ff44c..6afa8320a2 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -14,7 +14,7 @@ #include #include "common/assert.h" #include "common/param_package.h" -#include "configuration/qt_config.h" +#include "qt_common/qt_config.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" #include "hid_core/hid_types.h" diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index 031a8d4c2d..b51ede0de8 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -38,7 +41,7 @@ #include "yuzu/configuration/configure_per_game.h" #include "yuzu/configuration/configure_per_game_addons.h" #include "yuzu/configuration/configure_system.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include "yuzu/util/util.h" #include "yuzu/vk_device_info.h" diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index e0f4e5cd67..83afc27f3d 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,8 +18,8 @@ #include "frontend_common/config.h" #include "vk_device_info.h" #include "yuzu/configuration/configuration_shared.h" -#include "yuzu/configuration/qt_config.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/qt_config.h" +#include "qt_common/shared_translation.h" namespace Core { class System; diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index 078f2e8288..ed4cbc1147 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,7 +24,7 @@ #include "ui_configure_per_game_addons.h" #include "yuzu/configuration/configure_input.h" #include "yuzu/configuration/configure_per_game_addons.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* parent) : QWidget(parent), ui{std::make_unique()}, system{system_} { diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index f5de08a676..df74738df4 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -373,13 +373,13 @@ bool ConfigureProfileManager::LoadAvatarData() { const auto romfs = nca->GetRomFS(); if (!romfs) { QMessageBox::warning(this, tr("Error loading archive"), - tr("Archive does not contain romfs. It is probably corrupt.")); + tr("Could not locate RomFS. Your file or decryption keys may be corrupted.")); return false; } const auto extracted = FileSys::ExtractRomFS(romfs); if (!extracted) { QMessageBox::warning(this, tr("Error extracting archive"), - tr("Archive could not be extracted. It is probably corrupt.")); + tr("Could not extract RomFS. Your file or decryption keys may be corrupted.")); return false; } const auto chara_dir = extracted->GetSubdirectory("chara"); diff --git a/src/yuzu/configuration/configure_ringcon.cpp b/src/yuzu/configuration/configure_ringcon.cpp index f7249be97e..795ad1a85e 100644 --- a/src/yuzu/configuration/configure_ringcon.cpp +++ b/src/yuzu/configuration/configure_ringcon.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include #include -#include "configuration/qt_config.h" +#include "qt_common/qt_config.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" #include "input_common/drivers/keyboard.h" diff --git a/src/yuzu/configuration/configure_tas.cpp b/src/yuzu/configuration/configure_tas.cpp index 773658bf22..898a1a3e59 100644 --- a/src/yuzu/configuration/configure_tas.cpp +++ b/src/yuzu/configuration/configure_tas.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include "common/settings.h" #include "ui_configure_tas.h" #include "yuzu/configuration/configure_tas.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigureTasDialog::ConfigureTasDialog(QWidget* parent) : QDialog(parent), ui(std::make_unique()) { diff --git a/src/yuzu/configuration/configure_touch_from_button.cpp b/src/yuzu/configuration/configure_touch_from_button.cpp index a6237ab72f..2a4ae3bc89 100644 --- a/src/yuzu/configuration/configure_touch_from_button.cpp +++ b/src/yuzu/configuration/configure_touch_from_button.cpp @@ -484,8 +484,8 @@ void TouchScreenPreview::resizeEvent(QResizeEvent* event) { return; } - const int target_width = std::min(width(), height() * 4 / 3); - const int target_height = std::min(height(), width() * 3 / 4); + const int target_width = (std::min)(width(), height() * 4 / 3); + const int target_height = (std::min)(height(), width() * 3 / 4); if (target_width == width() && target_height == height()) { return; } diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 8dafee628b..ac6d6e34aa 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -27,7 +27,7 @@ #include "core/core.h" #include "core/frontend/framebuffer_layout.h" #include "ui_configure_ui.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" namespace { constexpr std::array default_game_icon_sizes{ diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp index d62b5b0853..15a0029901 100644 --- a/src/yuzu/configuration/configure_web.cpp +++ b/src/yuzu/configuration/configure_web.cpp @@ -17,7 +17,7 @@ #include #include "common/settings.h" #include "ui_configure_web.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" ConfigureWeb::ConfigureWeb(QWidget* parent) : QWidget(parent) diff --git a/src/yuzu/configuration/input_profiles.h b/src/yuzu/configuration/input_profiles.h index 023ec74a63..dba5ce1318 100644 --- a/src/yuzu/configuration/input_profiles.h +++ b/src/yuzu/configuration/input_profiles.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include #include -#include "configuration/qt_config.h" +#include "qt_common/qt_config.h" namespace Core { class System; diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp index e23d86dc69..e30ecc4848 100644 --- a/src/yuzu/configuration/shared_widget.cpp +++ b/src/yuzu/configuration/shared_widget.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,7 +45,7 @@ #include "common/logging/log.h" #include "common/settings.h" #include "common/settings_common.h" -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" namespace ConfigurationShared { diff --git a/src/yuzu/configuration/shared_widget.h b/src/yuzu/configuration/shared_widget.h index 5c67d83542..dd5d5b7257 100644 --- a/src/yuzu/configuration/shared_widget.h +++ b/src/yuzu/configuration/shared_widget.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,8 +13,9 @@ #include #include #include +#include #include -#include "yuzu/configuration/shared_translation.h" +#include "qt_common/shared_translation.h" class QCheckBox; class QComboBox; diff --git a/src/yuzu/debugger/console.cpp b/src/yuzu/debugger/console.cpp index 1c1342ff18..8fb22db192 100644 --- a/src/yuzu/debugger/console.cpp +++ b/src/yuzu/debugger/console.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "common/logging/backend.h" #include "yuzu/debugger/console.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" namespace Debugger { void ToggleConsole() { diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp index 9f9e21bc28..feb814b25e 100644 --- a/src/yuzu/debugger/wait_tree.cpp +++ b/src/yuzu/debugger/wait_tree.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include "yuzu/debugger/wait_tree.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include "core/arm/debug.h" #include "core/core.h" diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 80dd90d876..fa61cdfb1f 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include +#include "yuzu/game_list.h" #include #include #include @@ -13,19 +13,20 @@ #include #include #include -#include #include "common/common_types.h" #include "common/logging/log.h" #include "core/core.h" #include "core/file_sys/patch_manager.h" #include "core/file_sys/registered_cache.h" +#include "qt_common/qt_game_util.h" +#include "qt_common/uisettings.h" #include "yuzu/compatibility_list.h" -#include "yuzu/game_list.h" #include "yuzu/game_list_p.h" #include "yuzu/game_list_worker.h" #include "yuzu/main.h" -#include "yuzu/uisettings.h" #include "yuzu/util/controller_navigation.h" +#include +#include GameListSearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist_, QObject* parent) : QObject(parent), gamelist{gamelist_} {} @@ -490,7 +491,7 @@ void GameList::DonePopulating(const QStringList& watch_list) { // Also artificially caps the watcher to a certain number of directories constexpr int LIMIT_WATCH_DIRECTORIES = 5000; constexpr int SLICE_SIZE = 25; - int len = std::min(static_cast(watch_list.size()), LIMIT_WATCH_DIRECTORIES); + int len = (std::min)(static_cast(watch_list.size()), LIMIT_WATCH_DIRECTORIES); for (int i = 0; i < len; i += SLICE_SIZE) { watcher->addPaths(watch_list.mid(i, i + SLICE_SIZE)); QCoreApplication::processEvents(); @@ -608,30 +609,30 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri connect(open_transferable_shader_cache, &QAction::triggered, [this, program_id]() { emit OpenTransferableShaderCacheRequested(program_id); }); connect(remove_all_content, &QAction::triggered, [this, program_id]() { - emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::Game); + emit RemoveInstalledEntryRequested(program_id, QtCommon::Game::InstalledEntryType::Game); }); connect(remove_update, &QAction::triggered, [this, program_id]() { - emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::Update); + emit RemoveInstalledEntryRequested(program_id, QtCommon::Game::InstalledEntryType::Update); }); connect(remove_dlc, &QAction::triggered, [this, program_id]() { - emit RemoveInstalledEntryRequested(program_id, InstalledEntryType::AddOnContent); + emit RemoveInstalledEntryRequested(program_id, QtCommon::Game::InstalledEntryType::AddOnContent); }); connect(remove_gl_shader_cache, &QAction::triggered, [this, program_id, path]() { - emit RemoveFileRequested(program_id, GameListRemoveTarget::GlShaderCache, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::GlShaderCache, path); }); connect(remove_vk_shader_cache, &QAction::triggered, [this, program_id, path]() { - emit RemoveFileRequested(program_id, GameListRemoveTarget::VkShaderCache, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::VkShaderCache, path); }); connect(remove_shader_cache, &QAction::triggered, [this, program_id, path]() { - emit RemoveFileRequested(program_id, GameListRemoveTarget::AllShaderCache, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::AllShaderCache, path); }); connect(remove_custom_config, &QAction::triggered, [this, program_id, path]() { - emit RemoveFileRequested(program_id, GameListRemoveTarget::CustomConfiguration, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::CustomConfiguration, path); }); connect(remove_play_time_data, &QAction::triggered, [this, program_id]() { emit RemovePlayTimeRequested(program_id); }); connect(remove_cache_storage, &QAction::triggered, [this, program_id, path] { - emit RemoveFileRequested(program_id, GameListRemoveTarget::CacheStorage, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::CacheStorage, path); }); connect(dump_romfs, &QAction::triggered, [this, program_id, path]() { emit DumpRomFSRequested(program_id, path, DumpRomFSTarget::Normal); @@ -649,10 +650,10 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri // TODO: Implement shortcut creation for macOS #if !defined(__APPLE__) connect(create_desktop_shortcut, &QAction::triggered, [this, program_id, path]() { - emit CreateShortcut(program_id, path, GameListShortcutTarget::Desktop); + emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Desktop); }); connect(create_applications_menu_shortcut, &QAction::triggered, [this, program_id, path]() { - emit CreateShortcut(program_id, path, GameListShortcutTarget::Applications); + emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Applications); }); #endif connect(properties, &QAction::triggered, @@ -820,7 +821,7 @@ QStandardItemModel* GameList::GetModel() const { return item_model; } -void GameList::PopulateAsync(QVector& game_dirs, const bool cached) +void GameList::PopulateAsync(QVector& game_dirs) { tree_view->setEnabled(false); @@ -843,8 +844,7 @@ void GameList::PopulateAsync(QVector& game_dirs, const bool game_dirs, compatibility_list, play_time_manager, - system, - cached); + system); // Get events from the worker as data becomes available connect(current_worker.get(), &GameListWorker::DataAvailable, this, &GameList::WorkerEvent, @@ -873,14 +873,6 @@ const QStringList GameList::supported_file_extensions = { QStringLiteral("nso"), QStringLiteral("nro"), QStringLiteral("nca"), QStringLiteral("xci"), QStringLiteral("nsp"), QStringLiteral("kip")}; -void GameList::ForceRefreshGameDirectory() -{ - if (!UISettings::values.game_dirs.empty() && current_worker != nullptr) { - LOG_INFO(Frontend, "Force-reloading game list per user request."); - PopulateAsync(UISettings::values.game_dirs, false); - } -} - void GameList::RefreshGameDirectory() { if (!UISettings::values.game_dirs.empty() && current_worker != nullptr) { diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h index 7c492bc19f..cd71fb2139 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game_list.h @@ -20,7 +20,8 @@ #include "common/common_types.h" #include "core/core.h" -#include "uisettings.h" +#include "qt_common/uisettings.h" +#include "qt_common/qt_game_util.h" #include "yuzu/compatibility_list.h" #include "yuzu/play_time_manager.h" @@ -46,41 +47,22 @@ enum class GameListOpenTarget { ModData, }; -enum class GameListRemoveTarget { - GlShaderCache, - VkShaderCache, - AllShaderCache, - CustomConfiguration, - CacheStorage, -}; - enum class DumpRomFSTarget { Normal, SDMC, }; -enum class GameListShortcutTarget { - Desktop, - Applications, -}; - -enum class InstalledEntryType { - Game, - Update, - AddOnContent, -}; - class GameList : public QWidget { Q_OBJECT public: enum { COLUMN_NAME, - COLUMN_COMPATIBILITY, - COLUMN_ADD_ONS, COLUMN_FILE_TYPE, COLUMN_SIZE, COLUMN_PLAY_TIME, + COLUMN_ADD_ONS, + COLUMN_COMPATIBILITY, COLUMN_COUNT, // Number of columns }; @@ -97,7 +79,7 @@ public: bool IsEmpty() const; void LoadCompatibilityList(); - void PopulateAsync(QVector& game_dirs, const bool cached = true); + void PopulateAsync(QVector& game_dirs); void SaveInterfaceLayout(); void LoadInterfaceLayout(); @@ -110,7 +92,6 @@ public: static const QStringList supported_file_extensions; public slots: - void ForceRefreshGameDirectory(); void RefreshGameDirectory(); signals: @@ -119,15 +100,15 @@ signals: void OpenFolderRequested(u64 program_id, GameListOpenTarget target, const std::string& game_path); void OpenTransferableShaderCacheRequested(u64 program_id); - void RemoveInstalledEntryRequested(u64 program_id, InstalledEntryType type); - void RemoveFileRequested(u64 program_id, GameListRemoveTarget target, + void RemoveInstalledEntryRequested(u64 program_id, QtCommon::Game::InstalledEntryType type); + void RemoveFileRequested(u64 program_id, QtCommon::Game::GameListRemoveTarget target, const std::string& game_path); void RemovePlayTimeRequested(u64 program_id); void DumpRomFSRequested(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void VerifyIntegrityRequested(const std::string& game_path); void CopyTIDRequested(u64 program_id); void CreateShortcut(u64 program_id, const std::string& game_path, - GameListShortcutTarget target); + const QtCommon::Game::ShortcutTarget target); void NavigateToGamedbEntryRequested(u64 program_id, const CompatibilityList& compatibility_list); void OpenPerGameGeneralRequested(const std::string& file); diff --git a/src/yuzu/game_list_p.h b/src/yuzu/game_list_p.h index c330b574f9..5a3b5829f5 100644 --- a/src/yuzu/game_list_p.h +++ b/src/yuzu/game_list_p.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -19,7 +22,7 @@ #include "common/logging/log.h" #include "common/string_util.h" #include "yuzu/play_time_manager.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include "yuzu/util/util.h" enum class GameListItemType { diff --git a/src/yuzu/game_list_worker.cpp b/src/yuzu/game_list_worker.cpp index 60109769bf..2914c275a8 100644 --- a/src/yuzu/game_list_worker.cpp +++ b/src/yuzu/game_list_worker.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,7 +30,7 @@ #include "yuzu/game_list.h" #include "yuzu/game_list_p.h" #include "yuzu/game_list_worker.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" namespace { @@ -199,43 +202,26 @@ QList MakeGameListEntry(const std::string& path, u64 program_id, const CompatibilityList& compatibility_list, const PlayTime::PlayTimeManager& play_time_manager, - const FileSys::PatchManager& patch, - const bool cached) + const FileSys::PatchManager& patch) { - const auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id); + auto const it = FindMatchingCompatibilityEntry(compatibility_list, program_id); + // The game list uses 99 as compatibility number for untested games + QString compatibility = it != compatibility_list.end() ? it->second.first : QStringLiteral("99"); - // The game list uses this as compatibility number for untested games - QString compatibility{QStringLiteral("99")}; - if (it != compatibility_list.end()) { - compatibility = it->second.first; - } + auto const file_type = loader.GetFileType(); + auto const file_type_string = QString::fromStdString(Loader::GetFileTypeString(file_type)); - const auto file_type = loader.GetFileType(); - const auto file_type_string = QString::fromStdString(Loader::GetFileTypeString(file_type)); - - QList list{ - new GameListItemPath(FormatGameName(path), icon, QString::fromStdString(name), - file_type_string, program_id), - new GameListItemCompat(compatibility), + QString patch_versions = GetGameListCachedObject(fmt::format("{:016X}", patch.GetTitleID()), "pv.txt", [&patch, &loader] { + return FormatPatchNameVersions(patch, loader, loader.IsRomFSUpdatable()); + }); + return QList{ + new GameListItemPath(FormatGameName(path), icon, QString::fromStdString(name), file_type_string, program_id), new GameListItem(file_type_string), new GameListItemSize(size), new GameListItemPlayTime(play_time_manager.GetPlayTime(program_id)), + new GameListItem(patch_versions), + new GameListItemCompat(compatibility), }; - - QString patch_versions; - - if (cached) { - patch_versions = GetGameListCachedObject( - fmt::format("{:016X}", patch.GetTitleID()), "pv.txt", [&patch, &loader] { - return FormatPatchNameVersions(patch, loader, loader.IsRomFSUpdatable()); - }); - } else { - patch_versions = FormatPatchNameVersions(patch, loader, loader.IsRomFSUpdatable()); - } - - list.insert(2, new GameListItem(patch_versions)); - - return list; } } // Anonymous namespace @@ -244,15 +230,13 @@ GameListWorker::GameListWorker(FileSys::VirtualFilesystem vfs_, QVector& game_dirs_, const CompatibilityList& compatibility_list_, const PlayTime::PlayTimeManager& play_time_manager_, - Core::System& system_, - const bool cached_) + Core::System& system_) : vfs{std::move(vfs_)} , provider{provider_} , game_dirs{game_dirs_} , compatibility_list{compatibility_list_} , play_time_manager{play_time_manager_} , system{system_} - , cached{cached_} { // We want the game list to manage our lifetime. setAutoDelete(false); @@ -355,8 +339,7 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) { program_id, compatibility_list, play_time_manager, - patch, - cached); + patch); RecordEvent([=](GameList* game_list) { game_list->AddEntry(entry, parent_dir); }); } } @@ -439,8 +422,7 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa id, compatibility_list, play_time_manager, - patch, - cached); + patch); RecordEvent( [=](GameList* game_list) { game_list->AddEntry(entry, parent_dir); }); @@ -463,8 +445,7 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa program_id, compatibility_list, play_time_manager, - patch, - cached); + patch); RecordEvent( [=](GameList* game_list) { game_list->AddEntry(entry, parent_dir); }); diff --git a/src/yuzu/game_list_worker.h b/src/yuzu/game_list_worker.h index 0afd7c7849..f5d5f6341b 100644 --- a/src/yuzu/game_list_worker.h +++ b/src/yuzu/game_list_worker.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,7 +18,7 @@ #include "common/thread.h" #include "core/file_sys/registered_cache.h" -#include "uisettings.h" +#include "qt_common/uisettings.h" #include "yuzu/compatibility_list.h" #include "yuzu/play_time_manager.h" @@ -45,8 +48,7 @@ public: QVector& game_dirs_, const CompatibilityList& compatibility_list_, const PlayTime::PlayTimeManager& play_time_manager_, - Core::System& system_, - const bool cached = true); + Core::System& system_); ~GameListWorker() override; /// Starts the processing of directory tree information. @@ -95,6 +97,4 @@ private: Common::Event processing_completed; Core::System& system; - - const bool cached; }; diff --git a/src/yuzu/hotkeys.cpp b/src/yuzu/hotkeys.cpp index 1931dcd1f6..31932e6f43 100644 --- a/src/yuzu/hotkeys.cpp +++ b/src/yuzu/hotkeys.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include "hid_core/frontend/emulated_controller.h" #include "yuzu/hotkeys.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" HotkeyRegistry::HotkeyRegistry() = default; HotkeyRegistry::~HotkeyRegistry() = default; diff --git a/src/yuzu/install_dialog.cpp b/src/yuzu/install_dialog.cpp index 673bbaa836..e6f1392ce0 100644 --- a/src/yuzu/install_dialog.cpp +++ b/src/yuzu/install_dialog.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include #include #include "yuzu/install_dialog.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" InstallDialog::InstallDialog(QWidget* parent, const QStringList& files) : QDialog(parent) { file_list = new QListWidget(this); diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 2c3c46114d..44ed29f141 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -1,18 +1,19 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include -#include -#include -#include -#include -#include #include "core/hle/service/am/applet_manager.h" #include "core/loader/nca.h" #include "core/tools/renderdoc.h" #include "frontend_common/firmware_manager.h" - -#include +#include "qt_common/qt_common.h" +#include "qt_common/qt_content_util.h" +#include "qt_common/qt_game_util.h" +#include "qt_common/qt_meta.h" +#include "qt_common/qt_path_util.h" +#include +#include +#include +#include #ifdef __APPLE__ #include // for chdir @@ -34,26 +35,20 @@ #include "applets/qt_profile_select.h" #include "applets/qt_software_keyboard.h" #include "applets/qt_web_browser.h" -#include "common/nvidia_flags.h" #include "common/settings_enums.h" #include "configuration/configure_input.h" #include "configuration/configure_per_game.h" #include "configuration/configure_tas.h" -#include "core/core_timing.h" #include "core/file_sys/romfs_factory.h" -#include "core/file_sys/vfs/vfs.h" -#include "core/file_sys/vfs/vfs_real.h" #include "core/frontend/applets/cabinet.h" #include "core/frontend/applets/controller.h" #include "core/frontend/applets/general.h" #include "core/frontend/applets/mii_edit.h" #include "core/frontend/applets/software_keyboard.h" -#include "core/hle/service/acc/profile_manager.h" #include "core/hle/service/am/frontend/applets.h" -#include "core/hle/service/set/system_settings_server.h" #include "frontend_common/content_manager.h" -#include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" +#include "hid_core/frontend/emulated_controller.h" #include "yuzu/multiplayer/state.h" #include "yuzu/util/controller_navigation.h" @@ -67,9 +62,8 @@ // These are wrappers to avoid the calls to CreateDirectory and CreateFile because of the Windows // defines. -static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper( - const FileSys::VirtualFilesystem& vfs, const std::string& path, FileSys::OpenMode mode) { - return vfs->CreateDirectory(path, mode); +static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper(const std::string& path, FileSys::OpenMode mode) { + return QtCommon::vfs->CreateDirectory(path, mode); } static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, @@ -101,9 +95,10 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include #include -#ifdef HAVE_SDL2 #include #include + +#ifdef HAVE_SDL2 #include // For SDL ScreenSaver functions #endif @@ -118,7 +113,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "common/scm_rev.h" #include "common/scope_exit.h" #ifdef _WIN32 -#include +#include "core/core_timing.h" #include "common/windows/timer_resolution.h" #endif #ifdef ARCHITECTURE_x86_64 @@ -137,6 +132,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "core/file_sys/savedata_factory.h" #include "core/file_sys/submission_package.h" #include "core/hle/kernel/k_process.h" +#include "core/hle/service/acc/profile_manager.h" #include "core/hle/service/am/am.h" #include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/sm/sm.h" @@ -156,7 +152,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "yuzu/compatibility_list.h" #include "yuzu/configuration/configure_dialog.h" #include "yuzu/configuration/configure_input_per_game.h" -#include "yuzu/configuration/qt_config.h" +#include "qt_common/qt_config.h" #include "yuzu/debugger/console.h" #include "yuzu/debugger/controller.h" #include "yuzu/debugger/wait_tree.h" @@ -164,13 +160,12 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "yuzu/discord.h" #include "yuzu/game_list.h" #include "yuzu/game_list_p.h" -#include "yuzu/hotkeys.h" #include "yuzu/install_dialog.h" #include "yuzu/loading_screen.h" #include "yuzu/main.h" #include "yuzu/play_time_manager.h" #include "yuzu/startup_checks.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include "yuzu/util/clickable_label.h" #include "yuzu/vk_device_info.h" @@ -178,7 +173,9 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include #include #include +#ifdef _MSC_VER #pragma comment(lib, "Dwmapi.lib") +#endif static inline void ApplyWindowsTitleBarDarkMode(HWND hwnd, bool enabled) { if (!hwnd) @@ -297,14 +294,6 @@ enum class CalloutFlag : uint32_t { DRDDeprecation = 0x2, }; -/** - * Some games perform worse or straight-up don't work with updates, - * so this tracks which games are bad in this regard. - */ -constexpr std::array bad_update_games{ - 0x0100F2C0115B6000 // Tears of the Kingdom -}; - const int GMainWindow::max_recent_files_item; static void RemoveCachedContents() { @@ -386,6 +375,8 @@ static void OverrideWindowsFont() { } #endif +#ifndef _WIN32 +// TODO(crueter): carboxyl does this, is it needed in qml? inline static bool isDarkMode() { #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) const auto scheme = QGuiApplication::styleHints()->colorScheme(); @@ -397,12 +388,13 @@ inline static bool isDarkMode() { return text.lightness() > window.lightness(); #endif // QT_VERSION } +#endif // _WIN32 GMainWindow::GMainWindow(bool has_broken_vulkan) - : ui{std::make_unique()}, system{std::make_unique()}, - input_subsystem{std::make_shared()}, user_data_migrator{this}, - vfs{std::make_shared()}, - provider{std::make_unique()} { + : ui{std::make_unique()}, + input_subsystem{std::make_shared()}, user_data_migrator{this} { + QtCommon::Init(this); + Common::FS::CreateEdenPaths(); this->config = std::make_unique(); @@ -433,7 +425,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) UISettings::RestoreWindowState(config); - system->Initialize(); + QtCommon::system->Initialize(); Common::Log::Initialize(); Common::Log::Start(); @@ -455,11 +447,11 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); discord_rpc->Update(); - play_time_manager = std::make_unique(system->GetProfileManager()); + play_time_manager = std::make_unique(QtCommon::system->GetProfileManager()); Network::Init(); - RegisterMetaTypes(); + QtCommon::Meta::RegisterMetaTypes(); InitializeWidgets(); InitializeDebugWidgets(); @@ -472,7 +464,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) ConnectMenuEvents(); ConnectWidgetEvents(); - system->HIDCore().ReloadInputDevices(); + QtCommon::system->HIDCore().ReloadInputDevices(); controller_dialog->refreshConfiguration(); const auto branch_name = std::string(Common::g_scm_branch); @@ -516,7 +508,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) std::chrono::duration_cast>( Common::Windows::SetCurrentTimerResolutionToMaximum()) .count()); - system->CoreTiming().SetTimerResolutionNs(Common::Windows::GetCurrentTimerResolution()); + QtCommon::system->CoreTiming().SetTimerResolutionNs(Common::Windows::GetCurrentTimerResolution()); #endif UpdateWindowTitle(); @@ -542,10 +534,10 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) } #endif - system->SetContentProvider(std::make_unique()); - system->RegisterContentProvider(FileSys::ContentProviderUnionSlot::FrontendManual, - provider.get()); - system->GetFileSystemController().CreateFactories(*vfs); + QtCommon::system->SetContentProvider(std::make_unique()); + QtCommon::system->RegisterContentProvider(FileSys::ContentProviderUnionSlot::FrontendManual, + QtCommon::provider.get()); + QtCommon::system->GetFileSystemController().CreateFactories(*QtCommon::vfs); // Remove cached contents generated during the previous session RemoveCachedContents(); @@ -553,12 +545,12 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) // Gen keys if necessary OnCheckFirmwareDecryption(); - // Check firmware - OnCheckFirmware(); + // Check for orphaned profiles and reset profile data if necessary + QtCommon::Content::FixProfiles(); game_list->LoadCompatibilityList(); // force reload on first load to ensure add-ons get updated - game_list->PopulateAsync(UISettings::values.game_dirs, false); + game_list->PopulateAsync(UISettings::values.game_dirs); // make sure menubar has the arrow cursor instead of inheriting from this ui->menubar->setCursor(QCursor()); @@ -662,7 +654,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) if (!argument_ok) { // try to look it up by username, only finds the first username that matches. const std::string user_arg_str = args[user_arg_idx].toStdString(); - const auto user_idx = system->GetProfileManager().GetUserIndex(user_arg_str); + const auto user_idx = QtCommon::system->GetProfileManager().GetUserIndex(user_arg_str); if (user_idx == std::nullopt) { LOG_ERROR(Frontend, "Invalid user argument"); @@ -672,7 +664,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) selected_user = user_idx.value(); } - if (!system->GetProfileManager().UserExistsIndex(selected_user)) { + if (!QtCommon::system->GetProfileManager().UserExistsIndex(selected_user)) { LOG_ERROR(Frontend, "Selected user doesn't exist"); continue; } @@ -733,65 +725,6 @@ GMainWindow::~GMainWindow() { #endif } -void GMainWindow::RegisterMetaTypes() { - // Register integral and floating point types - qRegisterMetaType("u8"); - qRegisterMetaType("u16"); - qRegisterMetaType("u32"); - qRegisterMetaType("u64"); - qRegisterMetaType("u128"); - qRegisterMetaType("s8"); - qRegisterMetaType("s16"); - qRegisterMetaType("s32"); - qRegisterMetaType("s64"); - qRegisterMetaType("f32"); - qRegisterMetaType("f64"); - - // Register string types - qRegisterMetaType("std::string"); - qRegisterMetaType("std::wstring"); - qRegisterMetaType("std::u8string"); - qRegisterMetaType("std::u16string"); - qRegisterMetaType("std::u32string"); - qRegisterMetaType("std::string_view"); - qRegisterMetaType("std::wstring_view"); - qRegisterMetaType("std::u8string_view"); - qRegisterMetaType("std::u16string_view"); - qRegisterMetaType("std::u32string_view"); - - // Register applet types - - // Cabinet Applet - qRegisterMetaType("Core::Frontend::CabinetParameters"); - qRegisterMetaType>( - "std::shared_ptr"); - - // Controller Applet - qRegisterMetaType("Core::Frontend::ControllerParameters"); - - // Profile Select Applet - qRegisterMetaType( - "Core::Frontend::ProfileSelectParameters"); - - // Software Keyboard Applet - qRegisterMetaType( - "Core::Frontend::KeyboardInitializeParameters"); - qRegisterMetaType( - "Core::Frontend::InlineAppearParameters"); - qRegisterMetaType("Core::Frontend::InlineTextParameters"); - qRegisterMetaType("Service::AM::Frontend::SwkbdResult"); - qRegisterMetaType( - "Service::AM::Frontend::SwkbdTextCheckResult"); - qRegisterMetaType( - "Service::AM::Frontend::SwkbdReplyType"); - - // Web Browser Applet - qRegisterMetaType("Service::AM::Frontend::WebExitReason"); - - // Register loader types - qRegisterMetaType("Core::SystemResultStatus"); -} - void GMainWindow::AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters, std::shared_ptr nfp_device) { cabinet_applet = @@ -822,7 +755,7 @@ void GMainWindow::AmiiboSettingsRequestExit() { void GMainWindow::ControllerSelectorReconfigureControllers( const Core::Frontend::ControllerParameters& parameters) { controller_applet = - new QtControllerSelectorDialog(this, parameters, input_subsystem.get(), *system); + new QtControllerSelectorDialog(this, parameters, input_subsystem.get(), *QtCommon::system); SCOPE_EXIT { controller_applet->deleteLater(); controller_applet = nullptr; @@ -835,8 +768,8 @@ void GMainWindow::ControllerSelectorReconfigureControllers( bool is_success = controller_applet->exec() != QDialog::Rejected; // Don't forget to apply settings. - system->HIDCore().DisableAllControllerConfiguration(); - system->ApplySettings(); + QtCommon::system->HIDCore().DisableAllControllerConfiguration(); + QtCommon::system->ApplySettings(); config->SaveAllValues(); UpdateStatusButtons(); @@ -852,7 +785,7 @@ void GMainWindow::ControllerSelectorRequestExit() { void GMainWindow::ProfileSelectorSelectProfile( const Core::Frontend::ProfileSelectParameters& parameters) { - profile_select_applet = new QtProfileSelectionDialog(*system, this, parameters); + profile_select_applet = new QtProfileSelectionDialog(*QtCommon::system, this, parameters); SCOPE_EXIT { profile_select_applet->deleteLater(); profile_select_applet = nullptr; @@ -867,7 +800,7 @@ void GMainWindow::ProfileSelectorSelectProfile( return; } - const auto uuid = system->GetProfileManager().GetUser( + const auto uuid = QtCommon::system->GetProfileManager().GetUser( static_cast(profile_select_applet->GetIndex())); if (!uuid.has_value()) { emit ProfileSelectorFinishedSelection(std::nullopt); @@ -890,7 +823,7 @@ void GMainWindow::SoftwareKeyboardInitialize( return; } - software_keyboard = new QtSoftwareKeyboardDialog(render_window, *system, is_inline, + software_keyboard = new QtSoftwareKeyboardDialog(render_window, *QtCommon::system, is_inline, std::move(initialize_parameters)); if (is_inline) { @@ -1007,7 +940,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, return; } - web_applet = new QtNXWebEngineView(this, *system, input_subsystem.get()); + web_applet = new QtNXWebEngineView(this, *QtCommon::system, input_subsystem.get()); ui->action_Pause->setEnabled(false); ui->action_Restart->setEnabled(false); @@ -1151,10 +1084,10 @@ void GMainWindow::InitializeWidgets() { #ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING ui->action_Report_Compatibility->setVisible(true); #endif - render_window = new GRenderWindow(this, emu_thread.get(), input_subsystem, *system); + render_window = new GRenderWindow(this, emu_thread.get(), input_subsystem, *QtCommon::system); render_window->hide(); - game_list = new GameList(vfs, provider.get(), *play_time_manager, *system, this); + game_list = new GameList(QtCommon::vfs, QtCommon::provider.get(), *play_time_manager, *QtCommon::system, this); ui->horizontalLayout->addWidget(game_list); game_list_placeholder = new GameListPlaceholder(this); @@ -1164,7 +1097,7 @@ void GMainWindow::InitializeWidgets() { loading_screen = new LoadingScreen(this); loading_screen->hide(); ui->horizontalLayout->addWidget(loading_screen); - connect(loading_screen, &LoadingScreen::Hidden, [&] { + connect(loading_screen, &LoadingScreen::Hidden, this, [&] { loading_screen->Clear(); if (emulation_running) { render_window->show(); @@ -1173,7 +1106,7 @@ void GMainWindow::InitializeWidgets() { }); multiplayer_state = new MultiplayerState(this, game_list->GetModel(), ui->action_Leave_Room, - ui->action_Show_Room, *system); + ui->action_Show_Room, *QtCommon::system); multiplayer_state->setVisible(false); // Create status bar @@ -1427,12 +1360,12 @@ void GMainWindow::InitializeWidgets() { void GMainWindow::InitializeDebugWidgets() { QMenu* debug_menu = ui->menu_View_Debugging; - waitTreeWidget = new WaitTreeWidget(*system, this); + waitTreeWidget = new WaitTreeWidget(*QtCommon::system, this); addDockWidget(Qt::LeftDockWidgetArea, waitTreeWidget); waitTreeWidget->hide(); debug_menu->addAction(waitTreeWidget->toggleViewAction()); - controller_dialog = new ControllerDialog(system->HIDCore(), input_subsystem, this); + controller_dialog = new ControllerDialog(QtCommon::system->HIDCore(), input_subsystem, this); controller_dialog->hide(); debug_menu->addAction(controller_dialog->toggleViewAction()); @@ -1472,7 +1405,7 @@ void GMainWindow::LinkActionShortcut(QAction* action, const QString& action_name this->addAction(action); - auto* controller = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); const auto* controller_hotkey = hotkey_registry.GetControllerHotkey(main_window, action_name.toStdString(), controller); connect( @@ -1517,7 +1450,7 @@ void GMainWindow::InitializeHotkeys() { const auto connect_shortcut = [&](const QString& action_name, const Fn& function) { const auto* hotkey = hotkey_registry.GetHotkey(main_window.toStdString(), action_name.toStdString(), this); - auto* controller = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); const auto* controller_hotkey = hotkey_registry.GetControllerHotkey( main_window.toStdString(), action_name.toStdString(), controller); connect(hotkey, &QShortcut::activated, this, function); @@ -1541,9 +1474,9 @@ void GMainWindow::InitializeHotkeys() { connect_shortcut(QStringLiteral("Toggle Framerate Limit"), [] { Settings::values.use_speed_limit.SetValue(!Settings::values.use_speed_limit.GetValue()); }); - connect_shortcut(QStringLiteral("Toggle Renderdoc Capture"), [this] { + connect_shortcut(QStringLiteral("Toggle Renderdoc Capture"), [] { if (Settings::values.enable_renderdoc_hotkey) { - system->GetRenderdocAPI().ToggleCapture(); + QtCommon::system->GetRenderdocAPI().ToggleCapture(); } }); connect_shortcut(QStringLiteral("Toggle Mouse Panning"), [&] { @@ -1633,8 +1566,9 @@ void GMainWindow::ConnectWidgetEvents() { connect(game_list, &GameList::GameChosen, this, &GMainWindow::OnGameListLoadFile); connect(game_list, &GameList::OpenDirectory, this, &GMainWindow::OnGameListOpenDirectory); connect(game_list, &GameList::OpenFolderRequested, this, &GMainWindow::OnGameListOpenFolder); - connect(game_list, &GameList::OpenTransferableShaderCacheRequested, this, - &GMainWindow::OnTransferableShaderCacheOpenFile); + connect(game_list, &GameList::OpenTransferableShaderCacheRequested, this, [this](u64 program_id) { + QtCommon::Path::OpenShaderCache(program_id, this); + }); connect(game_list, &GameList::RemoveInstalledEntryRequested, this, &GMainWindow::OnGameListRemoveInstalledEntry); connect(game_list, &GameList::RemoveFileRequested, this, &GMainWindow::OnGameListRemoveFile); @@ -1840,16 +1774,25 @@ void GMainWindow::OnDisplayTitleBars(bool show) { void GMainWindow::SetupPrepareForSleep() { #ifdef __unix__ - auto bus = QDBusConnection::systemBus(); - if (bus.isConnected()) { + if (auto bus = QDBusConnection::systemBus(); bus.isConnected()) { + // See https://github.com/ConsoleKit2/ConsoleKit2/issues/150 +#ifdef __linux__ + const auto dbus_logind_service = QStringLiteral("org.freedesktop.login1"); + const auto dbus_logind_path = QStringLiteral("/org/freedesktop/login1"); + const auto dbus_logind_manager_if = QStringLiteral("org.freedesktop.login1.Manager"); + //const auto dbus_logind_session_if = QStringLiteral("org.freedesktop.login1.Session"); +#else + const auto dbus_logind_service = QStringLiteral("org.freedesktop.ConsoleKit"); + const auto dbus_logind_path = QStringLiteral("/org/freedesktop/ConsoleKit/Manager"); + const auto dbus_logind_manager_if = QStringLiteral("org.freedesktop.ConsoleKit.Manager"); + //const auto dbus_logind_session_if = QStringLiteral("org.freedesktop.ConsoleKit.Session"); +#endif const bool success = bus.connect( - QStringLiteral("org.freedesktop.login1"), QStringLiteral("/org/freedesktop/login1"), - QStringLiteral("org.freedesktop.login1.Manager"), QStringLiteral("PrepareForSleep"), + dbus_logind_service, dbus_logind_path, + dbus_logind_manager_if, QStringLiteral("PrepareForSleep"), QStringLiteral("b"), this, SLOT(OnPrepareForSleep(bool))); - - if (!success) { + if (!success) LOG_WARNING(Frontend, "Couldn't register PrepareForSleep signal"); - } } else { LOG_WARNING(Frontend, "QDBusConnection system bus is not connected"); } @@ -1948,13 +1891,13 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa return false; } - system->SetFilesystem(vfs); + QtCommon::system->SetFilesystem(QtCommon::vfs); if (params.launch_type == Service::AM::LaunchType::FrontendInitiated) { - system->GetUserChannel().clear(); + QtCommon::system->GetUserChannel().clear(); } - system->SetFrontendAppletSet({ + QtCommon::system->SetFrontendAppletSet({ std::make_unique(*this), // Amiibo Settings (UISettings::values.controller_applet_disabled.GetValue() == true) ? nullptr @@ -1969,85 +1912,21 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa nullptr, // Net Connect }); - /** Game Updates check */ + /** firmware check */ - // yuzu's configuration doesn't actually support lists so this is a bit hacky - QSettings settings; - QStringList currentIgnored = settings.value("ignoredBadUpdates", {}).toStringList(); - - if (std::find(bad_update_games.begin(), bad_update_games.end(), params.program_id) != - bad_update_games.end() && - !currentIgnored.contains(QString::number(params.program_id))) { - QMessageBox* msg = new QMessageBox(this); - msg->setWindowTitle(tr("Game Updates Warning")); - msg->setIcon(QMessageBox::Warning); - msg->setText( - tr("The game you are trying to launch is known to have performance or booting " - "issues when updates are applied. Please try increasing the memory layout to " - "6GB or 8GB if any issues occur.

Press \"OK\" to continue launching, or " - "\"Cancel\" to cancel the launch.")); - - msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - - QCheckBox* dontShowAgain = new QCheckBox(msg); - dontShowAgain->setText(tr("Don't show again for this game")); - msg->setCheckBox(dontShowAgain); - - int result = msg->exec(); - - // wtf - QMessageBox::ButtonRole role = - msg->buttonRole(msg->button((QMessageBox::StandardButton)result)); - - switch (role) { - case QMessageBox::RejectRole: - return false; - case QMessageBox::AcceptRole: - default: - if (dontShowAgain->isChecked()) { - currentIgnored << QString::number(params.program_id); - settings.setValue("ignoredBadUpdates", currentIgnored); - settings.sync(); - } - break; - } - } - - if (FirmwareManager::GameRequiresFirmware(params.program_id) && - !FirmwareManager::CheckFirmwarePresence(*system)) { - QMessageBox* msg = new QMessageBox(this); - msg->setWindowTitle(tr("Game Requires Firmware")); - msg->setIcon(QMessageBox::Warning); - msg->setText( - tr("The game you are trying to launch requires firmware to boot or to get past the " - "opening menu. Please " - "dump and install firmware, or press \"OK\" to launch anyways.")); - - msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - - int exec_result = msg->exec(); - - QMessageBox::ButtonRole role = - msg->buttonRole(msg->button((QMessageBox::StandardButton)exec_result)); - - switch (role) { - case QMessageBox::RejectRole: - return false; - case QMessageBox::AcceptRole: - default: - break; - } + if (!QtCommon::Content::CheckGameFirmware(params.program_id, this)) { + return false; } /** Exec */ const Core::SystemResultStatus result{ - system->Load(*render_window, filename.toStdString(), params)}; + QtCommon::system->Load(*render_window, filename.toStdString(), params)}; const auto drd_callout = (UISettings::values.callout_flags.GetValue() & static_cast(CalloutFlag::DRDDeprecation)) == 0; if (result == Core::SystemResultStatus::Success && - system->GetAppLoader().GetFileType() == Loader::FileType::DeconstructedRomDirectory && + QtCommon::system->GetAppLoader().GetFileType() == Loader::FileType::DeconstructedRomDirectory && drd_callout) { UISettings::values.callout_flags = UISettings::values.callout_flags.GetValue() | static_cast(CalloutFlag::DRDDeprecation); @@ -2112,7 +1991,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa bool GMainWindow::SelectAndSetCurrentUser( const Core::Frontend::ProfileSelectParameters& parameters) { - QtProfileSelectionDialog dialog(*system, this, parameters); + QtProfileSelectionDialog dialog(*QtCommon::system, this, parameters); dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint); dialog.setWindowModality(Qt::WindowModal); @@ -2127,12 +2006,12 @@ bool GMainWindow::SelectAndSetCurrentUser( void GMainWindow::ConfigureFilesystemProvider(const std::string& filepath) { // Ensure all NCAs are registered before launching the game - const auto file = vfs->OpenFile(filepath, FileSys::OpenMode::Read); + const auto file = QtCommon::vfs->OpenFile(filepath, FileSys::OpenMode::Read); if (!file) { return; } - auto loader = Loader::GetLoader(*system, file); + auto loader = Loader::GetLoader(*QtCommon::system, file); if (!loader) { return; } @@ -2145,7 +2024,7 @@ void GMainWindow::ConfigureFilesystemProvider(const std::string& filepath) { u64 program_id = 0; const auto res2 = loader->ReadProgramId(program_id); if (res2 == Loader::ResultStatus::Success && file_type == Loader::FileType::NCA) { - provider->AddEntry(FileSys::TitleType::Application, + QtCommon::provider->AddEntry(FileSys::TitleType::Application, FileSys::GetCRTypeFromNCAType(FileSys::NCA{file}.GetType()), program_id, file); } else if (res2 == Loader::ResultStatus::Success && @@ -2155,7 +2034,7 @@ void GMainWindow::ConfigureFilesystemProvider(const std::string& filepath) { : FileSys::XCI{file}.GetSecurePartitionNSP(); for (const auto& title : nsp->GetNCAs()) { for (const auto& entry : title.second) { - provider->AddEntry(entry.first.first, entry.first.second, title.first, + QtCommon::provider->AddEntry(entry.first.first, entry.first.second, title.first, entry.second->GetBaseFile()); } } @@ -2181,8 +2060,8 @@ void GMainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletP last_filename_booted = filename; ConfigureFilesystemProvider(filename.toStdString()); - const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData()); - const auto loader = Loader::GetLoader(*system, v_file, params.program_id, params.program_index); + const auto v_file = Core::GetGameFileFromPath(QtCommon::vfs, filename.toUtf8().constData()); + const auto loader = Loader::GetLoader(*QtCommon::system, v_file, params.program_id, params.program_index); if (loader != nullptr && loader->ReadProgramId(title_id) == Loader::ResultStatus::Success && type == StartGameType::Normal) { @@ -2193,8 +2072,8 @@ void GMainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletP ? Common::FS::PathToUTF8String(file_path.filename()) : fmt::format("{:016X}", title_id); QtConfig per_game_config(config_file_name, Config::ConfigType::PerGameConfig); - system->HIDCore().ReloadInputDevices(); - system->ApplySettings(); + QtCommon::system->HIDCore().ReloadInputDevices(); + QtCommon::system->ApplySettings(); } Settings::LogSettings(); @@ -2220,19 +2099,19 @@ void GMainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletP return; } - system->SetShuttingDown(false); + QtCommon::system->SetShuttingDown(false); game_list->setDisabled(true); // Create and start the emulation thread - emu_thread = std::make_unique(*system); + emu_thread = std::make_unique(*QtCommon::system); emit EmulationStarting(emu_thread.get()); emu_thread->start(); // Register an ExecuteProgram callback such that Core can execute a sub-program - system->RegisterExecuteProgramCallback( + QtCommon::system->RegisterExecuteProgramCallback( [this](std::size_t program_index_) { render_window->ExecuteProgram(program_index_); }); - system->RegisterExitCallback([this] { + QtCommon::system->RegisterExitCallback([this] { emu_thread->ForceStop(); render_window->Exit(); }); @@ -2272,11 +2151,11 @@ void GMainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletP std::string title_name; std::string title_version; - const auto res = system->GetGameName(title_name); + const auto res = QtCommon::system->GetGameName(title_name); - const auto metadata = [this, title_id] { - const FileSys::PatchManager pm(title_id, system->GetFileSystemController(), - system->GetContentProvider()); + const auto metadata = [title_id] { + const FileSys::PatchManager pm(title_id, QtCommon::system->GetFileSystemController(), + QtCommon::system->GetContentProvider()); return pm.GetControlMetadata(); }(); if (metadata.first != nullptr) { @@ -2288,16 +2167,16 @@ void GMainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletP std::filesystem::path{Common::U16StringFromBuffer(filename.utf16(), filename.size())} .filename()); } - const bool is_64bit = system->Kernel().ApplicationProcess()->Is64Bit(); + const bool is_64bit = QtCommon::system->Kernel().ApplicationProcess()->Is64Bit(); const auto instruction_set_suffix = is_64bit ? tr("(64-bit)") : tr("(32-bit)"); title_name = tr("%1 %2", "%1 is the title name. %2 indicates if the title is 64-bit or 32-bit") .arg(QString::fromStdString(title_name), instruction_set_suffix) .toStdString(); LOG_INFO(Frontend, "Booting game: {:016X} | {} | {}", title_id, title_name, title_version); - const auto gpu_vendor = system->GPU().Renderer().GetDeviceVendor(); + const auto gpu_vendor = QtCommon::system->GPU().Renderer().GetDeviceVendor(); UpdateWindowTitle(title_name, title_version, gpu_vendor); - loading_screen->Prepare(system->GetAppLoader()); + loading_screen->Prepare(QtCommon::system->GetAppLoader()); loading_screen->show(); emulation_running = true; @@ -2325,11 +2204,11 @@ bool GMainWindow::OnShutdownBegin() { // Disable unlimited frame rate Settings::values.use_speed_limit.SetValue(true); - if (system->IsShuttingDown()) { + if (QtCommon::system->IsShuttingDown()) { return false; } - system->SetShuttingDown(true); + QtCommon::system->SetShuttingDown(true); discord_rpc->Pause(); RequestGameExit(); @@ -2340,9 +2219,9 @@ bool GMainWindow::OnShutdownBegin() { int shutdown_time = 1000; - if (system->DebuggerEnabled()) { + if (QtCommon::system->DebuggerEnabled()) { shutdown_time = 0; - } else if (system->GetExitLocked()) { + } else if (QtCommon::system->GetExitLocked()) { shutdown_time = 5000; } @@ -2360,7 +2239,7 @@ bool GMainWindow::OnShutdownBegin() { } void GMainWindow::OnShutdownBeginDialog() { - shutdown_dialog = new OverlayDialog(this, *system, QString{}, tr("Closing software..."), + shutdown_dialog = new OverlayDialog(this, *QtCommon::system, QString{}, tr("Closing software..."), QString{}, QString{}, Qt::AlignHCenter | Qt::AlignVCenter); shutdown_dialog->open(); } @@ -2412,10 +2291,10 @@ void GMainWindow::OnEmulationStopped() { OnTasStateChanged(); render_window->FinalizeCamera(); - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::None); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::None); // Enable all controllers - system->HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All}); + QtCommon::system->HIDCore().SetSupportedStyleTag({Core::HID::NpadStyleSet::All}); render_window->removeEventFilter(render_window); render_window->setAttribute(Qt::WA_Hover, false); @@ -2444,8 +2323,8 @@ void GMainWindow::OnEmulationStopped() { // Enable game list game_list->setEnabled(true); - Settings::RestoreGlobalState(system->IsPoweredOn()); - system->HIDCore().ReloadInputDevices(); + Settings::RestoreGlobalState(QtCommon::system->IsPoweredOn()); + QtCommon::system->HIDCore().ReloadInputDevices(); UpdateStatusButtons(); } @@ -2454,6 +2333,7 @@ void GMainWindow::ShutdownGame() { return; } + // TODO(crueter): make this common as well (frontend_common?) play_time_manager->Stop(); OnShutdownBegin(); OnEmulationStopTimeExpired(); @@ -2472,7 +2352,7 @@ void GMainWindow::StoreRecentFile(const QString& filename) { void GMainWindow::UpdateRecentFiles() { const int num_recent_files = - std::min(static_cast(UISettings::values.recent_files.size()), max_recent_files_item); + (std::min)(static_cast(UISettings::values.recent_files.size()), max_recent_files_item); for (int i = 0; i < num_recent_files; i++) { const QString text = QStringLiteral("&%1. %2").arg(i + 1).arg( @@ -2498,21 +2378,22 @@ void GMainWindow::OnGameListLoadFile(QString game_path, u64 program_id) { BootGame(game_path, params); } +// TODO(crueter): Common profile selector void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, const std::string& game_path) { std::filesystem::path path; QString open_target; - const auto [user_save_size, device_save_size] = [this, &game_path, &program_id] { - const FileSys::PatchManager pm{program_id, system->GetFileSystemController(), - system->GetContentProvider()}; + const auto [user_save_size, device_save_size] = [&game_path, &program_id] { + const FileSys::PatchManager pm{program_id, QtCommon::system->GetFileSystemController(), + QtCommon::system->GetContentProvider()}; const auto control = pm.GetControlMetadata().first; if (control != nullptr) { return std::make_pair(control->GetDefaultNormalSaveSize(), control->GetDeviceSaveDataSize()); } else { - const auto file = Core::GetGameFileFromPath(vfs, game_path); - const auto loader = Loader::GetLoader(*system, file); + const auto file = Core::GetGameFileFromPath(QtCommon::vfs, game_path); + const auto loader = Loader::GetLoader(*QtCommon::system, file); FileSys::NACP nacp{}; loader->ReadControlData(nacp); @@ -2531,7 +2412,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target open_target = tr("Save Data"); const auto nand_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir); auto vfs_nand_dir = - vfs->OpenDirectory(Common::FS::PathToUTF8String(nand_dir), FileSys::OpenMode::Read); + QtCommon::vfs->OpenDirectory(Common::FS::PathToUTF8String(nand_dir), FileSys::OpenMode::Read); if (has_user_save) { // User save data @@ -2542,7 +2423,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target .display_options = {}, .purpose = Service::AM::Frontend::UserSelectionPurpose::General, }; - QtProfileSelectionDialog dialog(*system, this, parameters); + QtProfileSelectionDialog dialog(*QtCommon::system, this, parameters); dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint); dialog.setWindowModality(Qt::WindowModal); @@ -2560,7 +2441,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target } const auto user_id = - system->GetProfileManager().GetUser(static_cast(index)); + QtCommon::system->GetProfileManager().GetUser(static_cast(index)); ASSERT(user_id); const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath( @@ -2606,19 +2487,6 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target QDesktopServices::openUrl(QUrl::fromLocalFile(qpath)); } -void GMainWindow::OnTransferableShaderCacheOpenFile(u64 program_id) { - const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); - const auto shader_cache_folder_path{shader_cache_dir / fmt::format("{:016x}", program_id)}; - if (!Common::FS::CreateDirs(shader_cache_folder_path)) { - QMessageBox::warning(this, tr("Error Opening Transferable Shader Cache"), - tr("Failed to create the shader cache directory for this title.")); - return; - } - const auto shader_path_string{Common::FS::PathToUTF8String(shader_cache_folder_path)}; - const auto qt_shader_cache_path = QString::fromStdString(shader_path_string); - QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_path)); -} - static bool RomFSRawCopy(size_t total_size, size_t& read_size, QProgressDialog& dialog, const FileSys::VirtualDir& src, const FileSys::VirtualDir& dest, bool full) { @@ -2651,7 +2519,7 @@ static bool RomFSRawCopy(size_t total_size, size_t& read_size, QProgressDialog& if ((new_timestamp - last_timestamp) > 33ms) { last_timestamp = new_timestamp; dialog.setValue( - static_cast(std::min(read_size, total_size) * 100 / total_size)); + static_cast((std::min)(read_size, total_size) * 100 / total_size)); QCoreApplication::processEvents(); } @@ -2681,26 +2549,17 @@ static bool RomFSRawCopy(size_t total_size, size_t& read_size, QProgressDialog& return true; } -QString GMainWindow::GetGameListErrorRemoving(InstalledEntryType type) const { - switch (type) { - case InstalledEntryType::Game: - return tr("Error Removing Contents"); - case InstalledEntryType::Update: - return tr("Error Removing Update"); - case InstalledEntryType::AddOnContent: - return tr("Error Removing DLC"); - default: - return QStringLiteral("Error Removing "); - } -} -void GMainWindow::OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryType type) { +// TODO(crueter): All this can be transfered to qt_common +// Aldoe I need to decide re: message boxes for QML +// translations_common? strings_common? qt_strings? who knows +void GMainWindow::OnGameListRemoveInstalledEntry(u64 program_id, QtCommon::Game::InstalledEntryType type) { const QString entry_question = [type] { switch (type) { - case InstalledEntryType::Game: + case QtCommon::Game::InstalledEntryType::Game: return tr("Remove Installed Game Contents?"); - case InstalledEntryType::Update: + case QtCommon::Game::InstalledEntryType::Update: return tr("Remove Installed Game Update?"); - case InstalledEntryType::AddOnContent: + case QtCommon::Game::InstalledEntryType::AddOnContent: return tr("Remove Installed Game DLC?"); default: return QStringLiteral("Remove Installed Game ?"); @@ -2712,18 +2571,19 @@ void GMainWindow::OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryT return; } + // TODO(crueter): move this to QtCommon (populate async?) switch (type) { - case InstalledEntryType::Game: - RemoveBaseContent(program_id, type); + case QtCommon::Game::InstalledEntryType::Game: + QtCommon::Game::RemoveBaseContent(program_id, type); [[fallthrough]]; - case InstalledEntryType::Update: - RemoveUpdateContent(program_id, type); - if (type != InstalledEntryType::Game) { + case QtCommon::Game::InstalledEntryType::Update: + QtCommon::Game::RemoveUpdateContent(program_id, type); + if (type != QtCommon::Game::InstalledEntryType::Game) { break; } [[fallthrough]]; - case InstalledEntryType::AddOnContent: - RemoveAddOnContent(program_id, type); + case QtCommon::Game::InstalledEntryType::AddOnContent: + QtCommon::Game::RemoveAddOnContent(program_id, type); break; } Common::FS::RemoveDirRecursively(Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) / @@ -2731,55 +2591,19 @@ void GMainWindow::OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryT game_list->PopulateAsync(UISettings::values.game_dirs); } -void GMainWindow::RemoveBaseContent(u64 program_id, InstalledEntryType type) { - const auto res = - ContentManager::RemoveBaseContent(system->GetFileSystemController(), program_id); - if (res) { - QMessageBox::information(this, tr("Successfully Removed"), - tr("Successfully removed the installed base game.")); - } else { - QMessageBox::warning( - this, GetGameListErrorRemoving(type), - tr("The base game is not installed in the NAND and cannot be removed.")); - } -} - -void GMainWindow::RemoveUpdateContent(u64 program_id, InstalledEntryType type) { - const auto res = ContentManager::RemoveUpdate(system->GetFileSystemController(), program_id); - if (res) { - QMessageBox::information(this, tr("Successfully Removed"), - tr("Successfully removed the installed update.")); - } else { - QMessageBox::warning(this, GetGameListErrorRemoving(type), - tr("There is no update installed for this title.")); - } -} - -void GMainWindow::RemoveAddOnContent(u64 program_id, InstalledEntryType type) { - const size_t count = ContentManager::RemoveAllDLC(*system, program_id); - if (count == 0) { - QMessageBox::warning(this, GetGameListErrorRemoving(type), - tr("There are no DLC installed for this title.")); - return; - } - - QMessageBox::information(this, tr("Successfully Removed"), - tr("Successfully removed %1 installed DLC.").arg(count)); -} - -void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target, +void GMainWindow::OnGameListRemoveFile(u64 program_id, QtCommon::Game::GameListRemoveTarget target, const std::string& game_path) { const QString question = [target] { switch (target) { - case GameListRemoveTarget::GlShaderCache: + case QtCommon::Game::GameListRemoveTarget::GlShaderCache: return tr("Delete OpenGL Transferable Shader Cache?"); - case GameListRemoveTarget::VkShaderCache: + case QtCommon::Game::GameListRemoveTarget::VkShaderCache: return tr("Delete Vulkan Transferable Shader Cache?"); - case GameListRemoveTarget::AllShaderCache: + case QtCommon::Game::GameListRemoveTarget::AllShaderCache: return tr("Delete All Transferable Shader Caches?"); - case GameListRemoveTarget::CustomConfiguration: + case QtCommon::Game::GameListRemoveTarget::CustomConfiguration: return tr("Remove Custom Game Configuration?"); - case GameListRemoveTarget::CacheStorage: + case QtCommon::Game::GameListRemoveTarget::CacheStorage: return tr("Remove Cache Storage?"); default: return QString{}; @@ -2792,20 +2616,20 @@ void GMainWindow::OnGameListRemoveFile(u64 program_id, GameListRemoveTarget targ } switch (target) { - case GameListRemoveTarget::VkShaderCache: - RemoveVulkanDriverPipelineCache(program_id); + case QtCommon::Game::GameListRemoveTarget::VkShaderCache: + QtCommon::Game::RemoveVulkanDriverPipelineCache(program_id); [[fallthrough]]; - case GameListRemoveTarget::GlShaderCache: - RemoveTransferableShaderCache(program_id, target); + case QtCommon::Game::GameListRemoveTarget::GlShaderCache: + QtCommon::Game::RemoveTransferableShaderCache(program_id, target); break; - case GameListRemoveTarget::AllShaderCache: - RemoveAllTransferableShaderCaches(program_id); + case QtCommon::Game::GameListRemoveTarget::AllShaderCache: + QtCommon::Game::RemoveAllTransferableShaderCaches(program_id); break; - case GameListRemoveTarget::CustomConfiguration: - RemoveCustomConfiguration(program_id, game_path); + case QtCommon::Game::GameListRemoveTarget::CustomConfiguration: + QtCommon::Game::RemoveCustomConfiguration(program_id, game_path); break; - case GameListRemoveTarget::CacheStorage: - RemoveCacheStorage(program_id); + case QtCommon::Game::GameListRemoveTarget::CacheStorage: + QtCommon::Game::RemoveCacheStorage(program_id); break; } } @@ -2821,107 +2645,6 @@ void GMainWindow::OnGameListRemovePlayTimeData(u64 program_id) { game_list->PopulateAsync(UISettings::values.game_dirs); } -void GMainWindow::RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target) { - const auto target_file_name = [target] { - switch (target) { - case GameListRemoveTarget::GlShaderCache: - return "opengl.bin"; - case GameListRemoveTarget::VkShaderCache: - return "vulkan.bin"; - default: - return ""; - } - }(); - const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); - const auto shader_cache_folder_path = shader_cache_dir / fmt::format("{:016x}", program_id); - const auto target_file = shader_cache_folder_path / target_file_name; - - if (!Common::FS::Exists(target_file)) { - QMessageBox::warning(this, tr("Error Removing Transferable Shader Cache"), - tr("A shader cache for this title does not exist.")); - return; - } - if (Common::FS::RemoveFile(target_file)) { - QMessageBox::information(this, tr("Successfully Removed"), - tr("Successfully removed the transferable shader cache.")); - } else { - QMessageBox::warning(this, tr("Error Removing Transferable Shader Cache"), - tr("Failed to remove the transferable shader cache.")); - } -} - -void GMainWindow::RemoveVulkanDriverPipelineCache(u64 program_id) { - static constexpr std::string_view target_file_name = "vulkan_pipelines.bin"; - - const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); - const auto shader_cache_folder_path = shader_cache_dir / fmt::format("{:016x}", program_id); - const auto target_file = shader_cache_folder_path / target_file_name; - - if (!Common::FS::Exists(target_file)) { - return; - } - if (!Common::FS::RemoveFile(target_file)) { - QMessageBox::warning(this, tr("Error Removing Vulkan Driver Pipeline Cache"), - tr("Failed to remove the driver pipeline cache.")); - } -} - -void GMainWindow::RemoveAllTransferableShaderCaches(u64 program_id) { - const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); - const auto program_shader_cache_dir = shader_cache_dir / fmt::format("{:016x}", program_id); - - if (!Common::FS::Exists(program_shader_cache_dir)) { - QMessageBox::warning(this, tr("Error Removing Transferable Shader Caches"), - tr("A shader cache for this title does not exist.")); - return; - } - if (Common::FS::RemoveDirRecursively(program_shader_cache_dir)) { - QMessageBox::information(this, tr("Successfully Removed"), - tr("Successfully removed the transferable shader caches.")); - } else { - QMessageBox::warning(this, tr("Error Removing Transferable Shader Caches"), - tr("Failed to remove the transferable shader cache directory.")); - } -} - -void GMainWindow::RemoveCustomConfiguration(u64 program_id, const std::string& game_path) { - const auto file_path = std::filesystem::path(Common::FS::ToU8String(game_path)); - const auto config_file_name = - program_id == 0 ? Common::FS::PathToUTF8String(file_path.filename()).append(".ini") - : fmt::format("{:016X}.ini", program_id); - const auto custom_config_file_path = - Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir) / "custom" / config_file_name; - - if (!Common::FS::Exists(custom_config_file_path)) { - QMessageBox::warning(this, tr("Error Removing Custom Configuration"), - tr("A custom configuration for this title does not exist.")); - return; - } - - if (Common::FS::RemoveFile(custom_config_file_path)) { - QMessageBox::information(this, tr("Successfully Removed"), - tr("Successfully removed the custom game configuration.")); - } else { - QMessageBox::warning(this, tr("Error Removing Custom Configuration"), - tr("Failed to remove the custom game configuration.")); - } -} - -void GMainWindow::RemoveCacheStorage(u64 program_id) { - const auto nand_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir); - auto vfs_nand_dir = - vfs->OpenDirectory(Common::FS::PathToUTF8String(nand_dir), FileSys::OpenMode::Read); - - const auto cache_storage_path = FileSys::SaveDataFactory::GetFullPath( - {}, vfs_nand_dir, FileSys::SaveDataSpaceId::User, FileSys::SaveDataType::Cache, - 0 /* program_id */, {}, 0); - - const auto path = Common::FS::ConcatPathSafe(nand_dir, cache_storage_path); - - // Not an error if it wasn't cleared. - Common::FS::RemoveDirRecursively(path); -} - void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target) { const auto failed = [this] { @@ -2931,7 +2654,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa }; const auto loader = - Loader::GetLoader(*system, vfs->OpenFile(game_path, FileSys::OpenMode::Read)); + Loader::GetLoader(*QtCommon::system, QtCommon::vfs->OpenFile(game_path, FileSys::OpenMode::Read)); if (loader == nullptr) { failed(); return; @@ -2940,7 +2663,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa FileSys::VirtualFile packed_update_raw{}; loader->ReadUpdateRaw(packed_update_raw); - const auto& installed = system->GetContentProvider(); + const auto& installed = QtCommon::system->GetContentProvider(); u64 title_id{}; u8 raw_type{}; @@ -2972,14 +2695,14 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa const auto path = Common::FS::PathToUTF8String(dump_dir / romfs_dir); - const FileSys::PatchManager pm{title_id, system->GetFileSystemController(), installed}; + const FileSys::PatchManager pm{title_id, QtCommon::system->GetFileSystemController(), installed}; auto romfs = pm.PatchRomFS(base_nca.get(), base_romfs, type, packed_update_raw, false); - const auto out = VfsFilesystemCreateDirectoryWrapper(vfs, path, FileSys::OpenMode::ReadWrite); + const auto out = VfsFilesystemCreateDirectoryWrapper(path, FileSys::OpenMode::ReadWrite); if (out == nullptr) { failed(); - vfs->DeleteDirectory(path); + QtCommon::vfs->DeleteDirectory(path); return; } @@ -2993,7 +2716,7 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa selections, 0, false, &ok); if (!ok) { failed(); - vfs->DeleteDirectory(path); + QtCommon::vfs->DeleteDirectory(path); return; } @@ -3033,41 +2756,13 @@ void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pa } else { progress.close(); failed(); - vfs->DeleteDirectory(path); + QtCommon::vfs->DeleteDirectory(path); } } +// END void GMainWindow::OnGameListVerifyIntegrity(const std::string& game_path) { - const auto NotImplemented = [this] { - QMessageBox::warning(this, tr("Integrity verification couldn't be performed!"), - tr("File contents were not checked for validity.")); - }; - - QProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, this); - progress.setWindowModality(Qt::WindowModal); - progress.setMinimumDuration(100); - progress.setAutoClose(false); - progress.setAutoReset(false); - - const auto QtProgressCallback = [&](size_t total_size, size_t processed_size) { - progress.setValue(static_cast((processed_size * 100) / total_size)); - return progress.wasCanceled(); - }; - - const auto result = ContentManager::VerifyGameContents(*system, game_path, QtProgressCallback); - progress.close(); - switch (result) { - case ContentManager::GameVerificationResult::Success: - QMessageBox::information(this, tr("Integrity verification succeeded!"), - tr("The operation completed successfully.")); - break; - case ContentManager::GameVerificationResult::Failed: - QMessageBox::critical(this, tr("Integrity verification failed!"), - tr("File contents may be corrupt.")); - break; - case ContentManager::GameVerificationResult::NotImplemented: - NotImplemented(); - } + QtCommon::Content::VerifyGameContents(game_path); } void GMainWindow::OnGameListCopyTID(u64 program_id) { @@ -3088,172 +2783,12 @@ void GMainWindow::OnGameListNavigateToGamedbEntry(u64 program_id, QUrl(QStringLiteral("https://eden-emulator.github.io/game/") + directory)); } -bool GMainWindow::CreateShortcutLink(const std::filesystem::path& shortcut_path, - const std::string& comment, - const std::filesystem::path& icon_path, - const std::filesystem::path& command, - const std::string& arguments, const std::string& categories, - const std::string& keywords, const std::string& name) try { -#if defined(__linux__) || defined(__FreeBSD__) // Linux and FreeBSD - std::filesystem::path shortcut_path_full = shortcut_path / (name + ".desktop"); - std::ofstream shortcut_stream(shortcut_path_full, std::ios::binary | std::ios::trunc); - if (!shortcut_stream.is_open()) { - LOG_ERROR(Frontend, "Failed to create shortcut"); - return false; - } - // TODO: Migrate fmt::print to std::print in futures STD C++ 23. - fmt::print(shortcut_stream, "[Desktop Entry]\n"); - fmt::print(shortcut_stream, "Type=Application\n"); - fmt::print(shortcut_stream, "Version=1.0\n"); - fmt::print(shortcut_stream, "Name={}\n", name); - if (!comment.empty()) { - fmt::print(shortcut_stream, "Comment={}\n", comment); - } - if (std::filesystem::is_regular_file(icon_path)) { - fmt::print(shortcut_stream, "Icon={}\n", icon_path.string()); - } - fmt::print(shortcut_stream, "TryExec={}\n", command.string()); - fmt::print(shortcut_stream, "Exec={} {}\n", command.string(), arguments); - if (!categories.empty()) { - fmt::print(shortcut_stream, "Categories={}\n", categories); - } - if (!keywords.empty()) { - fmt::print(shortcut_stream, "Keywords={}\n", keywords); - } - return true; -#elif defined(_WIN32) // Windows - HRESULT hr = CoInitialize(nullptr); - if (FAILED(hr)) { - LOG_ERROR(Frontend, "CoInitialize failed"); - return false; - } - SCOPE_EXIT { - CoUninitialize(); - }; - IShellLinkW* ps1 = nullptr; - IPersistFile* persist_file = nullptr; - SCOPE_EXIT { - if (persist_file != nullptr) { - persist_file->Release(); - } - if (ps1 != nullptr) { - ps1->Release(); - } - }; - HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLinkW, - reinterpret_cast(&ps1)); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to create IShellLinkW instance"); - return false; - } - hres = ps1->SetPath(command.c_str()); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to set path"); - return false; - } - if (!arguments.empty()) { - hres = ps1->SetArguments(Common::UTF8ToUTF16W(arguments).data()); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to set arguments"); - return false; - } - } - if (!comment.empty()) { - hres = ps1->SetDescription(Common::UTF8ToUTF16W(comment).data()); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to set description"); - return false; - } - } - if (std::filesystem::is_regular_file(icon_path)) { - hres = ps1->SetIconLocation(icon_path.c_str(), 0); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to set icon location"); - return false; - } - } - hres = ps1->QueryInterface(IID_IPersistFile, reinterpret_cast(&persist_file)); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to get IPersistFile interface"); - return false; - } - hres = persist_file->Save(std::filesystem::path{shortcut_path / (name + ".lnk")}.c_str(), TRUE); - if (FAILED(hres)) { - LOG_ERROR(Frontend, "Failed to save shortcut"); - return false; - } - return true; -#else // Unsupported platform - return false; -#endif -} catch (const std::exception& e) { - LOG_ERROR(Frontend, "Failed to create shortcut: {}", e.what()); - return false; -} -// Messages in pre-defined message boxes for less code spaghetti -bool GMainWindow::CreateShortcutMessagesGUI(QWidget* parent, int imsg, const QString& game_title) { - int result = 0; - QMessageBox::StandardButtons buttons; - switch (imsg) { - case GMainWindow::CREATE_SHORTCUT_MSGBOX_FULLSCREEN_YES: - buttons = QMessageBox::Yes | QMessageBox::No; - result = - QMessageBox::information(parent, tr("Create Shortcut"), - tr("Do you want to launch the game in fullscreen?"), buttons); - return result == QMessageBox::Yes; - case GMainWindow::CREATE_SHORTCUT_MSGBOX_SUCCESS: - QMessageBox::information(parent, tr("Create Shortcut"), - tr("Successfully created a shortcut to %1").arg(game_title)); - return false; - case GMainWindow::CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING: - buttons = QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::Cancel; - result = - QMessageBox::warning(this, tr("Create Shortcut"), - tr("This will create a shortcut to the current AppImage. This may " - "not work well if you update. Continue?"), - buttons); - return result == QMessageBox::Ok; - default: - buttons = QMessageBox::Ok; - QMessageBox::critical(parent, tr("Create Shortcut"), - tr("Failed to create a shortcut to %1").arg(game_title), buttons); - return false; - } -} - -bool GMainWindow::MakeShortcutIcoPath(const u64 program_id, const std::string_view game_file_name, - std::filesystem::path& out_icon_path) { - // Get path to Yuzu icons directory & icon extension - std::string ico_extension = "png"; -#if defined(_WIN32) - out_icon_path = Common::FS::GetEdenPath(Common::FS::EdenPath::IconsDir); - ico_extension = "ico"; -#elif defined(__linux__) || defined(__FreeBSD__) - out_icon_path = Common::FS::GetDataDirectory("XDG_DATA_HOME") / "icons/hicolor/256x256"; -#endif - // Create icons directory if it doesn't exist - if (!Common::FS::CreateDirs(out_icon_path)) { - QMessageBox::critical( - this, tr("Create Icon"), - tr("Cannot create icon file. Path \"%1\" does not exist and cannot be created.") - .arg(QString::fromStdString(out_icon_path.string())), - QMessageBox::StandardButton::Ok); - out_icon_path.clear(); - return false; - } - - // Create icon file path - out_icon_path /= (program_id == 0 ? fmt::format("eden-{}.{}", game_file_name, ico_extension) - : fmt::format("eden-{:016X}.{}", program_id, ico_extension)); - return true; -} - void GMainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path, - GameListShortcutTarget target) { + const QtCommon::Game::ShortcutTarget target) { // Create shortcut std::string arguments = fmt::format("-g \"{:s}\"", game_path); - CreateShortcut(game_path, program_id, "", target, arguments, true); + QtCommon::Game::CreateShortcut(game_path, program_id, "", target, arguments, true); } void GMainWindow::OnGameListOpenDirectory(const QString& directory) { @@ -3308,8 +2843,8 @@ void GMainWindow::OnGameListShowList(bool show) { void GMainWindow::OnGameListOpenPerGameProperties(const std::string& file) { u64 title_id{}; - const auto v_file = Core::GetGameFileFromPath(vfs, file); - const auto loader = Loader::GetLoader(*system, v_file); + const auto v_file = Core::GetGameFileFromPath(QtCommon::vfs, file); + const auto loader = Loader::GetLoader(*QtCommon::system, v_file); if (loader == nullptr || loader->ReadProgramId(title_id) != Loader::ResultStatus::Success) { QMessageBox::information(this, tr("Properties"), @@ -3436,8 +2971,8 @@ void GMainWindow::OnMenuInstallToNAND() { } return false; }; - future = QtConcurrent::run([this, &file, progress_callback] { - return ContentManager::InstallNSP(*system, *vfs, file.toStdString(), + future = QtConcurrent::run([&file, progress_callback] { + return ContentManager::InstallNSP(*QtCommon::system, *QtCommon::vfs, file.toStdString(), progress_callback); }); @@ -3529,7 +3064,7 @@ ContentManager::InstallResult GMainWindow::InstallNCA(const QString& filename) { } const bool is_application = index >= static_cast(FileSys::TitleType::Application); - const auto& fs_controller = system->GetFileSystemController(); + const auto& fs_controller = QtCommon::system->GetFileSystemController(); auto* registered_cache = is_application ? fs_controller.GetUserNANDContents() : fs_controller.GetSystemNANDContents(); @@ -3540,7 +3075,7 @@ ContentManager::InstallResult GMainWindow::InstallNCA(const QString& filename) { } return false; }; - return ContentManager::InstallNCA(*vfs, filename.toStdString(), *registered_cache, + return ContentManager::InstallNCA(*QtCommon::vfs, filename.toStdString(), *registered_cache, static_cast(index), progress_callback); } @@ -3569,7 +3104,7 @@ void GMainWindow::OnStartGame() { UpdateMenuState(); OnTasStateChanged(); - play_time_manager->SetProgramId(system->GetApplicationProcessProgramID()); + play_time_manager->SetProgramId(QtCommon::system->GetApplicationProcessProgramID()); play_time_manager->Start(); discord_rpc->Update(); @@ -3580,7 +3115,7 @@ void GMainWindow::OnStartGame() { } void GMainWindow::OnRestartGame() { - if (!system->IsPoweredOn()) { + if (!QtCommon::system->IsPoweredOn()) { return; } @@ -3628,7 +3163,7 @@ void GMainWindow::OnStopGame() { bool GMainWindow::ConfirmShutdownGame() { if (UISettings::values.confirm_before_stopping.GetValue() == ConfirmStop::Ask_Always) { - if (system->GetExitLocked()) { + if (QtCommon::system->GetExitLocked()) { if (!ConfirmForceLockedExit()) { return false; } @@ -3640,7 +3175,7 @@ bool GMainWindow::ConfirmShutdownGame() { } else { if (UISettings::values.confirm_before_stopping.GetValue() == ConfirmStop::Ask_Based_On_Game && - system->GetExitLocked()) { + QtCommon::system->GetExitLocked()) { if (!ConfirmForceLockedExit()) { return false; } @@ -3667,12 +3202,12 @@ void GMainWindow::OnExit() { } void GMainWindow::OnSaveConfig() { - system->ApplySettings(); + QtCommon::system->ApplySettings(); config->SaveAllValues(); } void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) { - error_applet = new OverlayDialog(render_window, *system, error_code, error_text, QString{}, + error_applet = new OverlayDialog(render_window, *QtCommon::system, error_code, error_text, QString{}, tr("OK"), Qt::AlignLeft | Qt::AlignVCenter); SCOPE_EXIT { error_applet->deleteLater(); @@ -3901,7 +3436,7 @@ void GMainWindow::OnConfigure() { Settings::SetConfiguringGlobal(true); ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), - vk_device_records, *system, + vk_device_records, *QtCommon::system, !multiplayer_state->IsHostingPublicRoom()); connect(&configure_dialog, &ConfigureDialog::LanguageChanged, this, &GMainWindow::OnLanguageChanged); @@ -4002,7 +3537,7 @@ void GMainWindow::OnConfigure() { UpdateStatusButtons(); controller_dialog->refreshConfiguration(); - system->ApplySettings(); + QtCommon::system->ApplySettings(); } void GMainWindow::OnConfigureTas() { @@ -4010,7 +3545,7 @@ void GMainWindow::OnConfigureTas() { const auto result = dialog.exec(); if (result != QDialog::Accepted && !UISettings::values.configuration_applied) { - Settings::RestoreGlobalState(system->IsPoweredOn()); + Settings::RestoreGlobalState(QtCommon::system->IsPoweredOn()); return; } else if (result == QDialog::Accepted) { dialog.ApplyConfiguration(); @@ -4024,7 +3559,7 @@ void GMainWindow::OnTasStartStop() { } // Disable system buttons to prevent TAS from executing a hotkey - auto* controller = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); controller->ResetSystemButtons(); input_subsystem->GetTas()->StartStop(); @@ -4040,7 +3575,7 @@ void GMainWindow::OnTasRecord() { } // Disable system buttons to prevent TAS from recording a hotkey - auto* controller = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); controller->ResetSystemButtons(); const bool is_recording = input_subsystem->GetTas()->Record(); @@ -4062,8 +3597,8 @@ void GMainWindow::OnTasReset() { void GMainWindow::OnToggleDockedMode() { const bool is_docked = Settings::IsDockedMode(); - auto* player_1 = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); - auto* handheld = system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); + auto* player_1 = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* handheld = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); if (!is_docked && handheld->IsConnected()) { QMessageBox::warning(this, tr("Invalid config detected"), @@ -4078,7 +3613,7 @@ void GMainWindow::OnToggleDockedMode() { Settings::values.use_docked_mode.SetValue(is_docked ? Settings::ConsoleMode::Handheld : Settings::ConsoleMode::Docked); UpdateDockedButton(); - OnDockedModeChanged(is_docked, !is_docked, *system); + OnDockedModeChanged(is_docked, !is_docked, *QtCommon::system); } void GMainWindow::OnToggleGpuAccuracy() { @@ -4095,7 +3630,7 @@ void GMainWindow::OnToggleGpuAccuracy() { } } - system->ApplySettings(); + QtCommon::system->ApplySettings(); UpdateGPUAccuracyButton(); } @@ -4114,7 +3649,7 @@ void GMainWindow::OnDecreaseVolume() { if (current_volume <= 6) { step = 1; } - Settings::values.volume.SetValue(std::max(current_volume - step, 0)); + Settings::values.volume.SetValue((std::max)(current_volume - step, 0)); UpdateVolumeUI(); } @@ -4160,20 +3695,20 @@ void GMainWindow::OnToggleGraphicsAPI() { } void GMainWindow::OnConfigurePerGame() { - const u64 title_id = system->GetApplicationProcessProgramID(); + const u64 title_id = QtCommon::system->GetApplicationProcessProgramID(); OpenPerGameConfiguration(title_id, current_game_path.toStdString()); } void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file_name) { - const auto v_file = Core::GetGameFileFromPath(vfs, file_name); + const auto v_file = Core::GetGameFileFromPath(QtCommon::vfs, file_name); Settings::SetConfiguringGlobal(false); - ConfigurePerGame dialog(this, title_id, file_name, vk_device_records, *system); + ConfigurePerGame dialog(this, title_id, file_name, vk_device_records, *QtCommon::system); dialog.LoadFromFile(v_file); const auto result = dialog.exec(); if (result != QDialog::Accepted && !UISettings::values.configuration_applied) { - Settings::RestoreGlobalState(system->IsPoweredOn()); + Settings::RestoreGlobalState(QtCommon::system->IsPoweredOn()); return; } else if (result == QDialog::Accepted) { dialog.ApplyConfiguration(); @@ -4185,9 +3720,9 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file } // Do not cause the global config to write local settings into the config file - const bool is_powered_on = system->IsPoweredOn(); + const bool is_powered_on = QtCommon::system->IsPoweredOn(); Settings::RestoreGlobalState(is_powered_on); - system->HIDCore().ReloadInputDevices(); + QtCommon::system->HIDCore().ReloadInputDevices(); UISettings::values.configuration_applied = false; @@ -4231,6 +3766,7 @@ void GMainWindow::OnLoadAmiibo() { LoadAmiibo(filename); } +// TODO(crueter): does this need to be ported to QML? bool GMainWindow::question(QWidget* parent, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { @@ -4241,7 +3777,7 @@ bool GMainWindow::question(QWidget* parent, const QString& title, const QString& box_dialog->setDefaultButton(defaultButton); ControllerNavigation* controller_navigation = - new ControllerNavigation(system->HIDCore(), box_dialog); + new ControllerNavigation(QtCommon::system->HIDCore(), box_dialog); connect(controller_navigation, &ControllerNavigation::TriggerKeyboardEvent, [box_dialog](Qt::Key key) { QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier); @@ -4282,184 +3818,36 @@ void GMainWindow::LoadAmiibo(const QString& filename) { } void GMainWindow::OnOpenRootDataFolder() { - QDesktopServices::openUrl( - QUrl(QString::fromStdString(Common::FS::GetEdenPathString(Common::FS::EdenPath::EdenDir)))); + QtCommon::Game::OpenRootDataFolder(); } -void GMainWindow::OnOpenNANDFolder() { - QDesktopServices::openUrl(QUrl::fromLocalFile( - QString::fromStdString(Common::FS::GetEdenPathString(Common::FS::EdenPath::NANDDir)))); +void GMainWindow::OnOpenNANDFolder() +{ + QtCommon::Game::OpenNANDFolder(); } -void GMainWindow::OnOpenSDMCFolder() { - QDesktopServices::openUrl(QUrl::fromLocalFile( - QString::fromStdString(Common::FS::GetEdenPathString(Common::FS::EdenPath::SDMCDir)))); +void GMainWindow::OnOpenSDMCFolder() +{ + QtCommon::Game::OpenSDMCFolder(); } -void GMainWindow::OnOpenModFolder() { - QDesktopServices::openUrl(QUrl::fromLocalFile( - QString::fromStdString(Common::FS::GetEdenPathString(Common::FS::EdenPath::LoadDir)))); +void GMainWindow::OnOpenModFolder() +{ + QtCommon::Game::OpenModFolder(); } -void GMainWindow::OnOpenLogFolder() { - QDesktopServices::openUrl(QUrl::fromLocalFile( - QString::fromStdString(Common::FS::GetEdenPathString(Common::FS::EdenPath::LogDir)))); +void GMainWindow::OnOpenLogFolder() +{ + QtCommon::Game::OpenLogFolder(); } void GMainWindow::OnVerifyInstalledContents() { - // Initialize a progress dialog. - QProgressDialog progress(tr("Verifying integrity..."), tr("Cancel"), 0, 100, this); - progress.setWindowModality(Qt::WindowModal); - progress.setMinimumDuration(100); - progress.setAutoClose(false); - progress.setAutoReset(false); - - // Declare progress callback. - auto QtProgressCallback = [&](size_t total_size, size_t processed_size) { - progress.setValue(static_cast((processed_size * 100) / total_size)); - return progress.wasCanceled(); - }; - - const std::vector result = - ContentManager::VerifyInstalledContents(*system, *provider, QtProgressCallback); - progress.close(); - - if (result.empty()) { - QMessageBox::information(this, tr("Integrity verification succeeded!"), - tr("The operation completed successfully.")); - } else { - const auto failed_names = - QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); - QMessageBox::critical( - this, tr("Integrity verification failed!"), - tr("Verification failed for the following files:\n\n%1").arg(failed_names)); - } + QtCommon::Content::VerifyInstalledContents(); } void GMainWindow::InstallFirmware(const QString& location, bool recursive) { - QProgressDialog progress(tr("Installing Firmware..."), tr("Cancel"), 0, 100, this); - progress.setWindowModality(Qt::WindowModal); - progress.setMinimumDuration(100); - progress.setAutoClose(false); - progress.setAutoReset(false); - progress.show(); - - // Declare progress callback. - auto QtProgressCallback = [&](size_t total_size, size_t processed_size) { - progress.setValue(static_cast((processed_size * 100) / total_size)); - return progress.wasCanceled(); - }; - - LOG_INFO(Frontend, "Installing firmware from {}", location.toStdString()); - - // Check for a reasonable number of .nca files (don't hardcode them, just see if there's some in - // there.) - std::filesystem::path firmware_source_path = location.toStdString(); - if (!Common::FS::IsDir(firmware_source_path)) { - progress.close(); - return; - } - - std::vector out; - const Common::FS::DirEntryCallable callback = - [&out](const std::filesystem::directory_entry& entry) { - if (entry.path().has_extension() && entry.path().extension() == ".nca") { - out.emplace_back(entry.path()); - } - - return true; - }; - - QtProgressCallback(100, 10); - - if (recursive) { - Common::FS::IterateDirEntriesRecursively(firmware_source_path, callback, - Common::FS::DirEntryFilter::File); - } else { - Common::FS::IterateDirEntries(firmware_source_path, callback, - Common::FS::DirEntryFilter::File); - } - - if (out.size() <= 0) { - progress.close(); - QMessageBox::warning(this, tr("Firmware install failed"), - tr("Unable to locate potential firmware NCA files")); - return; - } - - // Locate and erase the content of nand/system/Content/registered/*.nca, if any. - auto sysnand_content_vdir = system->GetFileSystemController().GetSystemNANDContentDirectory(); - if (!sysnand_content_vdir->CleanSubdirectoryRecursive("registered")) { - progress.close(); - QMessageBox::critical(this, tr("Firmware install failed"), - tr("Failed to delete one or more firmware file.")); - return; - } - - LOG_INFO(Frontend, - "Cleaned nand/system/Content/registered folder in preparation for new firmware."); - - QtProgressCallback(100, 20); - - auto firmware_vdir = sysnand_content_vdir->GetDirectoryRelative("registered"); - - bool success = true; - int i = 0; - for (const auto& firmware_src_path : out) { - i++; - auto firmware_src_vfile = - vfs->OpenFile(firmware_src_path.generic_string(), FileSys::OpenMode::Read); - auto firmware_dst_vfile = - firmware_vdir->CreateFileRelative(firmware_src_path.filename().string()); - - if (!VfsRawCopy(firmware_src_vfile, firmware_dst_vfile)) { - LOG_ERROR(Frontend, "Failed to copy firmware file {} to {} in registered folder!", - firmware_src_path.generic_string(), firmware_src_path.filename().string()); - success = false; - } - - if (QtProgressCallback( - 100, 20 + static_cast(((i) / static_cast(out.size())) * 70.0))) { - progress.close(); - QMessageBox::warning( - this, tr("Firmware install failed"), - tr("Firmware installation cancelled, firmware may be in a bad state or corrupted. " - "Restart Eden or re-install firmware.")); - return; - } - } - - if (!success) { - progress.close(); - QMessageBox::critical(this, tr("Firmware install failed"), - tr("One or more firmware files failed to copy into NAND.")); - return; - } - - // Re-scan VFS for the newly placed firmware files. - system->GetFileSystemController().CreateFactories(*vfs); - - auto VerifyFirmwareCallback = [&](size_t total_size, size_t processed_size) { - progress.setValue(90 + static_cast((processed_size * 10) / total_size)); - return progress.wasCanceled(); - }; - - auto result = - ContentManager::VerifyInstalledContents(*system, *provider, VerifyFirmwareCallback, true); - - if (result.size() > 0) { - const auto failed_names = - QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); - progress.close(); - QMessageBox::critical( - this, tr("Firmware integrity verification failed!"), - tr("Verification failed for the following files:\n\n%1").arg(failed_names)); - return; - } - - progress.close(); + QtCommon::Content::InstallFirmware(location, recursive); OnCheckFirmwareDecryption(); - OnCheckFirmware(); } void GMainWindow::OnInstallFirmware() { @@ -4505,32 +3893,14 @@ void GMainWindow::OnInstallFirmwareFromZIP() { return; } - namespace fs = std::filesystem; - fs::path tmp{std::filesystem::temp_directory_path()}; + const QString qCacheDir = QtCommon::Content::UnzipFirmwareToTmp(firmware_zip_location); - if (!std::filesystem::create_directories(tmp / "eden" / "firmware")) { - goto unzipFailed; - } - - { - tmp /= "eden"; - tmp /= "firmware"; - - QString qCacheDir = QString::fromStdString(tmp.string()); - - QFile zip(firmware_zip_location); - - QStringList result = JlCompress::extractDir(&zip, qCacheDir); - if (result.isEmpty()) { - goto unzipFailed; - } - - // In this case, it has to be done recursively, since sometimes people - // will pack it into a subdirectory after dumping + // In this case, it has to be done recursively, since sometimes people + // will pack it into a subdirectory after dumping + if (!qCacheDir.isEmpty()) { InstallFirmware(qCacheDir, true); - std::error_code ec; - std::filesystem::remove_all(tmp, ec); + std::filesystem::remove_all(std::filesystem::temp_directory_path() / "eden" / "firmware", ec); if (ec) { QMessageBox::warning(this, tr("Firmware cleanup failed"), @@ -4539,14 +3909,7 @@ void GMainWindow::OnInstallFirmwareFromZIP() { "again.\nOS reported error: %1") .arg(QString::fromStdString(ec.message()))); } - - return; } -unzipFailed: - QMessageBox::critical( - this, tr("Firmware unzip failed"), - tr("Check write permissions in the system temp directory and try again.")); - return; } void GMainWindow::OnInstallDecryptionKeys() { @@ -4555,32 +3918,10 @@ void GMainWindow::OnInstallDecryptionKeys() { return; } - const QString key_source_location = QFileDialog::getOpenFileName( - this, tr("Select Dumped Keys Location"), {}, QStringLiteral("Decryption Keys (*.keys)"), {}, - QFileDialog::ReadOnly); - if (key_source_location.isEmpty()) { - return; - } + QtCommon::Content::InstallKeys(); - FirmwareManager::KeyInstallResult result = - FirmwareManager::InstallKeys(key_source_location.toStdString(), "keys"); - - system->GetFileSystemController().CreateFactories(*vfs); game_list->PopulateAsync(UISettings::values.game_dirs); - - switch (result) { - case FirmwareManager::KeyInstallResult::Success: - QMessageBox::information(this, tr("Decryption Keys install succeeded"), - tr("Decryption Keys were successfully installed")); - break; - default: - QMessageBox::critical(this, tr("Decryption Keys install failed"), - tr(FirmwareManager::GetKeyInstallResultString(result))); - break; - } - OnCheckFirmwareDecryption(); - OnCheckFirmware(); } void GMainWindow::OnAbout() { @@ -4606,17 +3947,20 @@ void GMainWindow::OnToggleStatusBar() { statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked()); } -void GMainWindow::OnGameListRefresh() { - // force reload add-ons etc - game_list->ForceRefreshGameDirectory(); +void GMainWindow::OnGameListRefresh() +{ + // Resets metadata cache and reloads + QtCommon::Game::ResetMetadata(false); + game_list->RefreshGameDirectory(); + SetFirmwareVersion(); } void GMainWindow::OnAlbum() { constexpr u64 AlbumId = static_cast(Service::AM::AppletProgramId::PhotoViewer); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { QMessageBox::warning(this, tr("No firmware available"), - tr("Please install the firmware to use the Album applet.")); + tr("Please install firmware to use the Album applet.")); return; } @@ -4627,7 +3971,7 @@ void GMainWindow::OnAlbum() { return; } - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::PhotoViewer); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::PhotoViewer); const auto filename = QString::fromStdString(album_nca->GetFullPath()); UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); @@ -4636,10 +3980,10 @@ void GMainWindow::OnAlbum() { void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { constexpr u64 CabinetId = static_cast(Service::AM::AppletProgramId::Cabinet); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { QMessageBox::warning(this, tr("No firmware available"), - tr("Please install the firmware to use the Cabinet applet.")); + tr("Please install firmware to use the Cabinet applet.")); return; } @@ -4650,8 +3994,8 @@ void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { return; } - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Cabinet); - system->GetFrontendAppletHolder().SetCabinetMode(mode); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Cabinet); + QtCommon::system->GetFrontendAppletHolder().SetCabinetMode(mode); const auto filename = QString::fromStdString(cabinet_nca->GetFullPath()); UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); @@ -4660,10 +4004,10 @@ void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) { void GMainWindow::OnMiiEdit() { constexpr u64 MiiEditId = static_cast(Service::AM::AppletProgramId::MiiEdit); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { QMessageBox::warning(this, tr("No firmware available"), - tr("Please install the firmware to use the Mii editor.")); + tr("Please install firmware to use the Mii editor.")); return; } @@ -4674,7 +4018,7 @@ void GMainWindow::OnMiiEdit() { return; } - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::MiiEdit); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::MiiEdit); const auto filename = QString::fromStdString((mii_applet_nca->GetFullPath())); UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); @@ -4683,10 +4027,10 @@ void GMainWindow::OnMiiEdit() { void GMainWindow::OnOpenControllerMenu() { constexpr u64 ControllerAppletId = static_cast(Service::AM::AppletProgramId::Controller); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { QMessageBox::warning(this, tr("No firmware available"), - tr("Please install the firmware to use the Controller Menu.")); + tr("Please install firmware to use the Controller Menu.")); return; } @@ -4698,7 +4042,7 @@ void GMainWindow::OnOpenControllerMenu() { return; } - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Controller); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Controller); const auto filename = QString::fromStdString((controller_applet_nca->GetFullPath())); UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); @@ -4707,14 +4051,43 @@ void GMainWindow::OnOpenControllerMenu() { } void GMainWindow::OnHomeMenu() { - constexpr u64 QLaunchId = static_cast(Service::AM::AppletProgramId::QLaunch); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); - if (!bis_system) { + auto result = FirmwareManager::VerifyFirmware(*QtCommon::system.get()); + + switch (result) { + case FirmwareManager::ErrorFirmwareMissing: QMessageBox::warning(this, tr("No firmware available"), - tr("Please install the firmware to use the Home Menu.")); + tr("Please install firmware to use the Home Menu.")); return; + case FirmwareManager::ErrorFirmwareCorrupted: + QMessageBox::warning(this, tr("Firmware Corrupted"), + tr(FirmwareManager::GetFirmwareCheckString(result))); + return; + case FirmwareManager::ErrorFirmwareTooNew: { + if (!UISettings::values.show_fw_warning.GetValue()) break; + + QMessageBox box(QMessageBox::Warning, + tr("Firmware Too New"), + tr(FirmwareManager::GetFirmwareCheckString(result)) + tr("\nContinue anyways?"), + QMessageBox::Yes | QMessageBox::No, + this); + + QCheckBox *checkbox = new QCheckBox(tr("Don't show again")); + box.setCheckBox(checkbox); + + int button = box.exec(); + if (checkbox->isChecked()) { + UISettings::values.show_fw_warning.SetValue(false); + } + + if (button == static_cast(QMessageBox::No)) return; + break; + } default: + break; } + constexpr u64 QLaunchId = static_cast(Service::AM::AppletProgramId::QLaunch); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); + auto qlaunch_applet_nca = bis_system->GetEntry(QLaunchId, FileSys::ContentRecordType::Program); if (!qlaunch_applet_nca) { QMessageBox::warning(this, tr("Home Menu Applet"), @@ -4722,7 +4095,7 @@ void GMainWindow::OnHomeMenu() { return; } - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::QLaunch); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::QLaunch); const auto filename = QString::fromStdString((qlaunch_applet_nca->GetFullPath())); UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); @@ -4731,10 +4104,10 @@ void GMainWindow::OnHomeMenu() { void GMainWindow::OnInitialSetup() { constexpr u64 Starter = static_cast(Service::AM::AppletProgramId::Starter); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); + auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { QMessageBox::warning(this, tr("No firmware available"), - tr("Please install the firmware to use Starter.")); + tr("Please install firmware to use Starter.")); return; } @@ -4745,7 +4118,7 @@ void GMainWindow::OnInitialSetup() { return; } - system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Starter); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(Service::AM::AppletId::Starter); const auto filename = QString::fromStdString((qlaunch_nca->GetFullPath())); UISettings::values.roms_path = QFileInfo(filename).path().toStdString(); @@ -4753,158 +4126,11 @@ void GMainWindow::OnInitialSetup() { } void GMainWindow::OnCreateHomeMenuDesktopShortcut() { - OnCreateHomeMenuShortcut(GameListShortcutTarget::Desktop); + QtCommon::Game::CreateHomeMenuShortcut(QtCommon::Game::ShortcutTarget::Desktop); } void GMainWindow::OnCreateHomeMenuApplicationMenuShortcut() { - OnCreateHomeMenuShortcut(GameListShortcutTarget::Applications); -} - -std::filesystem::path GMainWindow::GetEdenCommand() { - std::filesystem::path command; - - QString appimage = QString::fromLocal8Bit(getenv("APPIMAGE")); - if (!appimage.isEmpty()) { - command = std::filesystem::path{appimage.toStdString()}; - } else { - const QStringList args = QApplication::arguments(); - command = args[0].toStdString(); - } - - // If relative path, make it an absolute path - if (command.c_str()[0] == '.') { - command = Common::FS::GetCurrentDir() / command; - } - - return command; -} - -std::filesystem::path GMainWindow::GetShortcutPath(GameListShortcutTarget target) { - std::filesystem::path shortcut_path{}; - if (target == GameListShortcutTarget::Desktop) { - shortcut_path = - QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).toStdString(); - } else if (target == GameListShortcutTarget::Applications) { - shortcut_path = - QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation).toStdString(); - } - - return shortcut_path; -} - -void GMainWindow::CreateShortcut(const std::string& game_path, const u64 program_id, - const std::string& game_title_, GameListShortcutTarget target, - std::string arguments_, const bool needs_title) { - // Get path to yuzu executable - std::filesystem::path command = GetEdenCommand(); - - // Shortcut path - std::filesystem::path shortcut_path = GetShortcutPath(target); - - if (!std::filesystem::exists(shortcut_path)) { - GMainWindow::CreateShortcutMessagesGUI( - this, GMainWindow::CREATE_SHORTCUT_MSGBOX_ERROR, - QString::fromStdString(shortcut_path.generic_string())); - LOG_ERROR(Frontend, "Invalid shortcut target {}", shortcut_path.generic_string()); - return; - } - - const FileSys::PatchManager pm{program_id, system->GetFileSystemController(), - system->GetContentProvider()}; - const auto control = pm.GetControlMetadata(); - const auto loader = - Loader::GetLoader(*system, vfs->OpenFile(game_path, FileSys::OpenMode::Read)); - - std::string game_title{game_title_}; - - // Delete illegal characters from title - if (needs_title) { - game_title = fmt::format("{:016X}", program_id); - if (control.first != nullptr) { - game_title = control.first->GetApplicationName(); - } else { - loader->ReadTitle(game_title); - } - } - - const std::string illegal_chars = "<>:\"/\\|?*."; - for (auto it = game_title.rbegin(); it != game_title.rend(); ++it) { - if (illegal_chars.find(*it) != std::string::npos) { - game_title.erase(it.base() - 1); - } - } - - const QString qgame_title = QString::fromStdString(game_title); - - // Get icon from game file - std::vector icon_image_file{}; - if (control.second != nullptr) { - icon_image_file = control.second->ReadAllBytes(); - } else if (loader->ReadIcon(icon_image_file) != Loader::ResultStatus::Success) { - LOG_WARNING(Frontend, "Could not read icon from {:s}", game_path); - } - - QImage icon_data = - QImage::fromData(icon_image_file.data(), static_cast(icon_image_file.size())); - std::filesystem::path out_icon_path; - if (GMainWindow::MakeShortcutIcoPath(program_id, game_title, out_icon_path)) { - if (!SaveIconToFile(out_icon_path, icon_data)) { - LOG_ERROR(Frontend, "Could not write icon to file"); - } - } - -#if defined(__linux__) - // Special case for AppImages - // Warn once if we are making a shortcut to a volatile AppImage - if (command.string().ends_with(".AppImage") && !UISettings::values.shortcut_already_warned) { - if (!GMainWindow::CreateShortcutMessagesGUI( - this, GMainWindow::CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING, qgame_title)) { - return; - } - UISettings::values.shortcut_already_warned = true; - } -#endif // __linux__ - - // Create shortcut - std::string arguments{arguments_}; - if (GMainWindow::CreateShortcutMessagesGUI( - this, GMainWindow::CREATE_SHORTCUT_MSGBOX_FULLSCREEN_YES, qgame_title)) { - arguments = "-f " + arguments; - } - const std::string comment = fmt::format("Start {:s} with the eden Emulator", game_title); - const std::string categories = "Game;Emulator;Qt;"; - const std::string keywords = "Switch;Nintendo;"; - - if (GMainWindow::CreateShortcutLink(shortcut_path, comment, out_icon_path, command, arguments, - categories, keywords, game_title)) { - GMainWindow::CreateShortcutMessagesGUI(this, GMainWindow::CREATE_SHORTCUT_MSGBOX_SUCCESS, - qgame_title); - return; - } - GMainWindow::CreateShortcutMessagesGUI(this, GMainWindow::CREATE_SHORTCUT_MSGBOX_ERROR, - qgame_title); -} - -void GMainWindow::OnCreateHomeMenuShortcut(GameListShortcutTarget target) { - constexpr u64 QLaunchId = static_cast(Service::AM::AppletProgramId::QLaunch); - auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); - if (!bis_system) { - QMessageBox::warning(this, tr("No firmware available"), - tr("Please install firmware to use the home menu.")); - return; - } - - auto qlaunch_nca = bis_system->GetEntry(QLaunchId, FileSys::ContentRecordType::Program); - if (!qlaunch_nca) { - QMessageBox::warning(this, tr("Home Menu Applet"), - tr("Home Menu is not available. Please reinstall firmware.")); - return; - } - - auto qlaunch_applet_nca = bis_system->GetEntry(QLaunchId, FileSys::ContentRecordType::Program); - const auto game_path = qlaunch_applet_nca->GetFullPath(); - - CreateShortcut(game_path, QLaunchId, "Switch Home Menu", target, "-qlaunch", false); + QtCommon::Game::CreateHomeMenuShortcut(QtCommon::Game::ShortcutTarget::Applications); } void GMainWindow::OnCaptureScreenshot() { @@ -4912,7 +4138,7 @@ void GMainWindow::OnCaptureScreenshot() { return; } - const u64 title_id = system->GetApplicationProcessProgramID(); + const u64 title_id = QtCommon::system->GetApplicationProcessProgramID(); const auto screenshot_path = QString::fromStdString(Common::FS::GetEdenPathString(Common::FS::EdenPath::ScreenshotsDir)); const auto date = @@ -4979,27 +4205,25 @@ void GMainWindow::OnEmulatorUpdateAvailable() { update_prompt.addButton(QMessageBox::Yes); update_prompt.addButton(QMessageBox::Ignore); update_prompt.setText( - tr("Update %1 for Eden is available.\nWould you like to download it?").arg(version_string)); + tr("Download the %1 update?").arg(version_string)); update_prompt.exec(); if (update_prompt.button(QMessageBox::Yes) == update_prompt.clickedButton()) { - QDesktopServices::openUrl( - QUrl(QString::fromStdString("https://github.com/eden-emulator/Releases/releases/tag/") + - version_string)); + auto const full_url = fmt::format("{}/{}/releases/tag/", + std::string{Common::g_build_auto_update_website}, + std::string{Common::g_build_auto_update_repo} + ); + QDesktopServices::openUrl(QUrl(QString::fromStdString(full_url) + version_string)); } } #endif -void GMainWindow::UpdateWindowTitle(std::string_view title_name, std::string_view title_version, - std::string_view gpu_vendor) { - const auto description = std::string(Common::g_build_version); - const auto build_id = std::string(Common::g_build_id); - - std::string yuzu_title; - if (Common::g_is_dev_build) { - yuzu_title = fmt::format("Eden Nightly | {}-{}", description, build_id); - } else { - yuzu_title = fmt::format("Eden | {}", description); - } +void GMainWindow::UpdateWindowTitle(std::string_view title_name, std::string_view title_version, std::string_view gpu_vendor) { + static const std::string build_id = std::string{Common::g_build_id}; + static const std::string yuzu_title = fmt::format("{} | {} | {}", + std::string{Common::g_build_name}, + std::string{Common::g_build_version}, + std::string{Common::g_compiler_id} + ); const auto override_title = fmt::format(fmt::runtime(std::string(Common::g_title_bar_format_idle)), build_id); @@ -5073,7 +4297,7 @@ void GMainWindow::OnTasStateChanged() { } void GMainWindow::UpdateStatusBar() { - if (emu_thread == nullptr || !system->IsPoweredOn()) { + if (emu_thread == nullptr || !QtCommon::system->IsPoweredOn()) { status_bar_update_timer.stop(); return; } @@ -5084,8 +4308,8 @@ void GMainWindow::UpdateStatusBar() { tas_label->clear(); } - auto results = system->GetAndResetPerfStats(); - auto& shader_notify = system->GPU().ShaderNotify(); + auto results = QtCommon::system->GetAndResetPerfStats(); + auto& shader_notify = QtCommon::system->GPU().ShaderNotify(); const int shaders_building = shader_notify.ShadersBuilding(); if (shaders_building > 0) { @@ -5231,7 +4455,6 @@ void GMainWindow::OnMouseActivity() { } void GMainWindow::OnCheckFirmwareDecryption() { - system->GetFileSystemController().CreateFactories(*vfs); if (!ContentManager::AreKeysPresent()) { QMessageBox::warning(this, tr("Derivation Components Missing"), tr("Encryption keys are missing.")); @@ -5240,25 +4463,12 @@ void GMainWindow::OnCheckFirmwareDecryption() { UpdateMenuState(); } -void GMainWindow::OnCheckFirmware() { - auto result = FirmwareManager::VerifyFirmware(*system.get()); - - switch (result) { - case FirmwareManager::FirmwareGood: - break; - default: - QMessageBox::warning(this, tr("Firmware Read Error"), - tr(FirmwareManager::GetFirmwareCheckString(result))); - break; - } -} - bool GMainWindow::CheckFirmwarePresence() { - return FirmwareManager::CheckFirmwarePresence(*system.get()); + return FirmwareManager::CheckFirmwarePresence(*QtCommon::system.get()); } void GMainWindow::SetFirmwareVersion() { - const auto pair = FirmwareManager::GetFirmwareVersion(*system.get()); + const auto pair = FirmwareManager::GetFirmwareVersion(*QtCommon::system.get()); const auto firmware_data = pair.first; const auto result = pair.second; @@ -5273,7 +4483,7 @@ void GMainWindow::SetFirmwareVersion() { const std::string display_version(firmware_data.display_version.data()); const std::string display_title(firmware_data.display_title.data()); - LOG_INFO(Frontend, "Installed firmware: {}", display_title); + LOG_INFO(Frontend, "Installed firmware: {}", display_version); firmware_label->setText(QString::fromStdString(display_version)); firmware_label->setToolTip(QString::fromStdString(display_title)); @@ -5344,7 +4554,7 @@ bool GMainWindow::ConfirmClose() { UISettings::values.confirm_before_stopping.GetValue() == ConfirmStop::Ask_Never) { return true; } - if (!system->GetExitLocked() && + if (!QtCommon::system->GetExitLocked() && UISettings::values.confirm_before_stopping.GetValue() == ConfirmStop::Ask_Based_On_Game) { return true; } @@ -5374,7 +4584,7 @@ void GMainWindow::closeEvent(QCloseEvent* event) { render_window->close(); multiplayer_state->Close(); - system->HIDCore().UnloadInputDevices(); + QtCommon::system->HIDCore().UnloadInputDevices(); Network::Shutdown(); QWidget::closeEvent(event); @@ -5445,12 +4655,12 @@ bool GMainWindow::ConfirmForceLockedExit() { } void GMainWindow::RequestGameExit() { - if (!system->IsPoweredOn()) { + if (!QtCommon::system->IsPoweredOn()) { return; } - system->SetExitRequested(true); - system->GetAppletManager().RequestExit(); + QtCommon::system->SetExitRequested(true); + QtCommon::system->GetAppletManager().RequestExit(); } void GMainWindow::filterBarSetChecked(bool state) { @@ -5560,7 +4770,7 @@ void GMainWindow::OnLanguageChanged(const QString& locale) { void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) { #ifdef USE_DISCORD_PRESENCE if (state) { - discord_rpc = std::make_unique(*system); + discord_rpc = std::make_unique(*QtCommon::system); } else { discord_rpc = std::make_unique(); } @@ -5623,13 +4833,13 @@ void VolumeButton::wheelEvent(QWheelEvent* event) { if (num_steps > 0) { Settings::values.volume.SetValue( - std::min(200, Settings::values.volume.GetValue() + num_steps)); + (std::min)(200, Settings::values.volume.GetValue() + num_steps)); } else { Settings::values.volume.SetValue( - std::max(0, Settings::values.volume.GetValue() + num_steps)); + (std::max)(0, Settings::values.volume.GetValue() + num_steps)); } - scroll_multiplier = std::min(MaxMultiplier, scroll_multiplier * 2); + scroll_multiplier = (std::min)(MaxMultiplier, scroll_multiplier * 2); scroll_timer.start(100); // reset the multiplier if no scroll event occurs within 100 ms emit VolumeChanged(); @@ -5670,11 +4880,11 @@ static void SetHighDPIAttributes() { constexpr float minimum_width = 1350.0f; constexpr float minimum_height = 900.0f; - const float width_ratio = std::max(1.0f, real_width / minimum_width); - const float height_ratio = std::max(1.0f, real_height / minimum_height); + const float width_ratio = (std::max)(1.0f, real_width / minimum_width); + const float height_ratio = (std::max)(1.0f, real_height / minimum_height); // Get the lower of the 2 ratios and truncate, this is the maximum integer scale. - const float max_ratio = std::trunc(std::min(width_ratio, height_ratio)); + const float max_ratio = std::trunc((std::min)(width_ratio, height_ratio)); if (max_ratio > real_ratio) { QApplication::setHighDpiScaleFactorRoundingPolicy( @@ -5721,7 +4931,6 @@ int main(int argc, char* argv[]) { #endif Common::DetachedTasks detached_tasks; - Common::ConfigureNvidiaEnvironmentFlags(); // Init settings params QCoreApplication::setOrganizationName(QStringLiteral("eden")); @@ -5730,17 +4939,13 @@ int main(int argc, char* argv[]) { #ifdef _WIN32 // Increases the maximum open file limit to 8192 _setmaxstdio(8192); -#endif - -#ifdef __APPLE__ +#elif defined(__APPLE__) // If you start a bundle (binary) on OSX without the Terminal, the working directory is "/". // But since we require the working directory to be the executable path for the location of // the user folder in the Qt Frontend, we need to cd into that working directory const auto bin_path = Common::FS::GetBundleDirectory() / ".."; chdir(Common::FS::PathToUTF8String(bin_path).c_str()); -#endif - -#ifdef __linux__ +#elif defined(__unix__) && !defined(__ANDROID__) // Set the DISPLAY variable in order to open web browsers // TODO (lat9nq): Find a better solution for AppImages to start external applications if (QString::fromLocal8Bit(qgetenv("DISPLAY")).isEmpty()) { @@ -5749,7 +4954,7 @@ int main(int argc, char* argv[]) { // Fix the Wayland appId. This needs to match the name of the .desktop file without the .desktop // suffix. - QGuiApplication::setDesktopFileName(QStringLiteral("org.eden_emu.eden")); + QGuiApplication::setDesktopFileName(QStringLiteral("dev.eden_emu.eden")); #endif SetHighDPIAttributes(); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 8a34a9f075..e3922759b0 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -17,9 +17,10 @@ #include #include "common/common_types.h" -#include "configuration/qt_config.h" #include "frontend_common/content_manager.h" #include "input_common/drivers/tas_input.h" +#include "qt_common/qt_config.h" +#include "qt_common/qt_game_util.h" #include "user_data_migration.h" #include "yuzu/compatibility_list.h" #include "yuzu/hotkeys.h" @@ -53,10 +54,7 @@ class QSlider; class QHBoxLayout; class WaitTreeWidget; enum class GameListOpenTarget; -enum class GameListRemoveTarget; -enum class GameListShortcutTarget; enum class DumpRomFSTarget; -enum class InstalledEntryType; class GameListPlaceholder; class QtAmiiboSettingsDialog; @@ -72,7 +70,6 @@ enum class StartGameType { namespace Core { enum class SystemResultStatus : u32; -class System; } // namespace Core namespace Core::Frontend { @@ -163,13 +160,6 @@ class GMainWindow : public QMainWindow { /// Max number of recently loaded items to keep track of static const int max_recent_files_item = 10; - enum { - CREATE_SHORTCUT_MSGBOX_FULLSCREEN_YES, - CREATE_SHORTCUT_MSGBOX_SUCCESS, - CREATE_SHORTCUT_MSGBOX_ERROR, - CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING, - }; - public: void filterBarSetChecked(bool state); void UpdateUITheme(); @@ -179,7 +169,7 @@ public: bool DropAction(QDropEvent* event); void AcceptDropEvent(QDropEvent* event); - std::filesystem::path GetShortcutPath(GameListShortcutTarget target); + std::filesystem::path GetShortcutPath(QtCommon::Game::ShortcutTarget target); signals: @@ -258,8 +248,6 @@ private: void LinkActionShortcut(QAction* action, const QString& action_name, const bool tas_allowed = false); - void RegisterMetaTypes(); - void InitializeWidgets(); void InitializeDebugWidgets(); void InitializeRecentFileMenuActions(); @@ -353,9 +341,8 @@ private slots: void OnGameListLoadFile(QString game_path, u64 program_id); void OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, const std::string& game_path); - void OnTransferableShaderCacheOpenFile(u64 program_id); - void OnGameListRemoveInstalledEntry(u64 program_id, InstalledEntryType type); - void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target, + void OnGameListRemoveInstalledEntry(u64 program_id, QtCommon::Game::InstalledEntryType type); + void OnGameListRemoveFile(u64 program_id, QtCommon::Game::GameListRemoveTarget target, const std::string& game_path); void OnGameListRemovePlayTimeData(u64 program_id); void OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target); @@ -363,8 +350,9 @@ private slots: void OnGameListCopyTID(u64 program_id); void OnGameListNavigateToGamedbEntry(u64 program_id, const CompatibilityList& compatibility_list); - void OnGameListCreateShortcut(u64 program_id, const std::string& game_path, - GameListShortcutTarget target); + void OnGameListCreateShortcut(u64 program_id, + const std::string& game_path, + const QtCommon::Game::ShortcutTarget target); void OnGameListOpenDirectory(const QString& directory); void OnGameListAddDirectory(); void OnGameListShowList(bool show); @@ -421,10 +409,8 @@ private slots: void OnInitialSetup(); void OnCreateHomeMenuDesktopShortcut(); void OnCreateHomeMenuApplicationMenuShortcut(); - void OnCreateHomeMenuShortcut(GameListShortcutTarget target); void OnCaptureScreenshot(); void OnCheckFirmwareDecryption(); - void OnCheckFirmware(); void OnLanguageChanged(const QString& locale); void OnMouseActivity(); bool OnShutdownBegin(); @@ -437,16 +423,7 @@ private slots: #endif private: - QString GetGameListErrorRemoving(InstalledEntryType type) const; - void RemoveBaseContent(u64 program_id, InstalledEntryType type); - void RemoveUpdateContent(u64 program_id, InstalledEntryType type); - void RemoveAddOnContent(u64 program_id, InstalledEntryType type); - void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target); - void RemoveVulkanDriverPipelineCache(u64 program_id); - void RemoveAllTransferableShaderCaches(u64 program_id); - void RemoveCustomConfiguration(u64 program_id, const std::string& game_path); void RemovePlayTimeData(u64 program_id); - void RemoveCacheStorage(u64 program_id); bool SelectRomFSDumpTarget(const FileSys::ContentProvider&, u64 program_id, u64* selected_title_id, u8* selected_content_record_type); ContentManager::InstallResult InstallNCA(const QString& filename); @@ -479,13 +456,7 @@ private: QString GetTasStateDescription() const; bool CreateShortcutMessagesGUI(QWidget* parent, int imsg, const QString& game_title); - bool MakeShortcutIcoPath(const u64 program_id, const std::string_view game_file_name, - std::filesystem::path& out_icon_path); - bool CreateShortcutLink(const std::filesystem::path& shortcut_path, const std::string& comment, - const std::filesystem::path& icon_path, - const std::filesystem::path& command, const std::string& arguments, - const std::string& categories, const std::string& keywords, - const std::string& name); + /** * Mimic the behavior of QMessageBox::question but link controller navigation to the dialog * The only difference is that it returns a boolean. @@ -499,7 +470,6 @@ private: std::unique_ptr ui; - std::unique_ptr system; std::unique_ptr discord_rpc; std::unique_ptr play_time_manager; std::shared_ptr input_subsystem; @@ -559,10 +529,6 @@ private: QString startup_icon_theme; - // FS - std::shared_ptr vfs; - std::unique_ptr provider; - // Debugger panes WaitTreeWidget* waitTreeWidget; ControllerDialog* controller_dialog; @@ -609,7 +575,7 @@ private: void CreateShortcut(const std::string& game_path, const u64 program_id, const std::string& game_title, - GameListShortcutTarget target, + QtCommon::Game::ShortcutTarget target, std::string arguments, const bool needs_title); diff --git a/src/yuzu/migration_worker.cpp b/src/yuzu/migration_worker.cpp index 42ec006026..95f205ec0c 100644 --- a/src/yuzu/migration_worker.cpp +++ b/src/yuzu/migration_worker.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include "common/fs/path_util.h" diff --git a/src/yuzu/multiplayer/chat_room.cpp b/src/yuzu/multiplayer/chat_room.cpp index 5925266b40..4c2c41ea2a 100644 --- a/src/yuzu/multiplayer/chat_room.cpp +++ b/src/yuzu/multiplayer/chat_room.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include #include diff --git a/src/yuzu/multiplayer/chat_room.h b/src/yuzu/multiplayer/chat_room.h index f295ea7a7c..e9eb48e824 100644 --- a/src/yuzu/multiplayer/chat_room.h +++ b/src/yuzu/multiplayer/chat_room.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/yuzu/multiplayer/client_room.cpp b/src/yuzu/multiplayer/client_room.cpp index 3453ae34d5..93d6662c1e 100644 --- a/src/yuzu/multiplayer/client_room.cpp +++ b/src/yuzu/multiplayer/client_room.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include #include diff --git a/src/yuzu/multiplayer/client_room.h b/src/yuzu/multiplayer/client_room.h index 6990c56e50..43aad2a2eb 100644 --- a/src/yuzu/multiplayer/client_room.h +++ b/src/yuzu/multiplayer/client_room.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/yuzu/multiplayer/direct_connect.cpp b/src/yuzu/multiplayer/direct_connect.cpp index 30f37c2b4a..deac3b9e59 100644 --- a/src/yuzu/multiplayer/direct_connect.cpp +++ b/src/yuzu/multiplayer/direct_connect.cpp @@ -21,7 +21,7 @@ #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" #include "yuzu/multiplayer/validation.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" enum class ConnectionType : u8 { TraversalServer, IP }; diff --git a/src/yuzu/multiplayer/direct_connect.h b/src/yuzu/multiplayer/direct_connect.h index e7efaecbd2..f9acf262a9 100644 --- a/src/yuzu/multiplayer/direct_connect.h +++ b/src/yuzu/multiplayer/direct_connect.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/yuzu/multiplayer/host_room.cpp b/src/yuzu/multiplayer/host_room.cpp index d8e63da600..4dd3958550 100644 --- a/src/yuzu/multiplayer/host_room.cpp +++ b/src/yuzu/multiplayer/host_room.cpp @@ -25,7 +25,7 @@ #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" #include "yuzu/multiplayer/validation.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #ifdef ENABLE_WEB_SERVICE #include "web_service/verify_user_jwt.h" #endif diff --git a/src/yuzu/multiplayer/host_room.h b/src/yuzu/multiplayer/host_room.h index d9b08d2c8c..a6d38a4c4b 100644 --- a/src/yuzu/multiplayer/host_room.h +++ b/src/yuzu/multiplayer/host_room.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/yuzu/multiplayer/lobby.cpp b/src/yuzu/multiplayer/lobby.cpp index ed6ba6a15c..84723041df 100644 --- a/src/yuzu/multiplayer/lobby.cpp +++ b/src/yuzu/multiplayer/lobby.cpp @@ -22,7 +22,7 @@ #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" #include "yuzu/multiplayer/validation.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #ifdef ENABLE_WEB_SERVICE #include "web_service/web_backend.h" #endif diff --git a/src/yuzu/multiplayer/lobby.h b/src/yuzu/multiplayer/lobby.h index 4d4e7bd5e4..46dec45125 100644 --- a/src/yuzu/multiplayer/lobby.h +++ b/src/yuzu/multiplayer/lobby.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/yuzu/multiplayer/moderation_dialog.cpp b/src/yuzu/multiplayer/moderation_dialog.cpp index 1a06d661d5..9d676eee6a 100644 --- a/src/yuzu/multiplayer/moderation_dialog.cpp +++ b/src/yuzu/multiplayer/moderation_dialog.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include #include diff --git a/src/yuzu/multiplayer/moderation_dialog.h b/src/yuzu/multiplayer/moderation_dialog.h index 4d32a6895e..e689a00e02 100644 --- a/src/yuzu/multiplayer/moderation_dialog.h +++ b/src/yuzu/multiplayer/moderation_dialog.h @@ -1,9 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #pragma once #include diff --git a/src/yuzu/multiplayer/state.cpp b/src/yuzu/multiplayer/state.cpp index d5529712b0..8cbb63d660 100644 --- a/src/yuzu/multiplayer/state.cpp +++ b/src/yuzu/multiplayer/state.cpp @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include #include @@ -19,7 +18,7 @@ #include "yuzu/multiplayer/lobby.h" #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" -#include "yuzu/uisettings.h" +#include "qt_common/uisettings.h" #include "yuzu/util/clickable_label.h" MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_list_model_, diff --git a/src/yuzu/multiplayer/state.h b/src/yuzu/multiplayer/state.h index 4d3dde2162..a0cf8f7ac8 100644 --- a/src/yuzu/multiplayer/state.h +++ b/src/yuzu/multiplayer/state.h @@ -1,8 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/yuzu/play_time_manager.cpp b/src/yuzu/play_time_manager.cpp index 2669e3a7ab..6d06bc7614 100644 --- a/src/yuzu/play_time_manager.cpp +++ b/src/yuzu/play_time_manager.cpp @@ -1,7 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/alignment.h" #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" @@ -168,7 +170,7 @@ QString ReadablePlayTime(qulonglong time_seconds) { if (time_seconds == 0) { return {}; } - const auto time_minutes = std::max(static_cast(time_seconds) / 60, 1.0); + const auto time_minutes = (std::max)(static_cast(time_seconds) / 60, 1.0); const auto time_hours = static_cast(time_seconds) / 3600; const bool is_minutes = time_minutes < 60; const char* unit = is_minutes ? "m" : "h"; diff --git a/src/yuzu/play_time_manager.h b/src/yuzu/play_time_manager.h index 1714b91313..cd81bdb061 100644 --- a/src/yuzu/play_time_manager.h +++ b/src/yuzu/play_time_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,8 +12,9 @@ #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/polyfill_thread.h" +#include +// TODO(crueter): Extract this into frontend_common namespace Service::Account { class ProfileManager; } diff --git a/src/yuzu/qt_common.h b/src/yuzu/qt_common.h deleted file mode 100644 index 9c63f08f34..0000000000 --- a/src/yuzu/qt_common.h +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include "core/frontend/emu_window.h" - -namespace QtCommon { - -Core::Frontend::WindowSystemType GetWindowSystemType(); - -Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window); - -} // namespace QtCommon diff --git a/src/yuzu/update_checker.cpp b/src/yuzu/update_checker.cpp index 8291987d73..e54eb8d7f8 100644 --- a/src/yuzu/update_checker.cpp +++ b/src/yuzu/update_checker.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -12,6 +15,7 @@ #include #include #include +#include "common/scm_rev.h" std::optional UpdateChecker::GetResponse(std::string url, std::string path) { @@ -54,8 +58,8 @@ std::optional UpdateChecker::GetResponse(std::string url, std::stri std::optional UpdateChecker::GetLatestRelease(bool include_prereleases) { - constexpr auto update_check_url = "http://api.github.com"; - std::string update_check_path = "/repos/eden-emulator/Releases"; + const auto update_check_url = std::string{Common::g_build_auto_update_api}; + std::string update_check_path = fmt::format("/repos/{}", std::string{Common::g_build_auto_update_repo}); try { if (include_prereleases) { // This can return either a prerelease or a stable release, // whichever is more recent. diff --git a/src/yuzu/user_data_migration.h b/src/yuzu/user_data_migration.h index 3684d14916..a3ac2c15d3 100644 --- a/src/yuzu/user_data_migration.h +++ b/src/yuzu/user_data_migration.h @@ -10,6 +10,7 @@ #include #include "migration_worker.h" +// TODO(crueter): Quick implementation class UserDataMigrator { public: UserDataMigrator(QMainWindow* main_window); diff --git a/src/yuzu/util/util.cpp b/src/yuzu/util/util.cpp index e22cf84bf1..844da5c401 100644 --- a/src/yuzu/util/util.cpp +++ b/src/yuzu/util/util.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,7 +30,7 @@ QString ReadableByteSize(qulonglong size) { return QStringLiteral("0"); } - const int digit_groups = std::min(static_cast(std::log10(size) / std::log10(1024)), + const int digit_groups = (std::min)(static_cast(std::log10(size) / std::log10(1024)), static_cast(units.size())); return QStringLiteral("%L1 %2") .arg(size / std::pow(1024, digit_groups), 0, 'f', 1) @@ -138,7 +141,7 @@ bool SaveIconToFile(const std::filesystem::path& icon_path, const QImage& image) icon_file.Close(); return true; -#elif defined(__linux__) || defined(__FreeBSD__) +#elif defined(__unix__) && !defined(__APPLE__) && !defined(__ANDROID__) // Convert and write the icon as a PNG if (!image.save(QString::fromStdString(icon_path.string()))) { LOG_ERROR(Frontend, "Could not write icon as PNG to file"); diff --git a/src/yuzu/vk_device_info.cpp b/src/yuzu/vk_device_info.cpp index ab0d39c256..d961d550a1 100644 --- a/src/yuzu/vk_device_info.cpp +++ b/src/yuzu/vk_device_info.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "yuzu/qt_common.h" +#include "qt_common/qt_common.h" #include "common/dynamic_library.h" #include "common/logging/log.h" diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index afd003a86c..a60650bc19 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later @@ -28,7 +31,7 @@ add_executable(yuzu-cmd yuzu.rc ) -target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common) +target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common video_core) target_link_libraries(yuzu-cmd PRIVATE glad) if (MSVC) target_link_libraries(yuzu-cmd PRIVATE getopt) @@ -38,12 +41,7 @@ target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) create_resource("../../dist/yuzu.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR}) -target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2 Vulkan::Headers) - -# In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so -if (PLATFORM_SUN) - target_link_libraries(yuzu-cmd PRIVATE X11 "/usr/lib/xorg/amd64/libdrm.so") -endif() +target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2) if(UNIX AND NOT APPLE) install(TARGETS yuzu-cmd) diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp index 41697a22e8..4b56f3794b 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -49,19 +51,23 @@ InputCommon::MouseButton EmuWindow_SDL2::SDLButtonToMouseButton(u32 button) cons } } -std::pair EmuWindow_SDL2::MouseToTouchPos(s32 touch_x, s32 touch_y) const { - int w, h; +/// @brief Translates pixel position to float position +EmuWindow_SDL2::FloatPairNonHFA EmuWindow_SDL2::MouseToTouchPos(s32 touch_x, s32 touch_y) const { + int w = 0, h = 0; SDL_GetWindowSize(render_window, &w, &h); - const float fx = static_cast(touch_x) / w; - const float fy = static_cast(touch_y) / h; - - return {std::clamp(fx, 0.0f, 1.0f), std::clamp(fy, 0.0f, 1.0f)}; + const float fx = float(touch_x) / w; + const float fy = float(touch_y) / h; + return { + std::clamp(fx, 0.0f, 1.0f), + std::clamp(fy, 0.0f, 1.0f), + 0 + }; } void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) { const auto mouse_button = SDLButtonToMouseButton(button); if (state == SDL_PRESSED) { - const auto [touch_x, touch_y] = MouseToTouchPos(x, y); + auto const [touch_x, touch_y, _] = MouseToTouchPos(x, y); input_subsystem->GetMouse()->PressButton(x, y, mouse_button); input_subsystem->GetMouse()->PressMouseButton(mouse_button); input_subsystem->GetMouse()->PressTouchButton(touch_x, touch_y, mouse_button); @@ -71,7 +77,7 @@ void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) { } void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) { - const auto [touch_x, touch_y] = MouseToTouchPos(x, y); + auto const [touch_x, touch_y, _] = MouseToTouchPos(x, y); input_subsystem->GetMouse()->Move(x, y, 0, 0); input_subsystem->GetMouse()->MouseMove(touch_x, touch_y); input_subsystem->GetMouse()->TouchMove(touch_x, touch_y); @@ -223,7 +229,7 @@ void EmuWindow_SDL2::WaitEvent() { const u32 current_time = SDL_GetTicks(); if (current_time > last_time + 2000) { const auto results = system.GetAndResetPerfStats(); - const auto title = fmt::format("Eden {} | {}-{} | FPS: {:.0f} ({:.0f}%)", + const auto title = fmt::format("{} | {}-{} | FPS: {:.0f} ({:.0f}%)", Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc, diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.h b/src/yuzu_cmd/emu_window/emu_window_sdl2.h index 4ad05e0e16..8aec1efda0 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.h +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.h @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include #include "core/frontend/emu_window.h" @@ -43,8 +46,11 @@ protected: /// Converts a SDL mouse button into MouseInput mouse button InputCommon::MouseButton SDLButtonToMouseButton(u32 button) const; - /// Translates pixel position to float position - std::pair MouseToTouchPos(s32 touch_x, s32 touch_y) const; + // Using std::pair will invoke HFA miscompilation bug on g++10 + // on newer versions it emits an annoying warning, so just not use an HFA + // https://stackoverflow.com/questions/77729813/parameter-passing-for-argument-when-c17-is-enabled-changed-to-match-c14 + using FloatPairNonHFA = std::tuple; + FloatPairNonHFA MouseToTouchPos(s32 touch_x, s32 touch_y) const; /// Called by WaitEvent when a mouse button is pressed or released void OnMouseButton(u32 button, u8 state, s32 x, s32 y); diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp index 4b012fe134..32f365e0d0 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -90,7 +93,7 @@ EmuWindow_SDL2_GL::EmuWindow_SDL2_GL(InputCommon::InputSubsystem* input_subsyste } SDL_GL_SetSwapInterval(0); - std::string window_title = fmt::format("Eden {} | {}-{}", Common::g_build_fullname, + std::string window_title = fmt::format("{} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc); render_window = SDL_CreateWindow(window_title.c_str(), @@ -138,7 +141,7 @@ EmuWindow_SDL2_GL::EmuWindow_SDL2_GL(InputCommon::InputSubsystem* input_subsyste OnResize(); OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); SDL_PumpEvents(); - LOG_INFO(Frontend, "Eden Version: {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, + LOG_INFO(Frontend, "Build string: {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc); Settings::LogSettings(); } diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 599582aba9..4a99f34861 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -16,7 +16,6 @@ #include "common/detached_tasks.h" #include "common/logging/backend.h" #include "common/logging/log.h" -#include "common/nvidia_flags.h" #include "common/scm_rev.h" #include "common/scope_exit.h" #include "common/settings.h" @@ -334,8 +333,6 @@ int main(int argc, char** argv) { LocalFree(argv_w); #endif - Common::ConfigureNvidiaEnvironmentFlags(); - if (filepath.empty()) { LOG_CRITICAL(Frontend, "Failed to load ROM: No ROM specified"); return -1; diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000000..9abd96175b --- /dev/null +++ b/tools/README.md @@ -0,0 +1,21 @@ +# Tools + +Tools for Eden and other subprojects. + +## Third-Party + +- [CPMUtil Scripts](./cpm) + +## Eden + +- `shellcheck.sh`: Ensure POSIX compliance (and syntax sanity) for all tools in this directory and subdirectories. +- `llvmpipe-run.sh`: Sets environment variables needed to run any command (or Eden) with llvmpipe. +- `optimize-assets.sh`: Optimize PNG assets with OptiPng. +- `update-cpm.sh`: Updates CPM.cmake to the latest version. +- `update-icons.sh`: Rebuild all icons (macOS, Windows, bitmaps) based on the master SVG file (`dist/dev.eden_emu.eden.svg`) + * Also optimizes the master SVG + * Requires: `png2icns` (libicns), ImageMagick, [`svgo`](https://github.com/svg/svgo) +- `dtrace-tool.sh` +- `lanczos_gen.c` +- `clang-format.sh`: Runs `clang-format` on the entire codebase. + * Requires: clang diff --git a/tools/clang-format.sh b/tools/clang-format.sh index 77c3c847ad..2deb0a3ade 100755 --- a/tools/clang-format.sh +++ b/tools/clang-format.sh @@ -1,3 +1,6 @@ #! /bin/sh -exec find src -iname *.h -o -iname *.cpp | xargs clang-format-15 -i -style=file:src/.clang-format +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +exec find src -iname "*.h" -o -iname "*.cpp" | xargs clang-format -i -style=file:src/.clang-format diff --git a/tools/cpm-fetch-all.sh b/tools/cpm-fetch-all.sh new file mode 100644 index 0000000000..1e7ff92a67 --- /dev/null +++ b/tools/cpm-fetch-all.sh @@ -0,0 +1,17 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# provided for workflow compat + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +chmod +x tools/cpm/fetch.sh + +# shellcheck disable=SC2086 +tools/cpm/fetch.sh $LIBS diff --git a/tools/cpm-hash.sh b/tools/cpm-hash.sh deleted file mode 100755 index da0fb395db..0000000000 --- a/tools/cpm-hash.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -SUM=`wget -q https://github.com/$1/archive/$2.zip -O - | sha512sum` -echo "$SUM" | cut -d " " -f1 diff --git a/tools/cpm/README.md b/tools/cpm/README.md new file mode 100755 index 0000000000..acd7444518 --- /dev/null +++ b/tools/cpm/README.md @@ -0,0 +1,71 @@ +# CPMUtil Tools + +These are supplemental shell scripts for CPMUtil aiming to ease maintenance burden for sanity checking, updates, prefetching, formatting, and standard operations done by these shell scripts, all in one common place. + +All scripts are POSIX-compliant. + +## Meta + +These scripts are generally reserved for internal use. + +- `common.sh`: Grabs all available cpmfiles and aggregates them together. + * Outputs: + - `PACKAGES`: The aggregated cpmfile + - `LIBS`: The list of individual libraries contained within each cpmfile + - `value`: A function that grabs a key from the `JSON` variable (typically the package key) +- `download.sh`: Utility script to handle downloading of regular and CI packages. + * Generally only used by the fetch scripts. +- `package.sh`: The actual package parser. + * Inputs: + - `PACKAGE`: The package key + * Outputs: + - Basically everything. You're best off reading the code rather than me poorly explaining it. +- `which.sh`: Find which cpmfile a package is located in. + * Inputs: + - The package key +- `replace.sh`: Replace a package's cpmfile definition. + * Inputs: + - `PACKAGE`: The package key + - `NEW_JSON`: All keys to replace/add + * Keys not found in the new json are not touched. Keys cannot currently be deleted. + +## Simple Utilities + +These scripts don't really have any functionality, they just help you out a bit yknow? + +- `format.sh`: Format all cpmfiles (4-space indent is enforced) + * In the future, these scripts will have options for spacing +- `hash.sh`: Determine the hash of a specific package. + * Inputs: + - The repository (e.g. fmtlib/fmt) + - The sha or tag (e.g. v1.0.1) + - `GIT_HOST`: What git host to use (default github.com) + - `USE_TAG`: Set to "true" if the second argument is a tag instead of a sha + - `ARTIFACT`: The artifact to download, if using a tag. Set to null or empty to use the tag source archive instead + * Output: the SHA512 sum of the package +- `url-hash.sh`: Determine the hash of a URL + * Input: the URL + * Output: the SHA512 sum of the URL + +## Functional Utilities + +These modify the CPM cache or cpmfiles. Each allows you to input all the packages to act on, as well as a `-all.sh` that acts upon all available packages. + +For the update and hash scripts, set `UPDATE=true` to update the cpmfile with the new version or hash. Beware: if the hash is `cf83e1357...` that means you got a 404 error! + +- `fetch.sh`: Prefetch a package according to its cpmfile definition + * Packages are fetched to the `.cache/cpm` directory by default, following the CPMUtil default. + * Already-fetched packages will be skipped. You can invalidate the entire cache with `rm -rf .cache/cpm`, or invalidate a specific package with e.g. `rm -rf .cache/cpm/packagename` to force a refetch. + * In the future, a force option will be added + * Note that full prefetching will take a long time depending on your internet, the amount of dependencies, and the size of each dependency. +- `check-updates.sh`: Check a package for available updates + * This only applies to packages that utilize tags. + * If the tag is a format string, the `git_version` is acted upon instead. + * Setting `FORCE=true` will forcefully update every package and its hash, even if they are on the latest version (`UPDATE` must also be true) + * This script generally runs fast. + * Packages that should skip updates (e.g. older versions or packages with poorly-made tag structures... looking at you mbedtls) may specify `"skip_updates": true` in their cpmfile definition. This is unnecessary for untagged (e.g. sha or bare URL) packages. +- `check-hashes.sh`: Check a package's hash + * This only applies to packages with hardcoded hashes, NOT ones that use hash URLs. + * This script will take a looooooooooooooong time. This is operationally equivalent to a prefetch, and thus checking all hashes will take a while--but it's worth it! Just make sure you're not using dial-up. + +You are recommended to run sanity hash checking for every pull request and commit, and weekly update checks. \ No newline at end of file diff --git a/tools/cpm/check-hash-all.sh b/tools/cpm/check-hash-all.sh new file mode 100755 index 0000000000..fd8c270392 --- /dev/null +++ b/tools/cpm/check-hash-all.sh @@ -0,0 +1,10 @@ +#!/bin/bash -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +# shellcheck disable=SC2086 +tools/cpm/check-hash.sh $LIBS \ No newline at end of file diff --git a/tools/cpm/check-hash.sh b/tools/cpm/check-hash.sh new file mode 100755 index 0000000000..85c60aad8c --- /dev/null +++ b/tools/cpm/check-hash.sh @@ -0,0 +1,46 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# env vars: +# - UPDATE: fix hashes if needed + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +RETURN=0 + +for PACKAGE in "$@" +do + export PACKAGE + # shellcheck disable=SC1091 + . tools/cpm/package.sh + + if [ "$CI" != null ]; then + continue + fi + + [ "$HASH_URL" != null ] && continue + [ "$HASH_SUFFIX" != null ] && continue + + echo "-- Package $PACKAGE" + + [ "$HASH" = null ] && echo "-- * Warning: no hash specified" && continue + + export USE_TAG=true + ACTUAL=$(tools/cpm/url-hash.sh "$DOWNLOAD") + + # shellcheck disable=SC2028 + [ "$ACTUAL" != "$HASH" ] && echo "-- * Expected $HASH" && echo "-- * Got $ACTUAL" && [ "$UPDATE" != "true" ] && RETURN=1 + + if [ "$UPDATE" = "true" ] && [ "$ACTUAL" != "$HASH" ]; then + # shellcheck disable=SC2034 + NEW_JSON=$(echo "$JSON" | jq ".hash = \"$ACTUAL\"") + export NEW_JSON + + tools/cpm/replace.sh + fi +done + +exit $RETURN \ No newline at end of file diff --git a/tools/cpm/check-updates-all.sh b/tools/cpm/check-updates-all.sh new file mode 100755 index 0000000000..a6eda58bac --- /dev/null +++ b/tools/cpm/check-updates-all.sh @@ -0,0 +1,10 @@ +#!/bin/bash -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +# shellcheck disable=SC2086 +tools/cpm/check-updates.sh $LIBS \ No newline at end of file diff --git a/tools/cpm/check-updates.sh b/tools/cpm/check-updates.sh new file mode 100755 index 0000000000..bdccf96ca2 --- /dev/null +++ b/tools/cpm/check-updates.sh @@ -0,0 +1,90 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# env vars: +# - UPDATE: update if available +# - FORCE: forcefully update + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +RETURN=0 + +filter() { + TAGS=$(echo "$TAGS" | jq "[.[] | select(.name | test(\"$1\"; \"i\") | not)]") # vulkan +} + +for PACKAGE in "$@" +do + export PACKAGE + # shellcheck disable=SC1091 + . tools/cpm/package.sh + + SKIP=$(value "skip_updates") + + [ "$SKIP" = "true" ] && continue + + [ "$REPO" = null ] && continue + [ "$GIT_HOST" != "github.com" ] && continue # TODO + # shellcheck disable=SC2153 + [ "$TAG" = null ] && continue + + echo "-- Package $PACKAGE" + + # TODO(crueter): Support for Forgejo updates w/ forgejo_token + # Use gh-cli to avoid ratelimits lmao + TAGS=$(gh api --method GET "/repos/$REPO/tags") + + # filter out some commonly known annoyances + # TODO add more + + filter vulkan-sdk # vulkan + filter yotta # mbedtls + + # ignore betas/alphas (remove if needed) + filter alpha + filter beta + filter rc + + # Add package-specific overrides here, e.g. here for fmt: + [ "$PACKAGE" = fmt ] && filter v0.11 + + LATEST=$(echo "$TAGS" | jq -r '.[0].name') + + [ "$LATEST" = "$TAG" ] && [ "$FORCE" != "true" ] && echo "-- * Up-to-date" && continue + + RETURN=1 + + if [ "$HAS_REPLACE" = "true" ]; then + # this just extracts the tag prefix + VERSION_PREFIX=$(echo "$ORIGINAL_TAG" | cut -d"%" -f1) + + # then we strip out the prefix from the new tag, and make that our new git_version + NEW_GIT_VERSION=$(echo "$LATEST" | sed "s/$VERSION_PREFIX//g") + fi + + echo "-- * Version $LATEST available, current is $TAG" + + export USE_TAG=true + HASH=$(tools/cpm/hash.sh "$REPO" "$LATEST") + + echo "-- * New hash: $HASH" + + if [ "$UPDATE" = "true" ]; then + RETURN=0 + + if [ "$HAS_REPLACE" = "true" ]; then + NEW_JSON=$(echo "$JSON" | jq ".hash = \"$HASH\" | .git_version = \"$NEW_GIT_VERSION\"") + else + NEW_JSON=$(echo "$JSON" | jq ".hash = \"$HASH\" | .tag = \"$LATEST\"") + fi + + export NEW_JSON + + tools/cpm/replace.sh + fi +done + +exit $RETURN \ No newline at end of file diff --git a/tools/cpm/common.sh b/tools/cpm/common.sh new file mode 100755 index 0000000000..4aff058bdc --- /dev/null +++ b/tools/cpm/common.sh @@ -0,0 +1,32 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +################################## +# CHANGE THESE FOR YOUR PROJECT! # +################################## + +# Which directories to search +DIRS=". src" + +# How many levels to go (3 is 2 subdirs max) +MAXDEPTH=3 + +# shellcheck disable=SC2038 +# shellcheck disable=SC2016 +# shellcheck disable=SC2086 +[ -z "$PACKAGES" ] && PACKAGES=$(find $DIRS -maxdepth "$MAXDEPTH" -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)') + +# For your project you'll want to change the PACKAGES call to include whatever locations you may use (externals, src, etc.) +# Always include . +LIBS=$(echo "$PACKAGES" | jq -j 'keys_unsorted | join(" ")') + +export PACKAGES +export LIBS +export DIRS +export MAXDEPTH + +value() { + echo "$JSON" | jq -r ".$1" +} \ No newline at end of file diff --git a/tools/cpm/download.sh b/tools/cpm/download.sh new file mode 100755 index 0000000000..426f1f51e6 --- /dev/null +++ b/tools/cpm/download.sh @@ -0,0 +1,100 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# env vars: +# - UPDATE: fix hashes if needed + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +download_package() { + FILENAME=$(basename "$DOWNLOAD") + + OUTFILE="$TMP/$FILENAME" + + LOWER_PACKAGE=$(echo "$PACKAGE_NAME" | tr '[:upper:]' '[:lower:]') + OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}" + [ -d "$OUTDIR" ] && return + + curl "$DOWNLOAD" -sS -L -o "$OUTFILE" + + ACTUAL_HASH=$("${HASH_ALGO}"sum "$OUTFILE" | cut -d" " -f1) + [ "$ACTUAL_HASH" != "$HASH" ] && echo "!! $FILENAME did not match expected hash; expected $HASH but got $ACTUAL_HASH" && exit 1 + + mkdir -p "$OUTDIR" + + PREVDIR="$PWD" + cd "$OUTDIR" + + case "$FILENAME" in + (*.7z) + 7z x "$OUTFILE" > /dev/null + ;; + (*.tar*) + tar xf "$OUTFILE" > /dev/null + ;; + (*.zip) + unzip "$OUTFILE" > /dev/null + ;; + esac + + # basically if only one real item exists at the top we just move everything from there + # since github and some vendors hate me + DIRS=$(find . -maxdepth 1 -type d -o -type f) + + # thanks gnu + if [ "$(echo "$DIRS" | wc -l)" -eq 2 ]; then + SUBDIR=$(find . -maxdepth 1 -type d -not -name ".") + mv "$SUBDIR"/* . + mv "$SUBDIR"/.* . 2>/dev/null || true + rmdir "$SUBDIR" + fi + + if echo "$JSON" | grep -e "patches" > /dev/null; then + PATCHES=$(echo "$JSON" | jq -r '.patches | join(" ")') + for patch in $PATCHES; do + # shellcheck disable=SC2154 + patch --binary -p1 < "$ROOTDIR/.patch/$PACKAGE/$patch" + done + fi + + cd "$PREVDIR" +} + +ci_package() { + [ "$REPO" = null ] && echo "-- ! No repo defined" && return + + echo "-- CI package $PACKAGE_NAME" + + for platform in windows-amd64 windows-arm64 android solaris-amd64 freebsd-amd64 linux-amd64 linux-aarch64 macos-universal; do + echo "-- * platform $platform" + + case $DISABLED in + (*"$platform"*) + echo "-- * -- disabled" + continue + ;; + (*) ;; + esac + + FILENAME="${NAME}-${platform}-${VERSION}.${EXT}" + DOWNLOAD="https://$GIT_HOST/${REPO}/releases/download/v${VERSION}/${FILENAME}" + KEY=$platform + + LOWER_PACKAGE=$(echo "$PACKAGE_NAME" | tr '[:upper:]' '[:lower:]') + OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}" + [ -d "$OUTDIR" ] && continue + + HASH_ALGO=$(value "hash_algo") + [ "$HASH_ALGO" = null ] && HASH_ALGO=sha512 + + HASH_SUFFIX="${HASH_ALGO}sum" + HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}" + + HASH=$(curl "$HASH_URL" -sS -q -L -o -) + + download_package + done +} diff --git a/tools/cpm/fetch-all.sh b/tools/cpm/fetch-all.sh new file mode 100755 index 0000000000..5c41b5d080 --- /dev/null +++ b/tools/cpm/fetch-all.sh @@ -0,0 +1,10 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +# shellcheck disable=SC2086 +tools/cpm/fetch.sh $LIBS \ No newline at end of file diff --git a/tools/cpm/fetch.sh b/tools/cpm/fetch.sh new file mode 100755 index 0000000000..bf45676cfa --- /dev/null +++ b/tools/cpm/fetch.sh @@ -0,0 +1,36 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +[ -z "$CPM_SOURCE_CACHE" ] && CPM_SOURCE_CACHE=$PWD/.cache/cpm + +mkdir -p "$CPM_SOURCE_CACHE" + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +# shellcheck disable=SC1091 +. tools/cpm/download.sh + +# shellcheck disable=SC2034 +ROOTDIR="$PWD" + +TMP=$(mktemp -d) + +# shellcheck disable=SC2034 +for PACKAGE in "$@" +do + export PACKAGE + # shellcheck disable=SC1091 + . tools/cpm/package.sh + + if [ "$CI" = "true" ]; then + ci_package + else + echo "-- Downloading regular package $PACKAGE, with key $KEY, from $DOWNLOAD" + download_package + fi +done + +rm -rf "$TMP" \ No newline at end of file diff --git a/tools/cpm/format.sh b/tools/cpm/format.sh new file mode 100755 index 0000000000..8d99b4796b --- /dev/null +++ b/tools/cpm/format.sh @@ -0,0 +1,15 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +# shellcheck disable=SC2086 +FILES=$(find $DIRS -maxdepth "$MAXDEPTH" -name cpmfile.json) + +for file in $FILES; do + jq --indent 4 < "$file" > "$file".new + mv "$file".new "$file" +done diff --git a/tools/cpm/hash.sh b/tools/cpm/hash.sh new file mode 100755 index 0000000000..27061bd9a4 --- /dev/null +++ b/tools/cpm/hash.sh @@ -0,0 +1,25 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# usage: hash.sh repo tag-or-sha +# env vars: GIT_HOST, USE_TAG (use tag instead of sha), ARTIFACT (download artifact with that name instead of src archive) + +REPO="$1" +[ -z "$GIT_HOST" ] && GIT_HOST=github.com +GIT_URL="https://$GIT_HOST/$REPO" + +if [ "$USE_TAG" = "true" ]; then + if [ -z "$ARTIFACT" ] || [ "$ARTIFACT" = "null" ]; then + URL="${GIT_URL}/archive/refs/tags/$2.tar.gz" + else + URL="${GIT_URL}/releases/download/$2/${ARTIFACT}" + fi +else + URL="${GIT_URL}/archive/$2.zip" +fi + +SUM=$(wget -q "$URL" -O - | sha512sum) + +echo "$SUM" | cut -d " " -f1 diff --git a/tools/cpm/package.sh b/tools/cpm/package.sh new file mode 100755 index 0000000000..d82b2fcbe9 --- /dev/null +++ b/tools/cpm/package.sh @@ -0,0 +1,203 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# env vars: +# - UPDATE: fix hashes if needed + +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +[ -z "$PACKAGE" ] && echo "Package was not specified" && exit 0 + +# shellcheck disable=SC2153 +JSON=$(echo "$PACKAGES" | jq -r ".\"$PACKAGE\" | select( . != null )") + +[ -z "$JSON" ] && echo "!! No cpmfile definition for $PACKAGE" && exit 1 + +# unset stuff +export PACKAGE_NAME="null" +export REPO="null" +export CI="null" +export GIT_HOST="null" +export EXT="null" +export NAME="null" +export DISABLED="null" +export TAG="null" +export ARTIFACT="null" +export SHA="null" +export VERSION="null" +export GIT_VERSION="null" +export DOWNLOAD="null" +export URL="null" +export KEY="null" +export HASH="null" +export ORIGINAL_TAG="null" +export HAS_REPLACE="null" +export VERSION_REPLACE="null" +export HASH_URL="null" +export HASH_SUFFIX="null" +export HASH_ALGO="null" + +######## +# Meta # +######## + +REPO=$(value "repo") +CI=$(value "ci") + +PACKAGE_NAME=$(value "package") +[ "$PACKAGE_NAME" = null ] && PACKAGE_NAME="$PACKAGE" + +GIT_HOST=$(value "git_host") +[ "$GIT_HOST" = null ] && GIT_HOST=github.com + +export PACKAGE_NAME +export REPO +export CI +export GIT_HOST + +###################### +# CI Package Parsing # +###################### + +VERSION=$(value "version") + +if [ "$CI" = "true" ]; then + EXT=$(value "extension") + [ "$EXT" = null ] && EXT="tar.zst" + + NAME=$(value "name") + DISABLED=$(echo "$JSON" | jq -j '.disabled_platforms') + + [ "$NAME" = null ] && NAME="$PACKAGE_NAME" + + export EXT + export NAME + export DISABLED + export VERSION + + return 0 +fi + +############## +# Versioning # +############## + +TAG=$(value "tag") +ARTIFACT=$(value "artifact") +SHA=$(value "sha") +GIT_VERSION=$(value "git_version") + +[ "$GIT_VERSION" = null ] && GIT_VERSION="$VERSION" + +if [ "$GIT_VERSION" != null ]; then + VERSION_REPLACE="$GIT_VERSION" +else + VERSION_REPLACE="$VERSION" +fi + +echo "$TAG" | grep -e "%VERSION%" > /dev/null && HAS_REPLACE=true || HAS_REPLACE=false +ORIGINAL_TAG="$TAG" + +TAG=$(echo "$TAG" | sed "s/%VERSION%/$VERSION_REPLACE/g") +ARTIFACT=$(echo "$ARTIFACT" | sed "s/%VERSION%/$VERSION_REPLACE/g") +ARTIFACT=$(echo "$ARTIFACT" | sed "s/%TAG%/$TAG/g") + +export TAG +export ARTIFACT +export SHA +export VERSION +export GIT_VERSION +export ORIGINAL_TAG +export HAS_REPLACE +export VERSION_REPLACE + +############### +# URL Parsing # +############### + +URL=$(value "url") + +if [ "$URL" != "null" ]; then + DOWNLOAD="$URL" +elif [ "$REPO" != "null" ]; then + GIT_URL="https://$GIT_HOST/$REPO" + + BRANCH=$(value "branch") + + if [ "$TAG" != "null" ]; then + if [ "$ARTIFACT" != "null" ]; then + DOWNLOAD="${GIT_URL}/releases/download/${TAG}/${ARTIFACT}" + else + DOWNLOAD="${GIT_URL}/archive/refs/tags/${TAG}.tar.gz" + fi + elif [ "$SHA" != "null" ]; then + DOWNLOAD="${GIT_URL}/archive/${SHA}.zip" + else + if [ "$BRANCH" = null ]; then + BRANCH=master + fi + + DOWNLOAD="${GIT_URL}/archive/refs/heads/${BRANCH}.zip" + fi +else + echo "!! No repo or URL defined for $PACKAGE" + exit 1 +fi + +export DOWNLOAD +export URL + +############### +# Key Parsing # +############### + +KEY=$(value "key") + +if [ "$KEY" = null ]; then + if [ "$SHA" != null ]; then + KEY=$(echo "$SHA" | cut -c1-4) + elif [ "$GIT_VERSION" != null ]; then + KEY="$GIT_VERSION" + elif [ "$TAG" != null ]; then + KEY="$TAG" + elif [ "$VERSION" != null ]; then + KEY="$VERSION" + else + echo "!! No valid key could be determined for $PACKAGE. Must define one of: key, sha, tag, version, git_version" + exit 1 + fi +fi + +export KEY + +################ +# Hash Parsing # +################ + +HASH_ALGO=$(value "hash_algo") +[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512 + +HASH=$(value "hash") + +if [ "$HASH" = null ]; then + HASH_SUFFIX="${HASH_ALGO}sum" + HASH_URL=$(value "hash_url") + + if [ "$HASH_URL" = null ]; then + HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}" + fi + + HASH=$(curl "$HASH_URL" -Ss -L -o -) +else + HASH_URL=null + HASH_SUFFIX=null +fi + +export HASH_URL +export HASH_SUFFIX +export HASH +export HASH_ALGO +export JSON \ No newline at end of file diff --git a/tools/cpm/replace.sh b/tools/cpm/replace.sh new file mode 100755 index 0000000000..501cfda6b1 --- /dev/null +++ b/tools/cpm/replace.sh @@ -0,0 +1,20 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# Replace a specified package with a modified json. + +# env vars: +# - PACKAGE: The package key to act on +# - NEW_JSON: The new json to use + +[ -z "$PACKAGE" ] && echo "You must provide the PACKAGE environment variable." && return 1 +[ -z "$NEW_JSON" ] && echo "You must provide the NEW_JSON environment variable." && return 1 + +FILE=$(tools/cpm/which.sh "$PACKAGE") + +jq --indent 4 --argjson repl "$NEW_JSON" ".\"$PACKAGE\" *= \$repl" "$FILE" > "$FILE".new +mv "$FILE".new "$FILE" + +echo "-- * -- Updated $FILE" diff --git a/tools/cpm/url-hash.sh b/tools/cpm/url-hash.sh new file mode 100755 index 0000000000..c911dacb37 --- /dev/null +++ b/tools/cpm/url-hash.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +SUM=$(wget -q "$1" -O - | sha512sum) +echo "$SUM" | cut -d " " -f1 diff --git a/tools/cpm/which.sh b/tools/cpm/which.sh new file mode 100755 index 0000000000..c936d0a97f --- /dev/null +++ b/tools/cpm/which.sh @@ -0,0 +1,15 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: 2025 crueter +# SPDX-License-Identifier: GPL-3.0-or-later + +# check which file a package is in +# shellcheck disable=SC1091 +. tools/cpm/common.sh + +# shellcheck disable=SC2086 +JSON=$(find $DIRS -maxdepth "$MAXDEPTH" -name cpmfile.json -exec grep -l "$1" {} \;) + +[ -z "$JSON" ] && echo "!! No cpmfile definition for $1" + +echo "$JSON" \ No newline at end of file diff --git a/tools/dtrace-tool.sh b/tools/dtrace-tool.sh new file mode 100755 index 0000000000..4a75848fcd --- /dev/null +++ b/tools/dtrace-tool.sh @@ -0,0 +1,59 @@ +#!/usr/local/bin/bash -ex + +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# Basic script to run dtrace sampling over the program (requires Flamegraph) +# Usage is either running as: ./dtrace-tool.sh pid (then input the pid of the process) +# Or just run directly with: ./dtrace-tool.sh + +FLAMEGRAPH_DIR=".." +fail() { + printf '%s\n' "$1" >&2 + exit "${2-1}" +} + +[ -f $FLAMEGRAPH_DIR/FlameGraph/stackcollapse.pl ] || fail 'Where is flamegraph?' +#[ which dtrace ] || fail 'Needs DTrace installed' + +read -r "Sampling Hz [800]: " TRACE_CFG_HZ +if [ -z "${TRACE_CFG_HZ}" ]; then + TRACE_CFG_HZ=800 +fi + +read -r "Sampling time [5] sec: " TRACE_CFG_TIME +if [ -z "${TRACE_CFG_TIME}" ]; then + TRACE_CFG_TIME=5 +fi + +TRACE_FILE=dtrace-out.user_stacks +TRACE_FOLD=dtrace-out.fold +TRACE_SVG=dtrace-out.svg +ps + +if [ "$1" = 'pid' ]; then + read -r "PID: " TRACE_CFG_PID + sudo echo 'Sudo!' +else + if [ -f "$1" ] && [ "$1" ]; then + fail 'Usage: ./tools/dtrace-profile.sh ' + fi + + printf "Executing: " + echo "$@" + sudo echo 'Sudo!' + "$@" & + TRACE_CFG_PID=$! +fi + +TRACE_PROBE="profile-${TRACE_CFG_HZ} /pid == ${TRACE_CFG_PID} && arg1/ { @[ustack()] = count(); } tick-${TRACE_CFG_TIME}s { exit(0); }" + +rm -- $TRACE_SVG || echo 'Skip' + +sudo dtrace -x ustackframes=100 -Z -n "$TRACE_PROBE" -o $TRACE_FILE 2>/dev/null || exit + +perl $FLAMEGRAPH_DIR/FlameGraph/stackcollapse.pl $TRACE_FILE > $TRACE_FOLD || exit +perl $FLAMEGRAPH_DIR/FlameGraph/flamegraph.pl $TRACE_FOLD > $TRACE_SVG || exit + +sudo chmod 0666 $TRACE_FILE +rm -- $TRACE_FILE $TRACE_FOLD \ No newline at end of file diff --git a/tools/lanczos_gen.c b/tools/lanczos_gen.c new file mode 100644 index 0000000000..6d7be3cb0e --- /dev/null +++ b/tools/lanczos_gen.c @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// clang -lm tools/lanczos_gen.c -o tools/lanczos_gen && ./tools/lanczos_gen +#include +#include + +double sinc(double x) { + return x == 0.0f ? 1.0f : sin(M_PI * x) / (M_PI * x); +} + +typedef struct vec2 { + double x; + double y; +} vec2; + +double lanczos(vec2 v, float a) { + double d = sqrt(v.x * v.x + v.y * v.y); + return sinc(d) / sinc(d / a); +} + +int main(int argc, char* argv[]) { + const int r = 3; //radius (1 = 3 steps) + const int k_size = (r * 2 + 1) * (r * 2 + 1); + double w_sum = 0.0f; + // kernel size = (r * 2 + 1) ^ 2 + printf("const float w_kernel[%i] = float[] (\n ", k_size); + double factor = 1.0f / ((double)r + 1.0f); + for (int x = -r; x <= r; x++) + for (int y = -r; y <= r; y++) { + double w = lanczos((vec2){ .x = x, .y = y }, (double)r); + printf("%lff, ", w); + w_sum += w; + } + printf("\n);\n"); + printf("const vec2 w_pos[%i] = vec2[] (\n ", k_size); + for (int x = -r; x <= r; x++) + for (int y = -r; y <= r; y++) { + vec2 kp = (vec2){ + .x = x * factor, + .y = y * factor + }; + printf("vec2(%lff, %lff), ", kp.x, kp.y); + } + printf("\n);\n"); + printf("const float w_sum = %lff;\n", w_sum); + return 0; +} diff --git a/tools/llvmpipe-run.sh b/tools/llvmpipe-run.sh new file mode 100755 index 0000000000..c3a5a85d41 --- /dev/null +++ b/tools/llvmpipe-run.sh @@ -0,0 +1,205 @@ +#!/bin/sh +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# This script basically allows you to "dirtily" use llvmpipe in any configuration +# llvmpipe will of course, run at negative mach-1 speeds. However this is mainly useful to test that mesa +# is properly working on extraneous systems (such as Managarm). This mainly only works with MESA >22.0.0 +# Use as follows: ./llvmpipe-run.sh + +export MESA_GL_VERSION_OVERRIDE=4.6 +export MESA_GLSL_VERSION_OVERRIDE=460 +export MESA_EXTENSION_MAX_YEAR=2025 +export MESA_DEBUG=1 +export MESA_VK_VERSION_OVERRIDE=1.3 +export LIBGL_ALWAYS_SOFTWARE=1 + +# This was automated via a script so I might have missed some +ext="GL_AMD_multi_draw_indirect GL_AMD_seamless_cubemap_per_texture GL_AMD_vertex_shader_layer GL_AMD_vertex_shader_viewport_index" +ext="$ext GL_ARB_ES2_compatibility GL_ARB_ES3_1_compatibility GL_ARB_ES3_2_compatibility GL_ARB_ES3_compatibility GL_ARB_arrays_of_arrays" +ext="$ext GL_ARB_base_instance GL_ARB_bindless_texture GL_ARB_blend_func_extended GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture" +ext="$ext GL_ARB_clip_control GL_ARB_color_buffer_float GL_ARB_compressed_texture_pixel_storage GL_ARB_compute_shader GL_ARB_compute_variable_group_size" +ext="$ext GL_ARB_conditional_render_inverted GL_ARB_conservative_depth GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance GL_ARB_debug_output" +ext="$ext GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers" +ext="$ext GL_ARB_draw_buffers_blend GL_ARB_draw_elements_base_vertex GL_ARB_draw_indirect GL_ARB_draw_instanced GL_ARB_enhanced_layouts" +ext="$ext GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_layer_viewport" +ext="$ext GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_fragment_shader_interlock GL_ARB_framebuffer_no_attachments" +ext="$ext GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary GL_ARB_get_texture_sub_image GL_ARB_gl_spirv" +ext="$ext GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64 GL_ARB_gpu_shader_int64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging" +ext="$ext GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2 GL_ARB_invalidate_subdata" +ext="$ext GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture" +ext="$ext GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_parallel_shader_compile GL_ARB_pipeline_statistics_query GL_ARB_pixel_buffer_object" +ext="$ext GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_polygon_offset_clamp GL_ARB_post_depth_coverage GL_ARB_program_interface_query" +ext="$ext GL_ARB_provoking_vertex GL_ARB_query_buffer_object GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_locations" +ext="$ext GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_seamless_cubemap_per_texture GL_ARB_separate_shader_objects" +ext="$ext GL_ARB_shader_atomic_counter_ops GL_ARB_shader_atomic_counters GL_ARB_shader_ballot GL_ARB_shader_bit_encoding GL_ARB_shader_clock" +ext="$ext GL_ARB_shader_draw_parameters GL_ARB_shader_group_vote GL_ARB_shader_image_load_store GL_ARB_shader_image_size GL_ARB_shader_objects" +ext="$ext GL_ARB_shader_precision GL_ARB_shader_storage_buffer_object GL_ARB_shader_subroutine GL_ARB_shader_texture_image_samples" +ext="$ext GL_ARB_shader_texture_lod GL_ARB_shader_viewport_layer_array GL_ARB_shading_language_100 GL_ARB_shading_language_420pack" +ext="$ext GL_ARB_shading_language_include GL_ARB_shading_language_packing GL_ARB_shadow GL_ARB_sparse_buffer GL_ARB_sparse_texture GL_ARB_sparse_texture2" +ext="$ext GL_ARB_sparse_texture_clamp GL_ARB_spirv_extensions GL_ARB_stencil_texturing GL_ARB_sync GL_ARB_tessellation_shader GL_ARB_texture_barrier" +ext="$ext GL_ARB_texture_border_clamp GL_ARB_texture_buffer_object GL_ARB_texture_buffer_object_rgb32 GL_ARB_texture_buffer_range GL_ARB_texture_compression" +ext="$ext GL_ARB_texture_compression_bptc GL_ARB_texture_compression_rgtc GL_ARB_texture_cube_map GL_ARB_texture_cube_map_array GL_ARB_texture_env_add" +ext="$ext GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_filter_anisotropic GL_ARB_texture_filter_minmax" +ext="$ext GL_ARB_texture_float GL_ARB_texture_gather GL_ARB_texture_mirror_clamp_to_edge GL_ARB_texture_mirrored_repeat GL_ARB_texture_multisample" +ext="$ext GL_ARB_texture_non_power_of_two GL_ARB_texture_query_levels GL_ARB_texture_query_lod GL_ARB_texture_rectangle GL_ARB_texture_rg" +ext="$ext GL_ARB_texture_rgb10_a2ui GL_ARB_texture_stencil8 GL_ARB_texture_storage GL_ARB_texture_storage_multisample GL_ARB_texture_swizzle" +ext="$ext GL_ARB_texture_view GL_ARB_timer_query GL_ARB_transform_feedback2 GL_ARB_transform_feedback3 GL_ARB_transform_feedback_instanced" +ext="$ext GL_ARB_transform_feedback_overflow_query GL_ARB_transpose_matrix GL_ARB_uniform_buffer_object GL_ARB_vertex_array_bgra" +ext="$ext GL_ARB_vertex_array_object GL_ARB_vertex_attrib_64bit GL_ARB_vertex_attrib_binding GL_ARB_vertex_buffer_object" +ext="$ext GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_vertex_type_10f_11f_11f_rev GL_ARB_vertex_type_2_10_10_10_rev" +ext="$ext GL_ARB_viewport_array GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_texture_float GL_ATI_texture_mirror_once" +ext="$ext GL_EXTX_framebuffer_mixed_formats GL_EXT_Cg_shader GL_EXT_abgr GL_EXT_bgra GL_EXT_bindable_uniform" +ext="$ext GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax" +ext="$ext GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_depth_bounds_test GL_EXT_direct_state_access" +ext="$ext GL_EXT_draw_buffers2 GL_EXT_draw_instanced GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit" +ext="$ext GL_EXT_framebuffer_multisample GL_EXT_framebuffer_multisample_blit_scaled GL_EXT_framebuffer_object" +ext="$ext GL_EXT_framebuffer_sRGB GL_EXT_geometry_shader4 GL_EXT_gpu_program_parameters GL_EXT_gpu_shader4" +ext="$ext GL_EXT_import_sync_object GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_multi_draw_arrays" +ext="$ext GL_EXT_multiview_texture_multisample GL_EXT_multiview_timer_query GL_EXT_packed_depth_stencil" +ext="$ext GL_EXT_packed_float GL_EXT_packed_pixels GL_EXT_pixel_buffer_object GL_EXT_point_parameters" +ext="$ext GL_EXT_polygon_offset_clamp GL_EXT_post_depth_coverage GL_EXT_provoking_vertex GL_EXT_raster_multisample" +ext="$ext GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_semaphore GL_EXT_semaphore_fd" +ext="$ext GL_EXT_separate_shader_objects GL_EXT_separate_specular_color GL_EXT_shader_image_load_formatted" +ext="$ext GL_EXT_shader_image_load_store GL_EXT_shader_integer_mix GL_EXT_shadow_funcs GL_EXT_sparse_texture2" +ext="$ext GL_EXT_stencil_two_side GL_EXT_stencil_wrap GL_EXT_texture3D GL_EXT_texture_array" +ext="$ext GL_EXT_texture_buffer_object GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_latc" +ext="$ext GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map" +ext="$ext GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_env_dot3" +ext="$ext GL_EXT_texture_filter_anisotropic GL_EXT_texture_filter_minmax GL_EXT_texture_integer" +ext="$ext GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object" +ext="$ext GL_EXT_texture_sRGB GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_decode GL_EXT_texture_shadow_lod" +ext="$ext GL_EXT_texture_shared_exponent GL_EXT_texture_storage GL_EXT_texture_swizzle GL_EXT_timer_query" +ext="$ext GL_EXT_transform_feedback2 GL_EXT_vertex_array GL_EXT_vertex_array_bgra GL_EXT_vertex_attrib_64bit" +ext="$ext GL_EXT_window_rectangles GL_EXT_x11_sync_object GL_IBM_rasterpos_clip GL_IBM_texture_mirrored_repeat" +ext="$ext GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_KHR_context_flush_control" +ext="$ext GL_KHR_debug GL_KHR_no_error GL_KHR_parallel_shader_compile GL_KHR_robust_buffer_access_behavior" +ext="$ext GL_KHR_robustness GL_KHR_shader_subgroup GL_KTX_buffer_region GL_NVX_blend_equation_advanced_multi_draw_buffers" +ext="$ext GL_NVX_conditional_render GL_NVX_gpu_memory_info GL_NVX_nvenc_interop GL_NVX_progress_fence" +ext="$ext GL_NV_ES1_1_compatibility GL_NV_ES3_1_compatibility GL_NV_alpha_to_coverage_dither_control" +ext="$ext GL_NV_bindless_multi_draw_indirect GL_NV_bindless_multi_draw_indirect_count GL_NV_bindless_texture" +ext="$ext GL_NV_blend_equation_advanced GL_NV_blend_equation_advanced_coherent GL_NV_blend_minmax_factor" +ext="$ext GL_NV_blend_square GL_NV_clip_space_w_scaling GL_NV_command_list GL_NV_compute_program5" +ext="$ext GL_NV_conditional_render GL_NV_conservative_raster GL_NV_conservative_raster_dilate" +ext="$ext GL_NV_conservative_raster_pre_snap_triangles GL_NV_copy_depth_to_color GL_NV_copy_image" +ext="$ext GL_NV_depth_buffer_float GL_NV_depth_clamp GL_NV_draw_texture GL_NV_draw_vulkan_image" +ext="$ext GL_NV_explicit_multisample GL_NV_feature_query GL_NV_fence GL_NV_fill_rectangle" +ext="$ext GL_NV_float_buffer GL_NV_fog_distance GL_NV_fragment_coverage_to_color GL_NV_fragment_program" +ext="$ext GL_NV_fragment_program2 GL_NV_fragment_program_option GL_NV_fragment_shader_interlock" +ext="$ext GL_NV_framebuffer_mixed_samples GL_NV_framebuffer_multisample_coverage GL_NV_geometry_shader4" +ext="$ext GL_NV_geometry_shader_passthrough GL_NV_gpu_multicast GL_NV_gpu_program4 GL_NV_gpu_program4_1" +ext="$ext GL_NV_gpu_program5 GL_NV_gpu_program5_mem_extended GL_NV_gpu_program_fp64 GL_NV_gpu_program_multiview" +ext="$ext GL_NV_gpu_shader5 GL_NV_half_float GL_NV_internalformat_sample_query GL_NV_light_max_exponent" +ext="$ext GL_NV_memory_attachment GL_NV_memory_object_sparse GL_NV_multisample_coverage GL_NV_multisample_filter_hint" +ext="$ext GL_NV_occlusion_query GL_NV_packed_depth_stencil GL_NV_parameter_buffer_object GL_NV_parameter_buffer_object2" +ext="$ext GL_NV_path_rendering GL_NV_path_rendering_shared_edge GL_NV_pixel_data_range GL_NV_point_sprite" +ext="$ext GL_NV_primitive_restart GL_NV_query_resource GL_NV_query_resource_tag GL_NV_register_combiners" +ext="$ext GL_NV_register_combiners2 GL_NV_robustness_video_memory_purge GL_NV_sample_locations" +ext="$ext GL_NV_sample_mask_override_coverage GL_NV_shader_atomic_counters GL_NV_shader_atomic_float" +ext="$ext GL_NV_shader_atomic_float64 GL_NV_shader_atomic_fp16_vector GL_NV_shader_atomic_int64" +ext="$ext GL_NV_shader_buffer_load GL_NV_shader_storage_buffer_object GL_NV_shader_subgroup_partitioned" +ext="$ext GL_NV_shader_thread_group GL_NV_shader_thread_shuffle GL_NV_stereo_view_rendering GL_NV_texgen_reflection" +ext="$ext GL_NV_texture_barrier GL_NV_texture_compression_vtc GL_NV_texture_env_combine4 GL_NV_texture_multisample" +ext="$ext GL_NV_texture_rectangle GL_NV_texture_rectangle_compressed GL_NV_texture_shader GL_NV_texture_shader2" +ext="$ext GL_NV_texture_shader3 GL_NV_timeline_semaphore GL_NV_transform_feedback GL_NV_transform_feedback2" +ext="$ext GL_NV_uniform_buffer_std430_layout GL_NV_uniform_buffer_unified_memory GL_NV_vdpau_interop" +ext="$ext GL_NV_vdpau_interop2 GL_NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_attrib_integer_64bit" +ext="$ext GL_NV_vertex_buffer_unified_memory GL_NV_vertex_program GL_NV_vertex_program1_1 GL_NV_vertex_program2" +ext="$ext GL_NV_vertex_program2_option GL_NV_vertex_program3 GL_NV_viewport_array2 GL_NV_viewport_swizzle" +ext="$ext GL_OVR_multiview GL_OVR_multiview2 GL_S3_s3tc GL_SGIS_generate_mipmap GL_SGIS_texture_lod" +ext="$ext GL_SGIX_depth_texture GL_SGIX_shadow GL_SUN_slice_accum GL_AMD_multi_draw_indirect" +ext="$ext GL_AMD_seamless_cubemap_per_texture GL_AMD_vertex_shader_layer GL_AMD_vertex_shader_viewport_index" +ext="$ext GL_ARB_ES2_compatibility GL_ARB_ES3_1_compatibility GL_ARB_ES3_2_compatibility GL_ARB_ES3_compatibility" +ext="$ext GL_ARB_arrays_of_arrays GL_ARB_base_instance GL_ARB_bindless_texture GL_ARB_blend_func_extended" +ext="$ext GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture GL_ARB_clip_control" +ext="$ext GL_ARB_color_buffer_float GL_ARB_compatibility GL_ARB_compressed_texture_pixel_storage" +ext="$ext GL_ARB_compute_shader GL_ARB_compute_variable_group_size GL_ARB_conditional_render_inverted" +ext="$ext GL_ARB_conservative_depth GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance" +ext="$ext GL_ARB_debug_output GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture" +ext="$ext GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers GL_ARB_draw_buffers_blend" +ext="$ext GL_ARB_draw_elements_base_vertex GL_ARB_draw_indirect GL_ARB_draw_instanced GL_ARB_enhanced_layouts" +ext="$ext GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions" +ext="$ext GL_ARB_fragment_layer_viewport GL_ARB_fragment_program GL_ARB_fragment_program_shadow" +ext="$ext GL_ARB_fragment_shader GL_ARB_fragment_shader_interlock GL_ARB_framebuffer_no_attachments" +ext="$ext GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary" +ext="$ext GL_ARB_get_texture_sub_image GL_ARB_gl_spirv GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64" +ext="$ext GL_ARB_gpu_shader_int64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging" +ext="$ext GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2" +ext="$ext GL_ARB_invalidate_subdata GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind" +ext="$ext GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query" +ext="$ext GL_ARB_occlusion_query2 GL_ARB_parallel_shader_compile GL_ARB_pipeline_statistics_query" +ext="$ext GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_polygon_offset_clamp" +ext="$ext GL_ARB_post_depth_coverage GL_ARB_program_interface_query GL_ARB_provoking_vertex GL_ARB_query_buffer_object" +ext="$ext GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_locations GL_ARB_sample_shading" +ext="$ext GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_seamless_cubemap_per_texture" +ext="$ext GL_ARB_separate_shader_objects GL_ARB_shader_atomic_counter_ops GL_ARB_shader_atomic_counters" +ext="$ext GL_ARB_shader_ballot GL_ARB_shader_bit_encoding GL_ARB_shader_clock GL_ARB_shader_draw_parameters" +ext="$ext GL_ARB_shader_group_vote GL_ARB_shader_image_load_store GL_ARB_shader_image_size GL_ARB_shader_objects" +ext="$ext GL_ARB_shader_precision GL_ARB_shader_storage_buffer_object GL_ARB_shader_subroutine" +ext="$ext GL_ARB_shader_texture_image_samples GL_ARB_shader_texture_lod GL_ARB_shader_viewport_layer_array" +ext="$ext GL_ARB_shading_language_100 GL_ARB_shading_language_420pack GL_ARB_shading_language_include" +ext="$ext GL_ARB_shading_language_packing GL_ARB_shadow GL_ARB_sparse_buffer GL_ARB_sparse_texture" +ext="$ext GL_ARB_sparse_texture2 GL_ARB_sparse_texture_clamp GL_ARB_spirv_extensions GL_ARB_stencil_texturing" +ext="$ext GL_ARB_sync GL_ARB_tessellation_shader GL_ARB_texture_barrier GL_ARB_texture_border_clamp" +ext="$ext GL_ARB_texture_buffer_object GL_ARB_texture_buffer_object_rgb32 GL_ARB_texture_buffer_range" +ext="$ext GL_ARB_texture_compression GL_ARB_texture_compression_bptc GL_ARB_texture_compression_rgtc" +ext="$ext GL_ARB_texture_cube_map GL_ARB_texture_cube_map_array GL_ARB_texture_env_add GL_ARB_texture_env_combine" +ext="$ext GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_filter_anisotropic" +ext="$ext GL_ARB_texture_filter_minmax GL_ARB_texture_float GL_ARB_texture_gather GL_ARB_texture_mirror_clamp_to_edge" +ext="$ext GL_ARB_texture_mirrored_repeat GL_ARB_texture_multisample GL_ARB_texture_non_power_of_two" +ext="$ext GL_ARB_texture_query_levels GL_ARB_texture_query_lod GL_ARB_texture_rectangle GL_ARB_texture_rg" +ext="$ext GL_ANDROID_extension_pack_es31a GL_EXT_EGL_image_external_wrap_modes GL_EXT_base_instance" +ext="$ext GL_EXT_blend_func_extended GL_EXT_blend_minmax GL_EXT_buffer_storage GL_EXT_clear_texture" +ext="$ext GL_EXT_clip_control GL_EXT_clip_cull_distance GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float" +ext="$ext GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_conservative_depth GL_EXT_copy_image GL_EXT_debug_label" +ext="$ext GL_EXT_depth_clamp GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers_indexed" +ext="$ext GL_EXT_draw_elements_base_vertex GL_EXT_draw_transform_feedback GL_EXT_float_blend GL_EXT_frag_depth" +ext="$ext GL_EXT_geometry_point_size GL_EXT_geometry_shader GL_EXT_gpu_shader5 GL_EXT_map_buffer_range" +ext="$ext GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_multi_draw_indirect GL_EXT_multisample_compatibility" +ext="$ext GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_EXT_multiview_texture_multisample" +ext="$ext GL_EXT_multiview_timer_query GL_EXT_occlusion_query_boolean GL_EXT_polygon_offset_clamp" +ext="$ext GL_EXT_post_depth_coverage GL_EXT_primitive_bounding_box GL_EXT_raster_multisample GL_EXT_read_format_bgra" +ext="$ext GL_EXT_render_snorm GL_EXT_robustness GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_semaphore" +ext="$ext GL_EXT_semaphore_fd GL_EXT_separate_shader_objects GL_EXT_shader_group_vote GL_EXT_shader_implicit_conversions" +ext="$ext GL_EXT_shader_integer_mix GL_EXT_shader_io_blocks GL_EXT_shader_non_constant_global_initializers" +ext="$ext GL_EXT_shader_texture_lod GL_EXT_shadow_samplers GL_EXT_sparse_texture GL_EXT_sparse_texture2" +ext="$ext GL_EXT_tessellation_point_size GL_EXT_tessellation_shader GL_EXT_texture_border_clamp GL_EXT_texture_buffer" +ext="$ext GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc" +ext="$ext GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map_array GL_EXT_texture_filter_anisotropic" +ext="$ext GL_EXT_texture_filter_minmax GL_EXT_texture_format_BGRA8888 GL_EXT_texture_mirror_clamp_to_edge" +ext="$ext GL_EXT_texture_norm16 GL_EXT_texture_query_lod GL_EXT_texture_rg GL_EXT_texture_sRGB_R8" +ext="$ext GL_EXT_texture_sRGB_decode GL_EXT_texture_shadow_lod GL_EXT_texture_storage GL_EXT_texture_view" +ext="$ext GL_EXT_unpack_subimage GL_EXT_window_rectangles GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent" +ext="$ext GL_KHR_context_flush_control GL_KHR_debug GL_KHR_no_error GL_KHR_parallel_shader_compile" +ext="$ext GL_KHR_robust_buffer_access_behavior GL_KHR_robustness GL_KHR_shader_subgroup GL_KHR_texture_compression_astc_hdr" +ext="$ext GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_sliced_3d GL_NVX_blend_equation_advanced_multi_draw_buffers" +ext="$ext GL_NV_bgr GL_NV_bindless_texture GL_NV_blend_equation_advanced GL_NV_blend_equation_advanced_coherent" +ext="$ext GL_NV_blend_minmax_factor GL_NV_clip_space_w_scaling GL_NV_conditional_render GL_NV_conservative_raster" +ext="$ext GL_NV_conservative_raster_pre_snap_triangles GL_NV_copy_buffer GL_NV_copy_image GL_NV_draw_buffers" +ext="$ext GL_NV_draw_instanced GL_NV_draw_texture GL_NV_draw_vulkan_image GL_NV_explicit_attrib_location" +ext="$ext GL_NV_fbo_color_attachments GL_NV_fill_rectangle GL_NV_fragment_coverage_to_color GL_NV_fragment_shader_interlock" +ext="$ext GL_NV_framebuffer_blit GL_NV_framebuffer_mixed_samples GL_NV_framebuffer_multisample GL_NV_generate_mipmap_sRGB" +ext="$ext GL_NV_geometry_shader_passthrough GL_NV_gpu_shader5 GL_NV_image_formats GL_NV_instanced_arrays" +ext="$ext GL_NV_internalformat_sample_query GL_NV_memory_attachment GL_NV_memory_object_sparse GL_NV_non_square_matrices" +ext="$ext GL_NV_occlusion_query_samples GL_NV_pack_subimage GL_NV_packed_float GL_NV_packed_float_linear" +ext="$ext GL_NV_path_rendering GL_NV_path_rendering_shared_edge GL_NV_pixel_buffer_object GL_NV_polygon_mode" +ext="$ext GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_NV_sRGB_formats" +ext="$ext GL_NV_sample_locations GL_NV_sample_mask_override_coverage GL_NV_shader_atomic_fp16_vector" +ext="$ext GL_NV_shader_noperspective_interpolation GL_NV_shader_subgroup_partitioned GL_NV_shadow_samplers_array" +ext="$ext GL_NV_shadow_samplers_cube GL_NV_stereo_view_rendering GL_NV_texture_array GL_NV_texture_barrier" +ext="$ext GL_NV_texture_border_clamp GL_NV_texture_compression_latc GL_NV_texture_compression_s3tc GL_NV_texture_compression_s3tc_update" +ext="$ext GL_NV_timeline_semaphore GL_NV_timer_query GL_NV_viewport_array GL_NV_viewport_array2 GL_NV_viewport_swizzle" +ext="$ext GL_OES_compressed_ETC1_RGB8_texture GL_OES_copy_image GL_OES_depth24 GL_OES_depth32 GL_OES_depth_texture" +ext="$ext GL_OES_depth_texture_cube_map GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_element_index_uint" +ext="$ext GL_OES_fbo_render_mipmap GL_OES_geometry_point_size GL_OES_geometry_shader GL_OES_get_program_binary" +ext="$ext GL_OES_gpu_shader5 GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_primitive_bounding_box" +ext="$ext GL_OES_rgb8_rgba8 GL_OES_sample_shading GL_OES_sample_variables GL_OES_shader_image_atomic" +ext="$ext GL_OES_shader_io_blocks GL_OES_shader_multisample_interpolation GL_OES_standard_derivatives GL_OES_tessellation_point_size" +ext="$ext GL_OES_tessellation_shader GL_OES_texture_border_clamp GL_OES_texture_buffer GL_OES_texture_cube_map_array" +ext="$ext GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear" +ext="$ext GL_OES_texture_npot GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_OES_texture_view" +ext="$ext GL_OES_vertex_array_object GL_OES_vertex_half_float GL_OES_viewport_array GL_OVR_multiview GL_OVR_multiview2" +ext="$ext GL_OVR_multiview_multisampled_render_to_texture" + +export MESA_EXTENSION_OVERRIDE="$ext" +"$@" diff --git a/tools/optimize-assets.sh b/tools/optimize-assets.sh new file mode 100755 index 0000000000..b7d52330f2 --- /dev/null +++ b/tools/optimize-assets.sh @@ -0,0 +1,9 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# Optimizes assets of Eden (requires OptiPng) + +which optipng || exit +find . -type f -name "*.png" -exec optipng -o7 {} \; diff --git a/tools/reset-submodules.sh b/tools/reset-submodules.sh deleted file mode 100755 index 6fdfe0bcdb..0000000000 --- a/tools/reset-submodules.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -ex - -# SPDX-FileCopyrightText: 2024 yuzu Emulator Project -# SPDX-License-Identifier: MIT - -git submodule sync -git submodule foreach --recursive git reset --hard -git submodule update --init --recursive diff --git a/tools/shellcheck.sh b/tools/shellcheck.sh new file mode 100755 index 0000000000..719c717cf2 --- /dev/null +++ b/tools/shellcheck.sh @@ -0,0 +1,11 @@ +#!/bin/sh -e + +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# fd is slightly faster on NVMe (the syntax sux though) +if command -v fd > /dev/null; then + fd . tools -esh -x shellcheck +else + find tools -name "*.sh" -exec shellcheck -s sh {} \; +fi \ No newline at end of file diff --git a/tools/update-cpm.sh b/tools/update-cpm.sh index 30e400209d..8bd8df2b83 100755 --- a/tools/update-cpm.sh +++ b/tools/update-cpm.sh @@ -1,3 +1,6 @@ -#!/bin/sh +#!/bin/sh -e -wget -O CMakeModules/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +wget -O CMakeModules/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/CPM.cmake diff --git a/.ci/update-icons.sh b/tools/update-icons.sh similarity index 73% rename from .ci/update-icons.sh rename to tools/update-icons.sh index 99adbfae66..a2c1ae8ebf 100755 --- a/.ci/update-icons.sh +++ b/tools/update-icons.sh @@ -1,12 +1,14 @@ #!/bin/sh -e -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -which png2icns || [ which yay && yay libicns ] || exit +# Updates main icons for eden + +which png2icns || (which yay && yay libicns) || exit which magick || exit -export EDEN_SVG_ICO="dist/org.eden_emu.eden.svg" +export EDEN_SVG_ICO="dist/dev.eden_emu.eden.svg" svgo --multipass $EDEN_SVG_ICO magick -density 256x256 -background transparent $EDEN_SVG_ICO \ diff --git a/tools/url-hash.sh b/tools/url-hash.sh deleted file mode 100755 index a54dec8bb2..0000000000 --- a/tools/url-hash.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -SUM=`wget -q $1 -O - | sha512sum` -echo "$SUM" | cut -d " " -f1