[mutter/wip/laney/drmmodegetresources-handle-failure-2] gpu: Add a new "can_have_outputs" vfunc and bail out if all GPUs say no
- From: Iain Lane <iainl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/laney/drmmodegetresources-handle-failure-2] gpu: Add a new "can_have_outputs" vfunc and bail out if all GPUs say no
- Date: Mon, 13 Aug 2018 10:32:02 +0000 (UTC)
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]