summaryrefslogtreecommitdiff
path: root/src/backends/native/meta-stage-native.c
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2016-06-08 13:07:09 +0800
committerJonas Ådahl <jadahl@gmail.com>2016-07-20 14:23:48 +0800
commit28a898a22f82449cce524773bbdd24246e53bf9d (patch)
tree7275545696d2331e45ce9473c5ce7951a70adf39 /src/backends/native/meta-stage-native.c
parent92341e7c309453c6742375d39a7bcc92657bbc72 (diff)
downloadmutter-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.c71
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;
}