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 |