diff --git a/src/backends/native/meta-kms-plane-private.h b/src/backends/native/meta-kms-plane-private.h index 2a36d4917..7454cd244 100644 --- a/src/backends/native/meta-kms-plane-private.h +++ b/src/backends/native/meta-kms-plane-private.h @@ -26,6 +26,22 @@ #include "backends/native/meta-kms-plane.h" #include "backends/native/meta-kms-types.h" +typedef enum _MetaKmsPlaneProp +{ + META_KMS_PLANE_PROP_TYPE = 0, + META_KMS_PLANE_PROP_SRC_X, + META_KMS_PLANE_PROP_SRC_Y, + META_KMS_PLANE_PROP_SRC_W, + META_KMS_PLANE_PROP_SRC_H, + META_KMS_PLANE_PROP_CRTC_X, + META_KMS_PLANE_PROP_CRTC_Y, + META_KMS_PLANE_PROP_CRTC_W, + META_KMS_PLANE_PROP_CRTC_H, + META_KMS_PLANE_PROP_FB_ID, + META_KMS_PLANE_PROP_CRTC_ID, + META_KMS_PLANE_N_PROPS +} MetaKmsPlaneProp; + MetaKmsPlane * meta_kms_plane_new (MetaKmsPlaneType type, MetaKmsImplDevice *impl_device, drmModePlane *drm_plane, @@ -34,4 +50,10 @@ MetaKmsPlane * meta_kms_plane_new (MetaKmsPlaneType type, MetaKmsPlane * meta_kms_plane_new_fake (MetaKmsPlaneType type, MetaKmsCrtc *crtc); +uint32_t meta_kms_plane_get_prop_id (MetaKmsPlane *plane, + MetaKmsPlaneProp prop); + +const char * meta_kms_plane_get_prop_name (MetaKmsPlane *plane, + MetaKmsPlaneProp prop); + #endif /* META_KMS_PLANE_PRIVATE_H */ diff --git a/src/backends/native/meta-kms-plane.c b/src/backends/native/meta-kms-plane.c index 152077036..8348f3757 100644 --- a/src/backends/native/meta-kms-plane.c +++ b/src/backends/native/meta-kms-plane.c @@ -30,6 +30,11 @@ #include "backends/native/meta-kms-impl-device.h" #include "backends/native/meta-kms-update-private.h" +typedef struct _MetaKmsPlanePropTable +{ + MetaKmsProp props[META_KMS_PLANE_N_PROPS]; +} MetaKmsPlanePropTable; + struct _MetaKmsPlane { GObject parent; @@ -52,6 +57,8 @@ struct _MetaKmsPlane */ GHashTable *formats_modifiers; + MetaKmsPlanePropTable prop_table; + MetaKmsDevice *device; }; @@ -77,6 +84,20 @@ meta_kms_plane_get_plane_type (MetaKmsPlane *plane) return plane->type; } +uint32_t +meta_kms_plane_get_prop_id (MetaKmsPlane *plane, + MetaKmsPlaneProp prop) +{ + return plane->prop_table.props[prop].prop_id; +} + +const char * +meta_kms_plane_get_prop_name (MetaKmsPlane *plane, + MetaKmsPlaneProp prop) +{ + return plane->prop_table.props[prop].name; +} + void meta_kms_plane_update_set_rotation (MetaKmsPlane *plane, MetaKmsPlaneAssignment *plane_assignment, @@ -363,6 +384,81 @@ init_formats (MetaKmsPlane *plane, } } +static void +init_properties (MetaKmsPlane *plane, + MetaKmsImplDevice *impl_device, + drmModePlane *drm_plane, + drmModeObjectProperties *drm_plane_props) +{ + MetaKmsPlanePropTable *prop_table = &plane->prop_table; + + *prop_table = (MetaKmsPlanePropTable) { + .props = { + [META_KMS_PLANE_PROP_TYPE] = + { + .name = "type", + .type = DRM_MODE_PROP_ENUM, + }, + [META_KMS_PLANE_PROP_SRC_X] = + { + .name = "SRC_X", + .type = DRM_MODE_PROP_RANGE, + }, + [META_KMS_PLANE_PROP_SRC_Y] = + { + .name = "SRC_Y", + .type = DRM_MODE_PROP_RANGE, + }, + [META_KMS_PLANE_PROP_SRC_W] = + { + .name = "SRC_W", + .type = DRM_MODE_PROP_RANGE, + }, + [META_KMS_PLANE_PROP_SRC_H] = + { + .name = "SRC_H", + .type = DRM_MODE_PROP_RANGE, + }, + [META_KMS_PLANE_PROP_CRTC_X] = + { + .name = "CRTC_X", + .type = DRM_MODE_PROP_SIGNED_RANGE, + }, + [META_KMS_PLANE_PROP_CRTC_Y] = + { + .name = "CRTC_Y", + .type = DRM_MODE_PROP_SIGNED_RANGE, + }, + [META_KMS_PLANE_PROP_CRTC_W] = + { + .name = "CRTC_W", + .type = DRM_MODE_PROP_RANGE, + }, + [META_KMS_PLANE_PROP_CRTC_H] = + { + .name = "CRTC_H", + .type = DRM_MODE_PROP_RANGE, + }, + [META_KMS_PLANE_PROP_FB_ID] = + { + .name = "FB_ID", + .type = DRM_MODE_PROP_OBJECT, + }, + [META_KMS_PLANE_PROP_CRTC_ID] = + { + .name = "CRTC_ID", + .type = DRM_MODE_PROP_OBJECT, + }, + } + }; + + meta_kms_impl_device_init_prop_table (impl_device, + drm_plane_props->props, + drm_plane_props->count_props, + plane->prop_table.props, + META_KMS_PLANE_N_PROPS); +} + MetaKmsPlane * meta_kms_plane_new (MetaKmsPlaneType type, MetaKmsImplDevice *impl_device, @@ -380,6 +476,8 @@ meta_kms_plane_new (MetaKmsPlaneType type, init_rotations (plane, impl_device, drm_plane_props); init_formats (plane, impl_device, drm_plane, drm_plane_props); + init_properties (plane, impl_device, drm_plane, drm_plane_props); + return plane; }