output: Move configureable state to instance private

That is is_presentation, is_primary, is_underscanning and backlight.

The first three are set during CRTC assignment as they are only valid
when active. The other is set separately, as it is untied to
monitor configuration.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1287
This commit is contained in:
Jonas Ådahl 2020-02-25 18:37:21 +01:00 committed by Georges Basile Stavracas Neto
parent 9186b6d6b0
commit f71316c850
13 changed files with 215 additions and 155 deletions

View File

@ -178,7 +178,8 @@ meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor,
{
MetaOutput *output = l_output->data;
is_presentation = is_presentation && output->is_presentation;
is_presentation = (is_presentation &&
meta_output_is_presentation (output));
}
}

View File

@ -228,7 +228,6 @@ append_monitor (MetaMonitorManager *manager,
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
output->preferred_mode = g_list_last (*modes)->data;
output->n_possible_clones = 0;
output->backlight = -1;
output->connector_type = META_CONNECTOR_TYPE_LVDS;
output->driver_private = output_dummy;
output->driver_notify =
@ -336,7 +335,6 @@ append_tiled_monitor (MetaMonitorManager *manager,
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
output->preferred_mode = preferred_mode;
output->n_possible_clones = 0;
output->backlight = -1;
output->connector_type = META_CONNECTOR_TYPE_LVDS;
output->tile_info = (MetaTileInfo) {
.group_id = tile_group_id,
@ -508,7 +506,6 @@ apply_crtc_assignments (MetaMonitorManager *manager,
{
g_autoptr (GList) to_configure_outputs = NULL;
g_autoptr (GList) to_configure_crtcs = NULL;
GList *l;
unsigned i;
to_configure_outputs = g_list_copy (meta_gpu_get_outputs (get_gpu (manager)));
@ -527,7 +524,6 @@ apply_crtc_assignments (MetaMonitorManager *manager,
}
else
{
MetaOutput *output;
unsigned int j;
meta_crtc_set_config (crtc,
@ -537,40 +533,26 @@ apply_crtc_assignments (MetaMonitorManager *manager,
for (j = 0; j < crtc_info->outputs->len; j++)
{
MetaOutput *output;
MetaOutputInfo *output_info;
output = ((MetaOutput**)crtc_info->outputs->pdata)[j];
to_configure_outputs = g_list_remove (to_configure_outputs,
output);
meta_output_assign_crtc (output, crtc);
output_info = meta_find_output_info (outputs, n_outputs, output);
meta_output_assign_crtc (output, crtc, output_info);
}
}
}
for (i = 0; i < n_outputs; i++)
{
MetaOutputInfo *output_info = outputs[i];
MetaOutput *output = output_info->output;
output->is_primary = output_info->is_primary;
output->is_presentation = output_info->is_presentation;
}
/* Disable CRTCs not mentioned in the list */
for (l = to_configure_crtcs; l; l = l->next)
{
MetaCrtc *crtc = l->data;
meta_crtc_unset_config (crtc);
}
/* Disable outputs not mentioned in the list */
for (l = to_configure_outputs; l; l = l->next)
{
MetaOutput *output = l->data;
meta_output_unassign_crtc (output);
output->is_primary = FALSE;
}
g_list_foreach (to_configure_crtcs,
(GFunc) meta_crtc_unset_config,
NULL);
g_list_foreach (to_configure_outputs,
(GFunc) meta_output_unassign_crtc,
NULL);
}
static void

View File

@ -387,4 +387,22 @@ gboolean meta_monitor_has_aspect_as_size (MetaMonitor *monitor);
char * meta_monitor_manager_get_vendor_name (MetaMonitorManager *manager,
const char *vendor);
static inline MetaOutputInfo *
meta_find_output_info (MetaOutputInfo **outputs,
unsigned int n_outputs,
MetaOutput *output)
{
unsigned int i;
for (i = 0; i < n_outputs; i++)
{
MetaOutputInfo *output_info = outputs[i];
if (output == output_info->output)
return output_info;
}
return NULL;
}
#endif /* META_MONITOR_MANAGER_PRIVATE_H */

View File

@ -1107,18 +1107,18 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_builder_add (&properties, "{sv}", "display-name",
g_variant_new_string (output->name));
g_variant_builder_add (&properties, "{sv}", "backlight",
g_variant_new_int32 (output->backlight));
g_variant_new_int32 (meta_output_get_backlight (output)));
g_variant_builder_add (&properties, "{sv}", "min-backlight-step",
g_variant_new_int32 ((output->backlight_max - output->backlight_min) ?
100 / (output->backlight_max - output->backlight_min) : -1));
g_variant_builder_add (&properties, "{sv}", "primary",
g_variant_new_boolean (output->is_primary));
g_variant_new_boolean (meta_output_is_primary (output)));
g_variant_builder_add (&properties, "{sv}", "presentation",
g_variant_new_boolean (output->is_presentation));
g_variant_new_boolean (meta_output_is_presentation (output)));
g_variant_builder_add (&properties, "{sv}", "connector-type",
g_variant_new_string (get_connector_type_name (output->connector_type)));
g_variant_builder_add (&properties, "{sv}", "underscanning",
g_variant_new_boolean (output->is_underscanning));
g_variant_new_boolean (meta_output_is_underscanning (output)));
g_variant_builder_add (&properties, "{sv}", "supports-underscanning",
g_variant_new_boolean (output->supports_underscanning));
@ -2103,6 +2103,7 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
{
GList *combined_outputs;
MetaOutput *output;
int new_backlight;
if (serial != manager->serial)
{
@ -2133,7 +2134,7 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
return TRUE;
}
if (output->backlight == -1 ||
if (meta_output_get_backlight (output) == -1 ||
(output->backlight_min == 0 && output->backlight_max == 0))
{
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
@ -2144,7 +2145,10 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
META_MONITOR_MANAGER_GET_CLASS (manager)->change_backlight (manager, output, value);
meta_dbus_display_config_complete_change_backlight (skeleton, invocation, output->backlight);
new_backlight = meta_output_get_backlight (output);
meta_dbus_display_config_complete_change_backlight (skeleton,
invocation,
new_backlight);
return TRUE;
}

View File

@ -316,7 +316,7 @@ meta_monitor_is_primary (MetaMonitor *monitor)
output = meta_monitor_get_main_output (monitor);
return output->is_primary;
return meta_output_is_primary (output);
}
gboolean
@ -336,7 +336,7 @@ meta_monitor_is_underscanning (MetaMonitor *monitor)
output = meta_monitor_get_main_output (monitor);
return output->is_underscanning;
return meta_output_is_underscanning (output);
}
gboolean

View File

@ -41,6 +41,13 @@ typedef struct _MetaOutputPrivate
/* The CRTC driving this output, NULL if the output is not enabled */
MetaCrtc *crtc;
gboolean is_primary;
gboolean is_presentation;
gboolean is_underscanning;
int backlight;
} MetaOutputPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaOutput, meta_output, G_TYPE_OBJECT)
@ -67,15 +74,61 @@ meta_output_get_name (MetaOutput *output)
return output->name;
}
gboolean
meta_output_is_primary (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
return priv->is_primary;
}
gboolean
meta_output_is_presentation (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
return priv->is_presentation;
}
gboolean
meta_output_is_underscanning (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
return priv->is_underscanning;
}
void
meta_output_assign_crtc (MetaOutput *output,
MetaCrtc *crtc)
meta_output_set_backlight (MetaOutput *output,
int backlight)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
priv->backlight = backlight;
}
int
meta_output_get_backlight (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
return priv->backlight;
}
void
meta_output_assign_crtc (MetaOutput *output,
MetaCrtc *crtc,
const MetaOutputInfo *output_info)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
g_assert (crtc);
g_set_object (&priv->crtc, crtc);
priv->is_primary = output_info->is_primary;
priv->is_presentation = output_info->is_presentation;
priv->is_underscanning = output_info->is_underscanning;
}
void
@ -84,6 +137,9 @@ meta_output_unassign_crtc (MetaOutput *output)
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
g_clear_object (&priv->crtc);
priv->is_primary = FALSE;
priv->is_presentation = FALSE;
}
MetaCrtc *
@ -194,6 +250,9 @@ meta_output_finalize (GObject *object)
static void
meta_output_init (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
priv->backlight = -1;
}
static void

