[mutter] kms/connector: Set DPMS and underscanning directly on the update



commit ec7667fc31da229af2236d6e7015f9fdca38ea1b
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Tue Jul 14 16:48:47 2020 +0200

    kms/connector: Set DPMS and underscanning directly on the update
    
    Instead of telling MetaKmsConnector fill a MetaKmsUpdate with connector
    property changes, make the update itself aware of the changes, making
    the impl side translate that to property changes.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>

 src/backends/native/meta-kms-connector-private.h | 17 ++++-
 src/backends/native/meta-kms-connector.c         | 71 +++-----------------
 src/backends/native/meta-kms-connector.h         | 12 ----
 src/backends/native/meta-kms-impl-simple.c       | 82 ++++++++++++++++++++----
 src/backends/native/meta-kms-update-private.h    | 26 ++++----
 src/backends/native/meta-kms-update.c            | 81 ++++++++++++++++++-----
 src/backends/native/meta-kms-update.h            | 12 ++++
 src/backends/native/meta-output-kms.c            | 18 +++---
 8 files changed, 194 insertions(+), 125 deletions(-)
---
diff --git a/src/backends/native/meta-kms-connector-private.h 
b/src/backends/native/meta-kms-connector-private.h
index 29901c4878..bb6bb115ca 100644
--- a/src/backends/native/meta-kms-connector-private.h
+++ b/src/backends/native/meta-kms-connector-private.h
@@ -20,7 +20,22 @@
 #ifndef META_KMS_CONNECTOR_PRIVATE_H
 #define META_KMS_CONNECTOR_PRIVATE_H
 
-#include "backends/native/meta-kms-types.h"
+#include "backends/native/meta-kms-connector.h"
+
+typedef enum _MetaKmsConnectorProp
+{
+  META_KMS_CONNECTOR_PROP_DPMS = 0,
+  META_KMS_CONNECTOR_PROP_UNDERSCAN,
+  META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER,
+  META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER,
+  META_KMS_CONNECTOR_N_PROPS
+} MetaKmsConnectorProp;
+
+uint32_t meta_kms_connector_get_prop_id (MetaKmsConnector     *connector,
+                                         MetaKmsConnectorProp  prop);
+
+const char * meta_kms_connector_get_prop_name (MetaKmsConnector     *connector,
+                                               MetaKmsConnectorProp  prop);
 
 void meta_kms_connector_update_state (MetaKmsConnector *connector,
                                       drmModeRes       *drm_resources);
diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c
index c25b9e8172..950def3f21 100644
--- a/src/backends/native/meta-kms-connector.c
+++ b/src/backends/native/meta-kms-connector.c
@@ -30,15 +30,6 @@
 #include "backends/native/meta-kms-mode-private.h"
 #include "backends/native/meta-kms-update-private.h"
 
-typedef enum _MetaKmsConnectorProp
-{
-  META_KMS_CONNECTOR_PROP_DPMS = 0,
-  META_KMS_CONNECTOR_PROP_UNDERSCAN,
-  META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER,
-  META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER,
-  META_KMS_CONNECTOR_N_PROPS
-} MetaKmsConnectorProp;
-
 typedef struct _MetaKmsConnectorPropTable
 {
   MetaKmsProp props[META_KMS_CONNECTOR_N_PROPS];
@@ -71,64 +62,18 @@ meta_kms_connector_get_device (MetaKmsConnector *connector)
   return connector->device;
 }
 
