diff --git a/SOURCES/0001-background-Reload-when-GPU-memory-is-invalidated.patch b/SOURCES/0001-background-Reload-when-GPU-memory-is-invalidated.patch new file mode 100644 index 0000000..fae4a7e --- /dev/null +++ b/SOURCES/0001-background-Reload-when-GPU-memory-is-invalidated.patch @@ -0,0 +1,118 @@ +From 5a486f5b6bf5f838db5dc2bfc5819a0cba5d2d19 Mon Sep 17 00:00:00 2001 +From: Daniel van Vugt +Date: Thu, 23 May 2019 18:15:28 +0800 +Subject: [PATCH] background: Reload when GPU memory is invalidated + +Fixes corrupt background wallpaper when resuming from suspend on the +Nvidia driver. + +https://gitlab.gnome.org/GNOME/gnome-shell/issues/1084 + +(cherry picked from commit a5265365dd268e15a461a58000a10b122d0bccba) + +https://gitlab.gnome.org/GNOME/mutter/merge_requests/777 +--- + src/compositor/meta-background.c | 46 +++++++++++++++++++++++++------- + 1 file changed, 36 insertions(+), 10 deletions(-) + +diff --git a/src/compositor/meta-background.c b/src/compositor/meta-background.c +index c033395fe..387ce5dd3 100644 +--- a/src/compositor/meta-background.c ++++ b/src/compositor/meta-background.c +@@ -252,12 +252,11 @@ static void + set_file (MetaBackground *self, + GFile **filep, + MetaBackgroundImage **imagep, +- GFile *file) ++ GFile *file, ++ gboolean force_reload) + { +- if (!file_equal0 (*filep, file)) ++ if (force_reload || !file_equal0 (*filep, file)) + { +- g_clear_object (filep); +- + if (*imagep) + { + g_signal_handlers_disconnect_by_func (*imagep, +@@ -267,11 +266,12 @@ set_file (MetaBackground *self, + *imagep = NULL; + } + ++ g_set_object (filep, file); ++ + if (file) + { + MetaBackgroundImageCache *cache = meta_background_image_cache_get_default (); + +- *filep = g_object_ref (file); + *imagep = meta_background_image_cache_load (cache, file); + g_signal_connect (*imagep, "loaded", + G_CALLBACK (on_background_loaded), self); +@@ -279,6 +279,32 @@ set_file (MetaBackground *self, + } + } + ++static void ++on_gl_video_memory_purged (MetaBackground *self) ++{ ++ MetaBackgroundImageCache *cache = meta_background_image_cache_get_default (); ++ ++ /* The GPU memory that just got invalidated is the texture inside ++ * self->background_image1,2 and/or its mipmaps. However, to save memory the ++ * original pixbuf isn't kept in RAM so we can't do a simple re-upload. The ++ * only copy of the image was the one in texture memory that got invalidated. ++ * So we need to do a full reload from disk. ++ */ ++ if (self->file1) ++ { ++ meta_background_image_cache_purge (cache, self->file1); ++ set_file (self, &self->file1, &self->background_image1, self->file1, TRUE); ++ } ++ ++ if (self->file2) ++ { ++ meta_background_image_cache_purge (cache, self->file2); ++ set_file (self, &self->file2, &self->background_image2, self->file2, TRUE); ++ } ++ ++ mark_changed (self); ++} ++ + static void + meta_background_dispose (GObject *object) + { +@@ -287,8 +313,8 @@ meta_background_dispose (GObject *object) + free_color_texture (self); + free_wallpaper_texture (self); + +- set_file (self, &self->file1, &self->background_image1, NULL); +- set_file (self, &self->file2, &self->background_image2, NULL); ++ set_file (self, &self->file1, &self->background_image1, NULL, FALSE); ++ set_file (self, &self->file2, &self->background_image2, NULL, FALSE); + + set_display (self, NULL); + +@@ -312,7 +338,7 @@ meta_background_constructed (GObject *object) + G_OBJECT_CLASS (meta_background_parent_class)->constructed (object); + + g_signal_connect_object (self->display, "gl-video-memory-purged", +- G_CALLBACK (mark_changed), object, G_CONNECT_SWAPPED); ++ G_CALLBACK (on_gl_video_memory_purged), object, G_CONNECT_SWAPPED); + + g_signal_connect_object (monitor_manager, "monitors-changed", + G_CALLBACK (on_monitors_changed), self, +@@ -937,8 +963,8 @@ meta_background_set_blend (MetaBackground *self, + g_return_if_fail (META_IS_BACKGROUND (self)); + g_return_if_fail (blend_factor >= 0.0 && blend_factor <= 1.0); + +- set_file (self, &self->file1, &self->background_image1, file1); +- set_file (self, &self->file2, &self->background_image2, file2); ++ set_file (self, &self->file1, &self->background_image1, file1, FALSE); ++ set_file (self, &self->file2, &self->background_image2, file2, FALSE); + + self->blend_factor = blend_factor; + self->style = style; +-- +2.26.2 + diff --git a/SPECS/mutter.spec b/SPECS/mutter.spec index bea2b77..bf9a614 100644 --- a/SPECS/mutter.spec +++ b/SPECS/mutter.spec @@ -8,7 +8,7 @@ Name: mutter Version: 3.32.2 -Release: 36%{?dist} +Release: 37%{?dist} Summary: Window and compositing manager based on Clutter License: GPLv2+ @@ -116,6 +116,9 @@ Patch290: 0001-clutter-avoid-redundant-_clutter_paint_node_init_typ.patch Patch291: 0002-clutter-avoid-g_signal_emit_by_name-from-ClutterActo.patch Patch292: 0003-clutter-fix-hole-in-ClutterPaintNode.patch +# Fix corrupted background after suspend (#1828162) +Patch300: 0001-background-Reload-when-GPU-memory-is-invalidated.patch + BuildRequires: chrpath BuildRequires: pango-devel BuildRequires: startup-notification-devel @@ -257,6 +260,10 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop %{_datadir}/mutter-%{mutter_api_version}/tests %changelog +* Tue May 19 2020 Jonas Ådahl - 3.32.2-37 +- Fix corrupted background after suspend + Resolves: #1828162 + * Wed Apr 08 2020 Florian Müllner - 3.32.2-36 - Improve performance under IO load Resolves: #1820760