From aa083d1e4c9a663b5ebff5ffbd0020f06cb3eedd Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Tue, 19 Jun 2018 02:50:33 -0400 Subject: [PATCH] android: add configurable setting for Sustained Performance Mode --- config.def.h | 3 ++ configuration.c | 6 +++- configuration.h | 6 ++-- frontend/drivers/platform_ctr.c | 1 + frontend/drivers/platform_dos.c | 1 + frontend/drivers/platform_emscripten.c | 1 + frontend/drivers/platform_gx.c | 1 + frontend/drivers/platform_null.c | 1 + frontend/drivers/platform_ps3.c | 1 + frontend/drivers/platform_psp.c | 1 + frontend/drivers/platform_qnx.c | 1 + frontend/drivers/platform_unix.c | 30 ++++++++++++++++--- frontend/drivers/platform_unix.h | 1 + frontend/drivers/platform_wiiu.c | 1 + frontend/drivers/platform_win32.c | 1 + frontend/drivers/platform_xdk.c | 1 + frontend/drivers/platform_xenon.c | 1 + frontend/frontend_driver.c | 8 +++++ frontend/frontend_driver.h | 3 ++ intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.h | 2 ++ menu/menu_displaylist.c | 7 ++++- menu/menu_setting.c | 18 +++++++++++ msg_hash.h | 2 ++ .../retroactivity/RetroActivityCommon.java | 30 +++++++++++++++++-- .../retroactivity/RetroActivityFuture.java | 5 +--- retroarch.cfg | 3 ++ 27 files changed, 124 insertions(+), 14 deletions(-) diff --git a/config.def.h b/config.def.h index aafa2a4297..ba69cb883a 100644 --- a/config.def.h +++ b/config.def.h @@ -694,6 +694,9 @@ static const char *midi_input = "Off"; static const char *midi_output = "Off"; static const unsigned midi_volume = 100; +/* Only applies to Android 7.0 (API 24) and up */ +static const bool sustained_performance_mode = true; + #if defined(ANDROID) #if defined(ANDROID_ARM) static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/armeabi-v7a/"; diff --git a/configuration.c b/configuration.c index 1d09d5052f..e67b34ba29 100644 --- a/configuration.c +++ b/configuration.c @@ -1445,6 +1445,8 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, message_bgcolor_enable, false); SETTING_BOOL("video_window_show_decorations", &settings->bools.video_window_show_decorations, true, window_decorations, false); + SETTING_BOOL("sustained_performance_mode", &settings->bools.sustained_performance_mode, true, sustained_performance_mode, false); + *size = count; return tmp; @@ -2941,8 +2943,10 @@ static bool config_load_file(const char *path, bool set_defaults, settings->arrays.video_driver); settings->paths.path_shader[0] = '\0'; break; + } } -} + + frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode); ret = true; diff --git a/configuration.h b/configuration.h index 9b95360ee8..806280fafa 100644 --- a/configuration.h +++ b/configuration.h @@ -96,7 +96,7 @@ typedef struct settings bool video_statistics_show; bool video_framecount_show; bool video_msg_bgcolor_enable; - bool crt_switch_resolution; + bool crt_switch_resolution; /* Audio */ bool audio_enable; @@ -275,6 +275,8 @@ typedef struct settings bool automatically_add_content_to_playlist; bool video_window_show_decorations; + + bool sustained_performance_mode; } bools; struct @@ -351,7 +353,7 @@ typedef struct settings unsigned video_window_x; unsigned video_window_y; unsigned video_window_opacity; - unsigned crt_switch_resolution_super; + unsigned crt_switch_resolution_super; unsigned video_monitor_index; unsigned video_fullscreen_x; unsigned video_fullscreen_y; diff --git a/frontend/drivers/platform_ctr.c b/frontend/drivers/platform_ctr.c index b07493cd12..68110a0f28 100644 --- a/frontend/drivers/platform_ctr.c +++ b/frontend/drivers/platform_ctr.c @@ -589,5 +589,6 @@ frontend_ctx_driver_t frontend_ctx_ctr = NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "ctr", }; diff --git a/frontend/drivers/platform_dos.c b/frontend/drivers/platform_dos.c index b8974439ce..81cae4b621 100644 --- a/frontend/drivers/platform_dos.c +++ b/frontend/drivers/platform_dos.c @@ -70,5 +70,6 @@ frontend_ctx_driver_t frontend_ctx_dos = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "dos", }; diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index 121e3c09ba..1564f04b78 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -262,5 +262,6 @@ frontend_ctx_driver_t frontend_ctx_emscripten = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "emscripten" }; diff --git a/frontend/drivers/platform_gx.c b/frontend/drivers/platform_gx.c index 3da5102977..f7462e0966 100644 --- a/frontend/drivers/platform_gx.c +++ b/frontend/drivers/platform_gx.c @@ -559,5 +559,6 @@ frontend_ctx_driver_t frontend_ctx_gx = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "gx", }; diff --git a/frontend/drivers/platform_null.c b/frontend/drivers/platform_null.c index 5b98c84bb3..dacb0d2c2f 100644 --- a/frontend/drivers/platform_null.c +++ b/frontend/drivers/platform_null.c @@ -46,5 +46,6 @@ frontend_ctx_driver_t frontend_ctx_null = { #endif NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "null", }; diff --git a/frontend/drivers/platform_ps3.c b/frontend/drivers/platform_ps3.c index 1ec907c417..5a53183c5c 100644 --- a/frontend/drivers/platform_ps3.c +++ b/frontend/drivers/platform_ps3.c @@ -634,5 +634,6 @@ frontend_ctx_driver_t frontend_ctx_ps3 = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "ps3", }; diff --git a/frontend/drivers/platform_psp.c b/frontend/drivers/platform_psp.c index 6a08c0bc0e..2d54b2eb22 100644 --- a/frontend/drivers/platform_psp.c +++ b/frontend/drivers/platform_psp.c @@ -520,6 +520,7 @@ frontend_ctx_driver_t frontend_ctx_psp = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ #ifdef VITA "vita", #else diff --git a/frontend/drivers/platform_qnx.c b/frontend/drivers/platform_qnx.c index ddd4829852..05feaae20e 100644 --- a/frontend/drivers/platform_qnx.c +++ b/frontend/drivers/platform_qnx.c @@ -204,5 +204,6 @@ frontend_ctx_driver_t frontend_ctx_qnx = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "qnx", }; diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index 0b806a9d3d..79fe0eb8ae 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -95,6 +95,8 @@ enum INTERNAL_STORAGE_NOT_WRITABLE }; +static void frontend_unix_set_sustained_performance_mode(bool on); + struct android_app *g_android = NULL; static pthread_key_t thread_key; @@ -1147,11 +1149,13 @@ static enum frontend_powerstate frontend_unix_get_powerstate( if (!env || !g_android) return ret; - CALL_INT_METHOD(env, powerstate, - g_android->activity->clazz, g_android->getPowerstate); + if (g_android->getPowerstate) + CALL_INT_METHOD(env, powerstate, + g_android->activity->clazz, g_android->getPowerstate); - CALL_INT_METHOD(env, battery_level, - g_android->activity->clazz, g_android->getBatteryLevel); + if (g_android->getBatteryLevel) + CALL_INT_METHOD(env, battery_level, + g_android->activity->clazz, g_android->getBatteryLevel); *percent = battery_level; @@ -1283,6 +1287,7 @@ static void frontend_unix_get_env(int *argc, return; env = jni_thread_getenv(); + if (!env) return; @@ -2013,6 +2018,8 @@ static void frontend_unix_init(void *data) "getPowerstate", "()I"); GET_METHOD_ID(env, android_app->getBatteryLevel, class, "getBatteryLevel", "()I"); + GET_METHOD_ID(env, android_app->setSustainedPerformanceMode, class, + "setSustainedPerformanceMode", "(Z)V"); CALL_OBJ_METHOD(env, obj, android_app->activity->clazz, android_app->getIntent); @@ -2431,6 +2438,20 @@ static bool frontend_unix_check_for_path_changes(path_change_data_t *change_data #endif } +static void frontend_unix_set_sustained_performance_mode(bool on) +{ +#ifdef ANDROID + JNIEnv *env = jni_thread_getenv(); + + if (!env || !g_android) + return; + + if (g_android->setSustainedPerformanceMode) + CALL_VOID_METHOD_PARAM(env, g_android->activity->clazz, + g_android->setSustainedPerformanceMode, on); +#endif +} + frontend_ctx_driver_t frontend_ctx_unix = { frontend_unix_get_env, /* environment_get */ frontend_unix_init, /* init */ @@ -2474,6 +2495,7 @@ frontend_ctx_driver_t frontend_ctx_unix = { #endif frontend_unix_watch_path_for_changes, frontend_unix_check_for_path_changes, + frontend_unix_set_sustained_performance_mode, #ifdef ANDROID "android" #else diff --git a/frontend/drivers/platform_unix.h b/frontend/drivers/platform_unix.h index 27163961af..9c18c4c990 100644 --- a/frontend/drivers/platform_unix.h +++ b/frontend/drivers/platform_unix.h @@ -162,6 +162,7 @@ struct android_app jmethodID isAndroidTV; jmethodID getPowerstate; jmethodID getBatteryLevel; + jmethodID setSustainedPerformanceMode; }; diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index 1960e12ec3..156d63ea55 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -302,6 +302,7 @@ frontend_ctx_driver_t frontend_ctx_wiiu = NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "wiiu", NULL, /* get_video_driver */ }; diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 8308446f83..59905c9884 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -587,5 +587,6 @@ frontend_ctx_driver_t frontend_ctx_win32 = { frontend_win32_detach_console, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "win32" }; diff --git a/frontend/drivers/platform_xdk.c b/frontend/drivers/platform_xdk.c index 66a3886fca..bba69bed75 100644 --- a/frontend/drivers/platform_xdk.c +++ b/frontend/drivers/platform_xdk.c @@ -426,5 +426,6 @@ frontend_ctx_driver_t frontend_ctx_xdk = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "xdk", }; diff --git a/frontend/drivers/platform_xenon.c b/frontend/drivers/platform_xenon.c index 26e14463a3..c10f1d7f13 100644 --- a/frontend/drivers/platform_xenon.c +++ b/frontend/drivers/platform_xenon.c @@ -93,5 +93,6 @@ frontend_ctx_driver_t frontend_ctx_qnx = { NULL, /* detach_console */ NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ + NULL, /* set_sustained_performance_mode */ "xenon", }; diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c index 8799a17375..eea6e057cb 100644 --- a/frontend/frontend_driver.c +++ b/frontend/frontend_driver.c @@ -416,4 +416,12 @@ bool frontend_driver_check_for_path_changes(path_change_data_t *change_data) return frontend->check_for_path_changes(change_data); } +void frontend_driver_set_sustained_performance_mode(bool on) +{ + frontend_ctx_driver_t *frontend = frontend_get_ptr(); + if (!frontend || !frontend->set_sustained_performance_mode) + return; + frontend->set_sustained_performance_mode(on); +} + #endif diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h index a2f5ddf966..b4aa568f72 100644 --- a/frontend/frontend_driver.h +++ b/frontend/frontend_driver.h @@ -105,6 +105,7 @@ typedef struct frontend_ctx_driver #endif void (*watch_path_for_changes)(struct string_list *list, int flags, path_change_data_t **change_data); bool (*check_for_path_changes)(path_change_data_t *change_data); + void (*set_sustained_performance_mode)(bool on); const char *ident; @@ -203,6 +204,8 @@ void frontend_driver_watch_path_for_changes(struct string_list *list, int flags, bool frontend_driver_check_for_path_changes(path_change_data_t *change_data); +void frontend_driver_set_sustained_performance_mode(bool on); + RETRO_END_DECLS #endif diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 2c23f0256c..664d9b86f6 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1529,3 +1529,5 @@ MSG_HASH(MENU_ENUM_LABEL_MIDI_OUTPUT, "midi_output") MSG_HASH(MENU_ENUM_LABEL_MIDI_VOLUME, "midi_volume") +MSG_HASH(MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE, + "sustained_performance_mode") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 10d61b4289..44529f58db 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3752,3 +3752,5 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS, "Power Management") MSG_HASH(MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS, "Change power management settings.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, + "Sustained Performance Mode") diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 56f710010e..7140fe0128 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5502,7 +5502,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_POWER_MANAGEMENT_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - /* Fill in entry here */ +#ifdef ANDROID + if (menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE, + PARSE_ONLY_BOOL, false) == 0) + count++; +#endif if (count == 0) menu_entries_append_enum(info->list, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 5b6adfa5f5..30afefde43 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1633,6 +1633,9 @@ void general_write_handler(void *data) case MENU_ENUM_LABEL_MIDI_VOLUME: midi_driver_set_volume(settings->uints.midi_volume); break; + case MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE: + frontend_unix_set_sustained_performance_mode(settings->bools.sustained_performance_mode); + break; default: break; } @@ -6378,6 +6381,21 @@ static bool setting_append_list( START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group); + CONFIG_BOOL( + list, list_info, + &settings->bools.sustained_performance_mode, + MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE, + MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, + sustained_performance_mode, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_CMD_APPLY_AUTO); + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; diff --git a/msg_hash.h b/msg_hash.h index ce7eda41b6..e6b8ef6ca6 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1870,6 +1870,8 @@ enum msg_hash_enums MENU_LABEL(MIDI_OUTPUT), MENU_LABEL(MIDI_VOLUME), + MENU_LABEL(SUSTAINED_PERFORMANCE_MODE), + MSG_LAST }; diff --git a/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java b/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java index afea1dee18..e660dd2eb9 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java @@ -12,6 +12,8 @@ import android.os.Build; import android.os.PowerManager; import android.util.Log; +import java.util.concurrent.CountDownLatch; + /** * Class which provides common methods for RetroActivity related classes. */ @@ -22,6 +24,7 @@ public class RetroActivityCommon extends RetroActivityLocation public static int FRONTEND_POWERSTATE_CHARGING = 2; public static int FRONTEND_POWERSTATE_CHARGED = 3; public static int FRONTEND_POWERSTATE_ON_POWER_SOURCE = 4; + public boolean sustainedPerformanceMode = true; // Exiting cleanly from NDK seems to be nearly impossible. // Have to use exit(0) to avoid weird things happening, even with runOnUiThread() approaches. @@ -34,10 +37,33 @@ public class RetroActivityCommon extends RetroActivityLocation @TargetApi(24) public void setSustainedPerformanceMode(boolean on) { - Log.i("RetroActivity", "setting sustained performance mode to " + on); - getWindow().setSustainedPerformanceMode(on); + sustainedPerformanceMode = on; + + if (Build.VERSION.SDK_INT >= 24) { + if (isSustainedPerformanceModeSupported()) { + final CountDownLatch latch = new CountDownLatch(1); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Log.i("RetroActivity", "setting sustained performance mode to " + sustainedPerformanceMode); + + getWindow().setSustainedPerformanceMode(sustainedPerformanceMode); + + latch.countDown(); + } + }); + + try { + latch.await(); + }catch(InterruptedException e) { + e.printStackTrace(); + } + } + } } + @TargetApi(24) public boolean isSustainedPerformanceModeSupported() { boolean supported = false; diff --git a/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java b/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java index 558ebcd30c..eba29872a6 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityFuture.java @@ -18,10 +18,7 @@ public final class RetroActivityFuture extends RetroActivityCamera { public void onResume() { super.onResume(); - if (Build.VERSION.SDK_INT >= 24) { - if (isSustainedPerformanceModeSupported()) - setSustainedPerformanceMode(true); - } + setSustainedPerformanceMode(sustainedPerformanceMode); if (Build.VERSION.SDK_INT >= 19) { // Immersive mode diff --git a/retroarch.cfg b/retroarch.cfg index abe70f232c..e226b7c390 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -878,3 +878,6 @@ # network_cmd_enable = false # network_cmd_port = 55355 # stdin_cmd_enable = false + +# Enable Sustained Performance Mode in Android 7.0+ +# sustained_performance_mode = true