kms/result-listener: Allow setting a custom main context

While the default when passing NULL will be the main context of the main
thread, make it possible to specify another main context, so that
result handlers can be invoked on the right thread.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2777>
This commit is contained in:
Jonas Ådahl
2023-02-14 20:18:26 +01:00
parent 1e0367bf08
commit 7c9d4b8c7c
9 changed files with 131 additions and 1 deletions

View File

@ -361,6 +361,7 @@ assign_cursor_plane (MetaCursorRendererNative *native,
cursor_hotspot_y);
meta_kms_update_add_result_listener (kms_update,
NULL,
on_kms_update_result,
native);

View File

@ -128,6 +128,7 @@ typedef struct _MetaKmsPageFlipListener
struct _MetaKmsResultListener
{
GMainContext *main_context;
MetaKmsResultListenerFunc func;
gpointer user_data;
@ -191,8 +192,11 @@ MetaKmsCustomPageFlip * meta_kms_update_take_custom_page_flip_func (MetaKmsUpdat
void meta_kms_update_drop_plane_assignment (MetaKmsUpdate *update,
MetaKmsPlane *plane);
META_EXPORT_TEST
GList * meta_kms_update_take_result_listeners (MetaKmsUpdate *update);
GMainContext * meta_kms_result_listener_get_main_context (MetaKmsResultListener *listener);
void meta_kms_result_listener_set_feedback (MetaKmsResultListener *listener,
MetaKmsFeedback *feedback);

View File

@ -607,6 +607,7 @@ meta_kms_plane_assignment_set_cursor_hotspot (MetaKmsPlaneAssignment *plane_assi
void
meta_kms_update_add_result_listener (MetaKmsUpdate *update,
GMainContext *main_context,
MetaKmsResultListenerFunc func,
gpointer user_data)
{
@ -614,6 +615,7 @@ meta_kms_update_add_result_listener (MetaKmsUpdate *update,
listener = g_new0 (MetaKmsResultListener, 1);
*listener = (MetaKmsResultListener) {
.main_context = main_context,
.func = func,
.user_data = user_data,
};
@ -628,6 +630,12 @@ meta_kms_update_take_result_listeners (MetaKmsUpdate *update)
return g_steal_pointer (&update->result_listeners);
}
GMainContext *
meta_kms_result_listener_get_main_context (MetaKmsResultListener *listener)
{
return listener->main_context;
}
void
meta_kms_result_listener_set_feedback (MetaKmsResultListener *listener,
MetaKmsFeedback *feedback)

View File

@ -92,6 +92,7 @@ GList * meta_kms_feedback_get_failed_planes (const MetaKmsFeedback *feedback);
const GError * meta_kms_feedback_get_error (const MetaKmsFeedback *feedback);
META_EXPORT_TEST
void meta_kms_feedback_dispatch_result (MetaKmsFeedback *feedback,
MetaKms *kms,
GList *result_listeners);
@ -183,6 +184,7 @@ void meta_kms_plane_assignment_set_cursor_hotspot (MetaKmsPlaneAssignment *plane
META_EXPORT_TEST
void meta_kms_update_add_result_listener (MetaKmsUpdate *update,
GMainContext *main_context,
MetaKmsResultListenerFunc func,
gpointer user_data);

View File

@ -169,8 +169,11 @@ void
meta_kms_queue_result_callback (MetaKms *kms,
MetaKmsResultListener *listener)
{
GMainContext *main_context =
meta_kms_result_listener_get_main_context (listener);
meta_kms_queue_callback (kms,
NULL,
main_context,
invoke_result_listener,
listener,
(GDestroyNotify) meta_kms_result_listener_free);

View File

@ -1171,6 +1171,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
kms_update = meta_frame_native_ensure_kms_update (frame_native,
kms_device);
meta_kms_update_add_result_listener (kms_update,
NULL,
on_swap_buffer_update_result,
onscreen_native);
@ -1389,6 +1390,7 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
kms_update = meta_frame_native_ensure_kms_update (frame_native, kms_device);
meta_kms_update_add_result_listener (kms_update,
NULL,
on_scanout_update_result,
onscreen_native);
@ -1542,6 +1544,7 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
}
meta_kms_update_add_result_listener (kms_update,
NULL,
on_finish_frame_update_result,
onscreen_native);

View File

@ -865,6 +865,7 @@ post_mode_set_updates (MetaRendererNative *renderer_native)
g_hash_table_iter_steal (&iter);
meta_kms_update_add_result_listener (kms_update,
NULL,
on_mode_sets_update_result,
NULL);