mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 11:32:04 +00:00
background: Reload when GPU memory is invalidated
Fixes corrupt background wallpaper when resuming from suspend on the Nvidia driver. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1084 https://gitlab.gnome.org/GNOME/mutter/merge_requests/600
This commit is contained in:
parent
62f576e15b
commit
a5265365dd
@ -252,12 +252,11 @@ static void
|
|||||||
set_file (MetaBackground *self,
|
set_file (MetaBackground *self,
|
||||||
GFile **filep,
|
GFile **filep,
|
||||||
MetaBackgroundImage **imagep,
|
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)
|
if (*imagep)
|
||||||
{
|
{
|
||||||
g_signal_handlers_disconnect_by_func (*imagep,
|
g_signal_handlers_disconnect_by_func (*imagep,
|
||||||
@ -267,11 +266,12 @@ set_file (MetaBackground *self,
|
|||||||
*imagep = NULL;
|
*imagep = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_set_object (filep, file);
|
||||||
|
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
MetaBackgroundImageCache *cache = meta_background_image_cache_get_default ();
|
MetaBackgroundImageCache *cache = meta_background_image_cache_get_default ();
|
||||||
|
|
||||||
*filep = g_object_ref (file);
|
|
||||||
*imagep = meta_background_image_cache_load (cache, file);
|
*imagep = meta_background_image_cache_load (cache, file);
|
||||||
g_signal_connect (*imagep, "loaded",
|
g_signal_connect (*imagep, "loaded",
|
||||||
G_CALLBACK (on_background_loaded), self);
|
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
|
static void
|
||||||
meta_background_dispose (GObject *object)
|
meta_background_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
@ -287,8 +313,8 @@ meta_background_dispose (GObject *object)
|
|||||||
free_color_texture (self);
|
free_color_texture (self);
|
||||||
free_wallpaper_texture (self);
|
free_wallpaper_texture (self);
|
||||||
|
|
||||||
set_file (self, &self->file1, &self->background_image1, NULL);
|
set_file (self, &self->file1, &self->background_image1, NULL, FALSE);
|
||||||
set_file (self, &self->file2, &self->background_image2, NULL);
|
set_file (self, &self->file2, &self->background_image2, NULL, FALSE);
|
||||||
|
|
||||||
set_display (self, NULL);
|
set_display (self, NULL);
|
||||||
|
|
||||||
@ -312,7 +338,7 @@ meta_background_constructed (GObject *object)
|
|||||||
G_OBJECT_CLASS (meta_background_parent_class)->constructed (object);
|
G_OBJECT_CLASS (meta_background_parent_class)->constructed (object);
|
||||||
|
|
||||||
g_signal_connect_object (self->display, "gl-video-memory-purged",
|
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_signal_connect_object (monitor_manager, "monitors-changed",
|
||||||
G_CALLBACK (on_monitors_changed), self,
|
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 (META_IS_BACKGROUND (self));
|
||||||
g_return_if_fail (blend_factor >= 0.0 && blend_factor <= 1.0);
|
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->file1, &self->background_image1, file1, FALSE);
|
||||||
set_file (self, &self->file2, &self->background_image2, file2);
|
set_file (self, &self->file2, &self->background_image2, file2, FALSE);
|
||||||
|
|
||||||
self->blend_factor = blend_factor;
|
self->blend_factor = blend_factor;
|
||||||
self->style = style;
|
self->style = style;
|
||||||
|
Loading…
Reference in New Issue
Block a user