[mutter] crtc-mode: Move away fields from public MetaCrtcMode struct



commit 4b37c2e446f0b613927ffc87c44a67ea4bfc7445
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Thu Feb 27 00:08:58 2020 +0100

    crtc-mode: Move away fields from public MetaCrtcMode struct
    
    The ID and name are just moved into the instance private, while the rest
    is moved to a `MetaCrtcModeInfo` struct which is used during
    construction and retrieved via a getter. Opens up the possibility to
    add actual sub types.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1287

 src/backends/meta-crtc-mode.c                     | 157 +++++++++++++++++++++-
 src/backends/meta-crtc-mode.h                     |  33 ++++-
 src/backends/meta-monitor-config-manager.c        |  10 +-
 src/backends/meta-monitor-manager-dummy.c         |  23 ++--
 src/backends/meta-monitor-manager.c               |  12 +-
 src/backends/meta-monitor.c                       |  39 ++++--
 src/backends/native/meta-crtc-kms.c               |  10 +-
 src/backends/native/meta-cursor-renderer-native.c |  15 ++-
 src/backends/native/meta-gpu-kms.c                |  23 +++-
 src/backends/native/meta-output-kms.c             |  35 +++--
 src/backends/native/meta-renderer-native.c        |  40 ++++--
 src/backends/x11/meta-gpu-xrandr.c                |  27 ++--
 src/backends/x11/meta-monitor-manager-xrandr.c    |  18 ++-
 src/backends/x11/meta-output-xrandr.c             |   8 +-
 src/tests/headless-start-test.c                   |  15 ++-
 src/tests/monitor-test-utils.c                    |  24 ++--
 16 files changed, 377 insertions(+), 112 deletions(-)
---
diff --git a/src/backends/meta-crtc-mode.c b/src/backends/meta-crtc-mode.c
index 85993867d6..7481457479 100644
--- a/src/backends/meta-crtc-mode.c
+++ b/src/backends/meta-crtc-mode.c
@@ -21,17 +21,142 @@
 
 #include "backends/meta-crtc-mode.h"
 
