[mutter] monitor: Don't keep CRTC position in MetaMonitorCrtcMode



commit afcc1bf512c96b9d39d0db000f77728b6dab9bdd
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Mar 17 17:21:10 2017 +0800

    monitor: Don't keep CRTC position in MetaMonitorCrtcMode
    
    The CRTC position depends on the transform and how the transform is
    implemented. The function calculating the positions still doesn't
    support anything but the non-transformed case; this commit is in
    preparation of adding support for transforms.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-monitor-config-manager.c        |    8 +-
 src/backends/meta-monitor.c                       |  111 +++++++++++++++------
 src/backends/meta-monitor.h                       |   13 ++-
 src/backends/native/meta-cursor-renderer-native.c |    9 ++-
 src/tests/monitor-unit-tests.c                    |   67 +++++++++---
 5 files changed, 153 insertions(+), 55 deletions(-)
---
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 7165296..bd65625 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -117,6 +117,7 @@ assign_monitor_crtc (MetaMonitor         *monitor,
   MonitorAssignmentData *data = user_data;
   MetaOutput *output;
   MetaCrtc *crtc;
+  int crtc_x, crtc_y;
   MetaCrtcInfo *crtc_info;
   MetaOutputInfo *output_info;
   MetaMonitorConfig *first_monitor_config;
@@ -136,12 +137,15 @@ assign_monitor_crtc (MetaMonitor         *monitor,
       return FALSE;
     }
 
+  meta_monitor_calculate_crtc_pos (monitor, mode, output,
+                                   &crtc_x, &crtc_y);
+
   crtc_info = g_slice_new0 (MetaCrtcInfo);
   *crtc_info = (MetaCrtcInfo) {
     .crtc = crtc,
     .mode = monitor_crtc_mode->crtc_mode,
-    .x = monitor_crtc_mode->x,
-    .y = monitor_crtc_mode->y,
+    .x = crtc_x,
+    .y = crtc_y,
     .transform = META_MONITOR_TRANSFORM_NORMAL,
     .outputs = g_ptr_array_new ()
   };
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 9a242cd..dfc3c41 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -32,6 +32,13 @@ typedef struct _MetaMonitorMode
   MetaMonitorCrtcMode *crtc_modes;
 } MetaMonitorMode;
 
+typedef struct _MetaMonitorModeTiled
+{
+  MetaMonitorMode parent;
+
+  gboolean is_tiled;
+} MetaMonitorModeTiled;
+
 typedef struct _MetaMonitorPrivate
 {
   GList *outputs;
@@ -347,8 +354,6 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
       },
       mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1);
       mode->crtc_modes[0] = (MetaMonitorCrtcMode) {
-        .x = 0,
-        .y = 0,
         .output = output,
         .crtc_mode = crtc_mode
       };
@@ -404,6 +409,17 @@ meta_monitor_normal_derive_dimensions (MetaMonitor   *monitor,
 }
 
 static void
+meta_monitor_normal_calculate_crtc_pos (MetaMonitor         *monitor,
+                                        MetaMonitorMode     *monitor_mode,
+                                        MetaOutput          *output,
+                                        int                 *out_x,
+                                        int                 *out_y)
+{
+  *out_x = 0;
+  *out_y = 0;
+}
+
+static void
 meta_monitor_normal_init (MetaMonitorNormal *monitor)
 {
 }
@@ -415,6 +431,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
 
   monitor_class->get_main_output = meta_monitor_normal_get_main_output;
   monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
+  monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
 }
 
 uint32_t
@@ -463,10 +480,10 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
 }
 
 static void
