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
pull/356/head
ZakMcKrack3n 4 years ago committed by jackun
parent d86a05d3a0
commit 73e6e31301
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -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<Clock::duration>(std::chrono::duration<double>(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<Clock::duration>(std::chrono::duration<double>(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();
}
}
}
}

@ -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<KeySym>& keys) {

@ -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(), ' ');
}
}
}

@ -94,35 +94,12 @@ parse_string_to_keysym_vec(const char *str)
return keys;
}
static std::vector<KeySym>
parse_toggle_hud(const char *str)
{
return parse_string_to_keysym_vec(str);
}
static std::vector<KeySym>
parse_toggle_logging(const char *str)
{
return parse_string_to_keysym_vec(str);
}
static std::vector<KeySym>
parse_reload_cfg(const char *str)
{
return parse_string_to_keysym_vec(str);
}
static std::vector<KeySym>
parse_upload_log(const char *str)
{
return parse_string_to_keysym_vec(str);
}
static std::vector<KeySym>
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<std::uint32_t>
parse_fps_limit(const char *str)
{
return strtol(str, NULL, 0);
std::vector<std::uint32_t> 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<uint32_t>(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<Clock::duration>(duration<double>(1) / params->fps_limit);
if (params->fps_limit.size() > 0 && params->fps_limit[0] > 0)
fps_limit_stats.targetFrameTime = duration_cast<Clock::duration>(duration<double>(1) / params->fps_limit[0]);
else
fps_limit_stats.targetFrameTime = {};

@ -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<std::uint32_t> 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<KeySym> toggle_hud;
std::vector<KeySym> toggle_fps_limit;
std::vector<KeySym> toggle_logging;
std::vector<KeySym> reload_cfg;
std::vector<KeySym> upload_log;

Loading…
Cancel
Save