[mutter] kms/update: Make plane assignment take rotation instead of property list



commit c1ce36f08ef146f931be04339980e72f9f4f88cd
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Tue Jul 14 15:10:50 2020 +0200

    kms/update: Make plane assignment take rotation instead of property list
    
    Instead of having MetaKmsPlaneAssignment carry a low level property
    list, set the actual state change, and then have the implementation
    translate that into the necessary property changes.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>

 src/backends/native/meta-kms-impl-simple.c    | 81 ++++++++++++++-------------
 src/backends/native/meta-kms-plane-private.h  |  1 +
 src/backends/native/meta-kms-plane.c          | 53 +++++++-----------
 src/backends/native/meta-kms-update-private.h | 13 +----
 src/backends/native/meta-kms-update.c         | 36 ++----------
 5 files changed, 70 insertions(+), 114 deletions(-)
---
diff --git a/src/backends/native/meta-kms-impl-simple.c b/src/backends/native/meta-kms-impl-simple.c
index 7bcdb489f8..43283716da 100644
--- a/src/backends/native/meta-kms-impl-simple.c
+++ b/src/backends/native/meta-kms-impl-simple.c
@@ -31,7 +31,7 @@
 #include "backends/native/meta-kms-device-private.h"
 #include "backends/native/meta-kms-mode.h"
 #include "backends/native/meta-kms-page-flip-private.h"
-#include "backends/native/meta-kms-plane.h"
+#include "backends/native/meta-kms-plane-private.h"
 #include "backends/native/meta-kms-private.h"
 #include "backends/native/meta-kms-update-private.h"
 #include "backends/native/meta-kms-utils.h"
@@ -106,37 +106,6 @@ process_connector_property (MetaKmsImpl    *impl,
   return TRUE;
 }
 
-static gboolean
-process_plane_property (MetaKmsImpl      *impl,
-                        MetaKmsPlane     *plane,
-                        MetaKmsProperty  *prop,
-                        GError          **error)
-{
-  MetaKmsDevice *device = meta_kms_plane_get_device (plane);
-  MetaKmsImplDevice *impl_device = meta_kms_device_get_impl_device (device);
-  int fd;
-  int ret;
-
-  fd = meta_kms_impl_device_get_fd (impl_device);
-
-  ret = drmModeObjectSetProperty (fd,
-                                  meta_kms_plane_get_id (plane),
-                                  DRM_MODE_OBJECT_PLANE,
-                                  prop->prop_id,
-                                  prop->value);
-  if (ret != 0)
-    {
-      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret),
-                   "Failed to set plane %u property %u: %s",
-                   meta_kms_plane_get_id (plane),
-                   prop->prop_id,
-                   g_strerror (-ret));
-      return FALSE;
-    }
-
-  return TRUE;
-}
-
 static CachedModeSet *
 cached_mode_set_new (GList                 *connectors,
                      const drmModeModeInfo *drm_mode)
@@ -179,6 +148,42 @@ fill_connector_ids_array (GList     *connectors,
     }
 }
 
