From 7e943732bf025bb7ead5ee3e104b88c020f9f422 Mon Sep 17 00:00:00 2001 From: swurl Date: Sun, 11 May 2025 23:58:25 +0000 Subject: [PATCH] fix a large variety of issues (#101) - GLASM/SPIR-V mixup on Android - potential greenscreen fix (thx suyu) - save memory layout and add 10gb/12gb options - potential samsung gaming hub fix - fix layout of controller UI - fix default settings to sensible defaults. - note to TotK that you should increase memory layout - Error checking for Windows linking - fix an IDE error - improved migration system w/threading and busy indicator - disabled citron migration for now - replaced some user-facing legacy strings with eden - Added 10GB and 12GB DRAM layouts - Fix Android black screen issues - add discord link & update FAQ/Quickstart - update links in about page - add back rich presence - add Don't show again for desktop pre alpha banner - add citron warning to android and polaris to desktop Signed-off-by: swurl Co-authored-by: Pavel Barabanov Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/101 Co-authored-by: swurl Co-committed-by: swurl --- .ci/linux/build.sh | 1 - .ci/linux/package.sh | 11 +- .github/workflows/trigger_release.yml | 3 +- CMakeLists.txt | 66 +++---- src/android/app/build.gradle.kts | 1 - src/android/app/src/main/AndroidManifest.xml | 3 +- .../yuzu_emu/fragments/EmulationFragment.kt | 4 +- .../src/main/res/layout/header_in_game.xml | 2 +- .../app/src/main/res/values-ar/strings.xml | 16 +- .../app/src/main/res/values-ckb/strings.xml | 16 +- .../app/src/main/res/values-cs/strings.xml | 43 ++++- .../app/src/main/res/values-de/strings.xml | 33 +++- .../app/src/main/res/values-es/strings.xml | 16 +- .../app/src/main/res/values-fa/strings.xml | 16 +- .../app/src/main/res/values-fr/strings.xml | 16 +- .../app/src/main/res/values-he/strings.xml | 16 +- .../app/src/main/res/values-hu/strings.xml | 16 +- .../app/src/main/res/values-id/strings.xml | 14 +- .../app/src/main/res/values-it/strings.xml | 16 +- .../app/src/main/res/values-ja/strings.xml | 16 +- .../app/src/main/res/values-ko/strings.xml | 13 +- .../app/src/main/res/values-nb/strings.xml | 16 +- .../app/src/main/res/values-pl/strings.xml | 14 +- .../src/main/res/values-pt-rBR/strings.xml | 16 +- .../src/main/res/values-pt-rPT/strings.xml | 16 +- .../app/src/main/res/values-ru/strings.xml | 16 +- .../app/src/main/res/values-uk/strings.xml | 56 ++++-- .../app/src/main/res/values-vi/strings.xml | 16 +- .../src/main/res/values-zh-rCN/strings.xml | 16 +- .../src/main/res/values-zh-rTW/strings.xml | 14 +- .../app/src/main/res/values/arrays.xml | 2 + .../app/src/main/res/values/strings.xml | 22 ++- src/common/settings.h | 18 +- src/common/settings_enums.h | 2 +- .../board/nintendo/nx/k_system_control.cpp | 20 ++ .../kernel/board/nintendo/nx/secure_monitor.h | 4 + .../am/service/common_state_getter.cpp | 13 +- .../service/am/service/common_state_getter.h | 1 - src/video_core/host1x/ffmpeg/ffmpeg.cpp | 182 +++++++++++++++++- .../renderer_vulkan/renderer_vulkan.cpp | 112 +++++++---- .../renderer_vulkan/vk_present_manager.cpp | 41 +++- .../renderer_vulkan/vk_present_manager.h | 18 +- .../renderer_vulkan/vk_query_cache.cpp | 2 +- .../renderer_vulkan/vk_swapchain.cpp | 62 +++++- src/video_core/renderer_vulkan/vk_swapchain.h | 26 ++- src/video_core/vulkan_common/vulkan_wrapper.h | 4 + src/yuzu/CMakeLists.txt | 2 + src/yuzu/aboutdialog.ui | 2 +- src/yuzu/bootmanager.cpp | 4 +- src/yuzu/compatdb.ui | 18 +- src/yuzu/configuration/configure_debug.ui | 4 +- .../configure_graphics_extensions.ui | 2 +- .../configuration/configure_input_advanced.ui | 6 +- .../configuration/configure_input_player.ui | 98 +++++----- .../configuration/configure_motion_touch.cpp | 2 +- src/yuzu/configuration/configure_tas.ui | 2 +- .../configure_touchscreen_advanced.ui | 2 +- src/yuzu/configuration/configure_web.cpp | 2 +- src/yuzu/configuration/configure_web.ui | 4 +- src/yuzu/configuration/shared_translation.cpp | 8 +- src/yuzu/discord_impl.cpp | 18 +- src/yuzu/game_list.cpp | 22 ++- src/yuzu/game_list.h | 3 + src/yuzu/main.cpp | 38 ++-- src/yuzu/main.h | 1 + src/yuzu/main.ui | 6 + src/yuzu/migration_worker.cpp | 123 ++++++++++++ src/yuzu/migration_worker.h | 41 ++++ src/yuzu/multiplayer/host_room.cpp | 4 +- src/yuzu/user_data_migration.cpp | 161 +++++----------- src/yuzu/user_data_migration.h | 20 +- src/yuzu_cmd/emu_window/emu_window_sdl2.cpp | 12 +- .../emu_window/emu_window_sdl2_gl.cpp | 2 +- .../emu_window/emu_window_sdl2_null.cpp | 2 +- .../emu_window/emu_window_sdl2_vk.cpp | 6 +- src/yuzu_cmd/yuzu.cpp | 8 +- 76 files changed, 1154 insertions(+), 516 deletions(-) create mode 100644 src/yuzu/migration_worker.cpp create mode 100644 src/yuzu/migration_worker.h diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh index f804474814..c020cc7edd 100755 --- a/.ci/linux/build.sh +++ b/.ci/linux/build.sh @@ -61,7 +61,6 @@ cmake .. -G Ninja \ -DYUZU_USE_QT_WEB_ENGINE=OFF \ -DENABLE_QT_TRANSLATION=ON \ -DUSE_DISCORD_PRESENCE=OFF \ - -DBUNDLE_SPEEX=ON \ -DYUZU_USE_FASTER_LD=OFF \ -DYUZU_ENABLE_LTO=ON \ -DCMAKE_LINKER=/usr/bin/mold \ diff --git a/.ci/linux/package.sh b/.ci/linux/package.sh index 8d0cd14894..4d58b8f328 100755 --- a/.ci/linux/package.sh +++ b/.ci/linux/package.sh @@ -28,21 +28,22 @@ VERSION="$(echo "$EDEN_TAG")" mkdir -p ./AppDir cd ./AppDir -cat > org.eden_emu.eden.desktop << EOL +cat > eden.desktop << EOL [Desktop Entry] Type=Application Name=Eden -Icon=org.eden_emu.eden +Icon=eden +StartupWMClass=eden Exec=eden Categories=Game;Emulator; EOL -cp ../dist/eden.svg ./org.eden_emu.eden.svg +cp ../dist/eden.svg ./eden.svg -ln -sf ./org.eden_emu.eden.svg.svg ./.DirIcon +ln -sf ./eden.svg ./.DirIcon if [ "$DEVEL" = 'true' ]; then - sed -i 's|Name=Eden|Name=Eden Nightly|' ./org.eden_emu.eden.desktop + sed -i 's|Name=Eden|Name=Eden Nightly|' ./eden.desktop UPINFO="$(echo "$UPINFO" | sed 's|latest|nightly|')" fi diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index 91bd4d2d15..5553884862 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -102,7 +102,7 @@ jobs: uses: forgejo/upload-artifact@v4 with: name: linux.zip - path: ./*.AppImage + path: ./*.AppImage* android: runs-on: android @@ -177,6 +177,7 @@ jobs: mkdir -p dist cp linux.zip/Eden-*.AppImage dist/Eden-Linux-${{ env.VERSION }}-amd64.AppImage + cp linux.zip/Eden-*.AppImage.zsync dist/Eden-Linux-${{ env.VERSION }}-amd64.AppImage.zsync cp msvc.zip/eden-windows-msvc*.zip dist/Eden-Windows-MSVC-${{ env.VERSION }}-amd64.zip cp android.zip/eden-android*.apk dist/Eden-Android-${{ env.VERSION }}.apk cp android.zip/eden-android*.aab dist/Eden-Android-${{ env.VERSION }}.aab diff --git a/CMakeLists.txt b/CMakeLists.txt index b88ab64e53..72b03ec2e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,13 +105,13 @@ if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) file(DOWNLOAD "${vvl_base_url}/${vvl_version}/android-binaries-${vvl_version}-android.zip" "${vvl_zip_file}" SHOW_PROGRESS) execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") endif() # Copy the arm64 binary to src/android/app/main/jniLibs set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/") file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so" - DESTINATION "${vvl_lib_path}") + DESTINATION "${vvl_lib_path}") endif() if (ANDROID) @@ -209,7 +209,7 @@ function(check_submodules_present) string(REGEX REPLACE "path *= *" "" module ${module}) if (NOT EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git") message(FATAL_ERROR "Git submodule ${module} not found. " - "Please run: \ngit submodule update --init --recursive") + "Please run: \ngit submodule update --init --recursive") endif() endforeach() endfunction() @@ -218,12 +218,12 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/.gitmodules AND YUZU_CHECK_SUBMODULES) check_submodules_present() endif() configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc - ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc - COPYONLY) + ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc + COPYONLY) if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json) configure_file("${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json" - "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" - COPYONLY) + "${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" + COPYONLY) endif() if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) message(STATUS "Downloading compatibility list for yuzu...") @@ -431,34 +431,34 @@ if (ENABLE_QT) endif() function(set_yuzu_qt_components) -# Best practice is to ask for all components at once, so they are from the same version -set(YUZU_QT_COMPONENTS2 Core Widgets Concurrent) -if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") -list(APPEND YUZU_QT_COMPONENTS2 DBus) -endif() -if (YUZU_USE_QT_MULTIMEDIA) -list(APPEND YUZU_QT_COMPONENTS2 Multimedia) + # Best practice is to ask for all components at once, so they are from the same version + set(YUZU_QT_COMPONENTS2 Core Widgets Concurrent) + if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + list(APPEND YUZU_QT_COMPONENTS2 DBus) + endif() + if (YUZU_USE_QT_MULTIMEDIA) + list(APPEND YUZU_QT_COMPONENTS2 Multimedia) endif() if (YUZU_USE_QT_WEB_ENGINE) - list(APPEND YUZU_QT_COMPONENTS2 WebEngineCore WebEngineWidgets) + list(APPEND YUZU_QT_COMPONENTS2 WebEngineCore WebEngineWidgets) endif() if (ENABLE_QT_TRANSLATION) - list(APPEND YUZU_QT_COMPONENTS2 LinguistTools) + list(APPEND YUZU_QT_COMPONENTS2 LinguistTools) endif() if (USE_DISCORD_PRESENCE) - list(APPEND YUZU_QT_COMPONENTS2 Network) + list(APPEND YUZU_QT_COMPONENTS2 Network) endif() set(YUZU_QT_COMPONENTS ${YUZU_QT_COMPONENTS2} PARENT_SCOPE) - endfunction(set_yuzu_qt_components) +endfunction(set_yuzu_qt_components) - # List of all FFmpeg components required - set(FFmpeg_COMPONENTS +# List of all FFmpeg components required +set(FFmpeg_COMPONENTS avcodec avfilter avutil swscale) - if (UNIX AND NOT APPLE AND NOT ANDROID) +if (UNIX AND NOT APPLE AND NOT ANDROID) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBVA libva) endif() @@ -468,12 +468,12 @@ if (NOT YUZU_USE_BUNDLED_FFMPEG) endif() if(ENABLE_QT) - set_yuzu_qt_components() - find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS}) - set(QT_MAJOR_VERSION 6) - # Qt6 sets cxx_std_17 and we need to undo that - set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "") - endif() + set_yuzu_qt_components() + find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS}) + set(QT_MAJOR_VERSION 6) + # Qt6 sets cxx_std_17 and we need to undo that + set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "") +endif() if (WIN32 AND YUZU_CRASH_DUMPS) set(BREAKPAD_VER "breakpad-c89f9dd") @@ -517,7 +517,7 @@ endif() set(CLANG_FORMAT_POSTFIX "-15") find_program(CLANG_FORMAT NAMES clang-format${CLANG_FORMAT_POSTFIX} - clang-format + clang-format PATHS ${PROJECT_BINARY_DIR}/externals) # if find_program doesn't find it, try to download from externals if (NOT CLANG_FORMAT) @@ -642,12 +642,12 @@ endif() # https://www.freedesktop.org/software/appstream/docs/ if(ENABLE_QT AND UNIX AND NOT APPLE) install(FILES "dist/org.yuzu_emu.yuzu.desktop" - DESTINATION "share/applications") + DESTINATION "share/applications") install(FILES "dist/eden.svg" - DESTINATION "share/icons/hicolor/scalable/apps" - RENAME "org.yuzu_emu.eden.svg") + DESTINATION "share/icons/hicolor/scalable/apps" + RENAME "org.yuzu_emu.eden.svg") install(FILES "dist/org.yuzu_emu.yuzu.xml" - DESTINATION "share/mime/packages") + DESTINATION "share/mime/packages") install(FILES "dist/org.yuzu_emu.yuzu.metainfo.xml" - DESTINATION "share/metainfo") + DESTINATION "share/metainfo") endif() diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 8517855abc..95a9cd84f5 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -168,7 +168,6 @@ android { "-DENABLE_QT=0", // Don't use QT "-DENABLE_SDL2=0", // Don't use SDL "-DENABLE_WEB_SERVICE=0", // Don't use telemetry - "-DBUNDLE_SPEEX=ON", "-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work "-DYUZU_USE_BUNDLED_VCPKG=ON", "-DYUZU_USE_BUNDLED_FFMPEG=ON", diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 51a4705f52..6ad1d1c1bf 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -29,7 +29,7 @@ SPDX-License-Identifier: GPL-3.0-or-later android:banner="@drawable/tv_banner" android:fullBackupContent="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules_api_31" - android:enableOnBackInvokedCallback="false"> + android:enableOnBackInvokedCallback="true"> @@ -44,6 +44,7 @@ SPDX-License-Identifier: GPL-3.0-or-later + 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 fcc0ae8b99..ddf3cb1fe1 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 @@ -565,11 +565,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { var fpsText = String.format("FPS: %.1f", actualFps) if (enableFrameInterpolation) { - fpsText += ("(Enhanced)") + fpsText += " " + getString(R.string.enhanced_fps_suffix) } if (enableFrameSkipping) { - fpsText += " [Skipping]" + fpsText += " " + getString(R.string.skipping_fps_suffix) } sb.append(fpsText) diff --git a/src/android/app/src/main/res/layout/header_in_game.xml b/src/android/app/src/main/res/layout/header_in_game.xml index 7e75c624c8..32aa84ebfe 100644 --- a/src/android/app/src/main/res/layout/header_in_game.xml +++ b/src/android/app/src/main/res/layout/header_in_game.xml @@ -30,7 +30,7 @@ android:textColor="?attr/colorOnSurfaceVariant" android:textAlignment="viewStart" android:layout_marginEnd="4dp" - android:text="System Info:" /> + android:text="@string/system_info_label" /> لم يتم منح إذن الإشعار + (مُحسَّن) + (تخطي) + النظام: عرض إحصائيات الأداء تخصيص الرؤية @@ -19,9 +22,9 @@ عرض السرعة عرض نسبة سرعة المحاكاة عرض استخدام ذاكرة التطبيق - عرض كمية الذاكرة المستخدمة من قبل المحاكي + عرض كمية ذاكرة الوصول العشوائي التي يستخدمها المحاكي عرض استخدام ذاكرة النظام - عرض كمية الذاكرة المستخدمة من قبل النظام + عرض كمية ذاكرة الوصول العشوائي المستخدمة من قبل النظام عرض درجة حرارة البطارية عرض درجة حرارة البطارية الحالية موضع العرض @@ -49,7 +52,7 @@ EDS3 + VertexInputDynamicState يحسن الأداء على الأجهزة الأحدث. مدعوم فقط على وحدات معالجة الرسومات التي تدعم فولكان 1.3+. مزامنة سرعة النواة - قم بمزامنة سرعة النواة مع النسبة المئوية القصوى للسرعة لتحسين الأداء دون تغيير السرعة الفعلية للعبة. + مزامنة سرعة النواة مع النسبة القصوى للسرعة لتحسين الأداء دون تغيير السرعة الفعلية للعبة. استخدام الستاب التلقائي يقوم تلقائيًا بإضافة خدمات ووظائف ناقصة. قد يحسن التوافق ولكنه قد يتسبب في تعطل المشغل ومشاكل في الاستقرار. إزالة البرنامج الثابت @@ -86,8 +89,9 @@ خلفية Shader اختيار طريقة ترجمة Shaders - GLSL - SPIR-V + عام + Mali + Adreno/Xclipse محاكاة NVDEC @@ -373,7 +377,7 @@ تناسب الابعاد طريقة مكافحة التعرج استخدم تظليل غير متزامن - يجمع التظليل بشكل غير متزامن، مما يقلل من التأتأة ولكنه قد يؤدي إلى حدوث بعض الأخطاء. + تجميع الظلال بشكل غير متزامن. قد يقلل هذا من التقطع ولكنه قد يتسبب أيضًا في حدوث أخطاء. استخدم التنظيف التفاعلي تحسين دقة العرض في بعض الألعاب على حساب الأداء يقلل من التأتأة عن طريق تخزين وتحميل التظليلات التي تم إنشاؤها محليًا. 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 b82b3f56b1..a96132bfbb 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -7,6 +7,9 @@ مۆڵەتی ئاگادارکردنەوە نەدراوە! + (پێشکەوتوو) + (بازدان) + سیستەم: پیشاندانی ستاتیستی کارایی خۆڕێکخستن دیاربوون @@ -20,9 +23,9 @@ نیشاندانی خێرایی نیشاندانی خێرایی ئیمولەیشن بە ڕێژە نیشاندانی بەکارهێنانی RAMی ئەپ - نیشاندانی بەکارهێنانی RAM لەلایەن ئیمولەیتەر + نیشاندانی بڕی RAM کە ئێمولاتۆر بەکاردەهێنێت نیشاندانی بەکارهێنانی RAMی سیستەم - نیشاندانی بەکارهێنانی RAM لەلایەن سیستەم + نیشاندانی بڕی RAM کە سیستم بەکاردەهێنێت نیشاندانی پلەی گەرمی بەتری نیشاندانی پلەی گەرمی بەتری بە سەدی و فارینهایت شوێنی ئاوێرە @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState يحسن الأداء على الأجهزة الأحدث. مدعوم فقط على وحدات معالجة الرسومات التي تدعم فولكان 1.3+. مزامنة سرعة النواة - قم بمزامنة سرعة النواة مع النسبة المئوية القصوى للسرعة لتحسين الأداء دون تغيير السرعة الفعلية للعبة. + خێرایی تیکەکانی ناوک ڕێکبخە لەگەڵ ڕێژەی خێرایی بەرزترین بۆ باشترکردنی کارایی بەبێ گۆڕینی خێرایی ڕاستەقینەی یارییەکە. استخدام الستاب التلقائي يقوم تلقائيًا بإضافة خدمات ووظائف ناقصة. قد يحسن التوافق ولكنه قد يتسبب في تعطل المشغل ومشاكل في الاستقرار. إزالة البرنامج الثابت @@ -87,8 +90,9 @@ شادەر باکند هەڵبژاردنی ڕێگای پێکهێنانی شادەر - GLSL - SPIR-V + گشتی + Mali + Adreno/Xclipse ئیمولەیشنی NVDEC @@ -328,7 +332,7 @@ ناچاریکردن بۆ زۆرترین کاتژمێر (تەنها ئەدرینۆ) GPU ناچار دەکات بە زۆرترین کاتژمێر کاربکات (هێشتا سنووردارکردنی گەرمی جێبەجێ دەکرێت). بەکارهێنانی سێبەری ناهاوسەنگ - سێبەرەکان بە شێوەیەکی ناهاوسەنگ کۆدەکاتەوە، پچڕپچڕی کەمدەکاتەوە بەڵام لەوانەیە گلێچ دروستکا. + کۆمپایلکردنی شادەرەکان بەشێوەی ناڕێک. ئەمە ڕەنگە کەمکردنەوەی ستەتەر بکات بەڵام لەوانەیە هەڵەش دروست بکات. بەکارهێنانی بەرپێچدەرەوە وردی ڕێندەرکردن لە هەندێک یاریدا باشتر دەکات لەسەر تێچووی کارایی. بیرگەخێرای سێبەری دیسک 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 9cdbf53d32..76ef57a906 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -6,6 +6,9 @@ Oznámení nejsou oprávněna! + (Vylepšený) + (Přeskakování) + Systém: Zobrazit překryv statistik výkonu Přizpůsobení Viditelnost @@ -19,9 +22,9 @@ Zobrazit rychlost Aktuální rychlost emulace v procentech Zobrazit využití RAM aplikace - Množství RAM používané emulátorem + Zobrazit množství RAM, které emulátor používá Zobrazit využití systémové RAM - Množství RAM používané systémem + Zobrazit množství RAM využívané systémem Zobrazit teplotu baterie Aktuální teplota baterie ve °C a °F Pozice překryvu @@ -49,7 +52,7 @@ EDS3 + VertexInputDynamicState Zlepšuje výkon na novějších zařízeních. Podporováno pouze na GPU s Vulkan 1.3+. Synchronizovat rychlost jádra - Synchronizuje rychlost jádra s maximální procentuální rychlostí pro lepší výkon bez změny skutečné rychlosti hry. + Synchronizuje rychlost jádra s maximálním procentem rychlosti, aby se zlepšil výkon bez změny skutečné rychlosti hry. Použít automatický stub Automaticky doplňuje chybějící služby a funkce. Může zlepšit kompatibilitu, ale také způsobit pády a problémy se stabilitou. Odinstalovat firmware @@ -86,8 +89,9 @@ Backend shaderů Způsob kompilace shaderů - GLSL - SPIR-V + Univerzální + Mali + Adreno/Xclipse Emulace NVDEC @@ -292,16 +296,43 @@ Omezit rychlost - CPU přesnost + Omezení emulační rychlosti + Procento omezení + Procento normální rychlosti + CPU backend + Přesnost CPU + %1$s%2$s + Název zařízení + Docked režim + Větší rozlišení, menší výkon Emulovaná oblast Emulovaný jazyk + Vybrat datum RTC + Vybrat čas RTC Vlastní RTC + Vlastní nastavení času + Nastavit vlastní RTC Úroveň přesnosti + Rozlišení (Handheld/Docked) VSync režim Orientace Poměr stran + Filtr přizpůsobení + Ostrost FSR + Nastavení ostrosti pro FSR + Anti-aliasing + Maximální takt (Adreno) + Maximální výkon GPU + Asynchronní shadery + Kompiluje stínovače asynchronně. Může to snížit trhání, ale také způsobit grafické chyby. + Reaktivní flushing + Zlepšení přesnosti vykreslování + Shader cache na disku + Snížení trhání ukládáním shaderů + Anizotropní filtrování + Zlepšení kvality textur CPU 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 872df8ad80..805db9adcc 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -7,6 +7,9 @@ Berechtigung für Benachrichtigungen nicht erlaubt! + (Enhanced) + (Skipping) + System: Leistungsstatistik Overlay anzeigen Anpassung Sichtbarkeit @@ -20,9 +23,9 @@ Geschwindigkeit anzeigen Emulationsgeschwindigkeit in Prozent App-RAM-Nutzung anzeigen - RAM-Nutzung durch den Emulator + Zeigt den RAM-Verbrauch des Emulators an System-RAM-Nutzung anzeigen - RAM-Nutzung durch das System + Zeigt den vom System genutzten RAM an Batterietemperatur anzeigen Aktuelle Batterietemperatur in °C/°F Overlay-Position @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Verbessert die Leistung auf neueren Geräten. Wird nur von GPUs mit Vulkan 1.3+ unterstützt. Kern-Geschwindigkeit synchronisieren - Synchronisiert die Kern-Taktgeschwindigkeit mit der maximalen Geschwindigkeit, um die Leistung zu verbessern, ohne die tatsächliche Spielgeschwindigkeit zu ändern. + Synchronisiert die Taktrate des Kerns mit der maximalen Geschwindigkeit, um die Leistung zu verbessern, ohne die tatsächliche Spielgeschwindigkeit zu verändern. Auto-Stub verwenden Ergänzt automatisch fehlende Dienste und Funktionen. Kann die Kompatibilität verbessern, aber auch zu Abstürzen und Stabilitätsproblemen führen. Firmware deinstallieren @@ -87,8 +90,9 @@ Shader-Backend Methode zur Shader-Kompilierung - GLSL - SPIR-V + Universal + Mali + Adreno/Xclipse NVDEC-Emulation @@ -343,15 +347,24 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Benutzerdefinierte Echtzeituhr Genauigkeitsstufe - Auflösung (Mobil/Gedockt) + Auflösung (Handheld/Gedockt) VSync-Modus - Orientierung + Ausrichtung Seitenverhältnis - Fensteranpassungsfilter + Skalierungsfilter + FSR-Schärfe + Bestimmt die Schärfe bei FSR-Nutzung. Kantenglättung Maximale Taktfrequenz erzwingen (nur Adreno) - Erzwingt den Betrieb der GPU mit der maximal möglichen Taktfrequenz (Temperaturbeschränkungen werden weiterhin angewendet). - Asynchrone Shader nutzen + Erzwingt maximale GPU-Taktfrequenz. + Asynchrone Shader + Kompiliert Shader asynchron. Dies kann Ruckler reduzieren, aber auch Grafikfehler verursachen. + Reaktives Flushing + Verbessert die Genauigkeit in einigen Spielen. + Shader-Cache auf Festplatte + Reduziert Ruckler durch Shader-Caching. + Anisotrope Filterung + Verbessert die Texturenqualität. CPU CPU Debugging 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 2305234df3..5137b04d18 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -7,6 +7,9 @@ ¡Permisos de notificación no concedidos! + (Mejorado) + (Saltando) + Sistema: Mostrar superposición de estadísticas de rendimiento Personalización Visibilidad @@ -20,9 +23,9 @@ Mostrar velocidad Mostrar porcentaje de velocidad de emulación Mostrar uso de RAM de la app - Mostrar RAM utilizada por el emulador + Mostrar la cantidad de RAM que utiliza el emulador Mostrar uso de RAM del sistema - Mostrar RAM utilizada por el sistema + Mostrar la cantidad de RAM utilizada por el sistema Mostrar temperatura de batería Mostrar temperatura en Celsius y Fahrenheit Posición de la superposición @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Mejora el rendimiento en dispositivos nuevos. Solo compatible con GPUs Vulkan 1.3+. Sincronizar velocidad del núcleo - Sincroniza la velocidad del núcleo con el porcentaje máximo para mejorar el rendimiento sin alterar la velocidad real del juego. + Sincroniza la velocidad del núcleo con el porcentaje máximo de velocidad para mejorar el rendimiento sin alterar la velocidad real del juego. Usar Auto Stub Rellena automáticamente servicios y funciones faltantes. Puede mejorar compatibilidad pero causar cierres inesperados. Desinstalar firmware @@ -87,8 +90,9 @@ Backend de shaders Elegir cómo se compilan shaders - GLSL - SPIR-V + Universal + Mali + Adreno/Xclipse Emulación NVDEC @@ -408,7 +412,7 @@ Forzar velocidad al máximo (solo Adreno) Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas). Usar shaders asíncronos - Compila shaders de manera asíncrona, reduce los parones pero puede introducir fallos. + Compila los shaders de forma asíncrona. Esto puede reducir los tirones, pero también puede introducir errores gráficos. Usar limpieza reactiva Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento. Caché de shaders en disco 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 6cf7b35bf5..9513e16bc0 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -7,6 +7,9 @@ مجوز اعلان داده نشده! + (بهبودیافته) + (رد کردن) + سیستم: نمایش آمار عملکرد سفارشی‌سازی نمایش @@ -20,9 +23,9 @@ نمایش سرعت نمایش درصد سرعت شبیه‌سازی نمایش مصرف رم برنامه - نمایش میزان رم استفاده‌شده توسط شبیه‌ساز + نمایش میزان رم مورد استفاده شبیه‌ساز نمایش مصرف رم سیستم - نمایش میزان رم استفاده‌شده توسط سیستم + نمایش میزان رم استفاده شده توسط سیستم نمایش دمای باتری نمایش دمای باتری به سانتی‌گراد و فارنهایت موقعیت اورلی @@ -50,7 +53,7 @@ EDS3 + حالت پویای ورودی رأس عملکرد را در دستگاه‌های جدیدتر بهبود می‌بخشد. فقط در کارت‌های گرافیک با پشتیبانی از ولکان 1.3+ قابل استفاده است همگام‌سازی سرعت هسته - سرعت تیک هسته را با حداکثر درصد سرعت همگام می‌کند تا عملکرد بهبود یابد بدون آنکه سرعت واقعی بازی تغییر کند + همگام‌سازی سرعت هسته با حداکثر درصد سرعت برای بهبود عملکرد بدون تغییر سرعت واقعی بازی. استفاده از استاب خودکار به طور خودکار سرویس‌ها و توابع از دست رفته را استاب می‌کند. این ممکن است سازگاری را بهبود بخشد اما می‌تواند باعث کرش و مشکلات پایداری شود حذف فرمور @@ -87,8 +90,9 @@ بک‌اند شیدر انتخاب روش کامپایل و ترجمه شیدرها - GLSL - SPIR-V + همه‌کاره + Mali + Adreno/Xclipse شبیه‌سازی NVDEC @@ -408,7 +412,7 @@ اجبار به حداکثر فرکانس (فقط برای Adreno) پردازنده گرافیکی را مجبور می‌کند تا با بیشترین فرکانس کار کند (محدودیت‌های حرارتی همچنان اعمال خواهند شد). استفاده از سایه‌زن‌های ناهمزمان - سایه‌زن‌ها را به صورت ناهمزمان کامپایل می کند، لکنت را کاهش می‌دهد اما ممکن است اشکالاتی ایجاد کند. + کامپایل شیدرها به صورت ناهمزمان. این ممکن است باعث کاهش مکث شود اما ممکن است مشکلات گرافیکی نیز ایجاد کند. استفاده از فلاش کردن واکنشی دقت تفسیر تصاویر را در برخی از بازی‌ها به قیمت عملکرد بهبود می‌بخشد. ذخیره سایه‌زنی‌ها در حافظه 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 f13945e77a..7eeaebc7b7 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -7,6 +7,9 @@ Permission de notification non accordée ! + (Amélioré) + (Saut) + Système: Afficher les stats de performance Personnalisation Visibilité @@ -20,9 +23,9 @@ Afficher vitesse Afficher la vitesse d`émulation RAM app - Afficher la RAM utilisée par l`émulateur + Afficher la quantité de RAM utilisée par l\'émulateur RAM système - Afficher la RAM système utilisée + Afficher la quantité de RAM utilisée par le système Temp. batterie Afficher la température de la batterie Position overlay @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Améliore les performances sur les appareils récents. Pris en charge uniquement par les GPU Vulkan 1.3+. Synchroniser la vitesse du cœur - Synchronise la vitesse de base avec le pourcentage de vitesse maximal pour améliorer les performances sans altérer la vitesse réelle du jeu. + 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. Utiliser le stub automatique Comble automatiquement les services et fonctions manquants. Peut améliorer la compatibilité mais peut provoquer des plantages et des problèmes de stabilité. Désinstaller le firmware @@ -87,8 +90,9 @@ Backend shader Méthode de compilation - GLSL - SPIR-V + Universel + Mali + Adreno/Xclipse Émulation NVDEC @@ -410,7 +414,7 @@ Forcer les fréquences maximales (Adreno uniquement) Forcer le GPU à fonctionner à ses fréquences maximales possibles (les contraintes thermiques seront toujours appliquées). Utiliser les shaders asynchrones - Compile les shaders de manière asynchrone, réduisant les saccades mais pouvant entraîner des problèmes visuels. + Compile les shaders de manière asynchrone. Cela peut réduire les saccades mais peut aussi provoquer des problèmes graphiques. Utiliser le vidage réactif Améliore la précision du rendu dans certains jeux au détriment des performances. Utiliser les shader cache 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 3b6a09266d..7437db4f9f 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -7,6 +7,9 @@ הרשאות התראות לא ניתנה! + (משופר) + (דילוג) + מערכת: הצג סטטיסטיקות ביצועים התאמה אישית נראות @@ -20,9 +23,9 @@ הצג מהירות מציג את אחוז מהירות האמולציה הצג שימוש זיכרון - מציג את כמות הזיכרון בשימוש על ידי האמולטור + הצג את כמות ה-RAM שהאמולטור משתמש בה הצג שימוש זיכרון מערכת - מציג את כמות הזיכרון בשימוש על ידי המערכת + הצג את כמות ה-RAM שבה המערכת משתמשת הצג טמפרטורת סוללה מציג טמפרטורת סוללה במעלות צלזיוס ופרנהייט מיקום שכבה @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState משפר ביצועים במכשירים חדשים יותר. נתמך רק בכרטיסי מסך עם Vulkan 1.3+. סנכרון מהירות ליבה - מסנכרן את מהירות הליבה לאחוז המהירות המקסימלי כדי לשפר ביצועים ללא שינוי במהירות המשחק בפועל. + סנכרן את מהירות הליבה לאחוז המהירות המרבי כדי לשפר ביצועים מבלי לשנות את מהירות המשחק בפועל. שימוש ב-Auto Stub משלים אוטומטית שירותים ופונקציות חסרים. עשוי לשפר תאימות אך עלול לגרום לקריסות ובעיות יציבות. הסרת קושחה @@ -87,8 +90,9 @@ מנוע שיידרים בחר כיצד לקמפל שיידרים - GLSL - SPIR-V + אוניברסלי + Mali + Adreno/Xclipse אמולציית NVDEC @@ -391,7 +395,7 @@ החזק מהירות שעון מקסימלית (רק ל Adreno) מכריח לדחוף את מהירויות המעבד הגרפי למקסימום (הגבלות חום ימשיכו לתפקד). השתמש בשיידרים אסינכרונים - מקמפל שיידרים בצורה אסנכרונית, מפחית תקיעות אך עלול לגרום לבעיות גרפיות. + מקמפל שיידרים באופן אסינכרוני. זה עשוי להפחית קפיצות אך גם עלול לגרום לתקלות גרפיות. השתמש בהבהוב תגובתי משפר את הדיוק של האמולציה במשחקים מסויימים במחיר של ביצועים. מטמון השיידר של הדיסק 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 bab82f1fa5..9fb6f6321d 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -7,6 +7,9 @@ Nincs engedély az értesítés megjelenítéséhez! + (Továbbfejlesztett) + (Kihagyás) + Rendszer: Teljesítmény statisztikák megjelenítése Testreszabás Láthatóság @@ -20,9 +23,9 @@ Sebesség mutatása Emulációs sebesség százalékban Alkalmazás RAM-használat - Az emulátor által használt RAM + Az emulátor által használt RAM mennyiségének megjelenítése Rendszer RAM-használat - A rendszer által használt RAM + A rendszer által használt RAM mennyiségének megjelenítése Akkumulátor hőmérséklet Aktuális hőmérséklet Celsiusban és Fahrenheitben Overlay pozíció @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Javítja a teljesítményt újabb eszközökön. Csak Vulkan 1.3+ GPU-kon támogatott. Magsebesség szinkronizálása - Szinkronizálja a magsebességet a maximális sebesség százalékához a teljesítmény javításához anélkül, hogy megváltoztatná a játék tényleges sebességét. + 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. Automatikus Stub használata Automatusan kiegészíti a hiányzó szolgáltatásokat és funkciókat. Növelheti a kompatibilitást, de összeomlásokat és stabilitási problémákat okozhat. Firmware eltávolítása @@ -87,8 +90,9 @@ Shader backend Shaderek fordításának módja - GLSL - SPIR-V + Univerzális + Mali + Adreno/Xclipse NVDEC emuláció @@ -404,7 +408,7 @@ Maximum órajel kényszerítése (csak Adreno) Kényszeríti a GPU-t a lehető legnagyobb órajelen működésre (a hőmérséklet korlátozások továbbra is érvényben maradnak). Aszinkron árnyékolók használata - Aszinkron módon fordítja az árnyékolókat, ami csökkenti az akadozást, de hibákat okozhat. + A shaderek aszinkron fordítása. Csökkentheti a belassulásokat, de hibákat is okozhat. Reaktív ürítés használata Javítja a renderelési pontosságot néhány játékban a teljesítmény rovására. Lemez árnyékoló gyorsítótár 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 b2442010c8..4c8a969e5d 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -7,6 +7,9 @@ Izin notifikasi tidak diberikan! + (Ditingkatkan) + (Melewatkan) + Sistem: Tampilkan Overlay Statistik Performa Kustomisasi Visibilitas @@ -20,7 +23,7 @@ Tampilkan Kecepatan Tampilkan persentase kecepatan emulasi saat ini Tampilkan Penggunaan RAM Aplikasi - Tampilkan jumlah RAM yang digunakan oleh emulator + Tampilkan jumlah RAM yang digunakan emulator Tampilkan Penggunaan RAM Sistem Tampilkan jumlah RAM yang digunakan oleh sistem Tampilkan Suhu Baterai @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Meningkatkan performa di perangkat baru. Hanya didukung di GPU Vulkan 1.3+. Sinkronisasi Kecepatan Inti - Sinkronkan kecepatan inti ke persentase kecepatan maksimum untuk meningkatkan performa tanpa mengubah kecepatan aktual game. + Sinkronkan kecepatan inti dengan persentase kecepatan maksimum untuk meningkatkan performa tanpa mengubah kecepatan sebenarnya dari permainan. Gunakan Auto Stub Otomatis menyediakan layanan dan fungsi yang hilang. Dapat meningkatkan kompatibilitas tetapi mungkin menyebabkan crash dan masalah stabilitas. Copot Firmware @@ -87,8 +90,9 @@ Backend Shader Pilih cara shader dikompilasi dan diterjemahkan untuk GPU Anda. - GLSL - SPIR-V + Universal + Mali + Adreno/Xclipse Emulasi NVDEC @@ -404,7 +408,7 @@ Paksa jam maximum (hanya untuk Adreno) Memaksa GPU untuk berjalan pada kecepatan maksimum yang mungkin (batasan termal masih akan diterapkan). Gunakan shader asinkron - Mengompilasi shader secara asinkron mengurangi Tutup Paksa tetapi dapat menimbulkan gangguan. + Kompilasi shader secara asinkron. Ini dapat mengurangi lag tetapi juga dapat menyebabkan glitch. Gunakan reactive flushing Meningkatkan akurasi rendering dalam beberapa permainan dengan mengorbankan performa. Cache shader disk 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 bcd6c3ae4f..69a55c7a06 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -7,6 +7,9 @@ Autorizzazione di notifica non concessa! + (Migliorato) + (Salto) + Sistema: Mostra overlay prestazioni Personalizzazione Visibilità @@ -20,9 +23,9 @@ Mostra velocità Mostra percentuale velocità emulazione Mostra RAM app - Mostra RAM usata dall`emulatore + Mostra la quantità di RAM utilizzata dall\'emulatore Mostra RAM sistema - Mostra RAM usata dal sistema + Mostra la quantità di RAM utilizzata dal sistema Mostra temperatura batteria Mostra temperatura batteria in °C e °F Posizione overlay @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Migliora le prestazioni sui dispositivi più recenti. Supportato solo su GPU Vulkan 1.3+. Sincronizza velocità core - Sincronizza la velocità del core alla percentuale massima per migliorare le prestazioni senza alterare la velocità effettiva del gioco. + Sincronizza la velocità del core con la percentuale massima di velocità per migliorare le prestazioni senza alterare la velocità effettiva del gioco. Usa Auto Stub Aggiunge automaticamente servizi e funzioni mancanti. Può migliorare la compatibilità ma causare crash e problemi di stabilità. Disinstalla firmware @@ -87,8 +90,9 @@ Backend shader Scegli come compilare gli shader - GLSL - SPIR-V + Universale + Mali + Adreno/Xclipse Emulazione NVDEC @@ -394,7 +398,7 @@ Forza clock massimi (solo Adreno) Forza la GPU a girare col massimo clock possibile (i vincoli alla temperatura saranno comunque applicati) Usa shaders asincrone - Compila le shader in modo asincrone, riducendo lo stutter. Può causare glitch grafici. + Compila gli shader in modo asincrono. Può ridurre gli scatti, ma può anche causare glitch grafici. Abilita il Reactive Flushing Migliora l\'accuratezza della grafica in alcuni giochi, al costo delle performance. Usa la cache delle shader 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 3ab0e79c10..8314382285 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -7,6 +7,9 @@ 通知が許可されていません! + (強化) + (スキップ) + システム: パフォーマンス統計オーバーレイを表示 カスタマイズ 表示項目 @@ -20,9 +23,9 @@ 速度表示 現在のエミュレーション速度を表示 アプリRAM使用量 - エミュレータのRAM使用量を表示 + エミュレーターが使用しているRAMの量を表示 システムRAM使用量 - システムのRAM使用量を表示 + システムが使用しているRAMの量を表示 バッテリー温度 バッテリー温度を表示(℃/℉) オーバーレイ位置 @@ -50,7 +53,7 @@ EDS3 + 頂点入力動的状態 新しいデバイスでパフォーマンスを向上させます。Vulkan 1.3+ GPUでのみサポートされています。 コア速度の同期 - コアの動作速度を最大速度パーセンテージに同期させ、ゲームの実際の速度を変更することなくパフォーマンスを向上させます。 + コアの速度を最大速度パーセンテージに同期させ、ゲームの実際の速度を変えずにパフォーマンスを向上させます。 自動スタブを使用 不足しているサービスや機能を自動的にスタブします。互換性が向上する可能性がありますが、クラッシュや安定性の問題を引き起こす可能性があります。 ファームウェアをアンインストール @@ -87,8 +90,9 @@ シェーダーバックエンド シェーダーのコンパイル方法 - GLSL - SPIR-V + ユニバーサル + Mali + Adreno/Xclipse NVDECエミュレーション @@ -356,7 +360,7 @@ 最大クロックを強制 (Adrenoのみ) GPUを最大限可能な周波数で動作させます (過熱制限は引き続き適用されます)。 非同期シェーダー - シェーダーを非同期でコンパイルします。コマ落ちが軽減されますが、不具合が発生する可能性があります。 + シェーダーを非同期でコンパイルします。これによりカクつきが減る可能性がありますが、グラフィックの不具合が発生する場合もあります。 即時書き込み 一部のゲームにおいて、パフォーマンスを犠牲にしながらも、レンダリング精度を向上させます。 ディスクシェーダーキャッシュ 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 54df91f2a7..ede1e59d92 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -7,6 +7,9 @@ 알림 권한이 부여되지 않았습니다! + (향상됨) + (건너뜀) + 시스템: 성능 통계 오버레이 표시 사용자 지정 표시 항목 @@ -50,7 +53,7 @@ EDS3 + 정점 입력 동적 상태 최신 기기에서 성능을 향상시킵니다. Vulkan 1.3+ GPU에서만 지원됩니다. 코어 속도 동기화 - 코어 틱 속도를 최대 속도 백분율로 동기화하여 게임의 실제 속도를 변경하지 않고 성능을 개선합니다. + 코어 틱 속도를 최대 속도 백분율과 동기화하여 게임의 실제 속도를 변경하지 않고 성능을 향상시킵니다. 자동 스텁 사용 누락된 서비스와 기능을 자동으로 스텁합니다. 호환성을 개선할 수 있지만 충돌과 안정성 문제를 일으킬 수 있습니다. 펌웨어 제거 @@ -87,9 +90,9 @@ 셰이더 백엔드 셰이더 컴파일 방식 선택 - GLSL - SPIR-V - + 범용 + Mali + Adreno/Xclipse NVDEC 에뮬레이션 비디오 디코딩 처리 방식 선택 @@ -402,7 +405,7 @@ 최대 클럭 강제 설정 (아드레노 전용) GPU가 가능한 최대 클럭으로 실행되도록 강제합니다 (열 제약 조건은 여전히 적용됩니다). 비동기 셰이더 사용 - 셰이더를 비동기식으로 컴파일하여 끊김 현상을 줄이지만 글리치가 발생할 수 있습니다. + 셰이더를 비동기적으로 컴파일합니다. 이로 인해 끊김 현상이 줄어들 수 있지만 그래픽 오류가 발생할 수도 있습니다. 반응형 플러싱 사용 일부 게임에서 성능 저하를 감수하고 렌더링 정확도를 향상합니다. 디스크 셰이더 캐시 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 1852e4c55c..22792fb302 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -7,6 +7,9 @@ Varslingstillatelse ikke gitt! + (Forbedret) + (Hopp) + System: Vis ytelsesstatistikkoverlay Tilpasning Synlighet @@ -20,9 +23,9 @@ Vis hastighet Vis emuleringshastighet i prosent Vis appminnebruk - Vis RAM-bruk av emulatoren + Vis hvor mye RAM emulatoren bruker Vis systemminnebruk - Vis systemets RAM-bruk + Vis hvor mye RAM systemet bruker Vis batteritemperatur Vis batteritemperatur i Celsius og Fahrenheit Overlayposisjon @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Forbedrer ytelsen på nyere enheter. Støttes kun på Vulkan 1.3+ GPU-er. Synkroniser kjernespeed - Synkroniser kjernetaktfrekvensen til maksimal hastighetsprosent for å forbedre ytelsen uten å endre spillets faktiske hastighet. + Synkroniser kjernens hastighet med maksimal hastighetsprosent for å forbedre ytelsen uten å endre spillets faktiske hastighet. Bruk Auto Stub Automatisk stubber manglende tjenester og funksjoner. Kan forbedre kompatibilitet, men kan forårsake krasj og stabilitetsproblemer. Avinstaller firmware @@ -87,8 +90,9 @@ Shader-backend Velg hvordan shadere kompileres - GLSL - SPIR-V + Universell + Mali + Adreno/Xclipse NVDEC-emulering @@ -328,7 +332,7 @@ Tving fram maksimal klokkefrekvens (kun Adreno) Tvinger GPU-en til å kjøre med maksimal klokkefrekvens (termiske begrensninger vil fortsatt gjelde). Bruk asynkrone shaders - Kompilerer shaders asynkront, noe som reduserer hakking, men kan føre til feil. + Kompilerer shadere asynkront. Dette kan redusere rykk, men kan også forårsake grafiske feil. Bruk reaktiv spyling Forbedrer gjengivelsesnøyaktigheten i enkelte spill på bekostning av ytelsen. Disk shader-hurtigbuffer 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 679ca30114..55702b21ce 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -7,6 +7,9 @@ Nie zezwolono na powiadomienia! + (Ulepszony) + (Pomijanie) + System: Pokaż nakładkę statystyk wydajności Dostosowanie Widoczność @@ -20,9 +23,9 @@ Pokaż prędkość Wyświetla procentową prędkość emulacji Pokaż użycie RAM aplikacji - Wyświetla ilość RAM używanego przez emulator + Wyświetl ilość pamięci RAM używanej przez emulator Pokaż użycie RAM systemu - Wyświetla ilość RAM używanego przez system + Wyświetl ilość pamięci RAM używanej przez system Pokaż temperaturę baterii Wyświetla temperaturę baterii w °C i °F Pozycja nakładki @@ -87,8 +90,9 @@ Backend shaderów Wybierz metodę kompilacji shaderów. - GLSL - SPIR-V + Uniwersalny + Mali + Adreno/Xclipse Emulacja NVDEC @@ -328,7 +332,7 @@ Maksymalne taktowanie GPU (układy Adreno) Wymusza uruchomienie maksymalnego taktowania układu graficznego (zabezpieczenia termiczne będą dalej aktywne). Wyłącz synchronizację shaderów - Kompiluj oświetlenie bez synchronizacji, poprawi wydajność ale może powodować błędy. + Kompiluje shadery asynchronicznie. Może to zmniejszyć zacinanie, ale może też powodować błędy graficzne. Użyj spłukiwania reaktywnego - reactive flushing Poprawia jakość renderowania w kilku grach, kosztem wydajności. Pamięć podręczna shaderów 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 bf24f1b367..8ea90ceb61 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 @@ -7,6 +7,9 @@ Acesso às notificações não concedido! + (Aprimorado) + (Pular) + Sistema: Mostrar sobreposição de estatísticas de desempenho Personalização Visibilidade @@ -20,9 +23,9 @@ Mostrar velocidade Exibir porcentagem de velocidade de emulação Mostrar uso de RAM do app - Exibir quantidade de RAM usada pelo emulador + Mostrar a quantidade de RAM que o emulador está usando Mostrar uso de RAM do sistema - Exibir quantidade de RAM usada pelo sistema + Mostrar a quantidade de RAM usada pelo sistema Mostrar temperatura da bateria Exibir temperatura da bateria em Celsius e Fahrenheit Posição da sobreposição @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Melhora desempenho em dispositivos mais novos. Suportado apenas em GPUs Vulkan 1.3+. Sincronizar velocidade do núcleo - Sincroniza a velocidade do núcleo com a porcentagem máxima para melhorar desempenho sem alterar a velocidade real do jogo. + Sincroniza a velocidade do núcleo com a porcentagem máxima de velocidade para melhorar o desempenho sem alterar a velocidade real do jogo. Usar Auto Stub Preenche automaticamente serviços e funções ausentes. Pode melhorar compatibilidade mas causar crashes e problemas de estabilidade. Desinstalar firmware @@ -87,8 +90,9 @@ Backend de shader Define como shaders são compilados - GLSL - SPIR-V + Universal + Mali + Adreno/Xclipse Emulação NVDEC @@ -410,7 +414,7 @@ Forçar velocidade máxima (somente Adreno) Força a GPU a rodar na velocidade máxima (restrições térmicas serão aplicadas) Usar shaders assíncronos - Compila os shaders de forma assíncrona, reduzindo engasgos, mas pode apresentar problemas. + Compila shaders de forma assíncrona. Isso pode reduzir engasgos, mas também pode introduzir falhas gráficas. Usar flushing reativo Melhora a precisão da renderização em alguns jogos ao custo de desempenho. Cache de shaders em disco 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 3f3f840e0f..2006f4201a 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 @@ -7,6 +7,9 @@ Permissões de notificação não permitidas + (Melhorado) + (Saltar) + Sistema: Mostrar Overlay de Desempenho Personalização Visibilidade @@ -20,9 +23,9 @@ Mostrar Velocidade Exibir percentual de velocidade Mostrar RAM do App - Exibir uso de RAM pelo emulador + Mostrar a quantidade de RAM que o emulador está a utilizar Mostrar RAM do Sistema - Exibir uso de RAM pelo sistema + Mostrar a quantidade de RAM utilizada pelo sistema Mostrar Temp. Bateria Exibir temperatura em Celsius/Fahrenheit Posição do Overlay @@ -50,7 +53,7 @@ EDS3 + VertexInputDynamicState Melhora o desempenho em dispositivos mais recentes. Suportado apenas em GPUs Vulkan 1.3+. Sincronizar velocidade do núcleo - Sincroniza a velocidade do núcleo com a percentagem máxima para melhorar o desempenho sem alterar a velocidade real do jogo. + Sincroniza a velocidade do núcleo com a percentagem máxima de velocidade para melhorar o desempenho sem alterar a velocidade real do jogo. Usar Auto Stub Preenche automaticamente serviços e funções em falta. Pode melhorar a compatibilidade mas causar crashes e problemas de estabilidade. Desinstalar firmware @@ -87,8 +90,9 @@ Backend de Shader Método de compilação de shaders. - GLSL - SPIR-V + Universal + Mali + Adreno/Xclipse Emulação NVDEC @@ -410,7 +414,7 @@ Força velocidade máxima (Adreno only) Força o GPU a correr à velocidade máxima (restrições térmicas serão aplicadas) Usa shaders assíncronos - Compila os shaders de forma assíncrona, reduzindo travamentos, mas pode apresentar problemas. + Compila shaders de forma assíncrona. Isto pode reduzir engasgadelas, mas também pode introduzir falhas gráficas. Usar flushing reativo Melhora a precisão da renderização em alguns jogos ao custo de desempenho. Cache de shaders em disco 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 f7e5487e8f..b16dce419c 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -7,6 +7,9 @@ Вы не предоставили разрешение на уведомления! + (Улучшенный) + (Пропуск) + Система: Показать оверлей статистики Настройки Видимость @@ -20,9 +23,9 @@ Показать скорость Текущая скорость эмуляции в % Показать RAM эмулятора - Использование RAM эмулятором + Показать объем оперативной памяти, используемой эмулятором Показать RAM системы - Использование RAM системой + Показать объем оперативной памяти, используемой системой Показать температуру батареи Текущая температура батареи (°C/°F) Позиция оверлея @@ -50,7 +53,7 @@ EDS3 + Динамическое состояние ввода вершин Улучшает производительность на новых устройствах. Поддерживается только GPU с Vulkan 1.3+. Синхронизация скорости ядра - Синхронизирует скорость тактов ядра с максимальным процентом скорости для повышения производительности без изменения фактической скорости игры. + Синхронизирует скорость ядра с максимальным процентом скорости для улучшения производительности без изменения фактической скорости игры. Использовать Auto Stub Автоматически заглушает отсутствующие сервисы и функции. Может улучшить совместимость, но вызывать сбои и проблемы стабильности. Удалить прошивку @@ -87,8 +90,9 @@ Шейдерный бэкенд Метод компиляции шейдеров - GLSL - SPIR-V + Универсальный + Mali + Adreno/Xclipse Эмуляция NVDEC @@ -411,7 +415,7 @@ Принудительно заставить максимальную тактовую частоту (только для Adreno) Заставляет ГП работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться). Использовать асинхронные шейдеры - Компиляция шейдеров происходит асинхронно, что уменьшает зависания, но может привести к появлению багов. + Компилирует шейдеры асинхронно. Это может уменьшить подтормаживания, но также может вызвать графические артефакты. Реактивная очистка Повышение точности рендеринга в некоторых играх за счет снижения производительности. Кэш шейдеров на диске 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 b536c81e29..369f116308 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -7,6 +7,9 @@ Ви не надали дозвіл сповіщень! + (Покращений) + (Пропуск) + Система: Показати накладання статистики Налаштування Видимість @@ -20,9 +23,9 @@ Показати швидкість Відображати швидкість емуляції Показати використання RAM - Відображати використання пам`яті емулятором + Показати обсяг оперативної пам’яті, яку використовує емулятор Показати системну RAM - Відображати використання пам`яті системою + Показати обсяг оперативної пам’яті, яку використовує система Показати температуру батареї Відображати температуру батареї Позиція накладання @@ -50,7 +53,7 @@ EDS3 + Динамічний стан вводу вершин Покращує продуктивність на нових пристроях. Підтримується лише GPU з Vulkan 1.3+. Синхронізувати швидкість ядра - Синхронізує швидкість тактів ядра з максимальним відсотком швидкості для покращення продуктивності без зміни фактичної швидкості гри. + Синхронізує швидкість ядра з максимальним відсотком швидкості для покращення продуктивності без зміни реальної швидкості гри. Використовувати Auto Stub Автоматично замінює відсутні сервіси та функції. Може покращити сумісність, але викликати збої та проблеми стабільності. Видалити прошивку @@ -87,8 +90,9 @@ Вершинний шейдер Спосіб компіляції шейдерів - GLSL - SPIR-V + Універсальний + Mali + Adreno/Xclipse Емуляція NVDEC @@ -288,17 +292,45 @@ Наша нескінченна вдячність Ви зацікавлені? - Обмеження відсотка швидкості + Обмеження швидкості + Обмежує швидкість емуляції у відсотках від нормальної. + Відсоток обмеження + Вказує відсоток обмеження швидкості. 100% — нормальна швидкість. + Режим ЦП Точність ЦП - Емульований регіон - Емульована мова - Користувацький RTC + %1$s%2$s + + + Назва пристрою + Режим док-станції + Збільшує роздільну здатність, знижуючи продуктивність. У портативному режимі роздільна здатність нижча, а продуктивність вища. + Регіон + Мова + Вибрати дату + Вибрати час + Свій RTC + Дозволяє встановити власний час, відмінний від системного. + Встановити RTC Рівень точності + Роздільна здатність (Портативний/Док) Режим верт. синхронізації - Примусово змусити максимальну тактову частоту (тільки для Adreno) - Змушує ГП працювати на максимально можливих тактових частотах (теплові обмеження все одно будуть застосовуватися). - Використовувати асинхронні шейдери + Орієнтація + Співвідношення + Фільтр масштабування + Різкість FSR + Визначає різкість зображення при використанні FSR. + Згладжування + Максимальна тактова частота (тільки Adreno) + Змушує ГП працювати на максимальній тактовій частоті. + Асинхронні шейдери + Компілює шейдери асинхронно. Це може зменшити затримки, але також може спричинити графічні помилки. + Реактивне очищення + Покращує точність рендерингу в деяких іграх. + Кеш шейдерів + Зменшує затримки шляхом збереження шейдерів. + Анізотропне фільтрування + Покращує якість текстур під кутом. ЦП API 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 a1d4318d79..475b379b64 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -7,6 +7,9 @@ Ứng dụng không được cấp quyền thông báo! + (Nâng cao) + (Bỏ qua) + Hệ thống: Hiển thị thống kê hiệu suất Tùy chỉnh Hiển thị @@ -20,9 +23,9 @@ Hiển thị tốc độ Hiển thị phần trăm tốc độ giả lập Hiển thị RAM ứng dụng - Hiển thị lượng RAM sử dụng bởi giả lập + Hiển thị lượng RAM mà trình giả lập đang sử dụng Hiển thị RAM hệ thống - Hiển thị lượng RAM sử dụng bởi hệ thống + Hiển thị lượng RAM được hệ thống sử dụng Hiển thị nhiệt độ pin Hiển thị nhiệt độ pin (Celsius/Fahrenheit) Vị trí overlay @@ -50,7 +53,7 @@ EDS3 + Trạng thái động đầu vào đỉnh Cải thiện hiệu suất trên các thiết bị mới hơn. Chỉ được hỗ trợ trên GPU Vulkan 1.3+. Đồng bộ tốc độ lõi - Đồng bộ tốc độ xung nhịp lõi với phần trăm tốc độ tối đa để cải thiện hiệu suất mà không thay đổi tốc độ thực tế của trò chơ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. Sử dụng Auto Stub Tự động thay thế các dịch vụ và chức năng bị thiếu. Có thể cải thiện khả năng tương thích nhưng gây ra sự cố và vấn đề ổn định. Gỡ cài đặt firmware @@ -87,8 +90,9 @@ Backend Shader Chọn cách biên dịch shader - GLSL - SPIR-V + Đa năng + Mali + Adreno/Xclipse Giả lập NVDEC @@ -328,7 +332,7 @@ Buộc chạy ở xung nhịp tối đa (chỉ Adreno) Buộc GPU hoạt động ở xung nhịp tối đa có thể (ràng buộc nhiệt độ vẫn sẽ được áp dụng). Dùng các shader bất đồng bộ - Biên dịch các shader bất đồng bộ, giảm tình trạng giật lag nhưng có thể gây ra các lỗi. + Biên dịch shader không đồng bộ. Điều này có thể giảm giật lag nhưng cũng có thể gây ra lỗi đồ họa. Bật xả tương ứng Cải thiện độ chính xác hiển thị trong một số trò chơi nhưng đồng thời giảm hiệu suất chơi. Lưu bộ nhớ đệm shader trên ổ cứng 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 0e69ca0c06..a57b0def0c 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 @@ -7,6 +7,9 @@ 未授予通知权限! + (增强) + (跳过) + 系统: 显示性能统计悬浮窗 自定义 显示项 @@ -20,9 +23,9 @@ 显示速度 显示当前模拟速度百分比 显示应用内存占用 - 显示模拟器内存使用量 + 显示模拟器正在使用的内存量 显示系统内存占用 - 显示系统内存使用量 + 显示系统使用的内存量 显示电池温度 显示当前电池温度(℃/℉) 悬浮窗位置 @@ -50,7 +53,7 @@ EDS3 + 顶点输入动态状态 提高新设备上的性能。仅支持Vulkan 1.3+ GPU。 同步核心速度 - 将核心时钟速度同步到最大速度百分比以提高性能,而不改变游戏实际速度。 + 将核心速度与最大速度百分比同步,在不改变游戏实际速度的情况下提高性能。 使用自动存根 自动补全缺失的服务和功能。可提高兼容性但可能导致崩溃和稳定性问题。 卸载固件 @@ -87,8 +90,9 @@ 着色器后端 选择着色器编译方式 - GLSL - SPIR-V + 通用 + Mali + Adreno/Xclipse NVDEC模拟 @@ -405,7 +409,7 @@ 强制最大时钟 (仅限 Adreno) 强制 GPU 以最大时钟运行 (仍被温控限制)。 使用异步着色器 - 异步编译着色器,减少卡顿,但可能引入故障。 + 异步编译着色器。这可能会减少卡顿,但也可能会导致图形错误。 启用反应性刷新 牺牲性能,提高某些游戏的渲染精度。 磁盘着色器缓存 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 6449d2d554..80a3a89c56 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 @@ -7,6 +7,9 @@ 未授予通知權限! + (增強) + (跳過) + 系統: 顯示效能統計疊加層 自訂 可見項目 @@ -20,7 +23,7 @@ 顯示速度 顯示當前模擬速度百分比 顯示應用記憶體用量 - 顯示模擬器使用的記憶體量 + 顯示模擬器正在使用的記憶體量 顯示系統記憶體用量 顯示系統使用的記憶體量 顯示電池溫度 @@ -50,7 +53,7 @@ EDS3 + 頂點輸入動態狀態 提高新裝置上的效能。僅支援Vulkan 1.3+ GPU。 同步核心速度 - 將核心時脈速度同步到最大速度百分比以提高效能,而不改變遊戲實際速度。 + 將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能。 使用自動存根 自動補全缺失的服務和功能。可提高相容性但可能導致崩潰和穩定性問題。 解除安裝韌體 @@ -87,8 +90,9 @@ 著色器後端 選擇著色器的編譯與轉譯方式 - GLSL - SPIR-V + 通用 + Mali + Adreno/Xclipse NVDEC模擬 @@ -406,7 +410,7 @@ 強制最大時脈 (僅 Adreno) 強制 GPU 以最大可能時脈執行 (熱溫限制仍被套用)。 使用非同步著色器 - 非同步編譯著色器,將會減少間斷,但可能會引入故障。 + 非同步編譯著色器。這可能會減少卡頓,但也可能導致圖形錯誤。 使用重新啟用排清 犧牲效能,以改善部分遊戲的轉譯準確度。 磁碟著色器快取 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index adaa67415d..cb108dc548 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -87,12 +87,14 @@ @string/shader_backend_glsl + @string/shader_backend_glasm @string/shader_backend_spirv 0 1 + 2 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 427b2890ad..cb9930d0a3 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -10,6 +10,9 @@ Notification permission not granted! + (Enhanced) + (Skipping) + System: ShoW Performance Stats Overlay Customization Visibility @@ -23,9 +26,9 @@ Show Speed Display current emulation speed percentage Show App Memory Usage - Display the amount of RAM getting used by the emulator + Display the amount of RAM the emulator is using Show System Memory Usage - Display the amount of RAM getting used by the system + Display the amount of RAM used by the system Show Battery Temperature Display current Battery temperature in Celsius and Fahrenheit Overlay Position @@ -49,7 +52,7 @@ EDS3 + VertexInputDynamicState Improves performance on newer devices. Only supported on Vulkan 1.3+ GPUs. Synchronize Core Speed - Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the games actual speed. + Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed. Use Auto Stub Automatically stub missing services and functions. This may improve compatibility but can cause crashes and stability issues. Uninstall firmware @@ -64,8 +67,9 @@ Shader Backend Choose how shaders are compiled and translated for your GPU. - GLSL - SPIR-V + Universal + Mali + Adreno/Xclipse NVDEC Emulation @@ -325,7 +329,7 @@ Projects that make eden for Android possible Build User data - Import/export all app data.\n\nWhen importing user data, all existing user data will be deleted! + Import/export all app data.\n\nWhen importing user data, all existing user data will be deleted!\n\nImporting data from Citron may cause issues. It\'s recommended to manually import all needed data. Exporting user data… Importing user data… Import user data @@ -334,8 +338,8 @@ User data imported successfully Export cancelled Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again. - https://discord.gg/Xa3ssgxrY7 - https://bixthefin.github.io// + https://discord.gg/hab4Sh8qj6 + https://eden-emulator.github.io https://git.eden-emu.dev/eden-emu @@ -388,7 +392,7 @@ Optimize SPIRV output Optimizes compiled shader to improve GPU efficiency. Use asynchronous shaders - Compiles shaders asynchronously, reducing stutter but may introduce glitches. + Compiles shaders asynchronously. This may reduce stutters but may also introduce glitches. Use Fast GPU Time Forces most games to run at their highest native resolution. This option is hacky and may cause issues. Use reactive flushing diff --git a/src/common/settings.h b/src/common/settings.h index 92e02d9887..6b4532c961 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -196,11 +196,11 @@ struct Values { SwitchableSetting memory_layout_mode{linkage, MemoryLayout::Memory_4Gb, MemoryLayout::Memory_4Gb, - MemoryLayout::Memory_8Gb, + MemoryLayout::Memory_12Gb, "memory_layout_mode", Category::Core, Specialization::Default, - false}; + true}; SwitchableSetting use_speed_limit{ linkage, true, "use_speed_limit", Category::Core, Specialization::Paired, true, true}; SwitchableSetting speed_limit{linkage, @@ -447,9 +447,9 @@ struct Values { SwitchableSetting dyna_state{linkage, #ifdef ANDROID - 0, + 2, #else - 1, + 2, #endif 0, 2, @@ -457,9 +457,9 @@ struct Values { Category::RendererExtensions, Specialization::Scalar}; - SwitchableSetting dyna_state3{linkage, false, "dyna_state3", Category::RendererExtensions}; - SwitchableSetting provoking_vertex{linkage, false, "provoking_vertex", Category::RendererExtensions}; - SwitchableSetting descriptor_indexing{linkage, false, "descriptor_indexing", Category::RendererExtensions}; + SwitchableSetting dyna_state3{linkage, true, "dyna_state3", Category::RendererExtensions}; + SwitchableSetting provoking_vertex{linkage, true, "provoking_vertex", Category::RendererExtensions}; + SwitchableSetting descriptor_indexing{linkage, true, "descriptor_indexing", Category::RendererExtensions}; Setting renderer_debug{linkage, false, "debug", Category::RendererDebug}; Setting renderer_shader_feedback{linkage, false, "shader_feedback", @@ -640,6 +640,10 @@ struct Values { Setting log_flush_lines{linkage, false, "flush_lines", Category::Miscellaneous}; Setting use_dev_keys{linkage, false, "use_dev_keys", Category::Miscellaneous}; Setting first_launch{linkage, true, "first_launch", Category::Miscellaneous}; + Setting hide_pre_alpha_warning{linkage, + false, + "hide_pre_alpha_warning", + Category::Miscellaneous}; // Network Setting network_interface{linkage, std::string(), "network_interface", diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 75189e60d7..43abe150f8 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -134,7 +134,7 @@ ENUM(CpuBackend, Dynarmic, Nce); ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid); -ENUM(MemoryLayout, Memory_4Gb, Memory_6Gb, Memory_8Gb); +ENUM(MemoryLayout, Memory_4Gb, Memory_6Gb, Memory_8Gb, Memory_10Gb, Memory_12Gb); ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never); diff --git a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp index 37fa39a734..f62f3e4767 100644 --- a/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp +++ b/src/core/hle/kernel/board/nintendo/nx/k_system_control.cpp @@ -48,6 +48,10 @@ u32 GetMemorySizeForInit() { return Smc::MemorySize_6GB; case Settings::MemoryLayout::Memory_8Gb: return Smc::MemorySize_8GB; + case Settings::MemoryLayout::Memory_10Gb: + return Smc::MemorySize_10GB; + case Settings::MemoryLayout::Memory_12Gb: + return Smc::MemorySize_12GB; } return Smc::MemorySize_4GB; } @@ -60,6 +64,10 @@ Smc::MemoryArrangement GetMemoryArrangeForInit() { return Smc::MemoryArrangement_6GB; case Settings::MemoryLayout::Memory_8Gb: return Smc::MemoryArrangement_8GB; + case Settings::MemoryLayout::Memory_10Gb: + return Smc::MemoryArrangement_10GB; + case Settings::MemoryLayout::Memory_12Gb: + return Smc::MemoryArrangement_12GB; } return Smc::MemoryArrangement_4GB; } @@ -79,6 +87,10 @@ size_t KSystemControl::Init::GetIntendedMemorySize() { return 6_GiB; case Smc::MemorySize_8GB: return 8_GiB; + case Smc::MemorySize_10GB: + return 10_GiB; + case Smc::MemorySize_12GB: + return 12_GiB; } } @@ -114,6 +126,10 @@ std::size_t KSystemControl::Init::GetApplicationPoolSize() { case Smc::MemoryArrangement_8GB: // Real kernel sets this to 4916_MiB. We are not debugging applets. return 6547_MiB; + case Smc::MemoryArrangement_10GB: + return 8178_MiB; + case Smc::MemoryArrangement_12GB: + return 9809_MiB; } }(); @@ -139,6 +155,10 @@ size_t KSystemControl::Init::GetAppletPoolSize() { case Smc::MemoryArrangement_8GB: //! Real kernel sets this to 2193_MiB. We are not debugging applets. return 562_MiB; + case Smc::MemoryArrangement_10GB: + return 562_MiB; + case Smc::MemoryArrangement_12GB: + return 562_MiB; } }(); diff --git a/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h b/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h index b0e4123f08..ffec06f2d5 100644 --- a/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h +++ b/src/core/hle/kernel/board/nintendo/nx/secure_monitor.h @@ -9,6 +9,8 @@ enum MemorySize { MemorySize_4GB = 0, MemorySize_6GB = 1, MemorySize_8GB = 2, + MemorySize_10GB = 3, + MemorySize_12GB = 4, }; enum MemoryArrangement { @@ -18,6 +20,8 @@ enum MemoryArrangement { MemoryArrangement_6GB = 3, MemoryArrangement_6GBForAppletDev = 4, MemoryArrangement_8GB = 5, + MemoryArrangement_10GB = 6, + MemoryArrangement_12GB = 7, }; } // namespace Kernel::Board::Nintendo::Nx::Smc diff --git a/src/core/hle/service/am/service/common_state_getter.cpp b/src/core/hle/service/am/service/common_state_getter.cpp index c445e5e776..c179102f76 100644 --- a/src/core/hle/service/am/service/common_state_getter.cpp +++ b/src/core/hle/service/am/service/common_state_getter.cpp @@ -38,7 +38,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr, "GetReaderLockAccessorEx"}, {32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, - {40, D<&ICommonStateGetter::GetCradleFwVersion>, "GetCradleFwVersion"}, + {40, nullptr, "GetCradleFwVersion"}, {50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, {51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, {52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, @@ -172,17 +172,6 @@ Result ICommonStateGetter::GetBootMode(Out out_boot_mode) { R_SUCCEED(); } -Result ICommonStateGetter::GetCradleFwVersion(OutArray out_version) { - LOG_DEBUG(Service_AM, "(STUBBED) called"); - - out_version[0] = 0; - out_version[1] = 0; - out_version[2] = 0; - out_version[3] = 0; - - R_SUCCEED(); -} - Result ICommonStateGetter::IsVrModeEnabled(Out out_is_vr_mode_enabled) { LOG_DEBUG(Service_AM, "called"); diff --git a/src/core/hle/service/am/service/common_state_getter.h b/src/core/hle/service/am/service/common_state_getter.h index a326e11053..0cafbfe176 100644 --- a/src/core/hle/service/am/service/common_state_getter.h +++ b/src/core/hle/service/am/service/common_state_getter.h @@ -39,7 +39,6 @@ private: Result GetHdcpAuthenticationStateChangeEvent(OutCopyHandle out_event); Result GetOperationMode(Out out_operation_mode); Result GetPerformanceMode(Out out_performance_mode); - Result GetCradleFwVersion(OutArray out_version); Result GetBootMode(Out out_boot_mode); Result IsVrModeEnabled(Out out_is_vr_mode_enabled); Result SetVrModeEnabled(bool is_vr_mode_enabled); diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.cpp b/src/video_core/host1x/ffmpeg/ffmpeg.cpp index 7e955223db..fe85efaab3 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.cpp +++ b/src/video_core/host1x/ffmpeg/ffmpeg.cpp @@ -1,6 +1,12 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 suyu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// SPDX-FileCopyrightText: Copyright 2025 eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + #include "common/assert.h" #include "common/logging/log.h" #include "common/scope_exit.h" @@ -49,7 +55,8 @@ AVPixelFormat GetGpuFormat(AVCodecContext* codec_context, const AVPixelFormat* p return codec_context->pix_fmt; } -std::string AVError(int errnum) { +std::string AVError(int errnum) +{ char errbuf[AV_ERROR_MAX_STRING_SIZE] = {}; av_make_error_string(errbuf, sizeof(errbuf) - 1, errnum); return errbuf; @@ -218,6 +225,167 @@ bool DecoderContext::OpenContext(const Decoder& decoder) { return true; } +// Nasty but allows linux builds to pass. +// Requires double checks when FFMPEG gets updated. +// Hopefully a future FFMPEG update will all and expose a solution in the public API. +namespace { + +typedef struct FFCodecDefault { + const char* key; + const char* value; +} FFCodecDefault; + +typedef struct FFCodec { + /** + * The public AVCodec. See codec.h for it. + */ + AVCodec p; + + /** + * Internal codec capabilities FF_CODEC_CAP_*. + */ + unsigned caps_internal : 29; + + /** + * This field determines the type of the codec (decoder/encoder) + * and also the exact callback cb implemented by the codec. + * cb_type uses enum FFCodecType values. + */ + unsigned cb_type : 3; + + int priv_data_size; + /** + * @name Frame-level threading support functions + * @{ + */ + /** + * Copy necessary context variables from a previous thread context to the current one. + * If not defined, the next thread will start automatically; otherwise, the codec + * must call ff_thread_finish_setup(). + * + * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. + */ + int (*update_thread_context)(struct AVCodecContext* dst, const struct AVCodecContext* src); + + /** + * Copy variables back to the user-facing context + */ + int (*update_thread_context_for_user)(struct AVCodecContext* dst, + const struct AVCodecContext* src); + /** @} */ + + /** + * Private codec-specific defaults. + */ + const FFCodecDefault* defaults; + + /** + * Initialize codec static data, called from av_codec_iterate(). + * + * This is not intended for time consuming operations as it is + * run for every codec regardless of that codec being used. + */ + void (*init_static_data)(struct FFCodec* codec); + + int (*init)(struct AVCodecContext*); + + union { + /** + * Decode to an AVFrame. + * cb is in this state if cb_type is FF_CODEC_CB_TYPE_DECODE. + * + * @param avctx codec context + * @param[out] frame AVFrame for output + * @param[out] got_frame_ptr decoder sets to 0 or 1 to indicate that + * a non-empty frame was returned in frame. + * @param[in] avpkt AVPacket containing the data to be decoded + * @return amount of bytes read from the packet on success, + * negative error code on failure + */ + int (*decode)(struct AVCodecContext* avctx, struct AVFrame* frame, int* got_frame_ptr, + struct AVPacket* avpkt); + /** + * Decode subtitle data to an AVSubtitle. + * cb is in this state if cb_type is FF_CODEC_CB_TYPE_DECODE_SUB. + * + * Apart from that this is like the decode callback. + */ + int (*decode_sub)(struct AVCodecContext* avctx, struct AVSubtitle* sub, int* got_frame_ptr, + const struct AVPacket* avpkt); + /** + * Decode API with decoupled packet/frame dataflow. + * cb is in this state if cb_type is FF_CODEC_CB_TYPE_RECEIVE_FRAME. + * + * This function is called to get one output frame. It should call + * ff_decode_get_packet() to obtain input data. + */ + int (*receive_frame)(struct AVCodecContext* avctx, struct AVFrame* frame); + /** + * Encode data to an AVPacket. + * cb is in this state if cb_type is FF_CODEC_CB_TYPE_ENCODE + * + * @param avctx codec context + * @param[out] avpkt output AVPacket + * @param[in] frame AVFrame containing the input to be encoded + * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a + * non-empty packet was returned in avpkt. + * @return 0 on success, negative error code on failure + */ + int (*encode)(struct AVCodecContext* avctx, struct AVPacket* avpkt, + const struct AVFrame* frame, int* got_packet_ptr); + /** + * Encode subtitles to a raw buffer. + * cb is in this state if cb_type is FF_CODEC_CB_TYPE_ENCODE_SUB. + */ + int (*encode_sub)(struct AVCodecContext* avctx, uint8_t* buf, int buf_size, + const struct AVSubtitle* sub); + /** + * Encode API with decoupled frame/packet dataflow. + * cb is in this state if cb_type is FF_CODEC_CB_TYPE_RECEIVE_PACKET. + * + * This function is called to get one output packet. + * It should call ff_encode_get_frame() to obtain input data. + */ + int (*receive_packet)(struct AVCodecContext* avctx, struct AVPacket* avpkt); + } cb; + + int (*close)(struct AVCodecContext*); + + /** + * Flush buffers. + * Will be called when seeking + */ + void (*flush)(struct AVCodecContext*); + + /** + * Decoding only, a comma-separated list of bitstream filters to apply to + * packets before decoding. + */ + const char* bsfs; + + /** + * Array of pointers to hardware configurations supported by the codec, + * or NULL if no hardware supported. The array is terminated by a NULL + * pointer. + * + * The user can only access this field via avcodec_get_hw_config(). + */ + const struct AVCodecHWConfigInternal* const* hw_configs; + + /** + * List of supported codec_tags, terminated by FF_CODEC_TAGS_END. + */ + const uint32_t* codec_tags; +} FFCodec; + +#ifndef ANDROID +static av_always_inline const FFCodec* ffcodec(const AVCodec* codec) { + return (const FFCodec*)codec; +} +#endif +} // namespace + + bool DecoderContext::SendPacket(const Packet& packet) { m_temp_frame = std::make_shared(); m_got_frame = 0; @@ -227,8 +395,12 @@ bool DecoderContext::SendPacket(const Packet& packet) { #ifndef ANDROID if (!m_codec_context->hw_device_ctx && m_codec_context->codec_id == AV_CODEC_ID_H264) { m_decode_order = true; - const int ret = avcodec_send_frame(m_codec_context, m_temp_frame->GetFrame()); - if (ret < 0) { + auto* codec{ffcodec(m_decoder.GetCodec())}; + if (const int ret = codec->cb.decode(m_codec_context, + m_temp_frame->GetFrame(), + &m_got_frame, + packet.GetPacket()); + ret < 0) { LOG_DEBUG(Service_NVDRV, "avcodec_send_packet error {}", AVError(ret)); return false; } @@ -247,9 +419,11 @@ bool DecoderContext::SendPacket(const Packet& packet) { std::shared_ptr DecoderContext::ReceiveFrame() { // Android can randomly crash when calling decode directly, so skip. // TODO update ffmpeg and hope that fixes it. +// TODO: This is causing issues on linux, need to bisect #ifndef ANDROID if (!m_codec_context->hw_device_ctx && m_codec_context->codec_id == AV_CODEC_ID_H264) { m_decode_order = true; + auto* codec{ffcodec(m_decoder.GetCodec())}; int ret{0}; if (m_got_frame == 0) { @@ -257,7 +431,7 @@ std::shared_ptr DecoderContext::ReceiveFrame() { auto* pkt = packet.GetPacket(); pkt->data = nullptr; pkt->size = 0; - ret = avcodec_receive_packet(m_codec_context, pkt); + ret = codec->cb.decode(m_codec_context, m_temp_frame->GetFrame(), &m_got_frame, pkt); m_codec_context->has_b_frames = 0; } diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 3260ef8cc2..30f5ff7a75 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -1,6 +1,9 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2025 eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + #include #include #include @@ -99,52 +102,91 @@ Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dl } RendererVulkan::RendererVulkan(Core::Frontend::EmuWindow& emu_window, - Tegra::MaxwellDeviceMemoryManager& device_memory_, Tegra::GPU& gpu_, - std::unique_ptr context_) try - : RendererBase(emu_window, std::move(context_)), device_memory(device_memory_), gpu(gpu_), - library(OpenLibrary(context.get())), - // Create raw Vulkan instance first - instance(CreateInstance(*library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, - Settings::values.renderer_debug.GetValue())), - // Now create RAII wrappers for the resources in the correct order - managed_instance(MakeManagedInstance(instance, dld)), - // Create debug messenger if debug is enabled - debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance) - : vk::DebugUtilsMessenger{}), - managed_debug_messenger(Settings::values.renderer_debug - ? MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld) - : ManagedDebugUtilsMessenger{}), - // Create surface - surface(CreateSurface(instance, render_window.GetWindowInfo())), - managed_surface(MakeManagedSurface(surface, instance, dld)), - device(CreateDevice(instance, dld, *surface)), - memory_allocator(device), state_tracker(), - scheduler(device, state_tracker), - swapchain(*surface, device, scheduler, render_window.GetFramebufferLayout().width, - render_window.GetFramebufferLayout().height), - present_manager(instance, render_window, device, memory_allocator, scheduler, swapchain, - *surface), - blit_swapchain(device_memory, device, memory_allocator, present_manager, scheduler, - PresentFiltersForDisplay), - blit_capture(device_memory, device, memory_allocator, present_manager, scheduler, - PresentFiltersForDisplay), - blit_applet(device_memory, device, memory_allocator, present_manager, scheduler, - PresentFiltersForAppletCapture), - rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, - scheduler), - applet_frame() { + Tegra::MaxwellDeviceMemoryManager& device_memory_, + Tegra::GPU& gpu_, + std::unique_ptr context_) +try + : RendererBase(emu_window, std::move(context_)) + , device_memory(device_memory_) + , gpu(gpu_) + , library(OpenLibrary(context.get())) + , + // Create raw Vulkan instance first + instance(CreateInstance(*library, + dld, + VK_API_VERSION_1_1, + render_window.GetWindowInfo().type, + Settings::values.renderer_debug.GetValue())) + , + // Now create RAII wrappers for the resources in the correct order + managed_instance(MakeManagedInstance(instance, dld)) + , + // Create debug messenger if debug is enabled + debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance) + : vk::DebugUtilsMessenger{}) + , managed_debug_messenger(Settings::values.renderer_debug + ? MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld) + : ManagedDebugUtilsMessenger{}) + , + // Create surface + surface(CreateSurface(instance, render_window.GetWindowInfo())) + , managed_surface(MakeManagedSurface(surface, instance, dld)) + , device(CreateDevice(instance, dld, *surface)) + , memory_allocator(device) + , state_tracker() + , scheduler(device, state_tracker) + , swapchain(*surface, + device, + scheduler, + render_window.GetFramebufferLayout().width, + render_window.GetFramebufferLayout().height) + , present_manager(instance, + render_window, + device, + memory_allocator, + scheduler, + swapchain, +#ifdef ANDROID + surface) + , +#else + *surface) + , +#endif + blit_swapchain(device_memory, + device, + memory_allocator, + present_manager, + scheduler, + PresentFiltersForDisplay) + , blit_capture(device_memory, + device, + memory_allocator, + present_manager, + scheduler, + PresentFiltersForDisplay) + , blit_applet(device_memory, + device, + memory_allocator, + present_manager, + scheduler, + PresentFiltersForAppletCapture) + , rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler) + , applet_frame() { - if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { + if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { turbo_mode.emplace(instance, dld); scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); }); } +#ifndef ANDROID // Release ownership from the old instance and surface instance.release(); surface.release(); if (Settings::values.renderer_debug) { debug_messenger.release(); } +#endif Report(); } catch (const vk::Exception& exception) { diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 8f5edeae24..a448dc5288 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -95,15 +95,31 @@ bool CanBlitToSwapchain(const vk::PhysicalDevice& physical_device, VkFormat form } // Anonymous namespace -PresentManager::PresentManager(const vk::Instance& instance_, Core::Frontend::EmuWindow& render_window_, - const Device& device_, MemoryAllocator& memory_allocator_, Scheduler& scheduler_, - Swapchain& swapchain_, VkSurfaceKHR_T* surface_handle_) - : instance{instance_}, render_window{render_window_}, device{device_}, - memory_allocator{memory_allocator_}, scheduler{scheduler_}, swapchain{swapchain_}, - surface_handle{surface_handle_}, - blit_supported{CanBlitToSwapchain(device.GetPhysical(), - swapchain.GetImageViewFormat())}, - use_present_thread{Settings::values.async_presentation.GetValue()} { +PresentManager::PresentManager(const vk::Instance& instance_, + Core::Frontend::EmuWindow& render_window_, + const Device& device_, + MemoryAllocator& memory_allocator_, + Scheduler& scheduler_, + Swapchain& swapchain_, +#ifdef ANDROID + vk::SurfaceKHR& surface_) +#else + VkSurfaceKHR_T* surface_handle_) +#endif + : instance{instance_} + , render_window{render_window_} + , device{device_} + , memory_allocator{memory_allocator_} + , scheduler{scheduler_} + , swapchain{swapchain_} +#ifdef ANDROID + , surface{surface_} +#else + , surface_handle{surface_handle_} +#endif + , blit_supported{CanBlitToSwapchain(device.GetPhysical(), swapchain.GetImageViewFormat())} + , use_present_thread{Settings::values.async_presentation.GetValue()} +{ SetImageCount(); auto& dld = device.GetLogical(); @@ -289,7 +305,11 @@ void PresentManager::PresentThread(std::stop_token token) { } void PresentManager::RecreateSwapchain(Frame* frame) { +#ifndef ANDROID swapchain.Create(surface_handle, frame->width, frame->height); // Pass raw pointer +#else + swapchain.Create(*surface, frame->width, frame->height); // Pass raw pointer +#endif SetImageCount(); } @@ -307,6 +327,9 @@ void PresentManager::CopyToSwapchain(Frame* frame) { try { // Recreate surface and swapchain if needed. if (requires_recreation) { +#ifdef ANDROID + surface = CreateSurface(instance, render_window.GetWindowInfo()); +#endif RecreateSwapchain(frame); } diff --git a/src/video_core/renderer_vulkan/vk_present_manager.h b/src/video_core/renderer_vulkan/vk_present_manager.h index 96850ed56f..5820280602 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.h +++ b/src/video_core/renderer_vulkan/vk_present_manager.h @@ -37,9 +37,17 @@ struct Frame { class PresentManager { public: - PresentManager(const vk::Instance& instance, Core::Frontend::EmuWindow& render_window, - const Device& device, MemoryAllocator& memory_allocator, Scheduler& scheduler, - Swapchain& swapchain, VkSurfaceKHR_T* surface_handle); + PresentManager(const vk::Instance& instance, + Core::Frontend::EmuWindow& render_window, + const Device& device, + MemoryAllocator& memory_allocator, + Scheduler& scheduler, + Swapchain& swapchain, +#ifdef ANDROID + vk::SurfaceKHR& surface); +#else + VkSurfaceKHR_T* surface_handle); +#endif ~PresentManager(); /// Returns the last used presentation frame @@ -73,7 +81,11 @@ private: MemoryAllocator& memory_allocator; Scheduler& scheduler; Swapchain& swapchain; +#ifdef ANDROID + vk::SurfaceKHR& surface; +#else VkSurfaceKHR_T* surface_handle; +#endif vk::CommandPool cmdpool; std::vector frames; std::queue present_queue; diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index a28296bdaf..44c06eddf3 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -176,7 +176,7 @@ public: PauseCounter(); } AbandonCurrentQuery(); - std::function func([this, counts = pending_flush_queries.size()] { + std::function func([this] { amend_value = 0; accumulation_value = 0; }); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index ec96b75036..a002ca83a0 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -105,23 +105,58 @@ VkCompositeAlphaFlagBitsKHR ChooseAlphaFlags(const VkSurfaceCapabilitiesKHR& cap } // Anonymous namespace -Swapchain::Swapchain(VkSurfaceKHR_T* surface_handle_, const Device& device_, Scheduler& scheduler_, - u32 width_, u32 height_) - : surface_handle{surface_handle_}, device{device_}, scheduler{scheduler_} { +Swapchain::Swapchain( +#ifdef ANDROID + VkSurfaceKHR surface_, +#else + VkSurfaceKHR_T* surface_handle_, +#endif + const Device& device_, + Scheduler& scheduler_, + u32 width_, + u32 height_) +#ifdef ANDROID + : surface(surface_) +#else + : surface_handle{surface_handle_} +#endif + , device{device_} + , scheduler{scheduler_} +{ +#ifdef ANDROID + Create(surface, width_, height_); +#else Create(surface_handle, width_, height_); +#endif } Swapchain::~Swapchain() = default; -void Swapchain::Create(VkSurfaceKHR_T* surface_handle_, u32 width_, u32 height_) { +void Swapchain::Create( +#ifdef ANDROID + VkSurfaceKHR surface_, +#else + VkSurfaceKHR_T* surface_handle_, +#endif + u32 width_, + u32 height_) +{ is_outdated = false; is_suboptimal = false; width = width_; height = height_; +#ifdef ANDROID + surface = surface_; +#else surface_handle = surface_handle_; +#endif const auto physical_device = device.GetPhysical(); +#ifdef ANDROID + const auto capabilities{physical_device.GetSurfaceCapabilitiesKHR(surface)}; +#else const auto capabilities{physical_device.GetSurfaceCapabilitiesKHR(surface_handle)}; +#endif if (capabilities.maxImageExtent.width == 0 || capabilities.maxImageExtent.height == 0) { return; } @@ -199,10 +234,17 @@ void Swapchain::Present(VkSemaphore render_semaphore) { void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities) { const auto physical_device{device.GetPhysical()}; + +#ifdef ANDROID + const auto formats{physical_device.GetSurfaceFormatsKHR(surface)}; + const auto present_modes = physical_device.GetSurfacePresentModesKHR(surface); +#else const auto formats{physical_device.GetSurfaceFormatsKHR(surface_handle)}; const auto present_modes = physical_device.GetSurfacePresentModesKHR(surface_handle); - has_mailbox = std::find(present_modes.begin(), present_modes.end(), - VK_PRESENT_MODE_MAILBOX_KHR) != present_modes.end(); +#endif + + has_mailbox = std::find(present_modes.begin(), present_modes.end(), VK_PRESENT_MODE_MAILBOX_KHR) + != present_modes.end(); has_imm = std::find(present_modes.begin(), present_modes.end(), VK_PRESENT_MODE_IMMEDIATE_KHR) != present_modes.end(); has_fifo_relaxed = std::find(present_modes.begin(), present_modes.end(), @@ -228,7 +270,11 @@ void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities) { .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, .pNext = nullptr, .flags = 0, +#ifdef ANDROID + .surface = surface, +#else .surface = surface_handle, +#endif .minImageCount = requested_image_count, .imageFormat = surface_format.format, .imageColorSpace = surface_format.colorSpace, @@ -269,7 +315,11 @@ void Swapchain::CreateSwapchain(const VkSurfaceCapabilitiesKHR& capabilities) { swapchain_ci.flags |= VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR; } // Request the size again to reduce the possibility of a TOCTOU race condition. +#ifdef ANDROID + const auto updated_capabilities = physical_device.GetSurfaceCapabilitiesKHR(surface); +#else const auto updated_capabilities = physical_device.GetSurfaceCapabilitiesKHR(surface_handle); +#endif swapchain_ci.imageExtent = ChooseSwapExtent(updated_capabilities, width, height); // Don't add code within this and the swapchain creation. swapchain = device.GetLogical().CreateSwapchainKHR(swapchain_ci); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index f5090c27f4..b3e1c4f025 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -21,12 +21,27 @@ class Scheduler; class Swapchain { public: - explicit Swapchain(VkSurfaceKHR_T* surface_handle, const Device& device, Scheduler& scheduler, u32 width, - u32 height); + explicit Swapchain( +#ifdef ANDROID + VkSurfaceKHR surface, +#else + VkSurfaceKHR_T* surface_handle, +#endif + const Device& device, + Scheduler& scheduler, + u32 width, + u32 height); ~Swapchain(); /// Creates (or recreates) the swapchain with a given size. - void Create(VkSurfaceKHR_T* surface_handle, u32 width, u32 height); + void Create( +#ifdef ANDROID + VkSurfaceKHR surface, +#else + VkSurfaceKHR_T* surface_handle, +#endif + u32 width, + u32 height); /// Acquires the next image in the swapchain, waits as needed. bool AcquireNextImage(); @@ -110,7 +125,12 @@ private: bool NeedsPresentModeUpdate() const; +#ifdef ANDROID + VkSurfaceKHR surface; +#else VkSurfaceKHR_T* surface_handle; +#endif + const Device& device; Scheduler& scheduler; diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index aa9fb8e17b..4607bf516c 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -430,6 +430,7 @@ public: return handle != nullptr; } +#ifndef ANDROID /** * Releases ownership of the managed handle. * The caller is responsible for managing the lifetime of the returned handle. @@ -438,6 +439,7 @@ public: Type release() noexcept { return std::exchange(handle, nullptr); } +#endif protected: Type handle = nullptr; @@ -510,6 +512,7 @@ public: return handle != nullptr; } +#ifndef ANDROID /** * Releases ownership of the managed handle. * The caller is responsible for managing the lifetime of the returned handle. @@ -518,6 +521,7 @@ public: Type release() noexcept { return std::exchange(handle, nullptr); } +#endif protected: Type handle = nullptr; diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 15b898279b..9425ee73f6 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -238,6 +238,8 @@ add_executable(yuzu yuzu.qrc yuzu.rc migration_dialog.h migration_dialog.cpp + migration_worker.h + migration_worker.cpp ) set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") diff --git a/src/yuzu/aboutdialog.ui b/src/yuzu/aboutdialog.ui index e6f269ee69..46cdd28e63 100644 --- a/src/yuzu/aboutdialog.ui +++ b/src/yuzu/aboutdialog.ui @@ -128,7 +128,7 @@ li.checked::marker { content: "\2612"; } - <html><head/><body><p><a href="https://yuzu-emu.org/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://github.com/yuzu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://github.com/yuzu-emu/yuzu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://github.com/yuzu-emu/yuzu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://eden-emulator.github.io/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.eden-emu.dev"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.eden-emu.dev/eden-emu/eden/activity/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.eden-emu.dev/eden-emu/eden/src/branch/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> true diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 06ebb36442..8d773753c1 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -286,7 +286,7 @@ GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_, Core::System& system_) : QWidget(parent), emu_thread(emu_thread_), input_subsystem{std::move(input_subsystem_)}, system{system_} { - setWindowTitle(QStringLiteral("yuzu %1 | %2-%3") + setWindowTitle(QStringLiteral("eden %1 | %2-%3") .arg(QString::fromUtf8(Common::g_build_name), QString::fromUtf8(Common::g_scm_branch), QString::fromUtf8(Common::g_scm_desc))); @@ -1137,4 +1137,4 @@ bool GRenderWindow::eventFilter(QObject* object, QEvent* event) { emit MouseActivity(); } return false; -} \ No newline at end of file +} diff --git a/src/yuzu/compatdb.ui b/src/yuzu/compatdb.ui index d11669df26..6a2632a1ce 100644 --- a/src/yuzu/compatdb.ui +++ b/src/yuzu/compatdb.ui @@ -20,7 +20,7 @@ Report Compatibility - QWizard::DisabledBackButtonOnLastPage|QWizard::HelpButtonOnRight|QWizard::NoBackButtonOnStartPage + QWizard::WizardOption::DisabledBackButtonOnLastPage|QWizard::WizardOption::HelpButtonOnRight|QWizard::WizardOption::NoBackButtonOnStartPage @@ -33,7 +33,7 @@ - <html><head/><body><p><span style=" font-size:10pt;">Should you choose to submit a test case to the </span><a href="https://yuzu-emu.org/game/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">yuzu Compatibility List</span></a><span style=" font-size:10pt;">, The following information will be collected and displayed on the site:</span></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware Information (CPU / GPU / Operating System)</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Which version of yuzu you are running</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The connected yuzu account</li></ul></body></html> + <html><head/><body><p><span style=" font-size:10pt;">Should you choose to submit a test case to the </span><a href="https://eden-emulator.github.io/game/"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">eden Compatibility List</span></a><span style=" font-size:10pt;">, The following information will be collected and displayed on the site:</span></p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware Information (CPU / GPU / Operating System)</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Which version of eden you are running</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The connected eden account</li></ul></body></html> true @@ -46,7 +46,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -84,7 +84,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -150,7 +150,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -202,7 +202,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -254,7 +254,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -313,7 +313,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -372,7 +372,7 @@ - Qt::Vertical + Qt::Orientation::Vertical diff --git a/src/yuzu/configuration/configure_debug.ui b/src/yuzu/configuration/configure_debug.ui index 68c5a67b24..3a54d93b7b 100644 --- a/src/yuzu/configuration/configure_debug.ui +++ b/src/yuzu/configuration/configure_debug.ui @@ -424,7 +424,7 @@ - Enable Auto-Stub** + Enable Auto-Stub @@ -553,7 +553,7 @@ - **This will be reset automatically when yuzu closes. + **This will be reset automatically when eden closes. 20 diff --git a/src/yuzu/configuration/configure_graphics_extensions.ui b/src/yuzu/configuration/configure_graphics_extensions.ui index e9f5ace53e..df44b6c353 100644 --- a/src/yuzu/configuration/configure_graphics_extensions.ui +++ b/src/yuzu/configuration/configure_graphics_extensions.ui @@ -29,7 +29,7 @@ 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 device doesn't support the selected state, the renderer will automatically disable the unsupported states. +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. true diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui index 2994d0ab48..2bdd137b08 100644 --- a/src/yuzu/configuration/configure_input_advanced.ui +++ b/src/yuzu/configuration/configure_input_advanced.ui @@ -2656,7 +2656,7 @@ - Requires restarting yuzu + Requires restarting eden @@ -2698,7 +2698,7 @@ - Requires restarting yuzu + Requires restarting eden @@ -2714,7 +2714,7 @@ - Requires restarting yuzu + Requires restarting eden diff --git a/src/yuzu/configuration/configure_input_player.ui b/src/yuzu/configuration/configure_input_player.ui index 012379a477..b8e0465386 100644 --- a/src/yuzu/configuration/configure_input_player.ui +++ b/src/yuzu/configuration/configure_input_player.ui @@ -1363,55 +1363,6 @@ - - - - Plus - - - Qt::AlignmentFlag::AlignCenter - - - - 3 - - - 3 - - - 3 - - - 3 - - - 3 - - - - - - 70 - 0 - - - - - 68 - 16777215 - - - - min-width: 68px; - - - Plus - - - - - - @@ -1461,6 +1412,55 @@ + + + + Plus + + + Qt::AlignmentFlag::AlignCenter + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + 70 + 0 + + + + + 68 + 16777215 + + + + min-width: 68px; + + + Plus + + + + + + diff --git a/src/yuzu/configuration/configure_motion_touch.cpp b/src/yuzu/configuration/configure_motion_touch.cpp index 6372ed4812..7a1cee463b 100644 --- a/src/yuzu/configuration/configure_motion_touch.cpp +++ b/src/yuzu/configuration/configure_motion_touch.cpp @@ -85,7 +85,7 @@ ConfigureMotionTouch::ConfigureMotionTouch(QWidget* parent, ui->udp_learn_more->setOpenExternalLinks(true); ui->udp_learn_more->setText( tr("Learn More")); diff --git a/src/yuzu/configuration/configure_tas.ui b/src/yuzu/configuration/configure_tas.ui index 625af0c891..d24f54b77b 100644 --- a/src/yuzu/configuration/configure_tas.ui +++ b/src/yuzu/configuration/configure_tas.ui @@ -14,7 +14,7 @@ - <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://yuzu-emu.org/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the yuzu website.</p></body></html> + <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the <a href="https://eden-emulator.github.io/help/feature/tas/"><span style=" text-decoration: underline; color:#039be5;">help page</span></a> on the eden website.</p></body></html> true diff --git a/src/yuzu/configuration/configure_touchscreen_advanced.ui b/src/yuzu/configuration/configure_touchscreen_advanced.ui index 88e7cf0506..6dce2e0097 100644 --- a/src/yuzu/configuration/configure_touchscreen_advanced.ui +++ b/src/yuzu/configuration/configure_touchscreen_advanced.ui @@ -23,7 +23,7 @@ - Warning: The settings in this page affect the inner workings of yuzu's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. + Warning: The settings in this page affect the inner workings of eden's emulated touchscreen. Changing them may result in undesirable behavior, such as the touchscreen partially or not working. You should only use this page if you know what you are doing. true diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp index 1f579a21e2..a513e1c1b0 100644 --- a/src/yuzu/configuration/configure_web.cpp +++ b/src/yuzu/configuration/configure_web.cpp @@ -66,7 +66,7 @@ void ConfigureWeb::RetranslateUI() { "color:#039be5;\">Sign up")); ui->web_token_info_link->setText( - tr("What is my token?")); } diff --git a/src/yuzu/configuration/configure_web.ui b/src/yuzu/configuration/configure_web.ui index af86e476e1..942fb05b26 100644 --- a/src/yuzu/configuration/configure_web.ui +++ b/src/yuzu/configuration/configure_web.ui @@ -22,13 +22,13 @@ - yuzu Web Service + eden Web Service - By providing your username and token, you agree to allow yuzu to collect additional usage data, which may include user identifying information. + By providing your username and token, you agree to allow eden to collect additional usage data, which may include user identifying information. diff --git a/src/yuzu/configuration/shared_translation.cpp b/src/yuzu/configuration/shared_translation.cpp index 6307daeb5a..02bb9a322f 100644 --- a/src/yuzu/configuration/shared_translation.cpp +++ b/src/yuzu/configuration/shared_translation.cpp @@ -289,10 +289,10 @@ std::unique_ptr InitializeTranslations(QWidget* parent) { // Ui General INSERT(UISettings, select_user_on_boot, tr("Prompt for user on game boot"), - tr("Ask to select a user profile on each boot, useful if multiple people use yuzu on " + tr("Ask to select a user profile on each boot, useful if multiple people use eden on " "the same PC.")); INSERT(UISettings, pause_when_in_background, tr("Pause emulation when in background"), - tr("This setting pauses yuzu when focusing other windows.")); + tr("This setting pauses eden when focusing other windows.")); INSERT(UISettings, confirm_before_stopping, tr("Confirm before stopping emulation"), tr("This setting overrides game prompts asking to confirm stopping the game.\nEnabling " "it bypasses such prompts and directly exits the emulation.")); @@ -544,7 +544,9 @@ std::unique_ptr ComboboxEnumeration(QWidget* parent) { { PAIR(MemoryLayout, Memory_4Gb, tr("4GB DRAM (Default)")), PAIR(MemoryLayout, Memory_6Gb, tr("6GB DRAM (Unsafe)")), - PAIR(MemoryLayout, Memory_8Gb, tr("8GB DRAM (Unsafe)")), + PAIR(MemoryLayout, Memory_8Gb, tr("8GB DRAM")), + PAIR(MemoryLayout, Memory_10Gb, tr("10GB DRAM (Unsafe)")), + PAIR(MemoryLayout, Memory_12Gb, tr("12GB DRAM (Unsafe)")), }}); translations->insert({Settings::EnumMetadata::Index(), { diff --git a/src/yuzu/discord_impl.cpp b/src/yuzu/discord_impl.cpp index 57b50abd0d..7ed400c955 100644 --- a/src/yuzu/discord_impl.cpp +++ b/src/yuzu/discord_impl.cpp @@ -16,7 +16,6 @@ #include "core/core.h" #include "core/loader/loader.h" #include "yuzu/discord_impl.h" -#include "yuzu/uisettings.h" namespace DiscordRPC { @@ -24,7 +23,7 @@ DiscordImpl::DiscordImpl(Core::System& system_) : system{system_} { DiscordEventHandlers handlers{}; // The number is the client ID for yuzu, it's used for images and the // application name - Discord_Initialize("712465656758665259", &handlers, 1, nullptr); + Discord_Initialize("1371246384434380841", &handlers, 1, nullptr); } DiscordImpl::~DiscordImpl() { @@ -62,8 +61,9 @@ std::string DiscordImpl::GetGameString(const std::string& title) { } void DiscordImpl::UpdateGameStatus(bool use_default) { - const std::string default_text = "yuzu is an emulator for the Nintendo Switch"; - const std::string default_image = "yuzu_logo"; + const std::string default_text = "eden is an emulator for the Nintendo Switch"; + const std::string default_image = "https://git.eden-emu.dev/eden-emu/eden/raw/branch/master/" + "dist/qt_themes/default/icons/256x256/eden_named.png"; const std::string url = use_default ? default_image : game_url; s64 start_time = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()) @@ -81,15 +81,18 @@ void DiscordImpl::UpdateGameStatus(bool use_default) { } void DiscordImpl::Update() { - const std::string default_text = "yuzu is an emulator for the Nintendo Switch"; - const std::string default_image = "yuzu_logo"; + const std::string default_text = "eden is an emulator for the Nintendo Switch"; + const std::string default_image = "https://git.eden-emu.dev/eden-emu/eden/raw/branch/master/" + "dist/qt_themes/default/icons/256x256/eden_named.png"; if (system.IsPoweredOn()) { system.GetAppLoader().ReadTitle(game_title); // Used to format Icon URL for yuzu website game compatibility page std::string icon_name = GetGameString(game_title); - game_url = fmt::format("https://yuzu-emu.org/images/game/boxart/{}.png", icon_name); + game_url = fmt::format( + "https://raw.githubusercontent.com/eden-emulator/boxart/refs/heads/master/img/{}.png", + icon_name); QNetworkAccessManager manager; QNetworkRequest request; @@ -100,6 +103,7 @@ void DiscordImpl::Update() { QObject::connect(reply, &QNetworkReply::finished, &request_event_loop, &QEventLoop::quit); request_event_loop.exec(); UpdateGameStatus(reply->error()); + return; } diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 30a6886d73..ced89a6287 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -374,20 +374,36 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid warning_layout = new QHBoxLayout; pre_alpha_warning = new QLabel; pre_alpha_warning->setText( - tr("IMPORTANT: Eden is PRE-ALPHA SOFTWARE." + tr("IMPORTANT: Eden is PRE-ALPHA SOFTWARE. " "Bugs and unfinished features are expected to be present at this stage.")); pre_alpha_warning->setWordWrap(true); pre_alpha_warning->setOpenExternalLinks(true); pre_alpha_warning->setStyleSheet( QString::fromStdString("color: black; font-weight: bold;")); - warning_layout->addWidget(pre_alpha_warning); + warning_dont_show_again = new QPushButton(this); + warning_dont_show_again->setStyleSheet( + QString::fromStdString("color: #DFDFDF; background-color: #383838;")); + warning_dont_show_again->setText(tr("Don't Show Again")); + connect(warning_dont_show_again, &QPushButton::clicked, this, [=, this] { + Settings::values.hide_pre_alpha_warning.SetValue(true); + + layout->removeWidget(warning_widget); + warning_widget->hide(); + }); + + warning_layout->addWidget(pre_alpha_warning, 1); + warning_layout->addWidget(warning_dont_show_again); warning_layout->setContentsMargins(3, 3, 3, 3); warning_widget = new QWidget; warning_widget->setStyleSheet(QString::fromStdString("background-color: khaki;")); warning_widget->setLayout(warning_layout); - layout->addWidget(warning_widget); + if (!Settings::values.hide_pre_alpha_warning.GetValue()) { + layout->addWidget(warning_widget); + } else { + warning_widget->hide(); + } layout->addWidget(tree_view); layout->addWidget(search_field); diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h index d51110758a..a7f0201709 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game_list.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -172,8 +173,10 @@ private: QFileSystemWatcher* watcher = nullptr; ControllerNavigation* controller_navigation = nullptr; CompatibilityList compatibility_list; + QHBoxLayout* warning_layout = nullptr; QWidget* warning_widget = nullptr; + QPushButton* warning_dont_show_again = nullptr; QLabel* pre_alpha_warning = nullptr; friend class GameListSearchField; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 8cd20a452d..497c519f74 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -439,7 +439,7 @@ GMainWindow::GMainWindow(bool has_broken_vulkan) QMessageBox::warning(this, tr("Broken Vulkan Installation Detected"), tr("Vulkan initialization failed during boot.

Click " "here for instructions to fix the issue.")); @@ -1592,6 +1592,7 @@ void GMainWindow::ConnectMenuEvents() { // Help connect_menu(ui->action_Open_yuzu_Folder, &GMainWindow::OnOpenYuzuFolder); + connect_menu(ui->action_Discord, &GMainWindow::OnOpenDiscord); connect_menu(ui->action_Verify_installed_contents, &GMainWindow::OnVerifyInstalledContents); connect_menu(ui->action_Install_Firmware, &GMainWindow::OnInstallFirmware); connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys); @@ -1806,11 +1807,11 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa msg->setWindowTitle(tr("Game Updates Warning")); msg->setIcon(QMessageBox::Warning); msg->setText(tr("The game you are trying to launch is known to have performance or booting " - "issues when updates are applied. It's recommended to disable any updates " - "to this game before attempting to launch, or switch to an earlier update. " - "If you don't have any updates installed or enabled, you can safely ignore " - "this message.

Press \"OK\" to continue launching, or \"Cancel\" to " - "cancel the launch.")); + "issues when updates are applied. Please try increasing the memory layout to " + "6GB or 8GB if any issues occur.

