From 7d119a19e180dab6ba21045280beb28b6d8e49e9 Mon Sep 17 00:00:00 2001 From: Igor Demyanov Date: Thu, 1 May 2025 22:38:28 +0300 Subject: [PATCH 1/3] add support kms drm property set --- src/flutter-pi.c | 18 ++++++++++++++++++ src/flutter-pi.h | 6 ++++++ src/modesetting.c | 13 +++++++++++++ src/modesetting.h | 2 ++ 4 files changed, 39 insertions(+) diff --git a/src/flutter-pi.c b/src/flutter-pi.c index 10219914..92368132 100644 --- a/src/flutter-pi.c +++ b/src/flutter-pi.c @@ -2857,3 +2857,21 @@ int flutterpi_app_main(int argc, char **argv) { return EXIT_SUCCESS; } + + + +uint32_t KMS_DRM_isAvailable() { + // if (plugin!= NULL && plugin->flutterpi->drmdev != NULL) { + if (flutterpi->drmdev != NULL) { + return 1; + } + return 0; +} + +void KMS_DRM_setProperty(uint32_t propId, uint64_t value) { + kms_drm_setProperty(flutterpi->drmdev, propId, value); +} + +uint64_t KMS_DRM_getProperty(uint32_t propId) { + return -1; +} \ No newline at end of file diff --git a/src/flutter-pi.h b/src/flutter-pi.h index d2e831d9..5100afd7 100644 --- a/src/flutter-pi.h +++ b/src/flutter-pi.h @@ -196,4 +196,10 @@ void flutterpi_trace_event_begin(struct flutterpi *flutterpi, const char *name); void flutterpi_trace_event_end(struct flutterpi *flutterpi, const char *name); +uint32_t KMS_DRM_isAvailable(); + +void KMS_DRM_setProperty(uint32_t propId, uint64_t value) ; + +uint64_t KMS_DRM_getProperty(uint32_t propId); + #endif // _FLUTTERPI_SRC_FLUTTERPI_H diff --git a/src/modesetting.c b/src/modesetting.c index 722a71ea..21eb435f 100644 --- a/src/modesetting.c +++ b/src/modesetting.c @@ -2990,3 +2990,16 @@ int kms_req_commit_blocking(struct kms_req *req, uint64_t *vblank_ns_out) { int kms_req_commit_nonblocking(struct kms_req *req, kms_scanout_cb_t scanout_cb, void *userdata, void_callback_t destroy_cb) { return kms_req_commit_common(req, false, scanout_cb, userdata, destroy_cb); } + + +void kms_drm_setProperty(struct drmdev *drmdev, uint32_t propId, uint64_t value){ + struct drm_connector *connectors = drmdev->connectors; + size_t n_connectors = drmdev->n_connectors; + for (int i = 0; i < n_connectors; i++) { + if ( + connectors->variable_state.connection_state == kConnected_DrmConnectionState || + connectors->variable_state.connection_state == kUnknown_DrmConnectionState ){ + drmModeObjectSetProperty(drmdev->fd, connectors->id, DRM_MODE_OBJECT_CONNECTOR, propId, value); + } + } +} \ No newline at end of file diff --git a/src/modesetting.h b/src/modesetting.h index 401e1150..851a4e4c 100644 --- a/src/modesetting.h +++ b/src/modesetting.h @@ -918,6 +918,8 @@ int kms_req_commit_blocking(struct kms_req *req, uint64_t *vblank_ns_out); int kms_req_commit_nonblocking(struct kms_req *req, kms_scanout_cb_t scanout_cb, void *userdata, void_callback_t destroy_cb); +void kms_drm_setProperty(struct drmdev *drmdev, uint32_t propId, uint64_t value); + struct drm_connector *__next_connector(const struct drmdev *drmdev, const struct drm_connector *connector); struct drm_encoder *__next_encoder(const struct drmdev *drmdev, const struct drm_encoder *encoder); From fb597dd8b55474175ab964f5e2511bbf1a82f808 Mon Sep 17 00:00:00 2001 From: Igor Demyanov Date: Thu, 1 May 2025 22:53:39 +0300 Subject: [PATCH 2/3] remove comment --- src/flutter-pi.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/flutter-pi.c b/src/flutter-pi.c index 92368132..f408a1a9 100644 --- a/src/flutter-pi.c +++ b/src/flutter-pi.c @@ -2861,7 +2861,6 @@ int flutterpi_app_main(int argc, char **argv) { uint32_t KMS_DRM_isAvailable() { - // if (plugin!= NULL && plugin->flutterpi->drmdev != NULL) { if (flutterpi->drmdev != NULL) { return 1; } From 6365c914ea4460074d0242ddc4557b0489d3d020 Mon Sep 17 00:00:00 2001 From: Igor Demyanov Date: Sat, 3 May 2025 10:26:37 +0300 Subject: [PATCH 3/3] implement DPMS get/set property --- src/flutter-pi.c | 10 ++--- src/flutter-pi.h | 6 +-- src/modesetting.c | 94 +++++++++++++++++++++++++++++++++++++++++++++-- src/modesetting.h | 4 +- 4 files changed, 102 insertions(+), 12 deletions(-) diff --git a/src/flutter-pi.c b/src/flutter-pi.c index f408a1a9..5fed34da 100644 --- a/src/flutter-pi.c +++ b/src/flutter-pi.c @@ -2860,17 +2860,17 @@ int flutterpi_app_main(int argc, char **argv) { -uint32_t KMS_DRM_isAvailable() { +uint32_t dpms_isAvailable() { if (flutterpi->drmdev != NULL) { return 1; } return 0; } -void KMS_DRM_setProperty(uint32_t propId, uint64_t value) { - kms_drm_setProperty(flutterpi->drmdev, propId, value); +void dpms_setProperty(uint64_t value) { + kms_dpms_setValue(flutterpi->drmdev,value); } -uint64_t KMS_DRM_getProperty(uint32_t propId) { - return -1; +uint64_t dpms_getProperty(){ + return kms_dpms_getValue(flutterpi->drmdev); } \ No newline at end of file diff --git a/src/flutter-pi.h b/src/flutter-pi.h index 5100afd7..cc8701f6 100644 --- a/src/flutter-pi.h +++ b/src/flutter-pi.h @@ -196,10 +196,10 @@ void flutterpi_trace_event_begin(struct flutterpi *flutterpi, const char *name); void flutterpi_trace_event_end(struct flutterpi *flutterpi, const char *name); -uint32_t KMS_DRM_isAvailable(); +uint32_t dpms_isAvailable(); -void KMS_DRM_setProperty(uint32_t propId, uint64_t value) ; +void dpms_setProperty(uint64_t value) ; -uint64_t KMS_DRM_getProperty(uint32_t propId); +uint64_t dpms_getProperty(); #endif // _FLUTTERPI_SRC_FLUTTERPI_H diff --git a/src/modesetting.c b/src/modesetting.c index 21eb435f..9c5906e2 100644 --- a/src/modesetting.c +++ b/src/modesetting.c @@ -2991,15 +2991,103 @@ int kms_req_commit_nonblocking(struct kms_req *req, kms_scanout_cb_t scanout_cb, return kms_req_commit_common(req, false, scanout_cb, userdata, destroy_cb); } +#define DPMS_PROPERTY_NAME "DPMS" +#define DPMS_ERROR_PROPERTY_ID 0 +// FIXME: Is 0 error value? +#define DPMS_ERROR_PROPERTY_VALUE 0 + + +uint32_t kms_drm_getDPMSPropertyId(struct drmdev *drmdev, uint32_t connector_id){ + ASSERT_NOT_NULL(drmdev); + ASSERT_NOT_NULL(drmdev->fd); + drmModeObjectProperties *props = drmModeObjectGetProperties(drmdev->fd, connector_id, DRM_MODE_OBJECT_CONNECTOR); + if (props == NULL){ + int ok = errno; + LOG_ERROR("Could not get connector properties. drmModeObjectGetProperties: %s\n", strerror(ok)); + return DPMS_ERROR_PROPERTY_ID; + } + + uint32_t result_prop_id = DPMS_ERROR_PROPERTY_ID; + for (unsigned i = 0; i < props->count_props; ++i) { + uint32_t prop_id = props->props[i]; + drmModePropertyRes *drm_prop = drmModeGetProperty(drmdev->fd, prop_id); + if (drm_prop != NULL) { + if (streq(drm_prop->name, DPMS_PROPERTY_NAME)){ + result_prop_id = prop_id; + } + } + drmModeFreeProperty(drm_prop); + } + + drmModeFreeObjectProperties(props); + return result_prop_id; +} + +uint32_t kms_drm_getDPMSPropertyValue(struct drmdev *drmdev, uint32_t connector_id){ + ASSERT_NOT_NULL(drmdev); + ASSERT_NOT_NULL(drmdev->fd); + drmModeObjectProperties *props = drmModeObjectGetProperties(drmdev->fd, connector_id, DRM_MODE_OBJECT_CONNECTOR); + if (props == NULL){ + int ok = errno; + LOG_ERROR("Could not get connector properties. drmModeObjectGetProperties: %s\n", strerror(ok)); + return DPMS_ERROR_PROPERTY_ID; + } + + uint32_t result_prop_value = DPMS_ERROR_PROPERTY_VALUE; + for (unsigned i = 0; i < props->count_props; ++i) { + uint32_t prop_id = props->props[i]; + drmModePropertyRes *drm_prop = drmModeGetProperty(drmdev->fd, prop_id); + if (drm_prop != NULL) { + if (streq(drm_prop->name, DPMS_PROPERTY_NAME)){ + result_prop_value = props->prop_values[i]; + } + } + drmModeFreeProperty(drm_prop); + } + + drmModeFreeObjectProperties(props); + return result_prop_value; +} + + +uint64_t kms_dpms_getValue(struct drmdev *drmdev){ + ASSERT_NOT_NULL(drmdev); + + struct drm_connector *connectors = drmdev->connectors; + size_t n_connectors = drmdev->n_connectors; + uint64_t result = DPMS_ERROR_PROPERTY_VALUE; + + for (int i = 0; i < n_connectors; i++) { + if ( + connectors->variable_state.connection_state == kConnected_DrmConnectionState || + connectors->variable_state.connection_state == kUnknown_DrmConnectionState ){ + uint32_t property_id = kms_drm_getDPMSPropertyId(drmdev, connectors->id); + if (property_id != DPMS_ERROR_PROPERTY_ID){ + // Return only first value + result = kms_drm_getDPMSPropertyValue(drmdev, connectors->id); + break; + } + } + } + + return result; +} + + +void kms_dpms_setValue(struct drmdev *drmdev, uint64_t value){ + ASSERT_NOT_NULL(drmdev); -void kms_drm_setProperty(struct drmdev *drmdev, uint32_t propId, uint64_t value){ struct drm_connector *connectors = drmdev->connectors; size_t n_connectors = drmdev->n_connectors; + for (int i = 0; i < n_connectors; i++) { if ( connectors->variable_state.connection_state == kConnected_DrmConnectionState || connectors->variable_state.connection_state == kUnknown_DrmConnectionState ){ - drmModeObjectSetProperty(drmdev->fd, connectors->id, DRM_MODE_OBJECT_CONNECTOR, propId, value); + uint32_t property_id = kms_drm_getDPMSPropertyId(drmdev, connectors->id); + if (property_id != DPMS_ERROR_PROPERTY_ID){ + drmModeObjectSetProperty(drmdev->fd, connectors->id, DRM_MODE_OBJECT_CONNECTOR, property_id, value); + } } } -} \ No newline at end of file +} diff --git a/src/modesetting.h b/src/modesetting.h index 851a4e4c..91bf25d2 100644 --- a/src/modesetting.h +++ b/src/modesetting.h @@ -918,7 +918,9 @@ int kms_req_commit_blocking(struct kms_req *req, uint64_t *vblank_ns_out); int kms_req_commit_nonblocking(struct kms_req *req, kms_scanout_cb_t scanout_cb, void *userdata, void_callback_t destroy_cb); -void kms_drm_setProperty(struct drmdev *drmdev, uint32_t propId, uint64_t value); +uint64_t kms_dpms_getValue(struct drmdev *drmdev); + +void kms_dpms_setValue(struct drmdev *drmdev, uint64_t value); struct drm_connector *__next_connector(const struct drmdev *drmdev, const struct drm_connector *connector);