From 91ed95ab6fe4740c8189e9824a3e0cec55be48ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 4 Aug 2020 19:25:37 +0200 Subject: [PATCH] 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: --- 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 87f302604..e76aaca15 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 *