Press \"OK\" to continue launching, or " + "\"Cancel\" to cancel the launch.")); + + // TODO: TMP: Recommends more memory for TotK. msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); @@ -1859,7 +1860,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa "outdated format that has been superseded by others such as NCA, NAX, XCI, or " "NSP. Deconstructed ROM directories lack icons, metadata, and update " "support.

For an explanation of the various Switch formats eden supports, check out our " + "href='https://eden-emulator.github.io/wiki/overview-of-switch-game-formats'>check out our " "wiki. This message will not be shown again.")); } @@ -1877,7 +1878,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa "This is usually caused by outdated GPU drivers, including integrated ones. " "Please see the log for more details. " "For more information on accessing the log, please see the following page: " - "" + "" "How to Upload the Log File. ")); break; default: @@ -2882,7 +2883,7 @@ void GMainWindow::OnGameListNavigateToGamedbEntry(u64 program_id, directory = it->second.second; } - QDesktopServices::openUrl(QUrl(QStringLiteral("https://yuzu-emu.org/game/") + directory)); + QDesktopServices::openUrl(QUrl(QStringLiteral("https://eden-emulator.github.io/game/") + directory)); } bool GMainWindow::CreateShortcutLink(const std::filesystem::path& shortcut_path, @@ -3040,8 +3041,8 @@ bool GMainWindow::MakeShortcutIcoPath(const u64 program_id, const std::string_vi } // Create icon file path - out_icon_path /= (program_id == 0 ? fmt::format("yuzu-{}.{}", game_file_name, ico_extension) - : fmt::format("yuzu-{:016X}.{}", program_id, ico_extension)); + out_icon_path /= (program_id == 0 ? fmt::format("eden-{}.{}", game_file_name, ico_extension) + : fmt::format("eden-{:016X}.{}", program_id, ico_extension)); return true; } @@ -3596,8 +3597,8 @@ void GMainWindow::OnMenuReportCompatibility() { } else { QMessageBox::critical( this, tr("Missing yuzu Account"), - tr("In order to submit a game compatibility test case, you must link your yuzu " - "account.

