[gnome-shell] Use paint and pick context to get framebuffer



commit 632a64399417c0dbdf70c96bf0de3d92c74dfc9c
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Nov 22 18:36:17 2019 +0100

    Use paint and pick context to get framebuffer
    
    Mutter and Clutter was changed to pass around the current target
    framebuffer via the paint context instead of via the deprecated Cogl
    framebuffer stack.
    
    The framebuffer stack has also been removed from Cogl so change to use
    the one in the paint context instead.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/827

 js/ui/lookingGlass.js                | 35 +++++++++++++++++++++++++----------
 src/shell-glsl-effect.c              |  5 ++++-
 src/shell-invert-lightness-effect.c  |  2 +-
 src/st/st-box-layout.c               |  4 ++--
 src/st/st-entry.c                    | 15 ++++++++++-----
 src/st/st-icon.c                     |  4 +++-
 src/st/st-label.c                    | 16 +++++++++++-----
 src/st/st-private.c                  | 10 ----------
 src/st/st-widget.c                   |  2 +-
 tests/interactive/background-size.js | 36 +++++++++++++++++++++++++-----------
 10 files changed, 82 insertions(+), 47 deletions(-)
---
diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js
index 19a9396d43..ac25c7b73d 100644
--- a/js/ui/lookingGlass.js
+++ b/js/ui/lookingGlass.js
@@ -472,25 +472,40 @@ class ObjInspector extends St.ScrollView {
 
 var RedBorderEffect = GObject.registerClass(
 class RedBorderEffect extends Clutter.Effect {
+    _init() {
+        super._init();
+        this._pipeline = null;
+    }
+
     vfunc_paint(paintContext) {
+        let framebuffer = paintContext.get_framebuffer();
+        let coglContext = framebuffer.get_context();
         let actor = this.get_actor();
         actor.continue_paint(paintContext);
 
-        let color = new Cogl.Color();
-        color.init_from_4ub(0xff, 0, 0, 0xc4);
-        Cogl.set_source_color(color);
+        if (!this._pipeline) {
+            let color = new Cogl.Color();
+            color.init_from_4ub(0xff, 0, 0, 0xc4);
+
+            this._pipeline = new Cogl.Pipeline(coglContext);
+            this._pipeline.set_color(color);
+        }
 
         let alloc = actor.get_allocation_box();
         let width = 2;
 
         // clockwise order
-        Cogl.rectangle(0, 0, alloc.get_width(), width);
-        Cogl.rectangle(alloc.get_width() - width, width,
-                       alloc.get_width(), alloc.get_height());
-        Cogl.rectangle(0, alloc.get_height(),
-                       alloc.get_width() - width, alloc.get_height() - width);
-        Cogl.rectangle(0, alloc.get_height() - width,
-                       width, width);
+        framebuffer.draw_rectangle(this._pipeline,
+            0, 0, alloc.get_width(), width);
+        framebuffer.draw_rectangle(this._pipeline,
+            alloc.get_width() - width, width,
+            alloc.get_width(), alloc.get_height());
+        framebuffer.draw_rectangle(this._pipeline,
+            0, alloc.get_height(),
+            alloc.get_width() - width, alloc.get_height() - width);
+        framebuffer.draw_rectangle(this._pipeline,
+            0, alloc.get_height() - width,
+            width, width);
     }
 });
 
diff --git a/src/shell-glsl-effect.c b/src/shell-glsl-effect.c
index 6347dbf9c6..8f4bd2aaf9 100644
--- a/src/shell-glsl-effect.c
+++ b/src/shell-glsl-effect.c
@@ -74,6 +74,7 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect,
   ShellGLSLEffectPrivate *priv;
   ClutterActor *actor;
   guint8 paint_opacity;
+  CoglFramebuffer *framebuffer;
 
   priv = shell_glsl_effect_get_instance_private (self);
 
@@ -85,7 +86,9 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect,
                               paint_opacity,
                               paint_opacity,
                               paint_opacity);
-  cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
+
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
+  cogl_framebuffer_draw_rectangle (framebuffer,
                                    priv->pipeline,
                                    0, 0,
                                    priv->tex_width, priv->tex_height);
