[mutter] kms: Only update a device state if it contains the changed crtc/connector



commit 91ed95ab6fe4740c8189e9824a3e0cec55be48ab
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Tue Aug 4 19:25:37 2020 +0200

    kms: Only update a device state if it contains the changed crtc/connector
    
    On hotplug events we may receive a "CRTC" or "CONNECTOR" property that
    indicates which crtc/connector property ID has changed.
    
    In such case, instead of update data for all the devices, only update the
    device containing the relative connector.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1964>

 src/backends/native/meta-kms.c | 56 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 47 insertions(+), 9 deletions(-)
---
diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c
index 87f302604f..e76aaca154 100644
--- a/src/backends/native/meta-kms.c
+++ b/src/backends/native/meta-kms.c
@@ -565,8 +565,16 @@ meta_kms_is_waiting_for_impl_task (MetaKms *kms)
   return kms->waiting_for_impl_task;
 }
 
+typedef struct _UpdateStatesData
+{
+  const char *device_path;
+  uint32_t crtc_id;
+  uint32_t connector_id;
+} UpdateStatesData;
+
 static MetaKmsUpdateChanges
-meta_kms_update_states_in_impl (MetaKms  *kms)
+meta_kms_update_states_in_impl (MetaKms          *kms,
+                                UpdateStatesData *update_data)
 {
   MetaKmsUpdateChanges changes = META_KMS_UPDATE_CHANGE_NONE;
   GList *l;
@@ -582,6 +590,20 @@ meta_kms_update_states_in_impl (MetaKms  *kms)
   for (l = kms->devices; l; l = l->next)
     {
       MetaKmsDevice *kms_device = META_KMS_DEVICE (l->data);
+      const char *kms_device_path = meta_kms_device_get_path (kms_device);
+
+      if (update_data->device_path &&
+          g_strcmp0 (kms_device_path, update_data->device_path) != 0)
+        continue;
+
+      if (update_data->crtc_id > 0 &&
+          !meta_kms_device_find_crtc_in_impl (kms_device, update_data->crtc_id))
+        continue;
+
+      if (update_data->connector_id > 0 &&
+          !meta_kms_device_find_connector_in_impl (kms_device,
+                                                   update_data->connector_id))
+        continue;
 
       changes |= meta_kms_device_update_states_in_impl (kms_device);
     }
@@ -594,26 +616,42 @@ update_states_in_impl (MetaKmsImpl  *impl,
                        gpointer      user_data,
                        GError      **error)
 {
+  UpdateStatesData *data = user_data;
   MetaKms *kms = meta_kms_impl_get_kms (impl);
 
-  return GUINT_TO_POINTER (meta_kms_update_states_in_impl (kms));
+  return GUINT_TO_POINTER (meta_kms_update_states_in_impl (kms, data));
 }
 
 static MetaKmsUpdateChanges
-meta_kms_update_states_sync (MetaKms  *kms)
+meta_kms_update_states_sync (MetaKms     *kms,
+                             GUdevDevice *udev_device)
 {
+  UpdateStatesData data = {};
   gpointer ret;
 
-  ret = meta_kms_run_impl_task_sync (kms, update_states_in_impl, NULL, NULL);
+  if (udev_device)
+    {
+      data.device_path = g_udev_device_get_device_file (udev_device);
+      data.crtc_id =
+        CLAMP (g_udev_device_get_property_as_int (udev_device, "CRTC"),
+               0, UINT32_MAX);
+      data.connector_id =
+        CLAMP (g_udev_device_get_property_as_int (udev_device, "CONNECTOR"),
+               0, UINT32_MAX);
+    }
+
+  ret = meta_kms_run_impl_task_sync (kms, update_states_in_impl, &data, NULL);
+
   return GPOINTER_TO_UINT (ret);
 }
 
 static void
-handle_hotplug_event (MetaKms *kms)
+handle_hotplug_event (MetaKms     *kms,
+                      GUdevDevice *udev_device)
 {
   MetaKmsUpdateChanges changes;
 
-  changes = meta_kms_update_states_sync (kms);
+  changes = meta_kms_update_states_sync (kms, udev_device);
 
   if (changes != META_KMS_UPDATE_CHANGE_NONE)
     g_signal_emit (kms, signals[RESOURCES_CHANGED], 0, changes);
@@ -622,7 +660,7 @@ handle_hotplug_event (MetaKms *kms)
 void
 meta_kms_resume (MetaKms *kms)
 {
-  handle_hotplug_event (kms);
+  handle_hotplug_event (kms, NULL);
 }
 
 static void
@@ -630,7 +668,7 @@ on_udev_hotplug (MetaUdev    *udev,
                  GUdevDevice *udev_device,
                  MetaKms     *kms)
 {
-  handle_hotplug_event (kms);
+  handle_hotplug_event (kms, udev_device);
 }
 
 static void
@@ -638,7 +676,7 @@ on_udev_device_removed (MetaUdev    *udev,
                         GUdevDevice *device,
                         MetaKms     *kms)
 {
-  handle_hotplug_event (kms);
+  handle_hotplug_event (kms, NULL);
 }
 
 MetaBackend *


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