diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c index 57f1f0c9f..937d44a2c 100644 --- a/src/backends/native/meta-kms-device.c +++ b/src/backends/native/meta-kms-device.c @@ -39,6 +39,8 @@ struct _MetaKmsDevice MetaKmsDeviceFlag flags; char *path; + char *driver_name; + char *driver_description; GList *crtcs; GList *connectors; @@ -67,6 +69,18 @@ meta_kms_device_get_path (MetaKmsDevice *device) return device->path; } +const char * +meta_kms_device_get_driver_name (MetaKmsDevice *device) +{ + return device->driver_name; +} + +const char * +meta_kms_device_get_driver_description (MetaKmsDevice *device) +{ + return device->driver_description; +} + MetaKmsDeviceFlag meta_kms_device_get_flags (MetaKmsDevice *device) { @@ -200,6 +214,8 @@ typedef struct _CreateImplDeviceData GList *out_connectors; GList *out_planes; MetaKmsDeviceCaps out_caps; + char *out_driver_name; + char *out_driver_description; } CreateImplDeviceData; static gpointer @@ -219,6 +235,10 @@ create_impl_device_in_impl (MetaKmsImpl *impl, data->out_connectors = meta_kms_impl_device_copy_connectors (impl_device); data->out_planes = meta_kms_impl_device_copy_planes (impl_device); data->out_caps = *meta_kms_impl_device_get_caps (impl_device); + data->out_driver_name = + g_strdup (meta_kms_impl_device_get_driver_name (impl_device)); + data->out_driver_description = + g_strdup (meta_kms_impl_device_get_driver_description (impl_device)); return GINT_TO_POINTER (TRUE); } @@ -262,6 +282,8 @@ meta_kms_device_new (MetaKms *kms, device->connectors = data.out_connectors; device->planes = data.out_planes; device->caps = data.out_caps; + device->driver_name = data.out_driver_name; + device->driver_description = data.out_driver_description; return device; } diff --git a/src/backends/native/meta-kms-device.h b/src/backends/native/meta-kms-device.h index 10fe787f1..a346c01e3 100644 --- a/src/backends/native/meta-kms-device.h +++ b/src/backends/native/meta-kms-device.h @@ -33,6 +33,10 @@ int meta_kms_device_leak_fd (MetaKmsDevice *device); const char * meta_kms_device_get_path (MetaKmsDevice *device); +const char * meta_kms_device_get_driver_name (MetaKmsDevice *device); + +const char * meta_kms_device_get_driver_description (MetaKmsDevice *device); + MetaKmsDeviceFlag meta_kms_device_get_flags (MetaKmsDevice *device); gboolean meta_kms_device_get_cursor_size (MetaKmsDevice *device, diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 80d7a8b01..6beef4f52 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -45,6 +45,9 @@ struct _MetaKmsImplDevice int fd; GSource *fd_source; + char *driver_name; + char *driver_description; + GList *crtcs; GList *connectors; GList *planes; @@ -84,6 +87,18 @@ meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device) return &impl_device->caps; } +const char * +meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device) +{ + return impl_device->driver_name; +} + +const char * +meta_kms_impl_device_get_driver_description (MetaKmsImplDevice *impl_device) +{ + return impl_device->driver_description; +} + static void page_flip_handler (int fd, unsigned int sequence, @@ -357,6 +372,22 @@ init_planes (MetaKmsImplDevice *impl_device) impl_device->planes = g_list_reverse (impl_device->planes); } +static void +init_info (MetaKmsImplDevice *impl_device) +{ + drmVersion *drm_version; + + drm_version = drmGetVersion (impl_device->fd); + if (!drm_version) + return; + + impl_device->driver_name = g_strndup (drm_version->name, + drm_version->name_len); + impl_device->driver_description = g_strndup (drm_version->desc, + drm_version->desc_len); + drmFreeVersion (drm_version); +} + void meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device) { @@ -435,6 +466,7 @@ meta_kms_impl_device_new (MetaKmsDevice *device, init_crtcs (impl_device, drm_resources); init_planes (impl_device); + init_info (impl_device); update_connectors (impl_device, drm_resources); @@ -484,6 +516,8 @@ meta_kms_impl_device_finalize (GObject *object) g_list_free_full (impl_device->planes, g_object_unref); g_list_free_full (impl_device->crtcs, g_object_unref); g_list_free_full (impl_device->connectors, g_object_unref); + g_free (impl_device->driver_name); + g_free (impl_device->driver_description); G_OBJECT_CLASS (meta_kms_impl_device_parent_class)->finalize (object); } diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h index e8c08f19f..e55a95b58 100644 --- a/src/backends/native/meta-kms-impl-device.h +++ b/src/backends/native/meta-kms-impl-device.h @@ -50,6 +50,10 @@ GList * meta_kms_impl_device_copy_planes (MetaKmsImplDevice *impl_device); const MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device); +const char * meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device); + +const char * meta_kms_impl_device_get_driver_description (MetaKmsImplDevice *impl_device); + gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice *impl_device, GError **error);