implement a way to set rewind_buffer_size via the UI

This commit is contained in:
Sven 2018-07-13 16:12:09 -04:00
parent 367689a3f9
commit 83da70586e
21 changed files with 505 additions and 25 deletions

4
.gitignore vendored
View File

@ -68,6 +68,10 @@ menu/driverspzarch.c
.pc
/media/shaders_glsl/
/obj-w32/
.cproject
.settings
libretro-super
run.sh
# Wii U
*.depend

View File

@ -5,7 +5,23 @@
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>

View File

@ -1997,7 +1997,7 @@ TODO: Add a setting for these tweaks */
if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL))
#endif
{
state_manager_event_init((unsigned)settings->rewind_buffer_size);
state_manager_event_init((unsigned)settings->sizes.rewind_buffer_size);
}
}
}

View File

@ -524,6 +524,9 @@ static const bool rewind_enable = false;
* 15-20MB per minute. Very game dependant. */
static const unsigned rewind_buffer_size = 20 << 20; /* 20MiB */
/* The amount of MB to increase/decrease the rewind_buffer_size when it is changed via the UI. */
static const unsigned rewind_buffer_size_step = 10; /* 10MB */
/* How many frames to rewind at a time. */
static const unsigned rewind_granularity = 1;

View File

@ -92,6 +92,16 @@ struct config_uint_setting
enum rarch_override_setting override;
};
struct config_size_setting
{
const char *ident;
size_t *ptr;
bool def_enable;
size_t def;
bool handle;
enum rarch_override_setting override;
};
struct config_float_setting
{
const char *ident;
@ -550,6 +560,9 @@ static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_NULL;
#define SETTING_UINT(key, configval, default_enable, default_setting, handle_setting) \
GENERAL_SETTING(key, configval, default_enable, default_setting, struct config_uint_setting, handle_setting)
#define SETTING_SIZE(key, configval, default_enable, default_setting, handle_setting) \
GENERAL_SETTING(key, configval, default_enable, default_setting, struct config_size_setting, handle_setting)
#define SETTING_PATH(key, configval, default_enable, default_setting, handle_setting) \
GENERAL_SETTING(key, configval, default_enable, default_setting, struct config_path_setting, handle_setting)
@ -1508,6 +1521,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
SETTING_UINT("audio_resampler_quality", &settings->uints.audio_resampler_quality, true, audio_resampler_quality_level, false);
SETTING_UINT("audio_block_frames", &settings->uints.audio_block_frames, true, 0, false);
SETTING_UINT("rewind_granularity", &settings->uints.rewind_granularity, true, rewind_granularity, false);
SETTING_UINT("rewind_buffer_size_step", &settings->uints.rewind_buffer_size_step, true, rewind_buffer_size_step, false);
SETTING_UINT("autosave_interval", &settings->uints.autosave_interval, true, autosave_interval, false);
SETTING_UINT("libretro_log_level", &settings->uints.libretro_log_level, true, libretro_log_level, false);
SETTING_UINT("keyboard_gamepad_mapping_type",&settings->uints.input_keyboard_gamepad_mapping_type, true, 1, false);
@ -1584,6 +1598,18 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
return tmp;
}
static struct config_size_setting *populate_settings_size(settings_t *settings, int *size)
{
unsigned count = 0;
struct config_size_setting *tmp = (struct config_size_setting*)malloc((*size + 1) * sizeof(struct config_size_setting));
SETTING_SIZE("rewind_buffer_size", &settings->sizes.rewind_buffer_size, true, rewind_buffer_size, false);
*size = count;
return tmp;
}
static struct config_int_setting *populate_settings_int(settings_t *settings, int *size)
{
unsigned count = 0;
@ -1619,6 +1645,7 @@ static void config_set_defaults(void)
int float_settings_size = sizeof(settings->floats) / sizeof(settings->floats.placeholder);
int int_settings_size = sizeof(settings->ints) / sizeof(settings->ints.placeholder);
int uint_settings_size = sizeof(settings->uints) / sizeof(settings->uints.placeholder);
int size_settings_size = sizeof(settings->sizes) / sizeof(settings->sizes.placeholder);
const char *def_video = config_get_default_video();
const char *def_audio = config_get_default_audio();
const char *def_audio_resampler = config_get_default_audio_resampler();
@ -1638,6 +1665,7 @@ static void config_set_defaults(void)
struct config_bool_setting *bool_settings = populate_settings_bool (settings, &bool_settings_size);
struct config_int_setting *int_settings = populate_settings_int (settings, &int_settings_size);
struct config_uint_setting *uint_settings = populate_settings_uint (settings, &uint_settings_size);
struct config_size_setting *size_settings = populate_settings_size (settings, &size_settings_size);
if (bool_settings && (bool_settings_size > 0))
{
@ -1672,6 +1700,17 @@ static void config_set_defaults(void)
free(uint_settings);
}
if (size_settings && (size_settings_size > 0))
{
for (i = 0; i < (unsigned)size_settings_size; i++)
{
if (size_settings[i].def_enable)
*size_settings[i].ptr = size_settings[i].def;
}
free(size_settings);
}
if (float_settings && (float_settings_size > 0))
{
for (i = 0; i < (unsigned)float_settings_size; i++)
@ -1763,8 +1802,6 @@ static void config_set_defaults(void)
audio_set_float(AUDIO_ACTION_VOLUME_GAIN, settings->floats.audio_volume);
audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, settings->floats.audio_mixer_volume);
settings->rewind_buffer_size = rewind_buffer_size;
#ifdef HAVE_LAKKA
settings->bools.ssh_enable = filestream_exists(LAKKA_SSH_PATH);
settings->bools.samba_enable = filestream_exists(LAKKA_SAMBA_PATH);
@ -2463,12 +2500,14 @@ static bool config_load_file(const char *path, bool set_defaults,
int float_settings_size = sizeof(settings->floats) / sizeof(settings->floats.placeholder);
int int_settings_size = sizeof(settings->ints) / sizeof(settings->ints.placeholder);
int uint_settings_size = sizeof(settings->uints) / sizeof(settings->uints.placeholder);
int size_settings_size = sizeof(settings->sizes) / sizeof(settings->sizes.placeholder);
int array_settings_size = sizeof(settings->arrays) / sizeof(settings->arrays.placeholder);
int path_settings_size = sizeof(settings->paths) / sizeof(settings->paths.placeholder);
struct config_bool_setting *bool_settings = populate_settings_bool (settings, &bool_settings_size);
struct config_float_setting *float_settings = populate_settings_float (settings, &float_settings_size);
struct config_int_setting *int_settings = populate_settings_int (settings, &int_settings_size);
struct config_uint_setting *uint_settings = populate_settings_uint (settings, &uint_settings_size);
struct config_size_setting *size_settings = populate_settings_size (settings, &size_settings_size);
struct config_array_setting *array_settings = populate_settings_array (settings, &array_settings_size);
struct config_path_setting *path_settings = populate_settings_path (settings, &path_settings_size);
@ -2593,6 +2632,23 @@ static bool config_load_file(const char *path, bool set_defaults,
*uint_settings[i].ptr = tmp;
}
for (i = 0; i < (unsigned)size_settings_size; i++)
{
size_t tmp = 0;
if (config_get_size_t(conf, size_settings[i].ident, &tmp))
*size_settings[i].ptr = tmp ;
/* Special case for rewind_buffer_size - need to convert low values to what they were
* intended to be based on the default value in config.def.h
* If the value is less than 10000 then multiple by 1MB because if the retroarch.cfg
* file contains rewind_buffer_size = "100" then that ultimately gets interpreted as
* 100MB, so ensure the internal values represent that.*/
if ( strcmp(size_settings[i].ident, "rewind_buffer_size") == 0 ) {
if ( *size_settings[i].ptr < 10000) {
*size_settings[i].ptr = *size_settings[i].ptr * 1024 * 1024 ;
}
}
}
for (i = 0; i < MAX_USERS; i++)
{
char buf[64];
@ -2624,13 +2680,6 @@ static bool config_load_file(const char *path, bool set_defaults,
CONFIG_GET_INT_BASE(conf, settings, uints.led_map[i], buf);
}
{
/* ugly hack around C89 not allowing mixing declarations and code */
int buffer_size = 0;
if (config_get_int(conf, "rewind_buffer_size", &buffer_size))
settings->rewind_buffer_size = buffer_size * UINT64_C(1000000);
}
/* Hexadecimal settings */
@ -3954,6 +4003,7 @@ bool config_save_file(const char *path)
struct config_bool_setting *bool_settings = NULL;
struct config_int_setting *int_settings = NULL;
struct config_uint_setting *uint_settings = NULL;
struct config_size_setting *size_settings = NULL;
struct config_float_setting *float_settings = NULL;
struct config_array_setting *array_settings = NULL;
struct config_path_setting *path_settings = NULL;
@ -3963,6 +4013,7 @@ bool config_save_file(const char *path)
int float_settings_size = sizeof(settings->floats)/ sizeof(settings->floats.placeholder);
int int_settings_size = sizeof(settings->ints) / sizeof(settings->ints.placeholder);
int uint_settings_size = sizeof(settings->uints) / sizeof(settings->uints.placeholder);
int size_settings_size = sizeof(settings->sizes) / sizeof(settings->sizes.placeholder);
int array_settings_size = sizeof(settings->arrays)/ sizeof(settings->arrays.placeholder);
int path_settings_size = sizeof(settings->paths) / sizeof(settings->paths.placeholder);
@ -3979,6 +4030,7 @@ bool config_save_file(const char *path)
bool_settings = populate_settings_bool (settings, &bool_settings_size);
int_settings = populate_settings_int (settings, &int_settings_size);
uint_settings = populate_settings_uint (settings, &uint_settings_size);
size_settings = populate_settings_size (settings, &size_settings_size);
float_settings = populate_settings_float (settings, &float_settings_size);
array_settings = populate_settings_array (settings, &array_settings_size);
path_settings = populate_settings_path (settings, &path_settings_size);
@ -4056,6 +4108,18 @@ bool config_save_file(const char *path)
free(uint_settings);
}
if (size_settings && (size_settings_size > 0))
{
for (i = 0; i < (unsigned)size_settings_size; i++)
if (!size_settings[i].override ||
!retroarch_override_setting_is_set(size_settings[i].override, NULL))
config_set_int(conf,
size_settings[i].ident,
*size_settings[i].ptr);
free(size_settings);
}
for (i = 0; i < MAX_USERS; i++)
{
char cfg[64];
@ -4175,8 +4239,10 @@ bool config_save_overrides(int override_type)
struct config_bool_setting *bool_overrides = NULL;
struct config_int_setting *int_settings = NULL;
struct config_uint_setting *uint_settings = NULL;
struct config_size_setting *size_settings = NULL;
struct config_int_setting *int_overrides = NULL;
struct config_uint_setting *uint_overrides = NULL;
struct config_size_setting *size_overrides = NULL;
struct config_float_setting *float_settings = NULL;
struct config_float_setting *float_overrides= NULL;
struct config_array_setting *array_settings = NULL;
@ -4193,6 +4259,7 @@ bool config_save_overrides(int override_type)
int float_settings_size = sizeof(settings->floats) / sizeof(settings->floats.placeholder);
int int_settings_size = sizeof(settings->ints) / sizeof(settings->ints.placeholder);
int uint_settings_size = sizeof(settings->uints) / sizeof(settings->uints.placeholder);
int size_settings_size = sizeof(settings->sizes) / sizeof(settings->sizes.placeholder);
int array_settings_size = sizeof(settings->arrays) / sizeof(settings->arrays.placeholder);
int path_settings_size = sizeof(settings->paths) / sizeof(settings->paths.placeholder);
rarch_system_info_t *system = runloop_get_system_info();
@ -4261,6 +4328,10 @@ bool config_save_overrides(int override_type)
tmp_i = sizeof(settings->uints) / sizeof(settings->uints.placeholder);
uint_overrides = populate_settings_uint (overrides, &tmp_i);
size_settings = populate_settings_size(settings, &size_settings_size);
tmp_i = sizeof(settings->sizes) / sizeof(settings->sizes.placeholder);
size_overrides = populate_settings_size (overrides, &tmp_i);
float_settings = populate_settings_float(settings, &float_settings_size);
tmp_i = sizeof(settings->floats) / sizeof(settings->floats.placeholder);
float_overrides = populate_settings_float(overrides, &tmp_i);
@ -4313,6 +4384,18 @@ bool config_save_overrides(int override_type)
(*uint_overrides[i].ptr));
}
}
for (i = 0; i < (unsigned)size_settings_size; i++)
{
if ((*size_settings[i].ptr) != (*size_overrides[i].ptr))
{
RARCH_LOG(" original: %s=%d\n",
size_settings[i].ident, (*size_settings[i].ptr));
RARCH_LOG(" override: %s=%d\n",
size_overrides[i].ident, (*size_overrides[i].ptr));
config_set_int(conf, size_overrides[i].ident,
(*size_overrides[i].ptr));
}
}
for (i = 0; i < (unsigned)float_settings_size; i++)
{
if ((*float_settings[i].ptr) != (*float_overrides[i].ptr))
@ -4429,6 +4512,8 @@ bool config_save_overrides(int override_type)
free(int_settings);
if (uint_settings)
free(uint_settings);
if (size_settings)
free(size_settings);
if (int_overrides)
free(int_overrides);
if (uint_overrides)

View File

@ -348,6 +348,7 @@ typedef struct settings
unsigned content_history_size;
unsigned libretro_log_level;
unsigned rewind_granularity;
unsigned rewind_buffer_size_step;
unsigned autosave_interval;
unsigned network_cmd_port;
unsigned network_remote_base_port;
@ -411,6 +412,12 @@ typedef struct settings
unsigned midi_volume;
} uints;
struct
{
size_t placeholder;
size_t rewind_buffer_size;
} sizes;
struct
{
char placeholder;
@ -509,7 +516,6 @@ typedef struct settings
video_viewport_t video_viewport_custom;
size_t rewind_buffer_size;
} settings_t;
/**

View File

@ -933,6 +933,10 @@ MSG_HASH(MENU_ENUM_LABEL_REWIND_ENABLE,
"rewind_enable")
MSG_HASH(MENU_ENUM_LABEL_REWIND_GRANULARITY,
"rewind_granularity")
MSG_HASH(MENU_ENUM_LABEL_REWIND_BUFFER_SIZE,
"rewind_buffer_size")
MSG_HASH(MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP,
"rewind_buffer_size_step")
MSG_HASH(MENU_ENUM_LABEL_REWIND_SETTINGS,
"rewind_settings")
MSG_HASH(MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY,

View File

@ -1386,6 +1386,22 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len)
"at a time, increasing the rewinding \n"
"speed.");
break;
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE:
snprintf(s, len,
"Rewind buffer size (MB).\n"
" \n"
" The amount of memory in MB to reserve \n"
"for rewinding. Increasing this value \n"
"increases the rewind history length.\n");
break;
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP:
snprintf(s, len,
"Rewind buffer size step (MB).\n"
" \n"
" Each time you increase or decrease \n"
"the rewind buffer size value via this \n"
"UI it will change by this amount.\n");
break;
case MENU_ENUM_LABEL_SCREENSHOT:
snprintf(s, len,
"Take screenshot.");

View File

@ -1381,6 +1381,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_ENABLE,
"Rewind Enable")
MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY,
"Rewind Granularity")
MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE,
"Rewind Buffer Size (MB)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP,
"Rewind Buffer Size Step (MB)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS,
"Rewind")
MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY,
@ -2802,6 +2806,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_REWIND_GRANULARITY,
"When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE,
"The amount of memory (in MB) to reserve for the rewind buffer. Increasing this will increase the amount of rewind history."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE_STEP,
"Each time you increase or decrease the rewind buffer size value via this UI it will change by this amount"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL,
"Sets log level for cores. If a log level issued by a core is below this value, it is ignored."

View File

@ -592,6 +592,23 @@ bool config_get_int(config_file_t *conf, const char *key, int *in)
return false;
}
bool config_get_size_t(config_file_t *conf, const char *key, size_t *in)
{
const struct config_entry_list *entry = config_get_entry(conf, key, NULL);
errno = 0;
if (entry)
{
size_t val = 0 ;
if (1 == sscanf(entry->value, "%" PRI_SIZET, &val)) {
*in = val;
return true;
}
}
return false;
}
#if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L
bool config_get_uint64(config_file_t *conf, const char *key, uint64_t *in)
{

View File

@ -155,4 +155,14 @@ typedef struct
uint32_t data[8];
} retro_bits_t;
#ifdef _WIN32
# ifdef _WIN64
# define PRI_SIZET PRIu64
# else
# define PRI_SIZET PRIu32
# endif
#else
# define PRI_SIZET "zu"
#endif
#endif

View File

@ -65,6 +65,7 @@ static int action_select_default(const char *path, const char *label, unsigned t
case ST_BOOL:
case ST_INT:
case ST_UINT:
case ST_SIZE:
case ST_FLOAT:
action = MENU_ACTION_RIGHT;
break;

View File

@ -206,6 +206,8 @@ default_sublabel_macro(action_bind_sublabel_run_ahead_hide_warnings, MENU_
default_sublabel_macro(action_bind_sublabel_run_ahead_frames, MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES)
default_sublabel_macro(action_bind_sublabel_rewind, MENU_ENUM_SUBLABEL_REWIND_ENABLE)
default_sublabel_macro(action_bind_sublabel_rewind_granularity, MENU_ENUM_SUBLABEL_REWIND_GRANULARITY)
default_sublabel_macro(action_bind_sublabel_rewind_buffer_size, MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE)
default_sublabel_macro(action_bind_sublabel_rewind_buffer_size_step, MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE_STEP)
default_sublabel_macro(action_bind_sublabel_libretro_log_level, MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL)
default_sublabel_macro(action_bind_sublabel_perfcnt_enable, MENU_ENUM_SUBLABEL_PERFCNT_ENABLE)
default_sublabel_macro(action_bind_sublabel_savestate_auto_save, MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE)
@ -1330,6 +1332,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_REWIND_GRANULARITY:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_rewind_granularity);
break;
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_rewind_buffer_size);
break;
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_rewind_buffer_size_step);
break;
case MENU_ENUM_LABEL_SLOWMOTION_RATIO:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_slowmotion_ratio);
break;

View File

@ -2091,6 +2091,9 @@ static int menu_displaylist_parse_settings_internal(void *data,
case PARSE_ONLY_UINT:
precond = ST_UINT;
break;
case PARSE_ONLY_SIZE:
precond = ST_SIZE;
break;
case PARSE_ONLY_BIND:
precond = ST_BIND;
break;
@ -2162,6 +2165,10 @@ static int menu_displaylist_parse_settings_internal(void *data,
if (type == ST_UINT)
break;
goto loop;
case PARSE_ONLY_SIZE:
if (type == ST_SIZE)
break;
goto loop;
case PARSE_ONLY_BIND:
if (type == ST_BIND)
break;
@ -2226,6 +2233,7 @@ loop:
case PARSE_ONLY_BOOL:
case PARSE_ONLY_INT:
case PARSE_ONLY_UINT:
case PARSE_ONLY_SIZE:
case PARSE_ONLY_STRING:
case PARSE_ONLY_PATH:
case PARSE_ONLY_DIR:
@ -2283,6 +2291,9 @@ static int menu_displaylist_parse_settings_internal_enum(void *data,
case PARSE_ONLY_UINT:
precond = ST_UINT;
break;
case PARSE_ONLY_SIZE:
precond = ST_SIZE;
break;
case PARSE_ONLY_BIND:
precond = ST_BIND;
break;
@ -2354,6 +2365,10 @@ static int menu_displaylist_parse_settings_internal_enum(void *data,
if (type == ST_UINT)
break;
goto loop;
case PARSE_ONLY_SIZE:
if (type == ST_SIZE)
break;
goto loop;
case PARSE_ONLY_BIND:
if (type == ST_BIND)
break;
@ -2419,6 +2434,7 @@ loop:
case PARSE_ONLY_BOOL:
case PARSE_ONLY_INT:
case PARSE_ONLY_UINT:
case PARSE_ONLY_SIZE:
case PARSE_ONLY_PATH:
case PARSE_ONLY_DIR:
case PARSE_ONLY_STRING:
@ -5106,6 +5122,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_REWIND_GRANULARITY,
PARSE_ONLY_UINT, false);
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_REWIND_BUFFER_SIZE,
PARSE_ONLY_SIZE, false);
menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP,
PARSE_ONLY_UINT, false);
info->need_refresh = true;
info->need_push = true;

View File

@ -45,7 +45,8 @@ enum menu_displaylist_parse_type
PARSE_ONLY_STRING_OPTIONS = (1 << 11),
PARSE_ONLY_HEX = (1 << 12),
PARSE_ONLY_DIR = (1 << 13),
PARSE_SUB_GROUP = (1 << 14)
PARSE_SUB_GROUP = (1 << 14),
PARSE_ONLY_SIZE = (1 << 15)
};
enum menu_displaylist_ctl_state

View File

@ -775,6 +775,7 @@ int menu_action_handle_setting(rarch_setting_t *setting,
case ST_BOOL:
case ST_INT:
case ST_UINT:
case ST_SIZE:
case ST_HEX:
case ST_FLOAT:
case ST_STRING:
@ -931,6 +932,8 @@ void *setting_get_ptr(rarch_setting_t *setting)
return setting->value.target.integer;
case ST_UINT:
return setting->value.target.unsigned_integer;
case ST_SIZE:
return setting->value.target.sizet;
case ST_FLOAT:
return setting->value.target.fraction;
case ST_BIND:
@ -1636,6 +1639,14 @@ void general_write_handler(void *data)
case MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE:
frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode);
break;
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP:
{
rarch_setting_t *buffer_size_setting = menu_setting_find("rewind_buffer_size");
if ( buffer_size_setting ) {
buffer_size_setting->step = (*setting->value.target.unsigned_integer)*1024*1024 ;
}
}
break;
default:
break;
}
@ -3083,18 +3094,6 @@ static bool setting_append_list(
SD_FLAG_CMD_APPLY_AUTO);
menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_REWIND_TOGGLE);
#if 0
CONFIG_SIZE(
settings->rewind_buffer_size,
"rewind_buffer_size",
"Rewind Buffer Size",
rewind_buffer_size,
group_info,
subgroup_info,
parent_group,
general_write_handler,
general_read_handler)
#endif
CONFIG_UINT(
list, list_info,
&settings->uints.rewind_granularity,
@ -3107,6 +3106,31 @@ static bool setting_append_list(
general_write_handler,
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 1, 32768, 1, true, true);
CONFIG_SIZE(
list, list_info,
&settings->sizes.rewind_buffer_size,
MENU_ENUM_LABEL_REWIND_BUFFER_SIZE,
MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE,
rewind_buffer_size,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
&setting_get_string_representation_size_in_mb);
menu_settings_list_current_add_range(list, list_info, 1024*1024, 1024*1024*1024, settings->uints.rewind_buffer_size_step*1024*1024, true, true);
CONFIG_UINT(
list, list_info,
&settings->uints.rewind_buffer_size_step,
MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP,
MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP,
rewind_buffer_size_step,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
END_SUB_GROUP(list, list_info, parent_group);
END_GROUP(list, list_info, parent_group);

View File

@ -54,6 +54,8 @@ enum menu_entry_type menu_entry_get_type(uint32_t i)
return MENU_ENTRY_INT;
case ST_UINT:
return MENU_ENTRY_UINT;
case ST_SIZE:
return MENU_ENTRY_SIZE;
case ST_FLOAT:
return MENU_ENTRY_FLOAT;
case ST_PATH:

View File

@ -40,7 +40,8 @@ enum menu_entry_type
MENU_ENTRY_STRING,
MENU_ENTRY_HEX,
MENU_ENTRY_BIND,
MENU_ENTRY_ENUM
MENU_ENTRY_ENUM,
MENU_ENTRY_SIZE
};
typedef struct menu_entry

View File

@ -1193,6 +1193,8 @@ enum msg_hash_enums
MENU_LABEL(SCREENSHOT),
MENU_LABEL(REWIND),
MENU_LABEL(REWIND_GRANULARITY),
MENU_LABEL(REWIND_BUFFER_SIZE),
MENU_LABEL(REWIND_BUFFER_SIZE_STEP),
MENU_LABEL(INPUT_META_REWIND),
MENU_LABEL(SCREEN_RESOLUTION),

View File

@ -155,6 +155,24 @@ static void setting_get_string_representation_uint(void *data,
*setting->value.target.unsigned_integer);
}
static void setting_get_string_representation_size(void *data,
char *s, size_t len)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
if (setting)
snprintf(s, len, "%" PRI_SIZET,
*setting->value.target.sizet);
}
void setting_get_string_representation_size_in_mb(void *data,
char *s, size_t len)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
if (setting)
snprintf(s, len, "%" PRI_SIZET,
(*setting->value.target.sizet)/(1024*1024));
}
static int setting_uint_action_left_default(void *data, bool wraparound)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
@ -228,6 +246,79 @@ static int setting_uint_action_right_default(void *data, bool wraparound)
return 0;
}
static int setting_size_action_left_default(void *data, bool wraparound)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
double min = 0.0f;
bool overflowed = false;
if (!setting)
return -1;
min = setting->min;
(void)wraparound; /* TODO/FIXME - handle this */
overflowed = setting->step > *setting->value.target.sizet;
if (!overflowed)
*setting->value.target.sizet = *setting->value.target.sizet - setting->step;
if (setting->enforce_minrange)
{
if (overflowed || *setting->value.target.sizet < min)
{
settings_t *settings = config_get_ptr();
#ifdef HAVE_MENU
double max = setting->max;
if (settings && settings->bools.menu_navigation_wraparound_enable)
*setting->value.target.sizet = max;
else
#endif
*setting->value.target.sizet = min;
}
}
return 0;
}
static int setting_size_action_right_default(void *data, bool wraparound)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
double max = 0.0f;
if (!setting)
return -1;
max = setting->max;
(void)wraparound; /* TODO/FIXME - handle this */
*setting->value.target.sizet =
*setting->value.target.sizet + setting->step;
if (setting->enforce_maxrange)
{
if (*setting->value.target.sizet > max)
{
settings_t *settings = config_get_ptr();
#ifdef HAVE_MENU
double min = setting->min;
if (settings && settings->bools.menu_navigation_wraparound_enable)
*setting->value.target.sizet = min;
else
#endif
*setting->value.target.sizet = max;
}
}
return 0;
}
int setting_generic_action_ok_default(void *data, bool wraparound)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
@ -310,6 +401,24 @@ int setting_set_with_string_representation(rarch_setting_t* setting,
}
}
break;
case ST_SIZE:
sscanf(value, "%" PRI_SIZET, setting->value.target.sizet);
if (flags & SD_FLAG_HAS_RANGE)
{
if (setting->enforce_minrange && *setting->value.target.sizet < min)
*setting->value.target.sizet = min;
if (setting->enforce_maxrange && *setting->value.target.sizet > max)
{
#ifdef HAVE_MENU
settings_t *settings = config_get_ptr();
if (settings && settings->bools.menu_navigation_wraparound_enable)
*setting->value.target.sizet = min;
else
#endif
*setting->value.target.sizet = max;
}
}
break;
case ST_FLOAT:
sscanf(value, "%f", setting->value.target.fraction);
if (flags & SD_FLAG_HAS_RANGE)
@ -443,6 +552,9 @@ static void setting_reset_setting(rarch_setting_t* setting)
case ST_UINT:
*setting->value.target.unsigned_integer = setting->default_value.unsigned_integer;
break;
case ST_SIZE:
*setting->value.target.sizet = setting->default_value.sizet;
break;
case ST_FLOAT:
*setting->value.target.fraction = setting->default_value.fraction;
break;
@ -875,6 +987,85 @@ static rarch_setting_t setting_uint_setting(const char* name,
return result;
}
/**
* setting_size_setting:
* @name : name of setting.
* @short_description : Short description of setting.
* @target : Target of size_t setting.
* @default_value : Default value (in size_t format).
* @group : Group that the setting belongs to.
* @subgroup : Subgroup that the setting belongs to.
* @change_handler : Function callback for change handler function pointer.
* @read_handler : Function callback for read handler function pointer.
* @dont_use_enum_idx : Boolean indicating whether or not to use the enum idx
* @string_representation_handler : Function callback for converting the setting to a string
*
* Initializes a setting of type ST_SIZE.
*
* Returns: setting of type ST_SIZE.
**/
static rarch_setting_t setting_size_setting(const char* name,
const char* short_description, size_t* target,
size_t default_value,
const char *group, const char *subgroup, const char *parent_group,
change_handler_t change_handler, change_handler_t read_handler,
bool dont_use_enum_idx, get_string_representation_t string_representation_handler)
{
rarch_setting_t result;
result.enum_idx = MSG_UNKNOWN;
result.type = ST_SIZE;
result.size = sizeof(size_t);
result.name = name;
result.short_description = short_description;
result.group = group;
result.subgroup = subgroup;
result.parent_group = parent_group;
result.values = NULL;
result.index = 0;
result.index_offset = 0;
result.min = 0.0;
result.max = 0.0;
result.flags = 0;
result.free_flags = 0;
result.change_handler = change_handler;
result.read_handler = read_handler;
result.action_start = setting_generic_action_start_default;
result.action_left = setting_size_action_left_default;
result.action_right = setting_size_action_right_default;
result.action_up = NULL;
result.action_down = NULL;
result.action_cancel = NULL;
result.action_ok = setting_generic_action_ok_default;
result.action_select = setting_generic_action_ok_default;
result.get_string_representation = &setting_get_string_representation_size;
result.get_string_representation = string_representation_handler;
result.bind_type = 0;
result.browser_selection_type = ST_NONE;
result.step = 0.0f;
result.rounding_fraction = NULL;
result.enforce_minrange = false;
result.enforce_maxrange = false;
result.value.target.sizet = target;
result.original_value.sizet = *target;
result.default_value.sizet = default_value;
result.cmd_trigger.idx = CMD_EVENT_NONE;
result.cmd_trigger.triggered = false;
result.dont_use_enum_idx_representation = dont_use_enum_idx;
return result;
}
/**
* setting_hex_setting:
* @name : name of setting.
@ -1613,6 +1804,39 @@ bool CONFIG_UINT(
return true;
}
bool CONFIG_SIZE(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
size_t *target,
enum msg_hash_enums name_enum_idx,
enum msg_hash_enums SHORT_enum_idx,
size_t default_value,
rarch_setting_group_info_t *group_info,
rarch_setting_group_info_t *subgroup_info,
const char *parent_group,
change_handler_t change_handler, change_handler_t read_handler,
get_string_representation_t string_representation_handler)
{
rarch_setting_t value = setting_size_setting (
msg_hash_to_str(name_enum_idx),
msg_hash_to_str(SHORT_enum_idx),
target, default_value,
group_info->name,
subgroup_info->name, parent_group,
change_handler, read_handler,
false, string_representation_handler);
if (!(settings_list_append(list, list_info)))
return false;
(*list)[list_info->index++] = value;
#ifdef HAVE_MENU
menu_settings_list_current_add_enum_idx(list, list_info, name_enum_idx);
menu_settings_list_current_add_enum_value_idx(list, list_info, SHORT_enum_idx);
#endif
return true;
}
bool CONFIG_FLOAT(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
@ -2014,6 +2238,7 @@ static int setting_generic_action_ok_linefeed(void *data, bool wraparound)
switch (setting_get_type(setting))
{
case ST_SIZE:
case ST_UINT:
cb = menu_input_st_uint_cb;
break;
@ -2060,6 +2285,7 @@ static void setting_add_special_callbacks(
switch ((*list)[idx].type)
{
case ST_SIZE:
case ST_UINT:
(*list)[idx].action_cancel = NULL;
break;

View File

@ -32,6 +32,7 @@ enum setting_type
ST_BOOL,
ST_INT,
ST_UINT,
ST_SIZE,
ST_FLOAT,
ST_PATH,
ST_DIR,
@ -141,6 +142,7 @@ struct rarch_setting
unsigned int unsigned_integer;
float fraction;
const struct retro_keybind *keybind;
size_t sizet;
} default_value;
struct
@ -153,6 +155,7 @@ struct rarch_setting
unsigned int *unsigned_integer;
float *fraction;
struct retro_keybind *keybind;
size_t *sizet;
} target;
} value;
@ -162,6 +165,7 @@ struct rarch_setting
int integer;
unsigned int unsigned_integer;
float fraction;
size_t sizet;
} original_value;
struct
@ -289,6 +293,19 @@ bool CONFIG_UINT(
const char *parent_group,
change_handler_t change_handler, change_handler_t read_handler);
bool CONFIG_SIZE(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
size_t *target,
enum msg_hash_enums name_enum_idx,
enum msg_hash_enums SHORT_enum_idx,
size_t default_value,
rarch_setting_group_info_t *group_info,
rarch_setting_group_info_t *subgroup_info,
const char *parent_group,
change_handler_t change_handler, change_handler_t read_handler,
get_string_representation_t string_representation_handler);
bool CONFIG_FLOAT(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
@ -414,6 +431,9 @@ void settings_data_list_current_add_free_flags(
rarch_setting_info_t *list_info,
unsigned values);
void setting_get_string_representation_size_in_mb(void *data,
char *s, size_t len);
#define setting_get_type(setting) ((setting) ? setting->type : ST_NONE)
RETRO_END_DECLS