View File

@ -85,14 +85,9 @@ struct _MetaOutput
MetaOutput **possible_clones;
unsigned int n_possible_clones;
int backlight;
int backlight_min;
int backlight_max;
gboolean is_primary;
gboolean is_presentation;
gboolean is_underscanning;
gboolean supports_underscanning;
gpointer driver_private;
@ -121,8 +116,23 @@ MetaGpu * meta_output_get_gpu (MetaOutput *output);
const char * meta_output_get_name (MetaOutput *output);
META_EXPORT_TEST
void meta_output_assign_crtc (MetaOutput *output,
MetaCrtc *crtc);
gboolean meta_output_is_primary (MetaOutput *output);
META_EXPORT_TEST
gboolean meta_output_is_presentation (MetaOutput *output);
META_EXPORT_TEST
gboolean meta_output_is_underscanning (MetaOutput *output);
void meta_output_set_backlight (MetaOutput *output,
int backlight);
int meta_output_get_backlight (MetaOutput *output);
META_EXPORT_TEST
void meta_output_assign_crtc (MetaOutput *output,
MetaCrtc *crtc,
const MetaOutputInfo *output_info);
META_EXPORT_TEST
void meta_output_unassign_crtc (MetaOutput *output);

View File

@ -219,40 +219,23 @@ apply_crtc_assignments (MetaMonitorManager *manager,
for (j = 0; j < crtc_info->outputs->len; j++)
{
MetaOutput *output = g_ptr_array_index (crtc_info->outputs, j);
MetaOutputInfo *output_info;
to_configure_outputs = g_list_remove (to_configure_outputs,
output);
meta_output_assign_crtc (output, crtc);
output_info = meta_find_output_info (outputs, n_outputs, output);
meta_output_assign_crtc (output, crtc, output_info);
}
}
}
/* Disable CRTCs yet to be configured. */
for (l = to_configure_crtcs; l; l = l->next)
{
MetaCrtc *crtc = l->data;
meta_crtc_unset_config (crtc);
}
for (i = 0; i < n_outputs; i++)
{
MetaOutputInfo *output_info = outputs[i];
MetaOutput *output = output_info->output;
output->is_primary = output_info->is_primary;
output->is_presentation = output_info->is_presentation;
output->is_underscanning = output_info->is_underscanning;
}
/* Disable outputs yet to be configured. */
for (l = to_configure_outputs; l; l = l->next)
{
MetaOutput *output = l->data;
meta_output_unassign_crtc (output);
output->is_primary = FALSE;
}
g_list_foreach (to_configure_crtcs,
(GFunc) meta_crtc_unset_config,
NULL);
g_list_foreach (to_configure_outputs,
(GFunc) meta_output_unassign_crtc,
NULL);
}
static void

