[mutter] kms: Only update a device state if it contains the changed crtc/connector
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] kms: Only update a device state if it contains the changed crtc/connector
- Date: Mon, 20 Sep 2021 16:07:16 +0000 (UTC)
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]