backends/native: Use MetaKmsPlaneRotation in plane updates

The ImplDeviceAtomic converts the MetaKmsPlaneRotation back to the
concrete KMS value. The MetaMonitorTransform is always directly
converted to a MetaKmsPlaneRotation.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2379>
This commit is contained in:
Sebastian Wick 2022-04-20 22:54:27 +02:00 committed by Marge Bot
parent 981524c268
commit 4e3f3842a1
9 changed files with 124 additions and 63 deletions

View File

@ -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);

View File

@ -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)
{

View File

@ -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 */

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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);

View File

@ -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,

View File

@ -23,6 +23,7 @@
#include <glib.h>
#include <stdint.h>
#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,

View File

@ -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);