-void
-meta_kms_connector_update_set_dpms_state (MetaKmsConnector *connector,
-                                          MetaKmsUpdate    *update,
-                                          uint64_t          state)
-{
-  uint32_t prop_id;
-
-  prop_id = connector->prop_table.props[META_KMS_CONNECTOR_PROP_DPMS].prop_id;
-  meta_kms_update_set_connector_property (update,
-                                          connector,
-                                          prop_id,
-                                          state);
-}
-
-void
-meta_kms_connector_set_underscanning (MetaKmsConnector *connector,
-                                      MetaKmsUpdate    *update,
-                                      uint64_t          hborder,
-                                      uint64_t          vborder)
+uint32_t
+meta_kms_connector_get_prop_id (MetaKmsConnector     *connector,
+                                MetaKmsConnectorProp  prop)
 {
-  MetaKmsProp *props = connector->prop_table.props;
-  uint32_t underscan_prop_id;
-  uint32_t underscan_hborder_prop_id;
-  uint32_t underscan_vborder_prop_id;
-
-  underscan_prop_id =
-    props[META_KMS_CONNECTOR_PROP_UNDERSCAN].prop_id;
-  underscan_hborder_prop_id =
-    props[META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER].prop_id;
-  underscan_vborder_prop_id =
-    props[META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER].prop_id;
-
-  meta_kms_update_set_connector_property (update,
-                                          connector,
-                                          underscan_prop_id,
-                                          1);
-  meta_kms_update_set_connector_property (update,
-                                          connector,
-                                          underscan_hborder_prop_id,
-                                          hborder);
-  meta_kms_update_set_connector_property (update,
-                                          connector,
-                                          underscan_vborder_prop_id,
-                                          vborder);
+  return connector->prop_table.props[prop].prop_id;
 }
 
-void
-meta_kms_connector_unset_underscanning (MetaKmsConnector *connector,
-                                        MetaKmsUpdate    *update)
+const char *
+meta_kms_connector_get_prop_name (MetaKmsConnector     *connector,
+                                  MetaKmsConnectorProp  prop)
 {
-  MetaKmsProp *props = connector->prop_table.props;
-  uint32_t underscan_prop_id;
-
-  underscan_prop_id = props[META_KMS_CONNECTOR_PROP_UNDERSCAN].prop_id;
-  meta_kms_update_set_connector_property (update,
-                                          connector,
-                                          underscan_prop_id,
-                                          0);
+  return connector->prop_table.props[prop].name;
 }
 
 MetaConnectorType
diff --git a/src/backends/native/meta-kms-connector.h b/src/backends/native/meta-kms-connector.h
index b2a0fa9b49..50ffdd851e 100644
--- a/src/backends/native/meta-kms-connector.h
+++ b/src/backends/native/meta-kms-connector.h
@@ -61,18 +61,6 @@ typedef struct _MetaKmsConnectorState
 
 MetaKmsDevice * meta_kms_connector_get_device (MetaKmsConnector *connector);
 
-void meta_kms_connector_update_set_dpms_state (MetaKmsConnector *connector,
-                                               MetaKmsUpdate    *update,
-                                               uint64_t          state);
-
-void meta_kms_connector_set_underscanning (MetaKmsConnector *connector,
-                                           MetaKmsUpdate    *update,
-                                           uint64_t          hborder,
-                                           uint64_t          vborder);
-
-void meta_kms_connector_unset_underscanning (MetaKmsConnector *connector,
-                                             MetaKmsUpdate    *update);
-
 MetaConnectorType meta_kms_connector_get_connector_type (MetaKmsConnector *connector);
 
 uint32_t meta_kms_connector_get_id (MetaKmsConnector *connector);
diff --git a/src/backends/native/meta-kms-impl-simple.c b/src/backends/native/meta-kms-impl-simple.c
index 43283716da..ede7d6fbfa 100644
--- a/src/backends/native/meta-kms-impl-simple.c
+++ b/src/backends/native/meta-kms-impl-simple.c
@@ -26,7 +26,7 @@
 #include <gbm.h>
 #include <xf86drmMode.h>
 
-#include "backends/native/meta-kms-connector.h"
+#include "backends/native/meta-kms-connector-private.h"
 #include "backends/native/meta-kms-crtc.h"
 #include "backends/native/meta-kms-device-private.h"
 #include "backends/native/meta-kms-mode.h"
@@ -74,31 +74,40 @@ meta_kms_impl_simple_new (MetaKms  *kms,
 }
 
 static gboolean