diff --git a/src/shell-invert-lightness-effect.c b/src/shell-invert-lightness-effect.c
index 282725b225..bb0e97961a 100644
--- a/src/shell-invert-lightness-effect.c
+++ b/src/shell-invert-lightness-effect.c
@@ -124,7 +124,7 @@ shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect,
   ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect);
   ClutterActor *actor;
   guint8 paint_opacity;
-  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
 
   actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
   paint_opacity = clutter_actor_get_paint_opacity (actor);
diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c
index 66b17b185b..019aebd76a 100644
--- a/src/st/st-box-layout.c
+++ b/src/st/st-box-layout.c
@@ -397,7 +397,7 @@ st_box_layout_paint (ClutterActor        *actor,
   ClutterActorBox allocation_box;
   ClutterActorBox content_box;
   ClutterActor *child;
-  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
 
   get_border_paint_offsets (self, &x, &y);
   if (x != 0 || y != 0)
@@ -454,7 +454,7 @@ st_box_layout_pick (ClutterActor       *actor,
   ClutterActorBox allocation_box;
   ClutterActorBox content_box;
   ClutterActor *child;
-  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context);
 
   get_border_paint_offsets (self, &x, &y);
   if (x != 0 || y != 0)
diff --git a/src/st/st-entry.c b/src/st/st-entry.c
index 9c45fbd654..cb75273b5d 100644
--- a/src/st/st-entry.c
+++ b/src/st/st-entry.c
@@ -877,11 +877,16 @@ st_entry_paint (ClutterActor        *actor,
         }
 
       if (priv->text_shadow_material != NULL)
-        _st_paint_shadow_with_opacity (shadow_spec,
-                                       cogl_get_draw_framebuffer (),
-                                       priv->text_shadow_material,
-                                       &allocation,
-                                       clutter_actor_get_paint_opacity (priv->entry));
+        {
+          CoglFramebuffer *framebuffer =
+            clutter_paint_context_get_framebuffer (paint_context);
+
+          _st_paint_shadow_with_opacity (shadow_spec,
+                                         framebuffer,
+                                         priv->text_shadow_material,
+                                         &allocation,
+                                         clutter_actor_get_paint_opacity (priv->entry));
+        }
     }
 
   /* Since we paint the background ourselves, chain to the parent class
diff --git a/src/st/st-icon.c b/src/st/st-icon.c
index fc6aa51238..133209d1e6 100644
--- a/src/st/st-icon.c
+++ b/src/st/st-icon.c
@@ -178,10 +178,12 @@ st_icon_paint (ClutterActor        *actor,
       if (priv->shadow_pipeline)
         {
           ClutterActorBox allocation;
+          CoglFramebuffer *framebuffer;
 
           clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
+          framebuffer = clutter_paint_context_get_framebuffer (paint_context);
           _st_paint_shadow_with_opacity (priv->shadow_spec,
-                                         cogl_get_draw_framebuffer (),
+                                         framebuffer,
                                          priv->shadow_pipeline,
                                          &allocation,
                                          clutter_actor_get_paint_opacity (priv->icon_texture));
diff --git a/src/st/st-label.c b/src/st/st-label.c
index 42816ffdf2..947c8ec861 100644
--- a/src/st/st-label.c
+++ b/src/st/st-label.c
@@ -229,11 +229,17 @@ st_label_paint (ClutterActor        *actor,
             }
 
           if (priv->text_shadow_pipeline != NULL)
-            _st_paint_shadow_with_opacity (shadow_spec,
-                                           cogl_get_draw_framebuffer (),
-                                           priv->text_shadow_pipeline,
-                                           &allocation,
-                                           clutter_actor_get_paint_opacity (priv->label));
+            {
+              CoglFramebuffer *framebuffer;
+
+              framebuffer =
+                clutter_paint_context_get_framebuffer (paint_context);
+              _st_paint_shadow_with_opacity (shadow_spec,
+                                             framebuffer,
+                                             priv->text_shadow_pipeline,
+                                             &allocation,
+                                             clutter_actor_get_paint_opacity (priv->label));
+            }
         }
     }
 
diff --git a/src/st/st-private.c b/src/st/st-private.c
index fd2cc39b1d..3107a0cf2d 100644
--- a/src/st/st-private.c
+++ b/src/st/st-private.c
@@ -490,12 +490,6 @@ _st_create_shadow_pipeline_from_actor (StShadow     *shadow_spec,
       cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
       clutter_actor_get_position (actor, &x, &y);
 
-      /* XXX: There's no way to render a ClutterActor to an offscreen
-       * as it uses the implicit API. */
-      G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
-      cogl_push_framebuffer (fb);
-      G_GNUC_END_IGNORE_DEPRECATIONS;
-
       cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
       cogl_framebuffer_translate (fb, -x, -y, 0);
       cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0);
