[mutter/wip/laney/drmmodegetresources-handle-failure-2: 3/3] monitor-manager-kms: Check if GPUs can have outputs



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

    monitor-manager-kms: Check if GPUs can have outputs
    
    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/native/meta-gpu-kms.c             |  8 ++++++++
 src/backends/native/meta-gpu-kms.h             |  2 ++
 src/backends/native/meta-monitor-manager-kms.c | 20 ++++++++++++++++++++
 3 files changed, 30 insertions(+)
---
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
index 20e927893..c3c5d0d68 100644
--- a/src/backends/native/meta-gpu-kms.c
+++ b/src/backends/native/meta-gpu-kms.c
@@ -812,6 +812,12 @@ meta_gpu_kms_read_current (MetaGpu  *gpu,
   return TRUE;
 }
 
+gboolean
+meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms)
+{
+  return gpu_kms->n_connectors > 0;
+}
+
 MetaGpuKms *
 meta_gpu_kms_new (MetaMonitorManagerKms  *monitor_manager_kms,
                   const char             *kms_file_path,
@@ -840,6 +846,8 @@ meta_gpu_kms_new (MetaMonitorManagerKms  *monitor_manager_kms,
 
   drmSetClientCap (gpu_kms->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
 
+  meta_gpu_kms_read_current (META_GPU (gpu_kms), NULL);
+
   source = g_source_new (&kms_event_funcs, sizeof (MetaKmsSource));
   kms_source = (MetaKmsSource *) source;
   kms_source->fd_tag = g_source_add_unix_fd (source,
diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h
index ef1f17ce8..5f77f191a 100644
--- a/src/backends/native/meta-gpu-kms.h
+++ b/src/backends/native/meta-gpu-kms.h
@@ -53,6 +53,8 @@ gboolean meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms,
                                        int         y,
                                        uint32_t    fb_id);
 
+gboolean meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms);
+
 gboolean meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
                                       MetaCrtc   *crtc);
 
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 6c7a87f01..766dc0c79 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -642,10 +642,12 @@ meta_monitor_manager_kms_initable_init (GInitable    *initable,
                                         GError      **error)
 {
   MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (initable);
+  MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
   const char *subsystems[2] = { "drm", NULL };
   GList *gpu_paths;
   g_autofree char *primary_gpu_path = NULL;
   GList *l;
+  gboolean can_have_outputs;
 
   manager_kms->udev = g_udev_client_new (subsystems);
 
@@ -691,6 +693,24 @@ meta_monitor_manager_kms_initable_init (GInitable    *initable,
     }
   g_list_free_full (gpu_paths, g_free);
 
+  can_have_outputs = FALSE;
+  for (l = meta_monitor_manager_get_gpus (manager); l; l = l->next)
+    {
+      MetaGpuKms *gpu_kms = l->data;
+
+      if (meta_gpu_kms_can_have_outputs (gpu_kms))
+        {
+          can_have_outputs = TRUE;
+          break;
+        }
+    }
+  if (!can_have_outputs)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+                   "No GPUs with outputs found");
+      return FALSE;
+    }
+
   return TRUE;
 }
 


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