View File

@ -61,7 +61,7 @@ meta_output_kms_set_underscan (MetaOutput *output,
if (!output->supports_underscanning)
return;
if (output->is_underscanning)
if (meta_output_is_underscanning (output))
{
MetaCrtc *crtc;
MetaCrtcConfig *crtc_config;
@ -363,7 +363,23 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
if (meta_crtc_get_id (crtc) == connector_state->current_crtc_id)
{
meta_output_assign_crtc (output, crtc);
MetaOutputInfo output_info;
if (old_output)
{
output_info = (MetaOutputInfo) {
.is_primary = meta_output_is_primary (old_output),
.is_presentation = meta_output_is_presentation (old_output),
};
}
else
{
output_info = (MetaOutputInfo) {
.is_primary = FALSE,
.is_presentation = FALSE,
};
}
meta_output_assign_crtc (output, crtc, &output_info);
break;
}
}
@ -373,17 +389,6 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
meta_output_unassign_crtc (output);
}
if (old_output)
{
output->is_primary = old_output->is_primary;
output->is_presentation = old_output->is_presentation;
}
else
{
output->is_primary = FALSE;
output->is_presentation = FALSE;
}
output->suggested_x = connector_state->suggested_x;
output->suggested_y = connector_state->suggested_y;
output->hotplug_mode_update = connector_state->hotplug_mode_update;
@ -407,7 +412,6 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
*/
output->backlight_min = 0;
output->backlight_max = 0;
output->backlight = -1;
return output;
}

View File