-process_connector_property (MetaKmsImpl    *impl,
-                            MetaKmsUpdate  *update,
-                            gpointer        update_entry,
-                            GError        **error)
+set_connector_property (MetaKmsConnector      *connector,
+                        MetaKmsConnectorProp   prop,
+                        uint64_t               value,
+                        GError               **error)
 {
-  MetaKmsConnectorProperty *connector_property = update_entry;
-  MetaKmsConnector *connector = connector_property->connector;
   MetaKmsDevice *device = meta_kms_connector_get_device (connector);
   MetaKmsImplDevice *impl_device = meta_kms_device_get_impl_device (device);
+  uint32_t prop_id;
   int fd;
   int ret;
 
+  prop_id = meta_kms_connector_get_prop_id (connector, prop);
+  if (!prop_id)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                   "Property (%s) not found on connector %u",
+                   meta_kms_connector_get_prop_name (connector, prop),
+                   meta_kms_connector_get_id (connector));
+      return FALSE;
+    }
+
   fd = meta_kms_impl_device_get_fd (impl_device);
 
   ret = drmModeObjectSetProperty (fd,
                                   meta_kms_connector_get_id (connector),
                                   DRM_MODE_OBJECT_CONNECTOR,
-                                  connector_property->prop_id,
-                                  connector_property->value);
+                                  prop_id,
+                                  value);
   if (ret != 0)
     {
       g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret),
                    "Failed to set connector %u property %u: %s",
                    meta_kms_connector_get_id (connector),
-                   connector_property->prop_id,
+                   prop_id,
                    g_strerror (-ret));
       return FALSE;
     }
@@ -106,6 +115,55 @@ process_connector_property (MetaKmsImpl    *impl,
   return TRUE;
 }
 
+static gboolean
+process_connector_update (MetaKmsImpl    *impl,
+                          MetaKmsUpdate  *update,
+                          gpointer        update_entry,
+                          GError        **error)
+{
+  MetaKmsConnectorUpdate *connector_update = update_entry;
+  MetaKmsConnector *connector = connector_update->connector;
+
+  if (connector_update->dpms.has_update)
+    {
+      if (!set_connector_property (connector,
+                                   META_KMS_CONNECTOR_PROP_DPMS,
+                                   connector_update->dpms.state,
+                                   error))
+        return FALSE;
+    }
+
+  if (connector_update->underscanning.has_update &&
+      connector_update->underscanning.is_active)
+    {
+      if (!set_connector_property (connector,
+                                   META_KMS_CONNECTOR_PROP_UNDERSCAN,
+                                   1,
+                                   error))
+        return FALSE;
+      if (!set_connector_property (connector,
+                                   META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER,
+                                   connector_update->underscanning.hborder,
+                                   error))
+        return FALSE;
+      if (!set_connector_property (connector,
+                                   META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER,
+                                   connector_update->underscanning.vborder,
+                                   error))
+        return FALSE;
+    }
+  else if (connector_update->underscanning.has_update)
+    {
+      if (!set_connector_property (connector,
+                                   META_KMS_CONNECTOR_PROP_UNDERSCAN,
+                                   0,
+                                   error))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static CachedModeSet *
 cached_mode_set_new (GList                 *connectors,
                      const drmModeModeInfo *drm_mode)
@@ -953,8 +1011,8 @@ meta_kms_impl_simple_process_update (MetaKmsImpl   *impl,
 
   if (!process_entries (impl,
                         update,
-                        meta_kms_update_get_connector_properties (update),
-                        process_connector_property,
+                        meta_kms_update_get_connector_updates (update),
+                        process_connector_update,
                         &error))
     goto err_planes_not_assigned;
 
diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h
index d33d923277..c5931003f2 100644
--- a/src/backends/native/meta-kms-update-private.h
+++ b/src/backends/native/meta-kms-update-private.h
@@ -60,13 +60,22 @@ typedef struct _MetaKmsModeSet
   MetaKmsMode *mode;
 } MetaKmsModeSet;
 
-typedef struct _MetaKmsConnectorProperty
+typedef struct _MetaKmsConnectorUpdate
 {
-  MetaKmsDevice *device;
   MetaKmsConnector *connector;
-  uint32_t prop_id;
-  uint64_t value;
-} MetaKmsConnectorProperty;
+
+  struct {
+    gboolean has_update;
+    gboolean is_active;
+    uint64_t hborder;
+    uint64_t vborder;
+  } underscanning;
+
+  struct {
+    gboolean has_update;
+    uint64_t state;
+  } dpms;
+} MetaKmsConnectorUpdate;
 
 typedef struct _MetaKmsCrtcGamma
 {
@@ -102,11 +111,6 @@ void meta_kms_update_seal (MetaKmsUpdate *update);
 
 gboolean meta_kms_update_is_sealed (MetaKmsUpdate *update);
 
-void meta_kms_update_set_connector_property (MetaKmsUpdate    *update,
-                                             MetaKmsConnector *connector,
-                                             uint32_t          prop_id,
-                                             uint64_t          value);
-
 void meta_kms_update_set_crtc_gamma (MetaKmsUpdate  *update,
                                      MetaKmsCrtc    *crtc,
                                      int             size,
@@ -126,7 +130,7 @@ GList * meta_kms_update_get_mode_sets (MetaKmsUpdate *update);
 
 GList * meta_kms_update_get_page_flips (MetaKmsUpdate *update);
 
-GList * meta_kms_update_get_connector_properties (MetaKmsUpdate *update);
+GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update);
 
 GList * meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update);
 
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c
index ed1ddd0a73..8d9b4002e6 100644
--- a/src/backends/native/meta-kms-update.c
+++ b/src/backends/native/meta-kms-update.c
@@ -34,7 +34,7 @@ struct _MetaKmsUpdate
   GList *mode_sets;
   GList *plane_assignments;
   GList *page_flips;
-  GList *connector_properties;
+  GList *connector_updates;
   GList *crtc_gammas;
 };
 
