[mutter] kms/connector: Make property ID fetching more declarative
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] kms/connector: Make property ID fetching more declarative
- Date: Fri, 22 Jan 2021 17:08:26 +0000 (UTC)
commit df89e8ce4b7c3f94a5092e97cdc9ff40b53e0d7b
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Mon Jul 13 21:42:04 2020 +0200
kms/connector: Make property ID fetching more declarative
Instead of relatively verbosely going through the DRM properties finding
the properties we care about and saving their ID's, add a more
declarative way to fetch property metadata. This'll allow for fetching
more property IDs with relatively less code, which will be useful for
the atomic backend.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>
src/backends/native/meta-kms-connector.c | 120 +++++++++++++++++++----------
src/backends/native/meta-kms-impl-device.c | 63 +++++++++++++++
src/backends/native/meta-kms-impl-device.h | 14 ++++
3 files changed, 157 insertions(+), 40 deletions(-)
---
diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c
index 8bf5393dc8..f0623715d2 100644
--- a/src/backends/native/meta-kms-connector.c
+++ b/src/backends/native/meta-kms-connector.c
@@ -30,6 +30,20 @@
#include "backends/native/meta-kms-mode-private.h"
#include "backends/native/meta-kms-update-private.h"
+typedef enum _MetaKmsConnectorProp
+{
+ META_KMS_CONNECTOR_PROP_DPMS = 0,
+ META_KMS_CONNECTOR_PROP_UNDERSCAN,
+ META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER,
+ META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER,
+ META_KMS_CONNECTOR_N_PROPS
+} MetaKmsConnectorProp;
+
+typedef struct _MetaKmsConnectorPropTable
+{
+ MetaKmsProp props[META_KMS_CONNECTOR_N_PROPS];
+} MetaKmsConnectorPropTable;
+
struct _MetaKmsConnector
{
GObject parent;
@@ -43,10 +57,8 @@ struct _MetaKmsConnector
MetaKmsConnectorState *current_state;
- uint32_t dpms_prop_id;
- uint32_t underscan_prop_id;
- uint32_t underscan_hborder_prop_id;
- uint32_t underscan_vborder_prop_id;
+ MetaKmsConnectorPropTable prop_table;
+
uint32_t edid_blob_id;
uint32_t tile_blob_id;
};
@@ -64,9 +76,12 @@ meta_kms_connector_update_set_dpms_state (MetaKmsConnector *connector,
MetaKmsUpdate *update,
uint64_t state)
{
+ uint32_t prop_id;
+
+ prop_id = connector->prop_table.props[META_KMS_CONNECTOR_PROP_DPMS].prop_id;
meta_kms_update_set_connector_property (update,
connector,
- connector->dpms_prop_id,
+ prop_id,
state);
}
@@ -76,17 +91,29 @@ meta_kms_connector_set_underscanning (MetaKmsConnector *connector,
uint64_t hborder,
uint64_t vborder)
{
+ MetaKmsProp *props = connector->prop_table.props;
+ uint32_t underscan_prop_id;
+ uint32_t underscan_hborder_prop_id;
+ uint32_t underscan_vborder_prop_id;
+
+ underscan_prop_id =
+ props[META_KMS_CONNECTOR_PROP_UNDERSCAN].prop_id;
+ underscan_hborder_prop_id =
+ props[META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER].prop_id;
+ underscan_vborder_prop_id =
+ props[META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER].prop_id;
+
meta_kms_update_set_connector_property (update,
connector,
- connector->underscan_prop_id,
+ underscan_prop_id,
1);
meta_kms_update_set_connector_property (update,
connector,
- connector->underscan_hborder_prop_id,
+ underscan_hborder_prop_id,
hborder);
meta_kms_update_set_connector_property (update,
connector,
- connector->underscan_vborder_prop_id,
+ underscan_vborder_prop_id,
vborder);
}
@@ -94,9 +121,13 @@ void
meta_kms_connector_unset_underscanning (MetaKmsConnector *connector,
MetaKmsUpdate *update)
{
+ MetaKmsProp *props = connector->prop_table.props;
+ uint32_t underscan_prop_id;
+
+ underscan_prop_id = props[META_KMS_CONNECTOR_PROP_UNDERSCAN].prop_id;
meta_kms_update_set_connector_property (update,
connector,
- connector->underscan_prop_id,
+ underscan_prop_id,
0);
}
@@ -144,7 +175,12 @@ meta_kms_connector_get_current_state (MetaKmsConnector *connector)
gboolean
meta_kms_connector_is_underscanning_supported (MetaKmsConnector *connector)
{
- return connector->underscan_prop_id != 0;
+ uint32_t underscan_prop_id;
+
+ underscan_prop_id =
+ connector->prop_table.props[META_KMS_CONNECTOR_PROP_UNDERSCAN].prop_id;
+
+ return underscan_prop_id != 0;
}
static void
@@ -543,38 +579,42 @@ meta_kms_connector_predict_state (MetaKmsConnector *connector,
}
static void
-find_property_ids (MetaKmsConnector *connector,
- MetaKmsImplDevice *impl_device,
- drmModeConnector *drm_connector)
+init_properties (MetaKmsConnector *connector,
+ MetaKmsImplDevice *impl_device,
+ drmModeConnector *drm_connector)
{
- int fd;
- int i;
+ MetaKmsConnectorPropTable *prop_table = &connector->prop_table;
- fd = meta_kms_impl_device_get_fd (impl_device);
-
- for (i = 0; i < drm_connector->count_props; i++)
- {
- drmModePropertyPtr prop;
-
- prop = drmModeGetProperty (fd, drm_connector->props[i]);
- if (!prop)
- continue;
-
- if ((prop->flags & DRM_MODE_PROP_ENUM) &&
- strcmp (prop->name, "DPMS") == 0)
- connector->dpms_prop_id = prop->prop_id;
- else if ((prop->flags & DRM_MODE_PROP_ENUM) &&
- strcmp (prop->name, "underscan") == 0)
- connector->underscan_prop_id = prop->prop_id;
- else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
- strcmp (prop->name, "underscan hborder") == 0)
- connector->underscan_hborder_prop_id = prop->prop_id;
- else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
- strcmp (prop->name, "underscan vborder") == 0)
- connector->underscan_vborder_prop_id = prop->prop_id;
-
- drmModeFreeProperty (prop);
+ *prop_table = (MetaKmsConnectorPropTable) {
+ .props = {
+ [META_KMS_CONNECTOR_PROP_DPMS] =
+ {
+ .name = "DPMS",
+ .type = DRM_MODE_PROP_ENUM,
+ },
+ [META_KMS_CONNECTOR_PROP_UNDERSCAN] =
+ {
+ .name = "underscan",
+ .type = DRM_MODE_PROP_ENUM,
+ },
+ [META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER] =
+ {
+ .name = "underscan hborder",
+ .type = DRM_MODE_PROP_RANGE,
+ },
+ [META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER] =
+ {
+ .name = "underscan vborder",
+ .type = DRM_MODE_PROP_RANGE,
+ },
}
+ };
+
+ meta_kms_impl_device_init_prop_table (impl_device,
+ drm_connector->props,
+ drm_connector->count_props,
+ connector->prop_table.props,
+ META_KMS_CONNECTOR_N_PROPS);
}
static char *
@@ -633,7 +673,7 @@ meta_kms_connector_new (MetaKmsImplDevice *impl_device,
connector->type_id = drm_connector->connector_type_id;
connector->name = make_connector_name (drm_connector);
- find_property_ids (connector, impl_device, drm_connector);
+ init_properties (connector, impl_device, drm_connector);
meta_kms_connector_read_state (connector, impl_device,
drm_connector,
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 4e3c011ceb..54ec9906a5 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -337,6 +337,69 @@ meta_kms_impl_device_add_fake_plane (MetaKmsImplDevice *impl_device,
return plane;
}
+static MetaKmsProp *
+find_prop (MetaKmsProp *props,
+ int n_props,
+ const char *name)
+{
+ int i;
+
+ for (i = 0; i < n_props; i++)
+ {
+ MetaKmsProp *prop = &props[i];
+
+ g_warn_if_fail (prop->name);
+
+ if (g_strcmp0 (prop->name, name) == 0)
+ return prop;
+ }
+
+ return NULL;
+}
+
+void
+meta_kms_impl_device_init_prop_table (MetaKmsImplDevice *impl_device,
+ uint32_t *drm_props,
+ int n_drm_props,
+ MetaKmsProp *props,
+ int n_props)
+{
+ int fd;
+ uint32_t i;
+
+ fd = meta_kms_impl_device_get_fd (impl_device);
+
+ for (i = 0; i < n_drm_props; i++)
+ {
+ drmModePropertyRes *drm_prop;
+ MetaKmsProp *prop;
+
+ drm_prop = drmModeGetProperty (fd, drm_props[i]);
+ if (!drm_prop)
+ continue;
+
+ prop = find_prop (props, n_props, drm_prop->name);
+ if (!prop)
+ {
+ drmModeFreeProperty (drm_prop);
+ continue;
+ }
+
+ if (!(drm_prop->flags & prop->type))
+ {
+ g_warning ("DRM property '%s' (%u) had unexpected flags (0x%x), "
+ "ignoring",
+ drm_prop->name, drm_props[i], drm_prop->flags);
+ drmModeFreeProperty (drm_prop);
+ continue;
+ }
+
+ prop->prop_id = drm_props[i];
+
+ drmModeFreeProperty (drm_prop);
+ }
+}
+
static void
init_planes (MetaKmsImplDevice *impl_device)
{
diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h
index 9678f6d369..861c79b6e4 100644
--- a/src/backends/native/meta-kms-impl-device.h
+++ b/src/backends/native/meta-kms-impl-device.h
@@ -35,6 +35,14 @@ typedef struct _MetaKmsDeviceCaps
uint64_t cursor_height;
} MetaKmsDeviceCaps;
+typedef struct _MetaKmsProp
+{
+ const char *name;
+ uint32_t type;
+
+ uint32_t prop_id;
+} MetaKmsProp;
+
#define META_TYPE_KMS_IMPL_DEVICE (meta_kms_impl_device_get_type ())
G_DECLARE_FINAL_TYPE (MetaKmsImplDevice, meta_kms_impl_device,
META, KMS_IMPL_DEVICE,
@@ -77,6 +85,12 @@ MetaKmsPlane * meta_kms_impl_device_add_fake_plane (MetaKmsImplDevice *impl_devi
MetaKmsPlaneType plane_type,
MetaKmsCrtc *crtc);
+void meta_kms_impl_device_init_prop_table (MetaKmsImplDevice *impl_device,
+ uint32_t *drm_props,
+ int n_drm_props,
+ MetaKmsProp *props,
+ int n_props);
+
int meta_kms_impl_device_close (MetaKmsImplDevice *impl_device);
MetaKmsImplDevice * meta_kms_impl_device_new (MetaKmsDevice *device,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]