diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c index b3fcc71bd..a04ad1e08 100644 --- a/src/backends/native/meta-kms-device.c +++ b/src/backends/native/meta-kms-device.c @@ -849,3 +849,27 @@ meta_kms_device_class_init (MetaKmsDeviceClass *klass) G_TYPE_NONE, 1, META_TYPE_KMS_CRTC); } + +gboolean +meta_kms_device_has_connected_builtin_panel (MetaKmsDevice *device) +{ + GList *l; + + for (l = device->connectors; l; l = l->next) + { + MetaKmsConnector *connector = META_KMS_CONNECTOR (l->data); + + if (!meta_kms_connector_get_current_state (connector)) + continue; + + switch (meta_kms_connector_get_connector_type (connector)) + { + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_eDP: + case DRM_MODE_CONNECTOR_DSI: + return TRUE; + } + } + + return FALSE; +} diff --git a/src/backends/native/meta-kms-device.h b/src/backends/native/meta-kms-device.h index 0b39f7df5..6dfa5a76a 100644 --- a/src/backends/native/meta-kms-device.h +++ b/src/backends/native/meta-kms-device.h @@ -107,3 +107,5 @@ MetaKmsDevice * meta_kms_device_new (MetaKms *kms, const char *path, MetaKmsDeviceFlag flags, GError **error); + +gboolean meta_kms_device_has_connected_builtin_panel (MetaKmsDevice *device); diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 3bf7522c2..02451e2f1 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -2205,6 +2205,21 @@ choose_primary_gpu_unchecked (MetaBackend *backend, } } + /* Then prefer a GPU with a builtin panel connected to it. */ + for (l = gpus; l; l = l->next) + { + MetaGpuKms *gpu_kms = META_GPU_KMS (l->data); + MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms); + + if (meta_kms_device_has_connected_builtin_panel (kms_device) && + (allow_sw == 1 || + gpu_kms_is_hardware_rendering (renderer_native, gpu_kms))) + { + g_message ("GPU %s selected primary from builtin panel presence", + meta_gpu_kms_get_file_path (gpu_kms)); + return gpu_kms; + } + } /* Prefer a platform device */ for (l = gpus; l; l = l->next)