+static gboolean
+set_plane_rotation (MetaKmsImpl   *impl,
+                    MetaKmsPlane  *plane,
+                    uint64_t       rotation,
+                    GError       **error)
+{
+  MetaKmsDevice *device = meta_kms_plane_get_device (plane);
+  MetaKmsImplDevice *impl_device = meta_kms_device_get_impl_device (device);
+  int fd;
+  uint32_t rotation_prop_id;
+  int ret;
+
+  fd = meta_kms_impl_device_get_fd (impl_device);
+
+  rotation_prop_id = meta_kms_plane_get_prop_id (plane,
+                                                 META_KMS_PLANE_PROP_ROTATION);
+  ret = drmModeObjectSetProperty (fd,
+                                  meta_kms_plane_get_id (plane),
+                                  DRM_MODE_OBJECT_PLANE,
+                                  rotation_prop_id,
+                                  rotation);
+  if (ret != 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret),
+                   "Failed to rotation property (%u) to %" G_GUINT64_FORMAT
+                   " on plane %u: %s",
+                   rotation_prop_id,
+                   rotation,
+                   meta_kms_plane_get_id (plane),
+                   g_strerror (-ret));
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
 static gboolean
 process_mode_set (MetaKmsImpl     *impl,
                   MetaKmsUpdate   *update,
@@ -203,8 +208,6 @@ process_mode_set (MetaKmsImpl     *impl,
 
   if (mode_set->mode)
     {
-      GList *l;
-
       drm_mode = g_alloca (sizeof *drm_mode);
       *drm_mode = *meta_kms_mode_get_drm_mode (mode_set->mode);
 
@@ -225,12 +228,12 @@ process_mode_set (MetaKmsImpl     *impl,
       x = meta_fixed_16_to_int (plane_assignment->src_rect.x);
       y = meta_fixed_16_to_int (plane_assignment->src_rect.y);
 
-      for (l = plane_assignment->plane_properties; l; l = l->next)
+      if (plane_assignment->rotation)
         {
-          MetaKmsProperty *prop = l->data;
-
-          if (!process_plane_property (impl, plane_assignment->plane,
-                                       prop, error))
+          if (!set_plane_rotation (impl,
+                                   plane_assignment->plane,
+                                   plane_assignment->rotation,
+                                   error))
             return FALSE;
         }
 
diff --git a/src/backends/native/meta-kms-plane-private.h b/src/backends/native/meta-kms-plane-private.h
index b899c65c17..ca200c753e 100644
--- a/src/backends/native/meta-kms-plane-private.h
+++ b/src/backends/native/meta-kms-plane-private.h
@@ -29,6 +29,7 @@
 typedef enum _MetaKmsPlaneProp
 {
   META_KMS_PLANE_PROP_TYPE = 0,
+  META_KMS_PLANE_PROP_ROTATION,
   META_KMS_PLANE_PROP_IN_FORMATS,
   META_KMS_PLANE_PROP_SRC_X,
   META_KMS_PLANE_PROP_SRC_Y,
diff --git a/src/backends/native/meta-kms-plane.c b/src/backends/native/meta-kms-plane.c
index 9ed0cbe3d6..6e4add910f 100644
--- a/src/backends/native/meta-kms-plane.c
+++ b/src/backends/native/meta-kms-plane.c
@@ -46,7 +46,6 @@ struct _MetaKmsPlane
 
   uint32_t possible_crtcs;
 
-  uint32_t rotation_prop_id;
   uint32_t rotation_map[META_MONITOR_N_TRANSFORMS];
   uint32_t all_hw_transforms;
 
@@ -105,9 +104,8 @@ meta_kms_plane_update_set_rotation (MetaKmsPlane           *plane,
 {
   g_return_if_fail (meta_kms_plane_is_transform_handled (plane, transform));
 
-  meta_kms_plane_assignment_set_plane_property (plane_assignment,
-                                                plane->rotation_prop_id,
-                                                plane->rotation_map[transform]);
+  meta_kms_plane_assignment_set_rotation (plane_assignment,
+                                          plane->rotation_map[transform]);
 }
 
 gboolean
@@ -184,51 +182,36 @@ meta_kms_plane_is_usable_with (MetaKmsPlane *plane,
 }
 
 static void
-parse_rotations (MetaKmsPlane       *plane,
-                 MetaKmsImplDevice  *impl_device,
-                 drmModePropertyPtr  prop)
+parse_rotations (MetaKmsImplDevice  *impl_device,
+                 MetaKmsProp        *prop,
+                 drmModePropertyPtr  drm_prop,
+                 uint64_t            drm_prop_value,
+                 gpointer            user_data)
 {
+  MetaKmsPlane *plane = user_data;
   int i;
 
-  for (i = 0; i < prop->count_enums; i++)
+  for (i = 0; i < drm_prop->count_enums; i++)
     {
       MetaMonitorTransform transform = -1;
 
-      if (strcmp (prop->enums[i].name, "rotate-0") == 0)
+      if (strcmp (drm_prop->enums[i].name, "rotate-0") == 0)
         transform = META_MONITOR_TRANSFORM_NORMAL;
-      else if (strcmp (prop->enums[i].name, "rotate-90") == 0)
+      else if (strcmp (drm_prop->enums[i].name, "rotate-90") == 0)
         transform = META_MONITOR_TRANSFORM_90;
-      else if (strcmp (prop->enums[i].name, "rotate-180") == 0)
+      else if (strcmp (drm_prop->enums[i].name, "rotate-180") == 0)
         transform = META_MONITOR_TRANSFORM_180;
-      else if (strcmp (prop->enums[i].name, "rotate-270") == 0)
+      else if (strcmp (drm_prop->enums[i].name, "rotate-270") == 0)
         transform = META_MONITOR_TRANSFORM_270;
 
       if (transform != -1)
         {
           plane->all_hw_transforms |= 1 << transform;
-          plane->rotation_map[transform] = 1 << prop->enums[i].value;
+          plane->rotation_map[transform] = 1 << drm_prop->enums[i].value;
         }
     }
 }
 
-static void
-init_rotations (MetaKmsPlane            *plane,
-                MetaKmsImplDevice       *impl_device,
-                drmModeObjectProperties *drm_plane_props)
-{
-  drmModePropertyPtr prop;
-  int idx;
-
-  prop = meta_kms_impl_device_find_property (impl_device, drm_plane_props,
-                                             "rotation", &idx);
-  if (prop)
-    {
-      plane->rotation_prop_id = drm_plane_props->props[idx];
-      parse_rotations (plane, impl_device, prop);
-      drmModeFreeProperty (prop);
-    }
-}
-
 static inline uint32_t *
 drm_formats_ptr (struct drm_format_modifier_blob *blob)
 {
@@ -390,6 +373,12 @@ init_properties (MetaKmsPlane            *plane,
           .name = "type",
           .type = DRM_MODE_PROP_ENUM,
         },
+      [META_KMS_PLANE_PROP_ROTATION] =
+        {
+          .name = "rotation",
+          .type = DRM_MODE_PROP_BITMASK,
+          .parse = parse_rotations,
+        },
       [META_KMS_PLANE_PROP_IN_FORMATS] =
         {
           .name = "IN_FORMATS",
@@ -472,8 +461,6 @@ meta_kms_plane_new (MetaKmsPlaneType         type,
   plane->possible_crtcs = drm_plane->possible_crtcs;
   plane->device = meta_kms_impl_device_get_device (impl_device);
 
-  init_rotations (plane, impl_device, drm_plane_props);
-
   init_properties (plane, impl_device, drm_plane, drm_plane_props);
   init_legacy_formats (plane, impl_device, drm_plane, drm_plane_props);
 
diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h
index f3d3419d28..d33d923277 100644
--- a/src/backends/native/meta-kms-update-private.h
+++ b/src/backends/native/meta-kms-update-private.h
@@ -34,12 +34,6 @@ typedef struct _MetaKmsFeedback
   GError *error;
 } MetaKmsFeedback;
 
-typedef struct _MetaKmsProperty
-{
-  uint32_t prop_id;
-  uint64_t value;
-} MetaKmsProperty;
-
 typedef struct _MetaKmsPlaneAssignment
 {
   MetaKmsUpdate *update;
@@ -50,7 +44,7 @@ typedef struct _MetaKmsPlaneAssignment
   MetaFixed16Rectangle dst_rect;
   MetaKmsAssignPlaneFlag flags;
 
-  GList *plane_properties;
+  uint64_t rotation;
 
   struct {
     gboolean is_valid;
@@ -120,9 +114,8 @@ void meta_kms_update_set_crtc_gamma (MetaKmsUpdate  *update,
                                      const uint16_t *green,
                                      const uint16_t *blue);
 
-void meta_kms_plane_assignment_set_plane_property (MetaKmsPlaneAssignment *plane_assignment,
-                                                   uint32_t                prop_id,
-                                                   uint64_t                value);
+void meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment,
+                                             uint64_t                rotation);
 
 MetaKmsPlaneAssignment * meta_kms_update_get_primary_plane_assignment (MetaKmsUpdate *update,
                                                                        MetaKmsCrtc   *crtc);
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c
index 1cdbef1b79..ed1ddd0a73 100644
--- a/src/backends/native/meta-kms-update.c
+++ b/src/backends/native/meta-kms-update.c
@@ -118,32 +118,9 @@ meta_kms_feedback_get_error (MetaKmsFeedback *feedback)
   return feedback->error;
 }
 
-static MetaKmsProperty *
-meta_kms_property_new (uint32_t prop_id,
-                       uint64_t value)
-{
-  MetaKmsProperty *prop;
-
-  prop = g_new0 (MetaKmsProperty, 1);
-  *prop = (MetaKmsProperty) {
-    .prop_id = prop_id,
-    .value = value,
-  };
-
-  return prop;
-}
-
-static void
-meta_kms_property_free (MetaKmsProperty *prop)
-{
-  g_free (prop);
-}
-
 static void
 meta_kms_plane_assignment_free (MetaKmsPlaneAssignment *plane_assignment)
 {
-  g_list_free_full (plane_assignment->plane_properties,
-                    (GDestroyNotify) meta_kms_property_free);
   g_free (plane_assignment);
 }
 
@@ -328,18 +305,13 @@ meta_kms_update_custom_page_flip (MetaKmsUpdate                 *update,
 }
 
 void
-meta_kms_plane_assignment_set_plane_property (MetaKmsPlaneAssignment *plane_assignment,
-                                              uint32_t                prop_id,
-                                              uint64_t                value)
+meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment,
+                                        uint64_t                rotation)
 {
-  MetaKmsProperty *plane_prop;
-
   g_assert (!meta_kms_update_is_sealed (plane_assignment->update));
+  g_warn_if_fail (rotation);
 
-  plane_prop = meta_kms_property_new (prop_id, value);
-
-  plane_assignment->plane_properties =
-    g_list_prepend (plane_assignment->plane_properties, plane_prop);
+  plane_assignment->rotation = rotation;
 }
 
 void


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