kms: Make KMS feedback struct ref counted

It'll later be sent asynchronously; to prepare for that make it ref
counted with an atomic ref counter.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2854>
This commit is contained in:
Jonas Ådahl 2022-01-10 17:01:41 +01:00 committed by Marge Bot
parent 37db905ff9
commit 7253ac501d
5 changed files with 29 additions and 13 deletions

View File

@ -40,6 +40,8 @@ typedef struct _MetaKmsCrtcColorUpdate
typedef struct _MetaKmsFeedback typedef struct _MetaKmsFeedback
{ {
gatomicrefcount ref_count;
MetaKmsFeedbackResult result; MetaKmsFeedbackResult result;
GList *failed_planes; GList *failed_planes;

View File

@ -90,6 +90,7 @@ meta_kms_feedback_new_passed (GList *failed_planes)
.result = META_KMS_FEEDBACK_PASSED, .result = META_KMS_FEEDBACK_PASSED,
.failed_planes = failed_planes, .failed_planes = failed_planes,
}; };
g_atomic_ref_count_init (&feedback->ref_count);
return feedback; return feedback;
} }
@ -106,18 +107,29 @@ meta_kms_feedback_new_failed (GList *failed_planes,
.error = error, .error = error,
.failed_planes = failed_planes, .failed_planes = failed_planes,
}; };
g_atomic_ref_count_init (&feedback->ref_count);
return feedback; return feedback;
} }
MetaKmsFeedback *
meta_kms_feedback_ref (MetaKmsFeedback *feedback)
{
g_atomic_ref_count_inc (&feedback->ref_count);
return feedback;
}
void void
meta_kms_feedback_free (MetaKmsFeedback *feedback) meta_kms_feedback_unref (MetaKmsFeedback *feedback)
{
if (g_atomic_ref_count_dec (&feedback->ref_count))
{ {
g_list_free_full (feedback->failed_planes, g_list_free_full (feedback->failed_planes,
(GDestroyNotify) meta_kms_plane_feedback_free); (GDestroyNotify) meta_kms_plane_feedback_free);
g_clear_error (&feedback->error); g_clear_error (&feedback->error);
g_free (feedback); g_free (feedback);
} }
}
MetaKmsFeedbackResult MetaKmsFeedbackResult
meta_kms_feedback_get_result (const MetaKmsFeedback *feedback) meta_kms_feedback_get_result (const MetaKmsFeedback *feedback)

View File

@ -81,8 +81,10 @@ typedef struct _MetaKmsPlaneFeedback
typedef void (* MetaKmsResultListenerFunc) (const MetaKmsFeedback *feedback, typedef void (* MetaKmsResultListenerFunc) (const MetaKmsFeedback *feedback,
gpointer user_data); gpointer user_data);
MetaKmsFeedback * meta_kms_feedback_ref (MetaKmsFeedback *feedback);
META_EXPORT_TEST META_EXPORT_TEST
void meta_kms_feedback_free (MetaKmsFeedback *feedback); void meta_kms_feedback_unref (MetaKmsFeedback *feedback);
MetaKmsFeedbackResult meta_kms_feedback_get_result (const MetaKmsFeedback *feedback); MetaKmsFeedbackResult meta_kms_feedback_get_result (const MetaKmsFeedback *feedback);
@ -202,7 +204,7 @@ meta_fixed_16_rectangle_to_rectangle (MetaFixed16Rectangle fixed_rect)
meta_fixed_16_from_int (_w), \ meta_fixed_16_from_int (_w), \
meta_fixed_16_from_int (_h)) meta_fixed_16_from_int (_h))
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaKmsFeedback, meta_kms_feedback_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaKmsFeedback, meta_kms_feedback_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaKmsUpdate, meta_kms_update_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaKmsUpdate, meta_kms_update_free)
#endif /* META_KMS_UPDATE_H */ #endif /* META_KMS_UPDATE_H */

View File

@ -284,7 +284,7 @@ meta_test_kms_device_mode_set (void)
META_KMS_ASSIGN_PLANE_FLAG_NONE); META_KMS_ASSIGN_PLANE_FLAG_NONE);
feedback = meta_kms_device_process_update_sync (device, update, feedback = meta_kms_device_process_update_sync (device, update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
meta_kms_feedback_free (feedback); meta_kms_feedback_unref (feedback);
meta_kms_update_free (update); meta_kms_update_free (update);
g_assert_nonnull (meta_kms_crtc_get_current_state (crtc)); g_assert_nonnull (meta_kms_crtc_get_current_state (crtc));
@ -349,7 +349,7 @@ meta_test_kms_device_power_save (void)
META_KMS_ASSIGN_PLANE_FLAG_NONE); META_KMS_ASSIGN_PLANE_FLAG_NONE);
feedback = meta_kms_device_process_update_sync (device, update, feedback = meta_kms_device_process_update_sync (device, update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
meta_kms_feedback_free (feedback); meta_kms_feedback_unref (feedback);
meta_kms_update_free (update); meta_kms_update_free (update);
g_assert_true (meta_kms_crtc_is_active (crtc)); g_assert_true (meta_kms_crtc_is_active (crtc));
@ -387,7 +387,7 @@ meta_test_kms_device_power_save (void)
META_KMS_ASSIGN_PLANE_FLAG_NONE); META_KMS_ASSIGN_PLANE_FLAG_NONE);
feedback = meta_kms_device_process_update_sync (device, update, feedback = meta_kms_device_process_update_sync (device, update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
meta_kms_feedback_free (feedback); meta_kms_feedback_unref (feedback);
meta_kms_update_free (update); meta_kms_update_free (update);
g_assert_true (meta_kms_crtc_is_active (crtc)); g_assert_true (meta_kms_crtc_is_active (crtc));

View File

@ -357,7 +357,7 @@ meta_test_kms_update_page_flip (void)
feedback = feedback =
meta_kms_device_process_update_sync (device, update, meta_kms_device_process_update_sync (device, update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
meta_kms_feedback_free (feedback); meta_kms_feedback_unref (feedback);
meta_kms_update_free (update); meta_kms_update_free (update);
g_main_loop_run (data.loop); g_main_loop_run (data.loop);
@ -382,7 +382,7 @@ meta_test_kms_update_page_flip (void)
feedback = feedback =
meta_kms_device_process_update_sync (device, update, meta_kms_device_process_update_sync (device, update,
META_KMS_UPDATE_FLAG_NONE); META_KMS_UPDATE_FLAG_NONE);
meta_kms_feedback_free (feedback); meta_kms_feedback_unref (feedback);
meta_kms_update_free (update); meta_kms_update_free (update);
g_main_loop_run (data.loop); g_main_loop_run (data.loop);