implement video_shader_delay setting (in ms), which delays auto-shaders

This commit is contained in:
LazyBumHorse 2019-08-25 18:56:16 +02:00
parent 25170f3615
commit 886d538c48
16 changed files with 110 additions and 28 deletions

View File

@ -278,6 +278,8 @@
#define DEFAULT_SHADER_ENABLE false #define DEFAULT_SHADER_ENABLE false
#endif #endif
#define DEFAULT_SHADER_DELAY 0
/* Only scale in integer steps. /* Only scale in integer steps.
* The base size depends on system-reported geometry and aspect ratio. * The base size depends on system-reported geometry and aspect ratio.
* If video_force_aspect is not set, X/Y will be integer scaled independently. * If video_force_aspect is not set, X/Y will be integer scaled independently.

View File

@ -1747,6 +1747,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
#ifdef HAVE_VIDEO_LAYOUT #ifdef HAVE_VIDEO_LAYOUT
SETTING_UINT("video_layout_selected_view", &settings->uints.video_layout_selected_view, true, 0, false); SETTING_UINT("video_layout_selected_view", &settings->uints.video_layout_selected_view, true, 0, false);
#endif #endif
SETTING_UINT("video_shader_delay", &settings->uints.video_shader_delay, true, DEFAULT_SHADER_DELAY, false);
#ifdef HAVE_COMMAND #ifdef HAVE_COMMAND
SETTING_UINT("network_cmd_port", &settings->uints.network_cmd_port, true, network_cmd_port, false); SETTING_UINT("network_cmd_port", &settings->uints.network_cmd_port, true, network_cmd_port, false);
#endif #endif

View File

@ -504,6 +504,7 @@ typedef struct settings
unsigned video_overscan_correction_top; unsigned video_overscan_correction_top;
unsigned video_overscan_correction_bottom; unsigned video_overscan_correction_bottom;
#endif #endif
unsigned video_shader_delay;
unsigned menu_timedate_style; unsigned menu_timedate_style;
unsigned menu_thumbnails; unsigned menu_thumbnails;

View File

@ -1351,6 +1351,8 @@ MSG_HASH(MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE,
"video_force_srgb_disable") "video_force_srgb_disable")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, MSG_HASH(MENU_ENUM_LABEL_VIDEO_FRAME_DELAY,
"video_frame_delay") "video_frame_delay")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_DELAY,
"video_shader_delay")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_FULLSCREEN, MSG_HASH(MENU_ENUM_LABEL_VIDEO_FULLSCREEN,
"video_fullscreen") "video_fullscreen")
MSG_HASH(MENU_ENUM_LABEL_VIDEO_GAMMA, MSG_HASH(MENU_ENUM_LABEL_VIDEO_GAMMA,

View File

@ -1475,6 +1475,14 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len)
" \n" " \n"
"Maximum is 15."); "Maximum is 15.");
break; break;
case MENU_ENUM_LABEL_VIDEO_SHADER_DELAY:
snprintf(s, len,
"Sets by how many milliseconds auto-loading shaders\n"
"are delayed.\n"
"\n"
"Can work around graphical glitches due to using\n"
"'screen grabbing' software like streaming software.");
break;
case MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES: case MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES:
snprintf(s, len, snprintf(s, len,
"Sets how many frames CPU can \n" "Sets how many frames CPU can \n"

View File

@ -3780,6 +3780,10 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY,
"Frame Delay" "Frame Delay"
) )
MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DELAY,
"Auto-Shader Delay"
)
MSG_HASH( MSG_HASH(
MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN,
"Start in Fullscreen Mode" "Start in Fullscreen Mode"
@ -4419,6 +4423,10 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY,
"Reduces latency at the cost of a higher risk of video stuttering. Adds a delay after V-Sync (in ms)." "Reduces latency at the cost of a higher risk of video stuttering. Adds a delay after V-Sync (in ms)."
) )
MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_SHADER_DELAY,
"Delays auto-loading shaders (in ms). Can work around graphical glitches when using 'screen grabbing' software."
)
MSG_HASH( MSG_HASH(
MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES,
"Sets how many frames the CPU can run ahead of the GPU when using 'Hard GPU Sync'." "Sets how many frames the CPU can run ahead of the GPU when using 'Hard GPU Sync'."

View File

@ -194,6 +194,7 @@ default_sublabel_macro(action_bind_sublabel_input_hotkey_settings, MENU_
default_sublabel_macro(action_bind_sublabel_materialui_icons_enable, MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE) default_sublabel_macro(action_bind_sublabel_materialui_icons_enable, MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE)
default_sublabel_macro(action_bind_sublabel_add_content_list, MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST) default_sublabel_macro(action_bind_sublabel_add_content_list, MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST)
default_sublabel_macro(action_bind_sublabel_video_frame_delay, MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY) default_sublabel_macro(action_bind_sublabel_video_frame_delay, MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY)
default_sublabel_macro(action_bind_sublabel_video_shader_delay, MENU_ENUM_SUBLABEL_VIDEO_SHADER_DELAY)
default_sublabel_macro(action_bind_sublabel_video_black_frame_insertion, MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION) default_sublabel_macro(action_bind_sublabel_video_black_frame_insertion, MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION)
default_sublabel_macro(action_bind_sublabel_systeminfo_cpu_cores, MENU_ENUM_SUBLABEL_CPU_CORES) default_sublabel_macro(action_bind_sublabel_systeminfo_cpu_cores, MENU_ENUM_SUBLABEL_CPU_CORES)
default_sublabel_macro(action_bind_sublabel_toggle_gamepad_combo, MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO) default_sublabel_macro(action_bind_sublabel_toggle_gamepad_combo, MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO)
@ -2543,6 +2544,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_VIDEO_FRAME_DELAY: case MENU_ENUM_LABEL_VIDEO_FRAME_DELAY:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_frame_delay); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_frame_delay);
break; break;
case MENU_ENUM_LABEL_VIDEO_SHADER_DELAY:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_shader_delay);
break;
case MENU_ENUM_LABEL_ADD_CONTENT_LIST: case MENU_ENUM_LABEL_ADD_CONTENT_LIST:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_add_content_list); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_add_content_list);
break; break;

View File

@ -7488,6 +7488,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
menu_displaylist_parse_settings_enum(info->list, menu_displaylist_parse_settings_enum(info->list,
MENU_ENUM_LABEL_VIDEO_SMOOTH, MENU_ENUM_LABEL_VIDEO_SMOOTH,
PARSE_ONLY_BOOL, false); PARSE_ONLY_BOOL, false);
if (menu_displaylist_parse_settings_enum(info->list,
MENU_ENUM_LABEL_VIDEO_SHADER_DELAY,
PARSE_ONLY_UINT, false) == 0)
count++;
menu_displaylist_parse_settings_enum(info->list, menu_displaylist_parse_settings_enum(info->list,
MENU_ENUM_LABEL_VIDEO_FILTER, MENU_ENUM_LABEL_VIDEO_FILTER,
PARSE_ONLY_PATH, false); PARSE_ONLY_PATH, false);

View File

@ -9531,6 +9531,21 @@ static bool setting_append_list(
menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true); menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
CONFIG_UINT(
list, list_info,
&settings->uints.video_shader_delay,
MENU_ENUM_LABEL_VIDEO_SHADER_DELAY,
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DELAY,
DEFAULT_SHADER_DELAY,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
menu_settings_list_current_add_range(list, list_info, 0, 0, 1, true, false);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
#if !defined(RARCH_MOBILE) #if !defined(RARCH_MOBILE)
if (video_driver_test_all_flags(GFX_CTX_FLAGS_BLACK_FRAME_INSERTION)) if (video_driver_test_all_flags(GFX_CTX_FLAGS_BLACK_FRAME_INSERTION))
{ {

View File

@ -168,7 +168,7 @@ bool menu_shader_manager_set_preset(struct video_shader *shader,
bool refresh = false; bool refresh = false;
bool ret = false; bool ret = false;
if (apply && !retroarch_apply_shader(type, preset_path)) if (apply && !retroarch_apply_shader(type, preset_path, true))
{ {
/* We don't want to disable shaders entirely here, /* We don't want to disable shaders entirely here,
* just reset number of passes * just reset number of passes

View File

@ -821,6 +821,7 @@ enum msg_hash_enums
MENU_LABEL(VIDEO_GPU_SCREENSHOT), MENU_LABEL(VIDEO_GPU_SCREENSHOT),
MENU_LABEL(VIDEO_BLACK_FRAME_INSERTION), MENU_LABEL(VIDEO_BLACK_FRAME_INSERTION),
MENU_LABEL(VIDEO_FRAME_DELAY), MENU_LABEL(VIDEO_FRAME_DELAY),
MENU_LABEL(VIDEO_SHADER_DELAY),
MENU_LABEL(VIDEO_VSYNC), MENU_LABEL(VIDEO_VSYNC),
MENU_LABEL(VIDEO_ADAPTIVE_VSYNC), MENU_LABEL(VIDEO_ADAPTIVE_VSYNC),
MENU_LABEL(VIDEO_HARD_SYNC), MENU_LABEL(VIDEO_HARD_SYNC),

View File

@ -133,7 +133,7 @@ int rarch_timer_get_timeout(rarch_timer_t *timer)
{ {
if (!timer) if (!timer)
return 0; return 0;
return (int)timer->timeout_us / 1000000; return (int)(timer->timeout_us / 1000000);
} }
bool rarch_timer_is_running(rarch_timer_t *timer) bool rarch_timer_is_running(rarch_timer_t *timer)
@ -185,3 +185,13 @@ void rarch_timer_begin(rarch_timer_t *timer, uint64_t sec)
timer->timer_begin = true; timer->timer_begin = true;
timer->timer_end = false; timer->timer_end = false;
} }
void rarch_timer_begin_us(rarch_timer_t *timer, uint64_t usec)
{
if (!timer)
return;
rarch_timer_begin_new_time_us(timer, usec);
timer->timer_begin = true;
timer->timer_end = false;
}

View File

@ -95,7 +95,9 @@ bool rarch_timer_is_running(rarch_timer_t *timer);
bool rarch_timer_has_expired(rarch_timer_t *timer); bool rarch_timer_has_expired(rarch_timer_t *timer);
void rarch_timer_begin(rarch_timer_t *timer, uint64_t ms); void rarch_timer_begin(rarch_timer_t *timer, uint64_t sec);
void rarch_timer_begin_us(rarch_timer_t *timer, uint64_t usec);
void rarch_timer_begin_new_time(rarch_timer_t *timer, uint64_t sec); void rarch_timer_begin_new_time(rarch_timer_t *timer, uint64_t sec);

View File

@ -921,6 +921,7 @@ static bool shader_presets_need_reload = true;
static char cli_shader[PATH_MAX_LENGTH] = {0}; static char cli_shader[PATH_MAX_LENGTH] = {0};
static bool cli_shader_disable = false; static bool cli_shader_disable = false;
static char runtime_shader_preset[PATH_MAX_LENGTH] = {0}; static char runtime_shader_preset[PATH_MAX_LENGTH] = {0};
static rarch_timer_t shader_delay_timer = {0};
#endif #endif
static char runloop_max_frames_screenshot_path[PATH_MAX_LENGTH] = {0}; static char runloop_max_frames_screenshot_path[PATH_MAX_LENGTH] = {0};
static char runtime_content_path[PATH_MAX_LENGTH] = {0}; static char runtime_content_path[PATH_MAX_LENGTH] = {0};
@ -2217,7 +2218,7 @@ static const struct cmd_map map[] = {
}; };
#endif #endif
bool retroarch_apply_shader(enum rarch_shader_type type, const char *preset_path) bool retroarch_apply_shader(enum rarch_shader_type type, const char *preset_path, bool message)
{ {
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
settings_t *settings = configuration_settings; settings_t *settings = configuration_settings;
@ -2242,6 +2243,8 @@ bool retroarch_apply_shader(enum rarch_shader_type type, const char *preset_path
menu_shader_set_modified(false); menu_shader_set_modified(false);
#endif #endif
if (message)
{
/* Display message */ /* Display message */
snprintf(msg, sizeof(msg), snprintf(msg, sizeof(msg),
preset_file ? "Shader: \"%s\"" : "Shader: %s", preset_file ? "Shader: \"%s\"" : "Shader: %s",
@ -2253,6 +2256,8 @@ bool retroarch_apply_shader(enum rarch_shader_type type, const char *preset_path
#endif #endif
runloop_msg_queue_push(msg, 1, 120, true, NULL, runloop_msg_queue_push(msg, 1, 120, true, NULL,
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
}
RARCH_LOG("%s \"%s\".\n", RARCH_LOG("%s \"%s\".\n",
msg_hash_to_str(MSG_APPLYING_SHADER), msg_hash_to_str(MSG_APPLYING_SHADER),
preset_path ? preset_path : "null"); preset_path ? preset_path : "null");
@ -2301,7 +2306,7 @@ bool command_set_shader(const char *arg)
} }
} }
return retroarch_apply_shader(type, arg); return retroarch_apply_shader(type, arg, true);
#else #else
return false; return false;
#endif #endif
@ -4060,6 +4065,8 @@ static bool command_event_init_core(enum rarch_core_type type)
/* Load auto-shaders on the next occasion */ /* Load auto-shaders on the next occasion */
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
shader_presets_need_reload = true; shader_presets_need_reload = true;
shader_delay_timer.timer_begin = false; /* not initialized */
shader_delay_timer.timer_end = false; /* not expired */
#endif #endif
/* reset video format to libretro's default */ /* reset video format to libretro's default */
@ -21589,8 +21596,8 @@ static void retroarch_print_help(const char *arg0)
puts(" -s, --save=PATH Path for save files (*.srm)."); puts(" -s, --save=PATH Path for save files (*.srm).");
puts(" -S, --savestate=PATH Path for the save state files (*.state)."); puts(" -S, --savestate=PATH Path for the save state files (*.state).");
puts(" --set-shader PATH Path to a shader (preset) that will be loaded each time content is loaded.\n" puts(" --set-shader PATH Path to a shader (preset) that will be loaded each time content is loaded.\n"
" Effectively overrides core shader presets.\n" " Effectively overrides automatic shader presets.\n"
" An empty argument \"\" will disable shader core presets."); " An empty argument \"\" will disable automatic shader presets.");
puts(" -f, --fullscreen Start the program in fullscreen regardless " puts(" -f, --fullscreen Start the program in fullscreen regardless "
"of config settings."); "of config settings.");
puts(" -c, --config=FILE Path for config file." puts(" -c, --config=FILE Path for config file."
@ -23545,6 +23552,9 @@ const char* retroarch_get_shader_preset(void)
if (!settings->bools.video_shader_enable) if (!settings->bools.video_shader_enable)
return NULL; return NULL;
if (settings->uints.video_shader_delay && !shader_delay_timer.timer_end)
return NULL;
if (!string_is_empty(runtime_shader_preset)) if (!string_is_empty(runtime_shader_preset))
return runtime_shader_preset; return runtime_shader_preset;
@ -24820,14 +24830,7 @@ static enum runloop_state runloop_check_state(void)
need_to_apply = true; need_to_apply = true;
if (!rarch_timer_is_running(&timer)) if (!rarch_timer_is_running(&timer))
{ rarch_timer_begin_us(&timer, SHADER_FILE_WATCH_DELAY_MSEC * 1000);
/* rarch_timer_t convenience functions only support whole seconds. */
/* rarch_timer_begin */
timer.timeout_end = cpu_features_get_time_usec() + SHADER_FILE_WATCH_DELAY_MSEC * 1000;
timer.timer_begin = true;
timer.timer_end = false;
}
} }
/* If a file is modified atomically (moved/renamed from a different file), /* If a file is modified atomically (moved/renamed from a different file),
@ -24840,9 +24843,7 @@ static enum runloop_state runloop_check_state(void)
*/ */
if (need_to_apply) if (need_to_apply)
{ {
/* rarch_timer_tick */ rarch_timer_tick(&timer);
timer.current = cpu_features_get_time_usec();
timer.timeout_us = (timer.timeout_end - timer.current);
if (!timer.timer_end && rarch_timer_has_expired(&timer)) if (!timer.timer_end && rarch_timer_has_expired(&timer))
{ {
@ -24852,6 +24853,27 @@ static enum runloop_state runloop_check_state(void)
} }
} }
} }
if (settings->uints.video_shader_delay && !shader_delay_timer.timer_end)
{
if (!rarch_timer_is_running(&shader_delay_timer))
rarch_timer_begin_us(&shader_delay_timer, settings->uints.video_shader_delay * 1000);
else
{
rarch_timer_tick(&shader_delay_timer);
if (rarch_timer_has_expired(&shader_delay_timer))
{
rarch_timer_end(&shader_delay_timer);
{
const char *preset = retroarch_get_shader_preset();
enum rarch_shader_type type = video_shader_parse_type(preset);
retroarch_apply_shader(type, preset, false);
}
}
}
}
#endif #endif
return RUNLOOP_STATE_ITERATE; return RUNLOOP_STATE_ITERATE;

View File

@ -323,7 +323,8 @@ bool retroarch_is_forced_fullscreen(void);
void retroarch_set_current_core_type( void retroarch_set_current_core_type(
enum rarch_core_type type, bool explicitly_set); enum rarch_core_type type, bool explicitly_set);
bool retroarch_apply_shader(enum rarch_shader_type type, const char *preset_path); bool retroarch_apply_shader(enum rarch_shader_type type, const char *preset_path,
bool message);
const char* retroarch_get_shader_preset(void); const char* retroarch_get_shader_preset(void);

View File

@ -144,6 +144,7 @@ QWidget *VideoPage::widget()
miscGroup->add(MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT); miscGroup->add(MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT);
miscGroup->add(MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN); miscGroup->add(MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN);
miscGroup->add(MENU_ENUM_LABEL_VIDEO_SMOOTH); miscGroup->add(MENU_ENUM_LABEL_VIDEO_SMOOTH);
miscGroup->add(MENU_ENUM_LABEL_VIDEO_SHADER_DELAY);
syncMiscLayout->addWidget(syncGroup); syncMiscLayout->addWidget(syncGroup);
syncMiscLayout->addWidget(miscGroup); syncMiscLayout->addWidget(miscGroup);