Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gamescope / MangoApp: Refactored FSR hud element to be technology independent / added scaler #1042

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fsr_steam_sharpness is the maximum sharpness. To get the same value that the steam UI uses we do fsr_steam_sharpness - gamescope reported.
Steam also adds nis_steam_sharpness which we don't have a param for yet and should be calculated the same way as fsr

}
if (!HUDElements.params->enabled[OVERLAY_PARAM_ENABLED_mangoapp_steam]){
steam_focused = get_prop("GAMESCOPE_FOCUSED_APP_GFX") == 769;
Expand Down
7 changes: 5 additions & 2 deletions src/app/mangoapp_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
87 changes: 58 additions & 29 deletions src/hud_elements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -1194,7 +1220,8 @@ void HudElements::sort_elements(const std::pair<std::string, std::string>& 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}); }
Expand Down Expand Up @@ -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])
Expand All @@ -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])
Expand Down
8 changes: 5 additions & 3 deletions src/hud_elements.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::pair<std::string, std::string>> options;
std::vector<std::pair<void(*)(), std::string >> ordered_functions;
Expand Down Expand Up @@ -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();
Expand Down
5 changes: 5 additions & 0 deletions src/mesa/util/macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions src/overlay_params.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
}

Expand Down
5 changes: 3 additions & 2 deletions src/overlay_params.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down