From 73e6e3130188806a4590a7f5f65e1bf2908b087f Mon Sep 17 00:00:00 2001 From: ZakMcKrack3n <30725358+ZakMcKrack3n@users.noreply.github.com> Date: Mon, 17 Aug 2020 08:09:01 +0200 Subject: [PATCH] toggle fps limiter via hotkey, fps_limit may be set to multiple values (e.g. 0,30,60). fps toggle toggles between entries where zero means unlimited --- src/keybinds.cpp | 28 +++++++++++++++++- src/keybinds.h | 2 +- src/overlay.cpp | 2 +- src/overlay_params.cpp | 65 ++++++++++++++++++++---------------------- src/overlay_params.h | 4 ++- 5 files changed, 63 insertions(+), 38 deletions(-) diff --git a/src/keybinds.cpp b/src/keybinds.cpp index 7cc579b8..b2a3ccdd 100644 --- a/src/keybinds.cpp +++ b/src/keybinds.cpp @@ -8,6 +8,7 @@ void check_keybinds(struct swapchain_stats& sw_stats, struct overlay_params& par bool pressed = false; // FIXME just a placeholder until wayland support auto now = Clock::now(); /* us */ auto elapsedF2 = now - last_f2_press; + auto elapsedF3 = now - last_f3_press; auto elapsedF12 = now - last_f12_press; auto elapsedReloadCfg = now - reload_cfg_press; auto elapsedUpload = now - last_upload_press; @@ -34,6 +35,31 @@ void check_keybinds(struct swapchain_stats& sw_stats, struct overlay_params& par } } + if (elapsedF3 >= keyPressDelay){ +#if defined(HAVE_X11) || defined(_WIN32) + pressed = keys_are_pressed(params.toggle_fps_limit); +#else + pressed = false; +#endif + if (pressed){ + last_f3_press = now; + for (size_t i = 0; i < params.fps_limit.size(); i++){ + uint32_t fps_limit = params.fps_limit[i]; + // current fps limit equals vector entry, use next / first + if((fps_limit > 0 && fps_limit_stats.targetFrameTime == std::chrono::duration_cast(std::chrono::duration(1) / params.fps_limit[i])) + || (fps_limit == 0 && fps_limit_stats.targetFrameTime == fps_limit_stats.targetFrameTime.zero())) { + uint32_t newFpsLimit = i+1 == params.fps_limit.size() ? params.fps_limit[0] : params.fps_limit[i+1]; + if(newFpsLimit > 0) { + fps_limit_stats.targetFrameTime = std::chrono::duration_cast(std::chrono::duration(1) / newFpsLimit); + } else { + fps_limit_stats.targetFrameTime = {}; + } + break; + } + } + } + } + if (elapsedF12 >= keyPressDelay){ #if defined(HAVE_X11) || defined(_WIN32) pressed = keys_are_pressed(params.toggle_hud); @@ -80,4 +106,4 @@ void check_keybinds(struct swapchain_stats& sw_stats, struct overlay_params& par logger->upload_last_logs(); } } -} \ No newline at end of file +} diff --git a/src/keybinds.h b/src/keybinds.h index 6aec3e58..698a1e23 100644 --- a/src/keybinds.h +++ b/src/keybinds.h @@ -11,7 +11,7 @@ typedef unsigned long KeySym; #endif -Clock::time_point last_f2_press, last_f12_press, reload_cfg_press, last_upload_press; +Clock::time_point last_f2_press, last_f3_press , last_f12_press, reload_cfg_press, last_upload_press; #ifdef HAVE_X11 bool keys_are_pressed(const std::vector& keys) { diff --git a/src/overlay.cpp b/src/overlay.cpp index b3a15aa5..ae3e9897 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -137,4 +137,4 @@ void calculate_benchmark_data(void *params_void){ for (auto& entry : benchmark.percentile_data) { entry.first.append(max_label_size - entry.first.length(), ' '); } -} \ No newline at end of file +} diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index ba10d23c..719937b7 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -94,35 +94,12 @@ parse_string_to_keysym_vec(const char *str) return keys; } -static std::vector -parse_toggle_hud(const char *str) -{ - return parse_string_to_keysym_vec(str); -} - -static std::vector -parse_toggle_logging(const char *str) -{ - return parse_string_to_keysym_vec(str); -} - -static std::vector -parse_reload_cfg(const char *str) -{ - return parse_string_to_keysym_vec(str); -} - -static std::vector -parse_upload_log(const char *str) -{ - return parse_string_to_keysym_vec(str); -} - -static std::vector -parse_upload_logs(const char *str) -{ - return parse_string_to_keysym_vec(str); -} +#define parse_toggle_hud parse_string_to_keysym_vec +#define parse_toggle_logging parse_string_to_keysym_vec +#define parse_reload_cfg parse_string_to_keysym_vec +#define parse_upload_log parse_string_to_keysym_vec +#define parse_upload_logs parse_string_to_keysym_vec +#define parse_toggle_fps_limit parse_string_to_keysym_vec #else #define parse_toggle_hud(x) {} @@ -130,6 +107,7 @@ parse_upload_logs(const char *str) #define parse_reload_cfg(x) {} #define parse_upload_log(x) {} #define parse_upload_logs(x) {} +#define parse_toggle_fps_limit(x) {} #endif static uint32_t @@ -138,10 +116,28 @@ parse_fps_sampling_period(const char *str) return strtol(str, NULL, 0) * 1000; } -static uint32_t +static std::vector parse_fps_limit(const char *str) { - return strtol(str, NULL, 0); + std::vector fps_limit; + std::stringstream fps_limit_strings(str); + std::string value; + + while (std::getline(fps_limit_strings, value, ',')) { + trim(value); + + uint32_t as_int; + try { + as_int = static_cast(std::stoul(value)); + } catch (const std::invalid_argument&) { + std::cerr << "MANGOHUD: invalid fps_limit value: '" << value << "'\n"; + continue; + } + + fps_limit.push_back(as_int); + } + + return fps_limit; } static bool @@ -464,7 +460,7 @@ parse_overlay_config(struct overlay_params *params, params->width = 0; params->height = 140; params->control = -1; - params->fps_limit = 0; + params->fps_limit = { 0 }; params->vsync = -1; params->gl_vsync = -2; params->offset_x = 0; @@ -494,6 +490,7 @@ parse_overlay_config(struct overlay_params *params, #ifdef HAVE_X11 params->toggle_hud = { XK_Shift_R, XK_F12 }; + params->toggle_fps_limit = { XK_Shift_L, XK_F3 }; params->toggle_logging = { XK_Shift_L, XK_F2 }; params->reload_cfg = { XK_Shift_L, XK_F4 }; params->upload_log = { XK_Shift_L, XK_F3 }; @@ -601,8 +598,8 @@ parse_overlay_config(struct overlay_params *params, // set frametime limit using namespace std::chrono; - if (params->fps_limit > 0) - fps_limit_stats.targetFrameTime = duration_cast(duration(1) / params->fps_limit); + if (params->fps_limit.size() > 0 && params->fps_limit[0] > 0) + fps_limit_stats.targetFrameTime = duration_cast(duration(1) / params->fps_limit[0]); else fps_limit_stats.targetFrameTime = {}; diff --git a/src/overlay_params.h b/src/overlay_params.h index 560465f3..6eedbafe 100644 --- a/src/overlay_params.h +++ b/src/overlay_params.h @@ -69,6 +69,7 @@ typedef unsigned long KeySym; OVERLAY_PARAM_CUSTOM(vsync) \ OVERLAY_PARAM_CUSTOM(gl_vsync) \ OVERLAY_PARAM_CUSTOM(toggle_hud) \ + OVERLAY_PARAM_CUSTOM(toggle_fps_limit) \ OVERLAY_PARAM_CUSTOM(toggle_logging) \ OVERLAY_PARAM_CUSTOM(reload_cfg) \ OVERLAY_PARAM_CUSTOM(upload_log) \ @@ -148,7 +149,7 @@ struct overlay_params { enum overlay_param_position position; int control; uint32_t fps_sampling_period; /* us */ - uint32_t fps_limit; + std::vector fps_limit; bool help; bool no_display; bool full; @@ -168,6 +169,7 @@ struct overlay_params { float font_scale_media_player; float background_alpha, alpha; std::vector toggle_hud; + std::vector toggle_fps_limit; std::vector toggle_logging; std::vector reload_cfg; std::vector upload_log;