diff --git a/clutter/clutter-stage-window.c b/clutter/clutter-stage-window.c index 3ba3c9983..941a5b566 100644 --- a/clutter/clutter-stage-window.c +++ b/clutter/clutter-stage-window.c @@ -236,6 +236,18 @@ _clutter_stage_window_redraw (ClutterStageWindow *window) iface->redraw (window); } +void +_clutter_stage_window_dirty_back_buffer (ClutterStageWindow *window) +{ + ClutterStageWindowIface *iface; + + g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window)); + + iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window); + if (iface->dirty_back_buffer) + iface->dirty_back_buffer (window); +} + /* NB: The presumption shouldn't be that a stage can't be comprised of * multiple internal framebuffers, so instead of simply naming this * function _clutter_stage_window_get_framebuffer(), the "active" diff --git a/clutter/clutter-stage-window.h b/clutter/clutter-stage-window.h index 041a2557c..389f6174b 100644 --- a/clutter/clutter-stage-window.h +++ b/clutter/clutter-stage-window.h @@ -73,6 +73,8 @@ struct _ClutterStageWindowIface void (* redraw) (ClutterStageWindow *stage_window); + void (* dirty_back_buffer) (ClutterStageWindow *stage_window); + CoglFramebuffer *(* get_active_framebuffer) (ClutterStageWindow *stage_window); gboolean (* can_clip_redraws) (ClutterStageWindow *stage_window); @@ -117,6 +119,8 @@ void _clutter_stage_window_set_accept_focus (ClutterStageWin void _clutter_stage_window_redraw (ClutterStageWindow *window); +void _clutter_stage_window_dirty_back_buffer (ClutterStageWindow *window); + CoglFramebuffer *_clutter_stage_window_get_active_framebuffer (ClutterStageWindow *window); gboolean _clutter_stage_window_can_clip_redraws (ClutterStageWindow *window); diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 7a82543bf..c658b6a97 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -1522,6 +1522,10 @@ _clutter_stage_do_pick (ClutterStage *stage, context->pick_mode = CLUTTER_PICK_NONE; CLUTTER_TIMER_STOP (_clutter_uprof_context, pick_paint); + /* Notify the backend that we have trashed the contents of + * the back buffer... */ + _clutter_stage_window_dirty_back_buffer (priv->impl); + if (is_clipped) { if (G_LIKELY (!(clutter_pick_debug_flags & diff --git a/clutter/cogl/clutter-stage-cogl.c b/clutter/cogl/clutter-stage-cogl.c index 68b98b1a3..1d9029ff0 100644 --- a/clutter/cogl/clutter-stage-cogl.c +++ b/clutter/cogl/clutter-stage-cogl.c @@ -502,6 +502,9 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window) /* reset the redraw clipping for the next paint... */ stage_cogl->initialized_redraw_clip = FALSE; + /* We have repaired the backbuffer */ + stage_cogl->dirty_backbuffer = FALSE; + stage_cogl->frame_count++; } @@ -513,6 +516,14 @@ clutter_stage_cogl_get_active_framebuffer (ClutterStageWindow *stage_window) return COGL_FRAMEBUFFER (stage_cogl->onscreen); } +static void +clutter_stage_cogl_dirty_back_buffer (ClutterStageWindow *stage_window) +{ + ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); + + stage_cogl->dirty_backbuffer = TRUE; +} + static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface) { @@ -530,6 +541,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface) iface->get_redraw_clip_bounds = clutter_stage_cogl_get_redraw_clip_bounds; iface->redraw = clutter_stage_cogl_redraw; iface->get_active_framebuffer = clutter_stage_cogl_get_active_framebuffer; + iface->dirty_back_buffer = clutter_stage_cogl_dirty_back_buffer; } static void diff --git a/clutter/cogl/clutter-stage-cogl.h b/clutter/cogl/clutter-stage-cogl.h index e1408246d..41dde935e 100644 --- a/clutter/cogl/clutter-stage-cogl.h +++ b/clutter/cogl/clutter-stage-cogl.h @@ -50,6 +50,8 @@ struct _ClutterStageCogl /* TRUE if the current paint cycle has a clipped redraw. In that case bounding_redraw_clip specifies the the bounds. */ guint using_clipped_redraw : 1; + + guint dirty_backbuffer : 1; }; struct _ClutterStageCoglClass