To link your yuzu account, go to Emulation > Configuration " + tr("In order to submit a game compatibility test case, you must link your eden " + "account.

To link your eden account, go to Emulation > Configuration " "> " "Web.")); } @@ -3621,11 +3622,16 @@ void GMainWindow::OnOpenModsPage() { } void GMainWindow::OnOpenQuickstartGuide() { - OpenURL(QUrl(QStringLiteral("https://yuzu-emu.org/help/quickstart/"))); + OpenURL(QUrl(QStringLiteral("https://yuzu-mirror.github.io/help/quickstart/"))); } void GMainWindow::OnOpenFAQ() { - OpenURL(QUrl(QStringLiteral("https://yuzu-emu.org/wiki/faq/"))); + OpenURL(QUrl(QStringLiteral("https://eden-emulator.github.io/"))); +} + +void GMainWindow::OnOpenDiscord() +{ + OpenURL(QUrl(QStringLiteral("https://discord.gg/edenemu"))); } void GMainWindow::ToggleFullscreen() { @@ -4199,7 +4205,7 @@ void GMainWindow::OnInstallFirmware() { if (!ContentManager::AreKeysPresent()) { QMessageBox::information( this, tr("Keys not installed"), - tr("Install decryption keys and restart yuzu before attempting to install firmware.")); + tr("Install decryption keys and restart eden before attempting to install firmware.")); return; } diff --git a/src/yuzu/main.h b/src/yuzu/main.h index a6e3bbaa6c..5afec3d199 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -338,6 +338,7 @@ private slots: void OnOpenModsPage(); void OnOpenQuickstartGuide(); void OnOpenFAQ(); + void OnOpenDiscord(); /// Called whenever a user selects a game in the game list widget. void OnGameListLoadFile(QString game_path, u64 program_id); void OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 03078c0126..fbecd9eee3 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -188,6 +188,7 @@ +
@@ -484,6 +485,11 @@ Open Home Menu
+ + + &Discord + + diff --git a/src/yuzu/migration_worker.cpp b/src/yuzu/migration_worker.cpp new file mode 100644 index 0000000000..2bb6eee944 --- /dev/null +++ b/src/yuzu/migration_worker.cpp @@ -0,0 +1,123 @@ +#include "migration_worker.h" + +#include + +#include "common/fs/path_util.h" + +MigrationWorker::MigrationWorker(const LegacyEmu selected_legacy_emu_, + const bool clear_shader_cache_, + const MigrationStrategy strategy_) + : QObject() + , selected_legacy_emu(selected_legacy_emu_) + , clear_shader_cache(clear_shader_cache_) + , strategy(strategy_) +{} + +void MigrationWorker::process() +{ + namespace fs = std::filesystem; + const auto copy_options = fs::copy_options::update_existing | fs::copy_options::recursive; + + std::string legacy_user_dir; + std::string legacy_config_dir; + std::string legacy_cache_dir; + +#define LEGACY_EMU(emu) \ + case LegacyEmu::emu: \ + legacy_user_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##Dir).string(); \ + legacy_config_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##ConfigDir) \ + .string(); \ + legacy_cache_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##CacheDir) \ + .string(); \ + break; + + switch (selected_legacy_emu) { + LEGACY_EMU(Citron) + LEGACY_EMU(Sudachi) + LEGACY_EMU(Yuzu) + LEGACY_EMU(Suyu) + } + +#undef LEGACY_EMU + + fs::path eden_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::EdenDir); + fs::path config_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir); + fs::path cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir); + fs::path shader_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + + try { + fs::remove_all(eden_dir); + } catch (fs::filesystem_error &_) { + // ignore because linux does stupid crap sometimes. + } + + switch (strategy) { + case MigrationStrategy::Link: + // Create symlinks/directory junctions if requested + + // Windows 11 has random permission nonsense to deal with. + try { + fs::create_directory_symlink(legacy_user_dir, eden_dir); + } catch (const fs::filesystem_error &e) { + emit error(tr("Linking the old directory failed. You may need to re-run with " + "administrative privileges on Windows.\nOS gave error: %1") + .arg(tr(e.what()))); + return; + } + +// Windows doesn't need any more links, because cache and config +// are already children of the root directory +#ifndef WIN32 + if (fs::is_directory(legacy_config_dir)) { + fs::create_directory_symlink(legacy_config_dir, config_dir); + } + + if (fs::is_directory(legacy_cache_dir)) { + fs::create_directory_symlink(legacy_cache_dir, cache_dir); + } +#endif + break; + case MigrationStrategy::Move: + // Rename directories if deletion is requested (achieves the same result) + fs::rename(legacy_user_dir, eden_dir); + +// Windows doesn't need any more renames, because cache and config +// are already children of the root directory +#ifndef WIN32 + if (fs::is_directory(legacy_config_dir)) { + fs::rename(legacy_config_dir, config_dir); + } + + if (fs::is_directory(legacy_cache_dir)) { + fs::rename(legacy_cache_dir, cache_dir); + } +#endif + break; + case MigrationStrategy::Copy: + default: + // Default behavior: copy + fs::copy(legacy_user_dir, eden_dir, copy_options); + + if (fs::is_directory(legacy_config_dir)) { + fs::copy(legacy_config_dir, config_dir, copy_options); + } + + if (fs::is_directory(legacy_cache_dir)) { + fs::copy(legacy_cache_dir, cache_dir, copy_options); + } + + success_text.append(tr("\n\nIf you wish to clean up the files which were left in the old " + "data location, you can do so by deleting the following directory:\n" + "%1") + .arg(QString::fromStdString(legacy_user_dir))); + break; + } + + // Delete and re-create shader dir + if (clear_shader_cache) { + fs::remove_all(shader_dir); + fs::create_directory(shader_dir); + } + + emit finished(success_text); +} diff --git a/src/yuzu/migration_worker.h b/src/yuzu/migration_worker.h new file mode 100644 index 0000000000..49bb695b32 --- /dev/null +++ b/src/yuzu/migration_worker.h @@ -0,0 +1,41 @@ +#ifndef MIGRATION_WORKER_H +#define MIGRATION_WORKER_H + +#include + +class MigrationWorker : public QObject +{ + Q_OBJECT +public: + enum class LegacyEmu { + Citron, + Sudachi, + Yuzu, + Suyu, + }; + + enum class MigrationStrategy { + Copy, + Move, + Link, + }; + + MigrationWorker(const LegacyEmu selected_legacy_emu, + const bool clear_shader_cache, + const MigrationStrategy strategy); + +public slots: + void process(); + +signals: + void finished(const QString &success_text); + void error(const QString &error_message); + +private: + LegacyEmu selected_legacy_emu; + bool clear_shader_cache; + MigrationStrategy strategy; + QString success_text = tr("Data was migrated successfully."); +}; + +#endif // MIGRATION_WORKER_H diff --git a/src/yuzu/multiplayer/host_room.cpp b/src/yuzu/multiplayer/host_room.cpp index ef364ee43a..09f783ad9f 100644 --- a/src/yuzu/multiplayer/host_room.cpp +++ b/src/yuzu/multiplayer/host_room.cpp @@ -58,7 +58,7 @@ HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, ui->username->setText( QString::fromStdString(UISettings::values.multiplayer_room_nickname.GetValue())); if (ui->username->text().isEmpty() && !Settings::values.yuzu_username.GetValue().empty()) { - // Use yuzu Web Service user name as nickname by default + // Use eden Web Service user name as nickname by default ui->username->setText(QString::fromStdString(Settings::values.yuzu_username.GetValue())); } ui->room_name->setText( @@ -184,7 +184,7 @@ void HostRoomWindow::Host() { QMessageBox::warning( this, tr("Error"), tr("Failed to announce the room to the public lobby. In order to host a " - "room publicly, you must have a valid yuzu account configured in " + "room publicly, you must have a valid eden account configured in " "Emulation -> Configure -> Web. If you do not want to publish a room in " "the public lobby, then select Unlisted instead.\nDebug Message: ") + QString::fromStdString(result.result_string), diff --git a/src/yuzu/user_data_migration.cpp b/src/yuzu/user_data_migration.cpp index 1946254fb2..1585695ff0 100644 --- a/src/yuzu/user_data_migration.cpp +++ b/src/yuzu/user_data_migration.cpp @@ -14,15 +14,17 @@ #include "migration_dialog.h" // Needs to be included at the end due to https://bugreports.qt.io/browse/QTBUG-73263 +#include #include #include +#include #include +#include #include namespace fs = std::filesystem; -UserDataMigrator::UserDataMigrator( - QMainWindow *main_window) +UserDataMigrator::UserDataMigrator(QMainWindow *main_window) { // NOTE: Logging is not initialized yet, do not produce logs here. @@ -34,8 +36,7 @@ UserDataMigrator::UserDataMigrator( } } -void UserDataMigrator::ShowMigrationPrompt( - QMainWindow *main_window) +void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) { namespace fs = std::filesystem; @@ -90,15 +91,15 @@ void UserDataMigrator::ShowMigrationPrompt( // Reflection would make this code 10x better // but for now... MACRO MADNESS!!!! QMap found; - QMap legacyMap; + QMap legacyMap; QMap buttonMap; #define EMU_MAP(name) \ const bool name##_found = fs::is_directory( \ Common::FS::GetLegacyPath(Common::FS::LegacyPath::name##Dir)); \ - legacyMap[main_window->tr(#name)] = LegacyEmu::name; \ - found[main_window->tr(#name)] = name##_found; \ - if (name##_found) \ + legacyMap[main_window->tr(#name)] = MigrationWorker::LegacyEmu::name; \ + found[main_window->tr(#name)] = name##_found; \ + if (name##_found) \ any_found = true; EMU_MAP(Citron) @@ -118,7 +119,15 @@ void UserDataMigrator::ShowMigrationPrompt( if (!iter.value()) continue; - buttonMap[iter.key()] = migration_prompt.addButton(iter.key()); + QAbstractButton *button = migration_prompt.addButton(iter.key()); + // TMP: disable citron + if (iter.key() == main_window->tr("Citron")) { + button->setEnabled(false); + button->setToolTip( + main_window->tr("Citron migration is known to cause issues. It's recommended " + "to manually set up your data again.")); + } + buttonMap[iter.key()] = button; promptText.append(main_window->tr("\n- %1").arg(iter.key())); } @@ -129,13 +138,13 @@ void UserDataMigrator::ShowMigrationPrompt( migration_prompt.exec(); - MigrationStrategy strategy; + MigrationWorker::MigrationStrategy strategy; if (link->isChecked()) { - strategy = MigrationStrategy::Link; + strategy = MigrationWorker::MigrationStrategy::Link; } else if (clear_old->isChecked()) { - strategy = MigrationStrategy::Move; + strategy = MigrationWorker::MigrationStrategy::Move; } else { - strategy = MigrationStrategy::Copy; + strategy = MigrationWorker::MigrationStrategy::Copy; } QMapIterator buttonIter(buttonMap); @@ -159,8 +168,7 @@ void UserDataMigrator::ShowMigrationPrompt( return; } -void UserDataMigrator::ShowMigrationCancelledMessage( - QMainWindow *main_window) +void UserDataMigrator::ShowMigrationCancelledMessage(QMainWindow *main_window) { QMessageBox::information(main_window, main_window->tr("Migration"), @@ -173,107 +181,38 @@ void UserDataMigrator::ShowMigrationCancelledMessage( QMessageBox::Ok); } -void UserDataMigrator::MigrateUserData( - QMainWindow *main_window, - const LegacyEmu selected_legacy_emu, - const bool clear_shader_cache, - const MigrationStrategy strategy) +void UserDataMigrator::MigrateUserData(QMainWindow *main_window, + const MigrationWorker::LegacyEmu selected_legacy_emu, + const bool clear_shader_cache, + const MigrationWorker::MigrationStrategy strategy) { - namespace fs = std::filesystem; - const auto copy_options = fs::copy_options::update_existing | fs::copy_options::recursive; + // Create a dialog to let the user know it's migrating, some users noted confusion. + QProgressDialog *progress = new QProgressDialog(main_window); + progress->setWindowTitle(main_window->tr("Migrating")); + progress->setLabelText(main_window->tr("Migrating, this may take a while...")); + progress->setRange(0, 0); + progress->setCancelButton(nullptr); + progress->setWindowModality(Qt::WindowModality::ApplicationModal); - QString success_text = main_window->tr("Data was migrated successfully."); + QThread *thread = new QThread(main_window); + MigrationWorker *worker = new MigrationWorker(selected_legacy_emu, clear_shader_cache, strategy); + worker->moveToThread(thread); - std::string legacy_user_dir; - std::string legacy_config_dir; - std::string legacy_cache_dir; + thread->connect(thread, &QThread::started, worker, &MigrationWorker::process); -#define LEGACY_EMU(emu) \ -case LegacyEmu::emu: \ - legacy_user_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##Dir).string(); \ - legacy_config_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##ConfigDir) \ - .string(); \ - legacy_cache_dir = Common::FS::GetLegacyPath(Common::FS::LegacyPath::emu##CacheDir) \ - .string(); \ - break; + thread->connect(worker, &MigrationWorker::finished, progress, [=](const QString &success_text) { + progress->close(); + QMessageBox::information(main_window, + main_window->tr("Migration"), + success_text, + QMessageBox::Ok); - switch (selected_legacy_emu) { - LEGACY_EMU(Citron) - LEGACY_EMU(Sudachi) - LEGACY_EMU(Yuzu) - LEGACY_EMU(Suyu) - } + thread->quit(); + }); -#undef LEGACY_EMU + thread->connect(worker, &MigrationWorker::finished, worker, &QObject::deleteLater); + thread->connect(thread, &QThread::finished, thread, &QObject::deleteLater); - fs::path eden_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::EdenDir); - fs::path config_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir); - fs::path cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir); - fs::path shader_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); - - fs::remove_all(eden_dir); - - switch (strategy) { - case MigrationStrategy::Link: - // Create symlinks/directory junctions if requested - fs::create_directory_symlink(legacy_user_dir, eden_dir); - -// Windows doesn't need any more links, because cache and config -// are already children of the root directory -#ifndef WIN32 - if (fs::is_directory(legacy_config_dir)) { - fs::create_directory_symlink(legacy_config_dir, config_dir); - } - - if (fs::is_directory(legacy_cache_dir)) { - fs::create_directory_symlink(legacy_cache_dir, cache_dir); - } -#endif - break; - case MigrationStrategy::Move: - // Rename directories if deletion is requested (achieves the same result) - fs::rename(legacy_user_dir, eden_dir); - -// Windows doesn't need any more renames, because cache and config -// are already children of the root directory -#ifndef WIN32 - if (fs::is_directory(legacy_config_dir)) { - fs::rename(legacy_config_dir, config_dir); - } - - if (fs::is_directory(legacy_cache_dir)) { - fs::rename(legacy_cache_dir, cache_dir); - } -#endif - break; - case MigrationStrategy::Copy: - default: - // Default behavior: copy - fs::copy(legacy_user_dir, eden_dir, copy_options); - - if (fs::is_directory(legacy_config_dir)) { - fs::copy(legacy_config_dir, config_dir, copy_options); - } - - if (fs::is_directory(legacy_cache_dir)) { - fs::copy(legacy_cache_dir, cache_dir, copy_options); - } - - success_text.append( - main_window->tr("\n\nIf you wish to clean up the files which were left in the old " - "data location, you can do so by deleting the following directory:\n" - "%1").arg(QString::fromStdString(legacy_user_dir))); - break; - } - - // Delete and re-create shader dir - if (clear_shader_cache) { - fs::remove_all(shader_dir); - fs::create_directory(shader_dir); - } - - QMessageBox::information(main_window, - main_window->tr("Migration"), - success_text, - QMessageBox::Ok); + thread->start(); + progress->exec(); } diff --git a/src/yuzu/user_data_migration.h b/src/yuzu/user_data_migration.h index 3c4f745b87..fbf76eb334 100644 --- a/src/yuzu/user_data_migration.h +++ b/src/yuzu/user_data_migration.h @@ -8,27 +8,17 @@ #pragma once #include +#include "migration_worker.h" class UserDataMigrator { public: UserDataMigrator(QMainWindow* main_window); private: - enum class LegacyEmu { - Citron, - Sudachi, - Yuzu, - Suyu, - }; - - enum class MigrationStrategy { - Copy, - Move, - Link, - }; - void ShowMigrationPrompt(QMainWindow* main_window); void ShowMigrationCancelledMessage(QMainWindow* main_window); - void MigrateUserData(QMainWindow* main_window, const LegacyEmu selected_legacy_emu, - const bool clear_shader_cache, const MigrationStrategy strategy); + void MigrateUserData(QMainWindow* main_window, + const MigrationWorker::LegacyEmu selected_legacy_emu, + const bool clear_shader_cache, + const MigrationWorker::MigrationStrategy strategy); }; diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp index eae614f9d0..3974e4b357 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp @@ -223,10 +223,12 @@ void EmuWindow_SDL2::WaitEvent() { const u32 current_time = SDL_GetTicks(); if (current_time > last_time + 2000) { const auto results = system.GetAndResetPerfStats(); - const auto title = - fmt::format("yuzu {} | {}-{} | FPS: {:.0f} ({:.0f}%)", Common::g_build_fullname, - Common::g_scm_branch, Common::g_scm_desc, results.average_game_fps, - results.emulation_speed * 100.0); + const auto title = fmt::format("eden {} | {}-{} | FPS: {:.0f} ({:.0f}%)", + Common::g_build_fullname, + Common::g_scm_branch, + Common::g_scm_desc, + results.average_game_fps, + results.emulation_speed * 100.0); SDL_SetWindowTitle(render_window, title.c_str()); last_time = current_time; } @@ -236,7 +238,7 @@ void EmuWindow_SDL2::WaitEvent() { void EmuWindow_SDL2::SetWindowIcon() { SDL_RWops* const yuzu_icon_stream = SDL_RWFromConstMem((void*)yuzu_icon, yuzu_icon_size); if (yuzu_icon_stream == nullptr) { - LOG_WARNING(Frontend, "Failed to create yuzu icon stream."); + LOG_WARNING(Frontend, "Failed to create eden icon stream."); return; } SDL_Surface* const window_icon = SDL_LoadBMP_RW(yuzu_icon_stream, 1); diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp index 35e8aeda79..2e90be35ae 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp @@ -90,7 +90,7 @@ EmuWindow_SDL2_GL::EmuWindow_SDL2_GL(InputCommon::InputSubsystem* input_subsyste } SDL_GL_SetSwapInterval(0); - std::string window_title = fmt::format("yuzu {} | {}-{}", Common::g_build_fullname, + std::string window_title = fmt::format("eden {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc); render_window = SDL_CreateWindow(window_title.c_str(), diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp index a969c1c291..043cdbf68d 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp @@ -23,7 +23,7 @@ EmuWindow_SDL2_Null::EmuWindow_SDL2_Null(InputCommon::InputSubsystem* input_subsystem_, Core::System& system_, bool fullscreen) : EmuWindow_SDL2{input_subsystem_, system_} { - const std::string window_title = fmt::format("yuzu {} | {}-{} (Vulkan)", Common::g_build_name, + const std::string window_title = fmt::format("eden {} | {}-{} (Vulkan)", Common::g_build_name, Common::g_scm_branch, Common::g_scm_desc); render_window = SDL_CreateWindow(window_title.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp index c8378a5179..f4980932ed 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp @@ -18,8 +18,10 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(InputCommon::InputSubsystem* input_subsystem_, Core::System& system_, bool fullscreen) : EmuWindow_SDL2{input_subsystem_, system_} { - const std::string window_title = fmt::format("yuzu {} | {}-{} (Vulkan)", Common::g_build_name, - Common::g_scm_branch, Common::g_scm_desc); + const std::string window_title = fmt::format("eden {} | {}-{} (Vulkan)", + Common::g_build_name, + Common::g_scm_branch, + Common::g_scm_desc); render_window = SDL_CreateWindow(window_title.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, Layout::ScreenUndocked::Width, Layout::ScreenUndocked::Height, diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 790d630aad..35dc58e4e9 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -81,7 +81,7 @@ static void PrintHelp(const char* argv0) { } static void PrintVersion() { - std::cout << "yuzu " << Common::g_scm_branch << " " << Common::g_scm_desc << std::endl; + std::cout << "eden " << Common::g_scm_branch << " " << Common::g_scm_desc << std::endl; } static void OnStateChanged(const Network::RoomMember::State& state) { @@ -394,9 +394,11 @@ int main(int argc, char** argv) { const u16 error_id = static_cast(load_result) - loader_id; LOG_CRITICAL(Frontend, "While attempting to load the ROM requested, an error occurred. Please " - "refer to the yuzu wiki for more information or the yuzu discord for " + "refer to the eden wiki for more information or the eden discord for " "additional help.\n\nError Code: {:04X}-{:04X}\nError Description: {}", - loader_id, error_id, static_cast(error_id)); + loader_id, + error_id, + static_cast(error_id)); } break; }