diff --git a/config.def.h b/config.def.h index cd9c39e2c5..2341cfce9a 100644 --- a/config.def.h +++ b/config.def.h @@ -37,7 +37,8 @@ #include "gfx/common/ctr_common.h" #endif -/* Required for OpenDingux IPU filter setting */ +/* Required for OpenDingux IPU filter + refresh + * rate settings */ #if defined(DINGUX) #include "dingux/dingux_utils.h" #endif @@ -383,6 +384,11 @@ /* Sets image filtering method when using the * IPU hardware scaler in Dingux devices */ #define DEFAULT_DINGUX_IPU_FILTER_TYPE DINGUX_IPU_FILTER_BICUBIC +#if defined(DINGUX_BETA) +/* Sets refresh rate of integral LCD panel + * in Dingux devices */ +#define DEFAULT_DINGUX_REFRESH_RATE DINGUX_REFRESH_RATE_60HZ +#endif #endif /* Save configuration file on exit. */ @@ -875,8 +881,15 @@ static const bool audio_enable_menu_bgm = false; #define DEFAULT_NOTIFICATION_SHOW_SCREENSHOT_FLASH 0 #endif -/*Display a notification when setting the refresh rate*/ +/* Display a notification when setting the refresh rate*/ +#if defined(_3DS) || (defined(DINGUX) && defined(DINGUX_BETA)) +/* 3DS and OpenDingux Beta devices set refresh rate + * on gfx driver init - set default notification + * state to 'false' in order to avoid OSD log spam */ +#define DEFAULT_NOTIFICATION_SHOW_REFRESH_RATE false +#else #define DEFAULT_NOTIFICATION_SHOW_REFRESH_RATE true +#endif /* Output samplerate. */ #ifdef GEKKO diff --git a/configuration.c b/configuration.c index 15eaf0b75c..4408c31b83 100644 --- a/configuration.c +++ b/configuration.c @@ -2049,6 +2049,9 @@ static struct config_uint_setting *populate_settings_uint( #if defined(DINGUX) SETTING_UINT("video_dingux_ipu_filter_type", &settings->uints.video_dingux_ipu_filter_type, true, DEFAULT_DINGUX_IPU_FILTER_TYPE, false); +#if defined(DINGUX_BETA) + SETTING_UINT("video_dingux_refresh_rate", &settings->uints.video_dingux_refresh_rate, true, DEFAULT_DINGUX_REFRESH_RATE, false); +#endif #endif #ifdef HAVE_MENU diff --git a/configuration.h b/configuration.h index e8a2fe10d8..ed81e015c6 100644 --- a/configuration.h +++ b/configuration.h @@ -201,6 +201,7 @@ typedef struct settings unsigned video_stream_scale_factor; unsigned video_3ds_display_mode; unsigned video_dingux_ipu_filter_type; + unsigned video_dingux_refresh_rate; #ifdef HAVE_VIDEO_LAYOUT unsigned video_layout_selected_view; #endif diff --git a/dingux/dingux_utils.c b/dingux/dingux_utils.c index 5138d3145e..c13649d1b5 100644 --- a/dingux/dingux_utils.c +++ b/dingux/dingux_utils.c @@ -19,6 +19,7 @@ #include #if defined(DINGUX_BETA) +#include #include #endif @@ -37,6 +38,7 @@ #define DINGUX_BATTERY_VOLTAGE_NOW "/sys/class/power_supply/jz-battery/voltage_now" #define DINGUX_SCALING_MODE_ENVAR "SDL_VIDEO_KMSDRM_SCALING_MODE" #define DINGUX_SCALING_SHARPNESS_ENVAR "SDL_VIDEO_KMSDRM_SCALING_SHARPNESS" +#define DINGUX_VIDEO_REFRESHRATE_ENVAR "SDL_VIDEO_REFRESHRATE" /* Enables/disables downscaling when using * the IPU hardware scaler */ @@ -162,6 +164,63 @@ bool dingux_ipu_set_filter_type(enum dingux_ipu_filter_type filter_type) #endif } +#if defined(DINGUX_BETA) +/* Sets the refresh rate of the integral LCD panel. + * If specified value is invalid, will set refresh + * rate to 60 Hz. + * Returns a floating point representation of the + * resultant hardware refresh rate. In the event + * that a refresh rate cannot be set (i.e. hardware + * error), returns 0.0 */ +float dingux_set_video_refresh_rate(enum dingux_refresh_rate refresh_rate) +{ + float refresh_rate_float = 60.0f; + const char *refresh_rate_str = "60"; + + /* Check filter type */ + switch (refresh_rate) + { + case DINGUX_REFRESH_RATE_50HZ: + refresh_rate_float = 50.0f; + refresh_rate_str = "50"; + break; + default: + /* Refresh rate is already set to 60 Hz + * by default */ + break; + } + + if (setenv(DINGUX_VIDEO_REFRESHRATE_ENVAR, refresh_rate_str, 1) != 0) + refresh_rate_float = 0.0f; + + return refresh_rate_float; +} + +/* Gets the currently set refresh rate of the + * integral LCD panel. */ +bool dingux_get_video_refresh_rate(enum dingux_refresh_rate *refresh_rate) +{ + const char *refresh_rate_str = getenv(DINGUX_VIDEO_REFRESHRATE_ENVAR); + + /* If environment variable is unset, refresh + * rate defaults to 60 Hz */ + if (!refresh_rate_str) + { + *refresh_rate = DINGUX_REFRESH_RATE_60HZ; + return true; + } + + if (string_is_equal(refresh_rate_str, "60")) + *refresh_rate = DINGUX_REFRESH_RATE_60HZ; + else if (string_is_equal(refresh_rate_str, "50")) + *refresh_rate = DINGUX_REFRESH_RATE_50HZ; + else + return false; + + return true; +} +#endif + /* Resets the IPU hardware scaler to the * default configuration */ bool dingux_ipu_reset(void) @@ -169,6 +228,7 @@ bool dingux_ipu_reset(void) #if defined(DINGUX_BETA) unsetenv(DINGUX_SCALING_MODE_ENVAR); unsetenv(DINGUX_SCALING_SHARPNESS_ENVAR); + unsetenv(DINGUX_VIDEO_REFRESHRATE_ENVAR); return true; #else return dingux_ipu_set_scaling_mode(true, false) && diff --git a/dingux/dingux_utils.h b/dingux/dingux_utils.h index c40eb75926..bf13140fca 100644 --- a/dingux/dingux_utils.h +++ b/dingux/dingux_utils.h @@ -38,6 +38,17 @@ enum dingux_ipu_filter_type DINGUX_IPU_FILTER_LAST }; +#if defined(DINGUX_BETA) +/* Specifies all video refresh rates supported + * by OpenDingux Beta */ +enum dingux_refresh_rate +{ + DINGUX_REFRESH_RATE_60HZ = 0, + DINGUX_REFRESH_RATE_50HZ, + DINGUX_REFRESH_RATE_LAST +}; +#endif + /* Enables/disables downscaling when using * the IPU hardware scaler */ bool dingux_ipu_set_downscaling_enable(bool enable); @@ -66,6 +77,23 @@ bool dingux_ipu_set_scaling_mode(bool keep_aspect, bool integer_scale); * using the IPU hardware scaler */ bool dingux_ipu_set_filter_type(enum dingux_ipu_filter_type filter_type); +#if defined(DINGUX_BETA) +/* Sets the refresh rate of the integral LCD panel. + * If specified value is invalid, will set refresh + * rate to 60 Hz. + * Returns a floating point representation of the + * resultant hardware refresh rate. In the event + * that a refresh rate cannot be set (i.e. hardware + * error), returns 0.0 */ +float dingux_set_video_refresh_rate(enum dingux_refresh_rate refresh_rate); + +/* Gets the currently set refresh rate of the + * integral LCD panel. + * Returns false if hardware is in an undefined + * state. */ +bool dingux_get_video_refresh_rate(enum dingux_refresh_rate *refresh_rate); +#endif + /* Resets the IPU hardware scaler to the * default configuration */ bool dingux_ipu_reset(void); diff --git a/gfx/drivers/sdl_dingux_gfx.c b/gfx/drivers/sdl_dingux_gfx.c index 415eb1c209..f91ac611c0 100644 --- a/gfx/drivers/sdl_dingux_gfx.c +++ b/gfx/drivers/sdl_dingux_gfx.c @@ -42,6 +42,9 @@ #include "../../gfx/drivers_font_renderer/bitmap.h" #include "../../configuration.h" #include "../../retroarch.h" +#if defined(DINGUX_BETA) +#include "../../driver.h" +#endif #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) @@ -51,11 +54,10 @@ #define SDL_DINGUX_NUM_FONT_GLYPHS 256 -#define SDL_DINGUX_FF_FRAME_TIME_MIN 16667 - typedef struct sdl_dingux_video { retro_time_t last_frame_time; + retro_time_t ff_frame_time_min; SDL_Surface *screen; bitmapfont_lut_t *osd_font; unsigned frame_width; @@ -63,6 +65,9 @@ typedef struct sdl_dingux_video unsigned frame_padding_x; unsigned frame_padding_y; enum dingux_ipu_filter_type filter_type; +#if defined(DINGUX_BETA) + enum dingux_refresh_rate refresh_rate; +#endif uint32_t font_colour32; uint16_t font_colour16; uint16_t menu_texture[SDL_DINGUX_MENU_WIDTH * SDL_DINGUX_MENU_HEIGHT]; @@ -402,16 +407,23 @@ static void sdl_dingux_input_driver_init( static void *sdl_dingux_gfx_init(const video_info_t *video, input_driver_t **input, void **input_data) { - sdl_dingux_video_t *vid = NULL; - uint32_t sdl_subsystem_flags = SDL_WasInit(0); - settings_t *settings = config_get_ptr(); - bool ipu_keep_aspect = settings->bools.video_dingux_ipu_keep_aspect; - bool ipu_integer_scaling = settings->bools.video_scale_integer; - enum dingux_ipu_filter_type ipu_filter_type = (enum dingux_ipu_filter_type) + sdl_dingux_video_t *vid = NULL; + uint32_t sdl_subsystem_flags = SDL_WasInit(0); + settings_t *settings = config_get_ptr(); + bool ipu_keep_aspect = settings->bools.video_dingux_ipu_keep_aspect; + bool ipu_integer_scaling = settings->bools.video_scale_integer; +#if defined(DINGUX_BETA) + enum dingux_refresh_rate current_refresh_rate = DINGUX_REFRESH_RATE_60HZ; + enum dingux_refresh_rate target_refresh_rate = (enum dingux_refresh_rate) + settings->uints.video_dingux_refresh_rate; + bool refresh_rate_valid = false; + float hw_refresh_rate = 0.0f; +#endif + enum dingux_ipu_filter_type ipu_filter_type = (enum dingux_ipu_filter_type) settings->uints.video_dingux_ipu_filter_type; - const char *input_driver_name = settings->arrays.input_driver; - const char *joypad_driver_name = settings->arrays.input_joypad_driver; - uint32_t surface_flags = (video->vsync) ? + const char *input_driver_name = settings->arrays.input_driver; + const char *joypad_driver_name = settings->arrays.input_joypad_driver; + uint32_t surface_flags = (video->vsync) ? (SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN) : (SDL_HWSURFACE | SDL_FULLSCREEN); @@ -434,6 +446,50 @@ static void *sdl_dingux_gfx_init(const video_info_t *video, dingux_ipu_set_downscaling_enable(true); dingux_ipu_set_scaling_mode(ipu_keep_aspect, ipu_integer_scaling); dingux_ipu_set_filter_type(ipu_filter_type); +#if defined(DINGUX_BETA) + /* Get current refresh rate */ + refresh_rate_valid = dingux_get_video_refresh_rate(¤t_refresh_rate); + + /* Check if refresh rate needs to be updated */ + if (!refresh_rate_valid || + (current_refresh_rate != target_refresh_rate)) + hw_refresh_rate = dingux_set_video_refresh_rate(target_refresh_rate); + else + { + /* Correct refresh rate is already set, + * just convert to float */ + switch (current_refresh_rate) + { + case DINGUX_REFRESH_RATE_50HZ: + hw_refresh_rate = 50.0f; + break; + default: + hw_refresh_rate = 60.0f; + break; + } + } + + if (hw_refresh_rate == 0.0f) + { + RARCH_ERR("[SDL1]: Failed to set video refresh rate\n"); + goto error; + } + + vid->refresh_rate = target_refresh_rate; + switch (target_refresh_rate) + { + case DINGUX_REFRESH_RATE_50HZ: + vid->ff_frame_time_min = 20000; + break; + default: + vid->ff_frame_time_min = 16667; + break; + } + + driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, &hw_refresh_rate); +#else + vid->ff_frame_time_min = 16667; +#endif vid->screen = SDL_SetVideoMode( SDL_DINGUX_MENU_WIDTH, SDL_DINGUX_MENU_HEIGHT, @@ -710,7 +766,8 @@ static bool sdl_dingux_gfx_frame(void *data, const void *frame, /* If fast forward is currently active, we may * push frames at an 'unlimited' rate. Since the - * display has a fixed refresh rate of 60 Hz, this + * display has a fixed refresh rate of 60 Hz (or + * potentially 50 Hz on OpenDingux Beta), this * represents wasted effort. We therefore drop any * 'excess' frames in this case. * (Note that we *only* do this when fast forwarding. @@ -721,7 +778,7 @@ static bool sdl_dingux_gfx_frame(void *data, const void *frame, retro_time_t current_time = cpu_features_get_time_usec(); if ((current_time - vid->last_frame_time) < - SDL_DINGUX_FF_FRAME_TIME_MIN) + vid->ff_frame_time_min) return true; vid->last_frame_time = current_time; @@ -932,6 +989,26 @@ static void sdl_dingux_gfx_viewport_info(void *data, struct video_viewport *vp) vp->height = vp->full_height = vid->frame_height; } +static float sdl_dingux_get_refresh_rate(void *data) +{ +#if defined(DINGUX_BETA) + sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data; + + if (!vid) + return 0.0f; + + switch (vid->refresh_rate) + { + case DINGUX_REFRESH_RATE_50HZ: + return 50.0f; + default: + break; + } +#endif + + return 60.0f; +} + static void sdl_dingux_set_filtering(void *data, unsigned index, bool smooth, bool ctx_scaling) { sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data; @@ -1000,7 +1077,7 @@ static const video_poke_interface_t sdl_dingux_poke_interface = { NULL, NULL, NULL, - NULL, /* get_refresh_rate */ + sdl_dingux_get_refresh_rate, sdl_dingux_set_filtering, NULL, /* get_video_output_size */ NULL, /* get_video_output_prev */ diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 35086b378b..f091b58f0f 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -3135,6 +3135,12 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE, "video_dingux_ipu_filter_type" ) +#if defined(DINGUX_BETA) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE, + "video_dingux_refresh_rate" + ) +#endif #endif MSG_HASH( MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index eadeea9b9d..2d045a559c 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1500,6 +1500,24 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_POLLED, "The refresh rate as reported by the display driver." ) +#if defined(DINGUX) && defined(DINGUX_BETA) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE, + "Vertical Refresh Rate" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_DINGUX_REFRESH_RATE, + "Set vertical refresh rate of the display. '50 Hz' will enable smooth video when running PAL content." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ, + "60 Hz" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ, + "50 Hz" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, "Force-Disable sRGB FBO" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index af4ca4e88b..e6cfa468ac 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -856,6 +856,9 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_aspect_ratio, #if defined(DINGUX) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_ipu_keep_aspect, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_IPU_KEEP_ASPECT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_ipu_filter_type, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_IPU_FILTER_TYPE) +#if defined(DINGUX_BETA) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_refresh_rate, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_REFRESH_RATE) +#endif #endif DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_height, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_width, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH) @@ -1860,6 +1863,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_dingux_ipu_filter_type); break; +#if defined(DINGUX_BETA) + case MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_dingux_refresh_rate); + break; +#endif #endif case MENU_ENUM_LABEL_CORE_INFORMATION: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_information); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 5d9beb12ce..d6ce178c4b 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7478,6 +7478,12 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_VIDEO_GPU_INDEX, PARSE_ONLY_INT, false) == 0) count++; +#if defined(DINGUX) && defined(DINGUX_BETA) + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE, + PARSE_ONLY_UINT, false) == 0) + count++; +#endif if (threaded && !*threaded) { if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 7496a0b8bf..7fb5a724b2 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -5177,6 +5177,31 @@ static void setting_get_string_representation_uint_video_dingux_ipu_filter_type( break; } } +#if defined(DINGUX_BETA) +static void setting_get_string_representation_uint_video_dingux_refresh_rate( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case DINGUX_REFRESH_RATE_60HZ: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ), + len); + break; + case DINGUX_REFRESH_RATE_50HZ: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ), + len); + break; + } +} +#endif #endif static void setting_get_string_representation_uint_input_auto_game_focus( @@ -7249,6 +7274,46 @@ static void general_write_handler(rarch_setting_t *setting) /* In case refresh rate update forced non-block video. */ rarch_cmd = CMD_EVENT_VIDEO_SET_BLOCKING_STATE; break; +#if defined(DINGUX) && defined(DINGUX_BETA) + case MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE: + { + enum dingux_refresh_rate current_refresh_rate = DINGUX_REFRESH_RATE_60HZ; + enum dingux_refresh_rate target_refresh_rate = + (enum dingux_refresh_rate)settings->uints.video_dingux_refresh_rate; + bool refresh_rate_valid = false; + + /* Get current refresh rate */ + refresh_rate_valid = dingux_get_video_refresh_rate(¤t_refresh_rate); + + /* Check if refresh rate has changed */ + if (!refresh_rate_valid || + (current_refresh_rate != target_refresh_rate)) + { + /* Get floating point representation of + * new refresh rate */ + float hw_refresh_rate = 60.0f; + + switch (target_refresh_rate) + { + case DINGUX_REFRESH_RATE_50HZ: + hw_refresh_rate = 50.0f; + default: + break; + } + + /* Manually update 'settings->floats.video_refresh_rate' + * (required for correct timing adjustments when + * reinitialising drivers) */ + configuration_set_float(settings, + settings->floats.video_refresh_rate, + hw_refresh_rate); + + /* Trigger driver reinitialisation */ + rarch_cmd = CMD_EVENT_REINIT; + } + } + break; +#endif case MENU_ENUM_LABEL_VIDEO_SCALE: settings->modified = true; settings->floats.video_scale = roundf(*setting->value.target.fraction); @@ -10528,42 +10593,65 @@ static bool setting_append_list( SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED); } - CONFIG_FLOAT( - list, list_info, - &settings->floats.video_refresh_rate, - MENU_ENUM_LABEL_VIDEO_REFRESH_RATE, - MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, - DEFAULT_REFRESH_RATE, - "%.3f Hz", - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - menu_settings_list_current_add_range(list, list_info, 0, 0, 0.001, true, false); - SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); - - CONFIG_FLOAT( - list, list_info, - &settings->floats.video_refresh_rate, - MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO, - MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, - DEFAULT_REFRESH_RATE, - "%.3f Hz", - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - (*list)[list_info->index - 1].action_start = &setting_action_start_video_refresh_rate_auto; - (*list)[list_info->index - 1].action_ok = &setting_action_ok_video_refresh_rate_auto; - (*list)[list_info->index - 1].action_select = &setting_action_ok_video_refresh_rate_auto; - (*list)[list_info->index - 1].get_string_representation = - &setting_get_string_representation_st_float_video_refresh_rate_auto; - SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); - +#if defined(DINGUX) && defined(DINGUX_BETA) + if (string_is_equal(settings->arrays.video_driver, "sdl_dingux")) + { + CONFIG_UINT( + list, list_info, + &settings->uints.video_dingux_refresh_rate, + MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE, + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE, + DEFAULT_DINGUX_REFRESH_RATE, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_video_dingux_refresh_rate; + menu_settings_list_current_add_range(list, list_info, 0, DINGUX_REFRESH_RATE_LAST - 1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; + } + else +#endif { float actual_refresh_rate = video_driver_get_refresh_rate(); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.video_refresh_rate, + MENU_ENUM_LABEL_VIDEO_REFRESH_RATE, + MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, + DEFAULT_REFRESH_RATE, + "%.3f Hz", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0, 0, 0.001, true, false); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.video_refresh_rate, + MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO, + MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, + DEFAULT_REFRESH_RATE, + "%.3f Hz", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_start = &setting_action_start_video_refresh_rate_auto; + (*list)[list_info->index - 1].action_ok = &setting_action_ok_video_refresh_rate_auto; + (*list)[list_info->index - 1].action_select = &setting_action_ok_video_refresh_rate_auto; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_st_float_video_refresh_rate_auto; + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + if (actual_refresh_rate > 0.0) { CONFIG_FLOAT( diff --git a/msg_hash.h b/msg_hash.h index 4ddad948a7..761fca338a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -2427,6 +2427,12 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BICUBIC, MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BILINEAR, MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_NEAREST, +#if defined(DINGUX_BETA) + MENU_LABEL(VIDEO_DINGUX_REFRESH_RATE), + + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ, + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ, +#endif #endif MENU_LABEL(VIDEO_VFILTER), MENU_LABEL(VIDEO_GPU_RECORD),