[mutter/wip/laney/drmmodegetresources-handle-failure-2] gpu: Add a new "can_have_outputs" vfunc and bail out if all GPUs say no



commit f6ce7bdf46ae9bbcd2137d1cd4c488fb652f98ff
Author: Iain Lane <iainl gnome org>
Date:   Mon Aug 13 11:22:22 2018 +0100

    gpu: Add a new "can_have_outputs" vfunc and bail out if all GPUs say no
    
    We need a way for mutter to exit if no available GPUs are going to work.
    For example if gdm starts gnome-shell and we're using a DRM driver that
    doesn't work with KMS then we should exit so that GDM can try with Xorg,
    rather than operating in headless mode.
    
    Related: https://gitlab.gnome.org/GNOME/mutter/issues/223

 src/backends/meta-gpu.c             |  8 ++++++++
 src/backends/meta-gpu.h             |  1 +
 src/backends/meta-monitor-manager.c | 21 +++++++++++++++++++++
 src/backends/native/meta-gpu-kms.c  | 11 +++++++++++
 4 files changed, 41 insertions(+)
---
diff --git a/src/backends/meta-gpu.c b/src/backends/meta-gpu.c
index 3577391e5..1264362fd 100644
--- a/src/backends/meta-gpu.c
+++ b/src/backends/meta-gpu.c
@@ -203,6 +203,12 @@ meta_gpu_init (MetaGpu *gpu)
 {
 }
 
+static gboolean
+meta_gpu_can_have_outputs_default (MetaGpu *gpu G_GNUC_UNUSED)
+{
+  return TRUE;
+}
+
 static void
 meta_gpu_class_init (MetaGpuClass *klass)
 {
@@ -212,6 +218,8 @@ meta_gpu_class_init (MetaGpuClass *klass)
   object_class->get_property = meta_gpu_get_property;
   object_class->finalize = meta_gpu_finalize;
 
+  klass->can_have_outputs = meta_gpu_can_have_outputs_default;
+
   obj_props[PROP_MONITOR_MANAGER] =
     g_param_spec_object ("monitor-manager",
                          "monitor-manager",
diff --git a/src/backends/meta-gpu.h b/src/backends/meta-gpu.h
index 4badcbd26..29fc576bd 100644
--- a/src/backends/meta-gpu.h
+++ b/src/backends/meta-gpu.h
@@ -35,6 +35,7 @@ struct _MetaGpuClass
 
   gboolean (* read_current) (MetaGpu  *gpu,
                              GError  **error);
+  gboolean (* can_have_outputs) (MetaGpu  *gpu);
 };
 
 int meta_gpu_get_kms_fd (MetaGpu *gpu);
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 3850dd0b9..d973477cd 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -686,6 +686,21 @@ experimental_features_changed (MetaSettings           *settings,
   meta_settings_update_ui_scaling_factor (settings);
 }
 
+static gboolean
+meta_monitor_manager_can_have_outputs (MetaMonitorManager *manager)
+{
+  GList *l;
+
+  for (l = manager->gpus; l; l = l->next)
+    {
+      MetaGpu *gpu = META_GPU (l->data);
+      if (META_GPU_GET_CLASS (gpu)->can_have_outputs (gpu))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 void
 meta_monitor_manager_setup (MetaMonitorManager *manager)
 {
@@ -695,6 +710,12 @@ meta_monitor_manager_setup (MetaMonitorManager *manager)
 
   meta_monitor_manager_read_current_state (manager);
 
+  if (!meta_monitor_manager_can_have_outputs (manager))
+    {
+      g_critical ("None of the present GPUs can have outputs. Cannot continue.");
+      meta_exit (META_EXIT_ERROR);
+    }
+
   meta_monitor_manager_ensure_initial_config (manager);
 
   manager->in_init = FALSE;
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
index 36e08857a..5cea982f1 100644
--- a/src/backends/native/meta-gpu-kms.c
+++ b/src/backends/native/meta-gpu-kms.c
@@ -812,6 +812,16 @@ meta_gpu_kms_read_current (MetaGpu  *gpu,
   return TRUE;
 }
 
+static gboolean
+meta_gpu_kms_can_have_outputs (MetaGpu  *gpu)
+{
+  MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
+
+  /* This means we assume that the GPU *can* have outputs, until we have called
+   * meta_gpu_read_current () to find out it can't. */
+  return !gpu_kms->resources_init_failed_before;
+}
+
 MetaGpuKms *
 meta_gpu_kms_new (MetaMonitorManagerKms  *monitor_manager_kms,
                   const char             *kms_file_path,
@@ -889,4 +899,5 @@ meta_gpu_kms_class_init (MetaGpuKmsClass *klass)
   object_class->finalize = meta_gpu_kms_finalize;
 
   gpu_class->read_current = meta_gpu_kms_read_current;
+  gpu_class->can_have_outputs = meta_gpu_kms_can_have_outputs;
 }


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