[mutter] monitor-manager: Expose whether the backend handles a transform



commit 944339f6a54afd278ea5c0a9dac833e85c2ac1ac
Author: Jonas Ådahl <jadahl gmail com>
Date:   Wed Mar 8 16:05:00 2017 +0800

    monitor-manager: Expose whether the backend handles a transform
    
    Expose via a new API whether the transform on a logical monitor is
    handled by the backend. This was previously only exposed only in the
    native backend. This will be used to emulate not supporting transforms
    in the backend in the nested backend.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=779745

 src/backends/meta-monitor-manager-dummy.c      |    9 ++++
 src/backends/meta-monitor-manager-private.h    |    7 +++
 src/backends/meta-monitor-manager.c            |   11 +++++
 src/backends/native/meta-monitor-manager-kms.c |   30 ++++++-------
 src/backends/native/meta-monitor-manager-kms.h |    5 --
 src/backends/native/meta-renderer-native.c     |   56 +++++++++++++-----------
 src/backends/x11/meta-monitor-manager-xrandr.c |   11 +++++
 src/tests/meta-monitor-manager-test.c          |    9 ++++
 8 files changed, 91 insertions(+), 47 deletions(-)
---
diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c
index 77c984a..0d8c01b 100644
--- a/src/backends/meta-monitor-manager-dummy.c
+++ b/src/backends/meta-monitor-manager-dummy.c
@@ -521,6 +521,14 @@ meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager,
   meta_monitor_manager_rebuild_derived (manager);
 }
 
+static gboolean
+meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager  *manager,
+                                                 MetaCrtc            *crtc,
+                                                 MetaMonitorTransform transform)
+{
+  return TRUE;
+}
+
 static void
 meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
 {
@@ -530,6 +538,7 @@ meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
   manager_class->ensure_initial_config = meta_monitor_manager_dummy_ensure_initial_config;
   manager_class->apply_monitors_config = meta_monitor_manager_dummy_apply_monitors_config;
   manager_class->apply_configuration = meta_monitor_manager_dummy_apply_config;
+  manager_class->is_transform_handled = meta_monitor_manager_dummy_is_transform_handled;
 }
 
 static void
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index 1c2bb26..3c27bc8 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -345,6 +345,9 @@ struct _MetaMonitorManagerClass
   void (*tiled_monitor_removed) (MetaMonitorManager *,
                                  MetaMonitor        *);
 
+  gboolean (*is_transform_handled) (MetaMonitorManager  *,
+                                    MetaCrtc            *,
+                                    MetaMonitorTransform);
 };
 
 void                meta_monitor_manager_rebuild (MetaMonitorManager *manager,
@@ -428,6 +431,10 @@ void               meta_monitor_manager_tiled_monitor_added (MetaMonitorManager
 void               meta_monitor_manager_tiled_monitor_removed (MetaMonitorManager *manager,
                                                                MetaMonitor        *monitor);
 
+gboolean           meta_monitor_manager_is_transform_handled (MetaMonitorManager  *manager,
+                                                              MetaCrtc            *crtc,
+                                                              MetaMonitorTransform transform);
+
 MetaMonitorsConfig * meta_monitor_manager_ensure_configured (MetaMonitorManager *manager);
 
 void               meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 04e5cb6..4400b71 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1725,6 +1725,17 @@ meta_monitor_manager_tiled_monitor_removed (MetaMonitorManager *manager,
     manager_class->tiled_monitor_removed (manager, monitor);
 }
 
+gboolean
+meta_monitor_manager_is_transform_handled (MetaMonitorManager  *manager,
+                                           MetaCrtc            *crtc,
+                                           MetaMonitorTransform transform)
+{
+  MetaMonitorManagerClass *manager_class =
+    META_MONITOR_MANAGER_GET_CLASS (manager);
+
+  return manager_class->is_transform_handled (manager, crtc, transform);
+}
+
 void
 meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
 {
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 25c1b77..1d9bdfd 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -1968,6 +1968,19 @@ meta_monitor_manager_kms_wait_for_flip (MetaMonitorManagerKms *manager_kms)
   drmHandleEvent (manager_kms->fd, &evctx);
 }
 
+static gboolean
+meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager  *manager,
+                                               MetaCrtc            *crtc,
+                                               MetaMonitorTransform transform)
+{
+  MetaCrtcKms *crtc_kms = crtc->driver_private;
+
+  if ((1 << crtc->transform) & crtc_kms->all_hw_transforms)
+    return TRUE;
+  else
+    return FALSE;
+}
+
 static void
 meta_monitor_manager_kms_dispose (GObject *object)
 {
@@ -2007,20 +2020,5 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass)
   manager_class->set_power_save_mode = meta_monitor_manager_kms_set_power_save_mode;
   manager_class->get_crtc_gamma = meta_monitor_manager_kms_get_crtc_gamma;
   manager_class->set_crtc_gamma = meta_monitor_manager_kms_set_crtc_gamma;
-}
-
-MetaMonitorTransform
-meta_monitor_manager_kms_get_view_transform (MetaMonitorManagerKms *manager,
-                                             MetaCrtc              *crtc)
-{
-  MetaCrtcKms *crtc_kms;
-
-  crtc_kms = crtc->driver_private;
-  if ((1 << crtc->transform) & crtc_kms->all_hw_transforms)
-    {
-      /* Transform is managed by the hardware, the view is untransformed */
-      return META_MONITOR_TRANSFORM_NORMAL;
-    }
-
-  return crtc->transform;
+  manager_class->is_transform_handled = meta_monitor_manager_kms_is_transform_handled;
 }
