From 981524c26801449d902a0df3a22809bd2569927c Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 20 Apr 2022 22:43:13 +0200 Subject: [PATCH] backends/native: Update PropTable on hotplug and remove parse callback Updating the PropTable has the side effect that the parse callback now also gets called on hotplug but it is used to initialize data. The parse callbacks are moved to the read_state functions which are aware if this is an initializing call or just an update. Part-of: --- src/backends/native/meta-kms-connector.c | 15 ++- src/backends/native/meta-kms-crtc.c | 80 ++-------------- src/backends/native/meta-kms-impl-device.c | 20 ++-- src/backends/native/meta-kms-impl-device.h | 19 ++-- src/backends/native/meta-kms-plane.c | 104 ++++++++++++--------- 5 files changed, 89 insertions(+), 149 deletions(-) diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c index b582dd4c6..7cd66f6f0 100644 --- a/src/backends/native/meta-kms-connector.c +++ b/src/backends/native/meta-kms-connector.c @@ -675,6 +675,13 @@ meta_kms_connector_read_state (MetaKmsConnector *connector, current_state = g_steal_pointer (&connector->current_state); changes = META_KMS_UPDATE_CHANGE_NONE; + meta_kms_impl_device_update_prop_table (impl_device, + drm_connector->props, + drm_connector->prop_values, + drm_connector->count_props, + connector->prop_table.props, + META_KMS_CONNECTOR_N_PROPS); + if (!drm_connector) { if (current_state) @@ -1048,14 +1055,6 @@ init_properties (MetaKmsConnector *connector, }, } }; - - meta_kms_impl_device_init_prop_table (impl_device, - drm_connector->props, - drm_connector->prop_values, - drm_connector->count_props, - connector->prop_table.props, - META_KMS_CONNECTOR_N_PROPS, - NULL); } static char * diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c index e9bd9308b..cd8f570f1 100644 --- a/src/backends/native/meta-kms-crtc.c +++ b/src/backends/native/meta-kms-crtc.c @@ -156,24 +156,6 @@ meta_kms_crtc_state_changes (MetaKmsCrtcState *state, return META_KMS_UPDATE_CHANGE_NONE; } -static int -find_prop_idx (MetaKmsProp *prop, - uint32_t *drm_props, - int n_drm_props) -{ - int i; - - g_return_val_if_fail (prop->prop_id > 0, -1); - - for (i = 0; i < n_drm_props; i++) - { - if (drm_props[i] == prop->prop_id) - return i; - } - - return -1; -} - static void clear_gamma_state (MetaKmsCrtcState *crtc_state) { @@ -192,7 +174,13 @@ meta_kms_crtc_read_state (MetaKmsCrtc *crtc, MetaKmsCrtcState crtc_state = {0}; MetaKmsUpdateChanges changes = META_KMS_UPDATE_CHANGE_NONE; MetaKmsProp *active_prop; - int active_idx; + + meta_kms_impl_device_update_prop_table (impl_device, + drm_props->props, + drm_props->prop_values, + drm_props->count_props, + crtc->prop_table.props, + META_KMS_CRTC_N_PROPS); crtc_state.rect = (MetaRectangle) { .x = drm_crtc->x, @@ -205,17 +193,11 @@ meta_kms_crtc_read_state (MetaKmsCrtc *crtc, crtc_state.drm_mode = drm_crtc->mode; active_prop = &crtc->prop_table.props[META_KMS_CRTC_PROP_ACTIVE]; + if (active_prop->prop_id) - { - active_idx = find_prop_idx (active_prop, - drm_props->props, - drm_props->count_props); - crtc_state.is_active = !!drm_props->prop_values[active_idx]; - } + crtc_state.is_active = !!active_prop->value; else - { - crtc_state.is_active = drm_crtc->mode_valid; - } + crtc_state.is_active = drm_crtc->mode_valid; read_gamma_state (crtc, &crtc_state, impl_device, drm_crtc); @@ -350,27 +332,12 @@ meta_kms_crtc_predict_state (MetaKmsCrtc *crtc, } } -static void -parse_active (MetaKmsImplDevice *impl_device, - MetaKmsProp *prop, - drmModePropertyPtr drm_prop, - uint64_t drm_prop_value, - gpointer user_data) -{ - MetaKmsCrtc *crtc = user_data; - - crtc->current_state.is_active = !!drm_prop_value; -} - static void init_properties (MetaKmsCrtc *crtc, MetaKmsImplDevice *impl_device, drmModeCrtc *drm_crtc) { MetaKmsCrtcPropTable *prop_table = &crtc->prop_table; - int fd; - drmModeObjectProperties *drm_props; - int i; *prop_table = (MetaKmsCrtcPropTable) { .props = { @@ -383,7 +350,6 @@ init_properties (MetaKmsCrtc *crtc, { .name = "ACTIVE", .type = DRM_MODE_PROP_RANGE, - .parse = parse_active, }, [META_KMS_CRTC_PROP_GAMMA_LUT] = { @@ -392,32 +358,6 @@ init_properties (MetaKmsCrtc *crtc, }, } }; - - fd = meta_kms_impl_device_get_fd (impl_device); - drm_props = drmModeObjectGetProperties (fd, - drm_crtc->crtc_id, - DRM_MODE_OBJECT_CRTC); - - meta_kms_impl_device_init_prop_table (impl_device, - drm_props->props, - drm_props->prop_values, - drm_props->count_props, - crtc->prop_table.props, - META_KMS_CRTC_N_PROPS, - crtc); - - drmModeFreeObjectProperties (drm_props); - - for (i = 0; i < META_KMS_CRTC_N_PROPS; i++) - { - meta_topic (META_DEBUG_KMS, - "%s (%s) CRTC %u property '%s' is %s", - meta_kms_impl_device_get_path (impl_device), - meta_kms_impl_device_get_driver_name (impl_device), - drm_crtc->crtc_id, - prop_table->props[i].name, - prop_table->props[i].prop_id ? "supported" : "unsupported"); - } } MetaKmsCrtc * diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 4e0faab56..0ee74090d 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -623,13 +623,12 @@ find_prop (MetaKmsProp *props, } void -meta_kms_impl_device_init_prop_table (MetaKmsImplDevice *impl_device, - uint32_t *drm_props, - uint64_t *drm_prop_values, - int n_drm_props, - MetaKmsProp *props, - int n_props, - gpointer user_data) +meta_kms_impl_device_update_prop_table (MetaKmsImplDevice *impl_device, + uint32_t *drm_props, + uint64_t *drm_prop_values, + int n_drm_props, + MetaKmsProp *props, + int n_props) { int fd; uint32_t i, j; @@ -691,13 +690,6 @@ meta_kms_impl_device_init_prop_table (MetaKmsImplDevice *impl_device, update_prop_value (prop, prop_value); - if (prop->parse) - { - prop->parse (impl_device, prop, - drm_prop, prop_value, - user_data); - } - drmModeFreeProperty (drm_prop); } } diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h index 015268f5a..387b74249 100644 --- a/src/backends/native/meta-kms-impl-device.h +++ b/src/backends/native/meta-kms-impl-device.h @@ -66,12 +66,6 @@ struct _MetaKmsProp uint32_t prop_id; uint64_t value; - - void (* parse) (MetaKmsImplDevice *impl_device, - MetaKmsProp *prop, - drmModePropertyPtr drm_prop, - uint64_t value, - gpointer user_data); }; #define META_TYPE_KMS_IMPL_DEVICE (meta_kms_impl_device_get_type ()) @@ -164,13 +158,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, - uint64_t *drm_props_values, - int n_drm_props, - MetaKmsProp *props, - int n_props, - gpointer user_data); +void meta_kms_impl_device_update_prop_table (MetaKmsImplDevice *impl_device, + uint32_t *drm_props, + uint64_t *drm_props_values, + int n_drm_props, + MetaKmsProp *props, + int n_props); void meta_kms_impl_device_reload_prop_values (MetaKmsImplDevice *impl_device, uint32_t *drm_props, diff --git a/src/backends/native/meta-kms-plane.c b/src/backends/native/meta-kms-plane.c index 5ee163c1a..ad4f46f00 100644 --- a/src/backends/native/meta-kms-plane.c +++ b/src/backends/native/meta-kms-plane.c @@ -190,33 +190,40 @@ meta_kms_plane_is_usable_with (MetaKmsPlane *plane, } static void -parse_rotations (MetaKmsImplDevice *impl_device, - MetaKmsProp *prop, - drmModePropertyPtr drm_prop, - uint64_t drm_prop_value, - gpointer user_data) +update_rotations (MetaKmsPlane *plane) { - MetaKmsPlane *plane = user_data; - int i; + MetaKmsProp *prop; + MetaKmsPlaneRotation rotation; - for (i = 0; i < drm_prop->count_enums; i++) + prop = &plane->prop_table.props[META_KMS_PLANE_PROP_ROTATION]; + rotation = prop->value; + + if (rotation & META_KMS_PLANE_ROTATION_ROTATE_0) { - MetaMonitorTransform transform = -1; + plane->all_hw_transforms |= 1 << META_MONITOR_TRANSFORM_NORMAL; + plane->rotation_map[META_MONITOR_TRANSFORM_NORMAL] = + 1 << prop->enum_values[META_KMS_PLANE_ROTATION_BIT_ROTATE_0].value; + } - if (strcmp (drm_prop->enums[i].name, "rotate-0") == 0) - transform = META_MONITOR_TRANSFORM_NORMAL; - else if (strcmp (drm_prop->enums[i].name, "rotate-90") == 0) - transform = META_MONITOR_TRANSFORM_90; - else if (strcmp (drm_prop->enums[i].name, "rotate-180") == 0) - transform = META_MONITOR_TRANSFORM_180; - else if (strcmp (drm_prop->enums[i].name, "rotate-270") == 0) - transform = META_MONITOR_TRANSFORM_270; + if (rotation & META_KMS_PLANE_ROTATION_ROTATE_90) + { + plane->all_hw_transforms |= 1 << META_MONITOR_TRANSFORM_90; + plane->rotation_map[META_MONITOR_TRANSFORM_90] = + 1 << prop->enum_values[META_KMS_PLANE_ROTATION_BIT_ROTATE_90].value; + } - if (transform != -1) - { - plane->all_hw_transforms |= 1 << transform; - plane->rotation_map[transform] = 1 << drm_prop->enums[i].value; - } + if (rotation & META_KMS_PLANE_ROTATION_ROTATE_180) + { + plane->all_hw_transforms |= 1 << META_MONITOR_TRANSFORM_180; + plane->rotation_map[META_MONITOR_TRANSFORM_180] = + 1 << prop->enum_values[META_KMS_PLANE_ROTATION_BIT_ROTATE_180].value; + } + + if (rotation & META_KMS_PLANE_ROTATION_ROTATE_270) + { + plane->all_hw_transforms |= 1 << META_MONITOR_TRANSFORM_270; + plane->rotation_map[META_MONITOR_TRANSFORM_270] = + 1 << prop->enum_values[META_KMS_PLANE_ROTATION_BIT_ROTATE_270].value; } } @@ -243,13 +250,9 @@ free_modifier_array (GArray *array) } static void -parse_formats (MetaKmsImplDevice *impl_device, - MetaKmsProp *prop, - drmModePropertyPtr drm_prop, - uint64_t drm_prop_value, - gpointer user_data) +update_formats (MetaKmsPlane *plane, + MetaKmsImplDevice *impl_device) { - MetaKmsPlane *plane = user_data; uint64_t blob_id; int fd; drmModePropertyBlobPtr blob; @@ -257,10 +260,12 @@ parse_formats (MetaKmsImplDevice *impl_device, uint32_t *formats; struct drm_format_modifier *drm_modifiers; unsigned int fmt_i, mod_i; + MetaKmsProp *in_formats; g_return_if_fail (g_hash_table_size (plane->formats_modifiers) == 0); - blob_id = drm_prop_value; + in_formats = &plane->prop_table.props[META_KMS_PLANE_PROP_IN_FORMATS]; + blob_id = in_formats->value; if (blob_id == 0) return; @@ -345,10 +350,8 @@ static const uint32_t drm_default_formats[] = }; static void -init_legacy_formats (MetaKmsPlane *plane, - MetaKmsImplDevice *impl_device, - drmModePlane *drm_plane, - drmModeObjectProperties *drm_plane_props) +update_legacy_formats (MetaKmsPlane *plane, + drmModePlane *drm_plane) { if (g_hash_table_size (plane->formats_modifiers) == 0) { @@ -366,6 +369,28 @@ init_legacy_formats (MetaKmsPlane *plane, } } +static MetaKmsUpdateChanges +meta_kms_plane_read_state (MetaKmsPlane *plane, + MetaKmsImplDevice *impl_device, + drmModePlane *drm_plane, + drmModeObjectProperties *drm_plane_props) +{ + MetaKmsUpdateChanges changes = META_KMS_UPDATE_CHANGE_NONE; + + meta_kms_impl_device_update_prop_table (impl_device, + drm_plane_props->props, + drm_plane_props->prop_values, + drm_plane_props->count_props, + plane->prop_table.props, + META_KMS_PLANE_N_PROPS); + + update_formats (plane, impl_device); + update_rotations (plane); + update_legacy_formats (plane, drm_plane); + + return changes; +} + static void init_properties (MetaKmsPlane *plane, MetaKmsImplDevice *impl_device, @@ -388,13 +413,11 @@ init_properties (MetaKmsPlane *plane, .enum_values = prop_table->rotation_bitmask, .num_enum_values = META_KMS_PLANE_ROTATION_BIT_N_PROPS, .default_value = META_KMS_PLANE_ROTATION_UNKNOWN, - .parse = parse_rotations, }, [META_KMS_PLANE_PROP_IN_FORMATS] = { .name = "IN_FORMATS", .type = DRM_MODE_PROP_BLOB, - .parse = parse_formats, }, [META_KMS_PLANE_PROP_SRC_X] = { @@ -489,14 +512,6 @@ init_properties (MetaKmsPlane *plane, }, }, }; - - meta_kms_impl_device_init_prop_table (impl_device, - drm_plane_props->props, - drm_plane_props->prop_values, - drm_plane_props->count_props, - plane->prop_table.props, - META_KMS_PLANE_N_PROPS, - plane); } MetaKmsPlane * @@ -514,7 +529,8 @@ meta_kms_plane_new (MetaKmsPlaneType type, plane->device = meta_kms_impl_device_get_device (impl_device); init_properties (plane, impl_device, drm_plane, drm_plane_props); - init_legacy_formats (plane, impl_device, drm_plane, drm_plane_props); + + meta_kms_plane_read_state (plane, impl_device, drm_plane, drm_plane_props); return plane; }