diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2016-06-08 13:07:09 +0800 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2016-07-20 14:23:48 +0800 |
commit | 28a898a22f82449cce524773bbdd24246e53bf9d (patch) | |
tree | 7275545696d2331e45ce9473c5ce7951a70adf39 /src/backends/native/meta-stage-native.c | |
parent | 92341e7c309453c6742375d39a7bcc92657bbc72 (diff) | |
download | mutter-28a898a22f82449cce524773bbdd24246e53bf9d.tar.gz |
Use signals instead of onscreen framebuffer frame callbacks
CoglFrameInfo is a frame info container associated with a single
onscreen framebuffer. The clutter stage will eventually support drawing
a stage frame with multiple onscreen framebuffers, thus needs its own
frame info container.
This patch introduces a new stage signal 'presented' and a accompaning
ClutterFrameInfo and adapts the stage windows and past onscreen frame
callbacks users to use the signal and new info container.
https://bugzilla.gnome.org/show_bug.cgi?id=768976
Diffstat (limited to 'src/backends/native/meta-stage-native.c')
-rw-r--r-- | src/backends/native/meta-stage-native.c | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/src/backends/native/meta-stage-native.c b/src/backends/native/meta-stage-native.c index 1dd3c50d6..624c5142c 100644 --- a/src/backends/native/meta-stage-native.c +++ b/src/backends/native/meta-stage-native.c @@ -36,6 +36,7 @@ struct _MetaStageNative ClutterStageCogl parent; CoglOnscreen *pending_onscreen; + CoglClosure *frame_closure; }; static ClutterStageWindowIface *clutter_stage_window_parent_iface = NULL; @@ -136,6 +137,16 @@ meta_stage_native_unrealize (ClutterStageWindow *stage_window) clutter_stage_window_parent_iface->unrealize (stage_window); + if (stage_native->frame_closure) + { + CoglOnscreen *onscreen; + + onscreen = get_legacy_onscreen (stage_native); + cogl_onscreen_remove_frame_callback (onscreen, + stage_native->frame_closure); + stage_native->frame_closure = NULL; + } + g_clear_pointer (&stage_native->pending_onscreen, cogl_object_unref); } @@ -169,6 +180,23 @@ meta_stage_native_get_geometry (ClutterStageWindow *stage_window, } static void +frame_cb (CoglOnscreen *onscreen, + CoglFrameEvent frame_event, + CoglFrameInfo *frame_info, + void *user_data) +{ + MetaStageNative *stage_native = user_data; + ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_native); + ClutterFrameInfo clutter_frame_info = { + .frame_counter = cogl_frame_info_get_frame_counter (frame_info), + .refresh_rate = cogl_frame_info_get_refresh_rate (frame_info), + .presentation_time = cogl_frame_info_get_presentation_time (frame_info) + }; + + _clutter_stage_cogl_presented (stage_cogl, frame_event, &clutter_frame_info); +} + +static void ensure_legacy_view (ClutterStageWindow *stage_window) { MetaStageNative *stage_native = META_STAGE_NATIVE (stage_window); @@ -179,6 +207,7 @@ ensure_legacy_view (ClutterStageWindow *stage_window) MetaRendererView *legacy_view; cairo_rectangle_int_t view_layout = { 0 }; CoglFramebuffer *framebuffer; + CoglOnscreen *onscreen; legacy_view = get_legacy_view (renderer); if (legacy_view) @@ -196,6 +225,16 @@ ensure_legacy_view (ClutterStageWindow *stage_window) "framebuffer", framebuffer, NULL); meta_renderer_set_legacy_view (renderer, legacy_view); + + onscreen = COGL_ONSCREEN (framebuffer); + cogl_onscreen_set_swap_throttled (onscreen, + _clutter_get_sync_to_vblank ()); + + stage_native->frame_closure = + cogl_onscreen_add_frame_callback (onscreen, + frame_cb, + stage_native, + NULL); } static GList * @@ -208,36 +247,6 @@ meta_stage_native_get_views (ClutterStageWindow *stage_window) return meta_renderer_get_views (renderer); } -static CoglClosure * -meta_stage_native_set_frame_callback (ClutterStageWindow *stage_window, - CoglFrameCallback callback, - gpointer user_data) -{ - MetaStageNative *stage_native = META_STAGE_NATIVE (stage_window); - CoglOnscreen *legacy_onscreen; - - legacy_onscreen = get_legacy_onscreen (stage_native); - cogl_onscreen_set_swap_throttled (legacy_onscreen, - _clutter_get_sync_to_vblank ()); - - return cogl_onscreen_add_frame_callback (legacy_onscreen, - callback, - user_data, - NULL); -} - -static void -meta_stage_native_remove_frame_callback (ClutterStageWindow *stage_window, - CoglFrameClosure *closure) -{ - MetaStageNative *stage_native = META_STAGE_NATIVE (stage_window); - CoglOnscreen *legacy_onscreen; - - legacy_onscreen = get_legacy_onscreen (stage_native); - - cogl_onscreen_remove_frame_callback (legacy_onscreen, closure); -} - static int64_t meta_stage_native_get_frame_counter (ClutterStageWindow *stage_window) { @@ -269,7 +278,5 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface) iface->can_clip_redraws = meta_stage_native_can_clip_redraws; iface->get_geometry = meta_stage_native_get_geometry; iface->get_views = meta_stage_native_get_views; - iface->set_frame_callback = meta_stage_native_set_frame_callback; - iface->remove_frame_callback = meta_stage_native_remove_frame_callback; iface->get_frame_counter = meta_stage_native_get_frame_counter; } |