[mutter/gbsneto/offscreen-fix: 2/4] clutter/offscreen-effect: Clear offscreen framebuffer when disabling



commit 4987bd497d23995d48657c39b2eb9017ca500d9b
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue Jan 7 11:58:54 2020 -0300

    clutter/offscreen-effect: Clear offscreen framebuffer when disabling
    
    When changing the 'enabled' property and disabling the offscreen effect,
    it doesn't make sense to preserve the offscreen framebuffer. It's not
    drawing, after all.
    
    Furthermore, because ClutterOffscreenEffect only checks if the offscreen
    framebuffer exists to decide whether or not to redraw, keeping the fbo
    alive is not only a waste of resources, it's also a buggy behavior.
    
    Clear the offscreen framebuffer when the effect is disabled or enabled.
    
    Fixes https://gitlab.gnome.org/GNOME/mutter/issues/810
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/992

 clutter/clutter/clutter-offscreen-effect.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
---
diff --git a/clutter/clutter/clutter-offscreen-effect.c b/clutter/clutter/clutter-offscreen-effect.c
index 13390dad8..d83f0444a 100644
--- a/clutter/clutter/clutter-offscreen-effect.c
+++ b/clutter/clutter/clutter-offscreen-effect.c
@@ -483,6 +483,19 @@ clutter_offscreen_effect_paint (ClutterEffect           *effect,
     clutter_offscreen_effect_paint_texture (self, paint_context);
 }
 
+static void
+clutter_offscreen_effect_notify (GObject    *gobject,
+                                 GParamSpec *pspec)
+{
+  ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (gobject);
+  ClutterOffscreenEffectPrivate *priv = offscreen_effect->priv;
+
+  if (strcmp (pspec->name, "enabled") == 0)
+    g_clear_pointer (&priv->offscreen, cogl_object_unref);
+
+  G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->notify (gobject, pspec);
+}
+
 static void
 clutter_offscreen_effect_finalize (GObject *gobject)
 {
@@ -513,6 +526,7 @@ clutter_offscreen_effect_class_init (ClutterOffscreenEffectClass *klass)
   effect_class->paint = clutter_offscreen_effect_paint;
 
   gobject_class->finalize = clutter_offscreen_effect_finalize;
+  gobject_class->notify = clutter_offscreen_effect_notify;
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]