monitor-tiled: Generate non-tiled monitor modes
Add support for non-tiled monitor modes on tiled monitors. This is done by adding all the other supported modes, except the modes with the same resolution as the tile dimensions. https://bugzilla.gnome.org/show_bug.cgi?id=779745
This commit is contained in:
parent
7967ceee98
commit
df068a3649
@ -59,7 +59,8 @@ meta_logical_monitor_new (MetaMonitor *monitor,
|
|||||||
{
|
{
|
||||||
MetaOutput *output = l->data;
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
output->crtc->logical_monitor = logical_monitor;
|
if (output->crtc)
|
||||||
|
output->crtc->logical_monitor = logical_monitor;
|
||||||
|
|
||||||
is_presentation = is_presentation && output->is_presentation;
|
is_presentation = is_presentation && output->is_presentation;
|
||||||
}
|
}
|
||||||
|
@ -488,14 +488,37 @@ meta_monitor_tiled_calculate_tiled_size (MetaMonitor *monitor,
|
|||||||
*out_height = height;
|
*out_height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
|
is_monitor_mode_assigned (MetaMonitor *monitor,
|
||||||
|
MetaMonitorMode *mode)
|
||||||
|
{
|
||||||
|
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
|
||||||
|
GList *l;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (l = priv->outputs, i = 0; l; l = l->next, i++)
|
||||||
|
{
|
||||||
|
MetaOutput *output = l->data;
|
||||||
|
MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i];
|
||||||
|
|
||||||
|
if (monitor_crtc_mode->crtc_mode &&
|
||||||
|
(!output->crtc ||
|
||||||
|
output->crtc->current_mode != monitor_crtc_mode->crtc_mode))
|
||||||
|
return FALSE;
|
||||||
|
else if (!monitor_crtc_mode->crtc_mode && output->crtc)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaMonitorMode *
|
||||||
|
create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
|
||||||
{
|
{
|
||||||
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||||
MetaMonitorPrivate *monitor_priv =
|
MetaMonitorPrivate *monitor_priv =
|
||||||
meta_monitor_get_instance_private (monitor);
|
meta_monitor_get_instance_private (monitor);
|
||||||
MetaMonitorMode *mode;
|
MetaMonitorMode *mode;
|
||||||
gboolean preferred_mode_is_current;
|
|
||||||
GList *l;
|
GList *l;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -503,9 +526,8 @@ meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
|
|||||||
meta_monitor_tiled_calculate_tiled_size (monitor,
|
meta_monitor_tiled_calculate_tiled_size (monitor,
|
||||||
&mode->spec.width,
|
&mode->spec.width,
|
||||||
&mode->spec.height);
|
&mode->spec.height);
|
||||||
mode->crtc_modes = g_new (MetaMonitorCrtcMode,
|
mode->crtc_modes = g_new0 (MetaMonitorCrtcMode,
|
||||||
g_list_length (monitor_priv->outputs));
|
g_list_length (monitor_priv->outputs));
|
||||||
preferred_mode_is_current = TRUE;
|
|
||||||
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
|
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
|
||||||
{
|
{
|
||||||
MetaOutput *output = l->data;
|
MetaOutput *output = l->data;
|
||||||
@ -527,19 +549,103 @@ meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
|
|||||||
preferred_crtc_mode->refresh_rate));
|
preferred_crtc_mode->refresh_rate));
|
||||||
|
|
||||||
mode->spec.refresh_rate = preferred_crtc_mode->refresh_rate;
|
mode->spec.refresh_rate = preferred_crtc_mode->refresh_rate;
|
||||||
|
|
||||||
if (!output->crtc ||
|
|
||||||
mode->crtc_modes[i].crtc_mode != output->crtc->current_mode)
|
|
||||||
preferred_mode_is_current = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaMonitorMode *
|
||||||
|
create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||||
|
MetaOutput *main_output,
|
||||||
|
MetaCrtcMode *crtc_mode)
|
||||||
|
{
|
||||||
|
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||||
|
MetaMonitorPrivate *monitor_priv =
|
||||||
|
meta_monitor_get_instance_private (monitor);
|
||||||
|
MetaMonitorMode *mode;
|
||||||
|
GList *l;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assume modes with a resolution identical to the tile sizes are tiled
|
||||||
|
* modes.
|
||||||
|
*/
|
||||||
|
if (crtc_mode->width == (int) main_output->tile_info.tile_w &&
|
||||||
|
crtc_mode->height == (int) main_output->tile_info.tile_h)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
mode = g_new0 (MetaMonitorMode, 1);
|
||||||
|
|
||||||
|
mode->spec = (MetaMonitorModeSpec) {
|
||||||
|
.width = crtc_mode->width,
|
||||||
|
.height = crtc_mode->height,
|
||||||
|
.refresh_rate = crtc_mode->refresh_rate
|
||||||
|
};
|
||||||
|
mode->crtc_modes = g_new0 (MetaMonitorCrtcMode,
|
||||||
|
g_list_length (monitor_priv->outputs));
|
||||||
|
|
||||||
|
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
|
||||||
|
{
|
||||||
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
|
if (output == main_output)
|
||||||
|
{
|
||||||
|
mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
|
||||||
|
.x = 0,
|
||||||
|
.y = 0,
|
||||||
|
.output = output,
|
||||||
|
.crtc_mode = crtc_mode
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
|
||||||
|
.output = output,
|
||||||
|
.crtc_mode = NULL
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
|
||||||
|
{
|
||||||
|
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||||
|
MetaMonitorPrivate *monitor_priv =
|
||||||
|
meta_monitor_get_instance_private (monitor);
|
||||||
|
MetaMonitorMode *mode;
|
||||||
|
MetaOutput *main_output;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
mode = create_tiled_monitor_mode (monitor_tiled);
|
||||||
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
|
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
|
||||||
|
|
||||||
monitor_priv->preferred_mode = mode;
|
monitor_priv->preferred_mode = mode;
|
||||||
|
|
||||||
if (preferred_mode_is_current)
|
if (is_monitor_mode_assigned (monitor, mode))
|
||||||
monitor_priv->current_mode = mode;
|
monitor_priv->current_mode = mode;
|
||||||
|
|
||||||
/* TODO: Add single tile modes */
|
main_output = meta_monitor_get_main_output (monitor);
|
||||||
|
for (i = 0; i < main_output->n_modes; i++)
|
||||||
|
{
|
||||||
|
MetaCrtcMode *crtc_mode = main_output->modes[i];
|
||||||
|
|
||||||
|
mode = create_untiled_monitor_mode (monitor_tiled,
|
||||||
|
main_output,
|
||||||
|
crtc_mode);
|
||||||
|
if (mode)
|
||||||
|
{
|
||||||
|
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
|
||||||
|
|
||||||
|
if (is_monitor_mode_assigned (monitor, mode))
|
||||||
|
{
|
||||||
|
g_assert (!monitor_priv->current_mode);
|
||||||
|
monitor_priv->current_mode = mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaMonitorTiled *
|
MetaMonitorTiled *
|
||||||
@ -685,27 +791,6 @@ meta_monitor_get_current_mode (MetaMonitor *monitor)
|
|||||||
return priv->current_mode;
|
return priv->current_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
is_monitor_mode_assigned (MetaMonitor *monitor,
|
|
||||||
MetaMonitorMode *mode)
|
|
||||||
{
|
|
||||||
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
|
|
||||||
GList *l;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (l = priv->outputs, i = 0; l; l = l->next, i++)
|
|
||||||
{
|
|
||||||
MetaOutput *output = l->data;
|
|
||||||
MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i];
|
|
||||||
|
|
||||||
if (!output->crtc ||
|
|
||||||
output->crtc->current_mode != monitor_crtc_mode->crtc_mode)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_derive_current_mode (MetaMonitor *monitor)
|
meta_monitor_derive_current_mode (MetaMonitor *monitor)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user