[metacity] compositor: move all_damage region to MetaCompositor
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] compositor: move all_damage region to MetaCompositor
- Date: Fri, 13 Sep 2019 22:43:34 +0000 (UTC)
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]