diff --git a/src/backends/native/meta-monitor-manager-kms.h b/src/backends/native/meta-monitor-manager-kms.h
index 59d6e72..d4978b8 100644
--- a/src/backends/native/meta-monitor-manager-kms.h
+++ b/src/backends/native/meta-monitor-manager-kms.h
@@ -58,9 +58,4 @@ gboolean meta_monitor_manager_kms_flip_crtc (MetaMonitorManagerKms *manager_kms,
 
 void meta_monitor_manager_kms_wait_for_flip (MetaMonitorManagerKms *manager_kms);
 
-MetaMonitorTransform
-meta_monitor_manager_kms_get_view_transform (MetaMonitorManagerKms *manager,
-                                             MetaCrtc              *crtc);
-
-
 #endif /* META_MONITOR_MANAGER_KMS_H */
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index c690688..8dba727 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1398,25 +1398,6 @@ meta_renderer_native_queue_modes_reset (MetaRendererNative *renderer_native)
     }
 }
 
-static MetaMonitorTransform
-meta_renderer_native_get_logical_monitor_transform (MetaRenderer       *renderer,
-                                                    MetaLogicalMonitor *logical_monitor)
-{
-  MetaBackend *backend = meta_get_backend ();
-  MetaMonitorManager *monitor_manager =
-    meta_backend_get_monitor_manager (backend);
-  MetaMonitorManagerKms *monitor_manager_kms =
-    META_MONITOR_MANAGER_KMS (monitor_manager);
-  MetaMonitor *monitor;
-  MetaOutput *output;
-
-  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,
-                                                      output->crtc);
-}
-
 static CoglOnscreen *
 meta_renderer_native_create_onscreen (MetaRendererNative    *renderer,
                                       CoglContext           *context,
@@ -1689,38 +1670,61 @@ meta_renderer_native_create_legacy_view (MetaRendererNative *renderer_native)
   return view;
 }
 
