diff --git a/src/app/main.cpp b/src/app/main.cpp index 08653949a5..bca7a7e344 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -162,12 +162,13 @@ static void msg_read_thread(){ if (!params.no_display || logger->is_active()) update_hud_info_with_frametime(sw_stats, params, vendorID, mangoapp_v1->visible_frametime_ns); - if (msg_size > offsetof(mangoapp_msg_v1, fsrUpscale)){ - HUDElements.g_fsrUpscale = mangoapp_v1->fsrUpscale; + if (msg_size > offsetof(mangoapp_msg_v1, scaler_filter)){ + HUDElements.g_scaler = mangoapp_v1->scaler; + HUDElements.g_scaler_filter = mangoapp_v1->scaler_filter; if (params.fsr_steam_sharpness < 0) - HUDElements.g_fsrSharpness = mangoapp_v1->fsrSharpness; + HUDElements.g_scaler_sharpness = mangoapp_v1->scaler_sharpness; else - HUDElements.g_fsrSharpness = params.fsr_steam_sharpness - mangoapp_v1->fsrSharpness; + HUDElements.g_scaler_sharpness = params.fsr_steam_sharpness - mangoapp_v1->scaler_sharpness; } if (!HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam]){ steam_focused = get_prop("GAMESCOPE_FOCUSED_APP_GFX") == 769; diff --git a/src/app/mangoapp_proto.h b/src/app/mangoapp_proto.h index 8bc9c90509..a7552c7cd2 100644 --- a/src/app/mangoapp_proto.h +++ b/src/app/mangoapp_proto.h @@ -10,13 +10,16 @@ struct mangoapp_msg_v1 { uint32_t pid; uint64_t visible_frametime_ns; - uint8_t fsrUpscale; - uint8_t fsrSharpness; + uint8_t fsrUpscale; // deprecated / unused + uint8_t fsrSharpness; // deprecated / unused // For debugging uint64_t app_frametime_ns; uint64_t latency_ns; uint32_t outputWidth; uint32_t outputHeight; + uint8_t scaler; + uint8_t scaler_filter; + uint8_t scaler_sharpness; // WARNING: Always ADD fields, never remove or repurpose fields } __attribute__((packed)); diff --git a/src/hud_elements.cpp b/src/hud_elements.cpp index 168667939c..0c4bd93311 100644 --- a/src/hud_elements.cpp +++ b/src/hud_elements.cpp @@ -839,32 +839,58 @@ void HudElements::battery(){ #endif } -void HudElements::gamescope_fsr(){ - if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_fsr] && HUDElements.g_fsrUpscale >= 0) { - ImguiNextColumnFirstItem(); - string FSR_TEXT; - ImVec4 FSR_COLOR; - if (HUDElements.g_fsrUpscale){ - FSR_TEXT = "ON"; - FSR_COLOR = HUDElements.colors.fps_value_high; - } else { - FSR_TEXT = "OFF"; - FSR_COLOR = HUDElements.colors.fps_value_low; - } +void HudElements::gamescope_scaler(){ + static const char* const gamescope_upscale_scaler[] = {"AUTO", "INTEGER", "FIT", "FILL", "STRETCH"}; - HUDElements.TextColored(HUDElements.colors.engine, "%s", "FSR"); - ImguiNextColumnOrNewRow(); - right_aligned_text(FSR_COLOR, HUDElements.ralign_width, "%s", FSR_TEXT.c_str()); - if (HUDElements.g_fsrUpscale){ - if (!HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_hide_fsr_sharpness]) { - ImguiNextColumnOrNewRow(); - right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%i", HUDElements.g_fsrSharpness); - ImGui::SameLine(0,1.0f); - ImGui::PushFont(HUDElements.sw_stats->font1); - HUDElements.TextColored(HUDElements.colors.text, "Sharp"); - ImGui::PopFont(); - } - } + if (!HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_scaler]) + return; + + ImguiNextColumnFirstItem(); + HUDElements.TextColored(HUDElements.colors.engine, "%s", "SCALER"); + ImguiNextColumnOrNewRow(); + + if (ARRAY_CHECK_BOUNDS(gamescope_upscale_scaler, HUDElements.g_scaler)) + right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%s", gamescope_upscale_scaler[HUDElements.g_scaler]); + else + right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%s", "UNKNOWN"); +} + +void HudElements::gamescope_scaler_filter(){ + static const char* const gamescope_upscale_filter[] = {"LINEAR", "NEAREST", "FSR", "NIS"}; + + if (!HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_filter]) + return; + + ImguiNextColumnFirstItem(); + HUDElements.TextColored(HUDElements.colors.engine, "%s", "FILTER"); + ImguiNextColumnOrNewRow(); + + if (ARRAY_CHECK_BOUNDS(gamescope_upscale_filter, HUDElements.g_scaler_filter)) + right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%s", gamescope_upscale_filter[HUDElements.g_scaler_filter]); + else + right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%s", "UNKNOWN"); + + // Additional hud elements + if (HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_hide_scaler_additional]) + return; + + switch (HUDElements.g_scaler_filter) { + case 2: // FSR + ImguiNextColumnOrNewRow(); + right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%i", HUDElements.g_scaler_sharpness); + ImGui::SameLine(0, 1.0f); + ImGui::PushFont(HUDElements.sw_stats->font1); + HUDElements.TextColored(HUDElements.colors.text, "Sharp"); + ImGui::PopFont(); + break; + + case 3: // NIS + ImguiNextColumnOrNewRow(); + right_aligned_text(HUDElements.colors.text, HUDElements.ralign_width, "%.0f", + (20 - HUDElements.g_scaler_sharpness) / 20.0f * 100.0f); + ImGui::SameLine(0, 1.0f); + HUDElements.TextColored(HUDElements.colors.text, "%%"); + break; } } @@ -1194,7 +1220,8 @@ void HudElements::sort_elements(const std::pair& optio exec_list.push_back({int(ordered_functions.size() - 1), value}); } if (param == "battery") { ordered_functions.push_back({battery, value}); } if (param == "fps_only") { ordered_functions.push_back({fps_only, value}); } - if (param == "fsr") { ordered_functions.push_back({gamescope_fsr, value}); } + if (param == "scaler") { ordered_functions.push_back({gamescope_scaler, value}); } + if (param == "filter") { ordered_functions.push_back({gamescope_scaler_filter, value});} if (param == "debug") { ordered_functions.push_back({gamescope_frame_timing, value}); } if (param == "gamepad_battery") { ordered_functions.push_back({gamepad_battery, value}); } if (param == "frame_count") { ordered_functions.push_back({frame_count, value}); } @@ -1240,8 +1267,10 @@ void HudElements::legacy_elements(){ ordered_functions.push_back({battery, value}); if (params->enabled[OVERLAY_PARAM_ENABLED_fan]) ordered_functions.push_back({fan, value}); - if (params->enabled[OVERLAY_PARAM_ENABLED_fsr]) - ordered_functions.push_back({gamescope_fsr, value}); + if (params->enabled[OVERLAY_PARAM_ENABLED_scaler]) + ordered_functions.push_back({gamescope_scaler, value}); + if (params->enabled[OVERLAY_PARAM_ENABLED_filter]) + ordered_functions.push_back({gamescope_scaler_filter, value}); if (params->enabled[OVERLAY_PARAM_ENABLED_throttling_status]) ordered_functions.push_back({throttling_status, value}); if (params->enabled[OVERLAY_PARAM_ENABLED_fps]) @@ -1261,7 +1290,7 @@ void HudElements::legacy_elements(){ if (params->enabled[OVERLAY_PARAM_ENABLED_frame_timing]) ordered_functions.push_back({frame_timing, value}); if (params->enabled[OVERLAY_PARAM_ENABLED_frame_count]) - ordered_functions.push_back({frame_count, value}); + ordered_functions.push_back({frame_count, value}); if (params->enabled[OVERLAY_PARAM_ENABLED_debug] && !params->enabled[OVERLAY_PARAM_ENABLED_horizontal]) ordered_functions.push_back({gamescope_frame_timing, value}); if (params->enabled[OVERLAY_PARAM_ENABLED_gamemode]) diff --git a/src/hud_elements.h b/src/hud_elements.h index b46be470aa..257dfc124f 100644 --- a/src/hud_elements.h +++ b/src/hud_elements.h @@ -22,8 +22,9 @@ class HudElements{ int place; int text_column = 1; int table_columns_count = 0; - int g_fsrUpscale = -1; - int g_fsrSharpness = -1; + int g_scaler_filter = -1; + int g_scaler = -1; + int g_scaler_sharpness = -1; Clock::time_point last_exec; std::vector> options; std::vector> ordered_functions; @@ -65,7 +66,8 @@ class HudElements{ static void _exec(); static void battery(); static void fps_only(); - static void gamescope_fsr(); + static void gamescope_scaler(); + static void gamescope_scaler_filter(); static void gamescope_frame_timing(); static void gamepad_battery(); static void frame_count(); diff --git a/src/mesa/util/macros.h b/src/mesa/util/macros.h index 16c88dbbde..55ee757578 100644 --- a/src/mesa/util/macros.h +++ b/src/mesa/util/macros.h @@ -34,6 +34,11 @@ # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif +/* Check if index is in array's bounds */ +#ifndef ARRAY_CHECK_BOUNDS +# define ARRAY_CHECK_BOUNDS(array, index) (index >= 0 && index < (int)ARRAY_SIZE(array)) +#endif + /* For compatibility with Clang's __has_builtin() */ #ifndef __has_builtin # define __has_builtin(x) 0 diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index 6a265e66f1..6aaafcb6ee 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -548,7 +548,7 @@ parse_overlay_env(struct overlay_params *params, params->enabled[OVERLAY_PARAM_ENABLED_core_load_change] = 0; params->enabled[OVERLAY_PARAM_ENABLED_battery_icon] = 0; params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hide_fsr_sharpness] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_hide_scaler_additional] = 0; params->enabled[OVERLAY_PARAM_ENABLED_throttling_status] = 0; params->enabled[OVERLAY_PARAM_ENABLED_read_cfg] = read_cfg; params->enabled[OVERLAY_PARAM_ENABLED_fcat] = 0; @@ -727,7 +727,7 @@ parse_overlay_config(struct overlay_params *params, params->enabled[OVERLAY_PARAM_ENABLED_fps_only] = 0; params->enabled[OVERLAY_PARAM_ENABLED_battery_icon] = 0; params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam] = 0; - params->enabled[OVERLAY_PARAM_ENABLED_hide_fsr_sharpness] = 0; + params->enabled[OVERLAY_PARAM_ENABLED_hide_scaler_additional] = 0; params->enabled[OVERLAY_PARAM_ENABLED_throttling_status] = 0; params->enabled[OVERLAY_PARAM_ENABLED_fcat] = 0; params->enabled[OVERLAY_PARAM_ENABLED_horizontal] = 0; @@ -900,7 +900,7 @@ parse_overlay_config(struct overlay_params *params, new_frame = true; // we probably changed how we look. } mangoapp_cv.notify_one(); - g_fsrSharpness = params->fsr_steam_sharpness; + g_scaler_sharpness = params->fsr_steam_sharpness; #endif } diff --git a/src/overlay_params.h b/src/overlay_params.h index c60055de69..15be84c5e8 100644 --- a/src/overlay_params.h +++ b/src/overlay_params.h @@ -77,12 +77,13 @@ typedef unsigned long KeySym; OVERLAY_PARAM_BOOL(battery) \ OVERLAY_PARAM_BOOL(battery_icon) \ OVERLAY_PARAM_BOOL(fps_only) \ - OVERLAY_PARAM_BOOL(fsr) \ + OVERLAY_PARAM_BOOL(scaler) \ + OVERLAY_PARAM_BOOL(filter) \ OVERLAY_PARAM_BOOL(mangoapp_steam) \ OVERLAY_PARAM_BOOL(debug) \ OVERLAY_PARAM_BOOL(gamepad_battery) \ OVERLAY_PARAM_BOOL(gamepad_battery_icon) \ - OVERLAY_PARAM_BOOL(hide_fsr_sharpness) \ + OVERLAY_PARAM_BOOL(hide_scaler_additional) \ OVERLAY_PARAM_BOOL(fan) \ OVERLAY_PARAM_BOOL(throttling_status) \ OVERLAY_PARAM_BOOL(fcat) \