@ -278,13 +278,15 @@ is_output_assignment_changed (MetaOutput *output,
if (output_info->output != output)
continue;
if (output->is_primary != output_info->is_primary)
if (meta_output_is_primary (output) != output_info->is_primary)
return TRUE;
if (output->is_presentation != output_info->is_presentation)
if (meta_output_is_presentation (output) !=
output_info->is_presentation)
return TRUE;
if (output->is_underscanning != output_info->is_underscanning)
if (meta_output_is_underscanning (output) !=
output_info->is_underscanning)
return TRUE;
output_is_found = TRUE;
@ -484,12 +486,15 @@ apply_crtc_assignments (MetaMonitorManager *manager,
for (j = 0; j < n_output_ids; j++)
{
MetaOutput *output;
MetaOutputInfo *output_info;
output = ((MetaOutput**)crtc_info->outputs->pdata)[j];
to_configure_outputs = g_list_remove (to_configure_outputs,
output);
meta_output_assign_crtc (output, crtc);
output_info = meta_find_output_info (outputs, n_outputs, output);
meta_output_assign_crtc (output, crtc, output_info);
output_ids[j] = meta_output_get_id (output);
}
@ -528,21 +533,12 @@ apply_crtc_assignments (MetaMonitorManager *manager,
MetaOutputInfo *output_info = outputs[i];
MetaOutput *output = output_info->output;
output->is_primary = output_info->is_primary;
output->is_presentation = output_info->is_presentation;
output->is_underscanning = output_info->is_underscanning;
meta_output_xrandr_apply_mode (output);
}
/* Disable outputs not mentioned in the list */
for (l = to_configure_outputs; l; l = l->next)
{
MetaOutput *output = l->data;
meta_output_unassign_crtc (output);
output->is_primary = FALSE;
}
g_list_foreach (to_configure_outputs,
(GFunc) meta_output_unassign_crtc,
NULL);
XUngrabServer (manager_xrandr->xdisplay);
XFlush (manager_xrandr->xdisplay);

View File

@ -132,16 +132,19 @@ meta_output_xrandr_apply_mode (MetaOutput *output)
{
Display *xdisplay = xdisplay_from_output (output);
if (output->is_primary)
if (meta_output_is_primary (output))
{
XRRSetOutputPrimary (xdisplay, DefaultRootWindow (xdisplay),
(XID) meta_output_get_id (output));
}
output_set_presentation_xrandr (output, output->is_presentation);
output_set_presentation_xrandr (output, meta_output_is_presentation (output));
if (output->supports_underscanning)
output_set_underscanning_xrandr (output, output->is_underscanning);
{
output_set_underscanning_xrandr (output,
meta_output_is_underscanning (output));
}
}
static int
@ -172,7 +175,7 @@ meta_output_xrandr_change_backlight (MetaOutput *output,
1, &hw_value);
/* We're not selecting for property notifies, so update the value immediately */
output->backlight = normalize_backlight (output, hw_value);
meta_output_set_backlight (output, normalize_backlight (output, hw_value));
}
static gboolean
@ -730,8 +733,9 @@ output_get_modes (MetaOutput *output,
}
static void
output_get_crtcs (MetaOutput *output,
XRROutputInfo *xrandr_output)
output_get_crtcs (MetaOutput *output,
XRROutputInfo *xrandr_output,
MetaCrtc **assigned_crtc)
{
MetaGpu *gpu = meta_output_get_gpu (output);
unsigned int i;
@ -764,10 +768,12 @@ output_get_crtcs (MetaOutput *output,
if ((XID) meta_crtc_get_id (crtc) == xrandr_output->crtc)
{
meta_output_assign_crtc (output, crtc);
break;
*assigned_crtc = crtc;
return;
}
}
*assigned_crtc = NULL;
}
MetaOutput *
@ -778,6 +784,7 @@ meta_create_xrandr_output (MetaGpuXrandr *gpu_xrandr,
{
MetaOutput *output;
GBytes *edid;
MetaCrtc *assigned_crtc;
unsigned int i;
output = g_object_new (META_TYPE_OUTPUT,
@ -812,7 +819,19 @@ meta_create_xrandr_output (MetaGpuXrandr *gpu_xrandr,
output_get_tile_info (output);
output_get_modes (output, xrandr_output);
output_get_crtcs (output, xrandr_output);
output_get_crtcs (output, xrandr_output, &assigned_crtc);
if (assigned_crtc)
{
MetaOutputInfo output_info;
output_info = (MetaOutputInfo) {
.is_primary = (XID) meta_output_get_id (output) == primary_output,
.is_presentation = output_get_presentation_xrandr (output),
.is_underscanning = output_get_underscanning_xrandr (output),
};
meta_output_assign_crtc (output, assigned_crtc, &output_info);
}
output->n_possible_clones = xrandr_output->nclone;
output->possible_clones = g_new0 (MetaOutput *,
@ -827,17 +846,12 @@ meta_create_xrandr_output (MetaGpuXrandr *gpu_xrandr,
output->possible_clones[i] = GINT_TO_POINTER (xrandr_output->clones[i]);
}
output->is_primary = (XID) meta_output_get_id (output) == primary_output;
output->is_presentation = output_get_presentation_xrandr (output);
output->is_underscanning = output_get_underscanning_xrandr (output);
output->supports_underscanning =
output_get_supports_underscanning_xrandr (output);
output_get_backlight_limits_xrandr (output);
if (!(output->backlight_min == 0 && output->backlight_max == 0))
output->backlight = output_get_backlight_xrandr (output);
else
output->backlight = -1;
meta_output_set_backlight (output, output_get_backlight_xrandr (output));
if (output->n_modes == 0 || output->n_possible_crtcs == 0)
{

View File

@ -125,7 +125,6 @@ apply_crtc_assignments (MetaMonitorManager *manager,
MetaGpu *gpu = meta_backend_test_get_gpu (backend_test);
g_autoptr (GList) to_configure_outputs = NULL;
g_autoptr (GList) to_configure_crtcs = NULL;
GList *l;
unsigned int i;
to_configure_outputs = g_list_copy (meta_gpu_get_outputs (gpu));
@ -144,7 +143,6 @@ apply_crtc_assignments (MetaMonitorManager *manager,
}
else
{
MetaOutput *output;
unsigned int j;
meta_crtc_set_config (crtc,
@ -154,41 +152,26 @@ apply_crtc_assignments (MetaMonitorManager *manager,
for (j = 0; j < crtc_info->outputs->len; j++)
{
MetaOutput *output;
MetaOutputInfo *output_info;
output = ((MetaOutput**)crtc_info->outputs->pdata)[j];
to_configure_outputs = g_list_remove (to_configure_outputs,
output);
meta_output_assign_crtc (output, crtc);
output_info = meta_find_output_info (outputs, n_outputs, output);
meta_output_assign_crtc (output, crtc, output_info);
}
}
}
for (i = 0; i < n_outputs; i++)
{
MetaOutputInfo *output_info = outputs[i];
MetaOutput *output = output_info->output;
output->is_primary = output_info->is_primary;
output->is_presentation = output_info->is_presentation;
output->is_underscanning = output_info->is_underscanning;
}
/* Disable CRTCs not mentioned in the list */
for (l = to_configure_crtcs; l; l = l->next)
{
MetaCrtc *crtc = l->data;
meta_crtc_unset_config (crtc);
}
/* Disable outputs not mentioned in the list */
for (l = to_configure_outputs; l; l = l->next)
{
MetaOutput *output = l->data;
meta_output_unassign_crtc (output);
output->is_primary = FALSE;
}
g_list_foreach (to_configure_crtcs,
(GFunc) meta_crtc_unset_config,
NULL);
g_list_foreach (to_configure_outputs,
(GFunc) meta_output_unassign_crtc,
NULL);
}
static void

View File

@ -285,7 +285,7 @@ check_logical_monitor (MetaMonitorManager *monitor_manager,
MetaOutput *output = l_output->data;
MetaCrtc *crtc;
if (output->is_primary)
if (meta_output_is_primary (output))
{
g_assert_null (primary_output);
primary_output = output;
@ -296,7 +296,7 @@ check_logical_monitor (MetaMonitorManager *monitor_manager,
meta_monitor_get_logical_monitor (monitor) == logical_monitor);
g_assert_cmpint (logical_monitor->is_presentation,
==,
output->is_presentation);
meta_output_is_presentation (output));
}
}
@ -370,7 +370,7 @@ check_monitor_configuration (MonitorTestCaseExpect *expect)
g_assert (output == output_from_winsys_id (backend, winsys_id));
g_assert_cmpint (expect->monitors[i].is_underscanning,
==,
output->is_underscanning);
meta_output_is_underscanning (output));
}
meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
@ -655,7 +655,15 @@ create_monitor_test_setup (MonitorTestCaseSetup *setup,
NULL);
if (crtc)
meta_output_assign_crtc (output, crtc);
{
MetaOutputInfo output_info;
output_info = (MetaOutputInfo) {
.is_underscanning = setup->outputs[i].is_underscanning,
};
meta_output_assign_crtc (output, crtc, &output_info);
}
output->name = (is_laptop_panel ? g_strdup_printf ("eDP-%d",
++n_laptop_panels)
: g_strdup_printf ("DP-%d",
@ -676,11 +684,9 @@ create_monitor_test_setup (MonitorTestCaseSetup *setup,
output->possible_crtcs = possible_crtcs;
output->n_possible_clones = 0;
output->possible_clones = NULL;
output->backlight = -1;
output->connector_type = (is_laptop_panel ? META_CONNECTOR_TYPE_eDP
: META_CONNECTOR_TYPE_DisplayPort);
output->tile_info = setup->outputs[i].tile_info;
output->is_underscanning = setup->outputs[i].is_underscanning;
output->panel_orientation_transform =
setup->outputs[i].panel_orientation_transform;
output->driver_private = output_test;