[mutter: 2/13] backends/native: Split hw supported CRTC rotation modes



commit 92c03e8625c86ac2e0636d0422200e8eeb884f06
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jul 31 23:41:26 2016 +0200

    backends/native: Split hw supported CRTC rotation modes
    
    Those will need a separate treatment from the modes that we eventually
    support through "software", so split those into a separate enum so we
    can can do the right thing when applying the configuration.
    
    Also, add a helper function that returns the transform that the software
    fallbacks should perform, which should be "normal" if the rotation is
    already handled via hw.
    
    The function applying the configuration has been modified to always set
    a HW rotation mode (even if normal), when we come to support SW rotation
    modes, we'll be relying on a normal transformation, so it will be
    necessary to have mixed HW/SW managed transforms.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=745079

 src/backends/native/meta-monitor-manager-kms.c |   38 +++++++++++++++++++-----
 src/backends/native/meta-monitor-manager-kms.h |    5 +++
 2 files changed, 35 insertions(+), 8 deletions(-)
---
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 1de6484..947b65e 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -77,6 +77,7 @@ typedef struct {
   uint32_t primary_plane_id;
   uint32_t rotation_prop_id;
   uint32_t rotation_map[ALL_TRANSFORMS];
+  uint32_t all_hw_transforms;
 } MetaCRTCKms;
 
 typedef struct
@@ -530,7 +531,7 @@ parse_transforms (MetaMonitorManager *manager,
 
       if (cur != -1)
         {
-          crtc->all_transforms |= 1 << cur;
+          crtc_kms->all_hw_transforms |= 1 << cur;
           crtc_kms->rotation_map[cur] = 1 << prop->enums[i].value;
         }
     }
@@ -606,6 +607,8 @@ init_crtc_rotations (MetaMonitorManager *manager,
       drmModeFreePlane (drm_plane);
     }
 
+  crtc->all_transforms |= crtc_kms->all_hw_transforms;
+
   drmModeFreePlaneResources (planes);
 }
 
@@ -1184,6 +1187,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
       MetaCRTCInfo *crtc_info = crtcs[i];
       MetaCRTC *crtc = crtc_info->crtc;
       MetaCRTCKms *crtc_kms = crtc->driver_private;
+      MetaMonitorTransform hw_transform;
 
       crtc->is_dirty = TRUE;
 
@@ -1234,14 +1238,17 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
             }
         }
 
-      if (crtc->all_transforms & (1 << crtc->transform))
-        drmModeObjectSetProperty (manager_kms->fd,
-                                  crtc_kms->primary_plane_id,
-                                  DRM_MODE_OBJECT_PLANE,
-                                  crtc_kms->rotation_prop_id,
-                                  crtc_kms->rotation_map[crtc->transform]);
-    }
+      if (crtc_kms->all_hw_transforms & (1 << crtc->transform))
+        hw_transform = crtc->transform;
+      else
+        hw_transform = META_MONITOR_TRANSFORM_NORMAL;
 
+      drmModeObjectSetProperty (manager_kms->fd,
+                                crtc_kms->primary_plane_id,
+                                DRM_MODE_OBJECT_PLANE,
+                                crtc_kms->rotation_prop_id,
+                                crtc_kms->rotation_map[hw_transform]);
+    }
   /* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE,
      because they weren't seen in the first loop) */
   for (i = 0; i < manager->n_crtcs; i++)
@@ -1617,3 +1624,18 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass)
   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;
+}
diff --git a/src/backends/native/meta-monitor-manager-kms.h b/src/backends/native/meta-monitor-manager-kms.h
index 3386b93..53a019e 100644
--- a/src/backends/native/meta-monitor-manager-kms.h
+++ b/src/backends/native/meta-monitor-manager-kms.h
@@ -57,4 +57,9 @@ 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 */


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