[metacity] compositor: move all_damage region to MetaCompositor



commit 1099f3b51c079b61595ae243ef2c11385de7f279
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri Sep 13 21:23:11 2019 +0300

    compositor: move all_damage region to MetaCompositor

 src/compositor/meta-compositor-none.c    |   3 +-
 src/compositor/meta-compositor-private.h |   8 ++-
 src/compositor/meta-compositor-vulkan.c  |   3 +-
 src/compositor/meta-compositor-xrender.c |  77 ++++++++------------
 src/compositor/meta-compositor.c         | 120 ++++++++++++++++++++++++++++---
 src/core/util.c                          |   5 +-
 src/include/util.h                       |   3 +-
 7 files changed, 156 insertions(+), 63 deletions(-)
---
diff --git a/src/compositor/meta-compositor-none.c b/src/compositor/meta-compositor-none.c
index 542b5909..704d08b5 100644
--- a/src/compositor/meta-compositor-none.c
+++ b/src/compositor/meta-compositor-none.c
@@ -129,7 +129,8 @@ meta_compositor_none_sync_window_geometry (MetaCompositor *compositor,
 }
 
 static void
-meta_compositor_none_redraw (MetaCompositor *compositor)
+meta_compositor_none_redraw (MetaCompositor *compositor,
+                             XserverRegion   all_damage)
 {
 }
 
diff --git a/src/compositor/meta-compositor-private.h b/src/compositor/meta-compositor-private.h
index f444829c..89a1c3c0 100644
--- a/src/compositor/meta-compositor-private.h
+++ b/src/compositor/meta-compositor-private.h
@@ -19,6 +19,7 @@
 #ifndef META_COMPOSITOR_PRIVATE_H
 #define META_COMPOSITOR_PRIVATE_H
 
+#include <X11/extensions/Xfixes.h>
 #include "meta-compositor.h"
 #include "meta-surface.h"
 
@@ -79,7 +80,8 @@ struct _MetaCompositorClass
   void              (* sync_window_geometry)         (MetaCompositor     *compositor,
                                                       MetaWindow         *window);
 
-  void              (* redraw)                       (MetaCompositor     *compositor);
+  void              (* redraw)                       (MetaCompositor     *compositor,
+                                                      XserverRegion       all_damage);
 };
 
 void         meta_compositor_set_composited          (MetaCompositor  *compositor,
@@ -98,6 +100,10 @@ gboolean     meta_compositor_redirect_windows        (MetaCompositor  *composito
 
 MetaDisplay *meta_compositor_get_display             (MetaCompositor  *compositor);
 
+void         meta_compositor_add_damage              (MetaCompositor  *compositor,
+                                                      const gchar     *name,
+                                                      XserverRegion    damage);
+
 void         meta_compositor_queue_redraw            (MetaCompositor  *compositor);
 
 G_END_DECLS
diff --git a/src/compositor/meta-compositor-vulkan.c b/src/compositor/meta-compositor-vulkan.c
index fcfea1d5..e737ce84 100644
--- a/src/compositor/meta-compositor-vulkan.c
+++ b/src/compositor/meta-compositor-vulkan.c
@@ -1363,7 +1363,8 @@ meta_compositor_vulkan_sync_window_geometry (MetaCompositor *compositor,
 }
 
 static void
-meta_compositor_vulkan_redraw (MetaCompositor *compositor)
+meta_compositor_vulkan_redraw (MetaCompositor *compositor,
+                               XserverRegion   all_damage)
 {
 }
 
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index 6cb06441..69b0cb0a 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -163,7 +163,6 @@ struct _MetaCompositorXRender
   Picture         root_buffer;
   Picture         black_picture;
   Picture         root_tile;
-  XserverRegion   all_damage;
 
   gboolean        clip_changed;
 
@@ -1703,25 +1702,6 @@ add_repair (MetaCompositorXRender *xrender)
   meta_compositor_queue_redraw (META_COMPOSITOR (xrender));
 }
 
-static void
-add_damage (MetaCompositorXRender *xrender,
-            XserverRegion          damage)
-{
-  Display *xdisplay = xrender->xdisplay;
-
-  /* dump_xserver_region (xrender, "add_damage", damage); */
-
-  if (xrender->all_damage)
-    {
-      XFixesUnionRegion (xdisplay, xrender->all_damage, xrender->all_damage, damage);
-      XFixesDestroyRegion (xdisplay, damage);
-    }
-  else
-    xrender->all_damage = damage;
-
-  add_repair (xrender);
-}
-
 static void
 damage_screen (MetaCompositorXRender *xrender)
 {
@@ -1739,8 +1719,9 @@ damage_screen (MetaCompositorXRender *xrender)
   r.height = height;
 
   region = XFixesCreateRegion (xdisplay, &r, 1);
-  dump_xserver_region (xrender, "damage_screen", region);
-  add_damage (xrender, region);
+
+  meta_compositor_add_damage (compositor, "damage_screen", region);
+  XFixesDestroyRegion (xdisplay, region);
 }
 
 static void
@@ -1768,8 +1749,9 @@ repair_win (MetaCompositorXRender *xrender,
 
   meta_error_trap_pop (display);
 
-  dump_xserver_region (xrender, "repair_win", parts);
-  add_damage (xrender, parts);
+  meta_compositor_add_damage (compositor, "repair_win", parts);
+  XFixesDestroyRegion (xdisplay, parts);
+
   cw->damaged = TRUE;
 }
 
@@ -1972,8 +1954,8 @@ determine_mode (MetaCompositorXRender *xrender,
       damage = XFixesCreateRegion (xdisplay, NULL, 0);
       XFixesCopyRegion (xdisplay, damage, cw->extents);
 
-      dump_xserver_region (xrender, "determine_mode", damage);
-      add_damage (xrender, damage);
+      meta_compositor_add_damage (compositor, "determine_mode", damage);
+      XFixesDestroyRegion (xdisplay, damage);
     }
 }
 
