summaryrefslogtreecommitdiff
path: root/src/backends
diff options
context:
space:
mode:
authorJonas Ã…dahl <jadahl@gmail.com>2020-02-25 18:37:21 +0100
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2020-06-10 18:54:50 +0000
commitf71316c8508b3864876fc5ef9fb8e59a97c24f87 (patch)
tree8ffad7d406add8bc4e48bbd1abb1bbe2005394ed /src/backends
parent9186b6d6b099cf5ef5319bd3a82799751e1cc3de (diff)
downloadmutter-f71316c8508b3864876fc5ef9fb8e59a97c24f87.tar.gz
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
Diffstat (limited to 'src/backends')
-rw-r--r--src/backends/meta-logical-monitor.c3
-rw-r--r--src/backends/meta-monitor-manager-dummy.c42
-rw-r--r--src/backends/meta-monitor-manager-private.h18
-rw-r--r--src/backends/meta-monitor-manager.c16
-rw-r--r--src/backends/meta-monitor.c4
-rw-r--r--src/backends/meta-output.c63
-rw-r--r--src/backends/meta-output.h24
-rw-r--r--src/backends/native/meta-monitor-manager-kms.c37
-rw-r--r--src/backends/native/meta-output-kms.c32
-rw-r--r--src/backends/x11/meta-monitor-manager-xrandr.c28
-rw-r--r--src/backends/x11/meta-output-xrandr.c44
11 files changed, 191 insertions, 120 deletions
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c
index 77d0f15a8..52f4833fc 100644
--- a/src/backends/meta-logical-monitor.c
+++ b/src/backends/meta-logical-monitor.c
@@ -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));
}
}
diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c
index ff96df749..8b803cecc 100644
--- a/src/backends/meta-monitor-manager-dummy.c
+++ b/src/backends/meta-monitor-manager-dummy.c
@@ -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
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index a0a28b6c2..5dc752a34 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -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 */
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 060e3ed68..224239040 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -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;
}
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 92184eea7..c6817d470 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -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
diff --git a/src/backends/meta-output.c b/src/backends/meta-output.c
index 6a2ceb71f..8bd396c43 100644
--- a/src/backends/meta-output.c
+++ b/src/backends/meta-output.c
@@ -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_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)
+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
diff --git a/src/backends/meta-output.h b/src/backends/meta-output.h
index 18850baf9..86d338c06 100644
--- a/src/backends/meta-output.h
+++ b/src/backends/meta-output.h
@@ -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);
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 4d1ca7e21..469c5b6e8 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -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
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
index 3b690ec3e..170e63c79 100644
--- a/src/backends/native/meta-output-kms.c
+++ b/src/backends/native/meta-output-kms.c
@@ -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;
}
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index d06f7daff..eab5f55ec 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -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);
diff --git a/src/backends/x11/meta-output-xrandr.c b/src/backends/x11/meta-output-xrandr.c
index 264b3affd..e134a8ab7 100644
--- a/src/backends/x11/meta-output-xrandr.c
+++ b/src/backends/x11/meta-output-xrandr.c
@@ -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)
{