diff options
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/native/meta-gpu-kms.c | 18 | ||||
-rw-r--r-- | src/backends/native/meta-gpu-kms.h | 3 | ||||
-rw-r--r-- | src/backends/native/meta-monitor-manager-kms.c | 11 |
3 files changed, 31 insertions, 1 deletions
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c index 9de9fc63e..26203fb60 100644 --- a/src/backends/native/meta-gpu-kms.c +++ b/src/backends/native/meta-gpu-kms.c @@ -812,6 +812,22 @@ meta_gpu_kms_read_current (MetaGpu *gpu, return TRUE; } +gboolean +meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms, + GError **error) +{ + if (gpu_kms->n_connectors == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "GPU has 0 usable connectors, can't use it"); + return FALSE; + } + + return TRUE; +} + MetaGpuKms * meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms, const char *kms_file_path, @@ -840,6 +856,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..d15b9435c 100644 --- a/src/backends/native/meta-gpu-kms.h +++ b/src/backends/native/meta-gpu-kms.h @@ -53,6 +53,9 @@ 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, + GError **error); + 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..df71d7e19 100644 --- a/src/backends/native/meta-monitor-manager-kms.c +++ b/src/backends/native/meta-monitor-manager-kms.c @@ -663,7 +663,8 @@ meta_monitor_manager_kms_initable_init (GInitable *initable, primary_gpu_path, error); g_list_free_full (gpu_paths, g_free); - if (!manager_kms->primary_gpu) + if (!manager_kms->primary_gpu || + !meta_gpu_kms_can_have_outputs (manager_kms->primary_gpu, error)) return FALSE; meta_monitor_manager_kms_connect_uevent_handler (manager_kms); @@ -686,6 +687,14 @@ meta_monitor_manager_kms_initable_init (GInitable *initable, continue; } + if (!meta_gpu_kms_can_have_outputs (gpu_kms, &secondary_error)) + { + g_warning ("Couldn't add secondary gpu '%s': %s", + gpu_path, secondary_error->message); + g_clear_object (&gpu_kms); + continue; + } + meta_monitor_manager_add_gpu (META_MONITOR_MANAGER (manager_kms), META_GPU (gpu_kms)); } |