+static MetaMonitorTransform
+calculate_view_transform (MetaMonitorManager *monitor_manager,
+                          MetaLogicalMonitor *logical_monitor)
+{
+  MetaMonitor *main_monitor;
+  MetaOutput *main_output;
+  main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
+  main_output = meta_monitor_get_main_output (main_monitor);
+
+  /*
+   * Pick any monitor and output and check; all CRTCs of a logical monitor will
+   * always have the same transform assigned to them.
+   */
+
+  if (meta_monitor_manager_is_transform_handled (monitor_manager,
+                                                 main_output->crtc,
+                                                 main_output->crtc->transform))
+    return META_MONITOR_TRANSFORM_NORMAL;
+  else
+    return main_output->crtc->transform;
+}
+
 static MetaRendererView *
 meta_renderer_native_create_view (MetaRenderer       *renderer,
                                   MetaLogicalMonitor *logical_monitor)
 {
   MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager =
+    meta_backend_get_monitor_manager (backend);
   ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
   CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
   CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
   CoglDisplayEGL *egl_display = cogl_display->winsys;
   CoglOnscreenEGL *egl_onscreen;
-  MetaMonitorTransform transform;
+  MetaMonitorTransform view_transform;
   CoglOnscreen *onscreen = NULL;
   CoglOffscreen *offscreen = NULL;
   MetaRendererView *view;
   GError *error = NULL;
 
-  transform = meta_renderer_native_get_logical_monitor_transform (renderer,
-                                                                  logical_monitor);
+  view_transform = calculate_view_transform (monitor_manager, logical_monitor);
 
   onscreen = meta_renderer_native_create_onscreen (META_RENDERER_NATIVE (renderer),
                                                    cogl_context,
-                                                   transform,
+                                                   view_transform,
                                                    logical_monitor->rect.width,
                                                    logical_monitor->rect.height);
   if (!onscreen)
     meta_fatal ("Failed to allocate onscreen framebuffer\n");
 
-  if (transform != META_MONITOR_TRANSFORM_NORMAL)
+  if (view_transform != META_MONITOR_TRANSFORM_NORMAL)
     {
       offscreen = meta_renderer_native_create_offscreen (META_RENDERER_NATIVE (renderer),
                                                          cogl_context,
-                                                         transform,
+                                                         view_transform,
                                                          logical_monitor->rect.width,
                                                          logical_monitor->rect.height);
       if (!offscreen)
@@ -1732,7 +1736,7 @@ meta_renderer_native_create_view (MetaRenderer       *renderer,
                        "framebuffer", onscreen,
                        "offscreen", offscreen,
                        "logical-monitor", logical_monitor,
-                       "transform", transform,
+                       "transform", view_transform,
                        NULL);
   g_clear_pointer (&offscreen, cogl_object_unref);
 
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index df608a3..cc7a444 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -1558,6 +1558,16 @@ meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xra
 }
 #endif
 
+static gboolean
+meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager  *manager,
+                                                  MetaCrtc            *crtc,
+                                                  MetaMonitorTransform transform)
+{
+  g_warn_if_fail (crtc->all_transforms & transform);
+
+  return TRUE;
+}
+
 static void
 meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr)
 {
@@ -1633,6 +1643,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
   manager_class->tiled_monitor_added = meta_monitor_manager_xrandr_tiled_monitor_added;
   manager_class->tiled_monitor_removed = meta_monitor_manager_xrandr_tiled_monitor_removed;
 #endif
+  manager_class->is_transform_handled = meta_monitor_manager_xrandr_is_transform_handled;
 
   quark_meta_monitor_xrandr_data =
     g_quark_from_static_string ("-meta-monitor-xrandr-data");
diff --git a/src/tests/meta-monitor-manager-test.c b/src/tests/meta-monitor-manager-test.c
index d7b01fa..2d862d5 100644
--- a/src/tests/meta-monitor-manager-test.c
+++ b/src/tests/meta-monitor-manager-test.c
@@ -327,6 +327,14 @@ meta_monitor_manager_test_tiled_monitor_removed (MetaMonitorManager *manager,
   manager_test->tiled_monitor_count--;
 }
 
+static gboolean
+meta_monitor_manager_test_is_transform_handled (MetaMonitorManager  *manager,
+                                                MetaCrtc            *crtc,
+                                                MetaMonitorTransform transform)
+{
+  return TRUE;
+}
+
 static void
 meta_monitor_manager_test_dispose (GObject *object)
 {
@@ -358,4 +366,5 @@ meta_monitor_manager_test_class_init (MetaMonitorManagerTestClass *klass)
   manager_class->apply_configuration = meta_monitor_manager_test_apply_configuration;
   manager_class->tiled_monitor_added = meta_monitor_manager_test_tiled_monitor_added;
   manager_class->tiled_monitor_removed = meta_monitor_manager_test_tiled_monitor_removed;
+  manager_class->is_transform_handled = meta_monitor_manager_test_is_transform_handled;
 }


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