diff --git a/android/app/src/main/cpp/xemu_android.cpp b/android/app/src/main/cpp/xemu_android.cpp index e74461dfec..125caa0873 100644 --- a/android/app/src/main/cpp/xemu_android.cpp +++ b/android/app/src/main/cpp/xemu_android.cpp @@ -576,6 +576,7 @@ cleanup: struct EmulatorSettings { int surface_scale = 1; // 1, 2, or 3 int frame_rate_limit = 60; // 30 or 60 + int system_memory_mib = 64; // 64 or 128 std::string tcg_thread = "multi"; // "single" or "multi" bool use_dsp = false; bool hrtf = true; @@ -686,6 +687,8 @@ static bool WriteConfigToml(const std::string& config_path, if (!android->contains("audio_driver")) { android->insert_or_assign("audio_driver", "openslES"); } + sys->insert_or_assign( + "mem_limit", settings.system_memory_mib == 128 ? "128" : "64"); files->insert_or_assign("bootrom_path", mcpx); files->insert_or_assign("flashrom_path", flash); @@ -806,6 +809,12 @@ static SetupFiles SyncSetupFiles() { emuSettings.frame_rate_limit != 60) { emuSettings.frame_rate_limit = 60; } + emuSettings.system_memory_mib = + GetPrefInt(env, activity, "setting_system_memory_mib", 64); + if (emuSettings.system_memory_mib != 64 && + emuSettings.system_memory_mib != 128) { + emuSettings.system_memory_mib = 64; + } emuSettings.use_dsp = GetPrefBool(env, activity, "setting_use_dsp", false); emuSettings.hrtf = GetPrefBool(env, activity, "setting_hrtf", true); emuSettings.cache_shaders = GetPrefBool(env, activity, "setting_cache_shaders", true); diff --git a/android/app/src/main/cpp/xemu_settings_android.cc b/android/app/src/main/cpp/xemu_settings_android.cc index b00f5eb4eb..dce416a568 100644 --- a/android/app/src/main/cpp/xemu_settings_android.cc +++ b/android/app/src/main/cpp/xemu_settings_android.cc @@ -404,6 +404,20 @@ bool xemu_settings_load(void) } } + if (auto mem_limit = sys["mem_limit"].value()) { + if (*mem_limit == "128") { + g_config.sys.mem_limit = CONFIG_SYS_MEM_LIMIT_128; + } else { + g_config.sys.mem_limit = CONFIG_SYS_MEM_LIMIT_64; + } + } else if (auto mem_limit = sys["mem_limit"].value()) { + if ((int)*mem_limit == 128) { + g_config.sys.mem_limit = CONFIG_SYS_MEM_LIMIT_128; + } else { + g_config.sys.mem_limit = CONFIG_SYS_MEM_LIMIT_64; + } + } + // System file paths if (auto bootrom = sys_files["bootrom_path"].value()) { xemu_settings_set_string(&g_config.sys.files.bootrom_path, bootrom->c_str()); diff --git a/android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt b/android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt index 1d67dccef4..a8e98793ad 100644 --- a/android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt +++ b/android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt @@ -41,6 +41,7 @@ class SettingsActivity : AppCompatActivity() { val btn3x = findViewById(R.id.btn_scale_3x) val toggleDisplayMode = findViewById(R.id.toggle_display_mode) val toggleFrameRate = findViewById(R.id.toggle_frame_rate) + val toggleSystemMemory = findViewById(R.id.toggle_system_memory) val toggleThread = findViewById(R.id.toggle_tcg_thread) val btnMulti = findViewById(R.id.btn_thread_multi) val btnSingle = findViewById(R.id.btn_thread_single) @@ -76,6 +77,12 @@ class SettingsActivity : AppCompatActivity() { else -> toggleFrameRate.check(R.id.btn_fps_60) } + val systemMemoryMiB = prefs.getInt("setting_system_memory_mib", 64) + when (systemMemoryMiB) { + 128 -> toggleSystemMemory.check(R.id.btn_memory_128) + else -> toggleSystemMemory.check(R.id.btn_memory_64) + } + tvVulkanDriverName.text = prefs.getString("setting_vulkan_driver_name", null) ?: getString(R.string.settings_vulkan_driver_none) @@ -132,6 +139,10 @@ class SettingsActivity : AppCompatActivity() { R.id.btn_thread_single -> "single" else -> "multi" } + val selectedSystemMemoryMiB = when (toggleSystemMemory.checkedButtonId) { + R.id.btn_memory_128 -> 128 + else -> 64 + } val selectedAudioDriver = when (toggleAudioDriver.checkedButtonId) { R.id.btn_audio_aaudio -> "aaudio" R.id.btn_audio_disabled -> "dummy" @@ -142,6 +153,7 @@ class SettingsActivity : AppCompatActivity() { .putInt("setting_display_mode", selectedDisplayMode) .putInt("setting_surface_scale", selectedScale) .putInt("setting_frame_rate_limit", selectedFrameRate) + .putInt("setting_system_memory_mib", selectedSystemMemoryMiB) .putString("setting_tcg_thread", selectedThread) .putBoolean("setting_use_dsp", switchDsp.isChecked) .putBoolean("setting_hrtf", switchHrtf.isChecked) diff --git a/android/app/src/main/res/layout/activity_settings.xml b/android/app/src/main/res/layout/activity_settings.xml index b191c17d1a..7f422b887a 100644 --- a/android/app/src/main/res/layout/activity_settings.xml +++ b/android/app/src/main/res/layout/activity_settings.xml @@ -174,6 +174,48 @@ + + + + + + + + + + + + Frame Rate Limit 30 FPS 60 FPS + System Memory + 64 MiB (Default) + 128 MiB (Debug/Homebrew) + Use 64 MiB for retail games. 128 MiB is mainly for debug/homebrew and may reduce compatibility. Internal Resolution Scale 1x (Native 480p) 2x (960p)