diff --git a/CMakeLists.txt b/CMakeLists.txt index ecb8a8268d..dacbc73685 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,24 +44,18 @@ if (PLATFORM_FREEBSD) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") endif() -# Check if SDL2::SDL2 target exists; if not, create an alias -if (TARGET SDL2::SDL2-static) - add_library(SDL2::SDL2 ALIAS SDL2::SDL2-static) -elseif (TARGET SDL2::SDL2-shared) - add_library(SDL2::SDL2 ALIAS SDL2::SDL2-shared) -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 -option(ENABLE_SDL2 "Enable the SDL2 frontend" ON) -CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF) +CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF) + +set(EXT_DEFAULT ON) if (PLATFORM_FREEBSD) - CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF) -else() - CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF) + 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) @@ -78,29 +72,10 @@ 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) -if (PLATFORM_FREEBSD) - option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" OFF) -else() - option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ON) -endif() - -if (PLATFORM_FREEBSD) - option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" OFF) -else() - option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON) -endif() - -if (PLATFORM_FREEBSD) - option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" OFF) -else() - option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ON) -endif() - -if (PLATFORM_FREEBSD) - option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" OFF) -else() - option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ON) -endif() +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) @@ -116,17 +91,16 @@ option(ENABLE_MICROPROFILE "Enables microprofile capabilities" OFF) option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") -if (PLATFORM_FREEBSD) - option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF) -else() - option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON) -endif() +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) -option(FORCE_DOWNLOAD_OPENSSL "Forcefully download all bundled OpenSSL builds (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) @@ -169,6 +143,11 @@ 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") @@ -330,7 +309,7 @@ if (UNIX) add_definitions(-DYUZU_UNIX=1) endif() -if (ARCHITECTURE_arm64 AND (ANDROID OR APPLE OR PLATFORM_LINUX)) +if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) set(HAS_NCE 1) add_definitions(-DHAS_NCE=1) endif() @@ -398,183 +377,18 @@ if (YUZU_USE_CPM) # openssl funniness if (ENABLE_OPENSSL) - set(SSL_VERSION 3.5.2) - - if ((MSVC AND ARCHITECTURE_x86_64) OR FORCE_DOWNLOAD_OPENSSL) - set(ARTIFACT openssl-windows-amd64-${SSL_VERSION}.tar.zst) - set(KEY windows-amd64) - - if (MSVC AND ARCHITECTURE_x86_64) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-windows-amd64 - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT ${ARTIFACT} - - KEY ${KEY} - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} + 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} ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-windows-amd64_SOURCE_DIR}) - endif() - message("OPENSSL ${DOWNLOAD_ONLY} ${OPENSSL_DIR}") - endif() - if ((MSVC AND ARCHITECTURE_arm64) OR FORCE_DOWNLOAD_OPENSSL) - set(ARTIFACT openssl-windows-arm64-${SSL_VERSION}.tar.zst) - set(KEY windows-arm64) - - if (MSVC AND ARCHITECTURE_arm64) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-windows-arm64 - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT ${ARTIFACT} - - KEY ${KEY} - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-windows-arm64_SOURCE_DIR}) - endif() - endif() - - if (ANDROID OR FORCE_DOWNLOAD_OPENSSL) - if (ANDROID) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-android - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-android-${SSL_VERSION}.tar.zst - - KEY android - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-android_SOURCE_DIR}) - endif() - endif() - - if(PLATFORM_SUN OR FORCE_DOWNLOAD_OPENSSL) - if (PLATFORM_SUN) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-solaris - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-solaris-${SSL_VERSION}.tar.zst - - KEY solaris - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-solaris_SOURCE_DIR}) - endif() - endif() - - if(PLATFORM_FREEBSD OR FORCE_DOWNLOAD_OPENSSL) - if (PLATFORM_FREEBSD) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-freebsd - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-freebsd-${SSL_VERSION}.tar.zst - - KEY freebsd - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-freebsd_SOURCE_DIR}) - endif() - endif() - - if(PLATFORM_LINUX OR FORCE_DOWNLOAD_OPENSSL) - if (PLATFORM_LINUX) - set(DOWNLOAD_ONLY OFF) - set(BUILD_SHARED_LIBS OFF) - else() - set(DOWNLOAD_ONLY ON) - endif() - - AddPackage( - NAME OpenSSL-linux - REPO crueter/OpenSSL-CI - TAG v${SSL_VERSION} - VERSION ${SSL_VERSION} - ARTIFACT openssl-linux-${SSL_VERSION}.tar.zst - - KEY linux - HASH_SUFFIX sha512sum - BUNDLED_PACKAGE ON - DOWNLOAD_ONLY ${DOWNLOAD_ONLY} - ) - - if (NOT DOWNLOAD_ONLY) - set(OPENSSL_DIR ${OpenSSL-linux_SOURCE_DIR}) - endif() - endif() - - if (DEFINED OPENSSL_DIR) - include(${OPENSSL_DIR}/openssl.cmake) - - # Overrides find package - CPMAddPackage( - NAME OpenSSL - SOURCE_DIR ${OPENSSL_DIR} - ) - else() - find_package(OpenSSL 1.1.1 REQUIRED) - endif() + find_package(OpenSSL 1.1.1 REQUIRED) endif() # boost @@ -589,6 +403,7 @@ if (YUZU_USE_CPM) GIT_VERSION 1.88.0 VERSION 1.57 + EXCLUDE_FROM_ALL ON ) # really annoying thing where boost::headers doesn't work with cpm @@ -619,6 +434,7 @@ if (YUZU_USE_CPM) VERSION 8 OPTIONS "FMT_INSTALL OFF" + EXCLUDE_FROM_ALL ON ) # lz4 @@ -628,6 +444,7 @@ if (YUZU_USE_CPM) SHA ebb370ca83 HASH 43600e87b35256005c0f2498fa56a77de6783937ba4cfce38c099f27c03188d097863e8a50c5779ca0a7c63c29c4f7ed0ae526ec798c1fd2e3736861b62e0a37 SOURCE_SUBDIR build/cmake + EXCLUDE_FROM_ALL ON ) if (lz4_ADDED) @@ -641,6 +458,7 @@ if (YUZU_USE_CPM) SHA 55f93686c0 HASH b739749b066800e21154506ea150d2c5cbce8a45344177f46f884547a1399d26753166fd0df8135269ce28cf223552b1b65cd625b88c844d54753f2434900486 VERSION 3.8 + EXCLUDE_FROM_ALL ON ) # zlib @@ -681,6 +499,7 @@ if (YUZU_USE_CPM) SHA 644821ce28 HASH f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f VERSION 3.0.1 + EXCLUDE_FROM_ALL ON ) endif() @@ -692,6 +511,7 @@ if (YUZU_USE_CPM) VERSION 1.3 HASH 3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd FIND_PACKAGE_ARGUMENTS "MODULE" + EXCLUDE_FROM_ALL ON ) if (enet_ADDED) @@ -711,6 +531,7 @@ if (YUZU_USE_CPM) "OPUS_BUILD_PROGRAMS OFF" "OPUS_INSTALL_PKG_CONFIG_MODULE OFF" "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF" + EXCLUDE_FROM_ALL ON ) if(ENABLE_CUBEB) @@ -725,6 +546,7 @@ if (YUZU_USE_CPM) "BUILD_TESTS OFF" "BUILD_TOOLS OFF" "BUNDLE_SPEEX ON" + EXCLUDE_FROM_ALL ON ) if (cubeb_ADDED) @@ -786,6 +608,7 @@ if(NOT TARGET Boost::headers) SHA 0456900fad HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3 BUNDLED_PACKAGE ON + EXCLUDE_FROM_ALL ON ) endif() @@ -823,8 +646,8 @@ AddPackage( REPO brofield/simpleini SHA 09c21bda1d HASH 99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c - EXCLUDE_FROM_ALL ON FIND_PACKAGE_ARGUMENTS "MODULE" + EXCLUDE_FROM_ALL ON ) # TODO(crueter): Work around this @@ -834,33 +657,66 @@ if (NOT YUZU_USE_EXTERNAL_VULKAN_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 -# TODO(crueter): combine this all with CPM. if (ENABLE_SDL2) - if (YUZU_USE_BUNDLED_SDL2) - # Detect toolchain and platform - if ((MSVC_VERSION GREATER_EQUAL 1920) AND ARCHITECTURE_x86_64) - set(SDL2_VER "SDL2-2.32.8") - else() - message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable YUZU_USE_BUNDLED_SDL2 and provide your own.") - endif() - - if (DEFINED SDL2_VER) - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX 2.32.8) - endif() - - set(SDL2_FOUND YES) - set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers") - set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library") - set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll") - - add_library(SDL2::SDL2 INTERFACE IMPORTED) - target_link_libraries(SDL2::SDL2 INTERFACE "${SDL2_LIBRARY}") - target_include_directories(SDL2::SDL2 INTERFACE "${SDL2_INCLUDE_DIR}") - elseif (YUZU_USE_EXTERNAL_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.") - else() - find_package(SDL2 2.26.4 REQUIRED) + 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) endif() # List of all FFmpeg components required @@ -903,7 +759,7 @@ if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER) find_package(cpp-jwt) endif() -if (NOT YUZU_USE_BUNDLED_SDL2) +if (ENABLE_SDL2) find_package(SDL2) endif() @@ -925,7 +781,7 @@ if (ENABLE_QT) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - find_package(Qt6 REQUIRED COMPONENTS DBus GuiPrivate) + find_package(Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS GuiPrivate) elseif (UNIX AND NOT APPLE) find_package(Qt6 REQUIRED COMPONENTS DBus Gui) endif() diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index 07393d6ccd..519e7e32a8 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -252,3 +252,171 @@ function(AddPackage) PARENT_SCOPE) endfunction() + +function(add_ci_package key) + set(ARTIFACT ${ARTIFACT_NAME}-${key}-${ARTIFACT_VERSION}.${ARTIFACT_EXT}) + + AddPackage( + NAME ${ARTIFACT_PACKAGE}-${key} + REPO ${ARTIFACT_REPO} + TAG v${ARTIFACT_VERSION} + VERSION ${ARTIFACT_VERSION} + ARTIFACT ${ARTIFACT} + + KEY ${key} + HASH_SUFFIX sha512sum + BUNDLED_PACKAGE ON + DOWNLOAD_ONLY ON + ) + + if (NOT ARTIFACT_FORCE_DOWNLOAD OR ARTIFACT_OVERRIDE) + set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}-${key}_SOURCE_DIR} PARENT_SCOPE) + endif() +endfunction() + +# TODO(crueter): doc +function(AddCIPackage) + set(oneValueArgs + VERSION + NAME + REPO + PACKAGE + EXTENSION + FORCE_DOWNLOAD + MIN_VERSION + DISABLED_PLATFORMS + CMAKE_FILENAME + TARGET + ) + + cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN}) + + if(NOT DEFINED PKG_ARGS_VERSION) + message(FATAL_ERROR "[CPMUtil] VERSION is required") + endif() + if(NOT DEFINED PKG_ARGS_NAME) + message(FATAL_ERROR "[CPMUtil] NAME is required") + endif() + if(NOT DEFINED PKG_ARGS_REPO) + message(FATAL_ERROR "[CPMUtil] REPO is required") + endif() + if(NOT DEFINED PKG_ARGS_PACKAGE) + message(FATAL_ERROR "[CPMUtil] PACKAGE is required") + endif() + + if (NOT DEFINED PKG_ARGS_CMAKE_FILENAME) + set(ARTIFACT_CMAKE ${PKG_ARGS_NAME}) + else() + set(ARTIFACT_CMAKE ${PKG_ARGS_CMAKE_FILENAME}) + endif() + + if(NOT DEFINED PKG_ARGS_EXTENSION) + set(ARTIFACT_EXT "tar.zst") + else() + 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() + + if (DEFINED PKG_ARGS_DISABLED_PLATFORMS) + set(DISABLED_PLATFORMS ${PKG_ARGS_DISABLED_PLATFORMS}) + endif() + + # this is mildly annoying + set(ARTIFACT_VERSION ${PKG_ARGS_VERSION}) + set(ARTIFACT_NAME ${PKG_ARGS_NAME}) + 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() + + 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() + + 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() + + 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) + 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) + 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) + 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() + + add_ci_package(linux-aarch64) + set(ARTIFACT_OVERRIDE OFF) + 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() + else() + find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED) + endif() +endfunction() diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 3651781f93..642d7d0df1 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -49,9 +49,6 @@ function(download_win_archives) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1) - # TODO(crueter): separate handling for arm64 - set(SDL2_VER "SDL2-2.32.8") - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8) set(FORCE_WIN_ARCHIVES OFF) endfunction() diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 71dd2962e7..64592a8855 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -32,7 +32,7 @@ endif() # Xbyak (also used by Dynarmic, so needs to be added first) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) - if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") + if (PLATFORM_SUN) # Fix regset.h collisions set(XBYAK_HASH 51f507b0b3) set(XBYAK_SHA512SUM 4a29a3c2f97f7d5adf667a21a008be03c951fb6696b0d7ba27e7e4afa037bc76eb5e059bb84860e01baf741d4d3ac851b840cd54c99d038812fbe0f1fa6d38a4) @@ -94,49 +94,6 @@ if (ENABLE_LIBUSB AND NOT TARGET libusb::usb) add_subdirectory(libusb) endif() -# SDL2 -if (NOT YUZU_USE_BUNDLED_SDL2) - 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) - elseif ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") - set(SDL_HASH d310b5679f) - set(SDL_SHA512SUM cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e) - else() - set(SDL_HASH 2e4c12cd2c) - set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e) - endif() - - AddPackage( - NAME SDL2 - REPO "libsdl-org/SDL" - SHA ${SDL_HASH} - HASH ${SDL_SHA512SUM} - KEY ${YUZU_SYSTEM_PROFILE} - BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_SDL2} - ) -endif() - # Sirit # TODO(crueter): spirv-tools doesn't work w/ system set(SPIRV_WERROR OFF) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index ea0ff5427d..0cbb29b01b 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -151,7 +151,7 @@ android { create("genshinSpoof") { dimension = "version" resValue("string", "app_name_suffixed", "Eden Optimised") - applicationId = "com.miHoYo.Yuanshen" + applicationId = "com.miHoYo.Yuanshen" } } } 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 153d464f68..21a159676d 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 @@ -69,6 +69,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { 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 d53aa46265..21aad8b5d1 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 @@ -27,6 +27,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { RENDERER_SCREEN_LAYOUT("screen_layout"), RENDERER_ASPECT_RATIO("aspect_ratio"), RENDERER_OPTIMIZE_SPIRV_OUTPUT("optimize_spirv_output"), + DMA_ACCURACY("dma_accuracy"), AUDIO_OUTPUT_ENGINE("output_engine"), MAX_ANISOTROPY("max_anisotropy"), THEME("theme"), @@ -58,7 +59,7 @@ 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") ; 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/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 15fde13bf3..062038aa44 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 @@ -602,6 +602,15 @@ abstract class SettingsItem( valuesId = R.array.optimizeSpirvOutputValues ) ) + put( + SingleChoiceSetting( + IntSetting.DMA_ACCURACY, + titleId = R.string.dma_accuracy, + descriptionId = R.string.dma_accuracy_description, + choicesId = R.array.dmaAccuracyNames, + valuesId = R.array.dmaAccuracyValues + ) + ) put( SwitchSetting( BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS, 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 bcdd65b1a3..672bcd492c 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 @@ -448,6 +448,7 @@ class SettingsFragmentPresenter( 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) add(BooleanSetting.FRAME_INTERPOLATION.key) add(BooleanSetting.RENDERER_FAST_GPU.key) 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 e80237b5a9..96015e58ec 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 @@ -174,7 +174,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } game = gameToUse - } catch (e: Exception) { Log.error("[EmulationFragment] Error during game setup: ${e.message}") Toast.makeText( @@ -193,10 +192,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { game?.let { gameInstance -> val customConfigFile = SettingsFile.getCustomSettingsFile(gameInstance) if (customConfigFile.exists()) { - Log.info("[EmulationFragment] Found existing custom settings for ${gameInstance.title}, loading them") + Log.info( + "[EmulationFragment] Found existing custom settings for ${gameInstance.title}, loading them" + ) SettingsFile.loadCustomConfig(gameInstance) } else { - Log.info("[EmulationFragment] No custom settings found for ${gameInstance.title}, using global settings") + Log.info( + "[EmulationFragment] No custom settings found for ${gameInstance.title}, using global settings" + ) NativeConfig.reloadGlobalConfig() } } ?: run { @@ -225,7 +228,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { try { NativeConfig.reloadGlobalConfig() } catch (fallbackException: Exception) { - Log.error("[EmulationFragment] Critical error: could not load global config: ${fallbackException.message}") + Log.error( + "[EmulationFragment] Critical error: could not load global config: ${fallbackException.message}" + ) throw fallbackException } } @@ -233,7 +238,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { emulationState = EmulationState(game!!.path) { return@EmulationState driverViewModel.isInteractionAllowed.value } - } /** @@ -333,10 +337,14 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { val customConfigFile = SettingsFile.getCustomSettingsFile(foundGame) if (customConfigFile.exists()) { - Log.info("[EmulationFragment] Found existing custom settings for ${foundGame.title}, loading them") + Log.info( + "[EmulationFragment] Found existing custom settings for ${foundGame.title}, loading them" + ) SettingsFile.loadCustomConfig(foundGame) } else { - Log.info("[EmulationFragment] No custom settings found for ${foundGame.title}, using global settings") + Log.info( + "[EmulationFragment] No custom settings found for ${foundGame.title}, using global settings" + ) } Toast.makeText( @@ -352,7 +360,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { withContext(Dispatchers.Main) { try { finishGameSetup() - Log.info("[EmulationFragment] Game setup complete for intent launch") + Log.info( + "[EmulationFragment] Game setup complete for intent launch" + ) if (_binding != null) { // Hide loading indicator immediately for intent launches @@ -365,12 +375,16 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { binding.root.post { if (binding.surfaceEmulation.holder.surface?.isValid == true && !emulationStarted) { emulationStarted = true - emulationState.newSurface(binding.surfaceEmulation.holder.surface) + emulationState.newSurface( + binding.surfaceEmulation.holder.surface + ) } } } } catch (e: Exception) { - Log.error("[EmulationFragment] Error in finishGameSetup: ${e.message}") + Log.error( + "[EmulationFragment] Error in finishGameSetup: ${e.message}" + ) requireActivity().finish() return@withContext } @@ -477,7 +491,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } if (game == null) { - Log.warning("[EmulationFragment] Game not yet initialized in onViewCreated - will be set up by async intent handler") + Log.warning( + "[EmulationFragment] Game not yet initialized in onViewCreated - will be set up by async intent handler" + ) return } 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 508f9de463..a317be14d5 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 @@ -18,6 +18,13 @@ import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import android.net.Uri import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.yuzu.yuzu_emu.databinding.DialogProgressBinding +import android.view.LayoutInflater +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.launch +import kotlinx.coroutines.CoroutineScope object CustomSettingsHandler { const val CUSTOM_CONFIG_ACTION = "dev.eden.eden_emulator.LAUNCH_WITH_CUSTOM_CONFIG" @@ -44,7 +51,9 @@ object CustomSettingsHandler { // Check if config already exists - this should be handled by the caller val configFile = getConfigFile(game) if (configFile.exists()) { - Log.warning("[CustomSettingsHandler] Config file already exists for game: ${game.title}") + Log.warning( + "[CustomSettingsHandler] Config file already exists for game: ${game.title}" + ) } // Write the config file @@ -121,37 +130,158 @@ object CustomSettingsHandler { // Check if driver exists in the driver storage val driverFile = File(driverPath) if (!driverFile.exists()) { - Log.error("[CustomSettingsHandler] Required driver not found: $driverPath") - Toast.makeText( - activity, - activity.getString( - R.string.custom_settings_failed_message, - game.title, - activity.getString(R.string.driver_not_found, driverFile.name) - ), - Toast.LENGTH_LONG - ).show() - // Don't write config if driver is missing - return null - } + Log.info("[CustomSettingsHandler] Driver not found locally: ${driverFile.name}") - // Verify it's a valid driver - val metadata = GpuDriverHelper.getMetadataFromZip(driverFile) - if (metadata.name == null) { - Log.error("[CustomSettingsHandler] Invalid driver file: $driverPath") - Toast.makeText( - activity, - activity.getString( - R.string.custom_settings_failed_message, - game.title, - activity.getString(R.string.invalid_driver_file, driverFile.name) - ), - Toast.LENGTH_LONG - ).show() - return null - } + // Ask user if they want to download the missing driver + val shouldDownload = askUserToDownloadDriver(activity, driverFile.name) + if (!shouldDownload) { + Log.info("[CustomSettingsHandler] User declined to download driver") + Toast.makeText( + activity, + activity.getString(R.string.driver_download_cancelled), + Toast.LENGTH_SHORT + ).show() + return null + } - Log.info("[CustomSettingsHandler] Driver verified: ${metadata.name}") + // Check network connectivity after user consent + if (!DriverResolver.isNetworkAvailable(activity)) { + Log.error("[CustomSettingsHandler] No network connection available") + Toast.makeText( + activity, + activity.getString(R.string.network_unavailable), + Toast.LENGTH_LONG + ).show() + return null + } + + Log.info("[CustomSettingsHandler] User approved, downloading driver") + + // Show progress dialog for driver download + val dialogBinding = DialogProgressBinding.inflate(LayoutInflater.from(activity)) + dialogBinding.progressBar.isIndeterminate = false + dialogBinding.title.text = activity.getString(R.string.installing_driver) + dialogBinding.status.text = activity.getString(R.string.downloading) + + val progressDialog = MaterialAlertDialogBuilder(activity) + .setView(dialogBinding.root) + .setCancelable(false) + .create() + + withContext(Dispatchers.Main) { + progressDialog.show() + } + + try { + // Set up progress channel for thread-safe UI updates + val progressChannel = Channel(Channel.CONFLATED) + val progressJob = CoroutineScope(Dispatchers.Main).launch { + for (progress in progressChannel) { + dialogBinding.progressBar.progress = progress + } + } + + // Attempt to download and install the driver + val driverUri = DriverResolver.ensureDriverAvailable(driverPath, activity) { progress -> + progressChannel.trySend(progress.toInt()) + } + + progressChannel.close() + progressJob.cancel() + + withContext(Dispatchers.Main) { + progressDialog.dismiss() + } + + if (driverUri == null) { + Log.error( + "[CustomSettingsHandler] Failed to download driver: ${driverFile.name}" + ) + Toast.makeText( + activity, + activity.getString( + R.string.custom_settings_failed_message, + game.title, + activity.getString(R.string.driver_not_found, driverFile.name) + ), + Toast.LENGTH_LONG + ).show() + return null + } + + // Verify the downloaded driver + val installedFile = File(driverPath) + val metadata = GpuDriverHelper.getMetadataFromZip(installedFile) + if (metadata.name == null) { + Log.error( + "[CustomSettingsHandler] Downloaded driver is invalid: $driverPath" + ) + Toast.makeText( + activity, + activity.getString( + R.string.custom_settings_failed_message, + game.title, + activity.getString( + R.string.invalid_driver_file, + driverFile.name + ) + ), + Toast.LENGTH_LONG + ).show() + return null + } + + // Add to driver list + driverViewModel.onDriverAdded(Pair(driverPath, metadata)) + Log.info( + "[CustomSettingsHandler] Successfully downloaded and installed driver: ${metadata.name}" + ) + + Toast.makeText( + activity, + activity.getString( + R.string.successfully_installed, + metadata.name ?: driverFile.name + ), + Toast.LENGTH_SHORT + ).show() + } catch (e: Exception) { + withContext(Dispatchers.Main) { + progressDialog.dismiss() + } + Log.error("[CustomSettingsHandler] Error downloading driver: ${e.message}") + Toast.makeText( + activity, + activity.getString( + R.string.custom_settings_failed_message, + game.title, + e.message ?: activity.getString( + R.string.driver_not_found, + driverFile.name + ) + ), + Toast.LENGTH_LONG + ).show() + return null + } + } else { + // Driver exists, verify it's valid + val metadata = GpuDriverHelper.getMetadataFromZip(driverFile) + if (metadata.name == null) { + Log.error("[CustomSettingsHandler] Invalid driver file: $driverPath") + Toast.makeText( + activity, + activity.getString( + R.string.custom_settings_failed_message, + game.title, + activity.getString(R.string.invalid_driver_file, driverFile.name) + ), + Toast.LENGTH_LONG + ).show() + return null + } + Log.info("[CustomSettingsHandler] Driver verified: ${metadata.name}") + } } } @@ -290,6 +420,29 @@ object CustomSettingsHandler { } } + /** + * Ask user if they want to download a missing driver + */ + private suspend fun askUserToDownloadDriver(activity: FragmentActivity, driverName: String): Boolean { + return suspendCoroutine { continuation -> + activity.runOnUiThread { + MaterialAlertDialogBuilder(activity) + .setTitle(activity.getString(R.string.driver_missing_title)) + .setMessage( + activity.getString(R.string.driver_missing_message, driverName) + ) + .setPositiveButton(activity.getString(R.string.download)) { _, _ -> + continuation.resume(true) + } + .setNegativeButton(activity.getString(R.string.cancel)) { _, _ -> + continuation.resume(false) + } + .setCancelable(false) + .show() + } + } + } + /** * Extract driver path from custom settings INI content */ 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 new file mode 100644 index 0000000000..74f98ccbd2 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DriverResolver.kt @@ -0,0 +1,371 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.utils + +import android.content.Context +import android.net.Uri +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.withContext +import okhttp3.OkHttpClient +import okhttp3.Request +import org.yuzu.yuzu_emu.fragments.DriverFetcherFragment +import java.io.File +import java.io.IOException +import java.util.concurrent.TimeUnit +import java.util.concurrent.ConcurrentHashMap +import okhttp3.ConnectionPool +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import kotlinx.coroutines.delay +import kotlin.math.pow + +/** + * Resolves driver download URLs from filenames by searching GitHub repositories + */ +object DriverResolver { + private const val CONNECTION_TIMEOUT_SECONDS = 30L + private const val CACHE_DURATION_MS = 3600000L // 1 hour + private const val BUFFER_SIZE = 8192 + private const val MIN_API_CALL_INTERVAL = 2000L // 2 seconds between API calls + private const val MAX_RETRY_COUNT = 3 + + @Volatile + private var client: OkHttpClient? = null + + private fun getClient(): OkHttpClient { + return client ?: synchronized(this) { + client ?: OkHttpClient.Builder() + .connectTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .readTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .writeTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .followRedirects(true) + .followSslRedirects(true) + .connectionPool(ConnectionPool(5, 1, TimeUnit.MINUTES)) + .build().also { client = it } + } + } + + // Driver repository paths - (from DriverFetcherFragment) might extract these to a config file later + private val repositories = listOf( + "MrPurple666/purple-turnip", + "crueter/GameHub-8Elite-Drivers", + "K11MCH1/AdrenoToolsDrivers", + "Weab-chan/freedreno_turnip-CI" + ) + + private val urlCache = ConcurrentHashMap() + private val releaseCache = ConcurrentHashMap>() + private var lastCacheTime = 0L + private var lastApiCallTime = 0L + + data class ResolvedDriver( + val downloadUrl: String, + val repoPath: String, + val releaseTag: String, + val filename: String + ) + + /** + * Resolve a driver download URL from its filename + * @param filename The driver filename (e.g., "turnip_mrpurple-T19-toasted.adpkg.zip") + * @return ResolvedDriver with download URL and metadata, or null if not found + */ + suspend fun resolveDriverUrl(filename: String): ResolvedDriver? { + // Validate input + require(filename.isNotBlank()) { "Filename cannot be blank" } + require(!filename.contains("..")) { "Invalid filename: path traversal detected" } + + // Check cache first + urlCache[filename]?.let { + Log.info("[DriverResolver] Found cached URL for $filename") + return it + } + + Log.info("[DriverResolver] Resolving download URL for: $filename") + + // Clear cache if expired + if (System.currentTimeMillis() - lastCacheTime > CACHE_DURATION_MS) { + releaseCache.clear() + lastCacheTime = System.currentTimeMillis() + } + + return coroutineScope { + // Search all repositories in parallel + repositories.map { repoPath -> + async { + searchRepository(repoPath, filename) + } + }.mapNotNull { it.await() }.firstOrNull().also { resolved -> + // Cache the result if found + resolved?.let { + urlCache[filename] = it + Log.info("[DriverResolver] Cached resolution for $filename from ${it.repoPath}") + } + } + } + } + + /** + * Search a specific repository for a driver file + */ + private suspend fun searchRepository(repoPath: String, filename: String): ResolvedDriver? { + return withContext(Dispatchers.IO) { + try { + // Get releases from cache or fetch + val releases = releaseCache[repoPath] ?: fetchReleases(repoPath).also { + releaseCache[repoPath] = it + } + + // Search through all releases and artifacts + for (release in releases) { + for (artifact in release.artifacts) { + if (artifact.name == filename) { + Log.info( + "[DriverResolver] Found $filename in $repoPath/${release.tagName}" + ) + return@withContext ResolvedDriver( + downloadUrl = artifact.url.toString(), + repoPath = repoPath, + releaseTag = release.tagName, + filename = filename + ) + } + } + } + null + } catch (e: Exception) { + Log.error("[DriverResolver] Failed to search $repoPath: ${e.message}") + null + } + } + } + + /** + * Fetch releases from a GitHub repository + */ + private suspend fun fetchReleases(repoPath: String): List = withContext( + Dispatchers.IO + ) { + // Rate limiting + val timeSinceLastCall = System.currentTimeMillis() - lastApiCallTime + if (timeSinceLastCall < MIN_API_CALL_INTERVAL) { + delay(MIN_API_CALL_INTERVAL - timeSinceLastCall) + } + lastApiCallTime = System.currentTimeMillis() + + // Retry logic with exponential backoff + var retryCount = 0 + var lastException: Exception? = null + + while (retryCount < MAX_RETRY_COUNT) { + try { + val request = Request.Builder() + .url("https://api.github.com/repos/$repoPath/releases") + .header("Accept", "application/vnd.github.v3+json") + .build() + + return@withContext getClient().newCall(request).execute().use { response -> + when { + response.code == 404 -> throw IOException("Repository not found: $repoPath") + response.code == 403 -> { + val resetTime = response.header("X-RateLimit-Reset")?.toLongOrNull() ?: 0 + throw IOException( + "API rate limit exceeded. Resets at ${java.util.Date( + resetTime * 1000 + )}" + ) + } + !response.isSuccessful -> throw IOException( + "HTTP ${response.code}: ${response.message}" + ) + } + + val body = response.body?.string() + ?: throw IOException("Empty response from $repoPath") + + // Determine if this repo uses tag names (from DriverFetcherFragment logic) + val useTagName = repoPath.contains("K11MCH1") + val sortMode = if (useTagName) { + DriverFetcherFragment.SortMode.PublishTime + } else { + DriverFetcherFragment.SortMode.Default + } + + DriverFetcherFragment.Release.fromJsonArray(body, useTagName, sortMode) + } + } catch (e: IOException) { + lastException = e + if (retryCount == MAX_RETRY_COUNT - 1) throw e + delay((2.0.pow(retryCount) * 1000).toLong()) + retryCount++ + } + } + throw lastException ?: IOException( + "Failed to fetch releases after $MAX_RETRY_COUNT attempts" + ) + } + + /** + * Download a driver file to the cache directory + * @param resolvedDriver The resolved driver information + * @param context Android context for cache directory + * @return The downloaded file, or null if download failed + */ + suspend fun downloadDriver( + resolvedDriver: ResolvedDriver, + context: Context, + onProgress: ((Float) -> Unit)? = null + ): File? { + return withContext(Dispatchers.IO) { + try { + Log.info( + "[DriverResolver] Downloading ${resolvedDriver.filename} from ${resolvedDriver.repoPath}" + ) + + val cacheDir = context.externalCacheDir ?: throw IOException("Failed to access cache directory") + cacheDir.mkdirs() + + val file = File(cacheDir, resolvedDriver.filename) + + // If file already exists in cache and has content, return it + if (file.exists() && file.length() > 0) { + Log.info("[DriverResolver] Using cached file: ${file.absolutePath}") + return@withContext file + } + + val request = Request.Builder() + .url(resolvedDriver.downloadUrl) + .header("Accept", "application/octet-stream") + .build() + + getClient().newCall(request).execute().use { response -> + if (!response.isSuccessful) { + throw IOException("Download failed: ${response.code}") + } + + response.body?.use { body -> + val contentLength = body.contentLength() + body.byteStream().use { input -> + file.outputStream().use { output -> + val buffer = ByteArray(BUFFER_SIZE) + var totalBytesRead = 0L + var bytesRead: Int + + while (input.read(buffer).also { bytesRead = it } != -1) { + output.write(buffer, 0, bytesRead) + totalBytesRead += bytesRead + + if (contentLength > 0) { + val progress = (totalBytesRead.toFloat() / contentLength) * 100f + onProgress?.invoke(progress) + } + } + } + } + } ?: throw IOException("Empty response body") + } + + if (file.length() == 0L) { + file.delete() + throw IOException("Downloaded file is empty") + } + + Log.info( + "[DriverResolver] Successfully downloaded ${file.length()} bytes to ${file.absolutePath}" + ) + file + } catch (e: Exception) { + Log.error("[DriverResolver] Download failed: ${e.message}") + null + } + } + } + + /** + * Download and install a driver if not already present + * @param driverPath The driver filename or full path + * @param context Android context + * @param onProgress Optional progress callback (0-100) + * @return Uri of the installed driver, or null if failed + */ + suspend fun ensureDriverAvailable( + driverPath: String, + context: Context, + onProgress: ((Float) -> Unit)? = null + ): Uri? { + // Extract filename from path + val filename = driverPath.substringAfterLast('/') + + // Check if driver already exists locally + val localPath = "${GpuDriverHelper.driverStoragePath}$filename" + val localFile = File(localPath) + + if (localFile.exists() && localFile.length() > 0) { + Log.info("[DriverResolver] Driver already exists locally: $localPath") + return Uri.fromFile(localFile) + } + + Log.info("[DriverResolver] Driver not found locally, attempting to download: $filename") + + // Resolve download URL + val resolvedDriver = resolveDriverUrl(filename) + if (resolvedDriver == null) { + Log.error("[DriverResolver] Failed to resolve download URL for $filename") + return null + } + + // Download the driver with progress callback + val downloadedFile = downloadDriver(resolvedDriver, context, onProgress) + if (downloadedFile == null) { + Log.error("[DriverResolver] Failed to download driver $filename") + return null + } + + // Install the driver to internal storage + val downloadedUri = Uri.fromFile(downloadedFile) + if (GpuDriverHelper.copyDriverToInternalStorage(downloadedUri)) { + Log.info("[DriverResolver] Successfully installed driver to internal storage") + // Clean up cache file + downloadedFile.delete() + return Uri.fromFile(File(localPath)) + } else { + Log.error("[DriverResolver] Failed to copy driver to internal storage") + downloadedFile.delete() + return null + } + } + + /** + * Check network connectivity + */ + fun isNetworkAvailable(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager + ?: return false + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } + + /** + * Clear all caches + */ + fun clearCache() { + urlCache.clear() + releaseCache.clear() + lastCacheTime = 0L + lastApiCallTime = 0L + } + + /** + * Clean up resources + */ + fun cleanup() { + client?.dispatcher?.executorService?.shutdown() + client?.connectionPool?.evictAll() + client = null + clearCache() + } +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/GradientBorderCardView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/GradientBorderCardView.kt index 7badadd119..8f730fc490 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/GradientBorderCardView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/GradientBorderCardView.kt @@ -52,8 +52,10 @@ class GradientBorderCardView @JvmOverloads constructor( if (isEdenTheme) { // Gradient for Eden theme borderPaint.shader = LinearGradient( - 0f, 0f, - w.toFloat(), h.toFloat(), + 0f, + 0f, + w.toFloat(), + h.toFloat(), context.getColor(R.color.eden_border_gradient_start), context.getColor(R.color.eden_border_gradient_end), Shader.TileMode.CLAMP @@ -62,7 +64,11 @@ class GradientBorderCardView @JvmOverloads constructor( // Solid color for other themes borderPaint.shader = null val typedValue = android.util.TypedValue() - context.theme.resolveAttribute(com.google.android.material.R.attr.colorPrimary, typedValue, true) + context.theme.resolveAttribute( + com.google.android.material.R.attr.colorPrimary, + typedValue, + true + ) borderPaint.color = typedValue.data } diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 001074baad..155d165f2d 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -84,7 +84,7 @@ تمكين ذاكرة التخزين المؤقت LRU تمكين أو تعطيل ذاكرة التخزين المؤقت الأقل استخداماً مؤخراً (LRU) لتحسين الأداء عن طريق تقليل استخدام وحدة المعالجة المركزية. بعض الألعاب قد تواجه مشاكل معه، خاصةً TotK 1.2.1، لذا قم بتعطيله إذا لم تعمل اللعبة أو انهارت عشوائياً. الحالة الديناميكية الممتدة - تمكين ميزات فولكان لتحسين الأداء، العرض، وتوفير الموارد أثناء إنشاء خطوط المعالجة مع الحفاظ على استهلاك منخفض لوحدة المعالجة المركزية/وحدة معالجة الرسومات. هذه الامتدادات قد تزيد من حرارة الجهاز، ووحدات معالجة الرسومات من سلسلة A6XX القديمة قد لا تعمل بشكل صحيح. قم بتعطيله لمحاكاة الصيغ المضبوطة. + يتحكم في عدد الميزات التي يمكن استخدامها في الحالة الديناميكية الممتدة. الأرقام الأعلى تسمح بالمزيد من Мيزات ويمكن أن تزيد الأداء، ولكن قد تسبب مشاكل مع بعض برامج التشغيل والبائعين. قد تختلف القيمة الافتراضية اعتمادًا على نظامك وقدرات硬件. يمكن تغيير هذه القيمة حتى يتم تحقيق الاستقرار وجودة بصرية أفضل. معطل مزامنة سرعة النواة مزامنة سرعة النواة مع النسبة القصوى للسرعة لتحسين الأداء دون تغيير السرعة الفعلية للعبة. @@ -117,6 +117,8 @@ دورات تخطي إبطال ذاكرة التخزين المؤقت الداخلية للوحدة المركزية يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقت أثناء تحديثات الذاكرة، مما يقلل استخدام المعالج ويحسن أدائه. قد يسبب هذا أعطالاً أو تعطلًا في بعض الألعاب. + مستوى DMA + يتحكم في دقة تحديد مستوى DMA. الدقة الأعلى يمكنها إصلاح بعض المشاكل في بعض الألعاب، ولكنها قد تؤثر أيضًا على الأداء في بعض الحالات. إذا كنت غير متأكد، اتركه على الوضع الافتراضي. 4 جيجابايت (موصى به) @@ -677,6 +679,50 @@ اللعبة تتطلب برنامجاً ثابتاً نسخ وتثبيت البرنامج الثابت، أو اضغط "موافق" للمتابعة على أي حال.]]> + + جاري البحث عن اللعبة... + لم يتم العثور على اللعبة لمعرف العنوان: %1$s + فشل الإعدادات المخصصة + فشل تطبيق الإعدادات المخصصة لـ %1$s: %2$s + بدء التشغيل بالإعدادات الافتراضية + تم إلغاء البدء + غير قادر على تطبيق الإعدادات المطلوبة. قد يكون هذا بسبب отсут برامج تشغيل GPU أو مشاكل في التهيئة. + تم تطبيق الإعدادات المخصصة + جاري تشغيل %1$s... + فشل تهيئة اللعبة + هل تريد تشغيل %1$s بالإعدادات المخصصة؟ + هل تريد تشغيل %1$s؟ + تشغيل اللعبة + تشغيل + + + فشل كتابة ملف التهيئة + فشل تطبيق التهيئة + التهيئة موجودة بالفعل + توجد إعدادات مخصصة بالفعل لـ %1$s.\n\nهل تريد الكتابة فوق التهيئة الموجودة؟\n\nلا يمكن التراجع عن هذا الإجراء. + جاري التحقق من وجود تهيئة حالية... + تم إلغاء الكتابة فوق + جاري التحقق من وجود برنامج تشغيل مخصص: %1$s + برنامج التشغيل المخصص غير متاح لهذا الجهاز + الكتابة فوق + + + برنامج تشغيل GPU مفقود + برنامج التشغيل المخصص المحدد \"%s\" غير مثبت. هل تريد تنزيله وتثبيته الآن؟ + جاري تنزيل برنامج التشغيل... + تم تثبيت برنامج التشغيل بنجاح + فشل تثبيت برنامج التشغيل + فشل تثبيت برنامج تشغيل GPU: %s + برنامج التشغيل غير متاح + برنامج التشغيل المحدد غير متاح للتنزيل. + برنامج التشغيل المطلوب غير مثبت: %s + ملف برنامج تشغيل غير صالح: %s + لا يوجد اتصال بالشبكة. يرجى التحقق من اتصال الإنترنت والمحاولة مرة أخرى. + مطلوب برنامج تشغيل GPU + تكوين اللعبة يتطلب برنامج تشغيل GPU \"%s\" غير المثبت على جهازك.\n\nهل تريد تنزيله وتثبيته الآن? + تم إلغاء تنزيل برنامج التشغيل. لا يمكن تشغيل اللعبة بدون برنامج التشغيل المطلوب. + تنزيل + الخروج من المحاكاة إنهاء @@ -741,6 +787,12 @@ عالي Extreme (بطيء) + + افتراضي + عادي + عالي + مفرط + 0.25X (180p/270p) 0.5X (360p/540p) 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 9cbd89d886..1845dbbade 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -85,7 +85,7 @@ تمكين ذاكرة التخزين المؤقت LRU چالاک یان ناچالاککردنی کاشەی LRU، کارایی باشتر دەکات بە هەڵگرتنی بەکارهێنانی پرۆسەی CPU. هەندێک یاری کێشەی لەگەڵ هەیە، بەتایبەتی TotK 1.2.1، بۆیە بیخەوێنە ئەگەر یاریەکە نەگەڕێت یان بە هەڕەمەکی بشکێت. الحالة الديناميكية الممتدة - کاریگەرییەکانی ڤولکان چالاک بکە بۆ باشترکردنی کارایی، رێندرکردن، و هەڵگرتنی سەرچاوەکان لە دروستکردنی پایپلاین بە هەمان کات کەمترین بەکارهێنانی CPU/GPU بەکاربهێنرێت. ئەم زیادکراوانە ڕەنگە پلەی گەرمی ئامێر زیاد بکەن، و GPU-کانی هێڵی کۆنی A6XX ڕەنگە بە شێوەیەکی گونجاو کارنەکەن. بیخەوێنە بۆ نەخشەکێشانی فۆرماتە پێوانەکراوەکان. + کۆntrolی ژمارەی تایبەتمەندییەکان دەکات کە دەتوانرێت لە دۆخی هایپرDynamic بەکاربهێنرێت. ژمارەی زیاتر ڕێگە بە تایبەتمەندییەکی زیاتر دەدات و دەتوانێت کارایی باشتر بکات، بەڵام لەوانەیە کێشە دروست بکات لەگەڵ هەندێک لە درایڤەرەکان و فرۆشەکان. نرخی گریمانەیی دەگۆڕێت بەپێی سیستەم و تواناکانی hardwareی تۆ. دەتوانیت ئەم نرخە بگۆڕیت تا جێگیری و جێیەکی بینینی باشتر دەستبکەوێت. ناچالاک مزامنة سرعة النواة خێرایی تیکەکانی ناوک ڕێکبخە لەگەڵ ڕێژەی خێرایی بەرزترین بۆ باشترکردنی کارایی بەبێ گۆڕینی خێرایی ڕاستەقینەی یارییەکە. @@ -126,6 +126,8 @@ تیک بازنەکردنی ناوەکی CPU هەندێک لە بازنەکردنەکانی هەڵگر لە کاتی نوێکردنەوەی بیرگە دەنێرێت، کەمکردنەوەی بەکارهێنانی CPU و باشترکردنی کارایی. لەوانەیە لە هەندێک یاری کێشە درووست بکات. + ئاستی DMA + کۆنتڕۆڵی وردی ڕێکخستنی DMA دەکات. وردی زیاتر دەتوانێ هەندێک کێشە لە هەندێک یاری چارەسەر بکات، بەڵام لە هەندێک حاڵەتدا کاریگەری لەسەر کارایی هەیە. ئەگەر دڵنیا نیت، بە ڕێکخستنی بنەڕەتی بێڵە. 4GB (پێشنیارکراو) 6GB (نائاسایش) @@ -654,6 +656,50 @@ یارییەکە فریموێر پێویستە فریموێر دامپ بکە و دابنێ, یان پەنجە بنێ سەر "باشە" بۆ بەردەوامبوون هەرچۆنێک بێت.]]> + + گەڕان بە دوای یارییە... + یاری نەدۆزرایەوە بۆ ناسنامەی ناونیشان: %1$s + ڕێکخستنە هەڵبژێردراوەکان سەرکەوتوو نەبوو + سەرکەوتوو نەبوو لە جێبەجێکردنی ڕێکخستنە هەڵبژێردراوەکان بۆ %1$s: %2$s + دەستپێکردن بە ڕێکخستنە بنەڕەتییەکان + دەستپێکردن هەڵوەشیندراوە + ناتوانێت ڕێکخستنە داواکراوەکان جێبەجێ بکات. لەوانەیە ئەمە بەهۆی ونبوونی ڕاهێنەری GPU یان کێشەکانی ڕێکخستنەوە بێت. + ڕێکخستنە هەڵبژێردراوەکان جێبەجێ کرا + دەستپێکردنی %1$s... + سەرکەوتوو نەبوو لە دەستپێکردنی یارییەکە + ئایا دەتەوێت %1$s بە ڕێکخستنە هەڵبژێردراوەکان دەستپێبکەیت؟ + ئایا دەتەوێت %1$s دەستپێبکەیت? + دەستپێکردنی یاری + دەستپێکردن + + + سەرکەوتوو نەبوو لە نووسینی پەڕگەی ڕێکخستن + سەرکەوتوو نەبوو لە جێبەجێکردنی ڕێکخستن + ڕێکخستن هەبووی تری هەیە + ڕێکخستنە هەڵبژێردراوەکان هەڵە بۆ %1$s.\n\nئایا دەتەوێت ڕێکخستنە هەبووەکە بسڕیتەوە؟\n\nناتوانیت ئەم کردارە بگەڕێنیتەوە. + پشکنین بۆ ڕێکخستنی ئێستا... + سڕینەوە هەڵوەشیندراوە + پشکنین بۆ ڕاهێنەری هەڵبژێردراو: %1$s + ڕاهێنەری هەڵبژێردراو بۆ ئەم ئامێرە بەردەست نییە + سڕینەوە + + + ڕاهێنەری GPU ونبووە + ڕاهێنەری هەڵبژێردراوی دیاریکراو \"%s\" دامەزراو نییە. ئایا دەتەوێت ئێستا دایببزێنیت و دامەزرێنیت? + داگرتنی ڕاهێنەر... + ڕاهێنەر بە سەرکەوتوویی دامەزرا + دامەزرانی ڕاهێنەر سەرکەوتوو نەبوو + سەرکەوتوو نەبوو لە دامەزراندنی ڕاهێنەری GPU: %s + ڕاهێنەر بەردەست نییە + ڕاهێنەری دیاریکراو بۆ داگرتن بەردەست نییە. + ڕاهێنەری پێویست دامەزراو نییە: %s + پەڕگەی ڕاهێنەری نادروست: %s + هیچ پەیوەندییەکی تۆڕ بەردەست نییە. تکایە پەیوەندیی ئینتەرنێتەکەت بپشکنە و دووبارە هەوڵبدە. + ڕاهێنەری GPU پێویستە + ڕێکخستنی یارییەکە پێویستی بە ڕاهێنەری GPU \"%s\" هەیە کە لەسەر ئامێرەکەت دامەزراو نییە.\n\nئایا دەتەوێت ئێستا دایببزێنیت و دامەزرێنیت? + داگرتنی ڕاهێنەر هەڵوەشیندراوە. ناتوانیت یارییەکە دەستپێبکەیت بەبێ ڕاهێنەری پێویست. + داگرتن + دەرچوون لە ئیمولەیشن تەواو @@ -688,6 +734,7 @@ هەڵەی کوشندە هەڵەیەکی کوشندە ڕوویدا. بۆ وردەکارییەکان لۆگەکە بپشکنە.\nبەردەوامی ئیمولەیشن لەوانەیە ببێتە هۆی تێکچوون و فڕێدانەدەرەوە. کوژاندنەوەی ئەم ڕێکخستنە دەبێتە هۆی کەمکردنەوەی کارایی ئیمولەیشن! بۆ باشترین ئەزموون، باشترە ئەم ڕێکخستنە چالاک بهێڵیتەوە. + ژاپۆن ئەمریکا @@ -699,6 +746,7 @@ B GB + ڤوڵکان هیچ @@ -708,6 +756,12 @@ بەرز ئەوپەڕ (خاو) + + بنەڕەتی + ئاسایی + بەرز + زۆر بەرز + 0.25X (180p/270p) 0.5X (360p/540p) 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 a7eca41678..484ba1fc5f 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -84,7 +84,7 @@ Povolit LRU mezipaměť Povolte nebo zakažte mezipaměť LRU, čímž zvýšíte výkon snížením využití procesoru CPU. Některé hry s ní mají problémy, zejména TotK 1.2.1, takže ji deaktivujte, pokud hra neběží nebo náhodně padá. Rozšířený dynamický stav - Umožňuje funkce Vulkan pro zlepšení výkonu, vykreslování a úsporu zdrojů při vytváření pipeline při zachování nižšího využití CPU/GPU. Tato rozšíření mohou zvýšit teplotu zařízení a starší GPU řady A6XX nemusí správně reagovat. Vypněte pro emulaci měřítkových formátů. + Ovládá počet funkcí, které lze použít v rozšířeném dynamickém stavu. Vyšší hodnoty umožňují více funkcí a mohou zvýšit výkon, ale mohou způsobit problémy s některými ovladači a výrobci. Výchozí hodnota se může lišit v závislosti na vašem systému a hardwarových schopnostech. Tuto hodnotu lze měnit, dokud nedosáhnete stability a lepší vizuální kvality. Vypnuto Synchronizovat rychlost jádra Synchronizuje rychlost jádra s maximálním procentem rychlosti, aby se zlepšil výkon bez změny skutečné rychlosti hry. @@ -125,6 +125,8 @@ 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í. 4GB (Doporučeno) 6GB (Nebezpečné) @@ -634,6 +636,50 @@ Hra vyžaduje firmware převezměte a nainstalujte firmware, nebo stiskněte "OK" pro pokračování v každém případě.]]> + + Hledání hry... + Hra nebyla nalezena pro ID titulu: %1$s + Vlastní nastavení selhalo + Nepodařilo se použít vlastní nastavení pro %1$s: %2$s + Spustit s výchozím nastavením + Spuštění zrušeno + Nelze použít požadovaná nastavení. Důvodem může být chybějící ovladač GPU nebo problémy s konfigurací. + Vlastní nastavení použito + Spouštím %1$s... + Nepodařilo se inicializovat hru + Chcete spustit %1$s s vlastním nastavením? + Chcete spustit %1$s? + Spustit hru + Spustit + + + Nepodařilo se zapsat konfigurační soubor + Nepodařilo se použít konfiguraci + Konfigurace již existuje + Vlastní nastavení již existuje pro %1$s.\n\nChcete přepsat stávající konfiguraci?\n\nTuto akci nelze vrátit zpět. + Kontrola existující konfigurace... + Přepsání zrušeno + Kontrola vlastního ovladače: %1$s + Vlastní ovladač není pro toto zařízení k dispozici + Přepsat + + + Chybí ovladač GPU + Vybraný vlastní ovladač \"%s\" není nainstalován. Chcete jej nyní stáhnout и nainstalovat? + Stahování ovladače... + Ovladač byl úspěšně nainstalován + Instalace ovladače selhala + Nepodařilo se nainstalovat ovladač GPU: %s + Ovladač není k dispozici + Vybraný ovladač není k dispozici ke stažení. + Požadovaný ovladač není nainstalován: %s + Neplatný soubor ovladače: %s + Není dostupné síťové připojení. Zkontrolujte prosím připojení k internetu a zkuste to znovu. + Vyžadován ovladač GPU + Konfigurace hry vyžaduje ovladač GPU \"%s\", který není na vašem zařízení nainstalován.\n\nChcete jej nyní stáhnout a nainstalovat? + Stahování ovladače bylo zrušeno. Hru nelze spustit bez požadovaného ovladače. + Stáhnout + Ukončit emulaci Hotovo @@ -684,6 +730,12 @@ Vysoká Extrémní (Pomalé) + + Výchozí + Normální + Vysoká + Extrémní + 0.25X (180p/270p) 0.5X (360p/540p) 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 fbf9aa31c7..821ba56399 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -85,7 +85,7 @@ LRU-Cache aktivieren Aktivieren oder deaktivieren Sie den LRU-Cache, um die Leistung durch Einsparung von CPU-Prozessorauslastung zu verbessern. Einige Spiele haben Probleme damit, insbesondere TotK 1.2.1, deaktivieren Sie es also, wenn das Spiel nicht startet oder zufällig abstürzt. Erweiterter dynamischer Status - Aktiviert Vulkan-Funktionen zur Verbesserung der Leistung, des Renderings und zur Einsparung von Ressourcen bei der Pipeline-Erstellung bei gleichzeitig geringer CPU/GPU-Auslastung. Diese Erweiterungen können die Gerätetemperatur erhöhen, und ältere GPUs der A6XX-Serie reagieren möglicherweise nicht richtig. Deaktivieren Sie dies, um skalierte Formate zu emulieren. + Steuert die Anzahl der Funktionen, die im Erweiterten Dynamischen Zustand verwendet werden können. Höhere Werte ermöglichen mehr Funktionen und können die Leistung steigern, können jedoch bei einigen Treibern und Herstellern zu Problemen führen. Der Standardwert kann je nach System und Hardwarefähigkeiten variieren. Dieser Wert kann geändert werden, bis Stabilität und eine bessere visuelle Qualität erreicht sind. Deaktiviert Kern-Geschwindigkeit synchronisieren Synchronisiert die Taktrate des Kerns mit der maximalen Geschwindigkeit, um die Leistung zu verbessern, ohne die tatsächliche Spielgeschwindigkeit zu verändern. @@ -126,6 +126,8 @@ 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. 4 GB (Empfohlen) 6 GB (Unsicher) @@ -710,6 +712,50 @@ Wirklich fortfahren? Spiel erfordert Firmware dumpen und installieren Sie Firmware, oder drücken Sie "OK", um trotzdem zu starten.]]> + + Suche nach Spiel... + Spiel nicht gefunden für Titel-ID: %1$s + Benutzerdefinierte Einstellungen fehlgeschlagen + Fehler beim Anwenden der benutzerdefinierten Einstellungen für %1$s: %2$s + Mit Standardeinstellungen starten + Start abgebrochen + Die angeforderten Einstellungen konnten nicht angewendet werden. Dies kann an fehlenden GPU-Treibern oder Konfigurationsproblemen liegen. + Benutzerdefinierte Einstellungen übernommen + Starte %1$s... + Spielinitialisierung fehlgeschlagen + Möchten Sie %1$s mit benutzerdefinierten Einstellungen starten? + Möchten Sie %1$s starten? + Spiel starten + Starten + + + Konfigurationsdatei konnte nicht geschrieben werden + Konfiguration konnte nicht angewendet werden + Konfiguration existiert bereits + Benutzerdefinierte Einstellungen existieren bereits für %1$s.\n\nMöchten Sie die bestehende Konfiguration überschreiben?\n\nDiese Aktion kann nicht rückgängig gemacht werden. + Überprüfe auf vorhandene Konfiguration... + Überschreiben abgebrochen + Üoverprüfe benutzerdefinierten Treiber: %1$s + Benutzerdefinierter Treiber für dieses Gerät nicht verfügbar + Überschreiben + + + GPU-Treiber fehlt + Der ausgewählte benutzerdefinierte Treiber \"%s\" ist nicht installiert. Möchten Sie ihn jetzt herunterladen und installieren? + Treiber wird heruntergeladen... + Treiber erfolgreich installiert + Treiberinstallation fehlgeschlagen + Fehler beim Installieren des GPU-Treibers: %s + Treiber nicht verfügbar + Der ausgewählte Treiber ist nicht zum Download verfügbar. + Erforderlicher Treiber nicht installiert: %s + Ungültige Treiberdatei: %s + Keine Netzwerkverbindung verfügbar. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut. + GPU-Treiber erforderlich + Die Spielkonfiguration erfordert den GPU-Treiber \"%s\", der auf Ihrem Gerät nicht installiert ist.\n\nMöchten Sie ihn jetzt herunterladen и installieren? + Treiberdownload abgebrochen. Das Spiel kann ohne den erforderlichen Treiber nicht gestartet werden. + Herunterladen + Emulation beenden Fertig @@ -770,6 +816,12 @@ Wirklich fortfahren? Hoch Extrem (Langsam) + + Standard + Normal + Hoch + Extrem + 0.25X (180p/270p) 0.5X (360p/540p) 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 93b4fe159e..9db08e1425 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -85,7 +85,7 @@ Habilitar caché LRU Activa o desactiva la caché LRU, mejorando el rendimiento al ahorrar uso del proceso de la CPU. Algunos juegos tienen problemas con ella, notablemente TotK 1.2.1, así que desactívala si el juego no inicia o se cierra aleatoriamente. Estado dinámico extendido - Habilita funciones de Vulkan para mejorar el rendimiento, el renderizado y ahorrar recursos en la creación de pipelines manteniendo un uso bajo de CPU/GPU. Estas extensiones pueden aumentar la temperatura del dispositivo, y las GPU de la antigua línea A6XX pueden no reaccionar correctamente. Desactívalo para emular formatos escalados. + Controla la cantidad de funciones que se pueden usar en el Estado Dinámico Extendido. Los valores más altos permiten más funciones y pueden aumentar el rendimiento, pero pueden causar problemas con algunos controladores y fabricantes. El valor predeterminado puede variar según su sistema y las capacidades de su hardware. Este valor se puede cambiar hasta lograr estabilidad y una mejor calidad visual. Desactivado Sincronizar velocidad del núcleo Sincroniza la velocidad del núcleo con el porcentaje máximo de velocidad para mejorar el rendimiento sin alterar la velocidad real del juego. @@ -126,6 +126,8 @@ 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. 4GB (Recomendado) 6GB (Inseguro) @@ -749,6 +751,50 @@ El juego requiere firmware vuelca e instala el firmware, o pulsa "Aceptar" para continuar de todos modos.]]> + + Buscando juego... + Juego no encontrado para el ID de título: %1$s + Configuración personalizada fallida + Error al aplicar la configuración personalizada para %1$s: %2$s + Iniciar con configuración predeterminada + Inicio cancelado + No se pueden aplicar los ajustes solicitados. Esto puede deberse a controladores GPU faltantes o problemas de configuración. + Configuración personalizada aplicada + Iniciando %1$s... + Error al inicializar el juego + ¿Quieres iniciar %1$s con configuración personalizada? + ¿Quieres iniciar %1$s? + Iniciar juego + Iniciar + + + Error al escribir el archivo de configuración + Error al aplicar la configuración + La configuración ya existe + Ya existe una configuración personalizada para %1$s.\n\n¿Quieres sobrescribir la configuración existente?\n\nEsta acción no se puede deshacer. + Comprobando la configuración existente... + Sobrescritura cancelada + Comprobando controlador personalizado: %1$s + Controlador personalizado no disponible para este dispositivo + Sobrescribir + + + Falta controlador de GPU + El controlador personalizado seleccionado \"%s\" no está instalado. ¿Quieres descargarlo e instalarlo ahora? + Descargando controlador... + Controlador instalado correctamente + Error en la instalación del controlador + Error al instalar el controlador de GPU: %s + Controlador no disponible + El controlador seleccionado no está disponible para descargar. + Controlador requerido no instalado: %s + Archivo de controlador no válido: %s + No hay conexión de red disponible. Por favor, compruebe su conexión a Internet e inténtelo de nuevo. + Se requiere controlador de GPU + La configuración del juego requiere el controlador de GPU \"%s\" que no está instalado en su dispositivo.\n\n¿Quieres descargarlo e instalarlo ahora? + Descarga del controlador cancelada. El juego no se puede iniciar sin el controlador requerido. + Descargar + Salir de la emulación Hecho @@ -819,6 +865,12 @@ Alto Extremo (Lento) + + Predeterminado + Normal + Alto + Extremo + 0.25X (180p/270p) 0.5X (360p/540p) 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 f4793d1e2b..91fa4bd5c2 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -85,7 +85,7 @@ فعال‌سازی حافظه نهان LRU حافظه پنهان LRU را فعال یا غیرفعال کنید تا با کاهش استفاده از پردازنده، عملکرد بهبود یابد. برخی بازی‌ها مانند TotK 1.2.1 با این ویژگی مشکل دارند، در صورت عدم راه‌اندازی یا قطعی تصادفی بازی، آن را غیرفعال کنید. حالت پویای گسترده - قابلیت‌های ولکان را برای بهبود عملکرد، رندرینگ و صرفه‌جویی در منابع هنگام ایجاد خط لوله فعال می‌کند، در حالی که استفاده کمتری از CPU/GPU دارد. این پسوندها ممکن است دمای دستگاه را افزایش دهند و GPUهای قدیمی خط A6XX ممکن است به درستی واکنش نشان ندهند. برای شبیه‌سازی فرمت‌های مقیاس‌شده غیرفعال کنید. + تعداد قابلیت‌هایی که می‌توان در حالت Extended Dynamic State استفاده کرد را کنترل می‌کند. اعداد بالاتر قابلیت‌های بیشتری را فعال کرده و می‌توانند عملکرد را افزایش دهند، اما ممکن است با برخی درایورها و فروشندگان مشکلاتی ایجاد کنند. مقدار پیش‌فرض بسته به سیستم و قابلیت‌های سخت‌افزاری شما ممکن است متفاوت باشد. این مقدار را می‌توان تغییر داد تا زمانی که پایداری و کیفیت بصری بهتری حاصل شود. غیرفعال همگام‌سازی سرعت هسته همگام‌سازی سرعت هسته با حداکثر درصد سرعت برای بهبود عملکرد بدون تغییر سرعت واقعی بازی. @@ -126,6 +126,8 @@ تیک‌ها رد کردن ابطال داخلی CPU بعضی ابطال‌های حافظه نهان در هنگام به‌روزرسانی‌های حافظه را رد می‌کند، استفاده از CPU را کاهش داده و عملکرد آن را بهبود می‌بخشد. ممکن است در برخی بازی‌ها باعث مشکلات یا خرابی شود. + سطح DMA + دقت صحت DMA را کنترل می کند. دقت بالاتر می تواند مشکلات برخی بازی ها را برطرف کند، اما در برخی موارد نیز می تواند بر عملکرد تأثیر بگذارد. اگر مطمئن نیستید، آن را روی پیش فرض بگذارید. 4 گیگابایت (توصیه شده) 6 گیگابایت (ناامن) @@ -748,6 +750,50 @@ بازی نیاز به فیرمور دارد فیرمور را دامپ و نصب کنید یا برای ادامه کار "تایید" را فشار دهید.]]> + + در حال جستجوی بازی... + بازی برای شناسه عنوان یافت نشد: %1$s + تنظیمات سفارشی ناموفق بود + اعمال تنظیمات سفارشی برای %1$s ناموفق بود: %2$s + اجرا با تنظیمات پیش‌فرض + اجرا لغو شد + قادر به اعمال تنظیمات درخواستی نیست. این ممکن است به دلیل عدم وجود درایورهای GPU یا مشکلات پیکربندی باشد. + تنظیمات سفارشی اعمال شد + در حال اجرای %1$s... + مشکل در مقداردهی اولیه بازی + آیا می‌خواهید %1$s را با تنظیمات سفارشی اجرا کنید؟ + آیا می‌خواهید %1$s را اجرا کنید؟ + اجرای بازی + اجرا + + + نوشتن فایل پیکربندی ناموفق بود + اعمال پیکربندی ناموفق بود + پیکربندی از قبل وجود دارد + تنظیمات سفارشی از قبل برای %1$s وجود دارد.\n\nآیا می‌خواهید پیکربندی موجود را بازنویسی کنید؟\n\nاین عمل قابل بازگشت نیست. + در حال بررسی پیکربندی موجود... + بازنویسی لغو شد + در حال بررسی درایور سفارشی: %1$s + درایور سفارشی برای این دستگاه در دسترس نیست + بازنویسی + + + درایور GPU یافت نشد + درایور سفارشی انتخاب شده \"%s\" نصب نشده است. آیا می‌خواهید هم اکنون آن را دانلود و نصب کنید؟ + در حال دانلود درایور... + درایور با موفقیت نصب شد + نصب درایور ناموفق بود + نصب درایور GPU ناموفق بود: %s + درایور در دسترس نیست + درایور انتخاب شده برای دانلود در دسترس نیست. + درایور مورد نیاز نصب نشده است: %s + فایل درایور نامعتبر: %s + اتصال شبکه در دسترس نیست. لطفاً اتصال اینترنت خود را بررسی کرده و مجدداً تلاش کنید. + درایور GPU مورد نیاز است + پیکربندی بازی به درایور GPU \"%s\" نیاز دارد که روی دستگاه شما نصب نیست.\n\nآیا می‌خواهید هم اکنون آن را دانلود و نصب کنید? + دانلود درایور لغو شد. بازی بدون درایور مورد نیاز قابل اجرا نیست. + دانلود + خروج از شبیه‌سازی انجام شد @@ -818,6 +864,12 @@ زیاد افراطی (کند) + + پیش فرض + معمولی + بالا + فوق العاده + 0.25X (180p/270p) 0.5X (360p/540p) 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 7a70aaf022..a7139ddbf6 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -85,7 +85,7 @@ Activer le cache LRU Active ou désactive le cache LRU pour améliorer les performances en réduisant l\'utilisation du processeur. Certains jeux comme TotK 1.2.1 ont des problèmes - désactivez-le si le jeu ne démarre pas ou plante aléatoirement. État dynamique étendu - Active les fonctionnalités Vulkan pour améliorer les performances, le rendu et économiser les ressources lors de la création des pipelines tout en maintenant une utilisation réduite du CPU/GPU. Ces extensions peuvent augmenter la température de l\'appareil et les GPU anciens de la série A6XX peuvent mal réagir. Désactivez pour émuler les formats mis à l\'échelle. + Contrôle le nombre de fonctionnalités utilisables dans l\'état dynamique étendu. Des valeurs plus élevées permettent plus de fonctionnalités et peuvent augmenter les performances, mais peuvent causer des problèmes avec certains pilotes et fabricants. La valeur par défaut peut varier selon votre système et vos capacités matérielles. Cette valeur peut être modifiée jusqu\'à obtenir une stabilité et une meilleure qualité visuelle. Désactivé Synchroniser la vitesse du cœur Synchronise la vitesse du cœur avec le pourcentage de vitesse maximal pour améliorer les performances sans modifier la vitesse réelle du jeu. @@ -126,6 +126,8 @@ 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. 4 Go (Recommandé) 6 Go (Dangereux) @@ -797,6 +799,50 @@ Jeu nécessite un firmware dumper et installer le firmware ou appuyez sur "OK" pour continuer quand même.]]> + + Recherche du jeu... + Jeu non trouvé pour l\'ID de titre : %1$s + Échec des paramètres personnalisés + Échec de l\'application des paramètres personnalisés pour %1$s : %2$s + Lancer avec les paramètres par défaut + Lancement annulé + Impossible d\'appliquer les paramètres demandés. Cela peut être dû à des pilotes GPU manquants ou à des problèmes de configuration. + Paramètres personnalisés appliqués + Lancement de %1$s... + Échec de l\'initialisation du jeu + Voulez-vous lancer %1$s avec des paramètres personnalisés ? + Voulez-vous lancer %1$s ? + Lancer le jeu + Lancer + + + Échec de l\'écriture du fichier de configuration + Échec de l\'application de la configuration + Configuration déjà existante + Des paramètres personnalisés existent déjà pour %1$s.\n\nVoulez-vous écraser la configuration existante ?\n\nCette action ne peut pas être annulée. + Vérification de la configuration existante... + Écrasement annulé + Vérification du pilote personnalisé : %1$s + Pilote personnalisé non disponible pour cet appareil + Écraser + + + Pilote GPU manquant + Le pilote personnalisé sélectionné \"%s\" n\'est pas installé. Voulez-vous le télécharger et l\'installer maintenant ? + Téléchargement du pilote... + Pilote installé avec succès + Échec de l\'installation du pilote + Échec de l\'installation du pilote GPU : %s + Pilote non disponible + Le pilote sélectionné n\'est pas disponible au téléchargement. + Pilote requis non installé : %s + Fichier de pilote invalide : %s + Aucune connexion réseau disponible. Veuillez vérifier votre connexion Internet et réessayer. + Pilote GPU requis + La configuration du jeu nécessite le pilote GPU \"%s\" qui n\'est pas installé sur votre appareil.\n\nVoulez-vous le télécharger et l\'installer maintenant ? + Téléchargement du pilote annulé. Le jeu ne peut pas être lancé sans le pilote requis. + Télécharger + Quitter l\'émulation Terminé @@ -867,6 +913,12 @@ Haut Extrême (Lent) + + Défaut + Normal + Élevé + Extrême + 0.25X (180p/270p) 0.5X (360p/540p) 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 516ac45210..63aaee043e 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -85,7 +85,7 @@ הפעלת מטמון LRU הפעל או השבת מטמון LRU לשיפור ביצועים על ידי חיסכון בשימוש במעבד. לחלק מהמשחקים כמו TotK 1.2.1 יש בעיות - השבת אם המשחק לא עולה או קורס באקראי. מצב דינמי מורחב - מאפשר תכונות Vulkan לשיפור ביצועים, רינדור וחיסכון במשאבים בעת יצירת צינורות עיבוד תוך שמירה על שימוש נמוך במעבד/מעבד גרפי. הרחבות אלו עלולות להעלות את טמפרטורת המכשיר, ומעבדים גרפיים מקו A6XX הישן עשויים לא להגיב כראוי. השבת כדי לדמות פורמטים מוקטנים. + שולט במספר התכונות שניתן להשתמש בהן במצב דינמי מורחב. מספרים גבוהים יותר מאפשרים יותר תכונות ויכולים לשפר את הביצועים, אך עלולים לגרום לבעיות עם כמה מנהלי התקנים וספקים. הערך המוגדר כברירת מחדל עשוי להשתנות בהתאם למערכת שלך ויכולות החומרה. ניתן לשנות ערך זה עד להשגת יציבות ואיכות ויזואלית טובה יותר. מושבת סנכרון מהירות ליבה סנכרן את מהירות הליבה לאחוז המהירות המרבי כדי לשפר ביצועים מבלי לשנות את מהירות המשחק בפועל. @@ -127,6 +127,8 @@ טיקים דלג על איפוס מטמון פנימי של המעבד מדלג על איפוסי מטמון מסוימים במהלך עדכוני זיכרון, מפחית שימוש במעבד ומשפר ביצועים. עלול לגרום לתקלות או קריסות בחלק מהמשחקים. + רמת DMA + שולטת בדיוק הדיוק של DMA. דיוק גבוה יותר יכול לתקן בעיות בחלק מהמשחקים, אך הוא עלול גם להשפיע על הביצועים במקרים מסוימים. אם אינך בטוח, השאר ברירת מחדל. 4GB (מומלץ) 6GB (לא בטוח) @@ -683,6 +685,50 @@ המשחק דורש קושחה שמור והתקן קושחה או לחץ "אישור" כדי להמשיך בכל מקרה.]]> + + מחפש משחק... + משחק לא נמצא למזהה כותרת: %1$s + הגדרות מותאמות אישית נכשלו + נכשל בהחלת הגדרות מותאמות אישית עבור %1$s: %2$s + הפעל עם הגדרות ברירת מחדל + ההפעלה בוטלה + לא ניתן להחיל את ההגדרות המבוקשות. זה עשוי להיות עקב חסרון מנהלי התקן של GPU או בעיות תצורה. + הגדרות מותאמות אישית הוחלו + מפעיל את %1$s... + נכשל באתחול המשחק + האם ברצונך להפעיל את %1$s עם הגדרות מותאמות אישית? + האם ברצונך להפעיל את %1$s? + הפעל משחק + הפעל + + + נכשל בכתיבת קובץ התצורה + נכשל בהחלת התצורה + תצורה כבר קיימת + הגדרות מותאמות אישית כבר קיימות עבור %1$s.\n\nהאם ברצונך לדרוס את התצורה הקיימת?\n\nפעולה זו לא ניתנת לביטול. + בודק אם קיימת תצורה... + דריסה בוטלה + בודק מנהל התקן מותאם אישית: %1$s + מנהל התקן מותאם אישית לא זמין למכשיר זה + דרוס + + + מנהל התקן GPU חסר + מנהל ההתקן המותאם אישית הנבחר \"%s\" אינו מותקן. האם ברצונך להוריד ולהתקין אותו כעת? + מוריד מנהל התקן... + מנהל ההתקן הותקן בהצלחה + התקנת מנהל ההתקן נכשלה + נכשלה התקנת מנהל ההתקן של GPU: %s + מנהל התקן לא זמין + מנהל ההתקן הנבחר אינו זמין להורדה. + מנהל התקן נדרש לא מותקן: %s + קובץ מנהל התקן לא חוקי: %s + אין חיבור אינטרנט זמין. אנא בדוק את חיבור האינטרנט שלך ונסה שוב. + נדרש מנהל התקן GPU + תצורת המשחק דורשת מנהל התקן GPU \"%s\" אשר אינו מותקן במכשירך.\n\nהאם ברצונך להוריד ולהתקין אותו כעת? + הורדת מנהל ההתקן בוטלה. לא ניתן להפעיל את המשחק ללא מנהל ההתקן הנדרש. + הורד + צא מהאמולציה סיום @@ -749,6 +795,12 @@ גבוה אקסטרים (איטי) + + ברירת מחדל + רגיל + גבוה + קיצוני + 0.25X (180p/270p) 0.5X (360p/540p) 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 f43bdf28ac..15dd00997b 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -85,7 +85,7 @@ LRU gyorsítótár engedélyezése Engedélyezi vagy letiltja az LRU gyorsítótárat, növelve a teljesítményt a CPU használat csökkentésével. Néhány játéknak (különösen a TotK 1.2.1-nek) problémája lehet vele - tiltsa le, ha a játék nem indul el vagy véletlenszerűen összeomlik. Kiterjesztett Dinamikus Állapot - Engedélyezi a Vulkan funkciókat a teljesítmény, renderelés javítására és erőforrások spórolására a pipeline létrehozásánál, miközben alacsony CPU/GPU használatot tart fenn. Ezek a kiterjesztések növelhetik az eszköz hőmérsékletét, és a régebbi A6XX sorozatú GPU-k nem feltétlenül működnek megfelelően. Tiltsa le a skálázott formátumok emulálásához. + Szabályozza a Kiterjesztett Dynamikus Állapotban használható funkciók számát. A magasabb értékek több funkciót tesznek lehetővé és növelhetik a teljesítményt, de problémákat okozhatnak egyes meghajtókkal és gyártókkal. Az alapértelmezett érték eltérő lehet a rendszertől és a hardverképességektől függően. Ez az érték módosítható, amíg el nem éri a stabilitást és a jobb vizuális minőséget. Letiltva Magsebesség szinkronizálása A mag sebességének szinkronizálása a maximális sebesség százalékával a teljesítmény javítása érdekében a játék tényleges sebességének megváltoztatása nélkül. @@ -126,6 +126,8 @@ 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. 4GB (Ajánlott) 6GB (Nem biztonságos) @@ -787,6 +789,50 @@ A játék firmware-t igényel dumpolja és telepítse a firmware-t, vagy nyomja meg az "OK" gombot a folytatáshoz.]]> + + Játék keresése... + A játék nem található a következő címazonosítóhoz: %1$s + Egyéni beállítások sikertelenek + Nem sikerült alkalmazni az egyéni beállításokat ehhez: %1$s: %2$s + Indítás alapértelmezett beállításokkal + Indítás megszakítva + Nem sikerült alkalmazni a kért beállításokat. Ennek oka hiányzó GPU illesztőprogramok vagy konfigurációs problémák lehetnek. + Egyéni beállítások alkalmazva + %1$s indítása... + A játék inicializálása sikertelen + Szeretné elindítani a(z) %1$s-t egyéni beállításokkal? + Szeretné elindítani a(z) %1$s-t? + Játék indítása + Indítás + + + A konfigurációs fájl írása sikertelen + A konfiguráció alkalmazása sikertelen + A konfiguráció már létezik + Már léteznek egyéni beállítások a(z) %1$s számára.\n\nSzeretné felülírni a meglévő konfigurációt?\n\nEzt a műveletet nem lehet visszavonni. + Létező konfiguráció keresése... + A felülírás megszakítva + Egyéni illesztőprogram ellenőrzése: %1$s + Egyéni illesztőprogram nem elérhető ehhez az eszközhöz + Felülírás + + + GPU illesztőprogram hiányzik + A kiválasztott egyéni illesztőprogram \"%s\" nincs telepítve. Szeretné most letölteni és telepíteni? + Illesztőprogram letöltése... + Az illesztőprogram sikeresen telepítve + Az illesztőprogram telepítése sikertelen + Nem sikerült telepíteni a GPU illesztőprogramot: %s + Az illesztőprogram nem elérhető + A kiválasztott illesztőprogram nem érhető el letöltésre. + A szükséges illesztőprogram nincs telepítve: %s + Érvénytelen illesztőprogramfájl: %s + Nincs hálózati kapcsolat. Kérjük, ellenőrizze az internetkapcsolatát, és próbálja újra. + GPU illesztőprogram szükséges + A játék konfigurációja \"%s\" GPU illesztőprogramot igényel, amely nincs telepítve az eszközén.\n\nSzeretné most letölteni és telepíteni? + Az illesztőprogram letöltése megszakítva. A játék nem indítható el a szükséges illesztőprogram nélkül. + Letöltés + Emuláció bezárása Kész @@ -856,6 +902,12 @@ Magas Extrém (Lassú) + + Alapértelmezett + Normál + Magas + Extrém + 0.25X (180p/270p) 0.5X (360p/540p) 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 9017c1622f..7daa4a8e94 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -85,7 +85,7 @@ Aktifkan LRU Cache Aktifkan atau nonaktifkan cache LRU untuk meningkatkan performa dengan mengurangi penggunaan proses CPU. Beberapa game seperti TotK 1.2.1 memiliki masalah - nonaktifkan jika game tidak mau berjalan atau crash acak. Status Dinamis Ekstensi - Aktifkan fitur Vulkan untuk meningkatkan performa, rendering dan menghemat sumber daya saat pembuatan pipeline sambil mempertahankan penggunaan CPU/GPU yang rendah. Ekstensi ini dapat meningkatkan suhu perangkat, dan GPU seri A6XX lama mungkin tidak merespons dengan benar. Nonaktifkan untuk emulasi format skala. + Mengontrol jumlah fitur yang dapat digunakan dalam Extended Dynamic State. Angka yang lebih tinggi memungkinkan lebih banyak fitur dan dapat meningkatkan performa, tetapi dapat menyebabkan masalah dengan beberapa driver dan vendor. Nilai default dapat bervariasi tergantung pada sistem dan kemampuan hardware Anda. Nilai ini dapat diubah hingga stabilitas dan kualitas visual yang lebih baik tercapai. Dinonaktifkan Sinkronisasi Kecepatan Inti Sinkronkan kecepatan inti dengan persentase kecepatan maksimum untuk meningkatkan performa tanpa mengubah kecepatan sebenarnya dari permainan. @@ -126,6 +126,8 @@ 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. 4GB (Direkomendasikan) 6GB (Tidak Aman) @@ -741,6 +743,50 @@ Game memerlukan firmware dump dan instal firmware, atau tekan "OK" untuk melanjutkan.]]> + + Mencari game... + Game tidak ditemukan untuk ID Judul: %1$s + Pengaturan Kustom Gagal + Gagal menerapkan pengaturan kustom untuk %1$s: %2$s + Luncurkan dengan Pengaturan Default + Peluncuran dibatalkan + Tidak dapat menerapkan pengaturan yang diminta. Ini mungkin karena driver GPU yang hilang atau masalah konfigurasi. + Pengaturan kustom diterapkan + Meluncurkan %1$s... + Gagal menginisialisasi game + Apakah Anda ingin meluncurkan %1$s dengan pengaturan kustom? + Apakah Anda ingin meluncurkan %1$s? + Luncurkan Game + Luncurkan + + + Gagal menulis file konfigurasi + Gagal menerapkan konfigurasi + Konfigurasi Sudah Ada + Pengaturan kustom sudah ada untuk %1$s.\n\nApakah Anda ingin menimpa konfigurasi yang ada?\n\nTindakan ini tidak dapat dibatalkan. + Memeriksa konfigurasi yang ada... + Penimpaan dibatalkan + Memeriksa driver kustom: %1$s + Driver kustom tidak tersedia untuk perangkat ini + Timpa + + + Driver GPU Hilang + Driver kustom yang dipilih \"%s\" tidak terinstal. Apakah Anda ingin mengunduh dan menginstalnya sekarang? + Mengunduh driver... + Driver berhasil diinstal + Instalasi Driver Gagal + Gagal menginstal driver GPU: %s + Driver Tidak Tersedia + Driver yang dipilih tidak tersedia untuk diunduh. + Driver yang diperlukan tidak terinstal: %s + File driver tidak valid: %s + Tidak ada koneksi jaringan yang tersedia. Silakan periksa koneksi internet Anda dan coba lagi. + Driver GPU Diperlukan + Konfigurasi game memerlukan driver GPU \"%s\" yang tidak terinstal di perangkat Anda.\n\nApakah Anda ingin mengunduh dan menginstalnya sekarang? + Pengunduhan driver dibatalkan. Game tidak dapat diluncurkan tanpa driver yang diperlukan. + Unduh + Keluar Selesai @@ -811,6 +857,12 @@ Tinggi Ekstrim (Lambat) + + Bawaan + Normal + Tinggi + Ekstrem + 0.25X (180p/270p) 0.5X (360p/540p) 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 b38b1c6c5a..66446eae34 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -85,7 +85,7 @@ Abilita cache LRU Abilita o disabilita la cache LRU per migliorare le prestazioni riducendo l\'uso della CPU. Alcuni giochi come TotK 1.2.1 hanno problemi - disabilitalo se il gioco non si avvia o crasha casualmente. Stato dinamico esteso - Abilita le funzionalità Vulkan per migliorare prestazioni, rendering e risparmiare risorse durante la creazione della pipeline mantenendo un basso utilizzo di CPU/GPU. Queste estensioni possono aumentare la temperatura del dispositivo e le GPU della vecchia serie A6XX potrebbero non rispondere correttamente. Disabilita per emulare formati scalati. + Controlla il numero di funzioni utilizzabili nello Stato Dinamico Esteso. Valori più alti consentono più funzioni e possono aumentare le prestazioni, ma potrebbero causare problemi con alcuni driver e vendor. Il valore predefinito può variare in base al sistema e alle capacità hardware. Questo valore può essere modificato finché non si raggiunge la stabilità e una migliore qualità visiva. Disabilitato Sincronizza velocità core Sincronizza la velocità del core con la percentuale massima di velocità per migliorare le prestazioni senza alterare la velocità effettiva del gioco. @@ -126,6 +126,8 @@ 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. 4GB (Consigliato) 6GB (Non sicuro) @@ -714,6 +716,50 @@ Il gioco richiede firmware dumpa e installa il firmware, o premi "OK" per continuare comunque.]]> + + Ricerca del gioco in corso... + Gioco non trovato per l\'ID titolo: %1$s + Impostazioni personalizzate non riuscite + Impossibile applicare le impostazioni personalizzate per %1$s: %2$s + Avvia con impostazioni predefinite + Avvio annullato + Impossibile applicare le impostazioni richieste. Ciò potrebbe essere dovuto a driver GPU mancanti o problemi di configurazione. + Impostazioni personalizzate applicate + Avvio di %1$s... + Impossibile inizializzare il gioco + Vuoi avviare %1$s con impostazioni personalizzate? + Vuoi avviare %1$s? + Avvia gioco + Avvia + + + Impossibile scrivere il file di configurazione + Impossibile applicare la configurazione + Configurazione già esistente + Impostazioni personalizzate già esistenti per %1$s.\n\nVuoi sovrascrivere la configurazione esistente?\n\nQuesta azione non può essere annullata. + Verifica della configurazione esistente... + Sovrascrittura annullata + Verifica del driver personalizzato: %1$s + Driver personalizzato non disponibile per questo dispositivo + Sovrascrivi + + + Driver GPU mancante + Il driver personalizzato selezionato \"%s\" non è installato. Vuoi scaricarlo e installarlo ora? + Download del driver in corso... + Driver installato correttamente + Installazione del driver non riuscita + Impossibile installare il driver GPU: %s + Driver non disponibile + Il driver selezionato non è disponibile per il download. + Driver richiesto non installato: %s + File driver non valido: %s + Nessuna connessione di rete disponibile. Controlla la connessione Internet e riprova. + Driver GPU richiesto + La configurazione del gioco richiede il driver GPU \"%s\" che non è installato sul tuo dispositivo.\n\nVuoi scaricarlo e installarlo ora? + Download del driver annullato. Il gioco non può essere avviato senza il driver richiesto. + Scarica + Arresta emulazione Fatto @@ -780,6 +826,12 @@ Alta Estrema (Lenta) + + Predefinito + Normale + Alto + Estremo + 0.25X (180p/270p) 0.5X (360p/540p) 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 c76814e17d..2090aa5f74 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -85,7 +85,7 @@ LRUキャッシュを有効化 LRUキャッシュを有効/無効にし、CPUプロセスの使用を節約してパフォーマンスを向上させます。TotK 1.2.1など一部のゲームで問題が発生する可能性があるため、ゲームが起動しない場合やランダムにクラッシュする場合は無効にしてください。 拡張ダイナミックステート - Vulkan機能を有効にし、パイプライン作成時のCPU/GPU使用率を低く保ちながら、パフォーマンス、レンダリング、リソース節約を改善します。これらの拡張機能はデバイスの温度を上昇させる可能性があり、旧A6XXシリーズのGPUは正しく反応しない場合があります。スケールフォーマットをエミュレートするには無効にしてください。 + 拡張ダイナミックステートで使用できる機能の数を制御します。数値が高いほどより多くの機能が使用可能になり、パフォーマンスが向上する可能性がありますが、一部のドライバーやベンダーで問題が発生する可能性があります。デフォルト値は、お使いのシステムとハードウェアの機能によって異なります。安定性とより良い画質が得られるまでこの値を変更できます。 無効 コア速度の同期 コアの速度を最大速度パーセンテージに同期させ、ゲームの実際の速度を変えずにパフォーマンスを向上させます。 @@ -126,6 +126,8 @@ ティック CPU内部無効化をスキップ メモリ更新時のCPU側キャッシュ無効化をスキップし、CPU使用率を減らして性能を向上させます。一部のゲームで不具合やクラッシュが発生する可能性があります。 + DMAレベル + DMAの精度を制御します。精度を高くすると一部のゲームの問題が修正される場合がありますが、場合によってはパフォーマンスに影響を与える可能性もあります。不明な場合は、デフォルトのままにしてください。 4GB (推奨) 6GB (安全でない) @@ -673,6 +675,50 @@ ゲームにはファームウェアが必要です ファームウェアをダンプしてインストールするか、"OK"を押して続行してください。]]> + + ゲームを検索中... + タイトルID: %1$s のゲームが見つかりません + カスタム設定の失敗 + %1$s のカスタム設定の適用に失敗しました: %2$s + デフォルト設定で起動 + 起動がキャンセルされました + 要求された設定を適用できません。GPUドライバーの不足または設定の問題が原因である可能性があります。 + カスタム設定が適用されました + %1$s を起動中... + ゲームの初期化に失敗しました + %1$s をカスタム設定で起動しますか? + %1$s を起動しますか? + ゲームを起動 + 起動 + + + 設定ファイルの書き込みに失敗しました + 設定の適用に失敗しました + 設定が既に存在します + %1$s のカスタム設定は既に存在します。\n\n既存の設定を上書きしますか?\n\nこの操作は元に戻せません。 + 既存の設定を確認中... + 上書きがキャンセルされました + カスタムドライバーを確認中: %1$s + このデバイスではカスタムドライバーは利用できません + 上書き + + + GPUドライバーが見つかりません + 選択したカスタムドライバー \"%s\" がインストールされていません。今すぐダウンロードしてインストールしますか? + ドライバーをダウンロード中... + ドライバーが正常にインストールされました + ドライバーのインストールに失敗しました + GPUドライバーのインストールに失敗しました: %s + ドライバーが利用できません + 選択したドライバーはダウンロードできません。 + 必要なドライバーがインストールされていません: %s + 無効なドライバーファイル: %s + ネットワーク接続が利用できません。インターネット接続を確認してからもう一度お試しください。 + GPUドライバーが必要です + ゲーム設定にはGPUドライバー \"%s\" が必要ですが、お使いのデバイスにインストールされていません。\n\n今すぐダウンロードしてインストールしますか? + ドライバーのダウンロードがキャンセルされました。必要なドライバーがないとゲームを起動できません。 + ダウンロード + 終了 完了 @@ -739,6 +785,12 @@ 最高 (低速) + + デフォルト + 標準 + + 最高 + 0.25X (180p/270p) 0.5X (360p/540p) 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 1be258d243..d73dc53987 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -85,7 +85,7 @@ LRU 캐시 사용 LRU 캐시를 활성화 또는 비활성화하여 CPU 프로세스 사용을 절약하고 성능을 향상시킵니다. TotK 1.2.1을 포함한 일부 게임에서 문제가 발생할 수 있으므로 게임이 부팅되지 않거나 무작위로 충돌하는 경우 비활성화하세요. 확장 동적 상태 - 파이프라인 생성 시 CPU/GPU 사용량을 낮게 유지하면서 성능, 렌더링 및 리소스 절약을 개선하기 위해 Vulkan 기능을 활성화합니다. 이 확장 기능은 장치 온도를 높일 수 있으며 이전 A6XX 라인에 속하는 GPU가 제대로 반응하지 않을 수 있습니다. 스케일된 형식을 에뮬레이트하려면 비활성화하세요. + 확장 동적 상태에서 사용할 수 있는 기능의 수를 제어합니다. 높은 값은 더 많은 기능을 허용하고 성능을 높일 수 있지만, 일부 드라이버 및 벤더에서 문제를 일으킬 수 있습니다. 기본값은 시스템 및 하드웨어 기능에 따라 다를 수 있습니다. 안정성과 더 나은 시각적 품질이 달성될 때까지 이 값을 변경할 수 있습니다. 비활성화됨 코어 속도 동기화 코어 틱 속도를 최대 속도 백분율과 동기화하여 게임의 실제 속도를 변경하지 않고 성능을 향상시킵니다. @@ -126,6 +126,8 @@ CPU 내부 무효화 건너뛰기 메모리 업데이트 시 일부 CPU 측 캐시 무효화를 건너뛰어 CPU 사용량을 줄이고 성능을 향상시킵니다. 일부 게임에서 오류 또는 충돌을 일으킬 수 있습니다. + DMA 수준 + DMA 정밀도를 제어합니다. 높은 정밀도는 일부 게임의 문제를 해결할 수 있지만 경우에 따라 성능에 영향을 미칠 수도 있습니다. 확실하지 않다면 기본값으로 두세요. 4GB (권장) 6GB (안전하지 않음) @@ -741,6 +743,50 @@ 게임에 펌웨어가 필요합니다 펌웨어를 덤프하여 설치하거나 "확인"을 눌러 계속 진행하세요.]]> + + 게임 검색 중... + 타이틀 ID에 대한 게임을 찾을 수 없음: %1$s + 사용자 지정 설정 실패 + %1$s에 대한 사용자 지정 설정 적용 실패: %2$s + 기본 설정으로 실행 + 실행 취소됨 + 요청한 설정을 적용할 수 없습니다. GPU 드라이버 누락 또는 구성 문제 때문일 수 있습니다. + 사용자 지정 설정이 적용됨 + %1$s 실행 중... + 게임 초기화 실패 + %1$s을(를) 사용자 지정 설정으로 실행하시겠습니까? + %1$s을(를) 실행하시겠습니까? + 게임 실행 + 실행 + + + 구성 파일 작성 실패 + 구성 적용 실패 + 구성이 이미 존재함 + %1$s에 대한 사용자 지정 설정이 이미 존재합니다.\n\n기존 구성을 덮어쓰시겠습니까?\n\n이 작업은 취소할 수 없습니다. + 기존 구성 확인 중... + 덮어쓰기 취소됨 + 사용자 지정 드라이버 확인 중: %1$s + 이 기기에서는 사용자 지정 드라이버를 사용할 수 없음 + 덮어쓰기 + + + GPU 드라이버 누락 + 선택한 사용자 지정 드라이버 \"%s\"이(가) 설치되지 않았습니다. 지금 다운로드하여 설치하시겠습니까? + 드라이버 다운로드 중... + 드라이버가 성공적으로 설치됨 + 드라이버 설치 실패 + GPU 드라이버 설치 실패: %s + 드라이버를 사용할 수 없음 + 선택한 드라이버를 다운로드할 수 없습니다. + 필요한 드라이버가 설치되지 않았습니다: %s + 잘못된 드라이버 파일: %s + 사용 가능한 네트워크 연결이 없습니다. 인터넷 연결을 확인하고 다시 시도하십시오. + GPU 드라이버 필요 + 게임 구성에 GPU 드라이버 \"%s\"이(가) 필요하지만 기기에 설치되어 있지 않습니다.\n\n지금 다운로드하여 설치하시겠습니까? + 드라이버 다운로드가 취소되었습니다. 필요한 드라이버 없이는 게임을 실행할 수 없습니다. + 다운로드 + 에뮬레이션 종료 완료 @@ -810,6 +856,12 @@ 높음 극한 (느림) + + 기본값 + 보통 + 높음 + 극단적 + 0.25X (180p/270p) 0.5X (360p/540p) 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 83bb02f3ff..61fa5792e5 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -85,7 +85,7 @@ Aktiver LRU-mellomlager Aktiver eller deaktiver LRU-mellomlager for å forbedre ytelsen ved å spare CPU-prosessorbruk. Noen spill som TotK 1.2.1 har problemer med dette - deaktiver hvis spillet ikke starter eller krasjer tilfeldig. Utvidet dynamisk tilstand - Aktiverer Vulkan-funksjoner for å forbedre ytelse, rendering og spare ressurser ved oppretting av pipeline samtidig som CPU/GPU-bruken holdes lav. Disse utvidelsene kan øke enhetstemperaturen, og eldre GPU-er fra A6XX-serien reagerer kanskje ikke ordentlig. Deaktiver for å emulere skalerte formater. + Kontrollerer antall funksjoner som kan brukes i Utvidet Dynamisk Tilstand. Høyere tall tillater flere funksjoner og kan øke ytelsen, men kan forårsake problemer med noen drivere og leverandører. Standardverdien kan variere avhengig av systemet og maskinvareevnene dine. Denne verdien kan endres til stabilitet og bedre visuell kvalitet er oppnådd. Deaktivert Synkroniser kjernespeed Synkroniser kjernens hastighet med maksimal hastighetsprosent for å forbedre ytelsen uten å endre spillets faktiske hastighet. @@ -126,6 +126,8 @@ 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. 4GB (Anbefalt) 6GB (Usikkert) @@ -664,6 +666,50 @@ Spillet krever fastvare dump og installer fastvare, eller trykk "OK" for å fortsette likevel.]]> + + Søker etter spill... + Spill ikke funnet for tittel-ID: %1$s + Egendefinerte innstillinger mislyktes + Kunne ikke bruke egendefinerte innstillinger for %1$s: %2$s + Start med standardinnstillinger + Start avbrutt + Kan ikke bruke de forespurte innstillingene. Dette kan skyldes manglende GPU-drivere eller konfigurasjonsproblemer. + Egendefinerte innstillinger brukt + Starter %1$s... + Kunne ikke initialisere spillet + Vil du starte %1$s med egendefinerte innstillinger? + Vil du starte %1$s? + Start spill + Start + + + Kunne ikke skrive konfigurasjonsfil + Kunne ikke bruke konfigurasjon + Konfigurasjon finnes allerede + Egendefinerte innstillinger finnes allerede for %1$s.\n\nVil du overskrive den eksisterende konfigurasjonen?\n\nDenne handlingen kan ikke angres. + Sjekker for eksisterende konfigurasjon... + Overskriving avbrutt + Sjekker for egendefinert driver: %1$s + Egendefinert driver ikke tilgjengelig for denne enheten + Overskriv + + + GPU-driver mangler + Den valgte egendefinerte driveren \"%s\" er ikke installert. Vil du laste ned og installere den nå? + Laster ned driver... + Driver installert vellykket + Driverinstallasjon mislyktes + Kunne ikke installere GPU-driveren: %s + Driver ikke tilgjengelig + Den valgte driveren er ikke tilgjengelig for nedlasting. + Påkrevd driver ikke installert: %s + Ugyldig driverfil: %s + Ingen nettverkstilkobling tilgjengelig. Vennligst sjekk internettilkoblingen din og prøv på nytt. + GPU-driver kreves + Spillkonfigurasjonen krever GPU-driver \"%s\" som ikke er installert på enheten din.\n\nVil du laste ned og installere den nå? + Driver-nedlasting avbrutt. Spillet kan ikke startes uten den påkrevde driveren. + Last ned + Avslutt emulering Ferdig @@ -698,6 +744,7 @@ Fatal Feil Det oppstod en fatal feil. Sjekk loggen for mer informasjon.\nFortsatt emulering kan føre til krasj og feil. Hvis du slår av denne innstillingen, reduseres emuleringsytelsen betydelig! Vi anbefaler at du lar denne innstillingen være aktivert for å få den beste opplevelsen. + Japan USA @@ -709,6 +756,7 @@ B GB + Vulkan Ingen @@ -718,6 +766,12 @@ Høy Ekstrem (Treg) + + Standard + Normal + Høy + Ekstrem + 0.25X (180p/270p) 0.5X (360p/540p) 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 ec22ae0a4c..d640112fca 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -85,7 +85,7 @@ Włącz pamięć podręczną LRU Włącz lub wyłącz pamięć podręczną LRU, aby poprawić wydajność poprzez zmniejszenie użycia procesora. Niektóre gry, takie jak TotK 1.2.1, mogą mieć problemy - wyłącz, jeśli gra się nie uruchamia lub losowo zawiesza. Rozszerzony stan dynamiczny - Włącza funkcje Vulkan w celu poprawy wydajności, renderowania i oszczędzania zasobów podczas tworzenia potoku, przy jednoczesnym utrzymaniu niskiego wykorzystania CPU/GPU. Te rozszerzenia mogą zwiększać temperaturę urządzenia, a starsze GPU z linii A6XX mogą nie działać poprawnie. Wyłącz, aby emulować formaty skalowane. + Kontroluje liczbę funkcji, które mogą być używane w Rozszerzonym Stanie Dynamicznym. Wyższe wartości pozwalają na więcej funkcji i mogą zwiększyć wydajność, ale mogą powodować problemy z niektórymi sterownikami i producentami. Wartość domyślna może się różnić w zależności od systemu i możliwości sprzętowych. Tę wartość można zmieniać, aż do osiągnięcia stabilności i lepszej jakości wizualnej. Wyłączone Synchronizuj prędkość rdzenia Synchronizuje prędkość rdzenia z maksymalnym procentem prędkości, aby poprawić wydajność bez zmiany rzeczywistej prędkości gry. @@ -126,6 +126,8 @@ 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». 4GB (Zalecane) 6GB (Niebezpieczne) @@ -662,6 +664,50 @@ Gra wymaga oprogramowania sprzętowego zrzuć i zainstaluj oprogramowanie sprzętowe, lub naciśnij "OK", aby kontynuować mimo to.]]> + + Wyszukiwanie gry... + Nie znaleziono gry dla ID tytułu: %1$s + Niestandardowe ustawienia nie powiodły się + Nie udało się zastosować niestandardowych ustawień dla %1$s: %2$s + Uruchom z ustawieniami domyślnymi + Uruchamianie anulowane + Nie można zastosować żądanych ustawień. Może to być spowodowane brakującymi sterownikami GPU lub problemami z konfiguracją. + Zastosowano niestandardowe ustawienia + Uruchamianie %1$s... + Nie udało się zainicjować gry + Czy chcesz uruchomić %1$s z niestandardowymi ustawieniami? + Czy chcesz uruchomić %1$s? + Uruchom grę + Uruchom + + + Nie udało się zapisać pliku konfiguracyjnego + Nie udało się zastosować konfiguracji + Konfiguracja już istnieje + Niestandardowe ustawienia już istnieją dla %1$s.\n\nCzy chcesz nadpisać istniejącą konfigurację?\n\nTej czynności nie można cofnąć. + Sprawdzanie istniejącej konfiguracji... + Nadpisywanie anulowane + Sprawdzanie niestandardowego sterownika: %1$s + Niestandardowy sterownik niedostępny dla tego urządzenia + Nadpisz + + + Brak sterownika GPU + Wybrany niestandardowy sterownik \"%s\" nie jest zainstalowany. Czy chcesz go teraz pobrać i zainstalować? + Pobieranie sterownika... + Sterownik pomyślnie zainstalowany + Instalacja sterownika nie powiodła się + Nie udało się zainstalować sterownika GPU: %s + Sterownik niedostępny + Wybrany sterownik nie jest dostępny do pobrania. + Wymagany sterownik nie jest zainstalowany: %s + Nieprawidłowy plik sterownika: %s + Brak dostępnego połączenia sieciowego. Sprawdź swoje połączenie internetowe i spróbuj ponownie. + Wymagany sterownik GPU + Konfiguracja gry wymaga sterownika GPU \"%s\", który nie jest zainstalowany na Twoim urządzeniu.\n\nCzy chcesz go teraz pobrać i zainstalować? + Pobieranie sterownika anulowane. Gra nie może zostać uruchomiona bez wymaganego sterownika. + Pobierz + Zakończ emulację Gotowe @@ -707,6 +753,7 @@ B GB + Vulkan Żadny @@ -716,6 +763,12 @@ Wysoki Ekstremalny (Wolny) + + 預設 + 普通 + + 極高 + 0.25X (180p/270p) 0.5X (360p/540p) 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 d7f528fb2a..d0ec24f453 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 @@ -85,7 +85,7 @@ Ativar cache LRU Ative ou desative o cache LRU para melhorar o desempenho economizando uso do processador. Alguns jogos como TotK 1.2.1 têm problemas - desative se o jogo não iniciar ou travar aleatoriamente. Estado Dinâmico Estendido - Ativa recursos Vulkan para melhorar desempenho, renderização e economizar recursos na criação de pipelines mantendo baixo uso de CPU/GPU. Essas extensões podem aumentar a temperatura do dispositivo e GPUs da linha A6XX mais antigos podem não responder adequadamente. Desative para emular formatos dimensionados. + Controla o número de recursos que podem ser usados no Estado Dinâmico Estendido. Números mais altos permitem mais recursos e podem aumentar o desempenho, mas podem causar problemas com alguns drivers e fabricantes. O valor padrão pode variar dependendo do seu sistema e capacidades de hardware. Este valor pode ser alterado até que a estabilidade e uma melhor qualidade visual sejam alcançadas. Desativado Sincronizar velocidade do núcleo Sincroniza a velocidade do núcleo com a porcentagem máxima de velocidade para melhorar o desempenho sem alterar a velocidade real do jogo. @@ -126,6 +126,8 @@ 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. 4GB (Recomendado) 6GB (Inseguro) @@ -798,6 +800,50 @@ uma tentativa de mapeamento automático O jogo requer firmware faça dump e instale o firmware, ou pressione "OK" para continuar mesmo assim.]]> + + Procurando jogo... + Jogo não encontrado para o ID do Título: %1$s + Configurações Personalizadas Falharam + Falha ao aplicar configurações personalizadas para %1$s: %2$s + Iniciar com Configurações Padrão + Inicialização cancelada + Não foi possível aplicar as configurações solicitadas. Isso pode ser devido a drivers de GPU ausentes ou problemas de configuração. + Configurações personalizadas aplicadas + Iniciando %1$s... + Falha ao inicializar o jogo + Deseja iniciar %1$s com configurações personalizadas? + Deseja iniciar %1$s? + Iniciar Jogo + Iniciar + + + Falha ao escrever arquivo de configuração + Falha ao aplicar configuração + Configuração Já Existe + Configurações personalizadas já existem para %1$s.\n\nDeseja sobrescrever a configuração existente?\n\nEsta ação não pode ser desfeita. + Verificando configuração existente... + Sobrescrita cancelada + Verificando driver personalizado: %1$s + Driver personalizado não disponível para este dispositivo + Sobrescrever + + + Driver de GPU Ausente + O driver personalizado selecionado \"%s\" não está instalado. Deseja baixar e instalá-lo agora? + Baixando driver... + Driver instalado com sucesso + Instalação do Driver Falhou + Falha ao instalar o driver da GPU: %s + Driver Não Disponível + O driver selecionado não está disponível para download. + Driver necessário não instalado: %s + Arquivo de driver inválido: %s + Nenhuma conexão de rede disponível. Verifique sua conexão com a internet e tente novamente. + Driver de GPU Necessário + A configuração do jogo requer o driver de GPU \"%s\" que não está instalado em seu dispositivo.\n\nDeseja baixar e instalá-lo agora? + Download do driver cancelado. O jogo não pode ser iniciado sem o driver necessário. + Baixar + Sair da emulação Feito @@ -868,6 +914,12 @@ uma tentativa de mapeamento automático Alta Extrema (Lenta) + + Padrão + Normal + Alto + Extremo + 0.25X (180p/270p) 0.5X (360p/540p) 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 f312b0604a..4e0fc4167a 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 @@ -85,7 +85,7 @@ Ativar cache LRU Ative ou desative a cache LRU para melhorar desempenho poupando uso do processador. Alguns jogos como TotK 1.2.1 têm problemas - desative se o jogo não iniciar ou falhar aleatoriamente. Estado Dinâmico Estendido - Ativa funcionalidades Vulkan para melhorar desempenho, renderização e poupar recursos na criação de pipelines mantendo baixa utilização de CPU/GPU. Estas extensões podem aumentar a temperatura do dispositivo e GPUs da linha A6XX mais antigos podem não responder corretamente. Desative para emular formatos dimensionados. + Controla o número de funcionalidades que podem ser utilizadas no Estado Dinâmico Alargado. Valores mais elevados permitem mais funcionalidades e podem aumentar o desempenho, mas podem causar problemas com alguns controladores e fabricantes. O valor predefinido pode variar consoante o seu sistema e capacidades de hardware. Este valor pode ser alterado até ser alcançada a estabilidade e uma melhor qualidade visual. Desativado Sincronizar velocidade do núcleo Sincroniza a velocidade do núcleo com a percentagem máxima de velocidade para melhorar o desempenho sem alterar a velocidade real do jogo. @@ -126,6 +126,8 @@ 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. 4GB (Recomendado) 6GB (Inseguro) @@ -798,6 +800,50 @@ uma tentativa de mapeamento automático O jogo requer firmware faça dump e instale o firmware, ou pressione "OK" para continuar mesmo assim.]]> + + A procurar jogo... + Jogo não encontrado para o ID do Título: %1$s + Definições Personalizadas Falharam + Falha ao aplicar definições personalizadas para %1$s: %2$s + Iniciar com Definições Predefinidas + Inicialização cancelada + Não foi possível aplicar as definições solicitadas. Isto pode ser devido a controladores de GPU em falta ou problemas de configuração. + Definições personalizadas aplicadas + A iniciar %1$s... + Falha ao inicializar o jogo + Deseja iniciar %1$s com definições personalizadas? + Deseja iniciar %1$s? + Iniciar Jogo + Iniciar + + + Falha ao escrever ficheiro de configuração + Falha ao aplicar configuração + Configuração Já Existe + Definições personalizadas já existem para %1$s.\n\nDeseja substituir a configuração existente?\n\nEsta ação não pode ser desfeita. + A verificar configuração existente... + Substituição cancelada + A verificar controlador personalizado: %1$s + Controlador personalizado não disponível para este dispositivo + Substituir + + + Controlador de GPU em Falta + O controlador personalizado selecionado \"%s\" não está instalado. Deseja transferir e instalá-lo agora? + A transferir controlador... + Controlador instalado com sucesso + Instalação do Controlador Falhou + Falha ao instalar o controlador da GPU: %s + Controlador Não Disponível + O controlador selecionado não está disponível para transferência. + Controlador necessário não instalado: %s + Ficheiro de controlador inválido: %s + Nenhuma ligação de rede disponível. Verifique a sua ligação à internet e tente novamente. + Controlador de GPU Necessário + A configuração do jogo requer o controlador de GPU \"%s\" que não está instalado no seu dispositivo.\n\nDeseja transferir e instalá-lo agora? + Transferência do controlador cancelada. O jogo não pode ser iniciado sem o controlador necessário. + Transferir + Parar emulação Feito @@ -868,6 +914,12 @@ uma tentativa de mapeamento automático Alto Estremo (Lento) + + Predefinido + Normal + Alto + Extremo + 0.25X (180p/270p) 0.5X (360p/540p) 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 285ec49606..658286152b 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -85,7 +85,7 @@ Включить LRU-кеш Включите или отключите кэш LRU (наименее недавно использованный), повышая производительность за счёт снижения нагрузки на ЦП. Некоторые игры могут работать с ним некорректно (например, TotK 1.2.1), поэтому отключите, если игра не запускается или случайно вылетает. Расширенное динамическое состояние - Включает функции Vulkan для улучшения производительности, рендеринга и экономии ресурсов при создании конвейера, сохраняя низкое использование ЦП/ГПУ. Эти расширения могут увеличить температуру устройства, а ГПУ из старой линейки A6XX могут работать некорректно. Отключите для эмуляции масштабируемых форматов. + Управляет количеством функций, которые можно использовать в расширенном динамическом состоянии. Более высокие значения позволяют использовать больше функций и могут повысить производительность, но могут вызвать проблемы с некоторыми драйверами и производителями. Значение по умолчанию может варьироваться в зависимости от вашей системы и возможностей оборудования. Это значение можно изменять до достижения стабильности и лучшего визуального качества. Отключено Синхронизация скорости ядра Синхронизирует скорость ядра с максимальным процентом скорости для улучшения производительности без изменения фактической скорости игры. @@ -126,6 +126,8 @@ Такты Пропустить внутреннюю инвалидацию ЦП Пропускает некоторые инвалидации кэша на стороне ЦП при обновлениях памяти, уменьшая нагрузку на процессор и повышая производительность. Может вызывать сбои в некоторых играх. + Уровень DMA + Управляет точностью DMA. Более высокий уровень может исправить проблемы в некоторых играх, но также может повлиять на производительность. Если не уверены, оставьте значение «По умолчанию». 4 ГБ (Рекомендуется) 6 ГБ (Небезопасно) @@ -672,7 +674,7 @@ Удалить Редактировать Экспорт успешно выполнен - Start + Запуск Очистить Глобальный Другое @@ -799,6 +801,50 @@ Игре требуется прошивка сохраните и установите прошивку или нажмите "OK" для запуска в любом случае.]]> + + Поиск игры... + Игра не найдена для ID заголовка: %1$s + Пользовательские настройки не применены + Не удалось применить пользовательские настройки для %1$s: %2$s + Запустить с настройками по умолчанию + Запуск отменен + Не удалось применить запрошенные настройки. Это может быть связано с отсутствием драйверов GPU или проблемами конфигурации. + Пользовательские настройки применены + Запуск %1$s... + Не удалось инициализировать игру + Хотите запустить %1$s с пользовательскими настройками? + Хотите запустить %1$s? + Запуск игры + Запустить + + + Не удалось записать файл конфигурации + Не удалось применить конфигурацию + Конфигурация уже существует + Пользовательские настройки уже существуют для %1$s.\n\nХотите перезаписать существующую конфигурацию?\n\nЭто действие нельзя отменить. + Проверка существующей конфигурации... + Перезапись отменена + Проверка пользовательского драйвера: %1$s + Пользовательский драйвер недоступен для этого устройства + Перезаписать + + + Отсутствует драйвер GPU + Выбранный пользовательский драйвер \"%s\" не установлен. Хотите скачать и установить его сейчас? + Загрузка драйвера... + Драйвер успешно установлен + Ошибка установки драйвера + Не удалось установить драйвер GPU: %s + Драйвер недоступен + Выбранный драйвер недоступен для загрузки. + Необходимый драйвер не установлен: %s + Неверный файл драйвера: %s + Сетевое соединение недоступно. Проверьте подключение к интернету и попробуйте снова. + Требуется драйвер GPU + Конфигурация игры требует драйвер GPU \"%s\", который не установлен на вашем устройстве.\n\nХотите скачать и установить его сейчас? + Загрузка драйвера отменена. Игра не может быть запущена без необходимого драйвера. + Скачать + Выход из эмуляции Готово @@ -869,6 +915,12 @@ Высокая Экстрим (медленный) + + По умолчанию + Нормальный + Высокий + Экстремальный + 0.25X (180p/270p) 0.5X (360p/540p) 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 d63f8a3f1d..18612333f9 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -73,7 +73,7 @@ ГПУ екстензије Проширена динамичка држава - Омогућава функције Вулкана да побољшају перформансе, приказивање и уштеде ресурсе за креирање на цевоводама, задржавајући нижи ЦПУ / ГПУ коришћење. Ови продужеци могу повећати температуру уређаја и ГПУ који припадају старијој А6кк линији не могу правилно реаговати. Искључите за емулацију скалираних формата. + Управља бројем функција које се могу користити у Проширеном динамичком стању. Веће вредности омогућавају више функција и могу повећати перформансе, али могу изазвати проблеме са неким драјверима и произвођачима. Подразумевана вредност може се разликовати у зависности од вашег система и хардверских могућности. Ова вредност се може мењати док се не постигне стабилност и бољи визуелни квалитет. Искључено Провоцирајући врх Побољшава осветљење и вертификат руковања у одређеним играма. Подржан само на Вулкану 1.0+ ГПУ-у. @@ -119,6 +119,8 @@ Тактови 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 прецизности. Виши ниво може да поправи проблеме у неким играма, али може и да утиче на перформансе. Ако нисте сигурни, оставите на «Подразумевано». Схадер Бацкенд @@ -755,6 +757,50 @@ Игра захтева firmware направите дамп и инсталирајте firmware, или притисните "OK" да бисте наставили у сваком случају.]]> + + Тражење игре... + Игра није пронађена за ID наслова: %1$s + Прилагођена подешавања нису успела + Неуспело применљивање прилагођених подешавања за %1$s: %2$s + Покрени са подразумеваним подешавањима + Покретање отказано + Није могуће применити тражена подешавања. Ово може бити услед недостајућих GPU драјвера или проблема са конфигурацијом. + Прилагођена подешавања применљена + Покрећем %1$s... + Неуспела иницијализација игре + Да ли желите да покренете %1$s са прилагођеним подешавањима? + Да ли желите да покренете %1$s? + Покрени игру + Покрени + + + Неуспело писање конфигурационе датотеке + Неуспела примена конфигурације + Конфигурација већ постоји + Прилагођена подешавања већ постоје за %1$s.\n\nДа ли желите да препишете постојећу конфигурацију?\n\nОву радњу није могуће поништити. + Провера постојеће конфигурације... + Преписивање отказано + Провера прилагођеног драјвера: %1$s + Прилагођени драјвер није доступан за овај уређај + Препиши + + + GPU драјвер недостаје + Одабрани прилагођени драјвер \"%s\" није инсталиран. Да ли желите да га преузмете и инсталирате сада? + Преузимање драјвера... + Драјвер успешно инсталиран + Инсталација драјвера није успела + Неуспела инсталација GPU драјвера: %s + Драјвер није доступан + Одабрани драјвер није доступан за преузимање. + Потребни драјвер није инсталиран: %s + Неисправна датотека драјвера: %s + Мрежна веза није доступна. Проверите интернет конекцију и покушајте поново. + GPU драјвер је потребан + Конфигурација игре захтева GPU драјвер \"%s\" који није инсталиран на вашем уређају.\n\nДа ли желите да га преузмете и инсталирате сада? + Преузимање драјвера отказано. Игра се не може покренути без потребног драјвера. + Преузми + Излазни емулација Доношен @@ -864,6 +910,12 @@ Високо Екстремни (спор) + + Подразумевано + Нормално + Високо + Екстремно + АСТЦ метода декодирања Изаберите како су текстуре са компримираним текстовима декодиране за приказивање: ЦПУ (споро, сигуран), ГПУ (Фаст, Препоручи) или ЦПУ АСИНЦ (без затезача, могу да изазове питања) 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 abeefa142e..830e1f0ef9 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -85,7 +85,7 @@ Увімкнути LRU-кеш Увімкніть або вимкніть кеш LRU (Least Recently Used) для покращення продуктивності шляхом зменшення навантаження на CPU. Деякі ігри (зокрема TotK 1.2.1) можуть працювати некоректно - вимкніть, якщо гра не запускається або раптово вилітає. Розширений динамічний стан - Активує функції Vulkan для покращення продуктивності, поліпшеня рендерингу та економії ресурсів під час створення конвеєрів (pipeline), зберігаючи низьке використання CPU/GPU. Ці розширення можуть підвищити температуру пристрою, а старі GPU серії A6XX можуть реагувати некоректно. Вимкніть для емуляції масштабованих форматів. + Керує кількістю функцій, які можна використовувати в розширеному динамічному стані. Вищі значення дозволяють більше функцій і можуть підвищити продуктивність, але можуть спричинити проблеми з деякими драйверами та постачальниками. Значення за замовчуванням може відрізнятися залежно від вашої системи та апаратних можливостей. Це значення можна змінювати, док не буде досягнуто стабільності та кращої якості зображення. Вимкнено Синхронізувати швидкість ядра Синхронізує швидкість ядра з максимальним відсотком швидкості для покращення продуктивності без зміни реальної швидкості гри. @@ -126,6 +126,8 @@ Такти Пропустити внутрішнє інвалідування CPU Пропускає деякі інвалідації кешу на стороні CPU під час оновлення пам\'яті, зменшуючи навантаження на процесор і покращуючи продуктивність. Може спричинити збої в деяких іграх. + Рівень DMA + Керує точністю DMA. Вищий рівень може виправити проблеми в деяких іграх, але також може вплинути на продуктивність. Якщо не впевнені, залиште значення «Типово». 4 ГБ (Рекомендовано) 6 ГБ (Небезпечно) @@ -692,10 +694,77 @@ Гра вимагає прошивки зробіть дамп і встановіть прошивку, або натисніть "OK", щоб продовжити в будь-якому разі.]]> + + Пошук гри... + Гру не знайдено для ID заголовку: %1$s + Користувацькі налаштування не застосовано + Не вдалося застосувати користувацькі налаштування для %1$s: %2$s + Запустити з налаштуваннями за замовчуванням + Запуск скасовано + Не вдалося застосувати запитувані налаштування. Це може бути пов\'язано з відсутністю драйверів GPU або проблемами конфігурації. + Користувацькі налаштування застосовано + Запуск %1$s... + Не вдалося ініціалізувати гру + Бажаєте запустити %1$s з користувацькими налаштуваннями? + Бажаєте запустити %1$s? + Запустити гру + Запустити + + + Не вдалося записати файл конфігурації + Не вдалося застосувати конфігурацію + Конфігурація вже існує + Користувацькі налаштування вже існують для %1$s.\n\nБажаєте перезаписати існуючу конфігурацію?\n\nЦю дію не можна скасувати. + Перевірка наявної конфігурації... + Перезапис скасовано + Перевірка користувацького драйвера: %1$s + Користувацький драйвер недоступний для цього пристрою + Перезаписати + + + Відсутній драйвер GPU + Обраний користувацький драйвер \"%s\" не встановлено. Бажаєте завантажити та встановити його зараз? + Завантаження драйвера... + Драйвер успішно встановлено + Помилка встановлення драйвера + Не вдалося встановити драйвер GPU: %s + Драйвер недоступний + Обраний драйвер недоступний для завантаження. + Необхідний драйвер не встановлено: %s + Недійсний файл драйвера: %s + Мережеве з\'єднання недоступне. Перевірте підключення до інтернету та спробуйте ще раз. + Потрібен драйвер GPU + Конфігурація гри вимагає драйвер GPU \"%s\", який не встановлено на вашому пристрої.\n\nБажаєте завантажити та встановити його зараз? + Завантаження драйвера скасовано. Гру не можна запустити без необхідного драйвера. + Завантажити + + + Вийти з емуляції Готово + Лічильник FPS + Індикатор температури + Перемкнути елементи керування + Відносний центр джойстика + Ковзання D-pad + Тактильний відгук + Показати накладання + Перемкнути все + Налаштувати накладання Масштаб Непрозорість + Скинути накладання + Редагувати накладання + Призупинити емуляцію + Продовжити емуляцію + Опції накладання Сенсорний екран + Заблокувати панель + Розблокувати панель + + Завантаження налаштувань… + + + Програмна клавіатура Зупинити @@ -735,6 +804,12 @@ Висока Екстрим (повільно) + + Типово + Нормальний + Високий + Екстремальний + 0.25X (180p/270p) 0.5X (360p/540p) 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 4e6fd8a436..1c656fc7bb 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -85,7 +85,7 @@ Bật bộ nhớ đệm LRU Bật hoặc tắt bộ nhớ đệm LRU để cải thiện hiệu suất bằng cách tiết kiệm quy trình sử dụng CPU. Một số trò chơi như TotK 1.2.1 có vấn đề - hãy tắt nếu trò chơi không khởi động hoặc bị treo ngẫu nhiên. Trạng thái động mở rộng - Kích hoạt tính năng Vulkan để cải thiện hiệu suất, kết xuất và tiết kiệm tài nguyên khi tạo pipeline trong khi vẫn duy trì mức sử dụng CPU/GPU thấp. Các tiện ích mở rộng này có thể làm tăng nhiệt độ thiết bị và GPU thuộc dòng A6XX cũ có thể không phản ứng đúng. Tắt để mô phỏng các định dạng tỷ lệ. + Điều khiển số tính năng có thể được sử dụng trong Trạng thái Động Mở rộng. Giá trị cao hơn cho phép nhiều tính năng hơn và có thể tăng hiệu suất, nhưng có thể gây ra sự cố với một số trình điều khiển và nhà cung cấp. Giá trị mặc định có thể thay đổi tùy thuộc vào hệ thống và khả năng phần cứng của bạn. Giá trị này có thể được thay đổi cho đến khi đạt được độ ổn định và chất lượng hình ảnh tốt hơn. Đã tắt Đồng bộ tốc độ lõi Đồng bộ tốc độ lõi với tỷ lệ phần trăm tốc độ tối đa để cải thiện hiệu suất mà không làm thay đổi tốc độ thực tế của trò chơi. @@ -126,6 +126,8 @@ 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. 4GB (Được đề xuất) 6GB (Không an toàn) @@ -667,6 +669,50 @@ 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.]]> + + Đang tìm kiếm trò chơi... + Không tìm thấy trò chơi cho ID Tiêu đề: %1$s + Cài đặt Tùy chỉnh Thất bại + Không thể áp dụng cài đặt tùy chỉnh cho %1$s: %2$s + Khởi chạy với Cài đặt Mặc định + Đã hủy khởi chạy + Không thể áp dụng các cài đặt được yêu cầu. Điều này có thể do thiếu trình điều khiển GPU hoặc sự cố cấu hình. + Đã áp dụng cài đặt tùy chỉnh + Đang khởi chạy %1$s... + Không thể khởi tạo trò chơi + Bạn có muốn khởi chạy %1$s với cài đặt tùy chỉnh không? + Bạn có muốn khởi chạy %1$s không? + Khởi chạy Trò chơi + Khởi chạy + + + Không thể ghi tệp cấu hình + Không thể áp dụng cấu hình + Cấu hình Đã Tồn tại + Cài đặt tùy chỉnh đã tồn tại cho %1$s.\n\nBạn có muốn ghi đè cấu hình hiện có không?\n\nHành động này không thể hoàn tác. + Đang kiểm tra cấu hình hiện có... + Đã hủy ghi đè + Đang kiểm tra trình điều khiển tùy chỉnh: %1$s + Trình điều khiển tùy chỉnh không khả dụng cho thiết bị này + Ghi đè + + + Thiếu Trình điều khiển GPU + Trình điều khiển tùy chỉnh được chọn \"%s\" chưa được cài đặt. Bạn có muốn tải xuống và cài đặt ngay bây giờ không? + Đang tải xuống trình điều khiển... + Đã cài đặt trình điều khiển thành công + Cài đặt Trình điều khiển Thất bại + Không thể cài đặt trình điều khiển GPU: %s + Trình điều khiển Không khả dụng + Trình điều khiển được chọn không có sẵn để tải xuống. + Không tìm thấy trình điều khiển bắt buộc: %s + Tệp trình điều khiển không hợp lệ: %s + Không có kết nối mạng khả dụng. Vui lòng kiểm tra kết nối internet của bạn và thử lại. + Yêu cầu Trình điều khiển GPU + Cấu hình trò chơi yêu cầu trình điều khiển GPU \"%s\" chưa được cài đặt trên thiết bị của bạn.\n\nBạn có muốn tải xuống và cài đặt ngay bây giờ không? + Đã hủy tải xuống trình điều khiển. Không thể khởi chạy trò chơi nếu thiếu trình điều khiển bắt buộc. + Tải xuống + Thoát giả lập Hoàn tất @@ -701,6 +747,7 @@ Lỗi nghiêm trọng Đã xảy ra lỗi nghiêm trọng. Kiểm tra nhật ký để biết chi tiết.\nViệc tiếp tục giả lập có thể dẫn đến sự cố và lỗi. Tắt cài đặt này sẽ làm giảm đáng kể hiệu suất giả lập! Để có trải nghiệm tốt nhất, bạn nên bật cài này. + Nhật Bản Hoa Kỳ @@ -712,6 +759,7 @@ B GB + Vulkan Trống @@ -721,6 +769,12 @@ Khỏe Tối đa (Chậm) + + Mặc định + Bình thường + Cao + Cực cao + 0.25X (180p/270p) 0.5X (360p/540p) 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 aff8ffbf08..f3e7d9282c 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 @@ -84,7 +84,7 @@ 启用LRU缓存 启用或禁用LRU缓存,通过节省CPU进程使用来提高性能。某些游戏可能存在问题,特别是TotK 1.2.1,如果游戏无法启动或随机崩溃,请禁用此选项。 扩展动态状态 - 启用Vulkan功能以提高性能、渲染效果,并在创建管道时节省资源,同时保持较低的CPU/GPU使用率。这些扩展可能会提高设备温度,旧款A6XX系列GPU可能无法正常工作。禁用可模拟缩放格式。 + 控制扩展动态状态中可使用的功能数量。数值越高,允许的功能越多,并可能提高性能,但可能会导致某些驱动程序和供应商出现问题。默认值可能因系统和硬件能力而异。可以更改此值,直到实现稳定性和更好的视觉质量。 已禁用 同步核心速度 将核心速度与最大速度百分比同步,在不改变游戏实际速度的情况下提高性能。 @@ -125,6 +125,8 @@ 时钟 跳过CPU内部无效化 在内存更新期间跳过某些CPU端缓存无效化,减少CPU使用率并提高其性能。可能会导致某些游戏出现故障或崩溃。 + DMA 级别 + 控制 DMA 精度。更高的精度可以修复某些游戏中的问题,但在某些情况下也可能影响性能。如果不确定,请保留为“默认”。 4GB (推荐) 6GB (不安全) @@ -791,6 +793,50 @@ 游戏需要固件 转储并安装固件,或点击"确定"继续。]]> + + 正在搜索游戏... + 未找到标题ID的游戏: %1$s + 自定义设置失败 + 无法应用自定义设置 %1$s: %2$s + 使用默认设置启动 + 启动已取消 + 无法应用请求的设置。这可能是由于缺少GPU驱动程序或配置问题。 + 已应用自定义设置 + 正在启动 %1$s... + 无法初始化游戏 + 是否要使用自定义设置启动 %1$s? + 是否要启动 %1$s? + 启动游戏 + 启动 + + + 无法写入配置文件 + 无法应用配置 + 配置已存在 + %1$s 的自定义设置已存在。\n\n是否要覆盖现有配置?\n\n此操作无法撤消。 + 正在检查现有配置... + 覆盖已取消 + 正在检查自定义驱动程序: %1$s + 自定义驱动程序不适用于此设备 + 覆盖 + + + 缺少GPU驱动程序 + 选定的自定义驱动程序 \"%s\" 未安装。是否要立即下载并安装? + 正在下载驱动程序... + 驱动程序安装成功 + 驱动程序安装失败 + 无法安装GPU驱动程序: %s + 驱动程序不可用 + 选定的驱动程序不可下载。 + 未安装所需的驱动程序: %s + 无效的驱动程序文件: %s + 无可用网络连接。请检查您的互联网连接并重试。 + 需要GPU驱动程序 + 游戏配置需要GPU驱动程序 \"%s\",但您的设备上未安装。\n\n是否要立即下载并安装? + 驱动程序下载已取消。没有所需的驱动程序无法启动游戏。 + 下载 + 退出模拟 完成 @@ -861,6 +907,12 @@ 极高 (慢速) + + 默认 + 普通 + + 极高 + 0.25X (180p/270p) 0.5X (360p/540p) 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 3a11d83b84..b6c17745be 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 @@ -85,7 +85,7 @@ 啟用LRU快取 啟用或停用LRU快取,透過節省CPU進程使用來提高效能。某些遊戲可能存在問題,特別是TotK 1.2.1,如果遊戲無法啟動或隨機崩潰,請停用此選項。 擴展動態狀態 - 啟用Vulkan功能以提高效能、渲染效果,並在創建管線時節省資源,同時保持較低的CPU/GPU使用率。這些擴充功能可能會提高裝置溫度,舊款A6XX系列GPU可能無法正常運作。停用可模擬縮放格式。 + 控制擴展動態狀態中可使用的功能數量。數值越高,允許的功能越多,並可能提高效能,但可能會導致某些驅動程式和供應商出現問題。預設值可能因系統和硬體能力而異。可以變更此值,直到實現穩定性和更好的視覺品質。 已停用 同步核心速度 將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能。 @@ -118,6 +118,8 @@ 時脈 跳過CPU內部無效化 在記憶體更新期間跳過某些CPU端快取無效化,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或崩潰。 + DMA 級別 + 控制 DMA 精確度。更高的精確度可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為「預設」。 4GB (推薦) @@ -796,6 +798,50 @@ 遊戲需要韌體 轉儲並安裝韌體,或點擊"確定"繼續。]]> + + 正在搜尋遊戲... + 找不到標題ID的遊戲: %1$s + 自訂設定失敗 + 無法套用自訂設定 %1$s: %2$s + 使用預設設定啟動 + 啟動已取消 + 無法套用請求的設定。這可能是由於缺少GPU驅動程式或設定問題。 + 已套用自訂設定 + 正在啟動 %1$s... + 無法初始化遊戲 + 是否要使用自訂設定啟動 %1$s? + 是否要啟動 %1$s? + 啟動遊戲 + 啟動 + + + 無法寫入設定檔 + 無法套用設定 + 設定已存在 + %1$s 的自訂設定已存在。\n\n是否要覆蓋現有設定?\n\n此操作無法復原。 + 正在檢查現有設定... + 覆蓋已取消 + 正在檢查自訂驅動程式: %1$s + 自訂驅動程式不適用於此裝置 + 覆蓋 + + + 缺少GPU驅動程式 + 選定的自訂驅動程式 \"%s\" 未安裝。是否要立即下載並安裝? + 正在下載驅動程式... + 驅動程式安裝成功 + 驅動程式安裝失敗 + 無法安裝GPU驅動程式: %s + 驅動程式不可用 + 選定的驅動程式無法下載。 + 未安裝所需的驅動程式: %s + 無效的驅動程式檔案: %s + 無可用網路連線。請檢查您的網路連線並重試。 + 需要GPU驅動程式 + 遊戲設定需要GPU驅動程式 \"%s\",但您的裝置上未安裝。\n\n是否要立即下載並安裝? + 驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。 + 下載 + 結束模擬 完成 @@ -866,6 +912,12 @@ 極高 (慢) + + 預設 + 普通 + + 極高 + 0.25X (180p/270p) 0.5X (360p/540p) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 602003cf8a..2f0392675d 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -452,6 +452,19 @@ 2 + + @string/dma_accuracy_default + @string/dma_accuracy_normal + @string/dma_accuracy_high + @string/dma_accuracy_extreme + + + 0 + 1 + 2 + 3 + + @string/applet_hle @string/applet_lle diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 88474faf3c..975bd1741a 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -74,7 +74,7 @@ GPU Extensions Extended Dynamic State - Enables Vulkan features to improve performance, rendering, and save resources on pipeline creation while maintaining lower CPU/GPU usage. These extensions may increase device temperature, and GPUs belonging to the older A6XX line may not react properly. Disable to emulate scaled formats. + 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. Disabled Provoking Vertex Improves lighting and vertex handling in certain games. Only supported on Vulkan 1.0+ GPUs. @@ -113,6 +113,8 @@ 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. Shader Backend @@ -816,6 +818,11 @@ The selected driver is not available for download. Required driver not installed: %s Invalid driver file: %s + No network connection available. Please check your internet connection and try again. + GPU Driver Required + The game configuration requires GPU driver \"%s\" which is not installed on your device.\n\nWould you like to download and install it now? + Driver download cancelled. The game cannot be launched without the required driver. + Download Exit emulation @@ -927,6 +934,12 @@ High Extreme (Slow) + + Default + Normal + High + Extreme + ASTC Decoding Method Pick how ASTC-compressed textures are decoded for rendering: CPU (slow, safe), GPU (fast, recommended), or CPU Async (no stutters, may cause issues) diff --git a/src/common/settings.h b/src/common/settings.h index 288a41b369..b846f41318 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -427,7 +427,19 @@ struct Values { Specialization::Default, true, true}; + GpuAccuracy current_gpu_accuracy{GpuAccuracy::High}; + + SwitchableSetting dma_accuracy{linkage, + DmaAccuracy::Default, + DmaAccuracy::Default, + DmaAccuracy::Extreme, + "dma_accuracy", + Category::RendererAdvanced, + Specialization::Default, + true, + true}; + SwitchableSetting max_anisotropy{linkage, #ifdef ANDROID AnisotropyMode::Default, @@ -466,7 +478,13 @@ struct Values { true, true}; #endif - SwitchableSetting sync_memory_operations{linkage, false, "sync_memory_operations", Category::RendererAdvanced, true, true}; + SwitchableSetting sync_memory_operations{linkage, + false, + "sync_memory_operations", + Category::RendererAdvanced, + Specialization::Default, + true, + true}; SwitchableSetting async_presentation{linkage, #ifdef ANDROID true, @@ -518,7 +536,15 @@ struct Values { Category::RendererAdvanced}; SwitchableSetting dyna_state{linkage, +#if defined (_WIN32) + 3, +#elif defined (__FreeBSD__) + 3, +#elif defined (ANDROID) 0, +#else + 2, +#endif 0, 3, "dyna_state", diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index c2347f74d0..52b4a128f7 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -136,6 +136,8 @@ ENUM(ShaderBackend, Glsl, Glasm, SpirV); ENUM(GpuAccuracy, Normal, High, Extreme); +ENUM(DmaAccuracy, Default, Normal, High, Extreme); + ENUM(CpuBackend, Dynarmic, Nce); ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid); diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5f9bfa2214..eab506f194 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1251,11 +1251,7 @@ if(ENABLE_OPENSSL) find_package(OpenSSL REQUIRED) - if (OpenSSL_ADDED) - link_openssl(core) - else() - target_link_libraries(core PRIVATE OpenSSL::SSL) - endif() + target_link_libraries(core PRIVATE OpenSSL::SSL OpenSSL::Crypto) elseif (APPLE) target_sources(core PRIVATE hle/service/ssl/ssl_backend_securetransport.cpp) diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 19cdf4f3ac..5e39fbeb14 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.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 @@ -290,6 +293,23 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool alloc_start = process_code_end; alloc_size = GetInteger(end) - GetInteger(process_code_end); } + + // FW 18+: Apply extra region size calculations for already available region size + const auto as_mask = Svc::CreateProcessFlag::AddressSpaceMask; + const bool is_64bit_as = (as_type & as_mask) == Svc::CreateProcessFlag::AddressSpace64Bit; + + if (is_64bit_as && (as_type & Svc::CreateProcessFlag::EnableAliasRegionExtraSize) + != Svc::CreateProcessFlag{0} && alias_region_size) { + const size_t address_space_size = (GetInteger(end) - GetInteger(start)); + + // Same as address_space_size/8 but faster due to bit shifting operation + const size_t alias_region_extra_size = address_space_size >> 3; + alias_region_size += alias_region_extra_size; + + // Store for later processing + m_alias_region_extra_size = alias_region_extra_size; + } + const size_t needed_size = (alias_region_size + heap_region_size + stack_region_size + kernel_map_region_size); R_UNLESS(alloc_size >= needed_size, ResultOutOfMemory); diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 748419f862..fc5d3876c7 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.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 @@ -208,6 +211,7 @@ private: size_t m_mapped_unsafe_physical_memory{}; size_t m_mapped_insecure_memory{}; size_t m_mapped_ipc_server_memory{}; + size_t m_alias_region_extra_size{}; mutable KLightLock m_general_lock; mutable KLightLock m_map_physical_memory_lock; KLightLock m_device_map_lock; @@ -695,6 +699,10 @@ public: return m_alias_code_region_end - m_alias_code_region_start; } + size_t GetAliasRegionExtraSize() const { + return m_alias_region_extra_size; + } + size_t GetNormalMemorySize() const { // Lock the table. KScopedLightLock lk(m_general_lock); diff --git a/src/core/hle/kernel/k_process_page_table.h b/src/core/hle/kernel/k_process_page_table.h index 346d7ca083..0601f9f6d8 100644 --- a/src/core/hle/kernel/k_process_page_table.h +++ b/src/core/hle/kernel/k_process_page_table.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 @@ -410,6 +413,9 @@ public: size_t GetAliasRegionSize() const { return m_page_table.GetAliasRegionSize(); } + size_t GetAliasRegionExtraSize() const { + return m_page_table.GetAliasRegionExtraSize(); + } size_t GetStackRegionSize() const { return m_page_table.GetStackRegionSize(); } diff --git a/src/core/hle/kernel/svc/svc_info.cpp b/src/core/hle/kernel/svc/svc_info.cpp index 1814f5e90e..37f4eba69c 100644 --- a/src/core/hle/kernel/svc/svc_info.cpp +++ b/src/core/hle/kernel/svc/svc_info.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 @@ -37,8 +40,8 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle case InfoType::TotalNonSystemMemorySize: case InfoType::UsedNonSystemMemorySize: case InfoType::IsApplication: - case InfoType::FreeThreadCount: - case InfoType::AliasRegionExtraSize: { + case InfoType::FreeThreadCount: + case InfoType::AliasRegionExtraSize: { R_UNLESS(info_sub_id == 0, ResultInvalidEnumValue); const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable(); @@ -61,7 +64,6 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle case InfoType::AliasRegionSize: *result = process->GetPageTable().GetAliasRegionSize(); R_SUCCEED(); - case InfoType::HeapRegionAddress: *result = GetInteger(process->GetPageTable().GetHeapRegionStart()); R_SUCCEED(); @@ -135,10 +137,17 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle } R_SUCCEED(); - case InfoType::AliasRegionExtraSize: - // TODO (jarrodnorwell): do this when KIP's NPDM header is finished - R_SUCCEED(); - + case InfoType::AliasRegionExtraSize: { + if (info_sub_id != 0) { + return ResultInvalidCombination; + } + + KProcess* current_process = GetCurrentProcessPointer(system.Kernel()); + *result = current_process->GetPageTable().GetAliasRegionExtraSize(); + + R_SUCCEED(); + } + default: break; } diff --git a/src/core/hle/kernel/svc_types.h b/src/core/hle/kernel/svc_types.h index d02548ba73..fce3dea476 100644 --- a/src/core/hle/kernel/svc_types.h +++ b/src/core/hle/kernel/svc_types.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 @@ -153,7 +156,7 @@ enum class InfoType : u32 { ThreadTickCount = 25, IsSvcPermitted = 26, IoRegionHint = 27, - AliasRegionExtraSize = 28, + AliasRegionExtraSize = 28, MesosphereMeta = 65000, MesosphereCurrentProcess = 65001, @@ -643,9 +646,13 @@ enum class CreateProcessFlag : u32 { // 11.x+ DisableDeviceAddressSpaceMerge. DisableDeviceAddressSpaceMerge = (1 << 12), + // 18.x+ Add extra size to the already available AliasRegionSize + EnableAliasRegionExtraSize = (1 << 13), + // Mask of all flags. All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication | - PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge, + PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge | + EnableAliasRegionExtraSize, }; DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag); diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index 49179617a7..6a3c6e9c41 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -12,7 +12,7 @@ #ifdef _WIN32 #include #include -#elif defined(__unix__) +#elif defined(__unix__) || defined(__APPLE__) #include #include #include @@ -162,7 +162,7 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) { } } -#elif defined(__unix__) // ^ _WIN32 v __unix__ +#elif defined(__unix__) || defined(__APPLE__) // ^ _WIN32 v __unix__ using SOCKET = int; using WSAPOLLFD = pollfd; diff --git a/src/core/internal_network/network.h b/src/core/internal_network/network.h index 64f3f121df..5a3343efd9 100644 --- a/src/core/internal_network/network.h +++ b/src/core/internal_network/network.h @@ -104,7 +104,7 @@ constexpr IPv4Address TranslateIPv4(in_addr addr) { auto& bytes = addr.S_un.S_un_b; return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4}; } -#elif defined(__unix__) +#elif defined(__unix__) || defined(__APPLE__) constexpr IPv4Address TranslateIPv4(in_addr addr) { const u32 bytes = addr.s_addr; return IPv4Address{static_cast(bytes), static_cast(bytes >> 8), diff --git a/src/core/internal_network/sockets.h b/src/core/internal_network/sockets.h index 65ebb893ad..27468709fd 100644 --- a/src/core/internal_network/sockets.h +++ b/src/core/internal_network/sockets.h @@ -10,7 +10,7 @@ #if defined(_WIN32) // windows -#elif defined(__unix__) +#elif defined(__unix__) || defined(__APPLE__) // unix #else // haiku @@ -28,7 +28,7 @@ struct ProxyPacket; class SocketBase { public: -#ifdef __unix__ +#if defined(__unix__) || defined(__APPLE__) using SOCKET = int; static constexpr SOCKET INVALID_SOCKET = -1; static constexpr SOCKET SOCKET_ERROR = -1; diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 8ea4cbd43a..4b9a506cdf 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -102,9 +102,18 @@ bool DmaPusher::Step() { ProcessCommands(headers); }; - if (Settings::IsGPULevelExtreme()) { + const Settings::DmaAccuracy accuracy = Settings::values.dma_accuracy.GetValue(); + const bool use_gpu_accuracy = accuracy == Settings::DmaAccuracy::Default; + + // 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) { safe_process(); - } else if (Settings::IsGPULevelHigh()) { + } else if (unsafe_compute) { if (dma_state.method >= MacroRegistersStart) { unsafe_process(); } else { diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp index 617f92910c..5938de6100 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pass.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 @@ -258,7 +261,7 @@ ComputePass::ComputePass(const Device& device_, DescriptorPool& descriptor_pool, .pDescriptorUpdateEntries = templates.data(), .templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, .descriptorSetLayout = *descriptor_set_layout, - .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE, .pipelineLayout = *layout, .set = 0, }); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 7e9dbb583a..650c8e07ed 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -80,7 +80,8 @@ public: PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache, const GraphicsPipelineCacheKey& key, std::array stages, const std::array& infos); - + // True if this pipeline was created with VK_DYNAMIC_STATE_VERTEX_INPUT_EXT + bool HasDynamicVertexInput() const noexcept { return key.state.dynamic_vertex_input; } GraphicsPipeline& operator=(GraphicsPipeline&&) noexcept = delete; GraphicsPipeline(GraphicsPipeline&&) noexcept = delete; diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index ac8b6e838e..4e5a2ff049 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.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 @@ -129,11 +132,19 @@ VkResult MasterSemaphore::SubmitQueueTimeline(vk::CommandBuffer& cmdbuf, const std::array cmdbuffers{*upload_cmdbuf, *cmdbuf}; const u32 num_wait_semaphores = wait_semaphore ? 1 : 0; + // Pointers must be null when the count is zero (best-practices) + const VkSemaphore* p_wait_sems = + (num_wait_semaphores > 0) ? &wait_semaphore : nullptr; + const VkPipelineStageFlags* p_wait_masks = + (num_wait_semaphores > 0) ? wait_stage_masks.data() : nullptr; + const VkSemaphore* p_signal_sems = + (num_signal_semaphores > 0) ? signal_semaphores.data() : nullptr; + const u64 wait_zero = 0; // dummy for binary wait const VkTimelineSemaphoreSubmitInfo timeline_si{ .sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, .pNext = nullptr, - .waitSemaphoreValueCount = 0, - .pWaitSemaphoreValues = nullptr, + .waitSemaphoreValueCount = num_wait_semaphores, + .pWaitSemaphoreValues = num_wait_semaphores ? &wait_zero : nullptr, .signalSemaphoreValueCount = num_signal_semaphores, .pSignalSemaphoreValues = signal_values.data(), }; @@ -141,12 +152,12 @@ VkResult MasterSemaphore::SubmitQueueTimeline(vk::CommandBuffer& cmdbuf, .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .pNext = &timeline_si, .waitSemaphoreCount = num_wait_semaphores, - .pWaitSemaphores = &wait_semaphore, - .pWaitDstStageMask = wait_stage_masks.data(), + .pWaitSemaphores = p_wait_sems, + .pWaitDstStageMask = p_wait_masks, .commandBufferCount = static_cast(cmdbuffers.size()), .pCommandBuffers = cmdbuffers.data(), .signalSemaphoreCount = num_signal_semaphores, - .pSignalSemaphores = signal_semaphores.data(), + .pSignalSemaphores = p_signal_sems, }; return device.GetGraphicsQueue().Submit(submit_info); @@ -159,18 +170,24 @@ VkResult MasterSemaphore::SubmitQueueFence(vk::CommandBuffer& cmdbuf, const u32 num_signal_semaphores = signal_semaphore ? 1 : 0; const u32 num_wait_semaphores = wait_semaphore ? 1 : 0; + const VkSemaphore* p_wait_sems = + (num_wait_semaphores > 0) ? &wait_semaphore : nullptr; + const VkPipelineStageFlags* p_wait_masks = + (num_wait_semaphores > 0) ? wait_stage_masks.data() : nullptr; + const VkSemaphore* p_signal_sems = + (num_signal_semaphores > 0) ? &signal_semaphore : nullptr; const std::array cmdbuffers{*upload_cmdbuf, *cmdbuf}; const VkSubmitInfo submit_info{ .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .pNext = nullptr, .waitSemaphoreCount = num_wait_semaphores, - .pWaitSemaphores = &wait_semaphore, - .pWaitDstStageMask = wait_stage_masks.data(), + .pWaitSemaphores = p_wait_sems, + .pWaitDstStageMask = p_wait_masks, .commandBufferCount = static_cast(cmdbuffers.size()), .pCommandBuffers = cmdbuffers.data(), .signalSemaphoreCount = num_signal_semaphores, - .pSignalSemaphores = &signal_semaphore, + .pSignalSemaphores = p_signal_sems, }; auto fence = GetFreeFence(); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index e3fd0b683c..e4b6527db0 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -409,16 +409,11 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, LOG_INFO(Render_Vulkan, "DynamicState value is set to {}", (u32) dynamic_state); dynamic_features = DynamicFeatures{ - .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() - && dynamic_state > 0, - .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() - && dynamic_state > 1, - .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported() - && dynamic_state > 1, - .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() - && dynamic_state > 2, - .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() - && dynamic_state > 2, + .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0, + .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1, + .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1, + .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2, + .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2, .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), }; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index c511a51720..2d12fc658f 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -939,16 +939,11 @@ void RasterizerVulkan::UpdateDynamicStates() { const u8 dynamic_state = Settings::values.dyna_state.GetValue(); auto features = DynamicFeatures{ - .has_extended_dynamic_state = - device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0, - .has_extended_dynamic_state_2 = - device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1, - .has_extended_dynamic_state_2_extra = - device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1, - .has_extended_dynamic_state_3_blend = - device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_enables = - device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2, + .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0, + .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1, + .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1, + .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2, + .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2, .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), }; @@ -1007,7 +1002,10 @@ void RasterizerVulkan::UpdateDynamicStates() { } } if (features.has_dynamic_vertex_input) { - UpdateVertexInput(regs); + if (auto* gp = pipeline_cache.CurrentGraphicsPipeline(); + gp && gp->HasDynamicVertexInput()) { + UpdateVertexInput(regs); + } } } diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp index 7746a88d34..80ff75e3b9 100644 --- a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.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 @@ -14,23 +17,55 @@ namespace Vulkan { namespace { using VideoCore::Surface::PixelFormat; +using VideoCore::Surface::SurfaceType; -VkAttachmentDescription AttachmentDescription(const Device& device, PixelFormat format, - VkSampleCountFlagBits samples) { - using MaxwellToVK::SurfaceFormat; - return { - .flags = {}, - .format = SurfaceFormat(device, FormatType::Optimal, true, format).format, - .samples = samples, - .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE, - .initialLayout = VK_IMAGE_LAYOUT_GENERAL, - .finalLayout = VK_IMAGE_LAYOUT_GENERAL, - }; -} -} // Anonymous namespace + constexpr SurfaceType GetSurfaceType(PixelFormat format) { + switch (format) { + // Depth formats + case PixelFormat::D16_UNORM: + case PixelFormat::D32_FLOAT: + case PixelFormat::X8_D24_UNORM: + return SurfaceType::Depth; + + // Stencil formats + case PixelFormat::S8_UINT: + return SurfaceType::Stencil; + + // Depth+Stencil formats + case PixelFormat::D24_UNORM_S8_UINT: + case PixelFormat::S8_UINT_D24_UNORM: + case PixelFormat::D32_FLOAT_S8_UINT: + return SurfaceType::DepthStencil; + + // Everything else is a color texture + default: + return SurfaceType::ColorTexture; + } + } + + VkAttachmentDescription AttachmentDescription(const Device& device, PixelFormat format, + VkSampleCountFlagBits samples) { + using MaxwellToVK::SurfaceFormat; + + const SurfaceType surface_type = GetSurfaceType(format); + const bool has_stencil = surface_type == SurfaceType::DepthStencil || + surface_type == SurfaceType::Stencil; + + return { + .flags = {}, + .format = SurfaceFormat(device, FormatType::Optimal, true, format).format, + .samples = samples, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .stencilLoadOp = has_stencil ? VK_ATTACHMENT_LOAD_OP_LOAD + : VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = has_stencil ? VK_ATTACHMENT_STORE_OP_STORE + : VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_GENERAL, + .finalLayout = VK_IMAGE_LAYOUT_GENERAL, + }; + } + } // Anonymous namespace RenderPassCache::RenderPassCache(const Device& device_) : device{&device_} {} @@ -78,6 +113,18 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) { .preserveAttachmentCount = 0, .pPreserveAttachments = nullptr, }; + const VkSubpassDependency dependency{ + .srcSubpass = 0, // Current subpass + .dstSubpass = 0, // Same subpass (self-dependency) + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + .dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, + .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT + }; pair->second = device->GetLogical().CreateRenderPass({ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .pNext = nullptr, @@ -86,8 +133,8 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) { .pAttachments = descriptions.empty() ? nullptr : descriptions.data(), .subpassCount = 1, .pSubpasses = &subpass, - .dependencyCount = 0, - .pDependencies = nullptr, + .dependencyCount = 1, + .pDependencies = &dependency, }); return *pair->second; } diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index fc9e78a234..6bd6eab009 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.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 @@ -727,20 +730,11 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR LOG_INFO(Render_Vulkan, "Dynamic state is disabled (dyna_state = 0), forcing scaled format emulation ON"); // Disable dynamic state 1-3 and all extensions - RemoveExtensionFeature(extensions.custom_border_color, features.custom_border_color, - VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); - - RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, - VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); - - RemoveExtensionFeature(extensions.extended_dynamic_state2, features.extended_dynamic_state2, - VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); - - RemoveExtensionFeature(extensions.vertex_input_dynamic_state, features.vertex_input_dynamic_state, - VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); - - RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, - VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); + RemoveExtensionFeature(extensions.custom_border_color, features.custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); + RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); + RemoveExtensionFeature(extensions.extended_dynamic_state2, features.extended_dynamic_state2, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); + RemoveExtensionFeature(extensions.vertex_input_dynamic_state, features.vertex_input_dynamic_state, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); + RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); dynamic_state3_blending = false; dynamic_state3_enables = false; @@ -750,8 +744,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR LOG_INFO(Render_Vulkan, "Dynamic state is enabled (dyna_state = 1-3), disabling scaled format emulation"); } - logical = vk::Device::Create(physical, queue_cis, ExtensionListForVulkan(loaded_extensions), - first_next, dld); + logical = vk::Device::Create(physical, queue_cis, ExtensionListForVulkan(loaded_extensions), first_next, dld); graphics_queue = logical.GetQueue(graphics_family); present_queue = logical.GetQueue(present_family); diff --git a/src/web_service/CMakeLists.txt b/src/web_service/CMakeLists.txt index c1d5a84225..c1aaac9881 100644 --- a/src/web_service/CMakeLists.txt +++ b/src/web_service/CMakeLists.txt @@ -18,12 +18,8 @@ create_target_directory_groups(web_service) target_include_directories(web_service PUBLIC ${cpp-jwt_SOURCE_DIR}/include) target_link_libraries(web_service PRIVATE common network nlohmann_json::nlohmann_json httplib::httplib cpp-jwt::cpp-jwt) -if (OpenSSL_ADDED) - link_openssl(web_service) -else() - find_package(OpenSSL REQUIRED) - target_link_libraries(web_service PRIVATE OpenSSL::SSL) -endif() +find_package(OpenSSL REQUIRED) +target_link_libraries(web_service PRIVATE OpenSSL::SSL OpenSSL::Crypto) if (YUZU_USE_PRECOMPILED_HEADERS) target_precompile_headers(web_service PRIVATE precompiled_headers.h) diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index f7ec2985c7..f979a5c181 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -406,7 +406,11 @@ 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 Qt6::GuiPrivate) + target_link_libraries(yuzu PRIVATE Qt6::DBus) + + if (TARGET Qt6::GuiPrivate) + target_link_libraries(yuzu PRIVATE Qt6::GuiPrivate) + endif() endif() target_compile_definitions(yuzu PRIVATE diff --git a/src/yuzu/configuration/configure_graphics_extensions.ui b/src/yuzu/configuration/configure_graphics_extensions.ui index beae6df6b0..7906b8318d 100644 --- a/src/yuzu/configuration/configure_graphics_extensions.ui +++ b/src/yuzu/configuration/configure_graphics_extensions.ui @@ -22,21 +22,9 @@ - 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. - - - true - - - diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index fd541d4fd7..f6d590c0ee 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -288,12 +288,16 @@ std::unique_ptr InitializeTranslations(QWidget* parent) "and safe to set at 16x on most GPUs.")); INSERT(Settings, gpu_accuracy, - tr("Accuracy Level:"), - tr("GPU emulation accuracy.\nMost games render fine with Normal, but High is still " + tr("GPU Level:"), + 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.")); + 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.")); INSERT(Settings, use_asynchronous_shaders, tr("Use asynchronous shader building (Hack)"), @@ -346,9 +350,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) INSERT(Settings, dyna_state, tr("Extended Dynamic State"), - tr("Enables the VkExtendedDynamicState* extensions.\nHigher dynamic states will " - "generally improve " - "performance, but may cause issues on certain games or devices.")); + 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.")); INSERT(Settings, provoking_vertex, @@ -524,6 +526,13 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) PAIR(GpuAccuracy, High, tr("High")), PAIR(GpuAccuracy, Extreme, tr("Extreme")), }}); + 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")), + }}); translations->insert( {Settings::EnumMetadata::Index(), { diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h index 0502fe75e4..85de0ae72d 100644 --- a/src/yuzu/uisettings.h +++ b/src/yuzu/uisettings.h @@ -270,6 +270,7 @@ Q_DECLARE_METATYPE(UISettings::GameDir*); // These metatype declarations cannot be in common/settings.h because core is devoid of QT Q_DECLARE_METATYPE(Settings::CpuAccuracy); Q_DECLARE_METATYPE(Settings::GpuAccuracy); +Q_DECLARE_METATYPE(Settings::DmaAccuracy); Q_DECLARE_METATYPE(Settings::FullscreenMode); Q_DECLARE_METATYPE(Settings::NvdecEmulation); Q_DECLARE_METATYPE(Settings::ResolutionSetup);