From df89e8ce4b7c3f94a5092e97cdc9ff40b53e0d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 13 Jul 2020 21:42:04 +0200 Subject: [PATCH] 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: --- 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 8bf5393dc..f0623715d 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 4e3c011ce..54ec9906a 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 9678f6d36..861c79b6e 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,