Blame SOURCES/0001-output-kms-Add-more-heuristics-to-decide-when-to-off.patch

835957
From 86000c32d64cea7be2e6ed911cb9ea5df1306c0e Mon Sep 17 00:00:00 2001
835957
From: Mario Limonciello <mario.limonciello@amd.com>
835957
Date: Thu, 18 Aug 2022 13:36:20 -0500
835957
Subject: [PATCH 1/2] output/kms: Add more heuristics to decide when to offer
835957
 fallback modes
835957
835957
If the panel is connected via eDP and supports more than one mode
835957
at different resolutions don't try to add more.
835957
835957
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2586>
835957
(cherry picked from commit 96aa0fb8536eca579ceb1b17d83e19cf9e3e9e81)
835957
(cherry picked from commit 877cc3eb7d44e2886395151f763ec09bea350444)
835957
---
835957
 src/backends/native/meta-output-kms.c | 56 +++++++++++++++++++++------
835957
 1 file changed, 44 insertions(+), 12 deletions(-)
835957
835957
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
835957
index f35cdf04e1..9adc20bfd9 100644
835957
--- a/src/backends/native/meta-output-kms.c
835957
+++ b/src/backends/native/meta-output-kms.c
835957
@@ -224,6 +224,45 @@ compare_modes (const void *one,
835957
                     meta_crtc_mode_get_name (crtc_mode_two));
835957
 }
835957
 
835957
+static gboolean
835957
+are_all_modes_equally_sized (MetaOutputInfo *output_info)
835957
+{
835957
+  const MetaCrtcModeInfo *base =
835957
+    meta_crtc_mode_get_info (output_info->modes[0]);
835957
+  int i;
835957
+
835957
+  for (i = 1; i < output_info->n_modes; i++)
835957
+    {
835957
+      const MetaCrtcModeInfo *mode_info =
835957
+        meta_crtc_mode_get_info (output_info->modes[i]);
835957
+
835957
+      if (base->width != mode_info->width ||
835957
+          base->height != mode_info->height)
835957
+        return FALSE;
835957
+    }
835957
+
835957
+  return TRUE;
835957
+}
835957
+
835957
+static void
835957
+maybe_add_fallback_modes (const MetaKmsConnectorState *connector_state,
835957
+                          MetaOutputInfo              *output_info,
835957
+                          MetaGpuKms                  *gpu_kms,
835957
+                          MetaKmsConnector            *kms_connector)
835957
+{
835957
+  if (!connector_state->has_scaling)
835957
+    return;
835957
+
835957
+  if (output_info->connector_type == DRM_MODE_CONNECTOR_eDP &&
835957
+      !are_all_modes_equally_sized (output_info))
835957
+    return;
835957
+
835957
+  meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s",
835957
+              meta_kms_connector_get_id (kms_connector),
835957
+              meta_gpu_kms_get_file_path (gpu_kms));
835957
+  add_common_modes (output_info, gpu_kms);
835957
+}
835957
+
835957
 static gboolean
835957
 init_output_modes (MetaOutputInfo    *output_info,
835957
                    MetaGpuKms        *gpu_kms,
835957
@@ -252,14 +291,7 @@ init_output_modes (MetaOutputInfo    *output_info,
835957
         output_info->preferred_mode = output_info->modes[i];
835957
     }
835957
 
835957
-  if (connector_state->has_scaling)
835957
-    {
835957
-      meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s",
835957
-                  meta_kms_connector_get_id (kms_connector),
835957
-                  meta_gpu_kms_get_file_path (gpu_kms));
835957
-      add_common_modes (output_info, gpu_kms);
835957
-    }
835957
-
835957
+  maybe_add_fallback_modes (connector_state, output_info, gpu_kms, kms_connector);
835957
   if (!output_info->modes)
835957
     {
835957
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
835957
@@ -322,6 +354,10 @@ meta_output_kms_new (MetaGpuKms        *gpu_kms,
835957
       output_info->height_mm = connector_state->height_mm;
835957
     }
835957
 
835957
+  drm_connector_type = meta_kms_connector_get_connector_type (kms_connector);
835957
+  output_info->connector_type =
835957
+    meta_kms_connector_type_from_drm (drm_connector_type);
835957
+
835957
   if (!init_output_modes (output_info, gpu_kms, kms_connector, error))
835957
     return NULL;
835957
 
835957
@@ -349,10 +385,6 @@ meta_output_kms_new (MetaGpuKms        *gpu_kms,
835957
 
835957
   meta_output_info_parse_edid (output_info, connector_state->edid_data);
835957
 
835957
-  drm_connector_type = meta_kms_connector_get_connector_type (kms_connector);
835957
-  output_info->connector_type =
835957
-    meta_kms_connector_type_from_drm (drm_connector_type);
835957
-
835957
   output_info->tile_info = connector_state->tile_info;
835957
 
835957
   output = g_object_new (META_TYPE_OUTPUT_KMS,
835957
-- 
835957
2.37.1
835957