diff options
42 files changed, 416 insertions, 297 deletions
| diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt index 22af9e435..4be9ade14 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt @@ -227,6 +227,8 @@ object NativeLibrary {      external fun setAppDirectory(directory: String) +    external fun installFileToNand(filename: String): Int +      external fun initializeGpuDriver(          hookLibDir: String?,          customDriverDir: String?, @@ -507,4 +509,15 @@ object NativeLibrary {          const val RELEASED = 0          const val PRESSED = 1      } + +    /** +     * Result from installFileToNand +     */ +    object InstallFileToNandResult { +        const val Success = 0 +        const val SuccessFileOverwritten = 1 +        const val Error = 2 +        const val ErrorBaseGame = 3 +        const val ErrorFilenameExtension = 4 +    }  } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt index c5722a5a1..fa84f94f5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt @@ -26,13 +26,18 @@ enum class IntSetting(      RENDERER_FORCE_MAX_CLOCK(          "force_max_clock",          Settings.SECTION_RENDERER, -        1 +        0      ),      RENDERER_ASYNCHRONOUS_SHADERS(          "use_asynchronous_shaders",          Settings.SECTION_RENDERER,          0      ), +    RENDERER_REACTIVE_FLUSHING( +        "use_reactive_flushing", +        Settings.SECTION_RENDERER, +        0 +    ),      RENDERER_DEBUG(          "debug",          Settings.SECTION_RENDERER, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 061046b2e..1ceaa6fb4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -321,6 +321,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)                      IntSetting.RENDERER_ASYNCHRONOUS_SHADERS.defaultValue                  )              ) +            add( +                SwitchSetting( +                    IntSetting.RENDERER_REACTIVE_FLUSHING, +                    R.string.renderer_reactive_flushing, +                    R.string.renderer_reactive_flushing_description, +                    IntSetting.RENDERER_REACTIVE_FLUSHING.key, +                    IntSetting.RENDERER_REACTIVE_FLUSHING.defaultValue +                ) +            )          }      } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt index bdc337501..536163eb6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt @@ -95,6 +95,11 @@ class HomeSettingsFragment : Fragment() {                  R.drawable.ic_nfc              ) { mainActivity.getAmiiboKey.launch(arrayOf("*/*")) },              HomeSetting( +                R.string.install_game_content, +                R.string.install_game_content_description, +                R.drawable.ic_system_update_alt +            ) { mainActivity.installGameUpdate.launch(arrayOf("*/*")) }, +            HomeSetting(                  R.string.select_games_folder,                  R.string.select_games_folder_description,                  R.drawable.ic_add @@ -103,7 +108,12 @@ class HomeSettingsFragment : Fragment() {                  R.string.manage_save_data,                  R.string.import_export_saves_description,                  R.drawable.ic_save -            ) { ImportExportSavesFragment().show(parentFragmentManager, ImportExportSavesFragment.TAG) }, +            ) { +                ImportExportSavesFragment().show( +                    parentFragmentManager, +                    ImportExportSavesFragment.TAG +                ) +            },              HomeSetting(                  R.string.install_prod_keys,                  R.string.install_prod_keys_description, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 3fca0a7e6..041d16f3a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -467,4 +467,62 @@ class MainActivity : AppCompatActivity(), ThemeProvider {                  }              }          } + +    val installGameUpdate = +        registerForActivityResult(ActivityResultContracts.OpenDocument()) { +            if (it == null) +                return@registerForActivityResult + +            IndeterminateProgressDialogFragment.newInstance( +                this@MainActivity, +                R.string.install_game_content +            ) { +                val result = NativeLibrary.installFileToNand(it.toString()) +                lifecycleScope.launch { +                    withContext(Dispatchers.Main) { +                        when (result) { +                            NativeLibrary.InstallFileToNandResult.Success -> { +                                Toast.makeText( +                                    applicationContext, +                                    R.string.install_game_content_success, +                                    Toast.LENGTH_SHORT +                                ).show() +                            } + +                            NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> { +                                Toast.makeText( +                                    applicationContext, +                                    R.string.install_game_content_success_overwrite, +                                    Toast.LENGTH_SHORT +                                ).show() +                            } + +                            NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> { +                                MessageDialogFragment.newInstance( +                                    R.string.install_game_content_failure, +                                    R.string.install_game_content_failure_base +                                ).show(supportFragmentManager, MessageDialogFragment.TAG) +                            } + +                            NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> { +                                MessageDialogFragment.newInstance( +                                    R.string.install_game_content_failure, +                                    R.string.install_game_content_failure_file_extension, +                                    R.string.install_game_content_help_link +                                ).show(supportFragmentManager, MessageDialogFragment.TAG) +                            } + +                            else -> { +                                MessageDialogFragment.newInstance( +                                    R.string.install_game_content_failure, +                                    R.string.install_game_content_failure_description, +                                    R.string.install_game_content_help_link +                                ).show(supportFragmentManager, MessageDialogFragment.TAG) +                            } +                        } +                    } +                } +                return@newInstance result +            }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) +        }  } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt index c8ef8c1fd..d89a89983 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt @@ -38,9 +38,11 @@ class FixedRatioSurfaceView @JvmOverloads constructor(                  newWidth = width                  newHeight = (width / aspectRatio).roundToInt()              } -            setMeasuredDimension(newWidth, newHeight) +            val left = (width - newWidth) / 2; +            val top = (height - newHeight) / 2; +            setLeftTopRightBottom(left, top, left + newWidth, top + newHeight)          } else { -            setMeasuredDimension(width, height) +            setLeftTopRightBottom(0, 0, width, height)          }      }  } diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index 2d622a048..43e8aa72a 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -235,9 +235,13 @@ void Config::ReadValues() {      Settings::values.async_presentation =          config->GetBoolean("Renderer", "async_presentation", true); -    // Enable force_max_clock by default on Android +    // Disable force_max_clock by default on Android      Settings::values.renderer_force_max_clock = -        config->GetBoolean("Renderer", "force_max_clock", true); +        config->GetBoolean("Renderer", "force_max_clock", false); + +    // Disable use_reactive_flushing by default on Android +    Settings::values.use_reactive_flushing = +        config->GetBoolean("Renderer", "use_reactive_flushing", false);      // Audio      ReadSetting("Audio", Settings::values.sink_id); diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index c5dfaff54..d81422a74 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -251,7 +251,7 @@ backend =  # 0: Off, 1 (default): On  async_presentation = -# Enable graphics API debugging mode. +# Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).  # 0 (default): Disabled, 1: Enabled  force_max_clock = @@ -328,6 +328,10 @@ shader_backend =  # 0 (default): Off, 1: On  use_asynchronous_shaders = +# Uses reactive flushing instead of predictive flushing. Allowing a more accurate syncing of memory. +# 0 (default): Off, 1: On +use_reactive_flushing = +  # NVDEC emulation.  # 0: Disabled, 1: CPU Decoding, 2 (default): GPU Decoding  nvdec_emulation = diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 7ebed5e6a..4091c23d1 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -28,7 +28,10 @@  #include "core/core.h"  #include "core/cpu_manager.h"  #include "core/crypto/key_manager.h" +#include "core/file_sys/card_image.h"  #include "core/file_sys/registered_cache.h" +#include "core/file_sys/submission_package.h" +#include "core/file_sys/vfs.h"  #include "core/file_sys/vfs_real.h"  #include "core/frontend/applets/cabinet.h"  #include "core/frontend/applets/controller.h" @@ -94,6 +97,74 @@ public:          m_native_window = native_window;      } +    int InstallFileToNand(std::string filename) { +        const auto copy_func = [](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest, +                                  std::size_t block_size) { +            if (src == nullptr || dest == nullptr) { +                return false; +            } +            if (!dest->Resize(src->GetSize())) { +                return false; +            } + +            using namespace Common::Literals; +            std::vector<u8> buffer(1_MiB); + +            for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) { +                const auto read = src->Read(buffer.data(), buffer.size(), i); +                dest->Write(buffer.data(), read, i); +            } +            return true; +        }; + +        enum InstallResult { +            Success = 0, +            SuccessFileOverwritten = 1, +            InstallError = 2, +            ErrorBaseGame = 3, +            ErrorFilenameExtension = 4, +        }; + +        m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); +        m_system.GetFileSystemController().CreateFactories(*m_vfs); + +        std::shared_ptr<FileSys::NSP> nsp; +        if (filename.ends_with("nsp")) { +            nsp = std::make_shared<FileSys::NSP>(m_vfs->OpenFile(filename, FileSys::Mode::Read)); +            if (nsp->IsExtractedType()) { +                return InstallError; +            } +        } else if (filename.ends_with("xci")) { +            const auto xci = +                std::make_shared<FileSys::XCI>(m_vfs->OpenFile(filename, FileSys::Mode::Read)); +            nsp = xci->GetSecurePartitionNSP(); +        } else { +            return ErrorFilenameExtension; +        } + +        if (!nsp) { +            return InstallError; +        } + +        if (nsp->GetStatus() != Loader::ResultStatus::Success) { +            return InstallError; +        } + +        const auto res = m_system.GetFileSystemController().GetUserNANDContents()->InstallEntry( +            *nsp, true, copy_func); + +        switch (res) { +        case FileSys::InstallResult::Success: +            return Success; +        case FileSys::InstallResult::OverwriteExisting: +            return SuccessFileOverwritten; +        case FileSys::InstallResult::ErrorBaseInstall: +            return ErrorBaseGame; +        default: +            return InstallError; +        } +    } +      void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir,                               const std::string& custom_driver_name,                               const std::string& file_redirect_dir) { @@ -154,14 +225,14 @@ public:          m_window = std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window,                                                         m_vulkan_library); +        m_system.SetFilesystem(m_vfs); +          // Initialize system.          auto android_keyboard = std::make_unique<SoftwareKeyboard::AndroidKeyboard>();          m_software_keyboard = android_keyboard.get();          m_system.SetShuttingDown(false);          m_system.ApplySettings();          m_system.HIDCore().ReloadInputDevices(); -        m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); -        m_system.SetFilesystem(std::make_shared<FileSys::RealVfsFilesystem>());          m_system.SetAppletFrontendSet({              nullptr,                     // Amiibo Settings              nullptr,                     // Controller Selector @@ -173,7 +244,8 @@ public:              std::move(android_keyboard), // Software Keyboard              nullptr,                     // Web Browser          }); -        m_system.GetFileSystemController().CreateFactories(*m_system.GetFilesystem()); +        m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); +        m_system.GetFileSystemController().CreateFactories(*m_vfs);          // Initialize account manager          m_profile_manager = std::make_unique<Service::Account::ProfileManager>(); @@ -398,7 +470,7 @@ private:      InputCommon::InputSubsystem m_input_subsystem;      Common::DetachedTasks m_detached_tasks;      Core::PerfStatsResults m_perf_stats{}; -    std::shared_ptr<FileSys::RealVfsFilesystem> m_vfs; +    std::shared_ptr<FileSys::VfsFilesystem> m_vfs;      Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized};      bool m_is_running{};      SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; @@ -466,6 +538,12 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env,      Common::FS::SetAppDirectory(GetJString(env, j_directory));  } +int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, +                                                            [[maybe_unused]] jclass clazz, +                                                            jstring j_file) { +    return EmulationSession::GetInstance().InstallFileToNand(GetJString(env, j_file)); +} +  void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver(      JNIEnv* env, [[maybe_unused]] jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir,      jstring custom_driver_name, jstring file_redirect_dir) { diff --git a/src/android/app/src/main/res/drawable/ic_system_update_alt.xml b/src/android/app/src/main/res/drawable/ic_system_update_alt.xml new file mode 100644 index 000000000..0f6adfdb8 --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_system_update_alt.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" +    android:width="48dp" +    android:height="48dp" +    android:viewportWidth="960" +    android:viewportHeight="960"> +  <path +      android:fillColor="#FF000000" +      android:pathData="M140,800q-24,0 -42,-18t-18,-42v-520q0,-24 18,-42t42,-18h250v60L140,220v520h680v-520L570,220v-60h250q24,0 42,18t18,42v520q0,24 -18,42t-42,18L140,800ZM480,615L280,415l43,-43 127,127v-339h60v339l127,-127 43,43 -200,200Z"/> +</vector> 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 795320e3e..969223ef8 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -176,7 +176,6 @@      <string name="installing_driver">Treiber wird installiert...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Erweiterte Einstellungen</string>      <string name="preferences_settings">Einstellungen</string>      <string name="preferences_general">Allgemein</string>      <string name="preferences_system">System</string> @@ -228,7 +227,6 @@      <string name="performance_warning">Das Deaktivieren dieser Einstellung führt zu erheblichen Leistungsverlusten! Für ein optimales Erlebnis wird empfohlen, sie aktiviert zu lassen.</string>      <!-- Region Names --> -    <string name="region_auto">Automatisch auswählen</string>      <string name="region_japan">Japan</string>      <string name="region_usa">USA</string>      <string name="region_europe">Europa</string> @@ -301,7 +299,6 @@      <string name="ratio_stretch">Auf Fenster anpassen</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Auto</string>      <string name="cpu_accuracy_accurate">Akkurat</string>      <string name="cpu_accuracy_unsafe">Unsicher</string>      <string name="cpu_accuracy_paranoid">Paranoid (Langsam)</string> 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 a7b4ebef4..986e80e50 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Archivo de claves inválido seleccionado</string>      <string name="install_keys_success">Claves instaladas correctamente</string>      <string name="reading_keys_failure">Error al leer las claves de cifrado</string> -    <string name="install_keys_failure_extension_description"> -        1. Verifique que sus claves acaben con la extensión .keys.\n\n -        2. Las claves no deben de estar almacenadas en la carpeta Descargas.\n\n -        Resuelva el/los problema(s) y vuelva a intentarlo. -    </string>      <string name="invalid_keys_error">Claves de cifrado no válidas</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">Instalando driver...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Configuración avanzada</string>      <string name="preferences_settings">Ajustes</string>      <string name="preferences_general">General</string>      <string name="preferences_system">Sistema</string> @@ -238,7 +232,6 @@      <string name="performance_warning">¡Desactivar esta configuración reducirá significativamente el rendimiento de la emulación!  Para obtener la mejor experiencia, se recomienda dejar esta configuración habilitada.</string>      <!-- Region Names --> -    <string name="region_auto">Auto seleccionar</string>      <string name="region_japan">Japón</string>      <string name="region_usa">EEUU</string>      <string name="region_europe">Europa</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Ajustar a la ventana</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Auto</string>      <string name="cpu_accuracy_accurate">Preciso</string>      <string name="cpu_accuracy_unsafe">Impreciso</string>      <string name="cpu_accuracy_paranoid">Paranoico (Lento)</string> 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 905ab5c03..14a9b2d5c 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Fichier de clés sélectionné invalide</string>      <string name="install_keys_success">Clés installées avec succès</string>      <string name="reading_keys_failure">Erreur lors de la lecture des clés de chiffrement</string> -    <string name="install_keys_failure_extension_description"> -        1. Vérifiez que vos clés ont l\'extension .keys.\n\n -        2. Les clés ne doivent pas être stockées dans le      dossier Téléchargements.\n\n -        Résolvez le(s) problème(s) et réessayez. -    </string>      <string name="invalid_keys_error">Clés de chiffrement invalides</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">Installation du pilote...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Paramètres avancés</string>      <string name="preferences_settings">Paramètres</string>      <string name="preferences_general">Général</string>      <string name="preferences_system">Système</string> @@ -238,7 +232,6 @@      <string name="performance_warning">La désactivation de ce paramètre réduira considérablement les performances d\'émulation ! Pour une expérience optimale, il est recommandé de laisser ce paramètre activé.</string>      <!-- Region Names --> -    <string name="region_auto">Sélection automatique</string>      <string name="region_japan">Japon</string>      <string name="region_usa">É.-U.A.</string>      <string name="region_europe">Europe</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Étirer à la fenêtre</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Auto</string>      <string name="cpu_accuracy_accurate">Précis</string>      <string name="cpu_accuracy_unsafe">Risqué</string>      <string name="cpu_accuracy_paranoid">Paranoïaque (Lent)</string> 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 fede49650..47a4cfa31 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -61,10 +61,6 @@      <string name="invalid_keys_file">Selezionate chiavi non valide</string>      <string name="install_keys_success">Chiavi installate correttamente</string>      <string name="reading_keys_failure">Errore durante la lettura delle chiavi di crittografia</string> -    <string name="install_keys_failure_extension_description"> -1. Verifica che le tue chiavi abbiano l\'estensione .keys.\n\n -2. Le chiavi non devono essere archiviate nella cartella Download.\n\n -Risolvi i problemi e riprova.</string>      <string name="invalid_keys_error">Chiavi di crittografia non valide</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string> @@ -183,7 +179,6 @@ Risolvi i problemi e riprova.</string>      <string name="installing_driver">Installando i driver...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Impostazioni Avanzate</string>      <string name="preferences_settings">Impostazioni</string>      <string name="preferences_general">Generali</string>      <string name="preferences_system">Sistema</string> @@ -237,7 +232,6 @@ Risolvi i problemi e riprova.</string>      <string name="performance_warning">Disattivare questa impostazione può ridurre significativamente le performance di emulazione! Per una migliore esperienza, è consigliato lasciare questa impostazione attivata.</string>      <!-- Region Names --> -    <string name="region_auto">Selezione automatica</string>      <string name="region_japan">Giappone</string>      <string name="region_usa">USA</string>      <string name="region_europe">Europa</string> @@ -310,7 +304,6 @@ Risolvi i problemi e riprova.</string>      <string name="ratio_stretch">Allunga a finestra</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Automatico</string>      <string name="cpu_accuracy_accurate">Accurata</string>      <string name="cpu_accuracy_unsafe">Non sicura</string>      <string name="cpu_accuracy_paranoid">Paranoico (Lento)</string> 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 4a649778e..46eda9ef7 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -60,11 +60,6 @@      <string name="invalid_keys_file">無効なキーファイルが選択されました</string>      <string name="install_keys_success">正常にインストールされました</string>      <string name="reading_keys_failure">暗号化キーの読み取りエラー</string> -    <string name="install_keys_failure_extension_description"> -        1. キーの拡張子が .keys であることを確認します。\n\n -        2. キーはダウンロードフォルダに保存しないでください。\n\n -        問題を解決して、再度お試しください。 -    </string>      <string name="invalid_keys_error">暗号化キーが無効です</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">選択されたファイルが不正または破損しています。キーを再ダンプしてください。</string> @@ -183,7 +178,6 @@      <string name="installing_driver">インストール中…</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">詳細設定</string>      <string name="preferences_settings">設定</string>      <string name="preferences_general">全般</string>      <string name="preferences_system">システム</string> @@ -236,7 +230,6 @@      <string name="performance_warning">この設定をオフにすると、エミュレーションのパフォーマンスが著しく低下します!最高の体験を得るためには、この設定を有効にしておくことをお勧めします。</string>      <!-- Region Names --> -    <string name="region_auto">自動選択</string>      <string name="region_japan">日本</string>      <string name="region_usa">アメリカ</string>      <string name="region_europe">ヨーロッパ</string> @@ -309,7 +302,6 @@      <string name="ratio_stretch">ウィンドウに合わせる</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">自動</string>      <string name="cpu_accuracy_accurate">正確</string>      <string name="cpu_accuracy_unsafe">不安定</string>      <string name="cpu_accuracy_paranoid">パラノイド (低速)</string> 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 43b00ebc4..5da80ab4b 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -61,11 +61,6 @@      <string name="invalid_keys_file">잘못된 keys 파일 선택</string>      <string name="install_keys_success">keys가 성공적으로 설치됨</string>      <string name="reading_keys_failure">암호화 keys 읽기 오류</string> -    <string name="install_keys_failure_extension_description"> -1. keys의 확장자가 .keys인지 확인하세요.\n\n -2. keys는 다운로드 폴더에 저장하면 안 됩니다.\n\n -문제를 해결하고 다시 시도하세요. -</string>      <string name="invalid_keys_error">잘못된 암호화 keys</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">선택한 파일이 잘못되었거나 손상되었습니다. keys를 다시 덤프하세요.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">드라이버 설치 중...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">고급 설정</string>      <string name="preferences_settings">설정</string>      <string name="preferences_general">일반</string>      <string name="preferences_system">시스템</string> @@ -238,7 +232,6 @@      <string name="performance_warning">이 설정을 끄면 에뮬레이션 성능이 크게 저하됩니다! 최상의 환경을 위해 이 설정을 활성화된 상태로 두는 것이 좋습니다.</string>      <!-- Region Names --> -    <string name="region_auto">자동 선택</string>      <string name="region_japan">일본</string>      <string name="region_usa">미국</string>      <string name="region_europe">유럽</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">창에 맞게 늘림</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">자동</string>      <string name="cpu_accuracy_accurate">정확함</string>      <string name="cpu_accuracy_unsafe">안전하지 않음</string>      <string name="cpu_accuracy_paranoid">편집증 (느림)</string> 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 80213aed4..3e1f9bce5 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Ugyldig nøkkelfil valgt</string>      <string name="install_keys_success">Nøkler vellykket installert</string>      <string name="reading_keys_failure">Feil ved lesing av krypteringsnøkler</string> -    <string name="install_keys_failure_extension_description"> -        1. Kontroller at nøklene har filtypen .keys.\n\n -        2. Nøkler må ikke lagres i nedlastingsmappen.\n\n -        Løs problemet/problemene og prøv igjen. -    </string>      <string name="invalid_keys_error">Ugyldige krypteringsnøkler</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">Den valgte filen er feil eller ødelagt. Vennligst dump nøklene på nytt.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">Installerer driver...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Avanserte innstillinger</string>      <string name="preferences_settings">Innstillinger</string>      <string name="preferences_general">Generelt</string>      <string name="preferences_system">System</string> @@ -238,7 +232,6 @@      <string name="performance_warning">Hvis du slår av denne innstillingen, reduseres emuleringsytelsen betydelig! Vi anbefaler at du lar denne innstillingen være aktivert for å få den beste opplevelsen.</string>      <!-- Region Names --> -    <string name="region_auto">Automatisk valg</string>      <string name="region_japan">Japan</string>      <string name="region_usa">USA</string>      <string name="region_europe">Europa</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Strekk til Vindu</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Auto</string>      <string name="cpu_accuracy_accurate">Nøyaktig</string>      <string name="cpu_accuracy_unsafe">Utrygt</string>      <string name="cpu_accuracy_paranoid">Paranoid (Langsom)</string> 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 fc9f49e0e..1cd1a8f87 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -61,10 +61,6 @@      <string name="invalid_keys_file">Wybrano niepoprawne klucze</string>      <string name="install_keys_success">Klucze zainstalowane pomyślnie</string>      <string name="reading_keys_failure">Błąd podczas odczytu kluczy</string> -    <string name="install_keys_failure_extension_description"> -1. Upewnij się że klucze mają rozszerzenie .keys. \n\n -2. Klucze nie mogą znajdować się w folderze Pobrane. \n\n -Rozwiąż te problemy (oba) i spróbuj ponownie.</string>      <string name="invalid_keys_error">Niepoprawne klucze</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">Wybrany plik jest niepoprawny lub uszkodzony. Zrzuć ponownie swoje klucze.</string> @@ -183,7 +179,6 @@ Rozwiąż te problemy (oba) i spróbuj ponownie.</string>      <string name="installing_driver">Instalowanie sterownika...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Zaawansowane</string>      <string name="preferences_settings">Ustawienia</string>      <string name="preferences_general">Ogólne</string>      <string name="preferences_system">System</string> @@ -237,7 +232,6 @@ Rozwiąż te problemy (oba) i spróbuj ponownie.</string>      <string name="performance_warning">Wyłączenie tej opcji znacząco ograniczy wydajność! Dla najlepszego doświadczenia, zaleca się zostawienie tej opcji włączonej.</string>      <!-- Region Names --> -    <string name="region_auto">Auto-wybór</string>      <string name="region_japan">Japonia</string>      <string name="region_usa">USA</string>      <string name="region_europe">Europa</string> @@ -310,7 +304,6 @@ Rozwiąż te problemy (oba) i spróbuj ponownie.</string>      <string name="ratio_stretch">Rozciągnij do Okna</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Automatyczny</string>      <string name="cpu_accuracy_accurate">Dokładny</string>      <string name="cpu_accuracy_unsafe">Niebezpieczny</string>      <string name="cpu_accuracy_paranoid">Paranoid (Wolny)</string> 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 83185c385..35197c280 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 @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Ficheiro de chaves inválido</string>      <string name="install_keys_success">Chaves instaladas com sucesso</string>      <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> -    <string name="install_keys_failure_extension_description"> -        1. Verifica se as tuas chaves têm a extensão .keys.\n\n -        2. As Chaves não podem estar gravadas na pasta Transferências.\n\n -        Resolve esta(s) questões e tenta novamente. -    </string>      <string name="invalid_keys_error">Chaves de encriptação inválidas</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">A instalar o Driver...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Configurações avançadas</string>      <string name="preferences_settings">Configurações</string>      <string name="preferences_general">Geral</string>      <string name="preferences_system">Sistema</string> @@ -238,7 +232,6 @@      <string name="performance_warning">Desligar esta configuração irá reduzir a performance da emulação significantemente! Para a melhor experiência é recomendado que deixes esta configuração ativada.</string>      <!-- Region Names --> -    <string name="region_auto">Auto seleção</string>      <string name="region_japan">Japão</string>      <string name="region_usa">EUA</string>      <string name="region_europe">Europa</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Esticar para a janela</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Automático</string>      <string name="cpu_accuracy_accurate">Preciso</string>      <string name="cpu_accuracy_unsafe">Não seguro</string>      <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string> 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 3d0851e6f..8761e2374 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 @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Ficheiro de chaves inválido</string>      <string name="install_keys_success">Chaves instaladas com sucesso</string>      <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> -    <string name="install_keys_failure_extension_description"> -        1. Verifica se as tuas chaves têm a extensão .keys.\n\n -        2. As Chaves não podem estar gravadas na pasta Transferências.\n\n -        Resolve esta(s) questões e tenta novamente. -    </string>      <string name="invalid_keys_error">Chaves de encriptação inválidas</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">A instalar o Driver...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Configurações avançadas</string>      <string name="preferences_settings">Configurações</string>      <string name="preferences_general">Geral</string>      <string name="preferences_system">Sistema</string> @@ -238,7 +232,6 @@      <string name="performance_warning">Desligar esta configuração irá reduzir a performance da emulação significantemente! Para a melhor experiência é recomendado que deixes esta configuração ativada.</string>      <!-- Region Names --> -    <string name="region_auto">Autosseleção</string>      <string name="region_japan">Japão</string>      <string name="region_usa">EUA</string>      <string name="region_europe">Europa</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Esticar à Janela</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Automático</string>      <string name="cpu_accuracy_accurate">Preciso</string>      <string name="cpu_accuracy_unsafe">Inseguro</string>      <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string> 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 1401cf6a0..0fb4908f7 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Выбран неверный файл ключей</string>      <string name="install_keys_success">Ключи успешно установлены</string>      <string name="reading_keys_failure">Ошибка при чтении ключей шифрования</string> -    <string name="install_keys_failure_extension_description"> -        1. Убедитесь, что ваши ключи имеют расширение .keys\n\n -        2. Ключи не должны находиться в папке Downloads.\n\n -        Исправьте проблему(-ы) и повторите попытку. -    </string>      <string name="invalid_keys_error">Неверные ключи шифрования</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">Выбранный файл неверен или поврежден. Пожалуйста, пере-дампите ваши ключи.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">Установка драйвера...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Расширенные настройки</string>      <string name="preferences_settings">Настройки</string>      <string name="preferences_general">Общие</string>      <string name="preferences_system">Система</string> @@ -238,7 +232,6 @@      <string name="performance_warning">Отключение этой настройки значительно снизит производительность эмуляции! Для достижения наилучших результатов рекомендуется оставить эту настройку включенной.</string>      <!-- Region Names --> -    <string name="region_auto">Авто-выбор</string>      <string name="region_japan">Япония</string>      <string name="region_usa">США</string>      <string name="region_europe">Европа</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Растянуть до окна</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Авто</string>      <string name="cpu_accuracy_accurate">Точно</string>      <string name="cpu_accuracy_unsafe">Небезопасно</string>      <string name="cpu_accuracy_paranoid">Параноик (медленно)</string> 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 86d9c84f0..0d11eb2d2 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -61,11 +61,6 @@      <string name="invalid_keys_file">Вибрано неправильний файл ключів</string>      <string name="install_keys_success">Ключі успішно встановлено</string>      <string name="reading_keys_failure">Помилка під час зчитування ключів шифрування</string> -    <string name="install_keys_failure_extension_description"> -        1. Переконайтеся, що ваші ключі мають розширення .keys\n\n -        2. Ключі не повинні знаходитися в папці Downloads.\n\n -        Виправте проблему(-и) та спробуйте ще раз. -    </string>      <string name="invalid_keys_error">Невірні ключі шифрування</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">Обраний файл невірний або пошкоджений. Будь ласка, пере-дампіть ваші ключі.</string> @@ -184,7 +179,6 @@      <string name="installing_driver">Встановлення драйвера...</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">Розширені налаштування</string>      <string name="preferences_settings">Налаштування</string>      <string name="preferences_general">Загальні</string>      <string name="preferences_system">Система</string> @@ -238,7 +232,6 @@      <string name="performance_warning">Вимкнення цього налаштування значно знизить продуктивність емуляції! Для досягнення найкращих результатів рекомендується залишити це налаштування увімкненим.</string>      <!-- Region Names --> -    <string name="region_auto">Авто-вибір</string>      <string name="region_japan">Японія</string>      <string name="region_usa">США</string>      <string name="region_europe">Європа</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">Розтягнути до вікна</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">Авто</string>      <string name="cpu_accuracy_accurate">Точно</string>      <string name="cpu_accuracy_unsafe">Небезпечно</string>      <string name="cpu_accuracy_paranoid">Параноїк (повільно)</string> 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 034421c92..e00bbaa2e 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 @@ -61,11 +61,6 @@      <string name="invalid_keys_file">选择的密钥文件无效</string>      <string name="install_keys_success">密钥文件已成功安装</string>      <string name="reading_keys_failure">读取加密密钥时出错</string> -    <string name="install_keys_failure_extension_description"> -        1. 验证您的密钥文件是否具有 .keys 扩展名。\n\n -        2. 密钥文件不能放置于 Downloads 文件夹。\n\n -        解决问题并再试一次。 -    </string>      <string name="invalid_keys_error">无效的加密密钥</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">选择的密钥文件不正确或已损坏。请重新转储密钥文件。</string> @@ -184,7 +179,6 @@      <string name="installing_driver">正在安装驱动程序…</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">高级选项</string>      <string name="preferences_settings">设置</string>      <string name="preferences_general">通用</string>      <string name="preferences_system">系统</string> @@ -238,7 +232,6 @@      <string name="performance_warning">关闭此项会显著降低模拟性能!建议您将此项保持为启用状态。</string>      <!-- Region Names --> -    <string name="region_auto">自动选择</string>      <string name="region_japan">日本</string>      <string name="region_usa">美国</string>      <string name="region_europe">欧洲</string> @@ -311,7 +304,6 @@      <string name="ratio_stretch">拉伸窗口</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">自动</string>      <string name="cpu_accuracy_accurate">高精度</string>      <string name="cpu_accuracy_unsafe">低精度</string>      <string name="cpu_accuracy_paranoid">偏执模式 (慢速)</string> 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 85798cc6a..a54d04248 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 @@ -61,11 +61,6 @@      <string name="invalid_keys_file">無效的金鑰檔案已選取</string>      <string name="install_keys_success">金鑰已成功安裝</string>      <string name="reading_keys_failure">讀取加密金鑰時出現錯誤</string> -    <string name="install_keys_failure_extension_description"> -        1. 驗證您的金鑰是否具有 .keys 副檔名。\n\n -        2. 金鑰不能儲存於 Downloads 資料夾。\n\n -        解決問題並再試一次。 -    </string>      <string name="invalid_keys_error">無效的加密金鑰</string>      <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string>      <string name="install_keys_failure_description">選取的檔案不正確或已損毀,請重新傾印您的金鑰。</string> @@ -184,7 +179,6 @@      <string name="installing_driver">正在安裝驅動程式…</string>      <!-- Preferences Screen --> -    <string name="preferences_advanced_settings">進階設定</string>      <string name="preferences_settings">設定</string>      <string name="preferences_general">一般</string>      <string name="preferences_system">系統</string> @@ -238,7 +232,6 @@      <string name="performance_warning">關閉此設定會顯著降低模擬效能!如需最佳體驗,建議您將此設定保持為啟用狀態。</string>      <!-- Region Names --> -    <string name="region_auto">自動選取</string>      <string name="region_japan">日本</string>      <string name="region_usa">美國</string>      <string name="region_europe">歐洲</string> @@ -311,8 +304,6 @@      <string name="ratio_stretch">延伸視窗</string>      <!-- CPU Accuracy --> -    <string name="cpu_accuracy_auto">自動</string> -    <string name="cpu_accuracy_accurate">高精度</string>      <string name="cpu_accuracy_unsafe">低精度</string>      <string name="cpu_accuracy_paranoid">不合理 (慢)</string> diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 6e9d47557..c236811fa 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -102,6 +102,15 @@      <string name="share_log">Share debug logs</string>      <string name="share_log_description">Share yuzu\'s log file to debug issues</string>      <string name="share_log_missing">No log file found</string> +    <string name="install_game_content">Install game content</string> +    <string name="install_game_content_description">Install game updates or DLC</string> +    <string name="install_game_content_failure">Error installing file to NAND</string> +    <string name="install_game_content_failure_description">Game content installation failed. Please ensure content is valid and that the prod.keys file is installed.</string> +    <string name="install_game_content_failure_base">Installation of base games isn\'t permitted in order to avoid possible conflicts. Please select an update or DLC instead.</string> +    <string name="install_game_content_failure_file_extension">The selected file type is not supported. Only NSP and XCI content is supported for this action. Please verify the game content is valid.</string> +    <string name="install_game_content_success">Game content installed successfully</string> +    <string name="install_game_content_success_overwrite">Game content was overwritten successfully</string> +    <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string>      <!-- About screen strings -->      <string name="gaia_is_not_real">Gaia isn\'t real</string> @@ -160,6 +169,8 @@      <string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>      <string name="renderer_asynchronous_shaders">Use asynchronous shaders</string>      <string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously, reducing stutter but may introduce glitches.</string> +    <string name="renderer_reactive_flushing">Use reactive flushing</string> +    <string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>      <string name="renderer_debug">Graphics debugging</string>      <string name="renderer_debug_description">Sets the graphics API to a slow debugging mode.</string>      <string name="use_disk_shader_cache">Disk shader cache</string> diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 99602699a..ce92b7cc1 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -4,8 +4,6 @@  add_library(core STATIC      arm/arm_interface.h      arm/arm_interface.cpp -    arm/dynarmic/arm_exclusive_monitor.cpp -    arm/dynarmic/arm_exclusive_monitor.h      arm/exclusive_monitor.cpp      arm/exclusive_monitor.h      arm/symbols.cpp @@ -849,12 +847,15 @@ endif()  if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)      target_sources(core PRIVATE +        arm/dynarmic/arm_dynarmic.h          arm/dynarmic/arm_dynarmic_64.cpp          arm/dynarmic/arm_dynarmic_64.h          arm/dynarmic/arm_dynarmic_32.cpp          arm/dynarmic/arm_dynarmic_32.h -        arm/dynarmic/arm_dynarmic_cp15.cpp -        arm/dynarmic/arm_dynarmic_cp15.h +        arm/dynarmic/dynarmic_cp15.cpp +        arm/dynarmic/dynarmic_cp15.h +        arm/dynarmic/dynarmic_exclusive_monitor.cpp +        arm/dynarmic/dynarmic_exclusive_monitor.h          hle/service/jit/jit_context.cpp          hle/service/jit/jit_context.h          hle/service/jit/jit.cpp diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp index d30914b7a..beaea64b3 100644 --- a/src/core/arm/arm_interface.cpp +++ b/src/core/arm/arm_interface.cpp @@ -13,25 +13,68 @@  #include "core/core.h"  #include "core/debugger/debugger.h"  #include "core/hle/kernel/k_process.h" +#include "core/hle/kernel/k_thread.h"  #include "core/hle/kernel/svc.h"  #include "core/loader/loader.h"  #include "core/memory.h" -#include "core/arm/dynarmic/arm_dynarmic_32.h" -#include "core/arm/dynarmic/arm_dynarmic_64.h" -  namespace Core {  constexpr u64 SEGMENT_BASE = 0x7100000000ull;  std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext(      Core::System& system, const ARM_Interface::ThreadContext32& ctx) { -    return ARM_Dynarmic_32::GetBacktraceFromContext(system, ctx); +    std::vector<BacktraceEntry> out; +    auto& memory = system.ApplicationMemory(); + +    const auto& reg = ctx.cpu_registers; +    u32 pc = reg[15], lr = reg[14], fp = reg[11]; +    out.push_back({"", 0, pc, 0, ""}); + +    // fp (= r11) points to the last frame record. +    // Frame records are two words long: +    // fp+0 : pointer to previous frame record +    // fp+4 : value of lr for frame +    for (size_t i = 0; i < 256; i++) { +        out.push_back({"", 0, lr, 0, ""}); +        if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { +            break; +        } +        lr = memory.Read32(fp + 4); +        fp = memory.Read32(fp); +    } + +    SymbolicateBacktrace(system, out); + +    return out;  }  std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext(      Core::System& system, const ARM_Interface::ThreadContext64& ctx) { -    return ARM_Dynarmic_64::GetBacktraceFromContext(system, ctx); +    std::vector<BacktraceEntry> out; +    auto& memory = system.ApplicationMemory(); + +    const auto& reg = ctx.cpu_registers; +    u64 pc = ctx.pc, lr = reg[30], fp = reg[29]; + +    out.push_back({"", 0, pc, 0, ""}); + +    // fp (= x29) points to the previous frame record. +    // Frame records are two words long: +    // fp+0 : pointer to previous frame record +    // fp+8 : value of lr for frame +    for (size_t i = 0; i < 256; i++) { +        out.push_back({"", 0, lr, 0, ""}); +        if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) { +            break; +        } +        lr = memory.Read64(fp + 8); +        fp = memory.Read64(fp); +    } + +    SymbolicateBacktrace(system, out); + +    return out;  }  void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) { @@ -76,6 +119,18 @@ void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<Backt      }  } +std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const { +    if (GetArchitecture() == Architecture::Aarch64) { +        ThreadContext64 ctx; +        SaveContext(ctx); +        return GetBacktraceFromContext(system, ctx); +    } else { +        ThreadContext32 ctx; +        SaveContext(ctx); +        return GetBacktraceFromContext(system, ctx); +    } +} +  void ARM_Interface::LogBacktrace() const {      const VAddr sp = GetSP();      const VAddr pc = GetPC(); @@ -83,7 +138,6 @@ void ARM_Interface::LogBacktrace() const {      LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address",                "Offset", "Symbol");      LOG_ERROR(Core_ARM, ""); -      const auto backtrace = GetBacktrace();      for (const auto& entry : backtrace) {          LOG_ERROR(Core_ARM, "{:20}{:016X}    {:016X}    {:016X}    {}", entry.module, entry.address, @@ -97,7 +151,7 @@ void ARM_Interface::Run() {      while (true) {          Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; -        Dynarmic::HaltReason hr{}; +        HaltReason hr{};          // Notify the debugger and go to sleep if a step was performed          // and this thread has been scheduled again. @@ -108,17 +162,17 @@ void ARM_Interface::Run() {          }          // Otherwise, run the thread. -        system.EnterDynarmicProfile(); +        system.EnterCPUProfile();          if (current_thread->GetStepState() == StepState::StepPending) {              hr = StepJit(); -            if (Has(hr, step_thread)) { +            if (True(hr & HaltReason::StepThread)) {                  current_thread->SetStepState(StepState::StepPerformed);              }          } else {              hr = RunJit();          } -        system.ExitDynarmicProfile(); +        system.ExitCPUProfile();          // If the thread is scheduled for termination, exit the thread.          if (current_thread->HasDpc()) { @@ -130,8 +184,8 @@ void ARM_Interface::Run() {          // Notify the debugger and go to sleep if a breakpoint was hit,          // or if the thread is unable to continue for any reason. -        if (Has(hr, breakpoint) || Has(hr, no_execute)) { -            if (!Has(hr, no_execute)) { +        if (True(hr & HaltReason::InstructionBreakpoint) || True(hr & HaltReason::PrefetchAbort)) { +            if (!True(hr & HaltReason::InstructionBreakpoint)) {                  RewindBreakpointInstruction();              }              if (system.DebuggerEnabled()) { @@ -144,7 +198,7 @@ void ARM_Interface::Run() {          }          // Notify the debugger and go to sleep if a watchpoint was hit. -        if (Has(hr, watchpoint)) { +        if (True(hr & HaltReason::DataAbort)) {              if (system.DebuggerEnabled()) {                  system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint());              } @@ -153,11 +207,11 @@ void ARM_Interface::Run() {          }          // Handle syscalls and scheduling (this may change the current thread/core) -        if (Has(hr, svc_call)) { +        if (True(hr & HaltReason::SupervisorCall)) {              Kernel::Svc::Call(system, GetSvcNumber());              break;          } -        if (Has(hr, break_loop) || !uses_wall_clock) { +        if (True(hr & HaltReason::BreakLoop) || !uses_wall_clock) {              break;          }      } diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 8e40702cc..d5f2fa09a 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -8,8 +8,6 @@  #include <string>  #include <vector> -#include <dynarmic/interface/halt_reason.h> -  #include "common/common_funcs.h"  #include "common/common_types.h"  #include "core/hardware_properties.h" @@ -30,6 +28,22 @@ class CPUInterruptHandler;  using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; +// NOTE: these values match the HaltReason enum in Dynarmic +enum class HaltReason : u64 { +    StepThread = 0x00000001, +    DataAbort = 0x00000004, +    BreakLoop = 0x02000000, +    SupervisorCall = 0x04000000, +    InstructionBreakpoint = 0x08000000, +    PrefetchAbort = 0x20000000, +}; +DECLARE_ENUM_FLAG_OPERATORS(HaltReason); + +enum class Architecture { +    Aarch32, +    Aarch64, +}; +  /// Generic ARMv8 CPU interface  class ARM_Interface {  public: @@ -167,8 +181,9 @@ public:       */      virtual void SetTPIDR_EL0(u64 value) = 0; -    virtual void SaveContext(ThreadContext32& ctx) = 0; -    virtual void SaveContext(ThreadContext64& ctx) = 0; +    virtual Architecture GetArchitecture() const = 0; +    virtual void SaveContext(ThreadContext32& ctx) const = 0; +    virtual void SaveContext(ThreadContext64& ctx) const = 0;      virtual void LoadContext(const ThreadContext32& ctx) = 0;      virtual void LoadContext(const ThreadContext64& ctx) = 0;      void LoadWatchpointArray(const WatchpointArray& wp); @@ -195,17 +210,9 @@ public:      static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system,                                                                 const ThreadContext64& ctx); -    virtual std::vector<BacktraceEntry> GetBacktrace() const = 0; - +    std::vector<BacktraceEntry> GetBacktrace() const;      void LogBacktrace() const; -    static constexpr Dynarmic::HaltReason step_thread = Dynarmic::HaltReason::Step; -    static constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2; -    static constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3; -    static constexpr Dynarmic::HaltReason breakpoint = Dynarmic::HaltReason::UserDefined4; -    static constexpr Dynarmic::HaltReason watchpoint = Dynarmic::HaltReason::MemoryAbort; -    static constexpr Dynarmic::HaltReason no_execute = Dynarmic::HaltReason::UserDefined6; -  protected:      /// System context that this ARM interface is running under.      System& system; @@ -216,8 +223,8 @@ protected:      const Kernel::DebugWatchpoint* MatchingWatchpoint(          u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const; -    virtual Dynarmic::HaltReason RunJit() = 0; -    virtual Dynarmic::HaltReason StepJit() = 0; +    virtual HaltReason RunJit() = 0; +    virtual HaltReason StepJit() = 0;      virtual u32 GetSvcNumber() const = 0;      virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0;      virtual void RewindBreakpointInstruction() = 0; diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h new file mode 100644 index 000000000..eef7c3116 --- /dev/null +++ b/src/core/arm/dynarmic/arm_dynarmic.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <dynarmic/interface/halt_reason.h> + +#include "core/arm/arm_interface.h" + +namespace Core { + +constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step; +constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort; +constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2; +constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3; +constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4; +constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6; + +constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) { +    static_assert(static_cast<u64>(HaltReason::StepThread) == static_cast<u64>(StepThread)); +    static_assert(static_cast<u64>(HaltReason::DataAbort) == static_cast<u64>(DataAbort)); +    static_assert(static_cast<u64>(HaltReason::BreakLoop) == static_cast<u64>(BreakLoop)); +    static_assert(static_cast<u64>(HaltReason::SupervisorCall) == static_cast<u64>(SupervisorCall)); +    static_assert(static_cast<u64>(HaltReason::InstructionBreakpoint) == +                  static_cast<u64>(InstructionBreakpoint)); +    static_assert(static_cast<u64>(HaltReason::PrefetchAbort) == static_cast<u64>(PrefetchAbort)); + +    return static_cast<HaltReason>(hr); +} + +} // namespace Core diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index dfdcbe35a..5acf9008d 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -10,9 +10,10 @@  #include "common/logging/log.h"  #include "common/page_table.h"  #include "common/settings.h" +#include "core/arm/dynarmic/arm_dynarmic.h"  #include "core/arm/dynarmic/arm_dynarmic_32.h" -#include "core/arm/dynarmic/arm_dynarmic_cp15.h" -#include "core/arm/dynarmic/arm_exclusive_monitor.h" +#include "core/arm/dynarmic/dynarmic_cp15.h" +#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"  #include "core/core.h"  #include "core/core_timing.h"  #include "core/debugger/debugger.h" @@ -104,11 +105,11 @@ public:          switch (exception) {          case Dynarmic::A32::Exception::NoExecuteFault:              LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); -            ReturnException(pc, ARM_Interface::no_execute); +            ReturnException(pc, PrefetchAbort);              return;          default:              if (debugger_enabled) { -                ReturnException(pc, ARM_Interface::breakpoint); +                ReturnException(pc, InstructionBreakpoint);                  return;              } @@ -121,7 +122,7 @@ public:      void CallSVC(u32 swi) override {          parent.svc_swi = swi; -        parent.jit.load()->HaltExecution(ARM_Interface::svc_call); +        parent.jit.load()->HaltExecution(SupervisorCall);      }      void AddTicks(u64 ticks) override { @@ -162,7 +163,7 @@ public:          if (!memory.IsValidVirtualAddressRange(addr, size)) {              LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}",                           addr); -            parent.jit.load()->HaltExecution(ARM_Interface::no_execute); +            parent.jit.load()->HaltExecution(PrefetchAbort);              return false;          } @@ -173,7 +174,7 @@ public:          const auto match{parent.MatchingWatchpoint(addr, size, type)};          if (match) {              parent.halted_watchpoint = match; -            parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); +            parent.jit.load()->HaltExecution(DataAbort);              return false;          } @@ -329,12 +330,12 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*      return std::make_unique<Dynarmic::A32::Jit>(config);  } -Dynarmic::HaltReason ARM_Dynarmic_32::RunJit() { -    return jit.load()->Run(); +HaltReason ARM_Dynarmic_32::RunJit() { +    return TranslateHaltReason(jit.load()->Run());  } -Dynarmic::HaltReason ARM_Dynarmic_32::StepJit() { -    return jit.load()->Step(); +HaltReason ARM_Dynarmic_32::StepJit() { +    return TranslateHaltReason(jit.load()->Step());  }  u32 ARM_Dynarmic_32::GetSvcNumber() const { @@ -408,7 +409,7 @@ void ARM_Dynarmic_32::SetTPIDR_EL0(u64 value) {      cp15->uprw = static_cast<u32>(value);  } -void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { +void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) const {      Dynarmic::A32::Jit* j = jit.load();      ctx.cpu_registers = j->Regs();      ctx.extension_registers = j->ExtRegs(); @@ -425,11 +426,11 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) {  }  void ARM_Dynarmic_32::SignalInterrupt() { -    jit.load()->HaltExecution(break_loop); +    jit.load()->HaltExecution(BreakLoop);  }  void ARM_Dynarmic_32::ClearInterrupt() { -    jit.load()->ClearHalt(break_loop); +    jit.load()->ClearHalt(BreakLoop);  }  void ARM_Dynarmic_32::ClearInstructionCache() { @@ -462,39 +463,4 @@ void ARM_Dynarmic_32::PageTableChanged(Common::PageTable& page_table,      jit_cache.emplace(key, std::move(new_jit));  } -std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace(Core::System& system, -                                                                         u64 fp, u64 lr, u64 pc) { -    std::vector<BacktraceEntry> out; -    auto& memory = system.ApplicationMemory(); - -    out.push_back({"", 0, pc, 0, ""}); - -    // fp (= r11) points to the last frame record. -    // Frame records are two words long: -    // fp+0 : pointer to previous frame record -    // fp+4 : value of lr for frame -    for (size_t i = 0; i < 256; i++) { -        out.push_back({"", 0, lr, 0, ""}); -        if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { -            break; -        } -        lr = memory.Read32(fp + 4); -        fp = memory.Read32(fp); -    } - -    SymbolicateBacktrace(system, out); - -    return out; -} - -std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktraceFromContext( -    System& system, const ThreadContext32& ctx) { -    const auto& reg = ctx.cpu_registers; -    return GetBacktrace(system, reg[11], reg[14], reg[15]); -} - -std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace() const { -    return GetBacktrace(system, GetReg(11), GetReg(14), GetReg(15)); -} -  } // namespace Core diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index bce695daf..a990845cb 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h @@ -50,8 +50,11 @@ public:          return (GetPSTATE() & 0x20) != 0;      } -    void SaveContext(ThreadContext32& ctx) override; -    void SaveContext(ThreadContext64& ctx) override {} +    Architecture GetArchitecture() const override { +        return Architecture::Aarch32; +    } +    void SaveContext(ThreadContext32& ctx) const override; +    void SaveContext(ThreadContext64& ctx) const override {}      void LoadContext(const ThreadContext32& ctx) override;      void LoadContext(const ThreadContext64& ctx) override {} @@ -64,14 +67,9 @@ public:      void PageTableChanged(Common::PageTable& new_page_table,                            std::size_t new_address_space_size_in_bits) override; -    static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, -                                                               const ThreadContext32& ctx); - -    std::vector<BacktraceEntry> GetBacktrace() const override; -  protected: -    Dynarmic::HaltReason RunJit() override; -    Dynarmic::HaltReason StepJit() override; +    HaltReason RunJit() override; +    HaltReason StepJit() override;      u32 GetSvcNumber() const override;      const Kernel::DebugWatchpoint* HaltedWatchpoint() const override;      void RewindBreakpointInstruction() override; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index bbbcb4f9d..bb97ed5bc 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -10,8 +10,9 @@  #include "common/logging/log.h"  #include "common/page_table.h"  #include "common/settings.h" +#include "core/arm/dynarmic/arm_dynarmic.h"  #include "core/arm/dynarmic/arm_dynarmic_64.h" -#include "core/arm/dynarmic/arm_exclusive_monitor.h" +#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"  #include "core/core.h"  #include "core/core_timing.h"  #include "core/debugger/debugger.h" @@ -113,7 +114,7 @@ public:          LOG_ERROR(Core_ARM,                    "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc,                    num_instructions, memory.Read32(pc)); -        ReturnException(pc, ARM_Interface::no_execute); +        ReturnException(pc, PrefetchAbort);      }      void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op, @@ -148,11 +149,11 @@ public:              return;          case Dynarmic::A64::Exception::NoExecuteFault:              LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc); -            ReturnException(pc, ARM_Interface::no_execute); +            ReturnException(pc, PrefetchAbort);              return;          default:              if (debugger_enabled) { -                ReturnException(pc, ARM_Interface::breakpoint); +                ReturnException(pc, InstructionBreakpoint);                  return;              } @@ -164,7 +165,7 @@ public:      void CallSVC(u32 swi) override {          parent.svc_swi = swi; -        parent.jit.load()->HaltExecution(ARM_Interface::svc_call); +        parent.jit.load()->HaltExecution(SupervisorCall);      }      void AddTicks(u64 ticks) override { @@ -207,7 +208,7 @@ public:          if (!memory.IsValidVirtualAddressRange(addr, size)) {              LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}",                           addr); -            parent.jit.load()->HaltExecution(ARM_Interface::no_execute); +            parent.jit.load()->HaltExecution(PrefetchAbort);              return false;          } @@ -218,7 +219,7 @@ public:          const auto match{parent.MatchingWatchpoint(addr, size, type)};          if (match) {              parent.halted_watchpoint = match; -            parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); +            parent.jit.load()->HaltExecution(DataAbort);              return false;          } @@ -383,12 +384,12 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*      return std::make_shared<Dynarmic::A64::Jit>(config);  } -Dynarmic::HaltReason ARM_Dynarmic_64::RunJit() { -    return jit.load()->Run(); +HaltReason ARM_Dynarmic_64::RunJit() { +    return TranslateHaltReason(jit.load()->Run());  } -Dynarmic::HaltReason ARM_Dynarmic_64::StepJit() { -    return jit.load()->Step(); +HaltReason ARM_Dynarmic_64::StepJit() { +    return TranslateHaltReason(jit.load()->Step());  }  u32 ARM_Dynarmic_64::GetSvcNumber() const { @@ -464,7 +465,7 @@ void ARM_Dynarmic_64::SetTPIDR_EL0(u64 value) {      cb->tpidr_el0 = value;  } -void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) { +void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) const {      Dynarmic::A64::Jit* j = jit.load();      ctx.cpu_registers = j->GetRegisters();      ctx.sp = j->GetSP(); @@ -489,11 +490,11 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) {  }  void ARM_Dynarmic_64::SignalInterrupt() { -    jit.load()->HaltExecution(break_loop); +    jit.load()->HaltExecution(BreakLoop);  }  void ARM_Dynarmic_64::ClearInterrupt() { -    jit.load()->ClearHalt(break_loop); +    jit.load()->ClearHalt(BreakLoop);  }  void ARM_Dynarmic_64::ClearInstructionCache() { @@ -526,39 +527,4 @@ void ARM_Dynarmic_64::PageTableChanged(Common::PageTable& page_table,      jit_cache.emplace(key, std::move(new_jit));  } -std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace(Core::System& system, -                                                                         u64 fp, u64 lr, u64 pc) { -    std::vector<BacktraceEntry> out; -    auto& memory = system.ApplicationMemory(); - -    out.push_back({"", 0, pc, 0, ""}); - -    // fp (= x29) points to the previous frame record. -    // Frame records are two words long: -    // fp+0 : pointer to previous frame record -    // fp+8 : value of lr for frame -    for (size_t i = 0; i < 256; i++) { -        out.push_back({"", 0, lr, 0, ""}); -        if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) { -            break; -        } -        lr = memory.Read64(fp + 8); -        fp = memory.Read64(fp); -    } - -    SymbolicateBacktrace(system, out); - -    return out; -} - -std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktraceFromContext( -    System& system, const ThreadContext64& ctx) { -    const auto& reg = ctx.cpu_registers; -    return GetBacktrace(system, reg[29], reg[30], ctx.pc); -} - -std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace() const { -    return GetBacktrace(system, GetReg(29), GetReg(30), GetPC()); -} -  } // namespace Core diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index e83599e82..af2aa1f1c 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h @@ -43,8 +43,11 @@ public:      void SetTPIDR_EL0(u64 value) override;      u64 GetTPIDR_EL0() const override; -    void SaveContext(ThreadContext32& ctx) override {} -    void SaveContext(ThreadContext64& ctx) override; +    Architecture GetArchitecture() const override { +        return Architecture::Aarch64; +    } +    void SaveContext(ThreadContext32& ctx) const override {} +    void SaveContext(ThreadContext64& ctx) const override;      void LoadContext(const ThreadContext32& ctx) override {}      void LoadContext(const ThreadContext64& ctx) override; @@ -57,14 +60,9 @@ public:      void PageTableChanged(Common::PageTable& new_page_table,                            std::size_t new_address_space_size_in_bits) override; -    static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, -                                                               const ThreadContext64& ctx); - -    std::vector<BacktraceEntry> GetBacktrace() const override; -  protected: -    Dynarmic::HaltReason RunJit() override; -    Dynarmic::HaltReason StepJit() override; +    HaltReason RunJit() override; +    HaltReason StepJit() override;      u32 GetSvcNumber() const override;      const Kernel::DebugWatchpoint* HaltedWatchpoint() const override;      void RewindBreakpointInstruction() override; @@ -73,8 +71,6 @@ private:      std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table,                                                  std::size_t address_space_bits) const; -    static std::vector<BacktraceEntry> GetBacktrace(Core::System& system, u64 fp, u64 lr, u64 pc); -      using JitCacheKey = std::pair<Common::PageTable*, std::size_t>;      using JitCacheType =          std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A64::Jit>, Common::PairHash>; diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp b/src/core/arm/dynarmic/dynarmic_cp15.cpp index 5a4eba3eb..92c548db0 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/dynarmic_cp15.cpp @@ -4,7 +4,7 @@  #include <fmt/format.h>  #include "common/logging/log.h"  #include "core/arm/dynarmic/arm_dynarmic_32.h" -#include "core/arm/dynarmic/arm_dynarmic_cp15.h" +#include "core/arm/dynarmic/dynarmic_cp15.h"  #include "core/core.h"  #include "core/core_timing.h" diff --git a/src/core/arm/dynarmic/arm_dynarmic_cp15.h b/src/core/arm/dynarmic/dynarmic_cp15.h index d90b3e568..d90b3e568 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_cp15.h +++ b/src/core/arm/dynarmic/dynarmic_cp15.h diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp index fa0c48b25..b5c9c43c4 100644 --- a/src/core/arm/dynarmic/arm_exclusive_monitor.cpp +++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp @@ -1,7 +1,7 @@  // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project  // SPDX-License-Identifier: GPL-2.0-or-later -#include "core/arm/dynarmic/arm_exclusive_monitor.h" +#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"  #include "core/memory.h"  namespace Core { diff --git a/src/core/arm/dynarmic/arm_exclusive_monitor.h b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h index 57e6dd0d0..57e6dd0d0 100644 --- a/src/core/arm/dynarmic/arm_exclusive_monitor.h +++ b/src/core/arm/dynarmic/dynarmic_exclusive_monitor.h diff --git a/src/core/arm/exclusive_monitor.cpp b/src/core/arm/exclusive_monitor.cpp index 20550faeb..6d9a862e1 100644 --- a/src/core/arm/exclusive_monitor.cpp +++ b/src/core/arm/exclusive_monitor.cpp @@ -2,7 +2,7 @@  // SPDX-License-Identifier: GPL-2.0-or-later  #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) -#include "core/arm/dynarmic/arm_exclusive_monitor.h" +#include "core/arm/dynarmic/dynarmic_exclusive_monitor.h"  #endif  #include "core/arm/exclusive_monitor.h"  #include "core/memory.h" diff --git a/src/core/core.cpp b/src/core/core.cpp index 7ba704f18..b74fd0a58 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -54,10 +54,10 @@  #include "video_core/renderer_base.h"  #include "video_core/video_core.h" -MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU0, "ARM JIT", "Dynarmic CPU 0", MP_RGB(255, 64, 64)); -MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU1, "ARM JIT", "Dynarmic CPU 1", MP_RGB(255, 64, 64)); -MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU2, "ARM JIT", "Dynarmic CPU 2", MP_RGB(255, 64, 64)); -MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU3, "ARM JIT", "Dynarmic CPU 3", MP_RGB(255, 64, 64)); +MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64)); +MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64)); +MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64)); +MICROPROFILE_DEFINE(ARM_CPU3, "ARM", "CPU 3", MP_RGB(255, 64, 64));  namespace Core { @@ -259,10 +259,10 @@ struct System::Impl {          is_powered_on = true;          exit_lock = false; -        microprofile_dynarmic[0] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU0); -        microprofile_dynarmic[1] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU1); -        microprofile_dynarmic[2] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU2); -        microprofile_dynarmic[3] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU3); +        microprofile_cpu[0] = MICROPROFILE_TOKEN(ARM_CPU0); +        microprofile_cpu[1] = MICROPROFILE_TOKEN(ARM_CPU1); +        microprofile_cpu[2] = MICROPROFILE_TOKEN(ARM_CPU2); +        microprofile_cpu[3] = MICROPROFILE_TOKEN(ARM_CPU3);          LOG_DEBUG(Core, "Initialized OK"); @@ -539,7 +539,7 @@ struct System::Impl {      ExitCallback exit_callback;      std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; -    std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_dynarmic{}; +    std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{};  };  System::System() : impl{std::make_unique<Impl>(*this)} {} @@ -927,14 +927,14 @@ void System::RegisterHostThread() {      impl->kernel.RegisterHostThread();  } -void System::EnterDynarmicProfile() { +void System::EnterCPUProfile() {      std::size_t core = impl->kernel.GetCurrentHostThreadID(); -    impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_dynarmic[core]); +    impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_cpu[core]);  } -void System::ExitDynarmicProfile() { +void System::ExitCPUProfile() {      std::size_t core = impl->kernel.GetCurrentHostThreadID(); -    MicroProfileLeave(impl->microprofile_dynarmic[core], impl->dynarmic_ticks[core]); +    MicroProfileLeave(impl->microprofile_cpu[core], impl->dynarmic_ticks[core]);  }  bool System::IsMulticore() const { diff --git a/src/core/core.h b/src/core/core.h index ff2e4bd30..93afc9303 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -412,11 +412,11 @@ public:      /// Register a host thread as an auxiliary thread.      void RegisterHostThread(); -    /// Enter Dynarmic Microprofile -    void EnterDynarmicProfile(); +    /// Enter CPU Microprofile +    void EnterCPUProfile(); -    /// Exit Dynarmic Microprofile -    void ExitDynarmicProfile(); +    /// Exit CPU Microprofile +    void ExitCPUProfile();      /// Tells if system is running on multicore.      [[nodiscard]] bool IsMulticore() const; diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h index 3226b884a..27f97c725 100644 --- a/src/core/file_sys/submission_package.h +++ b/src/core/file_sys/submission_package.h @@ -8,6 +8,7 @@  #include <set>  #include <vector>  #include "common/common_types.h" +#include "core/file_sys/nca_metadata.h"  #include "core/file_sys/vfs.h"  namespace Core::Crypto { diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index e8ddde691..b72788c6d 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -22,6 +22,9 @@ using Tegra::Texture::TICEntry;  using VideoCore::Surface::PixelFormat;  using VideoCore::Surface::SurfaceType; +constexpr u32 RescaleHeightThreshold = 288; +constexpr u32 DownscaleHeightThreshold = 512; +  ImageInfo::ImageInfo(const TICEntry& config) noexcept {      forced_flushed = config.IsPitchLinear() && !Settings::values.use_reactive_flushing.GetValue();      dma_downloaded = forced_flushed; @@ -113,8 +116,9 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept {          layer_stride = CalculateLayerStride(*this);          maybe_unaligned_layer_stride = CalculateLayerSize(*this);          rescaleable &= (block.depth == 0) && resources.levels == 1; -        rescaleable &= size.height > 256 || GetFormatType(format) != SurfaceType::ColorTexture; -        downscaleable = size.height > 512; +        rescaleable &= size.height > RescaleHeightThreshold || +                       GetFormatType(format) != SurfaceType::ColorTexture; +        downscaleable = size.height > DownscaleHeightThreshold;      }  } @@ -152,8 +156,8 @@ ImageInfo::ImageInfo(const Maxwell3D::Regs::RenderTargetConfig& ct,          size.depth = ct.depth;      } else {          rescaleable = block.depth == 0; -        rescaleable &= size.height > 256; -        downscaleable = size.height > 512; +        rescaleable &= size.height > RescaleHeightThreshold; +        downscaleable = size.height > DownscaleHeightThreshold;          type = ImageType::e2D;          resources.layers = ct.depth;      } @@ -232,8 +236,8 @@ ImageInfo::ImageInfo(const Fermi2D::Surface& config) noexcept {              .height = config.height,              .depth = 1,          }; -        rescaleable = block.depth == 0 && size.height > 256; -        downscaleable = size.height > 512; +        rescaleable = block.depth == 0 && size.height > RescaleHeightThreshold; +        downscaleable = size.height > DownscaleHeightThreshold;      }  } @@ -275,8 +279,8 @@ ImageInfo::ImageInfo(const Tegra::DMA::ImageOperand& config) noexcept {      resources.layers = 1;      layer_stride = CalculateLayerStride(*this);      maybe_unaligned_layer_stride = CalculateLayerSize(*this); -    rescaleable = block.depth == 0 && size.height > 256; -    downscaleable = size.height > 512; +    rescaleable = block.depth == 0 && size.height > RescaleHeightThreshold; +    downscaleable = size.height > DownscaleHeightThreshold;  }  } // namespace VideoCommon | 
