diff options
Diffstat (limited to 'src')
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 { | |||
| 227 | 227 | ||
| 228 | external fun setAppDirectory(directory: String) | 228 | external fun setAppDirectory(directory: String) |
| 229 | 229 | ||
| 230 | external fun installFileToNand(filename: String): Int | ||
| 231 | |||
| 230 | external fun initializeGpuDriver( | 232 | external fun initializeGpuDriver( |
| 231 | hookLibDir: String?, | 233 | hookLibDir: String?, |
| 232 | customDriverDir: String?, | 234 | customDriverDir: String?, |
| @@ -507,4 +509,15 @@ object NativeLibrary { | |||
| 507 | const val RELEASED = 0 | 509 | const val RELEASED = 0 |
| 508 | const val PRESSED = 1 | 510 | const val PRESSED = 1 |
| 509 | } | 511 | } |
| 512 | |||
| 513 | /** | ||
| 514 | * Result from installFileToNand | ||
| 515 | */ | ||
| 516 | object InstallFileToNandResult { | ||
| 517 | const val Success = 0 | ||
| 518 | const val SuccessFileOverwritten = 1 | ||
| 519 | const val Error = 2 | ||
| 520 | const val ErrorBaseGame = 3 | ||
| 521 | const val ErrorFilenameExtension = 4 | ||
| 522 | } | ||
| 510 | } | 523 | } |
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( | |||
| 26 | RENDERER_FORCE_MAX_CLOCK( | 26 | RENDERER_FORCE_MAX_CLOCK( |
| 27 | "force_max_clock", | 27 | "force_max_clock", |
| 28 | Settings.SECTION_RENDERER, | 28 | Settings.SECTION_RENDERER, |
| 29 | 1 | 29 | 0 |
| 30 | ), | 30 | ), |
| 31 | RENDERER_ASYNCHRONOUS_SHADERS( | 31 | RENDERER_ASYNCHRONOUS_SHADERS( |
| 32 | "use_asynchronous_shaders", | 32 | "use_asynchronous_shaders", |
| 33 | Settings.SECTION_RENDERER, | 33 | Settings.SECTION_RENDERER, |
| 34 | 0 | 34 | 0 |
| 35 | ), | 35 | ), |
| 36 | RENDERER_REACTIVE_FLUSHING( | ||
| 37 | "use_reactive_flushing", | ||
| 38 | Settings.SECTION_RENDERER, | ||
| 39 | 0 | ||
| 40 | ), | ||
| 36 | RENDERER_DEBUG( | 41 | RENDERER_DEBUG( |
| 37 | "debug", | 42 | "debug", |
| 38 | Settings.SECTION_RENDERER, | 43 | 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) | |||
| 321 | IntSetting.RENDERER_ASYNCHRONOUS_SHADERS.defaultValue | 321 | IntSetting.RENDERER_ASYNCHRONOUS_SHADERS.defaultValue |
| 322 | ) | 322 | ) |
| 323 | ) | 323 | ) |
| 324 | add( | ||
| 325 | SwitchSetting( | ||
| 326 | IntSetting.RENDERER_REACTIVE_FLUSHING, | ||
| 327 | R.string.renderer_reactive_flushing, | ||
| 328 | R.string.renderer_reactive_flushing_description, | ||
| 329 | IntSetting.RENDERER_REACTIVE_FLUSHING.key, | ||
| 330 | IntSetting.RENDERER_REACTIVE_FLUSHING.defaultValue | ||
| 331 | ) | ||
| 332 | ) | ||
| 324 | } | 333 | } |
| 325 | } | 334 | } |
| 326 | 335 | ||
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() { | |||
| 95 | R.drawable.ic_nfc | 95 | R.drawable.ic_nfc |
| 96 | ) { mainActivity.getAmiiboKey.launch(arrayOf("*/*")) }, | 96 | ) { mainActivity.getAmiiboKey.launch(arrayOf("*/*")) }, |
| 97 | HomeSetting( | 97 | HomeSetting( |
| 98 | R.string.install_game_content, | ||
| 99 | R.string.install_game_content_description, | ||
| 100 | R.drawable.ic_system_update_alt | ||
| 101 | ) { mainActivity.installGameUpdate.launch(arrayOf("*/*")) }, | ||
| 102 | HomeSetting( | ||
| 98 | R.string.select_games_folder, | 103 | R.string.select_games_folder, |
| 99 | R.string.select_games_folder_description, | 104 | R.string.select_games_folder_description, |
| 100 | R.drawable.ic_add | 105 | R.drawable.ic_add |
| @@ -103,7 +108,12 @@ class HomeSettingsFragment : Fragment() { | |||
| 103 | R.string.manage_save_data, | 108 | R.string.manage_save_data, |
| 104 | R.string.import_export_saves_description, | 109 | R.string.import_export_saves_description, |
| 105 | R.drawable.ic_save | 110 | R.drawable.ic_save |
| 106 | ) { ImportExportSavesFragment().show(parentFragmentManager, ImportExportSavesFragment.TAG) }, | 111 | ) { |
| 112 | ImportExportSavesFragment().show( | ||
| 113 | parentFragmentManager, | ||
| 114 | ImportExportSavesFragment.TAG | ||
| 115 | ) | ||
| 116 | }, | ||
| 107 | HomeSetting( | 117 | HomeSetting( |
| 108 | R.string.install_prod_keys, | 118 | R.string.install_prod_keys, |
| 109 | R.string.install_prod_keys_description, | 119 | 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 { | |||
| 467 | } | 467 | } |
| 468 | } | 468 | } |
| 469 | } | 469 | } |
| 470 | |||
| 471 | val installGameUpdate = | ||
| 472 | registerForActivityResult(ActivityResultContracts.OpenDocument()) { | ||
| 473 | if (it == null) | ||
| 474 | return@registerForActivityResult | ||
| 475 | |||
| 476 | IndeterminateProgressDialogFragment.newInstance( | ||
| 477 | this@MainActivity, | ||
| 478 | R.string.install_game_content | ||
| 479 | ) { | ||
| 480 | val result = NativeLibrary.installFileToNand(it.toString()) | ||
| 481 | lifecycleScope.launch { | ||
| 482 | withContext(Dispatchers.Main) { | ||
| 483 | when (result) { | ||
| 484 | NativeLibrary.InstallFileToNandResult.Success -> { | ||
| 485 | Toast.makeText( | ||
| 486 | applicationContext, | ||
| 487 | R.string.install_game_content_success, | ||
| 488 | Toast.LENGTH_SHORT | ||
| 489 | ).show() | ||
| 490 | } | ||
| 491 | |||
| 492 | NativeLibrary.InstallFileToNandResult.SuccessFileOverwritten -> { | ||
| 493 | Toast.makeText( | ||
| 494 | applicationContext, | ||
| 495 | R.string.install_game_content_success_overwrite, | ||
| 496 | Toast.LENGTH_SHORT | ||
| 497 | ).show() | ||
| 498 | } | ||
| 499 | |||
| 500 | NativeLibrary.InstallFileToNandResult.ErrorBaseGame -> { | ||
| 501 | MessageDialogFragment.newInstance( | ||
| 502 | R.string.install_game_content_failure, | ||
| 503 | R.string.install_game_content_failure_base | ||
| 504 | ).show(supportFragmentManager, MessageDialogFragment.TAG) | ||
| 505 | } | ||
| 506 | |||
| 507 | NativeLibrary.InstallFileToNandResult.ErrorFilenameExtension -> { | ||
| 508 | MessageDialogFragment.newInstance( | ||
| 509 | R.string.install_game_content_failure, | ||
| 510 | R.string.install_game_content_failure_file_extension, | ||
| 511 | R.string.install_game_content_help_link | ||
| 512 | ).show(supportFragmentManager, MessageDialogFragment.TAG) | ||
| 513 | } | ||
| 514 | |||
| 515 | else -> { | ||
| 516 | MessageDialogFragment.newInstance( | ||
| 517 | R.string.install_game_content_failure, | ||
| 518 | R.string.install_game_content_failure_description, | ||
| 519 | R.string.install_game_content_help_link | ||
| 520 | ).show(supportFragmentManager, MessageDialogFragment.TAG) | ||
| 521 | } | ||
| 522 | } | ||
| 523 | } | ||
| 524 | } | ||
| 525 | return@newInstance result | ||
| 526 | }.show(supportFragmentManager, IndeterminateProgressDialogFragment.TAG) | ||
| 527 | } | ||
| 470 | } | 528 | } |
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( | |||
| 38 | newWidth = width | 38 | newWidth = width |
| 39 | newHeight = (width / aspectRatio).roundToInt() | 39 | newHeight = (width / aspectRatio).roundToInt() |
| 40 | } | 40 | } |
| 41 | setMeasuredDimension(newWidth, newHeight) | 41 | val left = (width - newWidth) / 2; |
| 42 | val top = (height - newHeight) / 2; | ||
| 43 | setLeftTopRightBottom(left, top, left + newWidth, top + newHeight) | ||
| 42 | } else { | 44 | } else { |
| 43 | setMeasuredDimension(width, height) | 45 | setLeftTopRightBottom(0, 0, width, height) |
| 44 | } | 46 | } |
| 45 | } | 47 | } |
| 46 | } | 48 | } |
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() { | |||
| 235 | Settings::values.async_presentation = | 235 | Settings::values.async_presentation = |
| 236 | config->GetBoolean("Renderer", "async_presentation", true); | 236 | config->GetBoolean("Renderer", "async_presentation", true); |
| 237 | 237 | ||
| 238 | // Enable force_max_clock by default on Android | 238 | // Disable force_max_clock by default on Android |
| 239 | Settings::values.renderer_force_max_clock = | 239 | Settings::values.renderer_force_max_clock = |
| 240 | config->GetBoolean("Renderer", "force_max_clock", true); | 240 | config->GetBoolean("Renderer", "force_max_clock", false); |
| 241 | |||
| 242 | // Disable use_reactive_flushing by default on Android | ||
| 243 | Settings::values.use_reactive_flushing = | ||
| 244 | config->GetBoolean("Renderer", "use_reactive_flushing", false); | ||
| 241 | 245 | ||
| 242 | // Audio | 246 | // Audio |
| 243 | ReadSetting("Audio", Settings::values.sink_id); | 247 | 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 = | |||
| 251 | # 0: Off, 1 (default): On | 251 | # 0: Off, 1 (default): On |
| 252 | async_presentation = | 252 | async_presentation = |
| 253 | 253 | ||
| 254 | # Enable graphics API debugging mode. | 254 | # Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied). |
| 255 | # 0 (default): Disabled, 1: Enabled | 255 | # 0 (default): Disabled, 1: Enabled |
| 256 | force_max_clock = | 256 | force_max_clock = |
| 257 | 257 | ||
| @@ -328,6 +328,10 @@ shader_backend = | |||
| 328 | # 0 (default): Off, 1: On | 328 | # 0 (default): Off, 1: On |
| 329 | use_asynchronous_shaders = | 329 | use_asynchronous_shaders = |
| 330 | 330 | ||
| 331 | # Uses reactive flushing instead of predictive flushing. Allowing a more accurate syncing of memory. | ||
| 332 | # 0 (default): Off, 1: On | ||
| 333 | use_reactive_flushing = | ||
| 334 | |||
| 331 | # NVDEC emulation. | 335 | # NVDEC emulation. |
| 332 | # 0: Disabled, 1: CPU Decoding, 2 (default): GPU Decoding | 336 | # 0: Disabled, 1: CPU Decoding, 2 (default): GPU Decoding |
| 333 | nvdec_emulation = | 337 | 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 @@ | |||
| 28 | #include "core/core.h" | 28 | #include "core/core.h" |
| 29 | #include "core/cpu_manager.h" | 29 | #include "core/cpu_manager.h" |
| 30 | #include "core/crypto/key_manager.h" | 30 | #include "core/crypto/key_manager.h" |
| 31 | #include "core/file_sys/card_image.h" | ||
| 31 | #include "core/file_sys/registered_cache.h" | 32 | #include "core/file_sys/registered_cache.h" |
| 33 | #include "core/file_sys/submission_package.h" | ||
| 34 | #include "core/file_sys/vfs.h" | ||
| 32 | #include "core/file_sys/vfs_real.h" | 35 | #include "core/file_sys/vfs_real.h" |
| 33 | #include "core/frontend/applets/cabinet.h" | 36 | #include "core/frontend/applets/cabinet.h" |
| 34 | #include "core/frontend/applets/controller.h" | 37 | #include "core/frontend/applets/controller.h" |
| @@ -94,6 +97,74 @@ public: | |||
| 94 | m_native_window = native_window; | 97 | m_native_window = native_window; |
| 95 | } | 98 | } |
| 96 | 99 | ||
| 100 | int InstallFileToNand(std::string filename) { | ||
| 101 | const auto copy_func = [](const FileSys::VirtualFile& src, const FileSys::VirtualFile& dest, | ||
| 102 | std::size_t block_size) { | ||
| 103 | if (src == nullptr || dest == nullptr) { | ||
| 104 | return false; | ||
| 105 | } | ||
| 106 | if (!dest->Resize(src->GetSize())) { | ||
| 107 | return false; | ||
| 108 | } | ||
| 109 | |||
| 110 | using namespace Common::Literals; | ||
| 111 | std::vector<u8> buffer(1_MiB); | ||
| 112 | |||
| 113 | for (std::size_t i = 0; i < src->GetSize(); i += buffer.size()) { | ||
| 114 | const auto read = src->Read(buffer.data(), buffer.size(), i); | ||
| 115 | dest->Write(buffer.data(), read, i); | ||
| 116 | } | ||
| 117 | return true; | ||
| 118 | }; | ||
| 119 | |||
| 120 | enum InstallResult { | ||
| 121 | Success = 0, | ||
| 122 | SuccessFileOverwritten = 1, | ||
| 123 | InstallError = 2, | ||
| 124 | ErrorBaseGame = 3, | ||
| 125 | ErrorFilenameExtension = 4, | ||
| 126 | }; | ||
| 127 | |||
| 128 | m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); | ||
| 129 | m_system.GetFileSystemController().CreateFactories(*m_vfs); | ||
| 130 | |||
| 131 | std::shared_ptr<FileSys::NSP> nsp; | ||
| 132 | if (filename.ends_with("nsp")) { | ||
| 133 | nsp = std::make_shared<FileSys::NSP>(m_vfs->OpenFile(filename, FileSys::Mode::Read)); | ||
| 134 | if (nsp->IsExtractedType()) { | ||
| 135 | return InstallError; | ||
| 136 | } | ||
| 137 | } else if (filename.ends_with("xci")) { | ||
| 138 | const auto xci = | ||
| 139 | std::make_shared<FileSys::XCI>(m_vfs->OpenFile(filename, FileSys::Mode::Read)); | ||
| 140 | nsp = xci->GetSecurePartitionNSP(); | ||
| 141 | } else { | ||
| 142 | return ErrorFilenameExtension; | ||
| 143 | } | ||
| 144 | |||
| 145 | if (!nsp) { | ||
| 146 | return InstallError; | ||
| 147 | } | ||
| 148 | |||
| 149 | if (nsp->GetStatus() != Loader::ResultStatus::Success) { | ||
| 150 | return InstallError; | ||
| 151 | } | ||
| 152 | |||
| 153 | const auto res = m_system.GetFileSystemController().GetUserNANDContents()->InstallEntry( | ||
| 154 | *nsp, true, copy_func); | ||
| 155 | |||
| 156 | switch (res) { | ||
| 157 | case FileSys::InstallResult::Success: | ||
| 158 | return Success; | ||
| 159 | case FileSys::InstallResult::OverwriteExisting: | ||
| 160 | return SuccessFileOverwritten; | ||
| 161 | case FileSys::InstallResult::ErrorBaseInstall: | ||
| 162 | return ErrorBaseGame; | ||
| 163 | default: | ||
| 164 | return InstallError; | ||
| 165 | } | ||
| 166 | } | ||
| 167 | |||
| 97 | void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir, | 168 | void InitializeGpuDriver(const std::string& hook_lib_dir, const std::string& custom_driver_dir, |
| 98 | const std::string& custom_driver_name, | 169 | const std::string& custom_driver_name, |
| 99 | const std::string& file_redirect_dir) { | 170 | const std::string& file_redirect_dir) { |
| @@ -154,14 +225,14 @@ public: | |||
| 154 | m_window = std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window, | 225 | m_window = std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window, |
| 155 | m_vulkan_library); | 226 | m_vulkan_library); |
| 156 | 227 | ||
| 228 | m_system.SetFilesystem(m_vfs); | ||
| 229 | |||
| 157 | // Initialize system. | 230 | // Initialize system. |
| 158 | auto android_keyboard = std::make_unique<SoftwareKeyboard::AndroidKeyboard>(); | 231 | auto android_keyboard = std::make_unique<SoftwareKeyboard::AndroidKeyboard>(); |
| 159 | m_software_keyboard = android_keyboard.get(); | 232 | m_software_keyboard = android_keyboard.get(); |
| 160 | m_system.SetShuttingDown(false); | 233 | m_system.SetShuttingDown(false); |
| 161 | m_system.ApplySettings(); | 234 | m_system.ApplySettings(); |
| 162 | m_system.HIDCore().ReloadInputDevices(); | 235 | m_system.HIDCore().ReloadInputDevices(); |
| 163 | m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); | ||
| 164 | m_system.SetFilesystem(std::make_shared<FileSys::RealVfsFilesystem>()); | ||
| 165 | m_system.SetAppletFrontendSet({ | 236 | m_system.SetAppletFrontendSet({ |
| 166 | nullptr, // Amiibo Settings | 237 | nullptr, // Amiibo Settings |
| 167 | nullptr, // Controller Selector | 238 | nullptr, // Controller Selector |
| @@ -173,7 +244,8 @@ public: | |||
| 173 | std::move(android_keyboard), // Software Keyboard | 244 | std::move(android_keyboard), // Software Keyboard |
| 174 | nullptr, // Web Browser | 245 | nullptr, // Web Browser |
| 175 | }); | 246 | }); |
| 176 | m_system.GetFileSystemController().CreateFactories(*m_system.GetFilesystem()); | 247 | m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); |
| 248 | m_system.GetFileSystemController().CreateFactories(*m_vfs); | ||
| 177 | 249 | ||
| 178 | // Initialize account manager | 250 | // Initialize account manager |
| 179 | m_profile_manager = std::make_unique<Service::Account::ProfileManager>(); | 251 | m_profile_manager = std::make_unique<Service::Account::ProfileManager>(); |
| @@ -398,7 +470,7 @@ private: | |||
| 398 | InputCommon::InputSubsystem m_input_subsystem; | 470 | InputCommon::InputSubsystem m_input_subsystem; |
| 399 | Common::DetachedTasks m_detached_tasks; | 471 | Common::DetachedTasks m_detached_tasks; |
| 400 | Core::PerfStatsResults m_perf_stats{}; | 472 | Core::PerfStatsResults m_perf_stats{}; |
| 401 | std::shared_ptr<FileSys::RealVfsFilesystem> m_vfs; | 473 | std::shared_ptr<FileSys::VfsFilesystem> m_vfs; |
| 402 | Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized}; | 474 | Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized}; |
| 403 | bool m_is_running{}; | 475 | bool m_is_running{}; |
| 404 | SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; | 476 | SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; |
| @@ -466,6 +538,12 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, | |||
| 466 | Common::FS::SetAppDirectory(GetJString(env, j_directory)); | 538 | Common::FS::SetAppDirectory(GetJString(env, j_directory)); |
| 467 | } | 539 | } |
| 468 | 540 | ||
| 541 | int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, | ||
| 542 | [[maybe_unused]] jclass clazz, | ||
| 543 | jstring j_file) { | ||
| 544 | return EmulationSession::GetInstance().InstallFileToNand(GetJString(env, j_file)); | ||
| 545 | } | ||
| 546 | |||
| 469 | void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver( | 547 | void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver( |
| 470 | JNIEnv* env, [[maybe_unused]] jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir, | 548 | JNIEnv* env, [[maybe_unused]] jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir, |
| 471 | jstring custom_driver_name, jstring file_redirect_dir) { | 549 | 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 @@ | |||
| 1 | <vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
| 2 | android:width="48dp" | ||
| 3 | android:height="48dp" | ||
| 4 | android:viewportWidth="960" | ||
| 5 | android:viewportHeight="960"> | ||
| 6 | <path | ||
| 7 | android:fillColor="#FF000000" | ||
| 8 | 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"/> | ||
| 9 | </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 @@ | |||
| 176 | <string name="installing_driver">Treiber wird installiert...</string> | 176 | <string name="installing_driver">Treiber wird installiert...</string> |
| 177 | 177 | ||
| 178 | <!-- Preferences Screen --> | 178 | <!-- Preferences Screen --> |
| 179 | <string name="preferences_advanced_settings">Erweiterte Einstellungen</string> | ||
| 180 | <string name="preferences_settings">Einstellungen</string> | 179 | <string name="preferences_settings">Einstellungen</string> |
| 181 | <string name="preferences_general">Allgemein</string> | 180 | <string name="preferences_general">Allgemein</string> |
| 182 | <string name="preferences_system">System</string> | 181 | <string name="preferences_system">System</string> |
| @@ -228,7 +227,6 @@ | |||
| 228 | <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> | 227 | <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> |
| 229 | 228 | ||
| 230 | <!-- Region Names --> | 229 | <!-- Region Names --> |
| 231 | <string name="region_auto">Automatisch auswählen</string> | ||
| 232 | <string name="region_japan">Japan</string> | 230 | <string name="region_japan">Japan</string> |
| 233 | <string name="region_usa">USA</string> | 231 | <string name="region_usa">USA</string> |
| 234 | <string name="region_europe">Europa</string> | 232 | <string name="region_europe">Europa</string> |
| @@ -301,7 +299,6 @@ | |||
| 301 | <string name="ratio_stretch">Auf Fenster anpassen</string> | 299 | <string name="ratio_stretch">Auf Fenster anpassen</string> |
| 302 | 300 | ||
| 303 | <!-- CPU Accuracy --> | 301 | <!-- CPU Accuracy --> |
| 304 | <string name="cpu_accuracy_auto">Auto</string> | ||
| 305 | <string name="cpu_accuracy_accurate">Akkurat</string> | 302 | <string name="cpu_accuracy_accurate">Akkurat</string> |
| 306 | <string name="cpu_accuracy_unsafe">Unsicher</string> | 303 | <string name="cpu_accuracy_unsafe">Unsicher</string> |
| 307 | <string name="cpu_accuracy_paranoid">Paranoid (Langsam)</string> | 304 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Archivo de claves inválido seleccionado</string> | 61 | <string name="invalid_keys_file">Archivo de claves inválido seleccionado</string> |
| 62 | <string name="install_keys_success">Claves instaladas correctamente</string> | 62 | <string name="install_keys_success">Claves instaladas correctamente</string> |
| 63 | <string name="reading_keys_failure">Error al leer las claves de cifrado</string> | 63 | <string name="reading_keys_failure">Error al leer las claves de cifrado</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Verifique que sus claves acaben con la extensión .keys.\n\n | ||
| 66 | 2. Las claves no deben de estar almacenadas en la carpeta Descargas.\n\n | ||
| 67 | Resuelva el/los problema(s) y vuelva a intentarlo. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Claves de cifrado no válidas</string> | 64 | <string name="invalid_keys_error">Claves de cifrado no válidas</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string> | 66 | <string name="install_keys_failure_description">El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">Instalando driver...</string> | 179 | <string name="installing_driver">Instalando driver...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Configuración avanzada</string> | ||
| 188 | <string name="preferences_settings">Ajustes</string> | 182 | <string name="preferences_settings">Ajustes</string> |
| 189 | <string name="preferences_general">General</string> | 183 | <string name="preferences_general">General</string> |
| 190 | <string name="preferences_system">Sistema</string> | 184 | <string name="preferences_system">Sistema</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <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> | 232 | <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> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Auto seleccionar</string> | ||
| 242 | <string name="region_japan">Japón</string> | 235 | <string name="region_japan">Japón</string> |
| 243 | <string name="region_usa">EEUU</string> | 236 | <string name="region_usa">EEUU</string> |
| 244 | <string name="region_europe">Europa</string> | 237 | <string name="region_europe">Europa</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Ajustar a la ventana</string> | 304 | <string name="ratio_stretch">Ajustar a la ventana</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Auto</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Preciso</string> | 307 | <string name="cpu_accuracy_accurate">Preciso</string> |
| 316 | <string name="cpu_accuracy_unsafe">Impreciso</string> | 308 | <string name="cpu_accuracy_unsafe">Impreciso</string> |
| 317 | <string name="cpu_accuracy_paranoid">Paranoico (Lento)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Fichier de clés sélectionné invalide</string> | 61 | <string name="invalid_keys_file">Fichier de clés sélectionné invalide</string> |
| 62 | <string name="install_keys_success">Clés installées avec succès</string> | 62 | <string name="install_keys_success">Clés installées avec succès</string> |
| 63 | <string name="reading_keys_failure">Erreur lors de la lecture des clés de chiffrement</string> | 63 | <string name="reading_keys_failure">Erreur lors de la lecture des clés de chiffrement</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Vérifiez que vos clés ont l\'extension .keys.\n\n | ||
| 66 | 2. Les clés ne doivent pas être stockées dans le dossier Téléchargements.\n\n | ||
| 67 | Résolvez le(s) problème(s) et réessayez. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Clés de chiffrement invalides</string> | 64 | <string name="invalid_keys_error">Clés de chiffrement invalides</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés.</string> | 66 | <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 @@ | |||
| 184 | <string name="installing_driver">Installation du pilote...</string> | 179 | <string name="installing_driver">Installation du pilote...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Paramètres avancés</string> | ||
| 188 | <string name="preferences_settings">Paramètres</string> | 182 | <string name="preferences_settings">Paramètres</string> |
| 189 | <string name="preferences_general">Général</string> | 183 | <string name="preferences_general">Général</string> |
| 190 | <string name="preferences_system">Système</string> | 184 | <string name="preferences_system">Système</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <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> | 232 | <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> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Sélection automatique</string> | ||
| 242 | <string name="region_japan">Japon</string> | 235 | <string name="region_japan">Japon</string> |
| 243 | <string name="region_usa">É.-U.A.</string> | 236 | <string name="region_usa">É.-U.A.</string> |
| 244 | <string name="region_europe">Europe</string> | 237 | <string name="region_europe">Europe</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Étirer à la fenêtre</string> | 304 | <string name="ratio_stretch">Étirer à la fenêtre</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Auto</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Précis</string> | 307 | <string name="cpu_accuracy_accurate">Précis</string> |
| 316 | <string name="cpu_accuracy_unsafe">Risqué</string> | 308 | <string name="cpu_accuracy_unsafe">Risqué</string> |
| 317 | <string name="cpu_accuracy_paranoid">Paranoïaque (Lent)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Selezionate chiavi non valide</string> | 61 | <string name="invalid_keys_file">Selezionate chiavi non valide</string> |
| 62 | <string name="install_keys_success">Chiavi installate correttamente</string> | 62 | <string name="install_keys_success">Chiavi installate correttamente</string> |
| 63 | <string name="reading_keys_failure">Errore durante la lettura delle chiavi di crittografia</string> | 63 | <string name="reading_keys_failure">Errore durante la lettura delle chiavi di crittografia</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Verifica che le tue chiavi abbiano l\'estensione .keys.\n\n | ||
| 66 | 2. Le chiavi non devono essere archiviate nella cartella Download.\n\n | ||
| 67 | Risolvi i problemi e riprova.</string> | ||
| 68 | <string name="invalid_keys_error">Chiavi di crittografia non valide</string> | 64 | <string name="invalid_keys_error">Chiavi di crittografia non valide</string> |
| 69 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 70 | <string name="install_keys_failure_description">Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi.</string> | 66 | <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> | |||
| 183 | <string name="installing_driver">Installando i driver...</string> | 179 | <string name="installing_driver">Installando i driver...</string> |
| 184 | 180 | ||
| 185 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 186 | <string name="preferences_advanced_settings">Impostazioni Avanzate</string> | ||
| 187 | <string name="preferences_settings">Impostazioni</string> | 182 | <string name="preferences_settings">Impostazioni</string> |
| 188 | <string name="preferences_general">Generali</string> | 183 | <string name="preferences_general">Generali</string> |
| 189 | <string name="preferences_system">Sistema</string> | 184 | <string name="preferences_system">Sistema</string> |
| @@ -237,7 +232,6 @@ Risolvi i problemi e riprova.</string> | |||
| 237 | <string name="performance_warning">Disattivare questa impostazione può ridurre significativamente le performance di emulazione! Per una migliore esperienza, è consigliato lasciare questa impostazione attivata.</string> | 232 | <string name="performance_warning">Disattivare questa impostazione può ridurre significativamente le performance di emulazione! Per una migliore esperienza, è consigliato lasciare questa impostazione attivata.</string> |
| 238 | 233 | ||
| 239 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 240 | <string name="region_auto">Selezione automatica</string> | ||
| 241 | <string name="region_japan">Giappone</string> | 235 | <string name="region_japan">Giappone</string> |
| 242 | <string name="region_usa">USA</string> | 236 | <string name="region_usa">USA</string> |
| 243 | <string name="region_europe">Europa</string> | 237 | <string name="region_europe">Europa</string> |
| @@ -310,7 +304,6 @@ Risolvi i problemi e riprova.</string> | |||
| 310 | <string name="ratio_stretch">Allunga a finestra</string> | 304 | <string name="ratio_stretch">Allunga a finestra</string> |
| 311 | 305 | ||
| 312 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 313 | <string name="cpu_accuracy_auto">Automatico</string> | ||
| 314 | <string name="cpu_accuracy_accurate">Accurata</string> | 307 | <string name="cpu_accuracy_accurate">Accurata</string> |
| 315 | <string name="cpu_accuracy_unsafe">Non sicura</string> | 308 | <string name="cpu_accuracy_unsafe">Non sicura</string> |
| 316 | <string name="cpu_accuracy_paranoid">Paranoico (Lento)</string> | 309 | <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 @@ | |||
| 60 | <string name="invalid_keys_file">無効なキーファイルが選択されました</string> | 60 | <string name="invalid_keys_file">無効なキーファイルが選択されました</string> |
| 61 | <string name="install_keys_success">正常にインストールされました</string> | 61 | <string name="install_keys_success">正常にインストールされました</string> |
| 62 | <string name="reading_keys_failure">暗号化キーの読み取りエラー</string> | 62 | <string name="reading_keys_failure">暗号化キーの読み取りエラー</string> |
| 63 | <string name="install_keys_failure_extension_description"> | ||
| 64 | 1. キーの拡張子が .keys であることを確認します。\n\n | ||
| 65 | 2. キーはダウンロードフォルダに保存しないでください。\n\n | ||
| 66 | 問題を解決して、再度お試しください。 | ||
| 67 | </string> | ||
| 68 | <string name="invalid_keys_error">暗号化キーが無効です</string> | 63 | <string name="invalid_keys_error">暗号化キーが無効です</string> |
| 69 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 64 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 70 | <string name="install_keys_failure_description">選択されたファイルが不正または破損しています。キーを再ダンプしてください。</string> | 65 | <string name="install_keys_failure_description">選択されたファイルが不正または破損しています。キーを再ダンプしてください。</string> |
| @@ -183,7 +178,6 @@ | |||
| 183 | <string name="installing_driver">インストール中…</string> | 178 | <string name="installing_driver">インストール中…</string> |
| 184 | 179 | ||
| 185 | <!-- Preferences Screen --> | 180 | <!-- Preferences Screen --> |
| 186 | <string name="preferences_advanced_settings">詳細設定</string> | ||
| 187 | <string name="preferences_settings">設定</string> | 181 | <string name="preferences_settings">設定</string> |
| 188 | <string name="preferences_general">全般</string> | 182 | <string name="preferences_general">全般</string> |
| 189 | <string name="preferences_system">システム</string> | 183 | <string name="preferences_system">システム</string> |
| @@ -236,7 +230,6 @@ | |||
| 236 | <string name="performance_warning">この設定をオフにすると、エミュレーションのパフォーマンスが著しく低下します!最高の体験を得るためには、この設定を有効にしておくことをお勧めします。</string> | 230 | <string name="performance_warning">この設定をオフにすると、エミュレーションのパフォーマンスが著しく低下します!最高の体験を得るためには、この設定を有効にしておくことをお勧めします。</string> |
| 237 | 231 | ||
| 238 | <!-- Region Names --> | 232 | <!-- Region Names --> |
| 239 | <string name="region_auto">自動選択</string> | ||
| 240 | <string name="region_japan">日本</string> | 233 | <string name="region_japan">日本</string> |
| 241 | <string name="region_usa">アメリカ</string> | 234 | <string name="region_usa">アメリカ</string> |
| 242 | <string name="region_europe">ヨーロッパ</string> | 235 | <string name="region_europe">ヨーロッパ</string> |
| @@ -309,7 +302,6 @@ | |||
| 309 | <string name="ratio_stretch">ウィンドウに合わせる</string> | 302 | <string name="ratio_stretch">ウィンドウに合わせる</string> |
| 310 | 303 | ||
| 311 | <!-- CPU Accuracy --> | 304 | <!-- CPU Accuracy --> |
| 312 | <string name="cpu_accuracy_auto">自動</string> | ||
| 313 | <string name="cpu_accuracy_accurate">正確</string> | 305 | <string name="cpu_accuracy_accurate">正確</string> |
| 314 | <string name="cpu_accuracy_unsafe">不安定</string> | 306 | <string name="cpu_accuracy_unsafe">不安定</string> |
| 315 | <string name="cpu_accuracy_paranoid">パラノイド (低速)</string> | 307 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">잘못된 keys 파일 선택</string> | 61 | <string name="invalid_keys_file">잘못된 keys 파일 선택</string> |
| 62 | <string name="install_keys_success">keys가 성공적으로 설치됨</string> | 62 | <string name="install_keys_success">keys가 성공적으로 설치됨</string> |
| 63 | <string name="reading_keys_failure">암호화 keys 읽기 오류</string> | 63 | <string name="reading_keys_failure">암호화 keys 읽기 오류</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. keys의 확장자가 .keys인지 확인하세요.\n\n | ||
| 66 | 2. keys는 다운로드 폴더에 저장하면 안 됩니다.\n\n | ||
| 67 | 문제를 해결하고 다시 시도하세요. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">잘못된 암호화 keys</string> | 64 | <string name="invalid_keys_error">잘못된 암호화 keys</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">선택한 파일이 잘못되었거나 손상되었습니다. keys를 다시 덤프하세요.</string> | 66 | <string name="install_keys_failure_description">선택한 파일이 잘못되었거나 손상되었습니다. keys를 다시 덤프하세요.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">드라이버 설치 중...</string> | 179 | <string name="installing_driver">드라이버 설치 중...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">고급 설정</string> | ||
| 188 | <string name="preferences_settings">설정</string> | 182 | <string name="preferences_settings">설정</string> |
| 189 | <string name="preferences_general">일반</string> | 183 | <string name="preferences_general">일반</string> |
| 190 | <string name="preferences_system">시스템</string> | 184 | <string name="preferences_system">시스템</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <string name="performance_warning">이 설정을 끄면 에뮬레이션 성능이 크게 저하됩니다! 최상의 환경을 위해 이 설정을 활성화된 상태로 두는 것이 좋습니다.</string> | 232 | <string name="performance_warning">이 설정을 끄면 에뮬레이션 성능이 크게 저하됩니다! 최상의 환경을 위해 이 설정을 활성화된 상태로 두는 것이 좋습니다.</string> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">자동 선택</string> | ||
| 242 | <string name="region_japan">일본</string> | 235 | <string name="region_japan">일본</string> |
| 243 | <string name="region_usa">미국</string> | 236 | <string name="region_usa">미국</string> |
| 244 | <string name="region_europe">유럽</string> | 237 | <string name="region_europe">유럽</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">창에 맞게 늘림</string> | 304 | <string name="ratio_stretch">창에 맞게 늘림</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">자동</string> | ||
| 315 | <string name="cpu_accuracy_accurate">정확함</string> | 307 | <string name="cpu_accuracy_accurate">정확함</string> |
| 316 | <string name="cpu_accuracy_unsafe">안전하지 않음</string> | 308 | <string name="cpu_accuracy_unsafe">안전하지 않음</string> |
| 317 | <string name="cpu_accuracy_paranoid">편집증 (느림)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Ugyldig nøkkelfil valgt</string> | 61 | <string name="invalid_keys_file">Ugyldig nøkkelfil valgt</string> |
| 62 | <string name="install_keys_success">Nøkler vellykket installert</string> | 62 | <string name="install_keys_success">Nøkler vellykket installert</string> |
| 63 | <string name="reading_keys_failure">Feil ved lesing av krypteringsnøkler</string> | 63 | <string name="reading_keys_failure">Feil ved lesing av krypteringsnøkler</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Kontroller at nøklene har filtypen .keys.\n\n | ||
| 66 | 2. Nøkler må ikke lagres i nedlastingsmappen.\n\n | ||
| 67 | Løs problemet/problemene og prøv igjen. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Ugyldige krypteringsnøkler</string> | 64 | <string name="invalid_keys_error">Ugyldige krypteringsnøkler</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">Den valgte filen er feil eller ødelagt. Vennligst dump nøklene på nytt.</string> | 66 | <string name="install_keys_failure_description">Den valgte filen er feil eller ødelagt. Vennligst dump nøklene på nytt.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">Installerer driver...</string> | 179 | <string name="installing_driver">Installerer driver...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Avanserte innstillinger</string> | ||
| 188 | <string name="preferences_settings">Innstillinger</string> | 182 | <string name="preferences_settings">Innstillinger</string> |
| 189 | <string name="preferences_general">Generelt</string> | 183 | <string name="preferences_general">Generelt</string> |
| 190 | <string name="preferences_system">System</string> | 184 | <string name="preferences_system">System</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <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> | 232 | <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> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Automatisk valg</string> | ||
| 242 | <string name="region_japan">Japan</string> | 235 | <string name="region_japan">Japan</string> |
| 243 | <string name="region_usa">USA</string> | 236 | <string name="region_usa">USA</string> |
| 244 | <string name="region_europe">Europa</string> | 237 | <string name="region_europe">Europa</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Strekk til Vindu</string> | 304 | <string name="ratio_stretch">Strekk til Vindu</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Auto</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Nøyaktig</string> | 307 | <string name="cpu_accuracy_accurate">Nøyaktig</string> |
| 316 | <string name="cpu_accuracy_unsafe">Utrygt</string> | 308 | <string name="cpu_accuracy_unsafe">Utrygt</string> |
| 317 | <string name="cpu_accuracy_paranoid">Paranoid (Langsom)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Wybrano niepoprawne klucze</string> | 61 | <string name="invalid_keys_file">Wybrano niepoprawne klucze</string> |
| 62 | <string name="install_keys_success">Klucze zainstalowane pomyślnie</string> | 62 | <string name="install_keys_success">Klucze zainstalowane pomyślnie</string> |
| 63 | <string name="reading_keys_failure">Błąd podczas odczytu kluczy</string> | 63 | <string name="reading_keys_failure">Błąd podczas odczytu kluczy</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Upewnij się że klucze mają rozszerzenie .keys. \n\n | ||
| 66 | 2. Klucze nie mogą znajdować się w folderze Pobrane. \n\n | ||
| 67 | Rozwiąż te problemy (oba) i spróbuj ponownie.</string> | ||
| 68 | <string name="invalid_keys_error">Niepoprawne klucze</string> | 64 | <string name="invalid_keys_error">Niepoprawne klucze</string> |
| 69 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 70 | <string name="install_keys_failure_description">Wybrany plik jest niepoprawny lub uszkodzony. Zrzuć ponownie swoje klucze.</string> | 66 | <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> | |||
| 183 | <string name="installing_driver">Instalowanie sterownika...</string> | 179 | <string name="installing_driver">Instalowanie sterownika...</string> |
| 184 | 180 | ||
| 185 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 186 | <string name="preferences_advanced_settings">Zaawansowane</string> | ||
| 187 | <string name="preferences_settings">Ustawienia</string> | 182 | <string name="preferences_settings">Ustawienia</string> |
| 188 | <string name="preferences_general">Ogólne</string> | 183 | <string name="preferences_general">Ogólne</string> |
| 189 | <string name="preferences_system">System</string> | 184 | <string name="preferences_system">System</string> |
| @@ -237,7 +232,6 @@ Rozwiąż te problemy (oba) i spróbuj ponownie.</string> | |||
| 237 | <string name="performance_warning">Wyłączenie tej opcji znacząco ograniczy wydajność! Dla najlepszego doświadczenia, zaleca się zostawienie tej opcji włączonej.</string> | 232 | <string name="performance_warning">Wyłączenie tej opcji znacząco ograniczy wydajność! Dla najlepszego doświadczenia, zaleca się zostawienie tej opcji włączonej.</string> |
| 238 | 233 | ||
| 239 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 240 | <string name="region_auto">Auto-wybór</string> | ||
| 241 | <string name="region_japan">Japonia</string> | 235 | <string name="region_japan">Japonia</string> |
| 242 | <string name="region_usa">USA</string> | 236 | <string name="region_usa">USA</string> |
| 243 | <string name="region_europe">Europa</string> | 237 | <string name="region_europe">Europa</string> |
| @@ -310,7 +304,6 @@ Rozwiąż te problemy (oba) i spróbuj ponownie.</string> | |||
| 310 | <string name="ratio_stretch">Rozciągnij do Okna</string> | 304 | <string name="ratio_stretch">Rozciągnij do Okna</string> |
| 311 | 305 | ||
| 312 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 313 | <string name="cpu_accuracy_auto">Automatyczny</string> | ||
| 314 | <string name="cpu_accuracy_accurate">Dokładny</string> | 307 | <string name="cpu_accuracy_accurate">Dokładny</string> |
| 315 | <string name="cpu_accuracy_unsafe">Niebezpieczny</string> | 308 | <string name="cpu_accuracy_unsafe">Niebezpieczny</string> |
| 316 | <string name="cpu_accuracy_paranoid">Paranoid (Wolny)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Ficheiro de chaves inválido</string> | 61 | <string name="invalid_keys_file">Ficheiro de chaves inválido</string> |
| 62 | <string name="install_keys_success">Chaves instaladas com sucesso</string> | 62 | <string name="install_keys_success">Chaves instaladas com sucesso</string> |
| 63 | <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> | 63 | <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Verifica se as tuas chaves têm a extensão .keys.\n\n | ||
| 66 | 2. As Chaves não podem estar gravadas na pasta Transferências.\n\n | ||
| 67 | Resolve esta(s) questões e tenta novamente. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Chaves de encriptação inválidas</string> | 64 | <string name="invalid_keys_error">Chaves de encriptação inválidas</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> | 66 | <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">A instalar o Driver...</string> | 179 | <string name="installing_driver">A instalar o Driver...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Configurações avançadas</string> | ||
| 188 | <string name="preferences_settings">Configurações</string> | 182 | <string name="preferences_settings">Configurações</string> |
| 189 | <string name="preferences_general">Geral</string> | 183 | <string name="preferences_general">Geral</string> |
| 190 | <string name="preferences_system">Sistema</string> | 184 | <string name="preferences_system">Sistema</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <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> | 232 | <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> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Auto seleção</string> | ||
| 242 | <string name="region_japan">Japão</string> | 235 | <string name="region_japan">Japão</string> |
| 243 | <string name="region_usa">EUA</string> | 236 | <string name="region_usa">EUA</string> |
| 244 | <string name="region_europe">Europa</string> | 237 | <string name="region_europe">Europa</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Esticar para a janela</string> | 304 | <string name="ratio_stretch">Esticar para a janela</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Automático</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Preciso</string> | 307 | <string name="cpu_accuracy_accurate">Preciso</string> |
| 316 | <string name="cpu_accuracy_unsafe">Não seguro</string> | 308 | <string name="cpu_accuracy_unsafe">Não seguro</string> |
| 317 | <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Ficheiro de chaves inválido</string> | 61 | <string name="invalid_keys_file">Ficheiro de chaves inválido</string> |
| 62 | <string name="install_keys_success">Chaves instaladas com sucesso</string> | 62 | <string name="install_keys_success">Chaves instaladas com sucesso</string> |
| 63 | <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> | 63 | <string name="reading_keys_failure">Erro ao ler chaves de encriptação</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Verifica se as tuas chaves têm a extensão .keys.\n\n | ||
| 66 | 2. As Chaves não podem estar gravadas na pasta Transferências.\n\n | ||
| 67 | Resolve esta(s) questões e tenta novamente. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Chaves de encriptação inválidas</string> | 64 | <string name="invalid_keys_error">Chaves de encriptação inválidas</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> | 66 | <string name="install_keys_failure_description">O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">A instalar o Driver...</string> | 179 | <string name="installing_driver">A instalar o Driver...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Configurações avançadas</string> | ||
| 188 | <string name="preferences_settings">Configurações</string> | 182 | <string name="preferences_settings">Configurações</string> |
| 189 | <string name="preferences_general">Geral</string> | 183 | <string name="preferences_general">Geral</string> |
| 190 | <string name="preferences_system">Sistema</string> | 184 | <string name="preferences_system">Sistema</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <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> | 232 | <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> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Autosseleção</string> | ||
| 242 | <string name="region_japan">Japão</string> | 235 | <string name="region_japan">Japão</string> |
| 243 | <string name="region_usa">EUA</string> | 236 | <string name="region_usa">EUA</string> |
| 244 | <string name="region_europe">Europa</string> | 237 | <string name="region_europe">Europa</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Esticar à Janela</string> | 304 | <string name="ratio_stretch">Esticar à Janela</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Automático</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Preciso</string> | 307 | <string name="cpu_accuracy_accurate">Preciso</string> |
| 316 | <string name="cpu_accuracy_unsafe">Inseguro</string> | 308 | <string name="cpu_accuracy_unsafe">Inseguro</string> |
| 317 | <string name="cpu_accuracy_paranoid">Paranoid (Lento)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Выбран неверный файл ключей</string> | 61 | <string name="invalid_keys_file">Выбран неверный файл ключей</string> |
| 62 | <string name="install_keys_success">Ключи успешно установлены</string> | 62 | <string name="install_keys_success">Ключи успешно установлены</string> |
| 63 | <string name="reading_keys_failure">Ошибка при чтении ключей шифрования</string> | 63 | <string name="reading_keys_failure">Ошибка при чтении ключей шифрования</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Убедитесь, что ваши ключи имеют расширение .keys\n\n | ||
| 66 | 2. Ключи не должны находиться в папке Downloads.\n\n | ||
| 67 | Исправьте проблему(-ы) и повторите попытку. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Неверные ключи шифрования</string> | 64 | <string name="invalid_keys_error">Неверные ключи шифрования</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">Выбранный файл неверен или поврежден. Пожалуйста, пере-дампите ваши ключи.</string> | 66 | <string name="install_keys_failure_description">Выбранный файл неверен или поврежден. Пожалуйста, пере-дампите ваши ключи.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">Установка драйвера...</string> | 179 | <string name="installing_driver">Установка драйвера...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Расширенные настройки</string> | ||
| 188 | <string name="preferences_settings">Настройки</string> | 182 | <string name="preferences_settings">Настройки</string> |
| 189 | <string name="preferences_general">Общие</string> | 183 | <string name="preferences_general">Общие</string> |
| 190 | <string name="preferences_system">Система</string> | 184 | <string name="preferences_system">Система</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <string name="performance_warning">Отключение этой настройки значительно снизит производительность эмуляции! Для достижения наилучших результатов рекомендуется оставить эту настройку включенной.</string> | 232 | <string name="performance_warning">Отключение этой настройки значительно снизит производительность эмуляции! Для достижения наилучших результатов рекомендуется оставить эту настройку включенной.</string> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Авто-выбор</string> | ||
| 242 | <string name="region_japan">Япония</string> | 235 | <string name="region_japan">Япония</string> |
| 243 | <string name="region_usa">США</string> | 236 | <string name="region_usa">США</string> |
| 244 | <string name="region_europe">Европа</string> | 237 | <string name="region_europe">Европа</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Растянуть до окна</string> | 304 | <string name="ratio_stretch">Растянуть до окна</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Авто</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Точно</string> | 307 | <string name="cpu_accuracy_accurate">Точно</string> |
| 316 | <string name="cpu_accuracy_unsafe">Небезопасно</string> | 308 | <string name="cpu_accuracy_unsafe">Небезопасно</string> |
| 317 | <string name="cpu_accuracy_paranoid">Параноик (медленно)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">Вибрано неправильний файл ключів</string> | 61 | <string name="invalid_keys_file">Вибрано неправильний файл ключів</string> |
| 62 | <string name="install_keys_success">Ключі успішно встановлено</string> | 62 | <string name="install_keys_success">Ключі успішно встановлено</string> |
| 63 | <string name="reading_keys_failure">Помилка під час зчитування ключів шифрування</string> | 63 | <string name="reading_keys_failure">Помилка під час зчитування ключів шифрування</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. Переконайтеся, що ваші ключі мають розширення .keys\n\n | ||
| 66 | 2. Ключі не повинні знаходитися в папці Downloads.\n\n | ||
| 67 | Виправте проблему(-и) та спробуйте ще раз. | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">Невірні ключі шифрування</string> | 64 | <string name="invalid_keys_error">Невірні ключі шифрування</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">Обраний файл невірний або пошкоджений. Будь ласка, пере-дампіть ваші ключі.</string> | 66 | <string name="install_keys_failure_description">Обраний файл невірний або пошкоджений. Будь ласка, пере-дампіть ваші ключі.</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">Встановлення драйвера...</string> | 179 | <string name="installing_driver">Встановлення драйвера...</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">Розширені налаштування</string> | ||
| 188 | <string name="preferences_settings">Налаштування</string> | 182 | <string name="preferences_settings">Налаштування</string> |
| 189 | <string name="preferences_general">Загальні</string> | 183 | <string name="preferences_general">Загальні</string> |
| 190 | <string name="preferences_system">Система</string> | 184 | <string name="preferences_system">Система</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <string name="performance_warning">Вимкнення цього налаштування значно знизить продуктивність емуляції! Для досягнення найкращих результатів рекомендується залишити це налаштування увімкненим.</string> | 232 | <string name="performance_warning">Вимкнення цього налаштування значно знизить продуктивність емуляції! Для досягнення найкращих результатів рекомендується залишити це налаштування увімкненим.</string> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">Авто-вибір</string> | ||
| 242 | <string name="region_japan">Японія</string> | 235 | <string name="region_japan">Японія</string> |
| 243 | <string name="region_usa">США</string> | 236 | <string name="region_usa">США</string> |
| 244 | <string name="region_europe">Європа</string> | 237 | <string name="region_europe">Європа</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">Розтягнути до вікна</string> | 304 | <string name="ratio_stretch">Розтягнути до вікна</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">Авто</string> | ||
| 315 | <string name="cpu_accuracy_accurate">Точно</string> | 307 | <string name="cpu_accuracy_accurate">Точно</string> |
| 316 | <string name="cpu_accuracy_unsafe">Небезпечно</string> | 308 | <string name="cpu_accuracy_unsafe">Небезпечно</string> |
| 317 | <string name="cpu_accuracy_paranoid">Параноїк (повільно)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">选择的密钥文件无效</string> | 61 | <string name="invalid_keys_file">选择的密钥文件无效</string> |
| 62 | <string name="install_keys_success">密钥文件已成功安装</string> | 62 | <string name="install_keys_success">密钥文件已成功安装</string> |
| 63 | <string name="reading_keys_failure">读取加密密钥时出错</string> | 63 | <string name="reading_keys_failure">读取加密密钥时出错</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. 验证您的密钥文件是否具有 .keys 扩展名。\n\n | ||
| 66 | 2. 密钥文件不能放置于 Downloads 文件夹。\n\n | ||
| 67 | 解决问题并再试一次。 | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">无效的加密密钥</string> | 64 | <string name="invalid_keys_error">无效的加密密钥</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">选择的密钥文件不正确或已损坏。请重新转储密钥文件。</string> | 66 | <string name="install_keys_failure_description">选择的密钥文件不正确或已损坏。请重新转储密钥文件。</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">正在安装驱动程序…</string> | 179 | <string name="installing_driver">正在安装驱动程序…</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">高级选项</string> | ||
| 188 | <string name="preferences_settings">设置</string> | 182 | <string name="preferences_settings">设置</string> |
| 189 | <string name="preferences_general">通用</string> | 183 | <string name="preferences_general">通用</string> |
| 190 | <string name="preferences_system">系统</string> | 184 | <string name="preferences_system">系统</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <string name="performance_warning">关闭此项会显著降低模拟性能!建议您将此项保持为启用状态。</string> | 232 | <string name="performance_warning">关闭此项会显著降低模拟性能!建议您将此项保持为启用状态。</string> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">自动选择</string> | ||
| 242 | <string name="region_japan">日本</string> | 235 | <string name="region_japan">日本</string> |
| 243 | <string name="region_usa">美国</string> | 236 | <string name="region_usa">美国</string> |
| 244 | <string name="region_europe">欧洲</string> | 237 | <string name="region_europe">欧洲</string> |
| @@ -311,7 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">拉伸窗口</string> | 304 | <string name="ratio_stretch">拉伸窗口</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">自动</string> | ||
| 315 | <string name="cpu_accuracy_accurate">高精度</string> | 307 | <string name="cpu_accuracy_accurate">高精度</string> |
| 316 | <string name="cpu_accuracy_unsafe">低精度</string> | 308 | <string name="cpu_accuracy_unsafe">低精度</string> |
| 317 | <string name="cpu_accuracy_paranoid">偏执模式 (慢速)</string> | 309 | <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 @@ | |||
| 61 | <string name="invalid_keys_file">無效的金鑰檔案已選取</string> | 61 | <string name="invalid_keys_file">無效的金鑰檔案已選取</string> |
| 62 | <string name="install_keys_success">金鑰已成功安裝</string> | 62 | <string name="install_keys_success">金鑰已成功安裝</string> |
| 63 | <string name="reading_keys_failure">讀取加密金鑰時出現錯誤</string> | 63 | <string name="reading_keys_failure">讀取加密金鑰時出現錯誤</string> |
| 64 | <string name="install_keys_failure_extension_description"> | ||
| 65 | 1. 驗證您的金鑰是否具有 .keys 副檔名。\n\n | ||
| 66 | 2. 金鑰不能儲存於 Downloads 資料夾。\n\n | ||
| 67 | 解決問題並再試一次。 | ||
| 68 | </string> | ||
| 69 | <string name="invalid_keys_error">無效的加密金鑰</string> | 64 | <string name="invalid_keys_error">無效的加密金鑰</string> |
| 70 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> | 65 | <string name="dumping_keys_quickstart_link">https://yuzu-emu.org/help/quickstart/#dumping-decryption-keys</string> |
| 71 | <string name="install_keys_failure_description">選取的檔案不正確或已損毀,請重新傾印您的金鑰。</string> | 66 | <string name="install_keys_failure_description">選取的檔案不正確或已損毀,請重新傾印您的金鑰。</string> |
| @@ -184,7 +179,6 @@ | |||
| 184 | <string name="installing_driver">正在安裝驅動程式…</string> | 179 | <string name="installing_driver">正在安裝驅動程式…</string> |
| 185 | 180 | ||
| 186 | <!-- Preferences Screen --> | 181 | <!-- Preferences Screen --> |
| 187 | <string name="preferences_advanced_settings">進階設定</string> | ||
| 188 | <string name="preferences_settings">設定</string> | 182 | <string name="preferences_settings">設定</string> |
| 189 | <string name="preferences_general">一般</string> | 183 | <string name="preferences_general">一般</string> |
| 190 | <string name="preferences_system">系統</string> | 184 | <string name="preferences_system">系統</string> |
| @@ -238,7 +232,6 @@ | |||
| 238 | <string name="performance_warning">關閉此設定會顯著降低模擬效能!如需最佳體驗,建議您將此設定保持為啟用狀態。</string> | 232 | <string name="performance_warning">關閉此設定會顯著降低模擬效能!如需最佳體驗,建議您將此設定保持為啟用狀態。</string> |
| 239 | 233 | ||
| 240 | <!-- Region Names --> | 234 | <!-- Region Names --> |
| 241 | <string name="region_auto">自動選取</string> | ||
| 242 | <string name="region_japan">日本</string> | 235 | <string name="region_japan">日本</string> |
| 243 | <string name="region_usa">美國</string> | 236 | <string name="region_usa">美國</string> |
| 244 | <string name="region_europe">歐洲</string> | 237 | <string name="region_europe">歐洲</string> |
| @@ -311,8 +304,6 @@ | |||
| 311 | <string name="ratio_stretch">延伸視窗</string> | 304 | <string name="ratio_stretch">延伸視窗</string> |
| 312 | 305 | ||
| 313 | <!-- CPU Accuracy --> | 306 | <!-- CPU Accuracy --> |
| 314 | <string name="cpu_accuracy_auto">自動</string> | ||
| 315 | <string name="cpu_accuracy_accurate">高精度</string> | ||
| 316 | <string name="cpu_accuracy_unsafe">低精度</string> | 307 | <string name="cpu_accuracy_unsafe">低精度</string> |
| 317 | <string name="cpu_accuracy_paranoid">不合理 (慢)</string> | 308 | <string name="cpu_accuracy_paranoid">不合理 (慢)</string> |
| 318 | 309 | ||
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 @@ | |||
| 102 | <string name="share_log">Share debug logs</string> | 102 | <string name="share_log">Share debug logs</string> |
| 103 | <string name="share_log_description">Share yuzu\'s log file to debug issues</string> | 103 | <string name="share_log_description">Share yuzu\'s log file to debug issues</string> |
| 104 | <string name="share_log_missing">No log file found</string> | 104 | <string name="share_log_missing">No log file found</string> |
| 105 | <string name="install_game_content">Install game content</string> | ||
| 106 | <string name="install_game_content_description">Install game updates or DLC</string> | ||
| 107 | <string name="install_game_content_failure">Error installing file to NAND</string> | ||
| 108 | <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> | ||
| 109 | <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> | ||
| 110 | <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> | ||
| 111 | <string name="install_game_content_success">Game content installed successfully</string> | ||
| 112 | <string name="install_game_content_success_overwrite">Game content was overwritten successfully</string> | ||
| 113 | <string name="install_game_content_help_link">https://yuzu-emu.org/help/quickstart/#dumping-installed-updates</string> | ||
| 105 | 114 | ||
| 106 | <!-- About screen strings --> | 115 | <!-- About screen strings --> |
| 107 | <string name="gaia_is_not_real">Gaia isn\'t real</string> | 116 | <string name="gaia_is_not_real">Gaia isn\'t real</string> |
| @@ -160,6 +169,8 @@ | |||
| 160 | <string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string> | 169 | <string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string> |
| 161 | <string name="renderer_asynchronous_shaders">Use asynchronous shaders</string> | 170 | <string name="renderer_asynchronous_shaders">Use asynchronous shaders</string> |
| 162 | <string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously, reducing stutter but may introduce glitches.</string> | 171 | <string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously, reducing stutter but may introduce glitches.</string> |
| 172 | <string name="renderer_reactive_flushing">Use reactive flushing</string> | ||
| 173 | <string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string> | ||
| 163 | <string name="renderer_debug">Graphics debugging</string> | 174 | <string name="renderer_debug">Graphics debugging</string> |
| 164 | <string name="renderer_debug_description">Sets the graphics API to a slow debugging mode.</string> | 175 | <string name="renderer_debug_description">Sets the graphics API to a slow debugging mode.</string> |
| 165 | <string name="use_disk_shader_cache">Disk shader cache</string> | 176 | <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 @@ | |||
| 4 | add_library(core STATIC | 4 | add_library(core STATIC |
| 5 | arm/arm_interface.h | 5 | arm/arm_interface.h |
| 6 | arm/arm_interface.cpp | 6 | arm/arm_interface.cpp |
| 7 | arm/dynarmic/arm_exclusive_monitor.cpp | ||
| 8 | arm/dynarmic/arm_exclusive_monitor.h | ||
| 9 | arm/exclusive_monitor.cpp | 7 | arm/exclusive_monitor.cpp |
| 10 | arm/exclusive_monitor.h | 8 | arm/exclusive_monitor.h |
| 11 | arm/symbols.cpp | 9 | arm/symbols.cpp |
| @@ -849,12 +847,15 @@ endif() | |||
| 849 | 847 | ||
| 850 | if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) | 848 | if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) |
| 851 | target_sources(core PRIVATE | 849 | target_sources(core PRIVATE |
| 850 | arm/dynarmic/arm_dynarmic.h | ||
| 852 | arm/dynarmic/arm_dynarmic_64.cpp | 851 | arm/dynarmic/arm_dynarmic_64.cpp |
| 853 | arm/dynarmic/arm_dynarmic_64.h | 852 | arm/dynarmic/arm_dynarmic_64.h |
| 854 | arm/dynarmic/arm_dynarmic_32.cpp | 853 | arm/dynarmic/arm_dynarmic_32.cpp |
| 855 | arm/dynarmic/arm_dynarmic_32.h | 854 | arm/dynarmic/arm_dynarmic_32.h |
| 856 | arm/dynarmic/arm_dynarmic_cp15.cpp | 855 | arm/dynarmic/dynarmic_cp15.cpp |
| 857 | arm/dynarmic/arm_dynarmic_cp15.h | 856 | arm/dynarmic/dynarmic_cp15.h |
| 857 | arm/dynarmic/dynarmic_exclusive_monitor.cpp | ||
| 858 | arm/dynarmic/dynarmic_exclusive_monitor.h | ||
| 858 | hle/service/jit/jit_context.cpp | 859 | hle/service/jit/jit_context.cpp |
| 859 | hle/service/jit/jit_context.h | 860 | hle/service/jit/jit_context.h |
| 860 | hle/service/jit/jit.cpp | 861 | 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 @@ | |||
| 13 | #include "core/core.h" | 13 | #include "core/core.h" |
| 14 | #include "core/debugger/debugger.h" | 14 | #include "core/debugger/debugger.h" |
| 15 | #include "core/hle/kernel/k_process.h" | 15 | #include "core/hle/kernel/k_process.h" |
| 16 | #include "core/hle/kernel/k_thread.h" | ||
| 16 | #include "core/hle/kernel/svc.h" | 17 | #include "core/hle/kernel/svc.h" |
| 17 | #include "core/loader/loader.h" | 18 | #include "core/loader/loader.h" |
| 18 | #include "core/memory.h" | 19 | #include "core/memory.h" |
| 19 | 20 | ||
| 20 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | ||
| 21 | #include "core/arm/dynarmic/arm_dynarmic_64.h" | ||
| 22 | |||
| 23 | namespace Core { | 21 | namespace Core { |
| 24 | 22 | ||
| 25 | constexpr u64 SEGMENT_BASE = 0x7100000000ull; | 23 | constexpr u64 SEGMENT_BASE = 0x7100000000ull; |
| 26 | 24 | ||
| 27 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( | 25 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( |
| 28 | Core::System& system, const ARM_Interface::ThreadContext32& ctx) { | 26 | Core::System& system, const ARM_Interface::ThreadContext32& ctx) { |
| 29 | return ARM_Dynarmic_32::GetBacktraceFromContext(system, ctx); | 27 | std::vector<BacktraceEntry> out; |
| 28 | auto& memory = system.ApplicationMemory(); | ||
| 29 | |||
| 30 | const auto& reg = ctx.cpu_registers; | ||
| 31 | u32 pc = reg[15], lr = reg[14], fp = reg[11]; | ||
| 32 | out.push_back({"", 0, pc, 0, ""}); | ||
| 33 | |||
| 34 | // fp (= r11) points to the last frame record. | ||
| 35 | // Frame records are two words long: | ||
| 36 | // fp+0 : pointer to previous frame record | ||
| 37 | // fp+4 : value of lr for frame | ||
| 38 | for (size_t i = 0; i < 256; i++) { | ||
| 39 | out.push_back({"", 0, lr, 0, ""}); | ||
| 40 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { | ||
| 41 | break; | ||
| 42 | } | ||
| 43 | lr = memory.Read32(fp + 4); | ||
| 44 | fp = memory.Read32(fp); | ||
| 45 | } | ||
| 46 | |||
| 47 | SymbolicateBacktrace(system, out); | ||
| 48 | |||
| 49 | return out; | ||
| 30 | } | 50 | } |
| 31 | 51 | ||
| 32 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( | 52 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( |
| 33 | Core::System& system, const ARM_Interface::ThreadContext64& ctx) { | 53 | Core::System& system, const ARM_Interface::ThreadContext64& ctx) { |
| 34 | return ARM_Dynarmic_64::GetBacktraceFromContext(system, ctx); | 54 | std::vector<BacktraceEntry> out; |
| 55 | auto& memory = system.ApplicationMemory(); | ||
| 56 | |||
| 57 | const auto& reg = ctx.cpu_registers; | ||
| 58 | u64 pc = ctx.pc, lr = reg[30], fp = reg[29]; | ||
| 59 | |||
| 60 | out.push_back({"", 0, pc, 0, ""}); | ||
| 61 | |||
| 62 | // fp (= x29) points to the previous frame record. | ||
| 63 | // Frame records are two words long: | ||
| 64 | // fp+0 : pointer to previous frame record | ||
| 65 | // fp+8 : value of lr for frame | ||
| 66 | for (size_t i = 0; i < 256; i++) { | ||
| 67 | out.push_back({"", 0, lr, 0, ""}); | ||
| 68 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) { | ||
| 69 | break; | ||
| 70 | } | ||
| 71 | lr = memory.Read64(fp + 8); | ||
| 72 | fp = memory.Read64(fp); | ||
| 73 | } | ||
| 74 | |||
| 75 | SymbolicateBacktrace(system, out); | ||
| 76 | |||
| 77 | return out; | ||
| 35 | } | 78 | } |
| 36 | 79 | ||
| 37 | void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) { | 80 | 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 | |||
| 76 | } | 119 | } |
| 77 | } | 120 | } |
| 78 | 121 | ||
| 122 | std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const { | ||
| 123 | if (GetArchitecture() == Architecture::Aarch64) { | ||
| 124 | ThreadContext64 ctx; | ||
| 125 | SaveContext(ctx); | ||
| 126 | return GetBacktraceFromContext(system, ctx); | ||
| 127 | } else { | ||
| 128 | ThreadContext32 ctx; | ||
| 129 | SaveContext(ctx); | ||
| 130 | return GetBacktraceFromContext(system, ctx); | ||
| 131 | } | ||
| 132 | } | ||
| 133 | |||
| 79 | void ARM_Interface::LogBacktrace() const { | 134 | void ARM_Interface::LogBacktrace() const { |
| 80 | const VAddr sp = GetSP(); | 135 | const VAddr sp = GetSP(); |
| 81 | const VAddr pc = GetPC(); | 136 | const VAddr pc = GetPC(); |
| @@ -83,7 +138,6 @@ void ARM_Interface::LogBacktrace() const { | |||
| 83 | LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address", | 138 | LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address", |
| 84 | "Offset", "Symbol"); | 139 | "Offset", "Symbol"); |
| 85 | LOG_ERROR(Core_ARM, ""); | 140 | LOG_ERROR(Core_ARM, ""); |
| 86 | |||
| 87 | const auto backtrace = GetBacktrace(); | 141 | const auto backtrace = GetBacktrace(); |
| 88 | for (const auto& entry : backtrace) { | 142 | for (const auto& entry : backtrace) { |
| 89 | LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, | 143 | LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, |
| @@ -97,7 +151,7 @@ void ARM_Interface::Run() { | |||
| 97 | 151 | ||
| 98 | while (true) { | 152 | while (true) { |
| 99 | Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; | 153 | Kernel::KThread* current_thread{Kernel::GetCurrentThreadPointer(system.Kernel())}; |
| 100 | Dynarmic::HaltReason hr{}; | 154 | HaltReason hr{}; |
| 101 | 155 | ||
| 102 | // Notify the debugger and go to sleep if a step was performed | 156 | // Notify the debugger and go to sleep if a step was performed |
| 103 | // and this thread has been scheduled again. | 157 | // and this thread has been scheduled again. |
| @@ -108,17 +162,17 @@ void ARM_Interface::Run() { | |||
| 108 | } | 162 | } |
| 109 | 163 | ||
| 110 | // Otherwise, run the thread. | 164 | // Otherwise, run the thread. |
| 111 | system.EnterDynarmicProfile(); | 165 | system.EnterCPUProfile(); |
| 112 | if (current_thread->GetStepState() == StepState::StepPending) { | 166 | if (current_thread->GetStepState() == StepState::StepPending) { |
| 113 | hr = StepJit(); | 167 | hr = StepJit(); |
| 114 | 168 | ||
| 115 | if (Has(hr, step_thread)) { | 169 | if (True(hr & HaltReason::StepThread)) { |
| 116 | current_thread->SetStepState(StepState::StepPerformed); | 170 | current_thread->SetStepState(StepState::StepPerformed); |
| 117 | } | 171 | } |
| 118 | } else { | 172 | } else { |
| 119 | hr = RunJit(); | 173 | hr = RunJit(); |
| 120 | } | 174 | } |
| 121 | system.ExitDynarmicProfile(); | 175 | system.ExitCPUProfile(); |
| 122 | 176 | ||
| 123 | // If the thread is scheduled for termination, exit the thread. | 177 | // If the thread is scheduled for termination, exit the thread. |
| 124 | if (current_thread->HasDpc()) { | 178 | if (current_thread->HasDpc()) { |
| @@ -130,8 +184,8 @@ void ARM_Interface::Run() { | |||
| 130 | 184 | ||
| 131 | // Notify the debugger and go to sleep if a breakpoint was hit, | 185 | // Notify the debugger and go to sleep if a breakpoint was hit, |
| 132 | // or if the thread is unable to continue for any reason. | 186 | // or if the thread is unable to continue for any reason. |
| 133 | if (Has(hr, breakpoint) || Has(hr, no_execute)) { | 187 | if (True(hr & HaltReason::InstructionBreakpoint) || True(hr & HaltReason::PrefetchAbort)) { |
| 134 | if (!Has(hr, no_execute)) { | 188 | if (!True(hr & HaltReason::InstructionBreakpoint)) { |
| 135 | RewindBreakpointInstruction(); | 189 | RewindBreakpointInstruction(); |
| 136 | } | 190 | } |
| 137 | if (system.DebuggerEnabled()) { | 191 | if (system.DebuggerEnabled()) { |
| @@ -144,7 +198,7 @@ void ARM_Interface::Run() { | |||
| 144 | } | 198 | } |
| 145 | 199 | ||
| 146 | // Notify the debugger and go to sleep if a watchpoint was hit. | 200 | // Notify the debugger and go to sleep if a watchpoint was hit. |
| 147 | if (Has(hr, watchpoint)) { | 201 | if (True(hr & HaltReason::DataAbort)) { |
| 148 | if (system.DebuggerEnabled()) { | 202 | if (system.DebuggerEnabled()) { |
| 149 | system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint()); | 203 | system.GetDebugger().NotifyThreadWatchpoint(current_thread, *HaltedWatchpoint()); |
| 150 | } | 204 | } |
| @@ -153,11 +207,11 @@ void ARM_Interface::Run() { | |||
| 153 | } | 207 | } |
| 154 | 208 | ||
| 155 | // Handle syscalls and scheduling (this may change the current thread/core) | 209 | // Handle syscalls and scheduling (this may change the current thread/core) |
| 156 | if (Has(hr, svc_call)) { | 210 | if (True(hr & HaltReason::SupervisorCall)) { |
| 157 | Kernel::Svc::Call(system, GetSvcNumber()); | 211 | Kernel::Svc::Call(system, GetSvcNumber()); |
| 158 | break; | 212 | break; |
| 159 | } | 213 | } |
| 160 | if (Has(hr, break_loop) || !uses_wall_clock) { | 214 | if (True(hr & HaltReason::BreakLoop) || !uses_wall_clock) { |
| 161 | break; | 215 | break; |
| 162 | } | 216 | } |
| 163 | } | 217 | } |
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 @@ | |||
| 8 | #include <string> | 8 | #include <string> |
| 9 | #include <vector> | 9 | #include <vector> |
| 10 | 10 | ||
| 11 | #include <dynarmic/interface/halt_reason.h> | ||
| 12 | |||
| 13 | #include "common/common_funcs.h" | 11 | #include "common/common_funcs.h" |
| 14 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 15 | #include "core/hardware_properties.h" | 13 | #include "core/hardware_properties.h" |
| @@ -30,6 +28,22 @@ class CPUInterruptHandler; | |||
| 30 | 28 | ||
| 31 | using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; | 29 | using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; |
| 32 | 30 | ||
| 31 | // NOTE: these values match the HaltReason enum in Dynarmic | ||
| 32 | enum class HaltReason : u64 { | ||
| 33 | StepThread = 0x00000001, | ||
| 34 | DataAbort = 0x00000004, | ||
| 35 | BreakLoop = 0x02000000, | ||
| 36 | SupervisorCall = 0x04000000, | ||
| 37 | InstructionBreakpoint = 0x08000000, | ||
| 38 | PrefetchAbort = 0x20000000, | ||
| 39 | }; | ||
| 40 | DECLARE_ENUM_FLAG_OPERATORS(HaltReason); | ||
| 41 | |||
| 42 | enum class Architecture { | ||
| 43 | Aarch32, | ||
| 44 | Aarch64, | ||
| 45 | }; | ||
| 46 | |||
| 33 | /// Generic ARMv8 CPU interface | 47 | /// Generic ARMv8 CPU interface |
| 34 | class ARM_Interface { | 48 | class ARM_Interface { |
| 35 | public: | 49 | public: |
| @@ -167,8 +181,9 @@ public: | |||
| 167 | */ | 181 | */ |
| 168 | virtual void SetTPIDR_EL0(u64 value) = 0; | 182 | virtual void SetTPIDR_EL0(u64 value) = 0; |
| 169 | 183 | ||
| 170 | virtual void SaveContext(ThreadContext32& ctx) = 0; | 184 | virtual Architecture GetArchitecture() const = 0; |
| 171 | virtual void SaveContext(ThreadContext64& ctx) = 0; | 185 | virtual void SaveContext(ThreadContext32& ctx) const = 0; |
| 186 | virtual void SaveContext(ThreadContext64& ctx) const = 0; | ||
| 172 | virtual void LoadContext(const ThreadContext32& ctx) = 0; | 187 | virtual void LoadContext(const ThreadContext32& ctx) = 0; |
| 173 | virtual void LoadContext(const ThreadContext64& ctx) = 0; | 188 | virtual void LoadContext(const ThreadContext64& ctx) = 0; |
| 174 | void LoadWatchpointArray(const WatchpointArray& wp); | 189 | void LoadWatchpointArray(const WatchpointArray& wp); |
| @@ -195,17 +210,9 @@ public: | |||
| 195 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, | 210 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, |
| 196 | const ThreadContext64& ctx); | 211 | const ThreadContext64& ctx); |
| 197 | 212 | ||
| 198 | virtual std::vector<BacktraceEntry> GetBacktrace() const = 0; | 213 | std::vector<BacktraceEntry> GetBacktrace() const; |
| 199 | |||
| 200 | void LogBacktrace() const; | 214 | void LogBacktrace() const; |
| 201 | 215 | ||
| 202 | static constexpr Dynarmic::HaltReason step_thread = Dynarmic::HaltReason::Step; | ||
| 203 | static constexpr Dynarmic::HaltReason break_loop = Dynarmic::HaltReason::UserDefined2; | ||
| 204 | static constexpr Dynarmic::HaltReason svc_call = Dynarmic::HaltReason::UserDefined3; | ||
| 205 | static constexpr Dynarmic::HaltReason breakpoint = Dynarmic::HaltReason::UserDefined4; | ||
| 206 | static constexpr Dynarmic::HaltReason watchpoint = Dynarmic::HaltReason::MemoryAbort; | ||
| 207 | static constexpr Dynarmic::HaltReason no_execute = Dynarmic::HaltReason::UserDefined6; | ||
| 208 | |||
| 209 | protected: | 216 | protected: |
| 210 | /// System context that this ARM interface is running under. | 217 | /// System context that this ARM interface is running under. |
| 211 | System& system; | 218 | System& system; |
| @@ -216,8 +223,8 @@ protected: | |||
| 216 | const Kernel::DebugWatchpoint* MatchingWatchpoint( | 223 | const Kernel::DebugWatchpoint* MatchingWatchpoint( |
| 217 | u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const; | 224 | u64 addr, u64 size, Kernel::DebugWatchpointType access_type) const; |
| 218 | 225 | ||
| 219 | virtual Dynarmic::HaltReason RunJit() = 0; | 226 | virtual HaltReason RunJit() = 0; |
| 220 | virtual Dynarmic::HaltReason StepJit() = 0; | 227 | virtual HaltReason StepJit() = 0; |
| 221 | virtual u32 GetSvcNumber() const = 0; | 228 | virtual u32 GetSvcNumber() const = 0; |
| 222 | virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0; | 229 | virtual const Kernel::DebugWatchpoint* HaltedWatchpoint() const = 0; |
| 223 | virtual void RewindBreakpointInstruction() = 0; | 230 | 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 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include <dynarmic/interface/halt_reason.h> | ||
| 5 | |||
| 6 | #include "core/arm/arm_interface.h" | ||
| 7 | |||
| 8 | namespace Core { | ||
| 9 | |||
| 10 | constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step; | ||
| 11 | constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort; | ||
| 12 | constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2; | ||
| 13 | constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3; | ||
| 14 | constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4; | ||
| 15 | constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6; | ||
| 16 | |||
| 17 | constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) { | ||
| 18 | static_assert(static_cast<u64>(HaltReason::StepThread) == static_cast<u64>(StepThread)); | ||
| 19 | static_assert(static_cast<u64>(HaltReason::DataAbort) == static_cast<u64>(DataAbort)); | ||
| 20 | static_assert(static_cast<u64>(HaltReason::BreakLoop) == static_cast<u64>(BreakLoop)); | ||
| 21 | static_assert(static_cast<u64>(HaltReason::SupervisorCall) == static_cast<u64>(SupervisorCall)); | ||
| 22 | static_assert(static_cast<u64>(HaltReason::InstructionBreakpoint) == | ||
| 23 | static_cast<u64>(InstructionBreakpoint)); | ||
| 24 | static_assert(static_cast<u64>(HaltReason::PrefetchAbort) == static_cast<u64>(PrefetchAbort)); | ||
| 25 | |||
| 26 | return static_cast<HaltReason>(hr); | ||
| 27 | } | ||
| 28 | |||
| 29 | } // 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 @@ | |||
| 10 | #include "common/logging/log.h" | 10 | #include "common/logging/log.h" |
| 11 | #include "common/page_table.h" | 11 | #include "common/page_table.h" |
| 12 | #include "common/settings.h" | 12 | #include "common/settings.h" |
| 13 | #include "core/arm/dynarmic/arm_dynarmic.h" | ||
| 13 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | 14 | #include "core/arm/dynarmic/arm_dynarmic_32.h" |
| 14 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" | 15 | #include "core/arm/dynarmic/dynarmic_cp15.h" |
| 15 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 16 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 16 | #include "core/core.h" | 17 | #include "core/core.h" |
| 17 | #include "core/core_timing.h" | 18 | #include "core/core_timing.h" |
| 18 | #include "core/debugger/debugger.h" | 19 | #include "core/debugger/debugger.h" |
| @@ -104,11 +105,11 @@ public: | |||
| 104 | switch (exception) { | 105 | switch (exception) { |
| 105 | case Dynarmic::A32::Exception::NoExecuteFault: | 106 | case Dynarmic::A32::Exception::NoExecuteFault: |
| 106 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); | 107 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); |
| 107 | ReturnException(pc, ARM_Interface::no_execute); | 108 | ReturnException(pc, PrefetchAbort); |
| 108 | return; | 109 | return; |
| 109 | default: | 110 | default: |
| 110 | if (debugger_enabled) { | 111 | if (debugger_enabled) { |
| 111 | ReturnException(pc, ARM_Interface::breakpoint); | 112 | ReturnException(pc, InstructionBreakpoint); |
| 112 | return; | 113 | return; |
| 113 | } | 114 | } |
| 114 | 115 | ||
| @@ -121,7 +122,7 @@ public: | |||
| 121 | 122 | ||
| 122 | void CallSVC(u32 swi) override { | 123 | void CallSVC(u32 swi) override { |
| 123 | parent.svc_swi = swi; | 124 | parent.svc_swi = swi; |
| 124 | parent.jit.load()->HaltExecution(ARM_Interface::svc_call); | 125 | parent.jit.load()->HaltExecution(SupervisorCall); |
| 125 | } | 126 | } |
| 126 | 127 | ||
| 127 | void AddTicks(u64 ticks) override { | 128 | void AddTicks(u64 ticks) override { |
| @@ -162,7 +163,7 @@ public: | |||
| 162 | if (!memory.IsValidVirtualAddressRange(addr, size)) { | 163 | if (!memory.IsValidVirtualAddressRange(addr, size)) { |
| 163 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", | 164 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", |
| 164 | addr); | 165 | addr); |
| 165 | parent.jit.load()->HaltExecution(ARM_Interface::no_execute); | 166 | parent.jit.load()->HaltExecution(PrefetchAbort); |
| 166 | return false; | 167 | return false; |
| 167 | } | 168 | } |
| 168 | 169 | ||
| @@ -173,7 +174,7 @@ public: | |||
| 173 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; | 174 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; |
| 174 | if (match) { | 175 | if (match) { |
| 175 | parent.halted_watchpoint = match; | 176 | parent.halted_watchpoint = match; |
| 176 | parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); | 177 | parent.jit.load()->HaltExecution(DataAbort); |
| 177 | return false; | 178 | return false; |
| 178 | } | 179 | } |
| 179 | 180 | ||
| @@ -329,12 +330,12 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable* | |||
| 329 | return std::make_unique<Dynarmic::A32::Jit>(config); | 330 | return std::make_unique<Dynarmic::A32::Jit>(config); |
| 330 | } | 331 | } |
| 331 | 332 | ||
| 332 | Dynarmic::HaltReason ARM_Dynarmic_32::RunJit() { | 333 | HaltReason ARM_Dynarmic_32::RunJit() { |
| 333 | return jit.load()->Run(); | 334 | return TranslateHaltReason(jit.load()->Run()); |
| 334 | } | 335 | } |
| 335 | 336 | ||
| 336 | Dynarmic::HaltReason ARM_Dynarmic_32::StepJit() { | 337 | HaltReason ARM_Dynarmic_32::StepJit() { |
| 337 | return jit.load()->Step(); | 338 | return TranslateHaltReason(jit.load()->Step()); |
| 338 | } | 339 | } |
| 339 | 340 | ||
| 340 | u32 ARM_Dynarmic_32::GetSvcNumber() const { | 341 | u32 ARM_Dynarmic_32::GetSvcNumber() const { |
| @@ -408,7 +409,7 @@ void ARM_Dynarmic_32::SetTPIDR_EL0(u64 value) { | |||
| 408 | cp15->uprw = static_cast<u32>(value); | 409 | cp15->uprw = static_cast<u32>(value); |
| 409 | } | 410 | } |
| 410 | 411 | ||
| 411 | void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { | 412 | void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) const { |
| 412 | Dynarmic::A32::Jit* j = jit.load(); | 413 | Dynarmic::A32::Jit* j = jit.load(); |
| 413 | ctx.cpu_registers = j->Regs(); | 414 | ctx.cpu_registers = j->Regs(); |
| 414 | ctx.extension_registers = j->ExtRegs(); | 415 | ctx.extension_registers = j->ExtRegs(); |
| @@ -425,11 +426,11 @@ void ARM_Dynarmic_32::LoadContext(const ThreadContext32& ctx) { | |||
| 425 | } | 426 | } |
| 426 | 427 | ||
| 427 | void ARM_Dynarmic_32::SignalInterrupt() { | 428 | void ARM_Dynarmic_32::SignalInterrupt() { |
| 428 | jit.load()->HaltExecution(break_loop); | 429 | jit.load()->HaltExecution(BreakLoop); |
| 429 | } | 430 | } |
| 430 | 431 | ||
| 431 | void ARM_Dynarmic_32::ClearInterrupt() { | 432 | void ARM_Dynarmic_32::ClearInterrupt() { |
| 432 | jit.load()->ClearHalt(break_loop); | 433 | jit.load()->ClearHalt(BreakLoop); |
| 433 | } | 434 | } |
| 434 | 435 | ||
| 435 | void ARM_Dynarmic_32::ClearInstructionCache() { | 436 | void ARM_Dynarmic_32::ClearInstructionCache() { |
| @@ -462,39 +463,4 @@ void ARM_Dynarmic_32::PageTableChanged(Common::PageTable& page_table, | |||
| 462 | jit_cache.emplace(key, std::move(new_jit)); | 463 | jit_cache.emplace(key, std::move(new_jit)); |
| 463 | } | 464 | } |
| 464 | 465 | ||
| 465 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace(Core::System& system, | ||
| 466 | u64 fp, u64 lr, u64 pc) { | ||
| 467 | std::vector<BacktraceEntry> out; | ||
| 468 | auto& memory = system.ApplicationMemory(); | ||
| 469 | |||
| 470 | out.push_back({"", 0, pc, 0, ""}); | ||
| 471 | |||
| 472 | // fp (= r11) points to the last frame record. | ||
| 473 | // Frame records are two words long: | ||
| 474 | // fp+0 : pointer to previous frame record | ||
| 475 | // fp+4 : value of lr for frame | ||
| 476 | for (size_t i = 0; i < 256; i++) { | ||
| 477 | out.push_back({"", 0, lr, 0, ""}); | ||
| 478 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 8)) { | ||
| 479 | break; | ||
| 480 | } | ||
| 481 | lr = memory.Read32(fp + 4); | ||
| 482 | fp = memory.Read32(fp); | ||
| 483 | } | ||
| 484 | |||
| 485 | SymbolicateBacktrace(system, out); | ||
| 486 | |||
| 487 | return out; | ||
| 488 | } | ||
| 489 | |||
| 490 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktraceFromContext( | ||
| 491 | System& system, const ThreadContext32& ctx) { | ||
| 492 | const auto& reg = ctx.cpu_registers; | ||
| 493 | return GetBacktrace(system, reg[11], reg[14], reg[15]); | ||
| 494 | } | ||
| 495 | |||
| 496 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_32::GetBacktrace() const { | ||
| 497 | return GetBacktrace(system, GetReg(11), GetReg(14), GetReg(15)); | ||
| 498 | } | ||
| 499 | |||
| 500 | } // namespace Core | 466 | } // 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: | |||
| 50 | return (GetPSTATE() & 0x20) != 0; | 50 | return (GetPSTATE() & 0x20) != 0; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | void SaveContext(ThreadContext32& ctx) override; | 53 | Architecture GetArchitecture() const override { |
| 54 | void SaveContext(ThreadContext64& ctx) override {} | 54 | return Architecture::Aarch32; |
| 55 | } | ||
| 56 | void SaveContext(ThreadContext32& ctx) const override; | ||
| 57 | void SaveContext(ThreadContext64& ctx) const override {} | ||
| 55 | void LoadContext(const ThreadContext32& ctx) override; | 58 | void LoadContext(const ThreadContext32& ctx) override; |
| 56 | void LoadContext(const ThreadContext64& ctx) override {} | 59 | void LoadContext(const ThreadContext64& ctx) override {} |
| 57 | 60 | ||
| @@ -64,14 +67,9 @@ public: | |||
| 64 | void PageTableChanged(Common::PageTable& new_page_table, | 67 | void PageTableChanged(Common::PageTable& new_page_table, |
| 65 | std::size_t new_address_space_size_in_bits) override; | 68 | std::size_t new_address_space_size_in_bits) override; |
| 66 | 69 | ||
| 67 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, | ||
| 68 | const ThreadContext32& ctx); | ||
| 69 | |||
| 70 | std::vector<BacktraceEntry> GetBacktrace() const override; | ||
| 71 | |||
| 72 | protected: | 70 | protected: |
| 73 | Dynarmic::HaltReason RunJit() override; | 71 | HaltReason RunJit() override; |
| 74 | Dynarmic::HaltReason StepJit() override; | 72 | HaltReason StepJit() override; |
| 75 | u32 GetSvcNumber() const override; | 73 | u32 GetSvcNumber() const override; |
| 76 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; | 74 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; |
| 77 | void RewindBreakpointInstruction() override; | 75 | 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 @@ | |||
| 10 | #include "common/logging/log.h" | 10 | #include "common/logging/log.h" |
| 11 | #include "common/page_table.h" | 11 | #include "common/page_table.h" |
| 12 | #include "common/settings.h" | 12 | #include "common/settings.h" |
| 13 | #include "core/arm/dynarmic/arm_dynarmic.h" | ||
| 13 | #include "core/arm/dynarmic/arm_dynarmic_64.h" | 14 | #include "core/arm/dynarmic/arm_dynarmic_64.h" |
| 14 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 15 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 15 | #include "core/core.h" | 16 | #include "core/core.h" |
| 16 | #include "core/core_timing.h" | 17 | #include "core/core_timing.h" |
| 17 | #include "core/debugger/debugger.h" | 18 | #include "core/debugger/debugger.h" |
| @@ -113,7 +114,7 @@ public: | |||
| 113 | LOG_ERROR(Core_ARM, | 114 | LOG_ERROR(Core_ARM, |
| 114 | "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, | 115 | "Unimplemented instruction @ 0x{:X} for {} instructions (instr = {:08X})", pc, |
| 115 | num_instructions, memory.Read32(pc)); | 116 | num_instructions, memory.Read32(pc)); |
| 116 | ReturnException(pc, ARM_Interface::no_execute); | 117 | ReturnException(pc, PrefetchAbort); |
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op, | 120 | void InstructionCacheOperationRaised(Dynarmic::A64::InstructionCacheOperation op, |
| @@ -148,11 +149,11 @@ public: | |||
| 148 | return; | 149 | return; |
| 149 | case Dynarmic::A64::Exception::NoExecuteFault: | 150 | case Dynarmic::A64::Exception::NoExecuteFault: |
| 150 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc); | 151 | LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#016x}", pc); |
| 151 | ReturnException(pc, ARM_Interface::no_execute); | 152 | ReturnException(pc, PrefetchAbort); |
| 152 | return; | 153 | return; |
| 153 | default: | 154 | default: |
| 154 | if (debugger_enabled) { | 155 | if (debugger_enabled) { |
| 155 | ReturnException(pc, ARM_Interface::breakpoint); | 156 | ReturnException(pc, InstructionBreakpoint); |
| 156 | return; | 157 | return; |
| 157 | } | 158 | } |
| 158 | 159 | ||
| @@ -164,7 +165,7 @@ public: | |||
| 164 | 165 | ||
| 165 | void CallSVC(u32 swi) override { | 166 | void CallSVC(u32 swi) override { |
| 166 | parent.svc_swi = swi; | 167 | parent.svc_swi = swi; |
| 167 | parent.jit.load()->HaltExecution(ARM_Interface::svc_call); | 168 | parent.jit.load()->HaltExecution(SupervisorCall); |
| 168 | } | 169 | } |
| 169 | 170 | ||
| 170 | void AddTicks(u64 ticks) override { | 171 | void AddTicks(u64 ticks) override { |
| @@ -207,7 +208,7 @@ public: | |||
| 207 | if (!memory.IsValidVirtualAddressRange(addr, size)) { | 208 | if (!memory.IsValidVirtualAddressRange(addr, size)) { |
| 208 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", | 209 | LOG_CRITICAL(Core_ARM, "Stopping execution due to unmapped memory access at {:#x}", |
| 209 | addr); | 210 | addr); |
| 210 | parent.jit.load()->HaltExecution(ARM_Interface::no_execute); | 211 | parent.jit.load()->HaltExecution(PrefetchAbort); |
| 211 | return false; | 212 | return false; |
| 212 | } | 213 | } |
| 213 | 214 | ||
| @@ -218,7 +219,7 @@ public: | |||
| 218 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; | 219 | const auto match{parent.MatchingWatchpoint(addr, size, type)}; |
| 219 | if (match) { | 220 | if (match) { |
| 220 | parent.halted_watchpoint = match; | 221 | parent.halted_watchpoint = match; |
| 221 | parent.jit.load()->HaltExecution(ARM_Interface::watchpoint); | 222 | parent.jit.load()->HaltExecution(DataAbort); |
| 222 | return false; | 223 | return false; |
| 223 | } | 224 | } |
| 224 | 225 | ||
| @@ -383,12 +384,12 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable* | |||
| 383 | return std::make_shared<Dynarmic::A64::Jit>(config); | 384 | return std::make_shared<Dynarmic::A64::Jit>(config); |
| 384 | } | 385 | } |
| 385 | 386 | ||
| 386 | Dynarmic::HaltReason ARM_Dynarmic_64::RunJit() { | 387 | HaltReason ARM_Dynarmic_64::RunJit() { |
| 387 | return jit.load()->Run(); | 388 | return TranslateHaltReason(jit.load()->Run()); |
| 388 | } | 389 | } |
| 389 | 390 | ||
| 390 | Dynarmic::HaltReason ARM_Dynarmic_64::StepJit() { | 391 | HaltReason ARM_Dynarmic_64::StepJit() { |
| 391 | return jit.load()->Step(); | 392 | return TranslateHaltReason(jit.load()->Step()); |
| 392 | } | 393 | } |
| 393 | 394 | ||
| 394 | u32 ARM_Dynarmic_64::GetSvcNumber() const { | 395 | u32 ARM_Dynarmic_64::GetSvcNumber() const { |
| @@ -464,7 +465,7 @@ void ARM_Dynarmic_64::SetTPIDR_EL0(u64 value) { | |||
| 464 | cb->tpidr_el0 = value; | 465 | cb->tpidr_el0 = value; |
| 465 | } | 466 | } |
| 466 | 467 | ||
| 467 | void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) { | 468 | void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) const { |
| 468 | Dynarmic::A64::Jit* j = jit.load(); | 469 | Dynarmic::A64::Jit* j = jit.load(); |
| 469 | ctx.cpu_registers = j->GetRegisters(); | 470 | ctx.cpu_registers = j->GetRegisters(); |
| 470 | ctx.sp = j->GetSP(); | 471 | ctx.sp = j->GetSP(); |
| @@ -489,11 +490,11 @@ void ARM_Dynarmic_64::LoadContext(const ThreadContext64& ctx) { | |||
| 489 | } | 490 | } |
| 490 | 491 | ||
| 491 | void ARM_Dynarmic_64::SignalInterrupt() { | 492 | void ARM_Dynarmic_64::SignalInterrupt() { |
| 492 | jit.load()->HaltExecution(break_loop); | 493 | jit.load()->HaltExecution(BreakLoop); |
| 493 | } | 494 | } |
| 494 | 495 | ||
| 495 | void ARM_Dynarmic_64::ClearInterrupt() { | 496 | void ARM_Dynarmic_64::ClearInterrupt() { |
| 496 | jit.load()->ClearHalt(break_loop); | 497 | jit.load()->ClearHalt(BreakLoop); |
| 497 | } | 498 | } |
| 498 | 499 | ||
| 499 | void ARM_Dynarmic_64::ClearInstructionCache() { | 500 | void ARM_Dynarmic_64::ClearInstructionCache() { |
| @@ -526,39 +527,4 @@ void ARM_Dynarmic_64::PageTableChanged(Common::PageTable& page_table, | |||
| 526 | jit_cache.emplace(key, std::move(new_jit)); | 527 | jit_cache.emplace(key, std::move(new_jit)); |
| 527 | } | 528 | } |
| 528 | 529 | ||
| 529 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace(Core::System& system, | ||
| 530 | u64 fp, u64 lr, u64 pc) { | ||
| 531 | std::vector<BacktraceEntry> out; | ||
| 532 | auto& memory = system.ApplicationMemory(); | ||
| 533 | |||
| 534 | out.push_back({"", 0, pc, 0, ""}); | ||
| 535 | |||
| 536 | // fp (= x29) points to the previous frame record. | ||
| 537 | // Frame records are two words long: | ||
| 538 | // fp+0 : pointer to previous frame record | ||
| 539 | // fp+8 : value of lr for frame | ||
| 540 | for (size_t i = 0; i < 256; i++) { | ||
| 541 | out.push_back({"", 0, lr, 0, ""}); | ||
| 542 | if (!fp || (fp % 4 != 0) || !memory.IsValidVirtualAddressRange(fp, 16)) { | ||
| 543 | break; | ||
| 544 | } | ||
| 545 | lr = memory.Read64(fp + 8); | ||
| 546 | fp = memory.Read64(fp); | ||
| 547 | } | ||
| 548 | |||
| 549 | SymbolicateBacktrace(system, out); | ||
| 550 | |||
| 551 | return out; | ||
| 552 | } | ||
| 553 | |||
| 554 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktraceFromContext( | ||
| 555 | System& system, const ThreadContext64& ctx) { | ||
| 556 | const auto& reg = ctx.cpu_registers; | ||
| 557 | return GetBacktrace(system, reg[29], reg[30], ctx.pc); | ||
| 558 | } | ||
| 559 | |||
| 560 | std::vector<ARM_Interface::BacktraceEntry> ARM_Dynarmic_64::GetBacktrace() const { | ||
| 561 | return GetBacktrace(system, GetReg(29), GetReg(30), GetPC()); | ||
| 562 | } | ||
| 563 | |||
| 564 | } // namespace Core | 530 | } // 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: | |||
| 43 | void SetTPIDR_EL0(u64 value) override; | 43 | void SetTPIDR_EL0(u64 value) override; |
| 44 | u64 GetTPIDR_EL0() const override; | 44 | u64 GetTPIDR_EL0() const override; |
| 45 | 45 | ||
| 46 | void SaveContext(ThreadContext32& ctx) override {} | 46 | Architecture GetArchitecture() const override { |
| 47 | void SaveContext(ThreadContext64& ctx) override; | 47 | return Architecture::Aarch64; |
| 48 | } | ||
| 49 | void SaveContext(ThreadContext32& ctx) const override {} | ||
| 50 | void SaveContext(ThreadContext64& ctx) const override; | ||
| 48 | void LoadContext(const ThreadContext32& ctx) override {} | 51 | void LoadContext(const ThreadContext32& ctx) override {} |
| 49 | void LoadContext(const ThreadContext64& ctx) override; | 52 | void LoadContext(const ThreadContext64& ctx) override; |
| 50 | 53 | ||
| @@ -57,14 +60,9 @@ public: | |||
| 57 | void PageTableChanged(Common::PageTable& new_page_table, | 60 | void PageTableChanged(Common::PageTable& new_page_table, |
| 58 | std::size_t new_address_space_size_in_bits) override; | 61 | std::size_t new_address_space_size_in_bits) override; |
| 59 | 62 | ||
| 60 | static std::vector<BacktraceEntry> GetBacktraceFromContext(System& system, | ||
| 61 | const ThreadContext64& ctx); | ||
| 62 | |||
| 63 | std::vector<BacktraceEntry> GetBacktrace() const override; | ||
| 64 | |||
| 65 | protected: | 63 | protected: |
| 66 | Dynarmic::HaltReason RunJit() override; | 64 | HaltReason RunJit() override; |
| 67 | Dynarmic::HaltReason StepJit() override; | 65 | HaltReason StepJit() override; |
| 68 | u32 GetSvcNumber() const override; | 66 | u32 GetSvcNumber() const override; |
| 69 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; | 67 | const Kernel::DebugWatchpoint* HaltedWatchpoint() const override; |
| 70 | void RewindBreakpointInstruction() override; | 68 | void RewindBreakpointInstruction() override; |
| @@ -73,8 +71,6 @@ private: | |||
| 73 | std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table, | 71 | std::shared_ptr<Dynarmic::A64::Jit> MakeJit(Common::PageTable* page_table, |
| 74 | std::size_t address_space_bits) const; | 72 | std::size_t address_space_bits) const; |
| 75 | 73 | ||
| 76 | static std::vector<BacktraceEntry> GetBacktrace(Core::System& system, u64 fp, u64 lr, u64 pc); | ||
| 77 | |||
| 78 | using JitCacheKey = std::pair<Common::PageTable*, std::size_t>; | 74 | using JitCacheKey = std::pair<Common::PageTable*, std::size_t>; |
| 79 | using JitCacheType = | 75 | using JitCacheType = |
| 80 | std::unordered_map<JitCacheKey, std::shared_ptr<Dynarmic::A64::Jit>, Common::PairHash>; | 76 | 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 @@ | |||
| 4 | #include <fmt/format.h> | 4 | #include <fmt/format.h> |
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | #include "core/arm/dynarmic/arm_dynarmic_32.h" | 6 | #include "core/arm/dynarmic/arm_dynarmic_32.h" |
| 7 | #include "core/arm/dynarmic/arm_dynarmic_cp15.h" | 7 | #include "core/arm/dynarmic/dynarmic_cp15.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/core_timing.h" | 9 | #include "core/core_timing.h" |
| 10 | 10 | ||
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 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 4 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 5 | #include "core/memory.h" | 5 | #include "core/memory.h" |
| 6 | 6 | ||
| 7 | namespace Core { | 7 | 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 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) | 4 | #if defined(ARCHITECTURE_x86_64) || defined(ARCHITECTURE_arm64) |
| 5 | #include "core/arm/dynarmic/arm_exclusive_monitor.h" | 5 | #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" |
| 6 | #endif | 6 | #endif |
| 7 | #include "core/arm/exclusive_monitor.h" | 7 | #include "core/arm/exclusive_monitor.h" |
| 8 | #include "core/memory.h" | 8 | #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 @@ | |||
| 54 | #include "video_core/renderer_base.h" | 54 | #include "video_core/renderer_base.h" |
| 55 | #include "video_core/video_core.h" | 55 | #include "video_core/video_core.h" |
| 56 | 56 | ||
| 57 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU0, "ARM JIT", "Dynarmic CPU 0", MP_RGB(255, 64, 64)); | 57 | MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64)); |
| 58 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU1, "ARM JIT", "Dynarmic CPU 1", MP_RGB(255, 64, 64)); | 58 | MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64)); |
| 59 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU2, "ARM JIT", "Dynarmic CPU 2", MP_RGB(255, 64, 64)); | 59 | MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64)); |
| 60 | MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU3, "ARM JIT", "Dynarmic CPU 3", MP_RGB(255, 64, 64)); | 60 | MICROPROFILE_DEFINE(ARM_CPU3, "ARM", "CPU 3", MP_RGB(255, 64, 64)); |
| 61 | 61 | ||
| 62 | namespace Core { | 62 | namespace Core { |
| 63 | 63 | ||
| @@ -259,10 +259,10 @@ struct System::Impl { | |||
| 259 | is_powered_on = true; | 259 | is_powered_on = true; |
| 260 | exit_lock = false; | 260 | exit_lock = false; |
| 261 | 261 | ||
| 262 | microprofile_dynarmic[0] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU0); | 262 | microprofile_cpu[0] = MICROPROFILE_TOKEN(ARM_CPU0); |
| 263 | microprofile_dynarmic[1] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU1); | 263 | microprofile_cpu[1] = MICROPROFILE_TOKEN(ARM_CPU1); |
| 264 | microprofile_dynarmic[2] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU2); | 264 | microprofile_cpu[2] = MICROPROFILE_TOKEN(ARM_CPU2); |
| 265 | microprofile_dynarmic[3] = MICROPROFILE_TOKEN(ARM_Jit_Dynarmic_CPU3); | 265 | microprofile_cpu[3] = MICROPROFILE_TOKEN(ARM_CPU3); |
| 266 | 266 | ||
| 267 | LOG_DEBUG(Core, "Initialized OK"); | 267 | LOG_DEBUG(Core, "Initialized OK"); |
| 268 | 268 | ||
| @@ -539,7 +539,7 @@ struct System::Impl { | |||
| 539 | ExitCallback exit_callback; | 539 | ExitCallback exit_callback; |
| 540 | 540 | ||
| 541 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; | 541 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; |
| 542 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_dynarmic{}; | 542 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{}; |
| 543 | }; | 543 | }; |
| 544 | 544 | ||
| 545 | System::System() : impl{std::make_unique<Impl>(*this)} {} | 545 | System::System() : impl{std::make_unique<Impl>(*this)} {} |
| @@ -927,14 +927,14 @@ void System::RegisterHostThread() { | |||
| 927 | impl->kernel.RegisterHostThread(); | 927 | impl->kernel.RegisterHostThread(); |
| 928 | } | 928 | } |
| 929 | 929 | ||
| 930 | void System::EnterDynarmicProfile() { | 930 | void System::EnterCPUProfile() { |
| 931 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); | 931 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); |
| 932 | impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_dynarmic[core]); | 932 | impl->dynarmic_ticks[core] = MicroProfileEnter(impl->microprofile_cpu[core]); |
| 933 | } | 933 | } |
| 934 | 934 | ||
| 935 | void System::ExitDynarmicProfile() { | 935 | void System::ExitCPUProfile() { |
| 936 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); | 936 | std::size_t core = impl->kernel.GetCurrentHostThreadID(); |
| 937 | MicroProfileLeave(impl->microprofile_dynarmic[core], impl->dynarmic_ticks[core]); | 937 | MicroProfileLeave(impl->microprofile_cpu[core], impl->dynarmic_ticks[core]); |
| 938 | } | 938 | } |
| 939 | 939 | ||
| 940 | bool System::IsMulticore() const { | 940 | 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: | |||
| 412 | /// Register a host thread as an auxiliary thread. | 412 | /// Register a host thread as an auxiliary thread. |
| 413 | void RegisterHostThread(); | 413 | void RegisterHostThread(); |
| 414 | 414 | ||
| 415 | /// Enter Dynarmic Microprofile | 415 | /// Enter CPU Microprofile |
| 416 | void EnterDynarmicProfile(); | 416 | void EnterCPUProfile(); |
| 417 | 417 | ||
| 418 | /// Exit Dynarmic Microprofile | 418 | /// Exit CPU Microprofile |
| 419 | void ExitDynarmicProfile(); | 419 | void ExitCPUProfile(); |
| 420 | 420 | ||
| 421 | /// Tells if system is running on multicore. | 421 | /// Tells if system is running on multicore. |
| 422 | [[nodiscard]] bool IsMulticore() const; | 422 | [[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 @@ | |||
| 8 | #include <set> | 8 | #include <set> |
| 9 | #include <vector> | 9 | #include <vector> |
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | #include "core/file_sys/nca_metadata.h" | ||
| 11 | #include "core/file_sys/vfs.h" | 12 | #include "core/file_sys/vfs.h" |
| 12 | 13 | ||
| 13 | namespace Core::Crypto { | 14 | 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; | |||
| 22 | using VideoCore::Surface::PixelFormat; | 22 | using VideoCore::Surface::PixelFormat; |
| 23 | using VideoCore::Surface::SurfaceType; | 23 | using VideoCore::Surface::SurfaceType; |
| 24 | 24 | ||
| 25 | constexpr u32 RescaleHeightThreshold = 288; | ||
| 26 | constexpr u32 DownscaleHeightThreshold = 512; | ||
| 27 | |||
| 25 | ImageInfo::ImageInfo(const TICEntry& config) noexcept { | 28 | ImageInfo::ImageInfo(const TICEntry& config) noexcept { |
| 26 | forced_flushed = config.IsPitchLinear() && !Settings::values.use_reactive_flushing.GetValue(); | 29 | forced_flushed = config.IsPitchLinear() && !Settings::values.use_reactive_flushing.GetValue(); |
| 27 | dma_downloaded = forced_flushed; | 30 | dma_downloaded = forced_flushed; |
| @@ -113,8 +116,9 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept { | |||
| 113 | layer_stride = CalculateLayerStride(*this); | 116 | layer_stride = CalculateLayerStride(*this); |
| 114 | maybe_unaligned_layer_stride = CalculateLayerSize(*this); | 117 | maybe_unaligned_layer_stride = CalculateLayerSize(*this); |
| 115 | rescaleable &= (block.depth == 0) && resources.levels == 1; | 118 | rescaleable &= (block.depth == 0) && resources.levels == 1; |
| 116 | rescaleable &= size.height > 256 || GetFormatType(format) != SurfaceType::ColorTexture; | 119 | rescaleable &= size.height > RescaleHeightThreshold || |
| 117 | downscaleable = size.height > 512; | 120 | GetFormatType(format) != SurfaceType::ColorTexture; |
| 121 | downscaleable = size.height > DownscaleHeightThreshold; | ||
| 118 | } | 122 | } |
| 119 | } | 123 | } |
| 120 | 124 | ||
| @@ -152,8 +156,8 @@ ImageInfo::ImageInfo(const Maxwell3D::Regs::RenderTargetConfig& ct, | |||
| 152 | size.depth = ct.depth; | 156 | size.depth = ct.depth; |
| 153 | } else { | 157 | } else { |
| 154 | rescaleable = block.depth == 0; | 158 | rescaleable = block.depth == 0; |
| 155 | rescaleable &= size.height > 256; | 159 | rescaleable &= size.height > RescaleHeightThreshold; |
| 156 | downscaleable = size.height > 512; | 160 | downscaleable = size.height > DownscaleHeightThreshold; |
| 157 | type = ImageType::e2D; | 161 | type = ImageType::e2D; |
| 158 | resources.layers = ct.depth; | 162 | resources.layers = ct.depth; |
| 159 | } | 163 | } |
| @@ -232,8 +236,8 @@ ImageInfo::ImageInfo(const Fermi2D::Surface& config) noexcept { | |||
| 232 | .height = config.height, | 236 | .height = config.height, |
| 233 | .depth = 1, | 237 | .depth = 1, |
| 234 | }; | 238 | }; |
| 235 | rescaleable = block.depth == 0 && size.height > 256; | 239 | rescaleable = block.depth == 0 && size.height > RescaleHeightThreshold; |
| 236 | downscaleable = size.height > 512; | 240 | downscaleable = size.height > DownscaleHeightThreshold; |
| 237 | } | 241 | } |
| 238 | } | 242 | } |
| 239 | 243 | ||
| @@ -275,8 +279,8 @@ ImageInfo::ImageInfo(const Tegra::DMA::ImageOperand& config) noexcept { | |||
| 275 | resources.layers = 1; | 279 | resources.layers = 1; |
| 276 | layer_stride = CalculateLayerStride(*this); | 280 | layer_stride = CalculateLayerStride(*this); |
| 277 | maybe_unaligned_layer_stride = CalculateLayerSize(*this); | 281 | maybe_unaligned_layer_stride = CalculateLayerSize(*this); |
| 278 | rescaleable = block.depth == 0 && size.height > 256; | 282 | rescaleable = block.depth == 0 && size.height > RescaleHeightThreshold; |
| 279 | downscaleable = size.height > 512; | 283 | downscaleable = size.height > DownscaleHeightThreshold; |
| 280 | } | 284 | } |
| 281 | 285 | ||
| 282 | } // namespace VideoCommon | 286 | } // namespace VideoCommon |