@@ -204,25 +204,72 @@ meta_kms_update_mode_set (MetaKmsUpdate *update,
   update->mode_sets = g_list_prepend (update->mode_sets, mode_set);
 }
 
+static MetaKmsConnectorUpdate *
+ensure_connector_update (MetaKmsUpdate    *update,
+                        MetaKmsConnector *connector)
+{
+  GList *l;
+  MetaKmsConnectorUpdate *connector_update;
+
+  for (l = update->connector_updates; l; l = l->next)
+    {
+      connector_update = l->data;
+
+      if (connector_update->connector == connector)
+        return connector_update;
+    }
+
+  connector_update = g_new0 (MetaKmsConnectorUpdate, 1);
+  connector_update->connector = connector;
+
+  update->connector_updates = g_list_prepend (update->connector_updates,
+                                              connector_update);
+
+  return connector_update;
+}
+
 void
-meta_kms_update_set_connector_property (MetaKmsUpdate    *update,
-                                        MetaKmsConnector *connector,
-                                        uint32_t          prop_id,
-                                        uint64_t          value)
+meta_kms_update_set_underscanning (MetaKmsUpdate    *update,
+                                   MetaKmsConnector *connector,
+                                   uint64_t          hborder,
+                                   uint64_t          vborder)
 {
-  MetaKmsConnectorProperty *prop;
+  MetaKmsConnectorUpdate *connector_update;
 
   g_assert (!meta_kms_update_is_sealed (update));
 
-  prop = g_new0 (MetaKmsConnectorProperty, 1);
-  *prop = (MetaKmsConnectorProperty) {
-    .connector = connector,
-    .prop_id = prop_id,
-    .value = value,
-  };
+  connector_update = ensure_connector_update (update, connector);
+  connector_update->underscanning.has_update = TRUE;
+  connector_update->underscanning.is_active = TRUE;
+  connector_update->underscanning.hborder = hborder;
+  connector_update->underscanning.vborder = vborder;
+}
+
+void
+meta_kms_update_unset_underscanning (MetaKmsUpdate    *update,
+                                     MetaKmsConnector *connector)
+{
+  MetaKmsConnectorUpdate *connector_update;
+
+  g_assert (!meta_kms_update_is_sealed (update));
+
+  connector_update = ensure_connector_update (update, connector);
+  connector_update->underscanning.has_update = TRUE;
+  connector_update->underscanning.is_active = FALSE;
+}
+
+void
+meta_kms_update_set_dpms_state (MetaKmsUpdate    *update,
+                                MetaKmsConnector *connector,
+                                uint64_t          state)
+{
+  MetaKmsConnectorUpdate *connector_update;
+
+  g_assert (!meta_kms_update_is_sealed (update));
 
-  update->connector_properties = g_list_prepend (update->connector_properties,
-                                                 prop);
+  connector_update = ensure_connector_update (update, connector);
+  connector_update->dpms.has_update = TRUE;
+  connector_update->dpms.state = state;
 }
 
 static void
