[mutter] output/kms: Add more heuristics to decide when to offer fallback modes



commit 96aa0fb8536eca579ceb1b17d83e19cf9e3e9e81
Author: Mario Limonciello <mario limonciello amd com>
Date:   Thu Aug 18 13:36:20 2022 -0500

    output/kms: Add more heuristics to decide when to offer fallback modes
    
    If the panel is connected via eDP and supports more than one mode
    at different resolutions don't try to add more.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2586>

 src/backends/native/meta-output-kms.c | 56 +++++++++++++++++++++++++++--------
 1 file changed, 44 insertions(+), 12 deletions(-)
---
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
index 2062a20cf7..709590ed48 100644
--- a/src/backends/native/meta-output-kms.c
+++ b/src/backends/native/meta-output-kms.c
@@ -316,6 +316,45 @@ compare_modes (const void *one,
                     meta_crtc_mode_get_name (crtc_mode_two));
 }
 
+static gboolean
+are_all_modes_equally_sized (MetaOutputInfo *output_info)
+{
+  const MetaCrtcModeInfo *base =
+    meta_crtc_mode_get_info (output_info->modes[0]);
+  int i;
+
+  for (i = 1; i < output_info->n_modes; i++)
+    {
+      const MetaCrtcModeInfo *mode_info =
+        meta_crtc_mode_get_info (output_info->modes[i]);
+
+      if (base->width != mode_info->width ||
+          base->height != mode_info->height)
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
+static void
+maybe_add_fallback_modes (const MetaKmsConnectorState *connector_state,
+                          MetaOutputInfo              *output_info,
+                          MetaGpuKms                  *gpu_kms,
+                          MetaKmsConnector            *kms_connector)
+{
+  if (!connector_state->has_scaling)
+    return;
+
+  if (output_info->connector_type == DRM_MODE_CONNECTOR_eDP &&
+      !are_all_modes_equally_sized (output_info))
+    return;
+
+  meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s",
+              meta_kms_connector_get_id (kms_connector),
+              meta_gpu_kms_get_file_path (gpu_kms));
+  add_common_modes (output_info, gpu_kms);
+}
+
 static gboolean
 init_output_modes (MetaOutputInfo    *output_info,
                    MetaGpuKms        *gpu_kms,
@@ -344,14 +383,7 @@ init_output_modes (MetaOutputInfo    *output_info,
         output_info->preferred_mode = output_info->modes[i];
     }
 
-  if (connector_state->has_scaling)
-    {
-      meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s",
-                  meta_kms_connector_get_id (kms_connector),
-                  meta_gpu_kms_get_file_path (gpu_kms));
-      add_common_modes (output_info, gpu_kms);
-    }
-
+  maybe_add_fallback_modes (connector_state, output_info, gpu_kms, kms_connector);
   if (!output_info->modes)
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
@@ -415,6 +447,10 @@ meta_output_kms_new (MetaGpuKms        *gpu_kms,
       output_info->height_mm = connector_state->height_mm;
     }
 
+  drm_connector_type = meta_kms_connector_get_connector_type (kms_connector);
+  output_info->connector_type =
+    meta_kms_connector_type_from_drm (drm_connector_type);
+
   if (!init_output_modes (output_info, gpu_kms, kms_connector, error))
     return NULL;
 
@@ -449,10 +485,6 @@ meta_output_kms_new (MetaGpuKms        *gpu_kms,
 
   meta_output_info_parse_edid (output_info, connector_state->edid_data);
 
-  drm_connector_type = meta_kms_connector_get_connector_type (kms_connector);
-  output_info->connector_type =
-    meta_kms_connector_type_from_drm (drm_connector_type);
-
   output_info->tile_info = connector_state->tile_info;
 
   output = g_object_new (META_TYPE_OUTPUT_KMS,


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