[mutter] clutter, core: Stop using the Cogl framebuffer stack



commit 3f65837e0dba188d4ff734be0c4be750746b27ed
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Nov 22 11:41:04 2019 +0100

    clutter, core: Stop using the Cogl framebuffer stack
    
    The Cogl framebuffer stack is going away; replace all its uses by the
    framebuffer stack carried by the paint context.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/935

 clutter/clutter/clutter-blur-effect.c              |  3 +-
 .../clutter/clutter-brightness-contrast-effect.c   |  3 +-
 clutter/clutter/clutter-colorize-effect.c          |  3 +-
 clutter/clutter/clutter-deform-effect.c            |  3 +-
 clutter/clutter/clutter-desaturate-effect.c        |  3 +-
 clutter/clutter/clutter-offscreen-effect.c         | 14 ++++++----
 clutter/clutter/clutter-paint-nodes.c              | 32 ++++++++++++----------
 clutter/clutter/clutter-stage.c                    |  7 -----
 clutter/clutter/clutter-text.c                     |  2 +-
 clutter/clutter/cogl/clutter-stage-cogl.c          |  2 --
 clutter/clutter/deprecated/clutter-rectangle.c     |  3 +-
 src/backends/meta-stage.c                          | 10 +++++--
 src/compositor/meta-background-actor.c             |  7 +++--
 src/compositor/meta-shaped-texture.c               | 28 +++++++++++--------
 src/compositor/meta-texture-tower.c                | 12 +++++---
 src/compositor/meta-texture-tower.h                |  3 +-
 src/compositor/meta-window-actor-x11.c             |  4 ++-
 src/compositor/meta-window-actor.c                 |  4 ---
 src/compositor/meta-window-group.c                 |  2 +-
 .../clutter/conform/actor-offscreen-redirect.c     |  2 +-
 src/tests/clutter/conform/binding-pool.c           |  2 +-
 src/tests/clutter/interactive/test-binding-pool.c  |  3 +-
 .../clutter/interactive/test-cogl-offscreen.c      |  3 +-
 .../clutter/interactive/test-cogl-point-sprites.c  |  3 +-
 .../clutter/interactive/test-cogl-tex-convert.c    |  3 +-
 .../clutter/interactive/test-cogl-tex-polygon.c    |  3 +-
 src/tests/clutter/interactive/test-cogl-tex-tile.c |  3 +-
 src/tests/clutter/interactive/test-paint-wrapper.c |  6 ++--
 src/tests/clutter/micro-bench/test-cogl-perf.c     | 11 +++++---
 29 files changed, 105 insertions(+), 79 deletions(-)