@@ -360,9 +407,9 @@ meta_kms_update_get_page_flips (MetaKmsUpdate *update)
 }
 
 GList *
-meta_kms_update_get_connector_properties (MetaKmsUpdate *update)
+meta_kms_update_get_connector_updates (MetaKmsUpdate *update)
 {
-  return update->connector_properties;
+  return update->connector_updates;
 }
 
 GList *
@@ -397,7 +444,7 @@ meta_kms_update_free (MetaKmsUpdate *update)
   g_list_free_full (update->mode_sets,
                     (GDestroyNotify) meta_kms_mode_set_free);
   g_list_free_full (update->page_flips, g_free);
-  g_list_free_full (update->connector_properties, g_free);
+  g_list_free_full (update->connector_updates, g_free);
   g_list_free_full (update->crtc_gammas, (GDestroyNotify) meta_kms_crtc_gamma_free);
 
   g_free (update);
diff --git a/src/backends/native/meta-kms-update.h b/src/backends/native/meta-kms-update.h
index 5d2b6ef7fe..fba90a7f76 100644
--- a/src/backends/native/meta-kms-update.h
+++ b/src/backends/native/meta-kms-update.h
@@ -85,6 +85,18 @@ MetaKmsUpdate * meta_kms_update_new (void);
 
 void meta_kms_update_free (MetaKmsUpdate *update);
 
+void meta_kms_update_set_underscanning (MetaKmsUpdate    *update,
+                                        MetaKmsConnector *connector,
+                                        uint64_t          hborder,
+                                        uint64_t          vborder);
+
+void meta_kms_update_unset_underscanning (MetaKmsUpdate    *update,
+                                          MetaKmsConnector *connector);
+
+void meta_kms_update_set_dpms_state (MetaKmsUpdate    *update,
+                                     MetaKmsConnector *connector,
+                                     uint64_t          state);
+
 void meta_kms_update_mode_set (MetaKmsUpdate *update,
                                MetaKmsCrtc   *crtc,
                                GList         *connectors,
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
index 57e34bb245..ca744ba413 100644
--- a/src/backends/native/meta-output-kms.c
+++ b/src/backends/native/meta-output-kms.c
@@ -32,6 +32,7 @@
 #include "backends/native/meta-kms-connector.h"
 #include "backends/native/meta-kms-device.h"
 #include "backends/native/meta-kms-mode.h"
+#include "backends/native/meta-kms-update.h"
 #include "backends/native/meta-kms-utils.h"
 #include "backends/native/meta-crtc-kms.h"
 #include "backends/native/meta-crtc-mode-kms.h"
@@ -81,18 +82,17 @@ meta_output_kms_set_underscan (MetaOutputKms *output_kms,
                meta_kms_connector_get_name (output_kms->kms_connector),
                hborder, vborder);
 
-      meta_kms_connector_set_underscanning (output_kms->kms_connector,
-                                            kms_update,
-                                            hborder,
-                                            vborder);
+      meta_kms_update_set_underscanning (kms_update,
+                                         output_kms->kms_connector,
+                                         hborder, vborder);
     }
   else
     {
       g_debug ("Unsetting underscan of connector %s",
                meta_kms_connector_get_name (output_kms->kms_connector));
 
-      meta_kms_connector_unset_underscanning (output_kms->kms_connector,
-                                              kms_update);
+      meta_kms_update_unset_underscanning (kms_update,
+                                           output_kms->kms_connector);
     }
 }
 
@@ -111,9 +111,9 @@ meta_output_kms_set_power_save_mode (MetaOutputKms *output_kms,
            meta_kms_connector_get_name (output_kms->kms_connector),
            dpms_state);
 
-  meta_kms_connector_update_set_dpms_state (output_kms->kms_connector,
-                                            kms_update,
-                                            dpms_state);
+  meta_kms_update_set_dpms_state (kms_update,
+                                  output_kms->kms_connector,
+                                  dpms_state);
 }
 
 gboolean


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