-calculate_tile_coordinate (MetaMonitor *monitor,
-                           MetaOutput  *output,
-                           int         *out_x,
-                           int         *out_y)
+calculate_tile_coordinate (MetaMonitor         *monitor,
+                           MetaOutput          *output,
+                           int                 *out_x,
+                           int                 *out_y)
 {
   MetaMonitorPrivate *monitor_priv =
     meta_monitor_get_instance_private (monitor);
@@ -548,40 +565,35 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
   MetaMonitor *monitor = META_MONITOR (monitor_tiled);
   MetaMonitorPrivate *monitor_priv =
     meta_monitor_get_instance_private (monitor);
-  MetaMonitorMode *mode;
+  MetaMonitorModeTiled *mode;
   GList *l;
   int i;
 
-  mode = g_new0 (MetaMonitorMode, 1);
+  mode = g_new0 (MetaMonitorModeTiled, 1);
+  mode->is_tiled = TRUE;
   meta_monitor_tiled_calculate_tiled_size (monitor,
-                                           &mode->spec.width,
-                                           &mode->spec.height);
-  mode->crtc_modes = g_new0 (MetaMonitorCrtcMode,
-                             g_list_length (monitor_priv->outputs));
+                                           &mode->parent.spec.width,
+                                           &mode->parent.spec.height);
+  mode->parent.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;
       MetaCrtcMode *preferred_crtc_mode = output->preferred_mode;
-      int x;
-      int y;
 
-      calculate_tile_coordinate (monitor, output, &x, &y);
-
-      mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
-        .x = x,
-        .y = y,
+      mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
         .output = output,
         .crtc_mode = preferred_crtc_mode
       };
 
-      g_warn_if_fail (mode->spec.refresh_rate == 0.0f ||
-                      (mode->spec.refresh_rate ==
+      g_warn_if_fail (mode->parent.spec.refresh_rate == 0.0f ||
+                      (mode->parent.spec.refresh_rate ==
                        preferred_crtc_mode->refresh_rate));
 
-      mode->spec.refresh_rate = preferred_crtc_mode->refresh_rate;
+      mode->parent.spec.refresh_rate = preferred_crtc_mode->refresh_rate;
     }
 
-  return mode;
+  return &mode->parent;
 }
 
 static MetaMonitorMode *
@@ -592,7 +604,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
   MetaMonitor *monitor = META_MONITOR (monitor_tiled);
   MetaMonitorPrivate *monitor_priv =
     meta_monitor_get_instance_private (monitor);
-  MetaMonitorMode *mode;
+  MetaMonitorModeTiled *mode;
   GList *l;
   int i;
 
@@ -604,14 +616,15 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
       crtc_mode->height == (int) main_output->tile_info.tile_h)
     return NULL;
 
-  mode = g_new0 (MetaMonitorMode, 1);
+  mode = g_new0 (MetaMonitorModeTiled, 1);
 
-  mode->spec = (MetaMonitorModeSpec) {
+  mode->is_tiled = FALSE;
+  mode->parent.spec = (MetaMonitorModeSpec) {
     .width = crtc_mode->width,
     .height = crtc_mode->height,
     .refresh_rate = crtc_mode->refresh_rate
   };
-  mode->crtc_modes = g_new0 (MetaMonitorCrtcMode,
+  mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
                              g_list_length (monitor_priv->outputs));
 
   for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
@@ -620,23 +633,21 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
 
       if (output == main_output)
         {
-          mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
-            .x = 0,
-            .y = 0,
+          mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
             .output = output,
             .crtc_mode = crtc_mode
           };
         }
       else
         {
-          mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
+          mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
             .output = output,
             .crtc_mode = NULL
           };
         }
     }
 
-  return mode;
+  return &mode->parent;
 }
 
 static void
@@ -745,6 +756,27 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor   *monitor,
 }
 
 static void
+meta_monitor_tiled_calculate_crtc_pos (MetaMonitor         *monitor,
+                                       MetaMonitorMode     *monitor_mode,
+                                       MetaOutput          *output,
+                                       int                 *out_x,
+                                       int                 *out_y)
+{
+  MetaMonitorModeTiled *mode_tiled = (MetaMonitorModeTiled *) monitor_mode;
+
+  if (mode_tiled->is_tiled)
+    {
+      calculate_tile_coordinate (monitor, output,
+                                 out_x, out_y);
+    }
+  else
+    {
+      *out_x = 0;
+      *out_y = 0;
+    }
+}
+
+static void
 meta_monitor_tiled_finalize (GObject *object)
 {
   MetaMonitorTiled *monitor_tiled = META_MONITOR_TILED (object);
@@ -771,6 +803,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
 
   monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
   monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
+  monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
 }
 
 static void
@@ -882,6 +915,20 @@ meta_monitor_get_modes (MetaMonitor *monitor)
   return priv->modes;
 }
 
+void
+meta_monitor_calculate_crtc_pos (MetaMonitor         *monitor,
+                                 MetaMonitorMode     *monitor_mode,
+                                 MetaOutput          *output,
+                                 int                 *out_x,
+                                 int                 *out_y)
+{
+  META_MONITOR_GET_CLASS (monitor)->calculate_crtc_pos (monitor,
+                                                        monitor_mode,
+                                                        output,
+                                                        out_x,
+                                                        out_y);
+}
+
 MetaMonitorModeSpec *
 meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode)
 {
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index fc75c8c..36149d0 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -43,8 +43,6 @@ typedef struct _MetaMonitorModeSpec
 
 typedef struct _MetaMonitorCrtcMode
 {
-  int x;
-  int y;
   MetaOutput *output;
   MetaCrtcMode *crtc_mode;
 } MetaMonitorCrtcMode;
@@ -66,6 +64,11 @@ struct _MetaMonitorClass
   void (* derive_dimensions) (MetaMonitor   *monitor,
                               int           *width,
                               int           *height);
+  void (* calculate_crtc_pos) (MetaMonitor         *monitor,
+                               MetaMonitorMode     *monitor_mode,
+                               MetaOutput          *output,
+                               int                 *out_x,
+                               int                 *out_y);
 };
 
 #define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ())
@@ -143,6 +146,12 @@ void meta_monitor_set_current_mode (MetaMonitor     *monitor,
 
 GList * meta_monitor_get_modes (MetaMonitor *monitor);
 
+void meta_monitor_calculate_crtc_pos (MetaMonitor         *monitor,
+                                      MetaMonitorMode     *monitor_mode,
+                                      MetaOutput          *output,
+                                      int                 *out_x,
+                                      int                 *out_y);
+
 MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode);
 
 void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
diff --git a/src/backends/native/meta-cursor-renderer-native.c 
b/src/backends/native/meta-cursor-renderer-native.c
index 5dbfadb..471106f 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -240,15 +240,20 @@ update_monitor_crtc_cursor (MetaMonitor         *monitor,
     meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
   MetaRectangle scaled_crtc_rect;
   int scale;
+  int crtc_x, crtc_y;
 
   if (meta_is_stage_views_scaled ())
     scale = meta_logical_monitor_get_scale (data->in_logical_monitor);
   else
     scale = 1;
 
+  meta_monitor_calculate_crtc_pos (monitor, monitor_mode,
+                                   monitor_crtc_mode->output,
+                                   &crtc_x, &crtc_y);
+
   scaled_crtc_rect = (MetaRectangle) {
-    .x = monitor_crtc_mode->x / scale,
-    .y = monitor_crtc_mode->y / scale,
+    .x = crtc_x / scale,
+    .y = crtc_y / scale,
     .width = monitor_crtc_mode->crtc_mode->width / scale,
     .height = monitor_crtc_mode->crtc_mode->height / scale
   };
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index b3f458c..5f354c2 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -128,8 +128,6 @@ typedef struct _MonitorTestCaseMonitorCrtcMode
 {
   int output;
   int crtc_mode;
-  int x;
-  int y;
 } MetaTestCaseMonitorCrtcMode;
 
 typedef struct _MonitorTestCaseMonitorMode
@@ -162,6 +160,8 @@ typedef struct _MonitorTestCaseLogicalMonitor
 typedef struct _MonitorTestCaseCrtcExpect
 {
   int current_mode;
+  int x;
+  int y;
 } MonitorTestCaseCrtcExpect;
 
 typedef struct _MonitorTestCaseExpect
@@ -351,9 +351,6 @@ check_monitor_mode (MetaMonitor         *monitor,
   g_assert (monitor_crtc_mode->output == output);
   g_assert (monitor_crtc_mode->crtc_mode == crtc_mode);
 
-  g_assert_cmpint (monitor_crtc_mode->x, ==, data->expect_crtc_mode_iter->x);
-  g_assert_cmpint (monitor_crtc_mode->y, ==, data->expect_crtc_mode_iter->y);
-
   data->expect_crtc_mode_iter++;
 
   return TRUE;
@@ -490,6 +487,42 @@ check_logical_monitor (MonitorTestCase               *test_case,
 }
 
 static void
+get_compensated_crtc_position (MetaCrtc *crtc,
+                               int      *x,
+                               int      *y)
+{
+  MetaLogicalMonitor *logical_monitor;
+  MetaBackend *backend = meta_get_backend ();
+  MetaRenderer *renderer = meta_backend_get_renderer (backend);
+  GList *views;
+  GList *l;
+
+  logical_monitor = crtc->logical_monitor;
+  g_assert_nonnull (logical_monitor);
+
+  views = meta_renderer_get_views (renderer);
+  for (l = views; l; l = l->next)
+    {
+      MetaRendererView *view = l->data;
+      MetaRectangle view_layout;
+
+      clutter_stage_view_get_layout (CLUTTER_STAGE_VIEW (view),
+                                     &view_layout);
+
+      if (meta_rectangle_equal (&view_layout,
+                                &logical_monitor->rect))
+        {
+          *x = crtc->rect.x - view_layout.x;
+          *y = crtc->rect.y - view_layout.y;
+          return;
+        }
+    }
+
+  *x = crtc->rect.x;
+  *y = crtc->rect.y;
+}
+
+static void
 check_monitor_configuration (MonitorTestCase *test_case)
 {
   MetaBackend *backend = meta_get_backend ();
@@ -671,8 +704,14 @@ check_monitor_configuration (MonitorTestCase *test_case)
           MetaCrtc *crtc = &monitor_manager->crtcs[i];
           MetaCrtcMode *expected_current_mode =
             &monitor_manager->modes[test_case->expect.crtcs[i].current_mode];
+          int crtc_x, crtc_y;
 
           g_assert (crtc->current_mode == expected_current_mode);
+
+          get_compensated_crtc_position (crtc, &crtc_x, &crtc_y);
+
+          g_assert_cmpint (crtc_x, ==, test_case->expect.crtcs[i].x);
+          g_assert_cmpint (crtc_y, ==, test_case->expect.crtcs[i].y);
         }
     }
 }
@@ -1224,8 +1263,6 @@ meta_test_monitor_tiled_linear_config (void)
                 {
                   .output = 1,
                   .crtc_mode = 0,
-                  .x = 400,
-                  .y = 0
                 }
               }
             },
@@ -1254,6 +1291,8 @@ meta_test_monitor_tiled_linear_config (void)
         },
         {
           .current_mode = 0,
+          .x = 400,
+          .y = 0
         }
       },
       .n_crtcs = 2,
@@ -2826,14 +2865,10 @@ meta_test_monitor_custom_tiled_config (void)
                 {
                   .output = 0,
                   .crtc_mode = 0,
-                  .x = 0,
-                  .y = 0,
                 },
                 {
                   .output = 1,
                   .crtc_mode = 0,
-                  .x = 400,
-                  .y = 0,
                 }
               }
             }
@@ -2862,6 +2897,8 @@ meta_test_monitor_custom_tiled_config (void)
         },
         {
           .current_mode = 0,
+          .x = 400,
+          .y = 0
         }
       },
       .n_crtcs = 2,
@@ -2969,14 +3006,10 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
                 {
                   .output = 0,
                   .crtc_mode = 0,
-                  .x = 0,
-                  .y = 0,
                 },
                 {
                   .output = 1,
                   .crtc_mode = 0,
-                  .x = 400,
-                  .y = 0,
                 }
               }
             },
@@ -2987,8 +3020,6 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
                 {
                   .output = 0,
                   .crtc_mode = 1,
-                  .x = 0,
-                  .y = 0,
                 },
                 {
                   .output = 1,
@@ -3021,6 +3052,8 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void)
         },
         {
           .current_mode = -1,
+          .x = 400,
+          .y = 0,
         }
       },
       .n_crtcs = 2,


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