@@ -1982,10 +1964,12 @@ notify_appears_focused_cb (MetaWindow            *window,
                            GParamSpec            *pspec,
                            MetaCompositorXRender *xrender)
 {
+  MetaCompositor *compositor;
   MetaCompWindow *cw;
   Display *xdisplay;
   XserverRegion damage;
 
+  compositor = META_COMPOSITOR (xrender);
   cw = find_comp_window_by_window (xrender, window);
 
   if (cw == NULL)
@@ -2033,8 +2017,8 @@ notify_appears_focused_cb (MetaWindow            *window,
       XFixesCopyRegion (xdisplay, damage, cw->extents);
     }
 
-  dump_xserver_region (xrender, "notify_appears_focused_cb", damage);
-  add_damage (xrender, damage);
+  meta_compositor_add_damage (compositor, "notify_appears_focused_cb", damage);
+  XFixesDestroyRegion (xdisplay, damage);
 
   xrender->clip_changed = TRUE;
   add_repair (xrender);
@@ -2045,8 +2029,10 @@ notify_decorated_cb (MetaWindow            *window,
                      GParamSpec            *pspec,
                      MetaCompositorXRender *xrender)
 {
+  MetaCompositor *compositor;
   MetaCompWindow *cw;
 
+  compositor = META_COMPOSITOR (xrender);
   cw = find_comp_window_by_window (xrender, window);
 
   if (cw == NULL)
@@ -2116,8 +2102,8 @@ notify_decorated_cb (MetaWindow            *window,
 
   if (cw->extents != None)
     {
-      dump_xserver_region (xrender, "notify_decorated_cb", cw->extents);
-      add_damage (xrender, cw->extents);
+      meta_compositor_add_damage (compositor, "notify_decorated_cb", cw->extents);
+      XFixesDestroyRegion (xrender->xdisplay, cw->extents);
       cw->extents = None;
     }
 
@@ -2220,8 +2206,8 @@ expose_area (MetaCompositorXRender *xrender,
 
   region = XFixesCreateRegion (xrender->xdisplay, rects, nrects);
 
-  dump_xserver_region (xrender, "expose_area", region);
-  add_damage (xrender, region);
+  meta_compositor_add_damage (META_COMPOSITOR (xrender), "expose_area", region);
+  XFixesDestroyRegion (xrender->xdisplay, region);
 }
 
 static void
@@ -2421,7 +2407,6 @@ meta_compositor_xrender_manage (MetaCompositor  *compositor,
   xrender->black_picture = solid_picture (xdisplay, TRUE, 1, 0, 0, 0);
 
   xrender->root_tile = None;
-  xrender->all_damage = None;
 
   xrender->windows = NULL;
   xrender->windows_by_xid = g_hash_table_new (g_direct_hash, g_direct_equal);
@@ -2559,8 +2544,8 @@ meta_compositor_xrender_remove_window (MetaCompositor *compositor,
 
   if (cw->extents != None)
     {
-      dump_xserver_region (xrender, "remove_window", cw->extents);
-      add_damage (xrender, cw->extents);
+      meta_compositor_add_damage (compositor, "remove_window", cw->extents);
+      XFixesDestroyRegion (xrender->xdisplay, cw->extents);
       cw->extents = None;
     }
 
@@ -2606,8 +2591,8 @@ meta_compositor_xrender_hide_window (MetaCompositor *compositor,
 
   if (cw->extents != None)
     {
-      dump_xserver_region (xrender, "hide_window", cw->extents);
-      add_damage (xrender, cw->extents);
+      meta_compositor_add_damage (compositor, "hide_window", cw->extents);
+      XFixesDestroyRegion (xrender->xdisplay, cw->extents);
       cw->extents = None;
     }
 
@@ -2667,8 +2652,8 @@ meta_compositor_xrender_window_shape_region_changed (MetaCompositor *compositor,
 
   if (cw->shape_region != None)
     {
-      dump_xserver_region (xrender, "shape_changed", cw->shape_region);
-      add_damage (xrender, cw->shape_region);
+      meta_compositor_add_damage (compositor, "shape_changed", cw->shape_region);
+      XFixesDestroyRegion (xrender->xdisplay, cw->shape_region);
 
       xrender->clip_changed = TRUE;
     }
@@ -3086,8 +3071,8 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
       XFixesTranslateRegion (xrender->xdisplay, cw->shape_region, dx, dy);
     }
 
-  dump_xserver_region (xrender, "sync_window_geometry", damage);
-  add_damage (xrender, damage);
+  meta_compositor_add_damage (compositor, "sync_window_geometry", damage);
+  XFixesDestroyRegion (xrender->xdisplay, damage);
 
   xrender->clip_changed = TRUE;
 
@@ -3095,7 +3080,8 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
 }
 
 static void
-meta_compositor_xrender_redraw (MetaCompositor *compositor)
+meta_compositor_xrender_redraw (MetaCompositor *compositor,
+                                XserverRegion   all_damage)
 {
   MetaCompositorXRender *xrender;
   MetaDisplay *display;
@@ -3103,14 +3089,9 @@ meta_compositor_xrender_redraw (MetaCompositor *compositor)
   xrender = META_COMPOSITOR_XRENDER (compositor);
   display = meta_compositor_get_display (compositor);
 
-  if (xrender->all_damage == None)
-    return;
-
   meta_error_trap_push (display);
 
-  paint_all (xrender, xrender->all_damage);
-  XFixesDestroyRegion (xrender->xdisplay, xrender->all_damage);
-  xrender->all_damage = None;
+  paint_all (xrender, all_damage);
   xrender->clip_changed = FALSE;
 
   meta_error_trap_pop (display);
diff --git a/src/compositor/meta-compositor.c b/src/compositor/meta-compositor.c
index be8f79b9..9948f130 100644
--- a/src/compositor/meta-compositor.c
+++ b/src/compositor/meta-compositor.c
@@ -25,29 +25,32 @@
 
 #include "display-private.h"
 #include "errors.h"
+#include "util.h"
 #include "screen-private.h"
 
 typedef struct
 {
-  MetaDisplay *display;
+  MetaDisplay   *display;
 
-  gboolean     composited;
+  gboolean       composited;
 
   /* _NET_WM_CM_Sn */
-  Atom         cm_atom;
-  Window       cm_window;
-  guint32      cm_timestamp;
+  Atom           cm_atom;
+  Window         cm_window;
+  guint32        cm_timestamp;
 
   /* XCompositeGetOverlayWindow */
-  Window       overlay_window;
+  Window         overlay_window;
 
   /* XCompositeRedirectSubwindows */
-  gboolean     windows_redirected;
+  gboolean       windows_redirected;
 
-  GHashTable  *surfaces;
+  XserverRegion  all_damage;
+
+  GHashTable    *surfaces;
 
   /* meta_compositor_queue_redraw */
-  guint        redraw_id;
+  guint          redraw_id;
 } MetaCompositorPrivate;
 
 enum
@@ -70,6 +73,58 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaCompositor, meta_compositor, G_TYPE_OBJECT
                                   G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
                                                          initable_iface_init))
 
+static void
+debug_damage_region (MetaCompositor *compositor,
+                     const gchar    *name,
+                     XserverRegion   damage)
+{
+  MetaCompositorPrivate *priv;
+  Display *xdisplay;
+
+  if (!meta_check_debug_flags (META_DEBUG_DAMAGE_REGION))
+    return;
+
+  priv = meta_compositor_get_instance_private (compositor);
+  xdisplay = priv->display->xdisplay;
+
+  if (damage != None)
+    {
+      XRectangle *rects;
+      int nrects;
+      XRectangle bounds;
+
+      rects = XFixesFetchRegionAndBounds (xdisplay, damage, &nrects, &bounds);
+
+      if (nrects > 0)
+        {
+          int i;
+
+          meta_topic (META_DEBUG_DAMAGE_REGION, "%s: %d rects, bounds: %d,%d (%d,%d)\n",
+                      name, nrects, bounds.x, bounds.y, bounds.width, bounds.height);
+
+          meta_push_no_msg_prefix ();
+
+          for (i = 0; i < nrects; i++)
+            {
+              meta_topic (META_DEBUG_DAMAGE_REGION, "\t%d,%d (%d,%d)\n", rects[i].x,
+                          rects[i].y, rects[i].width, rects[i].height);
+            }
+
+          meta_pop_no_msg_prefix ();
+        }
+      else
+        {
+          meta_topic (META_DEBUG_DAMAGE_REGION, "%s: empty\n", name);
+        }
+
+      XFree (rects);
+    }
+  else
+    {
+      meta_topic (META_DEBUG_DAMAGE_REGION, "%s: none\n", name);
+    }
+}
+
 static gboolean
 redraw_idle_cb (gpointer user_data)
 {
@@ -79,7 +134,12 @@ redraw_idle_cb (gpointer user_data)
   compositor = META_COMPOSITOR (user_data);
   priv = meta_compositor_get_instance_private (compositor);
 
-  META_COMPOSITOR_GET_CLASS (compositor)->redraw (compositor);
+  if (priv->all_damage != None)
+    {
+      META_COMPOSITOR_GET_CLASS (compositor)->redraw (compositor, priv->all_damage);
+      XFixesDestroyRegion (priv->display->xdisplay, priv->all_damage);
+      priv->all_damage = None;
+    }
 
   priv->redraw_id = 0;
 
@@ -137,6 +197,12 @@ meta_compositor_finalize (GObject *object)
       priv->redraw_id = 0;
     }
 
+  if (priv->all_damage != None)
+    {
+      XFixesDestroyRegion (xdisplay, priv->all_damage);
+      priv->all_damage = None;
+    }
+
   if (priv->windows_redirected)
     {
       Window xroot;
@@ -641,6 +707,40 @@ meta_compositor_get_display (MetaCompositor *compositor)
   return priv->display;
 }
 
+/**
+ * meta_compositor_add_damage:
+ * @compositor: a #MetaCompositor
+ * @name: the name of damage region
+ * @damage: the damage region
+ *
+ * Adds damage region and queues a redraw.
+ */
+void
+meta_compositor_add_damage (MetaCompositor *compositor,
+                            const gchar    *name,
+                            XserverRegion   damage)
+{
+  MetaCompositorPrivate *priv;
+  Display *xdisplay;
+
+  priv = meta_compositor_get_instance_private (compositor);
+  xdisplay = priv->display->xdisplay;
+
+  debug_damage_region (compositor, name, damage);
+
+  if (priv->all_damage != None)
+    {
+      XFixesUnionRegion (xdisplay, priv->all_damage, priv->all_damage, damage);
+    }
+  else
+    {
+      priv->all_damage = XFixesCreateRegion (xdisplay, NULL, 0);
+      XFixesCopyRegion (xdisplay, priv->all_damage, damage);
+    }
+
+  meta_compositor_queue_redraw (compositor);
+}
+
 void
 meta_compositor_queue_redraw (MetaCompositor *compositor)
 {
diff --git a/src/core/util.c b/src/core/util.c
index 1459160b..dbf6f135 100644
--- a/src/core/util.c
+++ b/src/core/util.c
@@ -56,7 +56,8 @@ static const GDebugKey debug_keys[] = {
   { "shapes", META_DEBUG_SHAPES },
   { "edge-resistance", META_DEBUG_EDGE_RESISTANCE },
   { "verbose", META_DEBUG_VERBOSE },
-  { "vulkan", META_DEBUG_VULKAN }
+  { "vulkan", META_DEBUG_VULKAN },
+  { "damage-region", META_DEBUG_DAMAGE_REGION }
 };
 
 static guint debug_flags = 0;
@@ -275,6 +276,8 @@ topic_name (MetaDebugFlags topic)
       return "VERBOSE";
     case META_DEBUG_VULKAN:
       return "VULKAN";
+    case META_DEBUG_DAMAGE_REGION:
+      return "DAMAGE_REGION";
     default:
       break;
     }
diff --git a/src/include/util.h b/src/include/util.h
index 79a8b058..546e79c6 100644
--- a/src/include/util.h
+++ b/src/include/util.h
@@ -49,7 +49,8 @@ typedef enum
   META_DEBUG_SHAPES = 1 << 17,
   META_DEBUG_EDGE_RESISTANCE = 1 << 18,
   META_DEBUG_VERBOSE = 1 << 19,
-  META_DEBUG_VULKAN = 1 << 20
+  META_DEBUG_VULKAN = 1 << 20,
+  META_DEBUG_DAMAGE_REGION = 1 << 21
 } MetaDebugFlags;
 
 void meta_init_debug (void);


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