[mutter] kms/impl-device: Construct using GInitable
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] kms/impl-device: Construct using GInitable
- Date: Fri, 22 Jan 2021 17:08:27 +0000 (UTC)
commit 8808d518cc2047c2d723509ad3393f915e92e633
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Thu Jul 16 22:17:04 2020 +0200
kms/impl-device: Construct using GInitable
Instead of a constructor method, use the type directly and handle error
reporting using GInitable.
The DRM capability setting is done before construction, as later it'll
determine what type of impl device should be constructed.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>
src/backends/native/meta-kms-device.c | 33 ++++-
src/backends/native/meta-kms-impl-device.c | 209 ++++++++++++++++++++---------
src/backends/native/meta-kms-impl-device.h | 5 -
3 files changed, 180 insertions(+), 67 deletions(-)
---
diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c
index e3779896c2..dc0dfa0fe5 100644
--- a/src/backends/native/meta-kms-device.c
+++ b/src/backends/native/meta-kms-device.c
@@ -23,6 +23,8 @@
#include "backends/native/meta-kms-device-private.h"
#include "backends/native/meta-kms-device.h"
+#include <xf86drm.h>
+
#include "backends/native/meta-backend-native.h"
#include "backends/native/meta-kms-impl-device.h"
#include "backends/native/meta-kms-impl.h"
@@ -227,6 +229,32 @@ typedef struct _CreateImplDeviceData
char *out_driver_description;
} CreateImplDeviceData;
+static MetaKmsImplDevice *
+meta_create_kms_impl_device (MetaKmsDevice *device,
+ MetaKmsImpl *impl,
+ int fd,
+ GError **error)
+{
+ int ret;
+
+ meta_assert_in_kms_impl (meta_kms_impl_get_kms (impl));
+
+ ret = drmSetClientCap (fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+ if (ret != 0)
+ {
+ g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret),
+ "Failed to activate universal planes: %s",
+ g_strerror (-ret));
+ return NULL;
+ }
+
+ return g_initable_new (META_TYPE_KMS_IMPL_DEVICE, NULL, error,
+ "device", device,
+ "impl", impl,
+ "fd", fd,
+ NULL);
+}
+
static gpointer
create_impl_device_in_impl (MetaKmsImpl *impl,
gpointer user_data,
@@ -235,7 +263,10 @@ create_impl_device_in_impl (MetaKmsImpl *impl,
CreateImplDeviceData *data = user_data;
MetaKmsImplDevice *impl_device;
- impl_device = meta_kms_impl_device_new (data->device, impl, data->fd, error);
+ impl_device = meta_create_kms_impl_device (data->device,
+ impl,
+ data->fd,
+ error);
if (!impl_device)
return FALSE;
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 3f5833b316..1f2cfb3eda 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -38,6 +38,19 @@
#include "meta-default-modes.h"
+enum
+{
+ PROP_0,
+
+ PROP_DEVICE,
+ PROP_IMPL,
+ PROP_FD,
+
+ N_PROPS
+};
+
+static GParamSpec *obj_props[N_PROPS];
+
typedef struct _MetaKmsImplDevicePrivate
{
MetaKmsDevice *device;
@@ -58,8 +71,14 @@ typedef struct _MetaKmsImplDevicePrivate
GList *fallback_modes;
} MetaKmsImplDevicePrivate;
-G_DEFINE_TYPE_WITH_PRIVATE (MetaKmsImplDevice, meta_kms_impl_device,
- G_TYPE_OBJECT)
+static void
+initable_iface_init (GInitableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MetaKmsImplDevice, meta_kms_impl_device,
+ G_TYPE_OBJECT,
+ G_ADD_PRIVATE (MetaKmsImplDevice)
+ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
+ initable_iface_init))
MetaKmsDevice *
meta_kms_impl_device_get_device (MetaKmsImplDevice *impl_device)
@@ -587,64 +606,6 @@ meta_kms_impl_device_predict_states (MetaKmsImplDevice *impl_device,
update);
}
-MetaKmsImplDevice *
-meta_kms_impl_device_new (MetaKmsDevice *device,
- MetaKmsImpl *impl,
- int fd,
- GError **error)
-{
- MetaKms *kms = meta_kms_impl_get_kms (impl);
- MetaKmsImplDevice *impl_device;
- MetaKmsImplDevicePrivate *priv;
- int ret;
- drmModeRes *drm_resources;
-
- meta_assert_in_kms_impl (kms);
-
- ret = drmSetClientCap (fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
- if (ret != 0)
- {
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret),
- "Failed to activate universal planes: %s",
- g_strerror (-ret));
- return NULL;
- }
-
- drm_resources = drmModeGetResources (fd);
- if (!drm_resources)
- {
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
- "Failed to activate universal planes: %s",
- g_strerror (errno));
- return NULL;
- }
-
- impl_device = g_object_new (META_TYPE_KMS_IMPL_DEVICE, NULL);
- priv = meta_kms_impl_device_get_instance_private (impl_device);
- priv->device = device;
- priv->impl = impl;
- priv->fd = fd;
-
- init_caps (impl_device);
-
- init_crtcs (impl_device, drm_resources);
- init_planes (impl_device);
- init_info (impl_device);
-
- init_fallback_modes (impl_device);
-
- update_connectors (impl_device, drm_resources);
-
- drmModeFreeResources (drm_resources);
-
- priv->fd_source =
- meta_kms_register_fd_in_impl (kms, fd,
- kms_event_dispatch_in_impl,
- impl_device);
-
- return impl_device;
-}
-
int
meta_kms_impl_device_get_fd (MetaKmsImplDevice *impl_device)
{
@@ -681,6 +642,60 @@ meta_kms_impl_device_close (MetaKmsImplDevice *impl_device)
return fd;
}
+static void
+meta_kms_impl_device_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MetaKmsImplDevice *impl_device = META_KMS_IMPL_DEVICE (object);
+ MetaKmsImplDevicePrivate *priv =
+ meta_kms_impl_device_get_instance_private (impl_device);
+
+ switch (prop_id)
+ {
+ case PROP_DEVICE:
+ g_value_set_object (value, priv->device);
+ break;
+ case PROP_IMPL:
+ g_value_set_object (value, priv->impl);
+ break;
+ case PROP_FD:
+ g_value_set_int (value, priv->fd);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+meta_kms_impl_device_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MetaKmsImplDevice *impl_device = META_KMS_IMPL_DEVICE (object);
+ MetaKmsImplDevicePrivate *priv =
+ meta_kms_impl_device_get_instance_private (impl_device);
+
+ switch (prop_id)
+ {
+ case PROP_DEVICE:
+ priv->device = g_value_get_object (value);
+ break;
+ case PROP_IMPL:
+ priv->impl = g_value_get_object (value);
+ break;
+ case PROP_FD:
+ priv->fd = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
static void
meta_kms_impl_device_finalize (GObject *object)
{
@@ -699,16 +714,88 @@ meta_kms_impl_device_finalize (GObject *object)
G_OBJECT_CLASS (meta_kms_impl_device_parent_class)->finalize (object);
}
+static gboolean
+meta_kms_impl_device_initable_init (GInitable *initable,
+ GCancellable *cancellable,
+ GError **error)
+{
+ MetaKmsImplDevice *impl_device = META_KMS_IMPL_DEVICE (initable);
+ MetaKmsImplDevicePrivate *priv =
+ meta_kms_impl_device_get_instance_private (impl_device);
+ drmModeRes *drm_resources;
+
+ drm_resources = drmModeGetResources (priv->fd);
+ if (!drm_resources)
+ {
+ g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
+ "Failed to activate universal planes: %s",
+ g_strerror (errno));
+ return FALSE;
+ }
+
+ init_caps (impl_device);
+
+ init_crtcs (impl_device, drm_resources);
+ init_planes (impl_device);
+ init_info (impl_device);
+
+ init_fallback_modes (impl_device);
+
+ update_connectors (impl_device, drm_resources);
+
+ drmModeFreeResources (drm_resources);
+
+ priv->fd_source =
+ meta_kms_register_fd_in_impl (meta_kms_impl_get_kms (priv->impl), priv->fd,
+ kms_event_dispatch_in_impl,
+ impl_device);
+
+ return TRUE;
+}
+
static void
meta_kms_impl_device_init (MetaKmsImplDevice *device)
{
}
+static void
+initable_iface_init (GInitableIface *initable_iface)
+{
+ initable_iface->init = meta_kms_impl_device_initable_init;
+}
+
static void
meta_kms_impl_device_class_init (MetaKmsImplDeviceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ object_class->get_property = meta_kms_impl_device_get_property;
+ object_class->set_property = meta_kms_impl_device_set_property;
object_class->finalize = meta_kms_impl_device_finalize;
-}
+ obj_props[PROP_DEVICE] =
+ g_param_spec_object ("device",
+ "device",
+ "MetaKmsDevice",
+ META_TYPE_KMS_DEVICE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+ obj_props[PROP_IMPL] =
+ g_param_spec_object ("impl",
+ "impl",
+ "MetaKmsImpl",
+ META_TYPE_KMS_IMPL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+ obj_props[PROP_FD] =
+ g_param_spec_int ("fd",
+ "fd",
+ "DRM device file descriptor",
+ INT_MIN, INT_MAX, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+ g_object_class_install_properties (object_class, N_PROPS, obj_props);
+}
diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h
index 30b45f8721..003a2a7212 100644
--- a/src/backends/native/meta-kms-impl-device.h
+++ b/src/backends/native/meta-kms-impl-device.h
@@ -107,9 +107,4 @@ void meta_kms_impl_device_init_prop_table (MetaKmsImplDevice *impl_device,
int meta_kms_impl_device_close (MetaKmsImplDevice *impl_device);
-MetaKmsImplDevice * meta_kms_impl_device_new (MetaKmsDevice *device,
- MetaKmsImpl *kms_impl,
- int fd,
- GError **error);
-
#endif /* META_KMS_IMPL_DEVICE_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]