diff --git a/src/backends/native/meta-kms-connector-private.h b/src/backends/native/meta-kms-connector-private.h index 3dd2b8440..f4d3bbf14 100644 --- a/src/backends/native/meta-kms-connector-private.h +++ b/src/backends/native/meta-kms-connector-private.h @@ -97,6 +97,10 @@ uint32_t meta_kms_connector_get_prop_id (MetaKmsConnector *connector, const char * meta_kms_connector_get_prop_name (MetaKmsConnector *connector, MetaKmsConnectorProp prop); +uint64_t meta_kms_connector_get_prop_drm_value (MetaKmsConnector *connector, + MetaKmsConnectorProp prop, + uint64_t value); + MetaKmsUpdateChanges meta_kms_connector_update_state (MetaKmsConnector *connector, drmModeRes *drm_resources); diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c index 7cd66f6f0..36d796031 100644 --- a/src/backends/native/meta-kms-connector.c +++ b/src/backends/native/meta-kms-connector.c @@ -94,6 +94,15 @@ meta_kms_connector_get_prop_name (MetaKmsConnector *connector, return connector->prop_table.props[prop].name; } +uint64_t +meta_kms_connector_get_prop_drm_value (MetaKmsConnector *connector, + MetaKmsConnectorProp property, + uint64_t value) +{ + MetaKmsProp *prop = &connector->prop_table.props[property]; + return meta_kms_prop_convert_value (prop, value); +} + uint32_t meta_kms_connector_get_connector_type (MetaKmsConnector *connector) { diff --git a/src/backends/native/meta-kms-crtc-private.h b/src/backends/native/meta-kms-crtc-private.h index 65bda3f10..0efb3e71b 100644 --- a/src/backends/native/meta-kms-crtc-private.h +++ b/src/backends/native/meta-kms-crtc-private.h @@ -51,4 +51,8 @@ uint32_t meta_kms_crtc_get_prop_id (MetaKmsCrtc *crtc, const char * meta_kms_crtc_get_prop_name (MetaKmsCrtc *crtc, MetaKmsCrtcProp prop); +uint64_t meta_kms_crtc_get_prop_drm_value (MetaKmsCrtc *crtc, + MetaKmsCrtcProp prop, + uint64_t value); + #endif /* META_KMS_CRTC_PRIVATE_H */ diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c index cd8f570f1..c5bab91bb 100644 --- a/src/backends/native/meta-kms-crtc.c +++ b/src/backends/native/meta-kms-crtc.c @@ -86,6 +86,15 @@ meta_kms_crtc_get_prop_name (MetaKmsCrtc *crtc, return crtc->prop_table.props[prop].name; } +uint64_t +meta_kms_crtc_get_prop_drm_value (MetaKmsCrtc *crtc, + MetaKmsCrtcProp property, + uint64_t value) +{ + MetaKmsProp *prop = &crtc->prop_table.props[property]; + return meta_kms_prop_convert_value (prop, value); +} + gboolean meta_kms_crtc_is_active (MetaKmsCrtc *crtc) { diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c index 73dd8e697..36cf6c39d 100644 --- a/src/backends/native/meta-kms-impl-device-atomic.c +++ b/src/backends/native/meta-kms-impl-device-atomic.c @@ -114,6 +114,8 @@ add_connector_property (MetaKmsImplDevice *impl_device, return FALSE; } + value = meta_kms_connector_get_prop_drm_value (connector, prop, value); + meta_topic (META_DEBUG_KMS, "[atomic] Setting connector %u (%s) property '%s' (%u) to %" G_GUINT64_FORMAT, @@ -165,15 +167,17 @@ process_connector_update (MetaKmsImplDevice *impl_device, if (!add_connector_property (impl_device, connector, req, META_KMS_CONNECTOR_PROP_UNDERSCAN, - 1, + META_KMS_CONNECTOR_UNDERSCAN_ON, error)) return FALSE; + if (!add_connector_property (impl_device, connector, req, META_KMS_CONNECTOR_PROP_UNDERSCAN_HBORDER, connector_update->underscanning.hborder, error)) return FALSE; + if (!add_connector_property (impl_device, connector, req, META_KMS_CONNECTOR_PROP_UNDERSCAN_VBORDER, @@ -191,7 +195,7 @@ process_connector_update (MetaKmsImplDevice *impl_device, if (!add_connector_property (impl_device, connector, req, META_KMS_CONNECTOR_PROP_UNDERSCAN, - 0, + META_KMS_CONNECTOR_UNDERSCAN_OFF, error)) return FALSE; } @@ -207,7 +211,9 @@ process_connector_update (MetaKmsImplDevice *impl_device, if (!add_connector_property (impl_device, connector, req, META_KMS_CONNECTOR_PROP_PRIVACY_SCREEN_SW_STATE, - connector_update->privacy_screen.is_enabled, + connector_update->privacy_screen.is_enabled ? + META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED : + META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED, error)) return FALSE; } @@ -235,6 +241,8 @@ add_crtc_property (MetaKmsImplDevice *impl_device, return FALSE; } + value = meta_kms_crtc_get_prop_drm_value (crtc, prop, value); + meta_topic (META_DEBUG_KMS, "[atomic] Setting CRTC %u (%s) property '%s' (%u) to %" G_GUINT64_FORMAT, @@ -364,6 +372,8 @@ add_plane_property (MetaKmsImplDevice *impl_device, return FALSE; } + value = meta_kms_plane_get_prop_drm_value (plane, prop, value); + switch (meta_kms_plane_get_prop_internal_type (plane, prop)) { case META_KMS_PROP_TYPE_RAW: @@ -546,17 +556,14 @@ process_plane_assignment (MetaKmsImplDevice *impl_device, if (plane_assignment->rotation) { meta_topic (META_DEBUG_KMS, - "[atomic] Setting plane (%u, %s) rotation to %" - G_GUINT64_FORMAT, + "[atomic] Setting plane (%u, %s) rotation to %u", meta_kms_plane_get_id (plane), meta_kms_impl_device_get_path (impl_device), plane_assignment->rotation); - if (!add_plane_property (impl_device, - plane, req, + if (!add_plane_property (impl_device, plane, req, META_KMS_PLANE_PROP_ROTATION, - plane_assignment->rotation, - error)) + plane_assignment->rotation, error)) return FALSE; } diff --git a/src/backends/native/meta-kms-plane-private.h b/src/backends/native/meta-kms-plane-private.h index 7dcb7f0c0..c5bfa6fa1 100644 --- a/src/backends/native/meta-kms-plane-private.h +++ b/src/backends/native/meta-kms-plane-private.h @@ -81,6 +81,10 @@ uint32_t meta_kms_plane_get_prop_id (MetaKmsPlane *plane, const char * meta_kms_plane_get_prop_name (MetaKmsPlane *plane, MetaKmsPlaneProp prop); +uint64_t meta_kms_plane_get_prop_drm_value (MetaKmsPlane *plane, + MetaKmsPlaneProp prop, + uint64_t value); + MetaKmsPropType meta_kms_plane_get_prop_internal_type (MetaKmsPlane *plane, MetaKmsPlaneProp prop); diff --git a/src/backends/native/meta-kms-plane.c b/src/backends/native/meta-kms-plane.c index ad4f46f00..47e45ee23 100644 --- a/src/backends/native/meta-kms-plane.c +++ b/src/backends/native/meta-kms-plane.c @@ -47,8 +47,7 @@ struct _MetaKmsPlane uint32_t possible_crtcs; - uint32_t rotation_map[META_MONITOR_N_TRANSFORMS]; - uint32_t all_hw_transforms; + MetaKmsPlaneRotation rotations; /* * primary plane's supported formats and maybe modifiers @@ -105,15 +104,59 @@ meta_kms_plane_get_prop_internal_type (MetaKmsPlane *plane, return plane->prop_table.props[prop].internal_type; } +uint64_t +meta_kms_plane_get_prop_drm_value (MetaKmsPlane *plane, + MetaKmsPlaneProp property, + uint64_t value) +{ + MetaKmsProp *prop = &plane->prop_table.props[property]; + return meta_kms_prop_convert_value (prop, value); +} + void meta_kms_plane_update_set_rotation (MetaKmsPlane *plane, MetaKmsPlaneAssignment *plane_assignment, MetaMonitorTransform transform) { + MetaKmsPlaneRotation kms_rotation = 0; + g_return_if_fail (meta_kms_plane_is_transform_handled (plane, transform)); - meta_kms_plane_assignment_set_rotation (plane_assignment, - plane->rotation_map[transform]); + switch (transform) + { + case META_MONITOR_TRANSFORM_NORMAL: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_0; + break; + case META_MONITOR_TRANSFORM_90: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_90; + break; + case META_MONITOR_TRANSFORM_180: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_180; + break; + case META_MONITOR_TRANSFORM_270: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_270; + break; + case META_MONITOR_TRANSFORM_FLIPPED: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_0 | + META_KMS_PLANE_ROTATION_REFLECT_X; + break; + case META_MONITOR_TRANSFORM_FLIPPED_90: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_90 | + META_KMS_PLANE_ROTATION_REFLECT_X; + break; + case META_MONITOR_TRANSFORM_FLIPPED_180: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_180 | + META_KMS_PLANE_ROTATION_REFLECT_X; + break; + case META_MONITOR_TRANSFORM_FLIPPED_270: + kms_rotation = META_KMS_PLANE_ROTATION_ROTATE_270 | + META_KMS_PLANE_ROTATION_REFLECT_X; + break; + default: + g_assert_not_reached (); + } + + meta_kms_plane_assignment_set_rotation (plane_assignment, kms_rotation); } gboolean @@ -123,23 +166,29 @@ meta_kms_plane_is_transform_handled (MetaKmsPlane *plane, switch (transform) { case META_MONITOR_TRANSFORM_NORMAL: + return plane->rotations & META_KMS_PLANE_ROTATION_ROTATE_0; case META_MONITOR_TRANSFORM_180: + return plane->rotations & META_KMS_PLANE_ROTATION_ROTATE_180; case META_MONITOR_TRANSFORM_FLIPPED: + return plane->rotations & (META_KMS_PLANE_ROTATION_ROTATE_0 | + META_KMS_PLANE_ROTATION_REFLECT_X); case META_MONITOR_TRANSFORM_FLIPPED_180: - break; + return plane->rotations & (META_KMS_PLANE_ROTATION_ROTATE_180 | + META_KMS_PLANE_ROTATION_REFLECT_X); + /* + * Deny these transforms as testing shows that they don't work + * anyway, e.g. due to the wrong buffer modifiers. They might as well be + * less optimal due to the complexity dealing with rotation at scan-out, + * potentially resulting in higher power consumption. + */ case META_MONITOR_TRANSFORM_90: case META_MONITOR_TRANSFORM_270: case META_MONITOR_TRANSFORM_FLIPPED_90: case META_MONITOR_TRANSFORM_FLIPPED_270: - /* - * Blacklist these transforms as testing shows that they don't work - * anyway, e.g. due to the wrong buffer modifiers. They might as well be - * less optimal due to the complexity dealing with rotation at scan-out, - * potentially resulting in higher power consumption. - */ return FALSE; } - return plane->all_hw_transforms & (1 << transform); + + return FALSE; } GArray * @@ -189,44 +238,6 @@ meta_kms_plane_is_usable_with (MetaKmsPlane *plane, return !!(plane->possible_crtcs & (1 << meta_kms_crtc_get_idx (crtc))); } -static void -update_rotations (MetaKmsPlane *plane) -{ - MetaKmsProp *prop; - MetaKmsPlaneRotation rotation; - - prop = &plane->prop_table.props[META_KMS_PLANE_PROP_ROTATION]; - rotation = prop->value; - - if (rotation & META_KMS_PLANE_ROTATION_ROTATE_0) - { - 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 (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 (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; - } -} - static inline uint32_t * drm_formats_ptr (struct drm_format_modifier_blob *blob) { @@ -369,6 +380,19 @@ update_legacy_formats (MetaKmsPlane *plane, } } +static void +update_rotations (MetaKmsPlane *plane) +{ + unsigned int i; + MetaKmsProp *rotation = &plane->prop_table.props[META_KMS_PLANE_PROP_ROTATION]; + + for (i = 0; i < rotation->num_enum_values; i++) + { + if (rotation->enum_values[i].valid) + plane->rotations |= rotation->enum_values[i].bitmask; + } +} + static MetaKmsUpdateChanges meta_kms_plane_read_state (MetaKmsPlane *plane, MetaKmsImplDevice *impl_device, diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h index a613cbc5d..9dab7c133 100644 --- a/src/backends/native/meta-kms-update-private.h +++ b/src/backends/native/meta-kms-update-private.h @@ -23,6 +23,7 @@ #include #include +#include "backends/native/meta-kms-plane-private.h" #include "backends/native/meta-kms-types.h" #include "backends/native/meta-kms-update.h" @@ -50,8 +51,7 @@ typedef struct _MetaKmsPlaneAssignment MetaRectangle dst_rect; MetaKmsAssignPlaneFlag flags; MetaKmsFbDamage *fb_damage; - - uint64_t rotation; + MetaKmsPlaneRotation rotation; struct { gboolean is_valid; @@ -133,7 +133,7 @@ META_EXPORT_TEST MetaKmsDevice * meta_kms_update_get_device (MetaKmsUpdate *update); void meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment, - uint64_t rotation); + MetaKmsPlaneRotation rotation); META_EXPORT_TEST MetaKmsPlaneAssignment * meta_kms_update_get_primary_plane_assignment (MetaKmsUpdate *update, diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c index 53fc92eb8..042714d0a 100644 --- a/src/backends/native/meta-kms-update.c +++ b/src/backends/native/meta-kms-update.c @@ -497,7 +497,7 @@ meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignmen void meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment, - uint64_t rotation) + MetaKmsPlaneRotation rotation) { g_assert (!meta_kms_update_is_locked (plane_assignment->update)); g_warn_if_fail (rotation);