summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt13
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt7
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt9
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt12
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt58
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/views/FixedRatioSurfaceView.kt6
-rw-r--r--src/android/app/src/main/jni/config.cpp8
-rw-r--r--src/android/app/src/main/jni/default_ini.h6
-rw-r--r--src/android/app/src/main/jni/native.cpp86
-rw-r--r--src/android/app/src/main/res/drawable/ic_system_update_alt.xml9
-rw-r--r--src/android/app/src/main/res/values-de/strings.xml3
-rw-r--r--src/android/app/src/main/res/values-es/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-fr/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-it/strings.xml7
-rw-r--r--src/android/app/src/main/res/values-ja/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-ko/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-nb/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-pl/strings.xml7
-rw-r--r--src/android/app/src/main/res/values-pt-rBR/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-pt-rPT/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-ru/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-uk/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-zh-rCN/strings.xml8
-rw-r--r--src/android/app/src/main/res/values-zh-rTW/strings.xml9
-rw-r--r--src/android/app/src/main/res/values/strings.xml11
-rw-r--r--src/core/CMakeLists.txt9
-rw-r--r--src/core/arm/arm_interface.cpp84
-rw-r--r--src/core/arm/arm_interface.h37
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h29
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp64
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.h16
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp64
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.h18
-rw-r--r--src/core/arm/dynarmic/dynarmic_cp15.cpp (renamed from src/core/arm/dynarmic/arm_dynarmic_cp15.cpp)2
-rw-r--r--src/core/arm/dynarmic/dynarmic_cp15.h (renamed from src/core/arm/dynarmic/arm_dynarmic_cp15.h)0
-rw-r--r--src/core/arm/dynarmic/dynarmic_exclusive_monitor.cpp (renamed from src/core/arm/dynarmic/arm_exclusive_monitor.cpp)2
-rw-r--r--src/core/arm/dynarmic/dynarmic_exclusive_monitor.h (renamed from src/core/arm/dynarmic/arm_exclusive_monitor.h)0
-rw-r--r--src/core/arm/exclusive_monitor.cpp2
-rw-r--r--src/core/core.cpp26
-rw-r--r--src/core/core.h8
-rw-r--r--src/core/file_sys/submission_package.h1
-rw-r--r--src/video_core/texture_cache/image_info.cpp20
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
252async_presentation = 252async_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
256force_max_clock = 256force_max_clock =
257 257
@@ -328,6 +328,10 @@ shader_backend =
328# 0 (default): Off, 1: On 328# 0 (default): Off, 1: On
329use_asynchronous_shaders = 329use_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
333use_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
333nvdec_emulation = 337nvdec_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
541int 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
469void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver( 547void 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">
651. Verifica che le tue chiavi abbiano l\'estensione .keys.\n\n
662. Le chiavi non devono essere archiviate nella cartella Download.\n\n
67Risolvi 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">
651. keys의 확장자가 .keys인지 확인하세요.\n\n
662. 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">
651. Upewnij się że klucze mają rozszerzenie .keys. \n\n
662. Klucze nie mogą znajdować się w folderze Pobrane. \n\n
67Rozwiąż 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 @@
4add_library(core STATIC 4add_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
850if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) 848if (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
23namespace Core { 21namespace Core {
24 22
25constexpr u64 SEGMENT_BASE = 0x7100000000ull; 23constexpr u64 SEGMENT_BASE = 0x7100000000ull;
26 24
27std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( 25std::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
32std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktraceFromContext( 52std::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
37void ARM_Interface::SymbolicateBacktrace(Core::System& system, std::vector<BacktraceEntry>& out) { 80void 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
122std::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
79void ARM_Interface::LogBacktrace() const { 134void 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
31using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>; 29using WatchpointArray = std::array<Kernel::DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>;
32 30
31// NOTE: these values match the HaltReason enum in Dynarmic
32enum class HaltReason : u64 {
33 StepThread = 0x00000001,
34 DataAbort = 0x00000004,
35 BreakLoop = 0x02000000,
36 SupervisorCall = 0x04000000,
37 InstructionBreakpoint = 0x08000000,
38 PrefetchAbort = 0x20000000,
39};
40DECLARE_ENUM_FLAG_OPERATORS(HaltReason);
41
42enum class Architecture {
43 Aarch32,
44 Aarch64,
45};
46
33/// Generic ARMv8 CPU interface 47/// Generic ARMv8 CPU interface
34class ARM_Interface { 48class ARM_Interface {
35public: 49public:
@@ -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
209protected: 216protected:
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
8namespace Core {
9
10constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step;
11constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort;
12constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2;
13constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3;
14constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4;
15constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6;
16
17constexpr 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
332Dynarmic::HaltReason ARM_Dynarmic_32::RunJit() { 333HaltReason ARM_Dynarmic_32::RunJit() {
333 return jit.load()->Run(); 334 return TranslateHaltReason(jit.load()->Run());
334} 335}
335 336
336Dynarmic::HaltReason ARM_Dynarmic_32::StepJit() { 337HaltReason ARM_Dynarmic_32::StepJit() {
337 return jit.load()->Step(); 338 return TranslateHaltReason(jit.load()->Step());
338} 339}
339 340
340u32 ARM_Dynarmic_32::GetSvcNumber() const { 341u32 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
411void ARM_Dynarmic_32::SaveContext(ThreadContext32& ctx) { 412void 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
427void ARM_Dynarmic_32::SignalInterrupt() { 428void ARM_Dynarmic_32::SignalInterrupt() {
428 jit.load()->HaltExecution(break_loop); 429 jit.load()->HaltExecution(BreakLoop);
429} 430}
430 431
431void ARM_Dynarmic_32::ClearInterrupt() { 432void ARM_Dynarmic_32::ClearInterrupt() {
432 jit.load()->ClearHalt(break_loop); 433 jit.load()->ClearHalt(BreakLoop);
433} 434}
434 435
435void ARM_Dynarmic_32::ClearInstructionCache() { 436void 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
465std::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
490std::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
496std::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
72protected: 70protected:
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
386Dynarmic::HaltReason ARM_Dynarmic_64::RunJit() { 387HaltReason ARM_Dynarmic_64::RunJit() {
387 return jit.load()->Run(); 388 return TranslateHaltReason(jit.load()->Run());
388} 389}
389 390
390Dynarmic::HaltReason ARM_Dynarmic_64::StepJit() { 391HaltReason ARM_Dynarmic_64::StepJit() {
391 return jit.load()->Step(); 392 return TranslateHaltReason(jit.load()->Step());
392} 393}
393 394
394u32 ARM_Dynarmic_64::GetSvcNumber() const { 395u32 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
467void ARM_Dynarmic_64::SaveContext(ThreadContext64& ctx) { 468void 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
491void ARM_Dynarmic_64::SignalInterrupt() { 492void ARM_Dynarmic_64::SignalInterrupt() {
492 jit.load()->HaltExecution(break_loop); 493 jit.load()->HaltExecution(BreakLoop);
493} 494}
494 495
495void ARM_Dynarmic_64::ClearInterrupt() { 496void ARM_Dynarmic_64::ClearInterrupt() {
496 jit.load()->ClearHalt(break_loop); 497 jit.load()->ClearHalt(BreakLoop);
497} 498}
498 499
499void ARM_Dynarmic_64::ClearInstructionCache() { 500void 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
529std::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
554std::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
560std::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
65protected: 63protected:
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
7namespace Core { 7namespace 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
57MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU0, "ARM JIT", "Dynarmic CPU 0", MP_RGB(255, 64, 64)); 57MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64));
58MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU1, "ARM JIT", "Dynarmic CPU 1", MP_RGB(255, 64, 64)); 58MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64));
59MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU2, "ARM JIT", "Dynarmic CPU 2", MP_RGB(255, 64, 64)); 59MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64));
60MICROPROFILE_DEFINE(ARM_Jit_Dynarmic_CPU3, "ARM JIT", "Dynarmic CPU 3", MP_RGB(255, 64, 64)); 60MICROPROFILE_DEFINE(ARM_CPU3, "ARM", "CPU 3", MP_RGB(255, 64, 64));
61 61
62namespace Core { 62namespace 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
545System::System() : impl{std::make_unique<Impl>(*this)} {} 545System::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
930void System::EnterDynarmicProfile() { 930void 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
935void System::ExitDynarmicProfile() { 935void 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
940bool System::IsMulticore() const { 940bool 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
13namespace Core::Crypto { 14namespace 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;
22using VideoCore::Surface::PixelFormat; 22using VideoCore::Surface::PixelFormat;
23using VideoCore::Surface::SurfaceType; 23using VideoCore::Surface::SurfaceType;
24 24
25constexpr u32 RescaleHeightThreshold = 288;
26constexpr u32 DownscaleHeightThreshold = 512;
27
25ImageInfo::ImageInfo(const TICEntry& config) noexcept { 28ImageInfo::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