monitor: Include the refresh rate mode in the mode spec

Variable refresh rate modes are preferred over their fixed refresh
rate counterparts.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1154>
This commit is contained in:
Dor Askayo 2020-03-17 20:57:41 +02:00 committed by Marge Bot
parent be36c18787
commit 1721dad5ec
2 changed files with 48 additions and 5 deletions

View File

@ -622,16 +622,21 @@ generate_mode_id (MetaMonitorModeSpec *monitor_mode_spec)
{
gboolean is_interlaced;
char rate_str[G_ASCII_DTOSTR_BUF_SIZE];
gboolean is_vrr;
is_interlaced = !!(monitor_mode_spec->flags & META_CRTC_MODE_FLAG_INTERLACE);
g_ascii_formatd (rate_str, sizeof (rate_str),
"%.3f", monitor_mode_spec->refresh_rate);
return g_strdup_printf ("%dx%d%s@%s",
is_vrr = monitor_mode_spec->refresh_rate_mode ==
META_CRTC_REFRESH_RATE_MODE_VARIABLE;
return g_strdup_printf ("%dx%d%s@%s%s",
monitor_mode_spec->width,
monitor_mode_spec->height,
is_interlaced ? "i" : "",
rate_str);
rate_str,
is_vrr ? "+vrr" : "");
}
static gboolean
@ -678,6 +683,7 @@ meta_monitor_create_spec (MetaMonitor *monitor,
.width = width,
.height = height,
.refresh_rate = crtc_mode_info->refresh_rate,
.refresh_rate_mode = crtc_mode_info->refresh_rate_mode,
.flags = crtc_mode_info->flags & HANDLED_CRTC_MODE_FLAGS
};
}
@ -1141,6 +1147,9 @@ find_tiled_crtc_mode (MetaOutput *output,
if (crtc_mode_info->refresh_rate != reference_crtc_mode_info->refresh_rate)
continue;
if (crtc_mode_info->refresh_rate_mode != reference_crtc_mode_info->refresh_rate_mode)
continue;
if (crtc_mode_info->flags != reference_crtc_mode_info->flags)
continue;
@ -1255,9 +1264,24 @@ generate_tiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
if (!monitor_priv->preferred_mode)
{
if (!best_mode ||
mode->spec.refresh_rate > best_mode->spec.refresh_rate)
best_mode = mode;
if (!best_mode)
{
best_mode = mode;
continue;
}
if (mode->spec.refresh_rate > best_mode->spec.refresh_rate)
{
best_mode = mode;
continue;
}
if (mode->spec.refresh_rate == best_mode->spec.refresh_rate &&
mode->spec.refresh_rate_mode > best_mode->spec.refresh_rate_mode)
{
best_mode = mode;
continue;
}
}
}
@ -1443,6 +1467,13 @@ find_best_mode (MetaMonitor *monitor)
best_mode = mode;
continue;
}
if (mode->spec.refresh_rate == best_mode->spec.refresh_rate &&
mode->spec.refresh_rate_mode > best_mode->spec.refresh_rate_mode)
{
best_mode = mode;
continue;
}
}
return best_mode;
@ -1711,6 +1742,8 @@ meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec,
monitor_mode_spec->height == other_monitor_mode_spec->height &&
ABS (monitor_mode_spec->refresh_rate -
other_monitor_mode_spec->refresh_rate) < MAXIMUM_REFRESH_RATE_DIFF &&
monitor_mode_spec->refresh_rate_mode ==
other_monitor_mode_spec->refresh_rate_mode &&
monitor_mode_spec->flags == other_monitor_mode_spec->flags);
}
@ -2119,6 +2152,12 @@ meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode)
return monitor_mode->spec.refresh_rate;
}
MetaCrtcRefreshRateMode
meta_monitor_mode_get_refresh_rate_mode (MetaMonitorMode *monitor_mode)
{
return monitor_mode->spec.refresh_rate_mode;
}
MetaCrtcModeFlag
meta_monitor_mode_get_flags (MetaMonitorMode *monitor_mode)
{

View File

@ -38,6 +38,7 @@ typedef struct _MetaMonitorModeSpec
int width;
int height;
float refresh_rate;
MetaCrtcRefreshRateMode refresh_rate_mode;
MetaCrtcModeFlag flags;
} MetaMonitorModeSpec;
@ -252,6 +253,9 @@ void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
META_EXPORT_TEST
float meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode);
META_EXPORT_TEST
MetaCrtcRefreshRateMode meta_monitor_mode_get_refresh_rate_mode (MetaMonitorMode *monitor_mode);
META_EXPORT_TEST
MetaCrtcModeFlag meta_monitor_mode_get_flags (MetaMonitorMode *monitor_mode);