-G_DEFINE_TYPE (MetaCrtcMode, meta_crtc_mode, G_TYPE_OBJECT)
+enum
+{
+  PROP_0,
+
+  PROP_ID,
+  PROP_NAME,
+  PROP_INFO,
+
+  N_PROPS
+};
+
+static GParamSpec *obj_props[N_PROPS];
+
+typedef struct _MetaCrtcModePrivate
+{
+  uint64_t id;
+  char *name;
+  MetaCrtcModeInfo *info;
+} MetaCrtcModePrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (MetaCrtcMode, meta_crtc_mode, G_TYPE_OBJECT)
+
+G_DEFINE_BOXED_TYPE (MetaCrtcModeInfo, meta_crtc_mode_info,
+                     meta_crtc_mode_info_ref,
+                     meta_crtc_mode_info_unref)
+
+MetaCrtcModeInfo *
+meta_crtc_mode_info_new (void)
+{
+  MetaCrtcModeInfo *crtc_mode_info;
+
+  crtc_mode_info = g_new0 (MetaCrtcModeInfo, 1);
+  g_ref_count_init (&crtc_mode_info->ref_count);
+
+  return crtc_mode_info;
+}
+
+MetaCrtcModeInfo *
+meta_crtc_mode_info_ref (MetaCrtcModeInfo *crtc_mode_info)
+{
+  g_ref_count_inc (&crtc_mode_info->ref_count);
+  return crtc_mode_info;
+}
+
+void
+meta_crtc_mode_info_unref (MetaCrtcModeInfo *crtc_mode_info)
+{
+  if (g_ref_count_dec (&crtc_mode_info->ref_count))
+    g_free (crtc_mode_info);
+}
+
+uint64_t
+meta_crtc_mode_get_id (MetaCrtcMode *crtc_mode)
+{
+  MetaCrtcModePrivate *priv = meta_crtc_mode_get_instance_private (crtc_mode);
+
+  return priv->id;
+}
+
+const char *
+meta_crtc_mode_get_name (MetaCrtcMode *crtc_mode)
+{
+  MetaCrtcModePrivate *priv = meta_crtc_mode_get_instance_private (crtc_mode);
+
+  return priv->name;
+}
+
+const MetaCrtcModeInfo *
+meta_crtc_mode_get_info (MetaCrtcMode *crtc_mode)
+{
+  MetaCrtcModePrivate *priv = meta_crtc_mode_get_instance_private (crtc_mode);
+
+  return priv->info;
+}
+
+static void
+meta_crtc_mode_set_property (GObject      *object,
+                             guint         prop_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+  MetaCrtcMode *crtc_mode = META_CRTC_MODE (object);
+  MetaCrtcModePrivate *priv = meta_crtc_mode_get_instance_private (crtc_mode);
+
+  switch (prop_id)
+    {
+    case PROP_ID:
+      priv->id = g_value_get_uint64 (value);
+      break;
+    case PROP_NAME:
+      priv->name = g_value_dup_string (value);
+      break;
+    case PROP_INFO:
+      priv->info = meta_crtc_mode_info_ref (g_value_get_boxed (value));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+meta_crtc_mode_get_property (GObject    *object,
+                             guint       prop_id,
+                             GValue     *value,
+                             GParamSpec *pspec)
+{
+  MetaCrtcMode *crtc_mode = META_CRTC_MODE (object);
+  MetaCrtcModePrivate *priv = meta_crtc_mode_get_instance_private (crtc_mode);
+
+  switch (prop_id)
+    {
+    case PROP_ID:
+      g_value_set_uint64 (value, priv->id);
+      break;
+    case PROP_NAME:
+      g_value_set_string (value, priv->name);
+      break;
+    case PROP_INFO:
+      g_value_set_boxed (value, priv->info);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
 
 static void
 meta_crtc_mode_finalize (GObject *object)
 {
   MetaCrtcMode *crtc_mode = META_CRTC_MODE (object);
+  MetaCrtcModePrivate *priv = meta_crtc_mode_get_instance_private (crtc_mode);
 
   if (crtc_mode->driver_notify)
     crtc_mode->driver_notify (crtc_mode);
 
-  g_clear_pointer (&crtc_mode->name, g_free);
+  g_clear_pointer (&priv->name, g_free);
+  g_clear_pointer (&priv->info, meta_crtc_mode_info_unref);
 
   G_OBJECT_CLASS (meta_crtc_mode_parent_class)->finalize (object);
 }
@@ -46,5 +171,33 @@ meta_crtc_mode_class_init (MetaCrtcModeClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
+  object_class->set_property = meta_crtc_mode_set_property;
+  object_class->get_property = meta_crtc_mode_get_property;
   object_class->finalize = meta_crtc_mode_finalize;
+
+  obj_props[PROP_ID] =
+    g_param_spec_uint64 ("id",
+                         "id",
+                         "CRTC mode id",
+                         0, UINT64_MAX, 0,
+                         G_PARAM_READWRITE |
+                         G_PARAM_CONSTRUCT_ONLY |
+                         G_PARAM_STATIC_STRINGS);
+  obj_props[PROP_NAME] =
+    g_param_spec_string ("name",
+                         "name",
+                         "Name of CRTC mode",
+                         NULL,
+                         G_PARAM_READWRITE |
+                         G_PARAM_CONSTRUCT_ONLY |
+                         G_PARAM_STATIC_STRINGS);
+  obj_props[PROP_INFO] =
+    g_param_spec_boxed ("info",
+                        "info",
+                        "MetaOutputInfo",
+                        META_TYPE_CRTC_MODE_INFO,
+                        G_PARAM_READWRITE |
+                        G_PARAM_CONSTRUCT_ONLY |
+                        G_PARAM_STATIC_STRINGS);
+  g_object_class_install_properties (object_class, N_PROPS, obj_props);
 }
diff --git a/src/backends/meta-crtc-mode.h b/src/backends/meta-crtc-mode.h
index f5fdaa3ad3..b7165265e5 100644
--- a/src/backends/meta-crtc-mode.h
+++ b/src/backends/meta-crtc-mode.h
@@ -47,17 +47,19 @@ typedef enum _MetaCrtcModeFlag
   META_CRTC_MODE_FLAG_MASK = 0x3fff
 } MetaCrtcModeFlag;
 
-struct _MetaCrtcMode
+typedef struct _MetaCrtcModeInfo
 {
-  GObject parent;
-
-  uint64_t mode_id;
-  char *name;
+  grefcount ref_count;
 
   int width;
   int height;
   float refresh_rate;
   MetaCrtcModeFlag flags;
+} MetaCrtcModeInfo;
+
+struct _MetaCrtcMode
+{
+  GObject parent;
 
   gpointer driver_private;
   GDestroyNotify driver_notify;
@@ -69,4 +71,25 @@ G_DECLARE_FINAL_TYPE (MetaCrtcMode, meta_crtc_mode,
                       META, CRTC_MODE,
                       GObject)
 
+#define META_TYPE_CRTC_MODE_INFO (meta_crtc_mode_info_get_type ())
+GType meta_crtc_mode_info_get_type (void);
+
+META_EXPORT_TEST
+MetaCrtcModeInfo * meta_crtc_mode_info_new (void);
+
+META_EXPORT_TEST
+MetaCrtcModeInfo * meta_crtc_mode_info_ref (MetaCrtcModeInfo *crtc_mode_info);
+
+META_EXPORT_TEST
+void meta_crtc_mode_info_unref (MetaCrtcModeInfo *crtc_mode_info);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaCrtcModeInfo, meta_crtc_mode_info_unref)
+
+uint64_t meta_crtc_mode_get_id (MetaCrtcMode *crtc_mode);
+
+const char * meta_crtc_mode_get_name (MetaCrtcMode *crtc_mode);
+
+META_EXPORT_TEST
+const MetaCrtcModeInfo * meta_crtc_mode_get_info (MetaCrtcMode *crtc_mode);
+
 #endif /* META_CRTC_MODE_H */
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 55053276b7..4c5ab77e79 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -184,6 +184,7 @@ assign_monitor_crtc (MetaMonitor         *monitor,
   float scale = 0.0;
   float width, height;
   MetaCrtcMode *crtc_mode;
+  const MetaCrtcModeInfo *crtc_mode_info;
   graphene_rect_t crtc_layout;
   MetaCrtcAssignment *crtc_assignment;
   MetaOutputAssignment *output_assignment;
@@ -233,16 +234,17 @@ assign_monitor_crtc (MetaMonitor         *monitor,
     }
 
   crtc_mode = monitor_crtc_mode->crtc_mode;
+  crtc_mode_info = meta_crtc_mode_get_info (monitor_crtc_mode->crtc_mode);
 
   if (meta_monitor_transform_is_rotated (crtc_transform))
     {
-      width = crtc_mode->height / scale;
-      height = crtc_mode->width / scale;
+      width = crtc_mode_info->height / scale;
+      height = crtc_mode_info->width / scale;
     }
   else
     {
-      width = crtc_mode->width / scale;
-      height = crtc_mode->height / scale;
+      width = crtc_mode_info->width / scale;
+      height = crtc_mode_info->height / scale;
     }
 
   crtc_layout = GRAPHENE_RECT_INIT (x_offset + (crtc_x / scale),
diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c
index 7139d3180d..ca3d200a74 100644
--- a/src/backends/meta-monitor-manager-dummy.c
+++ b/src/backends/meta-monitor-manager-dummy.c
@@ -88,16 +88,17 @@ static MetaCrtcMode *
 create_mode (CrtcModeSpec *spec,
              long          mode_id)
 {
-  MetaCrtcMode *mode;
+  g_autoptr (MetaCrtcModeInfo) crtc_mode_info = NULL;
 
-  mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
+  crtc_mode_info = meta_crtc_mode_info_new ();
+  crtc_mode_info->width = spec->width;
+  crtc_mode_info->height = spec->height;
+  crtc_mode_info->refresh_rate = spec->refresh_rate;
 
-  mode->mode_id = mode_id;
-  mode->width = spec->width;
-  mode->height = spec->height;
-  mode->refresh_rate = spec->refresh_rate;
-
-  return mode;
+  return g_object_new (META_TYPE_CRTC_MODE,
+                       "id", mode_id,
+                       "info", crtc_mode_info,
+                       NULL);
 }
 
 static MetaGpu *
@@ -302,6 +303,7 @@ append_tiled_monitor (MetaMonitorManager *manager,
     {
       MetaOutputDummy *output_dummy;
       MetaCrtcMode *preferred_mode;
+      const MetaCrtcModeInfo *preferred_mode_info;
       unsigned int j;
       unsigned int number;
       g_autoptr (MetaOutputInfo) output_info = NULL;
@@ -311,6 +313,7 @@ append_tiled_monitor (MetaMonitorManager *manager,
       number = g_list_length (*outputs) + 1;
 
       preferred_mode = g_list_last (*modes)->data;
+      preferred_mode_info = meta_crtc_mode_get_info (preferred_mode);
 
       output_info = meta_output_info_new ();
 
@@ -332,8 +335,8 @@ append_tiled_monitor (MetaMonitorManager *manager,
         .max_v_tiles = 1,
         .loc_h_tile = i,
         .loc_v_tile = 0,
-        .tile_w = preferred_mode->width,
-        .tile_h = preferred_mode->height
+        .tile_w = preferred_mode_info->width,
+        .tile_h = preferred_mode_info->height
       },
 
       output_info->modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (mode_specs));
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 95bb92d838..e2d16b7d0f 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1185,14 +1185,16 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
   for (l = combined_modes, i = 0; l; l = l->next, i++)
     {
       MetaCrtcMode *mode = l->data;
+      const MetaCrtcModeInfo *crtc_mode_info =
+        meta_crtc_mode_get_info (mode);;
 
       g_variant_builder_add (&mode_builder, "(uxuudu)",
                              i, /* ID */
-                             (gint64)mode->mode_id,
-                             (guint32)mode->width,
-                             (guint32)mode->height,
-                             (double)mode->refresh_rate,
-                             (guint32)mode->flags);
+                             (int64_t) meta_crtc_mode_get_id (mode),
+                             (uint32_t) crtc_mode_info->width,
+                             (uint32_t) crtc_mode_info->height,
+                             (double) crtc_mode_info->refresh_rate,
+                             (uint32_t) crtc_mode_info->flags);
     }
 
   if (!meta_monitor_manager_get_max_screen_size (manager,
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index bade4d1665..4aaa516d7e 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -571,6 +571,8 @@ meta_monitor_create_spec (MetaMonitor  *monitor,
 {
   const MetaOutputInfo *output_info =
     meta_monitor_get_main_output_info (monitor);
+  const MetaCrtcModeInfo *crtc_mode_info =
+    meta_crtc_mode_get_info (crtc_mode);
 
   if (meta_monitor_transform_is_rotated (output_info->panel_orientation_transform))
     {
@@ -582,8 +584,8 @@ meta_monitor_create_spec (MetaMonitor  *monitor,
   return (MetaMonitorModeSpec) {
     .width = width,
     .height = height,
-    .refresh_rate = crtc_mode->refresh_rate,
-    .flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
+    .refresh_rate = crtc_mode_info->refresh_rate,
+    .flags = crtc_mode_info->flags & HANDLED_CRTC_MODE_FLAGS
   };
 }
 
@@ -595,16 +597,20 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
     meta_monitor_get_instance_private (monitor);
   MetaOutput *output;
   const MetaOutputInfo *output_info;
+  MetaCrtcMode *preferred_mode;
   MetaCrtcModeFlag preferred_mode_flags;
   unsigned int i;
 
   output = meta_monitor_get_main_output (monitor);
   output_info = meta_output_get_info (output);
-  preferred_mode_flags = output_info->preferred_mode->flags;
+  preferred_mode = output_info->preferred_mode;
+  preferred_mode_flags = meta_crtc_mode_get_info (preferred_mode)->flags;
 
   for (i = 0; i < output_info->n_modes; i++)
     {
       MetaCrtcMode *crtc_mode = output_info->modes[i];
+      const MetaCrtcModeInfo *crtc_mode_info =
+        meta_crtc_mode_get_info (crtc_mode);
       MetaCrtc *crtc;
       MetaMonitorMode *mode;
       gboolean replace;
@@ -612,8 +618,8 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
       mode = g_new0 (MetaMonitorMode, 1);
       mode->monitor = monitor;
       mode->spec = meta_monitor_create_spec (monitor,
-                                             crtc_mode->width,
-                                             crtc_mode->height,
+                                             crtc_mode_info->width,
+                                             crtc_mode_info->height,
                                              crtc_mode);
       mode->id = generate_mode_id (&mode->spec);
       mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1);
@@ -629,7 +635,7 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
        * otherwise take the first one in the list. This guarantees that the
        * preferred mode is always added.
        */
-      replace = crtc_mode->flags == preferred_mode_flags;
+      replace = crtc_mode_info->flags == preferred_mode_flags;
 
       if (!meta_monitor_add_mode (monitor, mode, replace))
         {
@@ -940,9 +946,10 @@ is_crtc_mode_tiled (MetaOutput   *output,
                     MetaCrtcMode *crtc_mode)
 {
   const MetaOutputInfo *output_info = meta_output_get_info (output);
+  const MetaCrtcModeInfo *crtc_mode_info = meta_crtc_mode_get_info (crtc_mode);
 
-  return (crtc_mode->width == (int) output_info->tile_info.tile_w &&
-          crtc_mode->height == (int) output_info->tile_info.tile_h);
+  return (crtc_mode_info->width == (int) output_info->tile_info.tile_w &&
+          crtc_mode_info->height == (int) output_info->tile_info.tile_h);
 }
 
 static MetaCrtcMode *
@@ -950,6 +957,8 @@ find_tiled_crtc_mode (MetaOutput   *output,
                       MetaCrtcMode *reference_crtc_mode)
 {
   const MetaOutputInfo *output_info = meta_output_get_info (output);
+  const MetaCrtcModeInfo *reference_crtc_mode_info =
+    meta_crtc_mode_get_info (reference_crtc_mode);
   MetaCrtcMode *crtc_mode;
   unsigned int i;
 
@@ -959,15 +968,18 @@ find_tiled_crtc_mode (MetaOutput   *output,
 
   for (i = 0; i < output_info->n_modes; i++)
     {
+      const MetaCrtcModeInfo *crtc_mode_info;
+
       crtc_mode = output_info->modes[i];
+      crtc_mode_info = meta_crtc_mode_get_info (crtc_mode);
 
       if (!is_crtc_mode_tiled (output, crtc_mode))
         continue;
 
-      if (crtc_mode->refresh_rate != reference_crtc_mode->refresh_rate)
+      if (crtc_mode_info->refresh_rate != reference_crtc_mode_info->refresh_rate)
         continue;
 
-      if (crtc_mode->flags != reference_crtc_mode->flags)
+      if (crtc_mode_info->flags != reference_crtc_mode_info->flags)
         continue;
 
       return crtc_mode;
@@ -1100,6 +1112,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
   MetaMonitorPrivate *monitor_priv =
     meta_monitor_get_instance_private (monitor);
   MetaMonitorModeTiled *mode;
+  const MetaCrtcModeInfo *crtc_mode_info;
   GList *l;
   int i;
 
@@ -1109,9 +1122,11 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
   mode = g_new0 (MetaMonitorModeTiled, 1);
   mode->is_tiled = FALSE;
   mode->parent.monitor = monitor;
+
+  crtc_mode_info = meta_crtc_mode_get_info (crtc_mode);
   mode->parent.spec = meta_monitor_create_spec (monitor,
-                                                crtc_mode->width,
-                                                crtc_mode->height,
+                                                crtc_mode_info->width,
+                                                crtc_mode_info->height,
                                                 crtc_mode);
   mode->parent.id = generate_mode_id (&mode->parent.spec);
   mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c
index 1bfd24832f..5860f42a24 100644
--- a/src/backends/native/meta-crtc-kms.c
+++ b/src/backends/native/meta-crtc-kms.c
@@ -99,6 +99,7 @@ meta_crtc_kms_assign_primary_plane (MetaCrtcKms   *crtc_kms,
 {
   MetaCrtc *crtc = META_CRTC (crtc_kms);
   const MetaCrtcConfig *crtc_config;
+  const MetaCrtcModeInfo *crtc_mode_info;
   MetaFixed16Rectangle src_rect;
   MetaFixed16Rectangle dst_rect;
   MetaKmsAssignPlaneFlag flags;
@@ -108,18 +109,19 @@ meta_crtc_kms_assign_primary_plane (MetaCrtcKms   *crtc_kms,
   MetaKmsPlaneAssignment *plane_assignment;
 
   crtc_config = meta_crtc_get_config (crtc);
+  crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
 
   src_rect = (MetaFixed16Rectangle) {
     .x = meta_fixed_16_from_int (0),
     .y = meta_fixed_16_from_int (0),
-    .width = meta_fixed_16_from_int (crtc_config->mode->width),
-    .height = meta_fixed_16_from_int (crtc_config->mode->height),
+    .width = meta_fixed_16_from_int (crtc_mode_info->width),
+    .height = meta_fixed_16_from_int (crtc_mode_info->height),
   };
   dst_rect = (MetaFixed16Rectangle) {
     .x = meta_fixed_16_from_int (0),
     .y = meta_fixed_16_from_int (0),
-    .width = meta_fixed_16_from_int (crtc_config->mode->width),
-    .height = meta_fixed_16_from_int (crtc_config->mode->height),
+    .width = meta_fixed_16_from_int (crtc_mode_info->width),
+    .height = meta_fixed_16_from_int (crtc_mode_info->height),
   };
 
   flags = META_KMS_ASSIGN_PLANE_FLAG_NONE;
diff --git a/src/backends/native/meta-cursor-renderer-native.c 
b/src/backends/native/meta-cursor-renderer-native.c
index 01c847c3a0..02bb2aaf0c 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -402,6 +402,7 @@ update_monitor_crtc_cursor (MetaMonitor         *monitor,
     meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
   MetaCrtc *crtc;
   MetaMonitorTransform transform;
+  const MetaCrtcModeInfo *crtc_mode_info;
   graphene_rect_t scaled_crtc_rect;
   float scale;
   int crtc_x, crtc_y;
@@ -420,15 +421,17 @@ update_monitor_crtc_cursor (MetaMonitor         *monitor,
                                    transform,
                                    &crtc_x, &crtc_y);
 
+  crtc_mode_info = meta_crtc_mode_get_info (monitor_crtc_mode->crtc_mode);
+
   if (meta_monitor_transform_is_rotated (transform))
     {
-      crtc_width = monitor_crtc_mode->crtc_mode->height;
-      crtc_height = monitor_crtc_mode->crtc_mode->width;
+      crtc_width = crtc_mode_info->height;
+      crtc_height = crtc_mode_info->width;
     }
   else
     {
-      crtc_width = monitor_crtc_mode->crtc_mode->width;
-      crtc_height = monitor_crtc_mode->crtc_mode->height;
+      crtc_width = crtc_mode_info->width;
+      crtc_height = crtc_mode_info->height;
     }
 
   scaled_crtc_rect = (graphene_rect_t) {
@@ -479,8 +482,8 @@ update_monitor_crtc_cursor (MetaMonitor         *monitor,
       inverted_transform = meta_monitor_transform_invert (transform);
       meta_rectangle_transform (&cursor_rect,
                                 inverted_transform,
-                                monitor_crtc_mode->crtc_mode->width,
-                                monitor_crtc_mode->crtc_mode->height,
+                                crtc_mode_info->width,
+                                crtc_mode_info->height,
                                 &cursor_rect);
 
       set_crtc_cursor (data->in_cursor_renderer_native,
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
index 43bef5ab3d..18f7d80366 100644
--- a/src/backends/native/meta-gpu-kms.c
+++ b/src/backends/native/meta-gpu-kms.c
@@ -343,15 +343,24 @@ static MetaCrtcMode *
 create_mode (const drmModeModeInfo *drm_mode,
              long                   mode_id)
 {
+  g_autoptr (MetaCrtcModeInfo) crtc_mode_info = NULL;
+  g_autofree char *crtc_mode_name = NULL;
   MetaCrtcMode *mode;
 
-  mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
-  mode->mode_id = mode_id;
-  mode->name = g_strndup (drm_mode->name, DRM_DISPLAY_MODE_LEN);
-  mode->width = drm_mode->hdisplay;
-  mode->height = drm_mode->vdisplay;
-  mode->flags = drm_mode->flags;
-  mode->refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
+  crtc_mode_info = meta_crtc_mode_info_new ();
+  crtc_mode_info->width = drm_mode->hdisplay;
+  crtc_mode_info->height = drm_mode->vdisplay;
+  crtc_mode_info->flags = drm_mode->flags;
+  crtc_mode_info->refresh_rate =
+    meta_calculate_drm_mode_refresh_rate (drm_mode);
+
+  crtc_mode_name = g_strndup (drm_mode->name, DRM_DISPLAY_MODE_LEN);
+  mode = g_object_new (META_TYPE_CRTC_MODE,
+                       "id", mode_id,
+                       "name", crtc_mode_name,
+                       "info", crtc_mode_info,
+                       NULL);
+
   mode->driver_private = g_slice_dup (drmModeModeInfo, drm_mode);
   mode->driver_notify = (GDestroyNotify) meta_crtc_mode_destroy_notify;
 
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
index d9c2a19327..6f40bed1f9 100644
--- a/src/backends/native/meta-output-kms.c
+++ b/src/backends/native/meta-output-kms.c
@@ -66,12 +66,15 @@ meta_output_kms_set_underscan (MetaOutputKms *output_kms,
     {
       MetaCrtc *crtc;
       const MetaCrtcConfig *crtc_config;
+      const MetaCrtcModeInfo *crtc_mode_info;
       uint64_t hborder, vborder;
 
       crtc = meta_output_get_assigned_crtc (output);
       crtc_config = meta_crtc_get_config (crtc);
-      hborder = MIN (128, (uint64_t) round (crtc_config->mode->width * 0.05));
-      vborder = MIN (128, (uint64_t) round (crtc_config->mode->height * 0.05));
+      crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
+
+      hborder = MIN (128, (uint64_t) round (crtc_mode_info->width * 0.05));
+      vborder = MIN (128, (uint64_t) round (crtc_mode_info->height * 0.05));
 
       g_debug ("Setting underscan of connector %s to %" G_GUINT64_FORMAT " x %" G_GUINT64_FORMAT,
                meta_kms_connector_get_name (output_kms->kms_connector),
@@ -207,17 +210,23 @@ static int
 compare_modes (const void *one,
                const void *two)
 {
-  MetaCrtcMode *a = *(MetaCrtcMode **) one;
-  MetaCrtcMode *b = *(MetaCrtcMode **) two;
-
-  if (a->width != b->width)
-    return a->width > b->width ? -1 : 1;
-  if (a->height != b->height)
-    return a->height > b->height ? -1 : 1;
-  if (a->refresh_rate != b->refresh_rate)
-    return a->refresh_rate > b->refresh_rate ? -1 : 1;
-
-  return g_strcmp0 (b->name, a->name);
+  MetaCrtcMode *crtc_mode_one = *(MetaCrtcMode **) one;
+  MetaCrtcMode *crtc_mode_two = *(MetaCrtcMode **) two;
+  const MetaCrtcModeInfo *crtc_mode_info_one =
+    meta_crtc_mode_get_info (crtc_mode_one);
+  const MetaCrtcModeInfo *crtc_mode_info_two =
+    meta_crtc_mode_get_info (crtc_mode_two);
+
+  if (crtc_mode_info_one->width != crtc_mode_info_two->width)
+    return crtc_mode_info_one->width > crtc_mode_info_two->width ? -1 : 1;
+  if (crtc_mode_info_one->height != crtc_mode_info_two->height)
+    return crtc_mode_info_one->height > crtc_mode_info_two->height ? -1 : 1;
+  if (crtc_mode_info_one->refresh_rate != crtc_mode_info_two->refresh_rate)
+    return (crtc_mode_info_one->refresh_rate > crtc_mode_info_two->refresh_rate
+            ? -1 : 1);
+
+  return g_strcmp0 (meta_crtc_mode_get_name (crtc_mode_one),
+                    meta_crtc_mode_get_name (crtc_mode_two));
 }
 
 static gboolean
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index d753134869..8ec809b9df 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1112,6 +1112,30 @@ meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
   swap_secondary_drm_fb (onscreen);
 }
 
+static void
+maybe_update_frame_info (MetaCrtc      *crtc,
+                         CoglFrameInfo *frame_info,
+                         int64_t        time_ns)
+{
+  const MetaCrtcConfig *crtc_config;
+  const MetaCrtcModeInfo *crtc_mode_info;
+  float refresh_rate;
+
+  g_return_if_fail (crtc);
+
+  crtc_config = meta_crtc_get_config (crtc);
+  if (!crtc_config)
+    return;
+
+  crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
+  refresh_rate = crtc_mode_info->refresh_rate;
+  if (refresh_rate >= frame_info->refresh_rate)
+    {
+      frame_info->presentation_time = time_ns;
+      frame_info->refresh_rate = refresh_rate;
+    }
+}
+
 static void
 notify_view_crtc_presented (MetaRendererView *view,
                             MetaKmsCrtc      *kms_crtc,
@@ -1127,8 +1151,6 @@ notify_view_crtc_presented (MetaRendererView *view,
   MetaGpuKms *render_gpu = onscreen_native->render_gpu;
   CoglFrameInfo *frame_info;
   MetaCrtc *crtc;
-  const MetaCrtcConfig *crtc_config;
-  float refresh_rate;
   MetaGpuKms *gpu_kms;
 
   /* Only keep the frame info for the fastest CRTC in use, which may not be
@@ -1139,13 +1161,7 @@ notify_view_crtc_presented (MetaRendererView *view,
   frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos);
 
   crtc = META_CRTC (meta_crtc_kms_from_kms_crtc (kms_crtc));
-  crtc_config = crtc ? meta_crtc_get_config (crtc) : NULL;
-  refresh_rate = crtc_config ? crtc_config->mode->refresh_rate : 0.0f;
-  if (refresh_rate >= frame_info->refresh_rate)
-    {
-      frame_info->presentation_time = time_ns;
-      frame_info->refresh_rate = refresh_rate;
-    }
+  maybe_update_frame_info (crtc, frame_info, time_ns);
 
   gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
   if (gpu_kms != render_gpu)
@@ -3161,6 +3177,7 @@ meta_renderer_native_create_view (MetaRenderer       *renderer,
   CoglDisplayEGL *cogl_display_egl;
   CoglOnscreenEGL *onscreen_egl;
   const MetaCrtcConfig *crtc_config;
+  const MetaCrtcModeInfo *crtc_mode_info;
   MetaMonitorTransform view_transform;
   CoglOnscreen *onscreen = NULL;
   CoglOffscreen *offscreen = NULL;
@@ -3173,8 +3190,9 @@ meta_renderer_native_create_view (MetaRenderer       *renderer,
   GError *error = NULL;
 
   crtc_config = meta_crtc_get_config (crtc);
-  onscreen_width = crtc_config->mode->width;
-  onscreen_height = crtc_config->mode->height;
+  crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
+  onscreen_width = crtc_mode_info->width;
+  onscreen_height = crtc_mode_info->height;
 
   onscreen = meta_renderer_native_create_onscreen (renderer_native,
                                                    renderer_native->primary_gpu_kms,
diff --git a/src/backends/x11/meta-gpu-xrandr.c b/src/backends/x11/meta-gpu-xrandr.c
index 3b1f41ff72..5f6bc78943 100644
--- a/src/backends/x11/meta-gpu-xrandr.c
+++ b/src/backends/x11/meta-gpu-xrandr.c
@@ -141,18 +141,23 @@ meta_gpu_xrandr_read_current (MetaGpu  *gpu,
   for (i = 0; i < (unsigned)resources->nmode; i++)
     {
       XRRModeInfo *xmode = &resources->modes[i];
+      g_autofree char *crtc_mode_name = NULL;
       MetaCrtcMode *mode;
-
-      mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
-
-      mode->mode_id = xmode->id;
-      mode->width = xmode->width;
-      mode->height = xmode->height;
-      mode->refresh_rate = (xmode->dotClock /
-                            ((float)xmode->hTotal * xmode->vTotal));
-      mode->flags = xmode->modeFlags;
-      mode->name = get_xmode_name (xmode);
-
+      g_autoptr (MetaCrtcModeInfo) crtc_mode_info = NULL;
+
+      crtc_mode_info = meta_crtc_mode_info_new ();
+      crtc_mode_info->width = xmode->width;
+      crtc_mode_info->height = xmode->height;
+      crtc_mode_info->refresh_rate = (xmode->dotClock /
+                                      ((float)xmode->hTotal * xmode->vTotal));
+      crtc_mode_info->flags = xmode->modeFlags;
+
+      crtc_mode_name = get_xmode_name (xmode);
+      mode = g_object_new (META_TYPE_CRTC_MODE,
+                           "id", xmode->id,
+                           "name", crtc_mode_name,
+                           "info", crtc_mode_info,
+                           NULL);
       modes = g_list_append (modes, mode);
     }
   meta_gpu_take_modes (gpu, modes);
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index 5eb933f018..946a22123f 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -475,14 +475,15 @@ apply_crtc_assignments (MetaMonitorManager    *manager,
 
       if (crtc_assignment->mode != NULL)
         {
-          MetaCrtcMode *mode;
+          MetaCrtcMode *crtc_mode;
           g_autofree xcb_randr_output_t *output_ids = NULL;
           unsigned int j, n_output_ids;
           xcb_randr_crtc_t crtc_id;
           int x, y;
           xcb_randr_rotation_t rotation;
+          xcb_randr_mode_t mode;
 
-          mode = crtc_assignment->mode;
+          crtc_mode = crtc_assignment->mode;
 
           n_output_ids = crtc_assignment->outputs->len;
           output_ids = g_new (xcb_randr_output_t, n_output_ids);
@@ -510,20 +511,25 @@ apply_crtc_assignments (MetaMonitorManager    *manager,
           y = (int) roundf (crtc_assignment->layout.origin.y);
           rotation =
             meta_monitor_transform_to_xrandr (crtc_assignment->transform);
+          mode =  meta_crtc_mode_get_id (crtc_mode);
           if (!xrandr_set_crtc_config (manager_xrandr,
                                        crtc,
                                        save_timestamp,
                                        crtc_id,
                                        XCB_CURRENT_TIME,
                                        x, y,
-                                       (xcb_randr_mode_t) mode->mode_id,
+                                       mode,
                                        rotation,
                                        output_ids, n_output_ids))
             {
+              const MetaCrtcModeInfo *crtc_mode_info =
+                meta_crtc_mode_get_info (crtc_mode);
+
               meta_warning ("Configuring CRTC %d with mode %d (%d x %d @ %f) at position %d, %d and 
transform %u failed\n",
                             (unsigned) meta_crtc_get_id (crtc),
-                            (unsigned) mode->mode_id,
-                            mode->width, mode->height, (float)mode->refresh_rate,
+                            (unsigned) mode,
+                            crtc_mode_info->width, crtc_mode_info->height,
+                            (float) crtc_mode_info->refresh_rate,
                             (int) roundf (crtc_assignment->layout.origin.x),
                             (int) roundf (crtc_assignment->layout.origin.y),
                             crtc_assignment->transform);
@@ -532,7 +538,7 @@ apply_crtc_assignments (MetaMonitorManager    *manager,
 
           meta_crtc_set_config (crtc,
                                 &crtc_assignment->layout,
-                                mode,
+                                crtc_mode,
                                 crtc_assignment->transform);
         }
     }
diff --git a/src/backends/x11/meta-output-xrandr.c b/src/backends/x11/meta-output-xrandr.c
index 5bf6581293..49fa838db4 100644
--- a/src/backends/x11/meta-output-xrandr.c
+++ b/src/backends/x11/meta-output-xrandr.c
@@ -114,13 +114,15 @@ output_set_underscanning_xrandr (MetaOutput *output,
     {
       MetaCrtc *crtc;
       const MetaCrtcConfig *crtc_config;
+      const MetaCrtcModeInfo *crtc_mode_info;
       uint32_t border_value;
 
       crtc = meta_output_get_assigned_crtc (output);
       crtc_config = meta_crtc_get_config (crtc);
+      crtc_mode_info = meta_crtc_mode_get_info (crtc_config->mode);
 
       prop = XInternAtom (xdisplay, "underscan hborder", False);
-      border_value = crtc_config->mode->width * 0.05;
+      border_value = crtc_mode_info->width * 0.05;
 
       xcb_randr_change_output_property (XGetXCBConnection (xdisplay),
                                         (XID) meta_output_get_id (output),
@@ -129,7 +131,7 @@ output_set_underscanning_xrandr (MetaOutput *output,
                                         1, &border_value);
 
       prop = XInternAtom (xdisplay, "underscan vborder", False);
-      border_value = crtc_config->mode->height * 0.05;
+      border_value = crtc_mode_info->height * 0.05;
 
       xcb_randr_change_output_property (XGetXCBConnection (xdisplay),
                                         (XID) meta_output_get_id (output),
@@ -736,7 +738,7 @@ output_info_init_modes (MetaOutputInfo *output_info,
         {
           MetaCrtcMode *mode = l->data;
 
-          if (xrandr_output->modes[i] == (XID) mode->mode_id)
+          if (xrandr_output->modes[i] == (XID) meta_crtc_mode_get_id (mode))
             {
               output_info->modes[n_actual_modes] = mode;
               n_actual_modes += 1;
diff --git a/src/tests/headless-start-test.c b/src/tests/headless-start-test.c
index 8cd63bc3ab..075b9b8095 100644
--- a/src/tests/headless-start-test.c
+++ b/src/tests/headless-start-test.c
@@ -119,6 +119,7 @@ meta_test_headless_monitor_connect (void)
     META_MONITOR_MANAGER_TEST (monitor_manager);
   MetaMonitorTestSetup *test_setup;
   MetaCrtcMode **modes;
+  g_autoptr (MetaCrtcModeInfo) crtc_mode_info = NULL;
   MetaCrtcMode *crtc_mode;
   MetaGpu *gpu;
   MetaCrtc *crtc;
@@ -130,11 +131,15 @@ meta_test_headless_monitor_connect (void)
 
   test_setup = g_new0 (MetaMonitorTestSetup, 1);
 
-  crtc_mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
-  crtc_mode->mode_id = 1;
-  crtc_mode->width = 1024;
-  crtc_mode->height = 768;
-  crtc_mode->refresh_rate = 60.0;
+  crtc_mode_info = meta_crtc_mode_info_new ();
+  crtc_mode_info->width = 1024;
+  crtc_mode_info->height = 768;
+  crtc_mode_info->refresh_rate = 60.0;
+
+  crtc_mode = g_object_new (META_TYPE_CRTC_MODE,
+                            "id", 1,
+                            "info", crtc_mode_info,
+                            NULL);
   test_setup->modes = g_list_append (NULL, crtc_mode);
 
   gpu = META_GPU (meta_backend_get_gpus (meta_get_backend ())->data);
diff --git a/src/tests/monitor-test-utils.c b/src/tests/monitor-test-utils.c
index 710a11e77c..3752a65378 100644
--- a/src/tests/monitor-test-utils.c
+++ b/src/tests/monitor-test-utils.c
@@ -148,14 +148,17 @@ check_monitor_mode (MetaMonitor         *monitor,
 
   if (crtc_mode)
     {
+      const MetaCrtcModeInfo *crtc_mode_info =
+        meta_crtc_mode_get_info (crtc_mode);
       float refresh_rate;
       MetaCrtcModeFlag flags;
 
       refresh_rate = meta_monitor_mode_get_refresh_rate (mode);
       flags = meta_monitor_mode_get_flags (mode);
 
-      g_assert_cmpfloat (refresh_rate, ==, crtc_mode->refresh_rate);
-      g_assert_cmpint (flags, ==, (crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS));
+      g_assert_cmpfloat (refresh_rate, ==, crtc_mode_info->refresh_rate);
+      g_assert_cmpint (flags, ==, (crtc_mode_info->flags &
+                                   HANDLED_CRTC_MODE_FLAGS));
     }
 
   data->expect_crtc_mode_iter++;
@@ -543,14 +546,19 @@ create_monitor_test_setup (MonitorTestCaseSetup *setup,
   test_setup->modes = NULL;
   for (i = 0; i < setup->n_modes; i++)
     {
+      g_autoptr (MetaCrtcModeInfo) crtc_mode_info = NULL;
       MetaCrtcMode *mode;
 
-      mode = g_object_new (META_TYPE_CRTC_MODE, NULL);
-      mode->mode_id = i;
-      mode->width = setup->modes[i].width;
-      mode->height = setup->modes[i].height;
-      mode->refresh_rate = setup->modes[i].refresh_rate;
-      mode->flags = setup->modes[i].flags;
+      crtc_mode_info = meta_crtc_mode_info_new ();
+      crtc_mode_info->width = setup->modes[i].width;
+      crtc_mode_info->height = setup->modes[i].height;
+      crtc_mode_info->refresh_rate = setup->modes[i].refresh_rate;
+      crtc_mode_info->flags = setup->modes[i].flags;
+
+      mode = g_object_new (META_TYPE_CRTC_MODE,
+                           "id", i,
+                           "info", crtc_mode_info,
+                           NULL);
 
       test_setup->modes = g_list_append (test_setup->modes, mode);
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]