From 4b177d0ac783ad84ea078bfd85279341ebefc6da Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Sat, 21 Sep 2024 06:09:02 +0300 Subject: [PATCH] Refresh rate switching fixes and cleanups (#17021) --- gfx/display_servers/dispserv_win32.c | 4 +- gfx/video_driver.c | 9 ++- retroarch.c | 106 ++++++++++----------------- 3 files changed, 49 insertions(+), 70 deletions(-) diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 13fff6adec..f502926989 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -124,7 +124,9 @@ static void win32_display_server_destroy(void *data) if (!dispserv) return; - if (dispserv->orig_width > 0 && dispserv->orig_height > 0) + if ( dispserv->orig_width > 0 + && dispserv->orig_height > 0 + && dispserv->orig_refresh > 0) video_display_server_set_resolution( dispserv->orig_width, dispserv->orig_height, diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 4ed2f7c29a..2e7657e85c 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -1081,7 +1081,13 @@ const char *video_display_server_get_ident(void) void* video_display_server_init(enum rarch_display_type type) { video_driver_state_t *video_st = &video_driver_st; - video_display_server_destroy(); + runloop_state_t *runloop_st = runloop_state_get_ptr(); + + /* Reuse when already and still running */ + if (current_display_server && runloop_st->flags & RUNLOOP_FLAG_IS_INITED) + return video_st->current_display_server_data; + else + video_display_server_destroy(); switch (type) { @@ -3279,6 +3285,7 @@ bool video_driver_init_internal(bool *video_is_threaded, bool verbosity_enabled) video_st->flags |= VIDEO_FLAG_STARTED_FULLSCREEN; else video_st->flags &= ~VIDEO_FLAG_STARTED_FULLSCREEN; + /* Reset video frame count */ video_st->frame_count = 0; video_st->frame_drop_count = 0; diff --git a/retroarch.c b/retroarch.c index 7594ad22b8..691d0ffd3a 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1405,7 +1405,6 @@ static float audio_driver_monitor_adjust_system_rates( } static bool video_driver_monitor_adjust_system_rates( - unsigned _video_swap_interval, float timing_skew_hz, float video_refresh_rate, bool vrr_runloop_enable, @@ -1444,20 +1443,20 @@ static bool video_driver_monitor_adjust_system_rates( static void driver_adjust_system_rates( runloop_state_t *runloop_st, video_driver_state_t *video_st, - settings_t *settings, - bool vrr_runloop_enable, - float video_refresh_rate, - float audio_max_timing_skew, - bool video_adaptive_vsync, - unsigned video_swap_interval, - unsigned black_frame_insertion, - unsigned shader_subframes) + settings_t *settings) { struct retro_system_av_info *av_info = &video_st->av_info; const struct retro_system_timing *info = (const struct retro_system_timing*)&av_info->timing; double input_sample_rate = info->sample_rate; double input_fps = info->fps; + float video_refresh_rate = settings->floats.video_refresh_rate; + float audio_max_timing_skew = settings->floats.audio_max_timing_skew; + unsigned video_swap_interval = settings->uints.video_swap_interval; + unsigned black_frame_insertion = settings->uints.video_black_frame_insertion; + unsigned shader_subframes = settings->uints.video_shader_subframes; + bool vrr_runloop_enable = settings->bools.vrr_runloop_enable; + bool video_adaptive_vsync = settings->bools.video_adaptive_vsync; /* Update video swap interval if automatic * switching is enabled */ @@ -1504,7 +1503,6 @@ static void driver_adjust_system_rates( video_st->core_hz = input_fps; if (!video_driver_monitor_adjust_system_rates( - settings->uints.video_swap_interval, timing_skew_hz, video_refresh_rate, vrr_runloop_enable, @@ -1625,17 +1623,6 @@ void drivers_init( menu_st->flags |= MENU_ST_FLAG_DATA_OWN; #endif - if (flags & (DRIVER_VIDEO_MASK | DRIVER_AUDIO_MASK)) - driver_adjust_system_rates(runloop_st, video_st, settings, - settings->bools.vrr_runloop_enable, - settings->floats.video_refresh_rate, - settings->floats.audio_max_timing_skew, - settings->bools.video_adaptive_vsync, - settings->uints.video_swap_interval, - settings->uints.video_black_frame_insertion, - settings->uints.video_shader_subframes - ); - /* Initialize video driver */ if (flags & DRIVER_VIDEO_MASK) { @@ -1660,31 +1647,9 @@ void drivers_init( runloop_st->frame_time_last = 0; } - /* Initialize audio driver */ - if (flags & DRIVER_AUDIO_MASK) - { - audio_driver_init_internal( - settings, - audio_st->callback.callback != NULL); - if ( audio_st->current_audio - && audio_st->current_audio->device_list_new - && audio_st->context_audio_data) - audio_st->devices_list = (struct string_list*) - audio_st->current_audio->device_list_new( - audio_st->context_audio_data); - } - -#ifdef HAVE_MICROPHONE - if (flags & DRIVER_MICROPHONE_MASK) - { - microphone_driver_init_internal(settings); - if (mic_st->driver && mic_st->driver->device_list_new && mic_st->driver_context) - mic_st->devices_list = mic_st->driver->device_list_new(mic_st->driver_context); - } -#endif - /* Regular display refresh rate startup autoswitch based on content av_info */ - if (flags & (DRIVER_VIDEO_MASK | DRIVER_AUDIO_MASK)) + if ( flags & (DRIVER_VIDEO_MASK | DRIVER_AUDIO_MASK) + && !(runloop_st->flags & RUNLOOP_FLAG_IS_INITED)) { struct retro_system_av_info *av_info = &video_st->av_info; float refresh_rate = av_info->timing.fps; @@ -1708,18 +1673,39 @@ void drivers_init( bool video_switch_refresh_rate = false; video_switch_refresh_rate_maybe(&refresh_rate, &video_switch_refresh_rate); - if (video_switch_refresh_rate && video_display_server_set_refresh_rate(refresh_rate)) - { - int reinit_flags = DRIVER_AUDIO_MASK; video_monitor_set_refresh_rate(refresh_rate); - /* Audio must reinit after successful rate switch */ - command_event(CMD_EVENT_REINIT, &reinit_flags); - } } } } + /* Adjust rates */ + if (flags & (DRIVER_VIDEO_MASK | DRIVER_AUDIO_MASK)) + driver_adjust_system_rates(runloop_st, video_st, settings); + + /* Initialize audio driver */ + if (flags & DRIVER_AUDIO_MASK) + { + audio_driver_init_internal( + settings, + audio_st->callback.callback != NULL); + if ( audio_st->current_audio + && audio_st->current_audio->device_list_new + && audio_st->context_audio_data) + audio_st->devices_list = (struct string_list*) + audio_st->current_audio->device_list_new( + audio_st->context_audio_data); + } + +#ifdef HAVE_MICROPHONE + if (flags & DRIVER_MICROPHONE_MASK) + { + microphone_driver_init_internal(settings); + if (mic_st->driver && mic_st->driver->device_list_new && mic_st->driver_context) + mic_st->devices_list = mic_st->driver->device_list_new(mic_st->driver_context); + } +#endif + if (flags & DRIVER_CAMERA_MASK) { /* Only initialize camera driver if we're ever going to use it. */ @@ -2063,14 +2049,6 @@ bool driver_ctl(enum driver_ctl_state state, void *data) video_driver_state_t*video_st = video_state_get_ptr(); unsigned audio_output_sample_rate = settings->uints.audio_output_sample_rate; - bool vrr_runloop_enable = settings->bools.vrr_runloop_enable; - float video_refresh_rate = settings->floats.video_refresh_rate; - float audio_max_timing_skew = settings->floats.audio_max_timing_skew; - bool video_adaptive_vsync = settings->bools.video_adaptive_vsync; - unsigned video_swap_interval = settings->uints.video_swap_interval; - unsigned - black_frame_insertion = settings->uints.video_black_frame_insertion; - unsigned shader_subframes = settings->uints.video_shader_subframes; video_monitor_set_refresh_rate(*hz); @@ -2079,15 +2057,7 @@ bool driver_ctl(enum driver_ctl_state state, void *data) audio_st->source_ratio_current = (double)audio_output_sample_rate / audio_st->input; - driver_adjust_system_rates(runloop_st, video_st, settings, - vrr_runloop_enable, - video_refresh_rate, - audio_max_timing_skew, - video_adaptive_vsync, - video_swap_interval, - black_frame_insertion, - shader_subframes - ); + driver_adjust_system_rates(runloop_st, video_st, settings); } break; case RARCH_DRIVER_CTL_FIND_FIRST: