[mutter] logical-monitor: Don't duplicate output list



commit ff633f295ea99ee4b36cf396654cf15540e17e58
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Dec 13 21:44:16 2016 +0800

    logical-monitor: Don't duplicate output list
    
    Just use the monitor list and the output lists of each monitor.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-logical-monitor.c        |   45 +++++++++++++--------------
 src/backends/meta-logical-monitor.h        |    5 +--
 src/backends/native/meta-renderer-native.c |   31 ++++++++++++-------
 src/tests/monitor-unit-tests.c             |   18 ++++++++--
 src/wayland/meta-wayland-outputs.c         |   32 ++++++++++++++++----
 5 files changed, 84 insertions(+), 47 deletions(-)
---
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c
index a386537..054a2ff 100644
--- a/src/backends/meta-logical-monitor.c
+++ b/src/backends/meta-logical-monitor.c
@@ -36,7 +36,6 @@ meta_logical_monitor_new (MetaMonitor *monitor,
   GList *outputs;
   GList *l;
   gboolean is_presentation;
-  int i;
 
   g_assert (meta_monitor_is_active (monitor));
 
@@ -59,20 +58,15 @@ meta_logical_monitor_new (MetaMonitor *monitor,
 
   is_presentation = TRUE;
   outputs = meta_monitor_get_outputs (monitor);
-  for (l = outputs, i = 0; l; l = l->next, i++)
+  for (l = outputs; l; l = l->next)
     {
       MetaOutput *output = l->data;
 
       output->crtc->logical_monitor = logical_monitor;
 
-      if (i <= META_MAX_OUTPUTS_PER_MONITOR)
-        logical_monitor->outputs[i] = output;
-      else
-        g_warning ("Couldn't add all outputs to monitor");
-
       is_presentation = is_presentation && output->is_presentation;
     }
-  logical_monitor->n_outputs = MIN (i, META_MAX_OUTPUTS_PER_MONITOR);
+
   logical_monitor->is_presentation = is_presentation;
 
   logical_monitor->monitors = g_list_append (logical_monitor->monitors,
@@ -85,30 +79,29 @@ void
 meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor,
                                   MetaMonitor        *monitor)
 {
-  GList *outputs;
   GList *l;
   gboolean is_presentation;
-  int i;
 
   is_presentation = logical_monitor->is_presentation;
   logical_monitor->monitors = g_list_append (logical_monitor->monitors,
                                              monitor);
 
-  outputs = meta_monitor_get_outputs (monitor);
-  for (l = outputs, i = logical_monitor->n_outputs; l; l = l->next, i++)
+  for (l = logical_monitor->monitors; l; l = l->next)
     {
-      MetaOutput *output = l->data;
-
-      output->crtc->logical_monitor = logical_monitor;
-
-      if (i <= META_MAX_OUTPUTS_PER_MONITOR)
-        logical_monitor->outputs[i] = output;
-      else
-        g_warning ("Couldn't add all outputs to monitor");
-
-      is_presentation = is_presentation && output->is_presentation;
+      MetaMonitor *monitor = l->data;
+      GList *outputs;
+      GList *l_output;
+
+      outputs = meta_monitor_get_outputs (monitor);
+      for (l_output = outputs; l_output; l_output = l_output->next)
+        {
+          MetaOutput *output = l_output->data;
+
+          is_presentation = is_presentation && output->is_presentation;
+          output->crtc->logical_monitor = logical_monitor;
+        }
     }
-  logical_monitor->n_outputs = MIN (i, META_MAX_OUTPUTS_PER_MONITOR);
+
   logical_monitor->is_presentation = is_presentation;
 }
 
@@ -124,6 +117,12 @@ meta_logical_monitor_make_primary (MetaLogicalMonitor *logical_monitor)
   logical_monitor->is_primary = TRUE;
 }
 
+GList *
+meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor)
+{
+  return logical_monitor->monitors;
+}
+
 static void
 meta_logical_monitor_init (MetaLogicalMonitor *logical_monitor)
 {
diff --git a/src/backends/meta-logical-monitor.h b/src/backends/meta-logical-monitor.h
index a6a664d..fb66021 100644
--- a/src/backends/meta-logical-monitor.h
+++ b/src/backends/meta-logical-monitor.h
@@ -55,9 +55,6 @@ struct _MetaLogicalMonitor
   */
   glong winsys_id;
 
-  int n_outputs;
-  MetaOutput *outputs[META_MAX_OUTPUTS_PER_MONITOR];
-
   GList *monitors;
 };
 
@@ -78,4 +75,6 @@ gboolean meta_logical_monitor_is_primary (MetaLogicalMonitor *logical_monitor);
 
 void meta_logical_monitor_make_primary (MetaLogicalMonitor *logical_monitor);
 
+GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor);
+
 #endif /* META_LOGICAL_MONITOR_H */
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 5b46cee..c64747e 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -968,20 +968,14 @@ meta_renderer_native_create_surface_egl_device (MetaRendererNative *renderer_nat
   CoglRenderer *cogl_renderer = cogl_display->renderer;
   CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
   EGLDisplay egl_display = egl_renderer->edpy;
+  MetaMonitor *monitor;
+  MetaOutput *output;
   EGLConfig egl_config;
   EGLStreamKHR egl_stream;
   EGLSurface egl_surface;
   EGLint num_layers;
   EGLOutputLayerEXT output_layer;
-  EGLAttrib output_attribs[] = {
-    /*
-     * An "logical_monitor" may have multiple outputs/crtcs in case its tiled,
-     * but as far as I can tell, EGL only allows you to pass one crtc_id, so
-     * lets pass the first one.
-     */
-    EGL_DRM_CRTC_EXT, logical_monitor->outputs[0]->crtc->crtc_id,
-    EGL_NONE,
-  };
+  EGLAttrib output_attribs[3];
   EGLint stream_attribs[] = {
     EGL_STREAM_FIFO_LENGTH_KHR, 1,
     EGL_CONSUMER_AUTO_ACQUIRE_EXT, EGL_FALSE,
@@ -997,6 +991,18 @@ meta_renderer_native_create_surface_egl_device (MetaRendererNative *renderer_nat
   if (egl_stream == EGL_NO_STREAM_KHR)
     return FALSE;
 
+  monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
+  output = meta_monitor_get_main_output (monitor);
+
+  /*
+   * An "logical_monitor" may have multiple outputs/crtcs in case its tiled,
+   * but as far as I can tell, EGL only allows you to pass one crtc_id, so
+   * lets pass the first one.
+   */
+  output_attribs[0] = EGL_DRM_CRTC_EXT;
+  output_attribs[1] = output->crtc->crtc_id;
+  output_attribs[2] = EGL_NONE;
+
   if (!meta_egl_get_output_layers (egl, egl_display,
                                    output_attribs,
                                    &output_layer, 1, &num_layers,
@@ -1394,11 +1400,14 @@ meta_renderer_native_get_logical_monitor_transform (MetaRenderer       *renderer
     meta_backend_get_monitor_manager (backend);
   MetaMonitorManagerKms *monitor_manager_kms =
     META_MONITOR_MANAGER_KMS (monitor_manager);
+  MetaMonitor *monitor;
+  MetaOutput *output;
 
-  g_assert (logical_monitor->n_outputs > 0);
+  monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
+  output = meta_monitor_get_main_output (monitor);
 
   return meta_monitor_manager_kms_get_view_transform (monitor_manager_kms,
-                                                      logical_monitor->outputs[0]->crtc);
+                                                      output->crtc);
 }
 
 static CoglOnscreen *
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index 4f23d39..dd70703 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -305,7 +305,8 @@ check_monitor_configuration (MonitorTestCase *test_case)
       MetaLogicalMonitor *logical_monitor = l->data;
       MonitorTestCaseLogicalMonitor *test_logical_monitor =
         &test_case->expect.logical_monitors[i];
-      int j;
+      GList *monitors;
+      GList *l_monitor;
 
       g_assert (logical_monitor->rect.x == test_logical_monitor->layout.x);
       g_assert (logical_monitor->rect.y == test_logical_monitor->layout.y);
@@ -315,11 +316,20 @@ check_monitor_configuration (MonitorTestCase *test_case)
                 test_logical_monitor->layout.height);
       g_assert (logical_monitor->scale == test_logical_monitor->scale);
 
-      for (j = 0; j < logical_monitor->n_outputs; j++)
+      monitors = meta_logical_monitor_get_monitors (logical_monitor);
+      for (l_monitor = monitors; l_monitor; l_monitor = l_monitor->next)
         {
-          MetaOutput *output = logical_monitor->outputs[j];
+          MetaMonitor *monitor = l_monitor->data;
+          GList *outputs;
+          GList *l_output;
+
+          outputs = meta_monitor_get_outputs (monitor);
+          for (l_output = outputs; l_output; l_output = l_output->next)
+            {
+              MetaOutput *output = l_output->data;
 
-          g_assert (output->crtc->logical_monitor == logical_monitor);
+              g_assert (output->crtc->logical_monitor == logical_monitor);
+            }
         }
     }
   g_assert (n_logical_monitors == i);
diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
index fd6832d..eef843f 100644
--- a/src/wayland/meta-wayland-outputs.c
+++ b/src/wayland/meta-wayland-outputs.c
@@ -54,6 +54,17 @@ output_resource_destroy (struct wl_resource *res)
   wayland_output->resources = g_list_remove (wayland_output->resources, res);
 }
 
+static MetaOutput *
+pick_main_output (MetaLogicalMonitor *logical_monitor)
+{
+  GList *monitors;
+  MetaMonitor *monitor;
+
+  monitors = meta_logical_monitor_get_monitors (logical_monitor);
+  monitor = g_list_first (monitors)->data;
+  return meta_monitor_get_main_output (monitor);
+}
+
 static void
 send_output_events (struct wl_resource *resource,
                     MetaWaylandOutput  *wayland_output,
@@ -61,11 +72,17 @@ send_output_events (struct wl_resource *resource,
                     gboolean            need_all_events)
 {
   int version = wl_resource_get_version (resource);
-  MetaOutput *output = logical_monitor->outputs[0];
+  MetaOutput *output;
   guint mode_flags = WL_OUTPUT_MODE_CURRENT;
-  MetaLogicalMonitor *old_logical_monitor = wayland_output->logical_monitor;
-  guint old_mode_flags = wayland_output->mode_flags;
-  gint old_scale = wayland_output->scale;
+  MetaLogicalMonitor *old_logical_monitor;
+  guint old_mode_flags;
+  gint old_scale;
+
+  old_logical_monitor = wayland_output->logical_monitor;
+  old_mode_flags = wayland_output->mode_flags;
+  old_scale = wayland_output->scale;
+
+  output = pick_main_output (logical_monitor);
 
   gboolean need_done = FALSE;
 
@@ -131,7 +148,7 @@ bind_output (struct wl_client *client,
   MetaWaylandOutput *wayland_output = data;
   MetaLogicalMonitor *logical_monitor = wayland_output->logical_monitor;
   struct wl_resource *resource;
-  MetaOutput *output = logical_monitor->outputs[0];
+  MetaOutput *output;
 
   resource = wl_resource_create (client, &wl_output_interface, version, id);
   wayland_output->resources = g_list_prepend (wayland_output->resources, resource);
@@ -139,6 +156,7 @@ bind_output (struct wl_client *client,
   wl_resource_set_user_data (resource, wayland_output);
   wl_resource_set_destructor (resource, output_resource_destroy);
 
+  output = pick_main_output (logical_monitor);
   meta_verbose ("Binding monitor %p/%s (%u, %u, %u, %u) x %f\n",
                 logical_monitor, output->name,
                 logical_monitor->rect.x, logical_monitor->rect.y,
@@ -161,10 +179,12 @@ static void
 meta_wayland_output_set_logical_monitor (MetaWaylandOutput  *wayland_output,
                                          MetaLogicalMonitor *logical_monitor)
 {
-  MetaOutput *output = logical_monitor->outputs[0];
+  MetaOutput *output;
 
   wayland_output->logical_monitor = logical_monitor;
   wayland_output->mode_flags = WL_OUTPUT_MODE_CURRENT;
+
+  output = pick_main_output (logical_monitor);
   if (output->crtc->current_mode == output->preferred_mode)
     wayland_output->mode_flags |= WL_OUTPUT_MODE_PREFERRED;
   wayland_output->scale = output->scale;


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