From c74824c8a624fc8fff2c1d2157a0157be23765663b147260dbcb1d1049a36ce7 Mon Sep 17 00:00:00 2001
From: Dominique Leuenberger <dimstar@opensuse.org>
Date: Tue, 29 Aug 2023 14:27:16 +0000
Subject: [PATCH] Accepting request 1107929 from
 home:AZhou:branches:GNOME:Factory

- Add mutter-fix-clipped-redraw.patch: Previous refactor forget
  to check has_buffer_age, which leads into force full redraw and
  causes redraw issue with xterm on qemu. This patch fixes it.
  (bsc#1210744, glgo#GNOME/mutter!3221)
- Drop mutter-revert-window_draw_issues.patch: Proper fix is added.

OBS-URL: https://build.opensuse.org/request/show/1107929
OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/mutter?expand=0&rev=461
---
 mutter-fix-clipped-redraw.patch        |  37 ++++++++
 mutter-revert-window_draw_issues.patch | 123 -------------------------
 mutter.changes                         |   9 ++
 mutter.spec                            |   4 +-
 4 files changed, 48 insertions(+), 125 deletions(-)
 create mode 100644 mutter-fix-clipped-redraw.patch
 delete mode 100644 mutter-revert-window_draw_issues.patch

diff --git a/mutter-fix-clipped-redraw.patch b/mutter-fix-clipped-redraw.patch
new file mode 100644
index 0000000..0faecb2
--- /dev/null
+++ b/mutter-fix-clipped-redraw.patch
@@ -0,0 +1,37 @@
+From afd7d5ad1b5587eb2c4dd978f0e577d9640354be Mon Sep 17 00:00:00 2001
+From: Carlos Garnacho <carlosg@gnome.org>
+Date: Tue, 29 Aug 2023 11:21:50 +0200
+Subject: [PATCH] backends: Check that buffer age is available when checking
+ damage history
+
+This used to be the case before the refactor at commit 43cee4b6b6,
+use_clipped_redraw would be unset before the larger check if has_buffer_age
+was set, but clutter_damage_history_is_age_valid() was FALSE. This got
+replaced by a check just on the latter, which will also be FALSE if
+has_buffer_age is not present.
+
+We have other means to achieve clipped redraws, so this slight change
+culled all of them.
+
+Fixes: 43cee4b6b6 ("stage-impl: Do clipped redraws when drawing offscreen")
+Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2771
+---
+ src/backends/meta-stage-impl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/backends/meta-stage-impl.c b/src/backends/meta-stage-impl.c
+index 26a7531296b..af88451d331 100644
+--- a/src/backends/meta-stage-impl.c
++++ b/src/backends/meta-stage-impl.c
+@@ -475,7 +475,7 @@ should_use_clipped_redraw (gboolean              is_full_redraw,
+   if (COGL_IS_OFFSCREEN (framebuffer))
+     return TRUE;
+ 
+-  if (!buffer_has_valid_damage_history)
++  if (has_buffer_age && !buffer_has_valid_damage_history)
+     {
+       meta_topic (META_DEBUG_BACKEND,
+                   "Invalid back buffer age: forcing full redraw");
+-- 
+GitLab
+
diff --git a/mutter-revert-window_draw_issues.patch b/mutter-revert-window_draw_issues.patch
deleted file mode 100644
index b322eda..0000000
--- a/mutter-revert-window_draw_issues.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From ae1432062ad1dc209dbd2cb8fc1e835d447d226f Mon Sep 17 00:00:00 2001
-From: Domninique Leuenberger <dimstar@opensuse.org>
-Date: Tue, 22 Aug 2023 05:31:14 -0400
-Subject: [PATCH] Revert "stage-impl: Do clipped redraws when drawing
- offscreen"
-
-This reverts commit 43cee4b6b6bef88e74ef877439aa5696c95612b7.
----
- src/backends/meta-stage-impl.c | 72 ++++++++++------------------------
- 1 file changed, 21 insertions(+), 51 deletions(-)
-
-diff --git a/src/backends/meta-stage-impl.c b/src/backends/meta-stage-impl.c
-index db94c7e4..31e07d96 100644
---- a/src/backends/meta-stage-impl.c
-+++ b/src/backends/meta-stage-impl.c
-@@ -454,46 +454,6 @@ transform_swap_region_to_onscreen (ClutterStageView *stage_view,
-   return transformed_region;
- }
- 
--static gboolean
--should_use_clipped_redraw (gboolean              is_full_redraw,
--                           gboolean              has_buffer_age,
--                           gboolean              buffer_has_valid_damage_history,
--                           ClutterDrawDebugFlag  paint_debug_flags,
--                           CoglFramebuffer      *framebuffer,
--                           ClutterStageWindow   *stage_window)
--{
--  gboolean can_blit_sub_buffer;
--  gboolean can_use_clipped_redraw;
--  gboolean is_warmed_up;
--
--  if (is_full_redraw)
--    return FALSE;
--
--  if (paint_debug_flags & CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS)
--    return FALSE;
--
--  if (COGL_IS_OFFSCREEN (framebuffer))
--    return TRUE;
--
--  if (!buffer_has_valid_damage_history)
--    {
--      meta_topic (META_DEBUG_BACKEND,
--                  "Invalid back buffer age: forcing full redraw");
--      return FALSE;
--    }
--
--  can_blit_sub_buffer =
--    cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_REGION);
--  can_use_clipped_redraw =
--    _clutter_stage_window_can_clip_redraws (stage_window) &&
--    (can_blit_sub_buffer || has_buffer_age);
--  /* Some drivers struggle to get going and produce some junk
--   * frames when starting up... */
--  is_warmed_up =
--    cogl_onscreen_get_frame_counter (COGL_ONSCREEN (framebuffer)) > 3;
--  return is_warmed_up && can_use_clipped_redraw;
--}
--
- static void
- meta_stage_impl_redraw_view_primary (MetaStageImpl    *stage_impl,
-                                      ClutterStageView *stage_view,
-@@ -505,8 +465,8 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl    *stage_impl,
-   CoglFramebuffer *onscreen = clutter_stage_view_get_onscreen (stage_view);
-   cairo_rectangle_int_t view_rect;
-   gboolean is_full_redraw;
--  gboolean use_clipped_redraw;
--  gboolean buffer_has_valid_damage_history = FALSE;
-+  gboolean use_clipped_redraw = TRUE;
-+  gboolean can_blit_sub_buffer;
-   gboolean has_buffer_age;
-   gboolean swap_with_damage;
-   cairo_region_t *redraw_clip;
-@@ -524,6 +484,10 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl    *stage_impl,
-   fb_width = cogl_framebuffer_get_width (fb);
-   fb_height = cogl_framebuffer_get_height (fb);
- 
-+  can_blit_sub_buffer =
-+    COGL_IS_ONSCREEN (onscreen) &&
-+    cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_REGION);
-+
-   has_buffer_age =
-     COGL_IS_ONSCREEN (onscreen) &&
-     cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
-@@ -541,20 +505,26 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl    *stage_impl,
-   if (has_buffer_age)
-     {
-       buffer_age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (onscreen));
--      buffer_has_valid_damage_history =
--        clutter_damage_history_is_age_valid (damage_history,
--                                             buffer_age);
-+      if (!clutter_damage_history_is_age_valid (damage_history, buffer_age))
-+        {
-+          meta_topic (META_DEBUG_BACKEND,
-+                      "Invalid back buffer(age=%d): forcing full redraw",
-+                      buffer_age);
-+          use_clipped_redraw = FALSE;
-+        }
-     }
- 
-   meta_get_clutter_debug_flags (NULL, &paint_debug_flags, NULL);
- 
-   use_clipped_redraw =
--    should_use_clipped_redraw (is_full_redraw,
--                               has_buffer_age,
--                               buffer_has_valid_damage_history,
--                               paint_debug_flags,
--                               onscreen,
--                               stage_window);
-+    use_clipped_redraw &&
-+    !(paint_debug_flags & CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS) &&
-+    _clutter_stage_window_can_clip_redraws (stage_window) &&
-+    (can_blit_sub_buffer || has_buffer_age) &&
-+    !is_full_redraw &&
-+    /* some drivers struggle to get going and produce some junk
-+     * frames when starting up... */
-+    cogl_onscreen_get_frame_counter (COGL_ONSCREEN (onscreen)) > 3;
- 
-   if (use_clipped_redraw)
-     {
--- 
-2.41.0
-
diff --git a/mutter.changes b/mutter.changes
index b9332f1..39d1f50 100644
--- a/mutter.changes
+++ b/mutter.changes
@@ -1,3 +1,12 @@
+-------------------------------------------------------------------
+Tue Aug 29 09:50:53 UTC 2023 - Alynx Zhou <alynx.zhou@suse.com>
+
+- Add mutter-fix-clipped-redraw.patch: Previous refactor forget
+  to check has_buffer_age, which leads into force full redraw and
+  causes redraw issue with xterm on qemu. This patch fixes it.
+  (bsc#1210744, glgo#GNOME/mutter!3221)
+- Drop mutter-revert-window_draw_issues.patch: Proper fix is added.
+
 -------------------------------------------------------------------
 Tue Aug 22 09:24:36 UTC 2023 - Dominique Leuenberger <dimstar@opensuse.org>
 
diff --git a/mutter.spec b/mutter.spec
index 5092cd3..142cc55 100644
--- a/mutter.spec
+++ b/mutter.spec
@@ -36,8 +36,8 @@ Patch1:         mutter-disable-cvt-s390x.patch
 Patch2:         mutter-window-actor-Special-case-shaped-Java-windows.patch
 # PATCH-FIX-UPSTREAM mutter-crash-meta_context_terminate.patch bsc#1199382 glgo#GNOME/mutter#2267 xwang@suse.com -- Fix SIGSEGV in meta_context_terminate
 Patch3:         mutter-crash-meta_context_terminate.patch
-# PATCH-FIX-UPSTREAM Add mutter-revert-window_draw_issues.patch 1210744 glgo#GNOME/mutter#2771 -- Revert commit 43cee4b6:  Do clipped redraws when drawing offscreen
-Patch4:         mutter-revert-window_draw_issues.patch
+# PATCH-FIX-UPSTREAM mutter-fix-clipped-redraw.patch bsc#1210744 glgo#GNOME/mutter!3221 alynx.zhou@suse.com -- Fix clipped redraw issue on qemu
+Patch4:         mutter-fix-clipped-redraw.patch
 
 ## SLE-only patches start at 1000
 # PATCH-FEATURE-SLE mutter-SLE-bell.patch FATE#316042 bnc#889218 idonmez@suse.com -- make audible bell work out of the box.