From 373140c830859f279c96d2605b6c4187a1fa7541 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 27 Oct 2010 19:02:47 +0200 Subject: [PATCH] Discard the current pick buffer... if we are asked to pick with a different mode. http://bugzilla.clutter-project.org/show_bug.cgi?id=2385 --- clutter/clutter-main.c | 8 +++++--- clutter/clutter-stage-private.h | 8 +++++--- clutter/clutter-stage.c | 17 ++++++++++++----- tests/conform/test-pick.c | 9 +++++++++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index 6ae2f33ba..7330f3ad5 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -236,7 +236,7 @@ _clutter_do_redraw (ClutterStage *stage) ctx = _clutter_context_get_default (); - _clutter_stage_set_pick_buffer_valid (stage, FALSE); + _clutter_stage_set_pick_buffer_valid (stage, FALSE, -1); _clutter_stage_reset_picks_per_frame_counter (stage); _clutter_backend_ensure_context (ctx->backend, stage); @@ -576,7 +576,7 @@ _clutter_do_pick (ClutterStage *stage, /* It's possible that we currently have a static scene and have renderered a * full, unclipped pick buffer. If so we can simply continue to read from * this cached buffer until the scene next changes. */ - if (_clutter_stage_get_pick_buffer_valid (stage)) + if (_clutter_stage_get_pick_buffer_valid (stage, mode)) { CLUTTER_TIMER_START (_clutter_uprof_context, pick_read); cogl_read_pixels (x, y, 1, 1, @@ -653,9 +653,11 @@ _clutter_do_pick (ClutterStage *stage, if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS))) cogl_clip_pop (); + + _clutter_stage_set_pick_buffer_valid (stage, FALSE, -1); } else - _clutter_stage_set_pick_buffer_valid (stage, TRUE); + _clutter_stage_set_pick_buffer_valid (stage, TRUE, mode); /* Make sure Cogl flushes any batched geometry to the GPU driver */ cogl_flush (); diff --git a/clutter/clutter-stage-private.h b/clutter/clutter-stage-private.h index 740e9aadd..879e162ae 100644 --- a/clutter/clutter-stage-private.h +++ b/clutter/clutter-stage-private.h @@ -62,9 +62,11 @@ void _clutter_stage_process_queued_events (ClutterStage *stage); void _clutter_stage_update_input_devices (ClutterStage *stage); int _clutter_stage_get_pending_swaps (ClutterStage *stage); gboolean _clutter_stage_has_full_redraw_queued (ClutterStage *stage); -void _clutter_stage_set_pick_buffer_valid (ClutterStage *stage, - gboolean valid); -gboolean _clutter_stage_get_pick_buffer_valid (ClutterStage *stage); +void _clutter_stage_set_pick_buffer_valid (ClutterStage *stage, + gboolean valid, + ClutterPickMode mode); +gboolean _clutter_stage_get_pick_buffer_valid (ClutterStage *stage, + ClutterPickMode mode); void _clutter_stage_increment_picks_per_frame_counter (ClutterStage *stage); void _clutter_stage_reset_picks_per_frame_counter (ClutterStage *stage); guint _clutter_stage_get_picks_per_frame_counter (ClutterStage *stage); diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 1cb89ecb9..e15aa7ca8 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -133,6 +133,8 @@ struct _ClutterStagePrivate GList *pending_queue_redraws; + ClutterPickMode pick_buffer_mode; + guint relayout_pending : 1; guint redraw_pending : 1; guint is_fullscreen : 1; @@ -1587,7 +1589,7 @@ clutter_stage_init (ClutterStage *self) _clutter_stage_window_get_geometry (priv->impl, &geom); _clutter_stage_set_viewport (self, 0, 0, geom.width, geom.height); - _clutter_stage_set_pick_buffer_valid (self, FALSE); + _clutter_stage_set_pick_buffer_valid (self, FALSE, CLUTTER_PICK_ALL); _clutter_stage_reset_picks_per_frame_counter (self); priv->paint_volume_stack = @@ -3053,20 +3055,25 @@ clutter_stage_get_no_clear_hint (ClutterStage *stage) } gboolean -_clutter_stage_get_pick_buffer_valid (ClutterStage *stage) +_clutter_stage_get_pick_buffer_valid (ClutterStage *stage, ClutterPickMode mode) { g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE); + if (stage->priv->pick_buffer_mode != mode) + return FALSE; + return stage->priv->have_valid_pick_buffer; } void -_clutter_stage_set_pick_buffer_valid (ClutterStage *stage, - gboolean valid) +_clutter_stage_set_pick_buffer_valid (ClutterStage *stage, + gboolean valid, + ClutterPickMode mode) { g_return_if_fail (CLUTTER_IS_STAGE (stage)); stage->priv->have_valid_pick_buffer = !!valid; + stage->priv->pick_buffer_mode = mode; } void @@ -3172,7 +3179,7 @@ _clutter_stage_queue_actor_redraw (ClutterStage *stage, * state changes that affects painting *or* picking so we can use * this point to invalidate any currently cached pick buffer. */ - _clutter_stage_set_pick_buffer_valid (stage, FALSE); + _clutter_stage_set_pick_buffer_valid (stage, FALSE, -1); if (entry) { diff --git a/tests/conform/test-pick.c b/tests/conform/test-pick.c index 1e7e6255b..ac3d76c67 100644 --- a/tests/conform/test-pick.c +++ b/tests/conform/test-pick.c @@ -25,6 +25,15 @@ on_timeout (State *state) int y, x; ClutterActor *over_actor = NULL; + /* This will cause an unclipped pick redraw that will get buffered. + We'll check below that this buffer is discarded because we also need + to pick non-reactive actors */ + clutter_stage_get_actor_at_pos (CLUTTER_STAGE (state->stage), + CLUTTER_PICK_REACTIVE, 10, 10); + + clutter_stage_get_actor_at_pos (CLUTTER_STAGE (state->stage), + CLUTTER_PICK_REACTIVE, 10, 10); + for (test_num = 0; test_num < 3; test_num++) { if (test_num == 0)