From 55c9fe5b90c5d0d27cd21c6daf6298d66b5b6e8d Mon Sep 17 00:00:00 2001 From: Bruce Leidl Date: Sun, 25 Mar 2018 08:28:14 -0400 Subject: [PATCH] Patch added for performance problem in clutter text rendering More details here: https://gitlab.gnome.org/GNOME/mutter/merge_requests/20 --- ...unnecessary-relayouts-in-cluttertext.patch | 108 ++++++++++++++++++ .../recipes-gnome/mutter/mutter_3.28.0.bb | 6 +- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 meta-gnome/recipes-gnome/mutter/mutter/0002-avoid-unnecessary-relayouts-in-cluttertext.patch diff --git a/meta-gnome/recipes-gnome/mutter/mutter/0002-avoid-unnecessary-relayouts-in-cluttertext.patch b/meta-gnome/recipes-gnome/mutter/mutter/0002-avoid-unnecessary-relayouts-in-cluttertext.patch new file mode 100644 index 0000000..417e22a --- /dev/null +++ b/meta-gnome/recipes-gnome/mutter/mutter/0002-avoid-unnecessary-relayouts-in-cluttertext.patch @@ -0,0 +1,108 @@ +From 8286557a0555058440536e88393fda445d49d399 Mon Sep 17 00:00:00 2001 +From: Yussuf Khalil +Date: Sun, 18 Feb 2018 21:21:44 +0100 +Subject: [PATCH] clutter: Avoid unnecessary relayouts in ClutterText + +We can save an unnecessary relayout if the required size to fully draw the text +is equal to the currently allocated size after the underlying text buffer or +attributes that only affect the PangoLayout have changed. +--- + clutter/clutter/clutter-text.c | 43 ++++++++++++++++++++++++++---------------- + 1 file changed, 27 insertions(+), 16 deletions(-) + +diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c +index 4828a4cbd..4a6a74a0c 100644 +--- a/clutter/clutter/clutter-text.c ++++ b/clutter/clutter/clutter-text.c +@@ -4511,6 +4511,27 @@ buffer_deleted_text (ClutterTextBuffer *buffer, + } + } + ++static void ++clutter_text_queue_redraw_or_relayout (ClutterText *self) ++{ ++ ClutterActor *actor = CLUTTER_ACTOR (self); ++ gfloat preferred_width; ++ gfloat preferred_height; ++ ++ clutter_text_dirty_cache (self); ++ ++ /* we're using our private implementations here to avoid the caching done by ClutterActor */ ++ clutter_text_get_preferred_width (actor, -1, NULL, &preferred_width); ++ clutter_text_get_preferred_height (actor, preferred_width, NULL, &preferred_height); ++ ++ if (clutter_actor_has_allocation (actor) && ++ (fabsf (preferred_width - clutter_actor_get_width (actor)) > 0.001 || ++ fabsf (preferred_height - clutter_actor_get_height (actor)) > 0.001)) ++ clutter_actor_queue_relayout (actor); ++ else ++ clutter_text_queue_redraw (actor); ++} ++ + static void + buffer_notify_text (ClutterTextBuffer *buffer, + GParamSpec *spec, +@@ -4518,9 +4539,7 @@ buffer_notify_text (ClutterTextBuffer *buffer, + { + g_object_freeze_notify (G_OBJECT (self)); + +- clutter_text_dirty_cache (self); +- +- clutter_actor_queue_relayout (CLUTTER_ACTOR (self)); ++ clutter_text_queue_redraw_or_relayout (self); + + g_signal_emit (self, text_signals[TEXT_CHANGED], 0); + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]); +@@ -4872,8 +4891,7 @@ clutter_text_set_cursor_visible (ClutterText *self, + { + priv->cursor_visible = cursor_visible; + +- clutter_text_dirty_cache (self); +- clutter_actor_queue_relayout (CLUTTER_ACTOR (self)); ++ clutter_text_queue_redraw_or_relayout (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURSOR_VISIBLE]); + } +@@ -5774,9 +5792,7 @@ clutter_text_set_line_alignment (ClutterText *self, + { + priv->alignment = alignment; + +- clutter_text_dirty_cache (self); +- +- clutter_actor_queue_relayout (CLUTTER_ACTOR (self)); ++ clutter_text_queue_redraw_or_relayout (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_LINE_ALIGNMENT]); + } +@@ -5831,9 +5847,7 @@ clutter_text_set_use_markup (ClutterText *self, + if (setting) + clutter_text_set_markup_internal (self, text); + +- clutter_text_dirty_cache (self); +- +- clutter_actor_queue_relayout (CLUTTER_ACTOR (self)); ++ clutter_text_queue_redraw_or_relayout (self); + } + + /** +@@ -5880,9 +5894,7 @@ clutter_text_set_justify (ClutterText *self, + { + priv->justify = justify; + +- clutter_text_dirty_cache (self); +- +- clutter_actor_queue_relayout (CLUTTER_ACTOR (self)); ++ clutter_text_queue_redraw_or_relayout (self); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_JUSTIFY]); + } +@@ -6449,8 +6461,7 @@ clutter_text_set_preedit_string (ClutterText *self, + priv->preedit_set = TRUE; + } + +- clutter_text_dirty_cache (self); +- clutter_actor_queue_relayout (CLUTTER_ACTOR (self)); ++ clutter_text_queue_redraw_or_relayout (self); + } + + diff --git a/meta-gnome/recipes-gnome/mutter/mutter_3.28.0.bb b/meta-gnome/recipes-gnome/mutter/mutter_3.28.0.bb index 5941ae1..cd4205a 100644 --- a/meta-gnome/recipes-gnome/mutter/mutter_3.28.0.bb +++ b/meta-gnome/recipes-gnome/mutter/mutter_3.28.0.bb @@ -3,7 +3,11 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263" SRC_URI[archive.md5sum] = "7a3baf2fbb02f9cc341bf0424a31d0d2" SRC_URI[archive.sha256sum] = "58fffc8025f21fb6da27bd2189b6db4d20c54f950b1a46aa7f7cbf0a82d386b0" -SRC_URI_append = " file://0001-remove-check-for-zenity.patch file://startup-notification.patch" +SRC_URI_append = "\ + file://0001-remove-check-for-zenity.patch \ + file://0002-avoid-unnecessary-relayouts-in-cluttertext.patch \ + file://startup-notification.patch \ +" DEPENDS = "libxrandr libsm libx11 libxi glib-2.0 wayland-protocols libwacom mesa gtk+3 pango cairo gsettings-desktop-schemas xcomposite upower gnome-desktop libxkbfile json-glib wayland-native xinerama zenity libinput libcanberra" RDEPENDS_${PN} = "zenity"