diff --git a/src/backends/native/meta-kms-crtc-private.h b/src/backends/native/meta-kms-crtc-private.h index f9a3a6e0a..bbf014bf5 100644 --- a/src/backends/native/meta-kms-crtc-private.h +++ b/src/backends/native/meta-kms-crtc-private.h @@ -24,6 +24,13 @@ #include "backends/native/meta-kms-types.h" +typedef enum _MetaKmsCrtcProp +{ + META_KMS_CRTC_PROP_MODE_ID = 0, + META_KMS_CRTC_PROP_ACTIVE, + META_KMS_CRTC_N_PROPS +} MetaKmsCrtcProp; + MetaKmsCrtc * meta_kms_crtc_new (MetaKmsImplDevice *impl_device, drmModeCrtc *drm_crtc, int idx); @@ -33,4 +40,10 @@ void meta_kms_crtc_update_state (MetaKmsCrtc *crtc); void meta_kms_crtc_predict_state (MetaKmsCrtc *crtc, MetaKmsUpdate *update); +uint32_t meta_kms_crtc_get_prop_id (MetaKmsCrtc *crtc, + MetaKmsCrtcProp prop); + +const char * meta_kms_crtc_get_prop_name (MetaKmsCrtc *crtc, + MetaKmsCrtcProp prop); + #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 0040ee340..2b04aa627 100644 --- a/src/backends/native/meta-kms-crtc.c +++ b/src/backends/native/meta-kms-crtc.c @@ -27,6 +27,11 @@ #include "backends/native/meta-kms-mode.h" #include "backends/native/meta-kms-update-private.h" +typedef struct _MetaKmsCrtcPropTable +{ + MetaKmsProp props[META_KMS_CRTC_N_PROPS]; +} MetaKmsCrtcPropTable; + struct _MetaKmsCrtc { GObject parent; @@ -37,6 +42,8 @@ struct _MetaKmsCrtc int idx; MetaKmsCrtcState current_state; + + MetaKmsCrtcPropTable prop_table; }; G_DEFINE_TYPE (MetaKmsCrtc, meta_kms_crtc, G_TYPE_OBJECT) @@ -76,6 +83,20 @@ meta_kms_crtc_get_idx (MetaKmsCrtc *crtc) return crtc->idx; } +uint32_t +meta_kms_crtc_get_prop_id (MetaKmsCrtc *crtc, + MetaKmsCrtcProp prop) +{ + return crtc->prop_table.props[prop].prop_id; +} + +const char * +meta_kms_crtc_get_prop_name (MetaKmsCrtc *crtc, + MetaKmsCrtcProp prop) +{ + return crtc->prop_table.props[prop].name; +} + static void read_gamma_state (MetaKmsCrtc *crtc, MetaKmsImplDevice *impl_device, @@ -214,6 +235,44 @@ meta_kms_crtc_predict_state (MetaKmsCrtc *crtc, } } +static void +init_proporties (MetaKmsCrtc *crtc, + MetaKmsImplDevice *impl_device, + drmModeCrtc *drm_crtc) +{ + MetaKmsCrtcPropTable *prop_table = &crtc->prop_table; + int fd; + drmModeObjectProperties *drm_props; + + *prop_table = (MetaKmsCrtcPropTable) { + .props = { + [META_KMS_CRTC_PROP_MODE_ID] = + { + .name = "MODE_ID", + .type = DRM_MODE_PROP_BLOB, + }, + [META_KMS_CRTC_PROP_ACTIVE] = + { + .name = "ACTIVE", + .type = DRM_MODE_PROP_RANGE, + }, + } + }; + + 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->count_props, + crtc->prop_table.props, + META_KMS_CRTC_N_PROPS); + + drmModeFreeObjectProperties (drm_props); +} + MetaKmsCrtc * meta_kms_crtc_new (MetaKmsImplDevice *impl_device, drmModeCrtc *drm_crtc, @@ -226,6 +285,8 @@ meta_kms_crtc_new (MetaKmsImplDevice *impl_device, crtc->id = drm_crtc->crtc_id; crtc->idx = idx; + init_proporties (crtc, impl_device, drm_crtc); + meta_kms_crtc_read_state (crtc, impl_device, drm_crtc); return crtc;