---
diff --git a/clutter/clutter/clutter-blur-effect.c b/clutter/clutter/clutter-blur-effect.c
index c2a739eb7..5236042de 100644
--- a/clutter/clutter/clutter-blur-effect.c
+++ b/clutter/clutter/clutter-blur-effect.c
@@ -162,7 +162,8 @@ clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect,
                                   ClutterPaintContext    *paint_context)
 {
   ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   guint8 paint_opacity;
 
   paint_opacity = clutter_actor_get_paint_opacity (self->actor);
diff --git a/clutter/clutter/clutter-brightness-contrast-effect.c 
b/clutter/clutter/clutter-brightness-contrast-effect.c
index 01d43f1fa..b984e2d82 100644
--- a/clutter/clutter/clutter-brightness-contrast-effect.c
+++ b/clutter/clutter/clutter-brightness-contrast-effect.c
@@ -180,7 +180,8 @@ clutter_brightness_contrast_effect_paint_target (ClutterOffscreenEffect *effect,
                                                  ClutterPaintContext    *paint_context)
 {
   ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+   clutter_paint_context_get_framebuffer (paint_context);
   ClutterActor *actor;
   guint8 paint_opacity;
 
diff --git a/clutter/clutter/clutter-colorize-effect.c b/clutter/clutter/clutter-colorize-effect.c
index 811787036..db372a9cb 100644
--- a/clutter/clutter/clutter-colorize-effect.c
+++ b/clutter/clutter/clutter-colorize-effect.c
@@ -150,7 +150,8 @@ clutter_colorize_effect_paint_target (ClutterOffscreenEffect *effect,
                                       ClutterPaintContext    *paint_context)
 {
   ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   ClutterActor *actor;
   guint8 paint_opacity;
 
diff --git a/clutter/clutter/clutter-deform-effect.c b/clutter/clutter/clutter-deform-effect.c
index 4dbf76af2..59ef1ff75 100644
--- a/clutter/clutter/clutter-deform-effect.c
+++ b/clutter/clutter/clutter-deform-effect.c
@@ -174,7 +174,8 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
   CoglHandle material;
   CoglPipeline *pipeline;
   CoglDepthState depth_state;
-  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *fb =
+    clutter_paint_context_get_framebuffer (paint_context);
 
   if (priv->is_dirty)
     {
diff --git a/clutter/clutter/clutter-desaturate-effect.c b/clutter/clutter/clutter-desaturate-effect.c
index 4ed522e0c..82d9911ff 100644
--- a/clutter/clutter/clutter-desaturate-effect.c
+++ b/clutter/clutter/clutter-desaturate-effect.c
@@ -157,7 +157,8 @@ clutter_desaturate_effect_paint_target (ClutterOffscreenEffect *effect,
                                         ClutterPaintContext    *paint_context)
 {
   ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+   clutter_paint_context_get_framebuffer (paint_context);
   ClutterActor *actor;
   CoglHandle texture;
   guint8 paint_opacity;
diff --git a/clutter/clutter/clutter-offscreen-effect.c b/clutter/clutter/clutter-offscreen-effect.c
index 11c2cddb5..131a42a8b 100644
--- a/clutter/clutter/clutter-offscreen-effect.c
+++ b/clutter/clutter/clutter-offscreen-effect.c
@@ -74,6 +74,7 @@
 #include "clutter-debug.h"
 #include "clutter-private.h"
 #include "clutter-stage-private.h"
+#include "clutter-paint-context-private.h"
 #include "clutter-paint-volume-private.h"
 #include "clutter-actor-box-private.h"
 
@@ -317,8 +318,7 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
   framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   cogl_framebuffer_get_modelview_matrix (framebuffer, &old_modelview);
 
-  /* let's draw offscreen */
-  cogl_push_framebuffer (priv->offscreen);
+  clutter_paint_context_push_framebuffer (paint_context, priv->offscreen);
 
   /* We don't want the FBO contents to be transformed. That could waste memory
    * (e.g. during zoom), or result in something that's not rectangular (clipped
@@ -387,7 +387,8 @@ clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
                                             ClutterPaintContext    *paint_context)
 {
   ClutterOffscreenEffectPrivate *priv = effect->priv;
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   guint8 paint_opacity;
 
   paint_opacity = clutter_actor_get_paint_opacity (priv->actor);
@@ -417,7 +418,8 @@ clutter_offscreen_effect_paint_texture (ClutterOffscreenEffect *effect,
                                         ClutterPaintContext    *paint_context)
 {
   ClutterOffscreenEffectPrivate *priv = effect->priv;
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglMatrix modelview;
   float resource_scale;
 
@@ -465,9 +467,9 @@ clutter_offscreen_effect_post_paint (ClutterEffect       *effect,
   /* Restore the previous opacity override */
   clutter_actor_set_opacity_override (priv->actor, priv->old_opacity_override);
 
-  framebuffer = cogl_get_draw_framebuffer ();
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   cogl_framebuffer_pop_matrix (framebuffer);
-  cogl_pop_framebuffer ();
+  clutter_paint_context_pop_framebuffer (paint_context);
 
   clutter_offscreen_effect_paint_texture (self, paint_context);
 }
diff --git a/clutter/clutter/clutter-paint-nodes.c b/clutter/clutter/clutter-paint-nodes.c
index 9f3024917..1f02f3a88 100644
--- a/clutter/clutter/clutter-paint-nodes.c
+++ b/clutter/clutter/clutter-paint-nodes.c
@@ -44,6 +44,7 @@
 #include "clutter-color.h"
 #include "clutter-debug.h"
 #include "clutter-private.h"
+#include "clutter-paint-context-private.h"
 
 #include "clutter-paint-nodes.h"
 
@@ -108,7 +109,7 @@ clutter_root_node_pre_draw (ClutterPaintNode    *node,
 {
   ClutterRootNode *rnode = (ClutterRootNode *) node;
 
-  cogl_push_framebuffer (rnode->framebuffer);
+  clutter_paint_context_push_framebuffer (paint_context, rnode->framebuffer);
 
   cogl_framebuffer_clear (rnode->framebuffer,
                           rnode->clear_flags,
@@ -121,7 +122,7 @@ static void
 clutter_root_node_post_draw (ClutterPaintNode    *node,
                              ClutterPaintContext *paint_context)
 {
-  cogl_pop_framebuffer ();
+  clutter_paint_context_pop_framebuffer (paint_context);
 }
 
 static void
@@ -205,7 +206,8 @@ clutter_transform_node_pre_draw (ClutterPaintNode    *node,
                                  ClutterPaintContext *paint_context)
 {
   ClutterTransformNode *transform_node = (ClutterTransformNode *) node;
-  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *fb =
+   clutter_paint_context_get_framebuffer (paint_context);
 
   cogl_framebuffer_push_matrix (fb);
   cogl_framebuffer_transform (fb, &transform_node->transform);
@@ -217,7 +219,8 @@ static void
 clutter_transform_node_post_draw (ClutterPaintNode    *node,
                                   ClutterPaintContext *paint_context)
 {
-  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *fb =
+   clutter_paint_context_get_framebuffer (paint_context);
 
   cogl_framebuffer_pop_matrix (fb);
 }
@@ -411,7 +414,8 @@ clutter_pipeline_node_pre_draw (ClutterPaintNode    *node,
 }
 
 static CoglFramebuffer *
-get_target_framebuffer (ClutterPaintNode *node)
+get_target_framebuffer (ClutterPaintNode    *node,
+                        ClutterPaintContext *paint_context)
 {
   CoglFramebuffer *framebuffer;
 
@@ -419,7 +423,7 @@ get_target_framebuffer (ClutterPaintNode *node)
   if (framebuffer)
     return framebuffer;
 
-  return cogl_get_draw_framebuffer ();
+  return clutter_paint_context_get_framebuffer (paint_context);
 }
 
 static void
@@ -436,7 +440,7 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
   if (node->operations == NULL)
     return;
 
-  fb = cogl_get_draw_framebuffer ();
+  fb = clutter_paint_context_get_framebuffer (paint_context);
 
   for (i = 0; i < node->operations->len; i++)
     {
@@ -828,7 +832,7 @@ clutter_text_node_draw (ClutterPaintNode    *node,
   if (node->operations == NULL)
     return;
 
-  fb = get_target_framebuffer (node);
+  fb = get_target_framebuffer (node, paint_context);
 
   pango_layout_get_pixel_extents (tnode->layout, NULL, &extents);
 
@@ -1014,7 +1018,7 @@ clutter_clip_node_pre_draw (ClutterPaintNode    *node,
   if (node->operations == NULL)
     return FALSE;
 
-  fb = get_target_framebuffer (node);
+  fb = get_target_framebuffer (node, paint_context);
 
   for (i = 0; i < node->operations->len; i++)
     {
@@ -1058,7 +1062,7 @@ clutter_clip_node_post_draw (ClutterPaintNode    *node,
   if (node->operations == NULL)
     return;
 
-  fb = get_target_framebuffer (node);
+  fb = get_target_framebuffer (node, paint_context);
 
   for (i = 0; i < node->operations->len; i++)
     {
@@ -1272,10 +1276,10 @@ clutter_layer_node_pre_draw (ClutterPaintNode *node,
   /* copy the same modelview from the current framebuffer to the one we
    * are going to use
    */
-  framebuffer = cogl_get_draw_framebuffer ();
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   cogl_framebuffer_get_modelview_matrix (framebuffer, &matrix);
 
-  cogl_push_framebuffer (lnode->offscreen);
+  clutter_paint_context_push_framebuffer (paint_context, lnode->offscreen);
 
   cogl_framebuffer_set_modelview_matrix (lnode->offscreen, &matrix);
 
@@ -1312,9 +1316,9 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 
   /* switch to the previous framebuffer */
   cogl_framebuffer_pop_matrix (lnode->offscreen);
-  cogl_pop_framebuffer ();
+  clutter_paint_context_pop_framebuffer (paint_context);
 
-  fb = cogl_get_draw_framebuffer ();
+  fb = clutter_paint_context_get_framebuffer (paint_context);
 
   for (i = 0; i < node->operations->len; i++)
     {
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index dec8328f3..dbd64645a 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -2769,7 +2769,6 @@ clutter_stage_read_pixels (ClutterStage *stage,
     return NULL;
 
   framebuffer = clutter_stage_view_get_framebuffer (view);
-  cogl_push_framebuffer (framebuffer);
   clutter_stage_do_paint_view (stage, view, &clip_rect);
 
   view_scale = clutter_stage_view_get_scale (view);
@@ -2784,8 +2783,6 @@ clutter_stage_read_pixels (ClutterStage *stage,
                                 COGL_PIXEL_FORMAT_RGBA_8888,
                                 pixels);
 
-  cogl_pop_framebuffer ();
-
   return pixels;
 }
 
@@ -4414,7 +4411,6 @@ capture_view_into (ClutterStage          *stage,
 
   if (paint)
     {
-      cogl_push_framebuffer (framebuffer);
       _clutter_stage_maybe_setup_viewport (stage, view);
       clutter_stage_do_paint_view (stage, view, rect);
     }
@@ -4439,9 +4435,6 @@ capture_view_into (ClutterStage          *stage,
                                             COGL_READ_PIXELS_COLOR_BUFFER,
                                             bitmap);
 
-  if (paint)
-    cogl_pop_framebuffer ();
-
   cogl_object_unref (bitmap);
 }
 
diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c
index 461e29fbf..ef1fee27f 100644
--- a/clutter/clutter/clutter-text.c
+++ b/clutter/clutter/clutter-text.c
@@ -2567,7 +2567,7 @@ clutter_text_paint (ClutterActor        *self,
   float alloc_height;
   float resource_scale;
 
-  fb = cogl_get_draw_framebuffer ();
+  fb = clutter_paint_context_get_framebuffer (paint_context);
 
   /* Note that if anything in this paint method changes it needs to be
      reflected in the get_paint_volume implementation which is tightly
diff --git a/clutter/clutter/cogl/clutter-stage-cogl.c b/clutter/clutter/cogl/clutter-stage-cogl.c
index 4304db6e1..64317b6f1 100644
--- a/clutter/clutter/cogl/clutter-stage-cogl.c
+++ b/clutter/clutter/cogl/clutter-stage-cogl.c
@@ -869,7 +869,6 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
         }
     }
 
-  cogl_push_framebuffer (fb);
   if (use_clipped_redraw && clip_region_empty)
     {
       CLUTTER_NOTE (CLIPPING, "Empty stage output paint\n");
@@ -960,7 +959,6 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
           cairo_region_destroy (view_region);
         }
     }
-  cogl_pop_framebuffer ();
 
   cairo_region_get_extents (redraw_clip, &redraw_rect);
 
diff --git a/clutter/clutter/deprecated/clutter-rectangle.c b/clutter/clutter/deprecated/clutter-rectangle.c
index bd2fc599d..fafcafa26 100644
--- a/clutter/clutter/deprecated/clutter-rectangle.c
+++ b/clutter/clutter/deprecated/clutter-rectangle.c
@@ -82,7 +82,8 @@ clutter_rectangle_paint (ClutterActor        *self,
                          ClutterPaintContext *paint_context)
 {
   ClutterRectanglePrivate *priv = CLUTTER_RECTANGLE (self)->priv;
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   static CoglPipeline *default_color_pipeline = NULL;
   CoglPipeline *content_pipeline;
   ClutterActorBox alloc;
diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c
index 939ca809e..478c60f33 100644
--- a/src/backends/meta-stage.c
+++ b/src/backends/meta-stage.c
@@ -119,14 +119,18 @@ meta_overlay_set (MetaOverlay     *overlay,
 }
 
 static void
-meta_overlay_paint (MetaOverlay *overlay)
+meta_overlay_paint (MetaOverlay         *overlay,
+                    ClutterPaintContext *paint_context)
 {
+  CoglFramebuffer *framebuffer;
+
   if (!overlay->enabled)
     return;
 
   g_assert (meta_is_wayland_compositor ());
 
-  cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
+  cogl_framebuffer_draw_rectangle (framebuffer,
                                    overlay->pipeline,
                                    overlay->current_rect.origin.x,
                                    overlay->current_rect.origin.y,
@@ -198,7 +202,7 @@ meta_stage_paint (ClutterActor        *actor,
   g_signal_emit (stage, signals[ACTORS_PAINTED], 0);
 
   for (l = stage->overlays; l; l = l->next)
-    meta_overlay_paint (l->data);
+    meta_overlay_paint (l->data, paint_context);
 
   notify_watchers_for_mode (stage, stage->current_view,
                             META_STAGE_WATCH_AFTER_OVERLAY_PAINT);
diff --git a/src/compositor/meta-background-actor.c b/src/compositor/meta-background-actor.c
index 46cf3e9e4..466dfc2ab 100644
--- a/src/compositor/meta-background-actor.c
+++ b/src/compositor/meta-background-actor.c
@@ -337,6 +337,7 @@ make_pipeline (PipelineFlags pipeline_flags)
 
 static void
 setup_pipeline (MetaBackgroundActor   *self,
+                ClutterPaintContext   *paint_context,
                 cairo_rectangle_int_t *actor_pixel_rect)
 {
   PipelineFlags pipeline_flags = 0;
@@ -436,7 +437,7 @@ setup_pipeline (MetaBackgroundActor   *self,
                              color_component,
                              opacity / 255.);
 
-  fb = cogl_get_draw_framebuffer ();
+  fb = clutter_paint_context_get_framebuffer (paint_context);
   if (!self->force_bilinear &&
       meta_actor_painting_untransformed (fb,
                                          actor_pixel_rect->width,
@@ -526,14 +527,14 @@ meta_background_actor_paint (ClutterActor        *actor,
   actor_pixel_rect.width = actor_box.x2 - actor_box.x1;
   actor_pixel_rect.height = actor_box.y2 - actor_box.y1;
 
-  setup_pipeline (self, &actor_pixel_rect);
+  setup_pipeline (self, paint_context, &actor_pixel_rect);
   set_glsl_parameters (self, &actor_pixel_rect);
 
   /* Limit to how many separate rectangles we'll draw; beyond this just
    * fall back and draw the whole thing */
 #define MAX_RECTS 64
 
-  fb = cogl_get_draw_framebuffer ();
+  fb = clutter_paint_context_get_framebuffer (paint_context);
 
   /* Now figure out what to actually paint.
    */
diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
index 7a1a91df5..0079c0df5 100644
--- a/src/compositor/meta-shaped-texture.c
+++ b/src/compositor/meta-shaped-texture.c
@@ -512,12 +512,12 @@ texture_is_idle_and_not_mipmapped (gpointer user_data)
 }
 
 static void
-do_paint_content (MetaShapedTexture *stex,
-                  ClutterPaintNode  *root_node,
-                  CoglTexture       *paint_tex,
-                  ClutterActorBox   *alloc,
-                  uint8_t            opacity)
-
+do_paint_content (MetaShapedTexture   *stex,
+                  ClutterPaintNode    *root_node,
+                  ClutterPaintContext *paint_context,
+                  CoglTexture         *paint_tex,
+                  ClutterActorBox     *alloc,
+                  uint8_t              opacity)
 {
   int dst_width, dst_height;
   cairo_rectangle_int_t content_rect;
@@ -550,7 +550,7 @@ do_paint_content (MetaShapedTexture *stex,
 
   framebuffer = clutter_paint_node_get_framebuffer (root_node);
   if (!framebuffer)
-    framebuffer = cogl_get_draw_framebuffer ();
+    framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   if (meta_actor_painting_untransformed (framebuffer,
                                          dst_width, dst_height,
                                          NULL, NULL))
@@ -680,7 +680,8 @@ do_paint_content (MetaShapedTexture *stex,
 }
 
 static CoglTexture *
-select_texture_for_paint (MetaShapedTexture *stex)
+select_texture_for_paint (MetaShapedTexture   *stex,
+                          ClutterPaintContext *paint_context)
 {
   CoglTexture *texture = NULL;
   int64_t now;
@@ -696,7 +697,10 @@ select_texture_for_paint (MetaShapedTexture *stex)
 
       if (age >= MIN_MIPMAP_AGE_USEC ||
           stex->fast_updates < MIN_FAST_UPDATES_BEFORE_UNMIPMAP)
-        texture = meta_texture_tower_get_paint_texture (stex->paint_tower);
+        {
+          texture = meta_texture_tower_get_paint_texture (stex->paint_tower,
+                                                          paint_context);
+        }
     }
 
   if (!texture)
@@ -745,14 +749,14 @@ meta_shaped_texture_paint_content (ClutterContent      *content,
    * Setting the texture quality to high without SGIS_generate_mipmap
    * support for TFP textures will result in fallbacks to XGetImage.
    */
-  paint_tex = select_texture_for_paint (stex);
+  paint_tex = select_texture_for_paint (stex, paint_context);
   if (!paint_tex)
     return;
 
   opacity = clutter_actor_get_paint_opacity (actor);
   clutter_actor_get_content_box (actor, &alloc);
 
-  do_paint_content (stex, root_node, paint_tex, &alloc, opacity);
+  do_paint_content (stex, root_node, paint_context, paint_tex, &alloc, opacity);
 }
 
 static gboolean
@@ -1242,7 +1246,7 @@ get_image_via_offscreen (MetaShapedTexture     *stex,
 
   paint_context = clutter_paint_context_new_for_framebuffer (fb);
 
-  do_paint_content (stex, root_node,
+  do_paint_content (stex, root_node, paint_context,
                     stex->texture,
                     &(ClutterActorBox) {
                       0, 0,
diff --git a/src/compositor/meta-texture-tower.c b/src/compositor/meta-texture-tower.c
index c4b225f33..b0df9ed06 100644
--- a/src/compositor/meta-texture-tower.c
+++ b/src/compositor/meta-texture-tower.c
@@ -243,7 +243,9 @@ meta_texture_tower_update_area (MetaTextureTower *tower,
  * Meta.
  */
 static int
-get_paint_level (int width, int height)
+get_paint_level (ClutterPaintContext *paint_context,
+                 int                  width,
+                 int                  height)
 {
   CoglFramebuffer *framebuffer;
   CoglMatrix projection, modelview, pm;
@@ -272,7 +274,7 @@ get_paint_level (int width, int height)
    *  (w_c)                               (w_o)        (1)
    */
 
-  framebuffer = cogl_get_draw_framebuffer ();
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   cogl_framebuffer_get_projection_matrix (framebuffer, &projection);
   cogl_framebuffer_get_modelview_matrix (framebuffer, &modelview);
 
@@ -419,6 +421,7 @@ texture_tower_revalidate (MetaTextureTower *tower,
 /**
  * meta_texture_tower_get_paint_texture:
  * @tower: a #MetaTextureTower
+ * @paint_context: a #ClutterPaintContext
  *
  * Gets the texture from the tower that best matches the current
  * rendering scale. (On the assumption here the texture is going to
@@ -430,7 +433,8 @@ texture_tower_revalidate (MetaTextureTower *tower,
  *  %NULL if no base texture has yet been set.
  */
 CoglTexture *
-meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
+meta_texture_tower_get_paint_texture (MetaTextureTower    *tower,
+                                      ClutterPaintContext *paint_context)
 {
   int texture_width, texture_height;
   int level;
@@ -443,7 +447,7 @@ meta_texture_tower_get_paint_texture (MetaTextureTower *tower)
   texture_width = cogl_texture_get_width (tower->textures[0]);
   texture_height = cogl_texture_get_height (tower->textures[0]);
 
-  level = get_paint_level(texture_width, texture_height);
+  level = get_paint_level (paint_context, texture_width, texture_height);
   if (level < 0) /* singular paint matrix, scaled to nothing */
     return NULL;
   level = MIN (level, tower->n_levels - 1);
diff --git a/src/compositor/meta-texture-tower.h b/src/compositor/meta-texture-tower.h
index 6a39e4184..1f5b37146 100644
--- a/src/compositor/meta-texture-tower.h
+++ b/src/compositor/meta-texture-tower.h
@@ -60,7 +60,8 @@ void              meta_texture_tower_update_area       (MetaTextureTower *tower,
                                                         int               y,
                                                         int               width,
                                                         int               height);
-CoglTexture      *meta_texture_tower_get_paint_texture (MetaTextureTower *tower);
+CoglTexture      *meta_texture_tower_get_paint_texture (MetaTextureTower    *tower,
+                                                        ClutterPaintContext *paint_context);
 
 G_END_DECLS
 
diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c
index 957525ec7..b7032e0ba 100644
--- a/src/compositor/meta-window-actor-x11.c
+++ b/src/compositor/meta-window-actor-x11.c
@@ -1168,6 +1168,7 @@ meta_window_actor_x11_paint (ClutterActor        *actor,
       MetaShadowParams params;
       cairo_rectangle_int_t shape_bounds;
       cairo_region_t *clip = actor_x11->shadow_clip;
+      CoglFramebuffer *framebuffer;
 
       get_shape_bounds (actor_x11, &shape_bounds);
       get_shadow_params (actor_x11, appears_focused, &params);
@@ -1188,8 +1189,9 @@ meta_window_actor_x11_paint (ClutterActor        *actor,
             cairo_region_subtract (clip, frame_bounds);
         }
 
+      framebuffer = clutter_paint_context_get_framebuffer (paint_context);
       meta_shadow_paint (shadow,
-                         cogl_get_draw_framebuffer (),
+                         framebuffer,
                          params.x_offset + shape_bounds.x,
                          params.y_offset + shape_bounds.y,
                          shape_bounds.width,
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 00ba043f9..a42dfaf7b 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -1403,8 +1403,6 @@ meta_window_actor_get_image (MetaWindowActor *self,
   cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
   clutter_actor_get_position (actor, &x, &y);
 
-  cogl_push_framebuffer (framebuffer);
-
   cogl_framebuffer_clear (framebuffer, COGL_BUFFER_BIT_COLOR, &clear_color);
   cogl_framebuffer_orthographic (framebuffer, 0, 0, width, height, 0, 1.0);
   cogl_framebuffer_scale (framebuffer, resource_scale, resource_scale, 1);
@@ -1414,8 +1412,6 @@ meta_window_actor_get_image (MetaWindowActor *self,
   clutter_actor_paint (actor, paint_context);
   clutter_paint_context_destroy (paint_context);
 
-  cogl_pop_framebuffer ();
-
   if (clip)
     {
       meta_rectangle_scale_double (clip, resource_scale,
diff --git a/src/compositor/meta-window-group.c b/src/compositor/meta-window-group.c
index 7d35becf6..76ba88e61 100644
--- a/src/compositor/meta-window-group.c
+++ b/src/compositor/meta-window-group.c
@@ -83,7 +83,7 @@ meta_window_group_paint (ClutterActor        *actor,
     {
       CoglFramebuffer *fb;
 
-      fb = cogl_get_draw_framebuffer ();
+      fb = clutter_paint_context_get_framebuffer (paint_context);
       if (!meta_actor_painting_untransformed (fb,
                                               screen_width,
                                               screen_height,
diff --git a/src/tests/clutter/conform/actor-offscreen-redirect.c 
b/src/tests/clutter/conform/actor-offscreen-redirect.c
index cd6659610..820ccb4b4 100644
--- a/src/tests/clutter/conform/actor-offscreen-redirect.c
+++ b/src/tests/clutter/conform/actor-offscreen-redirect.c
@@ -58,7 +58,7 @@ foo_actor_paint (ClutterActor        *actor,
                               255, 0, 0,
                               foo_actor->last_paint_opacity);
 
-  framebuffer = cogl_get_draw_framebuffer ();
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
   cogl_framebuffer_draw_rectangle (framebuffer,
                                    pipeline,
                                    allocation.x1,
diff --git a/src/tests/clutter/conform/binding-pool.c b/src/tests/clutter/conform/binding-pool.c
index 6d9fc6714..a14ea573e 100644
--- a/src/tests/clutter/conform/binding-pool.c
+++ b/src/tests/clutter/conform/binding-pool.c
@@ -147,7 +147,7 @@ key_group_paint (ClutterActor        *actor,
   pipeline = cogl_pipeline_new (ctx);
   cogl_pipeline_set_color4ub (pipeline, 255, 255, 0, 224);
 
-  framebuffer = cogl_get_draw_framebuffer ();
+  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
 
   clutter_actor_iter_init (&iter, actor);
   while (clutter_actor_iter_next (&iter, &child))
diff --git a/src/tests/clutter/interactive/test-binding-pool.c 
b/src/tests/clutter/interactive/test-binding-pool.c
index 669664ec1..c9ddfe57a 100644
--- a/src/tests/clutter/interactive/test-binding-pool.c
+++ b/src/tests/clutter/interactive/test-binding-pool.c
@@ -157,7 +157,8 @@ key_group_paint (ClutterActor        *actor,
   ClutterActorIter iter;
   ClutterActor *child;
   gint i = 0;
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   CoglPipeline *pipeline;
 
diff --git a/src/tests/clutter/interactive/test-cogl-offscreen.c 
b/src/tests/clutter/interactive/test-cogl-offscreen.c
index 7b96cf403..bade842d4 100644
--- a/src/tests/clutter/interactive/test-cogl-offscreen.c
+++ b/src/tests/clutter/interactive/test-cogl-offscreen.c
@@ -87,7 +87,8 @@ test_coglbox_paint (ClutterActor        *self,
                     ClutterPaintContext *paint_context)
 {
   TestCoglboxPrivate *priv = TEST_COGLBOX_GET_PRIVATE (self);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   gfloat texcoords[4] = { 0, 0, 1, 1 };
   CoglPipeline *pipeline;
diff --git a/src/tests/clutter/interactive/test-cogl-point-sprites.c 
b/src/tests/clutter/interactive/test-cogl-point-sprites.c
index 4a8981fe4..e89367083 100644
--- a/src/tests/clutter/interactive/test-cogl-point-sprites.c
+++ b/src/tests/clutter/interactive/test-cogl-point-sprites.c
@@ -99,7 +99,8 @@ paint_cb (ClutterActor        *stage,
           ClutterPaintContext *paint_context,
           Data                *data)
 {
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglMatrix old_matrix, new_matrix;
   int i;
   float diff_time;
diff --git a/src/tests/clutter/interactive/test-cogl-tex-convert.c 
b/src/tests/clutter/interactive/test-cogl-tex-convert.c
index cbc071cb3..5f4257d7c 100644
--- a/src/tests/clutter/interactive/test-cogl-tex-convert.c
+++ b/src/tests/clutter/interactive/test-cogl-tex-convert.c
@@ -87,7 +87,8 @@ test_coglbox_paint (ClutterActor        *self,
 {
   TestCoglboxPrivate *priv = TEST_COGLBOX_GET_PRIVATE (self);
   CoglPipeline *pipeline;
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   gfloat texcoords[4] = { 0.0, 0.0, 1.0, 1.0 };
 
diff --git a/src/tests/clutter/interactive/test-cogl-tex-polygon.c 
b/src/tests/clutter/interactive/test-cogl-tex-polygon.c
index 8f4824f0d..654401b4d 100644
--- a/src/tests/clutter/interactive/test-cogl-tex-polygon.c
+++ b/src/tests/clutter/interactive/test-cogl-tex-polygon.c
@@ -197,7 +197,8 @@ test_coglbox_paint (ClutterActor        *self,
                                            : priv->not_sliced_tex;
   int tex_width = cogl_texture_get_width (tex_handle);
   int tex_height = cogl_texture_get_height (tex_handle);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglHandle material = cogl_material_new ();
 
   cogl_material_set_layer (material, 0, tex_handle);
diff --git a/src/tests/clutter/interactive/test-cogl-tex-tile.c 
b/src/tests/clutter/interactive/test-cogl-tex-tile.c
index 2e681740c..9948696a4 100644
--- a/src/tests/clutter/interactive/test-cogl-tex-tile.c
+++ b/src/tests/clutter/interactive/test-cogl-tex-tile.c
@@ -87,7 +87,8 @@ test_coglbox_paint (ClutterActor        *self,
                     ClutterPaintContext *paint_context)
 {
   TestCoglboxPrivate *priv = TEST_COGLBOX_GET_PRIVATE (self);
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   CoglPipeline *pipeline;
   gfloat texcoords[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
diff --git a/src/tests/clutter/interactive/test-paint-wrapper.c 
b/src/tests/clutter/interactive/test-paint-wrapper.c
index 7ad20e2fa..6e8c293db 100644
--- a/src/tests/clutter/interactive/test-paint-wrapper.c
+++ b/src/tests/clutter/interactive/test-paint-wrapper.c
@@ -148,7 +148,8 @@ hand_pre_paint (ClutterActor        *actor,
                 ClutterPaintContext *paint_context,
                 gpointer             user_data)
 {
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   CoglPipeline *pipeline;
   SuperOH *oh = user_data;
@@ -176,7 +177,8 @@ hand_post_paint (ClutterActor        *actor,
                  ClutterPaintContext *paint_context,
                  gpointer             user_data)
 {
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   CoglPipeline *pipeline;
   SuperOH *oh = user_data;
diff --git a/src/tests/clutter/micro-bench/test-cogl-perf.c b/src/tests/clutter/micro-bench/test-cogl-perf.c
index 03038ae4f..9bf8a4721 100644
--- a/src/tests/clutter/micro-bench/test-cogl-perf.c
+++ b/src/tests/clutter/micro-bench/test-cogl-perf.c
@@ -27,14 +27,17 @@ typedef struct _TestState
   int current_test;
 } TestState;
 
-typedef void (*TestCallback) (TestState *state);
+typedef void (*TestCallback) (TestState           *state,
+                              ClutterPaintContext *paint_context);
 
 static void
-test_rectangles (TestState *state)
+test_rectangles (TestState           *state,
+                 ClutterPaintContext *paint_context)
 {
 #define RECT_WIDTH 5
 #define RECT_HEIGHT 5
-  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
+  CoglFramebuffer *framebuffer =
+    clutter_paint_context_get_framebuffer (paint_context);
   CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
   int x;
   int y;
@@ -111,7 +114,7 @@ on_paint (ClutterActor        *actor,
           ClutterPaintContext *paint_context,
           TestState           *state)
 {
-  tests[state->current_test] (state);
+  tests[state->current_test] (state, paint_context);
 }
 
 static gboolean


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