@@ -507,10 +501,6 @@ _st_create_shadow_pipeline_from_actor (StShadow     *shadow_spec,
       clutter_actor_paint (actor, paint_context);
       clutter_paint_context_destroy (paint_context);
 
-      G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
-      cogl_pop_framebuffer ();
-      G_GNUC_END_IGNORE_DEPRECATIONS;
-
       clutter_actor_set_opacity_override (actor, -1);
 
       cogl_object_unref (fb);
diff --git a/src/st/st-widget.c b/src/st/st-widget.c
index dd11f8ad11..26eccee1f4 100644
--- a/src/st/st-widget.c
+++ b/src/st/st-widget.c
@@ -416,7 +416,7 @@ st_widget_paint_background (StWidget            *widget,
   if (!st_widget_get_resource_scale (widget, &resource_scale))
     return;
 
-  framebuffer = cogl_get_draw_framebuffer ();
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   theme_node = st_widget_get_theme_node (widget);
 
   clutter_actor_get_allocation_box (CLUTTER_ACTOR (widget), &allocation);
diff --git a/tests/interactive/background-size.js b/tests/interactive/background-size.js
index 7b18f89501..064bc9e868 100644
--- a/tests/interactive/background-size.js
+++ b/tests/interactive/background-size.js
@@ -2,11 +2,13 @@
 
 const UI = imports.testcommon.ui;
 
-const { Cogl, Clutter, St } = imports.gi;
+const { Cogl, Clutter, Meta, St } = imports.gi;
 
 
 function test() {
-    let stage = new Clutter.Stage({ user_resizable: true, width: 1024, height: 768 });
+    Meta.init();
+
+    let stage = Meta.get_backend().get_stage();
     UI.init(stage);
 
     let vbox = new St.BoxLayout({ style: 'background: #ffee88;' });
@@ -33,20 +35,32 @@ function test() {
         if (useCairo)
             obin.style = 'border: 3px solid green;';
         else
-            obin.connect_after('paint', actor => {
-                Cogl.set_source_color4f(0, 1, 0, 1);
+            obin.connect_after('paint', (actor, paintContext) => {
+                let framebuffer = paintContext.get_framebuffer();
+                let coglContext = framebuffer.get_context();
+
+                let pipeline = new Cogl.Pipeline(coglContext);
+                pipeline.set_color4f(0, 1, 0, 1);
 
                 let alloc = actor.get_allocation_box();
                 let width = 3;
 
                 // clockwise order
-                Cogl.rectangle(0, 0, alloc.get_width(), width);
-                Cogl.rectangle(alloc.get_width() - width, width,
-                               alloc.get_width(), alloc.get_height());
-                Cogl.rectangle(0, alloc.get_height(),
-                               alloc.get_width() - width, alloc.get_height() - width);
-                Cogl.rectangle(0, alloc.get_height() - width,
-                               width, width);
+                framebuffer.draw_rectangle(pipeline,
+                                           0, 0, alloc.get_width(), width);
+                framebuffer.draw_rectangle(pipeline,
+                                           alloc.get_width() - width, width,
+                                           alloc.get_width(), alloc.get_height());
+                framebuffer.draw_rectangle(pipeline,
+                                           0,
+                                           alloc.get_height(),
+                                           alloc.get_width() - width,
+                                           alloc.get_height() - width);
+                framebuffer.draw_rectangle(pipeline,
+                                           0,
+                                           alloc.get_height() - width,
+                                           width,
+                                           width);
             });
         tbox.add(obin);
 


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