summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2020-01-07 13:17:56 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2020-01-07 14:20:21 -0300
commit64685f4b20162b78964a5ab6fd57a93fb3860671 (patch)
treed5530640d3f971fe72950b43647f2ac5f54c3ed9
parentbf594e9fb6d973259163f73881dd91c8910dd54f (diff)
downloadmutter-64685f4b20162b78964a5ab6fd57a93fb3860671.tar.gz
clutter/offscreen-effect: Clear offscreen when pre-paint fails
Some ClutterOffscreenEffect subclasses, such as ClutterBrightnessContrastEffect, early-return FALSE in pre-paint before chaining up. It's an important optimization that avoids creating or updating the offscreen framebuffer. However, if an offscreen framebuffer already exists by the time pre-paint fails, it will be used *without* repaint the actor over it. That causes an old picture of the actor to be displayed. Fix that by always clearing the offscreen framebuffer when pre-paint fails. Fixes https://gitlab.gnome.org/GNOME/mutter/issues/810 https://gitlab.gnome.org/GNOME/mutter/merge_requests/992
-rw-r--r--clutter/clutter/clutter-offscreen-effect.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/clutter/clutter/clutter-offscreen-effect.c b/clutter/clutter/clutter-offscreen-effect.c
index d83f0444a..89467e541 100644
--- a/clutter/clutter/clutter-offscreen-effect.c
+++ b/clutter/clutter/clutter-offscreen-effect.c
@@ -474,10 +474,17 @@ clutter_offscreen_effect_paint (ClutterEffect *effect,
*/
if (priv->offscreen == NULL || (flags & CLUTTER_EFFECT_PAINT_ACTOR_DIRTY))
{
- /* Chain up to the parent paint method which will call the pre and
- post paint functions to update the image */
- CLUTTER_EFFECT_CLASS (clutter_offscreen_effect_parent_class)->
- paint (effect, paint_context, flags);
+ ClutterEffectClass *effect_class = CLUTTER_EFFECT_GET_CLASS (effect);
+ gboolean pre_paint_succeeded;
+
+ pre_paint_succeeded = effect_class->pre_paint (effect, paint_context);
+
+ clutter_actor_continue_paint (priv->actor, paint_context);
+
+ if (pre_paint_succeeded)
+ effect_class->post_paint (effect, paint_context);
+ else
+ g_clear_pointer (&priv->offscreen, cogl_object_unref);
}
else
clutter_offscreen_effect_paint_texture (self, paint_context);