From 8e235768daca1ec0c4f95d7d3c0da659781e732e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 22 Jan 2021 11:31:18 +0100 Subject: [PATCH] kms/update: Encapsulate custom page flip fields in object Makes more sense to pass around an encapsulated object with the relevant data, than passing around a vfunc and a gpointer. Part-of: --- .../native/meta-kms-impl-device-simple.c | 49 +++++++++---------- src/backends/native/meta-kms-update-private.h | 15 ++++-- src/backends/native/meta-kms-update.c | 28 +++++++---- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/backends/native/meta-kms-impl-device-simple.c b/src/backends/native/meta-kms-impl-device-simple.c index d83b504ee..3ffda075a 100644 --- a/src/backends/native/meta-kms-impl-device-simple.c +++ b/src/backends/native/meta-kms-impl-device-simple.c @@ -527,14 +527,15 @@ typedef struct _RetryPageFlipData MetaKmsPageFlipData *page_flip_data; float refresh_rate; uint64_t retry_time_us; - MetaKmsCustomPageFlipFunc custom_page_flip_func; - gpointer custom_page_flip_user_data; + MetaKmsCustomPageFlip *custom_page_flip; } RetryPageFlipData; static void retry_page_flip_data_free (RetryPageFlipData *retry_page_flip_data) { g_assert (!retry_page_flip_data->page_flip_data); + g_clear_pointer (&retry_page_flip_data->custom_page_flip, + meta_kms_custom_page_flip_free); g_free (retry_page_flip_data); } @@ -581,7 +582,7 @@ retry_page_flips (gpointer user_data) int fd; int ret; MetaKmsPageFlipData *page_flip_data; - MetaKmsCustomPageFlipFunc custom_page_flip_func; + MetaKmsCustomPageFlip *custom_page_flip; if (is_timestamp_earlier_than (now_us, retry_page_flip_data->retry_time_us)) @@ -590,15 +591,15 @@ retry_page_flips (gpointer user_data) continue; } - custom_page_flip_func = retry_page_flip_data->custom_page_flip_func; - if (custom_page_flip_func) + custom_page_flip = retry_page_flip_data->custom_page_flip; + if (custom_page_flip) { meta_topic (META_DEBUG_KMS, "[simple] Retrying custom page flip on CRTC %u (%s)", meta_kms_crtc_get_id (crtc), meta_kms_impl_device_get_path (impl_device)); - ret = custom_page_flip_func (retry_page_flip_data->custom_page_flip_user_data, - retry_page_flip_data->page_flip_data); + ret = custom_page_flip->func (custom_page_flip->user_data, + retry_page_flip_data->page_flip_data); } else { @@ -689,13 +690,12 @@ retry_page_flips (gpointer user_data) } static void -schedule_retry_page_flip (MetaKmsImplDeviceSimple *impl_device_simple, - MetaKmsCrtc *crtc, - uint32_t fb_id, - float refresh_rate, - MetaKmsPageFlipData *page_flip_data, - MetaKmsCustomPageFlipFunc custom_page_flip_func, - gpointer custom_page_flip_user_data) +schedule_retry_page_flip (MetaKmsImplDeviceSimple *impl_device_simple, + MetaKmsCrtc *crtc, + uint32_t fb_id, + float refresh_rate, + MetaKmsPageFlipData *page_flip_data, + MetaKmsCustomPageFlip *custom_page_flip) { RetryPageFlipData *retry_page_flip_data; uint64_t now_us; @@ -711,8 +711,7 @@ schedule_retry_page_flip (MetaKmsImplDeviceSimple *impl_device_simple, .page_flip_data = page_flip_data, .refresh_rate = refresh_rate, .retry_time_us = retry_time_us, - .custom_page_flip_func = custom_page_flip_func, - .custom_page_flip_user_data = custom_page_flip_user_data, + .custom_page_flip = custom_page_flip, }; if (!impl_device_simple->retry_page_flips_source) @@ -892,8 +891,7 @@ dispatch_page_flip (MetaKmsImplDevice *impl_device, META_KMS_IMPL_DEVICE_SIMPLE (impl_device); MetaKmsCrtc *crtc; MetaKmsPlaneAssignment *plane_assignment; - MetaKmsCustomPageFlipFunc custom_page_flip_func; - gpointer custom_page_flip_user_data; + g_autoptr (MetaKmsCustomPageFlip) custom_page_flip = NULL; int fd; int ret; @@ -901,11 +899,9 @@ dispatch_page_flip (MetaKmsImplDevice *impl_device, plane_assignment = meta_kms_update_get_primary_plane_assignment (update, crtc); - meta_kms_update_get_custom_page_flip_func (update, - &custom_page_flip_func, - &custom_page_flip_user_data); + custom_page_flip = meta_kms_update_take_custom_page_flip_func (update); - if (!plane_assignment && !custom_page_flip_func) + if (!plane_assignment && !custom_page_flip) { MetaKmsDevice *device = meta_kms_impl_device_get_device (impl_device); MetaKms *kms = meta_kms_device_get_kms (device); @@ -925,14 +921,14 @@ dispatch_page_flip (MetaKmsImplDevice *impl_device, } fd = meta_kms_impl_device_get_fd (impl_device); - if (custom_page_flip_func) + if (custom_page_flip) { meta_topic (META_DEBUG_KMS, "[simple] Invoking custom page flip on CRTC %u (%s)", meta_kms_crtc_get_id (crtc), meta_kms_impl_device_get_path (impl_device)); - ret = custom_page_flip_func (custom_page_flip_user_data, - page_flip_data); + ret = custom_page_flip->func (custom_page_flip->user_data, + page_flip_data); } else { @@ -981,8 +977,7 @@ dispatch_page_flip (MetaKmsImplDevice *impl_device, fb_id, refresh_rate, page_flip_data, - custom_page_flip_func, - custom_page_flip_user_data); + g_steal_pointer (&custom_page_flip)); } else { diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h index d3f298d5e..1954c7a78 100644 --- a/src/backends/native/meta-kms-update-private.h +++ b/src/backends/native/meta-kms-update-private.h @@ -87,6 +87,12 @@ typedef struct _MetaKmsResultListener gpointer user_data; } MetaKmsResultListener; +typedef struct _MetaKmsCustomPageFlip +{ + MetaKmsCustomPageFlipFunc func; + gpointer user_data; +} MetaKmsCustomPageFlip; + void meta_kms_plane_feedback_free (MetaKmsPlaneFeedback *plane_feedback); MetaKmsPlaneFeedback * meta_kms_plane_feedback_new_take_error (MetaKmsPlane *plane, @@ -126,9 +132,7 @@ GList * meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update); gboolean meta_kms_update_is_power_save (MetaKmsUpdate *update); -void meta_kms_update_get_custom_page_flip_func (MetaKmsUpdate *update, - MetaKmsCustomPageFlipFunc *custom_page_flip_func, - gpointer *custom_page_flip_user_data); +MetaKmsCustomPageFlip * meta_kms_update_take_custom_page_flip_func (MetaKmsUpdate *update); void meta_kms_update_drop_plane_assignment (MetaKmsUpdate *update, MetaKmsPlane *plane); @@ -140,7 +144,12 @@ void meta_kms_result_listener_notify (MetaKmsResultListener *listener, void meta_kms_result_listener_free (MetaKmsResultListener *listener); +void meta_kms_custom_page_flip_free (MetaKmsCustomPageFlip *custom_page_flip); + G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaKmsPlaneFeedback, meta_kms_plane_feedback_free) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaKmsCustomPageFlip, + meta_kms_custom_page_flip_free) + #endif /* META_KMS_UPDATE_PRIVATE_H */ diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c index 427a5b009..175461126 100644 --- a/src/backends/native/meta-kms-update.c +++ b/src/backends/native/meta-kms-update.c @@ -42,8 +42,7 @@ struct _MetaKmsUpdate GList *connector_updates; GList *crtc_gammas; - MetaKmsCustomPageFlipFunc custom_page_flip_func; - gpointer custom_page_flip_user_data; + MetaKmsCustomPageFlip *custom_page_flip; GList *page_flip_listeners; GList *result_listeners; @@ -423,11 +422,16 @@ meta_kms_update_set_custom_page_flip (MetaKmsUpdate *update, MetaKmsCustomPageFlipFunc func, gpointer user_data) { + MetaKmsCustomPageFlip *custom_page_flip; + g_assert (!meta_kms_update_is_locked (update)); g_assert (!update->power_save); - update->custom_page_flip_func = func; - update->custom_page_flip_user_data = user_data; + custom_page_flip = g_new0 (MetaKmsCustomPageFlip, 1); + custom_page_flip->func = func; + custom_page_flip->user_data = user_data; + + update->custom_page_flip = custom_page_flip; } void @@ -569,13 +573,16 @@ meta_kms_update_get_device (MetaKmsUpdate *update) return update->device; } -void -meta_kms_update_get_custom_page_flip_func (MetaKmsUpdate *update, - MetaKmsCustomPageFlipFunc *custom_page_flip_func, - gpointer *custom_page_flip_user_data) +MetaKmsCustomPageFlip * +meta_kms_update_take_custom_page_flip_func (MetaKmsUpdate *update) { - *custom_page_flip_func = update->custom_page_flip_func; - *custom_page_flip_user_data = update->custom_page_flip_user_data; + return g_steal_pointer (&update->custom_page_flip); +} + +void +meta_kms_custom_page_flip_free (MetaKmsCustomPageFlip *custom_page_flip) +{ + g_free (custom_page_flip); } uint64_t @@ -610,6 +617,7 @@ meta_kms_update_free (MetaKmsUpdate *update) (GDestroyNotify) meta_kms_page_flip_listener_free); g_list_free_full (update->connector_updates, g_free); g_list_free_full (update->crtc_gammas, (GDestroyNotify) meta_kms_crtc_gamma_free); + g_clear_pointer (&update->custom_page_flip, meta_kms_custom_page_flip_free); g_free (update); }