[mutter] kms/device: Get driver details before constructing impl device



commit deb8f07c651f0c6b4893c69c4415afb97b1a3ffa
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Tue Sep 29 16:39:12 2020 +0200

    kms/device: Get driver details before constructing impl device
    
    Eventually the type of impl device will depend on the driver details, so
    get that information before constructing the impl device. This commit
    doesn't introduce any new usage of the details, it just prepares for
    the future.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>

 src/backends/native/meta-kms-device.c      | 30 ++++++++++++++++++
 src/backends/native/meta-kms-impl-device.c | 49 ++++++++++++++++++------------
 2 files changed, 60 insertions(+), 19 deletions(-)
---
diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c
index 5849eebba8..37e7fcd2f0 100644
--- a/src/backends/native/meta-kms-device.c
+++ b/src/backends/native/meta-kms-device.c
@@ -236,6 +236,26 @@ typedef struct _CreateImplDeviceData
   char *out_driver_description;
 } CreateImplDeviceData;
 
+static gboolean
+get_driver_info (int    fd,
+                 char **name,
+                 char **description)
+{
+  drmVersion *drm_version;
+
+  drm_version = drmGetVersion (fd);
+  if (!drm_version)
+    return FALSE;
+
+  *name = g_strndup (drm_version->name,
+                     drm_version->name_len);
+  *description = g_strndup (drm_version->desc,
+                            drm_version->desc_len);
+  drmFreeVersion (drm_version);
+
+  return TRUE;
+}
+
 static MetaKmsImplDevice *
 meta_create_kms_impl_device (MetaKmsDevice  *device,
                              MetaKmsImpl    *impl,
@@ -243,6 +263,8 @@ meta_create_kms_impl_device (MetaKmsDevice  *device,
                              GError        **error)
 {
   int ret;
+  g_autofree char *driver_name = NULL;
+  g_autofree char *driver_description = NULL;
 
   meta_assert_in_kms_impl (meta_kms_impl_get_kms (impl));
 
@@ -255,10 +277,18 @@ meta_create_kms_impl_device (MetaKmsDevice  *device,
       return NULL;
     }
 
+  if (!get_driver_info (fd, &driver_name, &driver_description))
+    {
+      driver_name = g_strdup ("unknown");
+      driver_description = g_strdup ("Unknown");
+    }
+
   return g_initable_new (META_TYPE_KMS_IMPL_DEVICE_SIMPLE, NULL, error,
                          "device", device,
                          "impl", impl,
                          "fd", fd,
+                         "driver-name", driver_name,
+                         "driver-description", driver_description,
                          NULL);
 }
 
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index c0989ec587..c180aa111d 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -45,6 +45,8 @@ enum
   PROP_DEVICE,
   PROP_IMPL,
   PROP_FD,
+  PROP_DRIVER_NAME,
+  PROP_DRIVER_DESCRIPTION,
 
   N_PROPS
 };
@@ -549,24 +551,6 @@ init_fallback_modes (MetaKmsImplDevice *impl_device)
   priv->fallback_modes = g_list_reverse (modes);
 }
 
-static void
-init_info (MetaKmsImplDevice *impl_device)
-{
-  MetaKmsImplDevicePrivate *priv =
-    meta_kms_impl_device_get_instance_private (impl_device);
-  drmVersion *drm_version;
-
-  drm_version = drmGetVersion (priv->fd);
-  if (!drm_version)
-    return;
-
-  priv->driver_name = g_strndup (drm_version->name,
-                                 drm_version->name_len);
-  priv->driver_description = g_strndup (drm_version->desc,
-                                        drm_version->desc_len);
-  drmFreeVersion (drm_version);
-}
-
 void
 meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device)
 {
@@ -693,6 +677,12 @@ meta_kms_impl_device_get_property (GObject    *object,
     case PROP_FD:
       g_value_set_int (value, priv->fd);
       break;
+    case PROP_DRIVER_NAME:
+      g_value_set_string (value, priv->driver_name);
+      break;
+    case PROP_DRIVER_DESCRIPTION:
+      g_value_set_string (value, priv->driver_name);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -720,6 +710,12 @@ meta_kms_impl_device_set_property (GObject      *object,
     case PROP_FD:
       priv->fd = g_value_get_int (value);
       break;
+    case PROP_DRIVER_NAME:
+      priv->driver_name = g_value_dup_string (value);
+      break;
+    case PROP_DRIVER_DESCRIPTION:
+      priv->driver_description = g_value_dup_string (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -769,7 +765,6 @@ meta_kms_impl_device_initable_init (GInitable     *initable,
 
   init_crtcs (impl_device, drm_resources);
   init_planes (impl_device);
-  init_info (impl_device);
 
   init_fallback_modes (impl_device);
 
@@ -829,5 +824,21 @@ meta_kms_impl_device_class_init (MetaKmsImplDeviceClass *klass)
                       G_PARAM_READWRITE |
                       G_PARAM_CONSTRUCT_ONLY |
                       G_PARAM_STATIC_STRINGS);
+  obj_props[PROP_DRIVER_NAME] =
+    g_param_spec_string ("driver-name",
+                         "driver-name",
+                         "DRM device driver name",
+                         NULL,
+                         G_PARAM_READWRITE |
+                         G_PARAM_CONSTRUCT_ONLY |
+                         G_PARAM_STATIC_STRINGS);
+  obj_props[PROP_DRIVER_DESCRIPTION] =
+    g_param_spec_string ("driver-description",
+                         "driver-description",
+                         "DRM device driver description",
+                         NULL,
+                         G_PARAM_READWRITE |
+                         G_PARAM_CONSTRUCT_ONLY |
+                         G_PARAM_STATIC_STRINGS);
   g_object_class_install_properties (object_class, N_PROPS, obj_props);
 }


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