[Bf-blender-cvs] [7118317e9f2] temp-udim-images: Remove cache entries and free GPUTextures when changing tiled image to non-tiled

Lukas Stockner noreply at git.blender.org
Tue Jun 12 18:56:24 CEST 2018


Commit: 7118317e9f2f1ac795a9777bbcdbd84286065a51
Author: Lukas Stockner
Date:   Tue Jun 12 18:29:42 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB7118317e9f2f1ac795a9777bbcdbd84286065a51

Remove cache entries and free GPUTextures when changing tiled image to non-tiled

===================================================================

M	source/blender/blenkernel/intern/image.c
M	source/blender/imbuf/IMB_moviecache.h
M	source/blender/imbuf/intern/moviecache.c

===================================================================

diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 7569e3fb9a6..526e222463e 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -91,6 +91,7 @@
 #include "RE_pipeline.h"
 
 #include "GPU_draw.h"
+#include "GPU_texture.h"
 
 #include "BLI_sys_types.h" // for intptr_t support
 
@@ -165,6 +166,16 @@ static void imagecache_put(Image *image, int index, ImBuf *ibuf)
 	IMB_moviecache_put(image->cache, &key, ibuf);
 }
 
+static void imagecache_remove(Image *image, int index)
+{
+	if (!image->cache)
+		return;
+	
+	ImageCacheKey key;
+	key.index = index;
+	IMB_moviecache_remove(image->cache, &key);
+}
+
 static struct ImBuf *imagecache_get(Image *image, int index)
 {
 	if (image->cache) {
@@ -436,6 +447,13 @@ static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int entry)
 	}
 }
 
+static void image_remove_ibuf(Image *ima, int index, int entry)
+{
+	if (index != IMA_NO_INDEX)
+		index = IMA_MAKE_INDEX(entry, index);
+	imagecache_remove(ima, index);
+}
+
 static void copy_image_packedfiles(ListBase *lb_dst, const ListBase *lb_src)
 {
 	const ImagePackedFile *imapf_src;
@@ -2726,6 +2744,24 @@ void BKE_image_init_imageuser(Image *ima, ImageUser *iuser)
 	image_init_imageuser(ima, iuser);
 }
 
+static void image_free_tile(Image *ima, int tile)
+{
+	for (int t = 0; t < TEXTARGET_COUNT; t++) {
+		if (ima->tiles[t].gputexture[t]) {
+			GPU_texture_free(ima->tiles[t].gputexture[t]);
+			ima->tiles[t].gputexture[t] = NULL;
+		}
+	}
+
+	if (BKE_image_is_multiview(ima)) {
+		const int totviews = BLI_listbase_count(&ima->views);
+		for (int i = 0; i < totviews; i++) {
+			image_remove_ibuf(ima, i, tile);
+		}
+	}
+	else image_remove_ibuf(ima, 0, tile);
+}
+
 void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
 {
 	if (ima == NULL)
@@ -2769,6 +2805,16 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
 				ima->name[0] = '\0';
 			}
 
+			if (ima->source != IMA_SRC_TILED) {
+				if (ima->num_tiles > 1) {
+					for (int i = 1; i < ima->num_tiles; i++) {
+						image_free_tile(ima, i);
+					}
+					ima->tiles = MEM_reallocN(ima->tiles, sizeof(ImageTile));
+					ima->num_tiles = 1;
+				}
+			}
+
 #if 0
 			/* force reload on first use, but not for multilayer, that makes nodes and buttons in ui drawing fail */
 			if (ima->type != IMA_TYPE_MULTILAYER)
diff --git a/source/blender/imbuf/IMB_moviecache.h b/source/blender/imbuf/IMB_moviecache.h
index 0c72d1b4f01..756210a306e 100644
--- a/source/blender/imbuf/IMB_moviecache.h
+++ b/source/blender/imbuf/IMB_moviecache.h
@@ -60,6 +60,7 @@ void IMB_moviecache_set_priority_callback(struct MovieCache *cache, MovieCacheGe
 void IMB_moviecache_put(struct MovieCache *cache, void *userkey, struct ImBuf *ibuf);
 bool IMB_moviecache_put_if_possible(struct MovieCache *cache, void *userkey, struct ImBuf *ibuf);
 struct ImBuf *IMB_moviecache_get(struct MovieCache *cache, void *userkey);
+void IMB_moviecache_remove(struct MovieCache *cache, void *userkey);
 bool IMB_moviecache_has_frame(struct MovieCache *cache, void *userkey);
 void IMB_moviecache_free(struct MovieCache *cache);
 
diff --git a/source/blender/imbuf/intern/moviecache.c b/source/blender/imbuf/intern/moviecache.c
index daf062f5499..9ad9f6b9b41 100644
--- a/source/blender/imbuf/intern/moviecache.c
+++ b/source/blender/imbuf/intern/moviecache.c
@@ -415,6 +415,14 @@ bool IMB_moviecache_put_if_possible(MovieCache *cache, void *userkey, ImBuf *ibu
 	return result;
 }
 
+void IMB_moviecache_remove(MovieCache *cache, void *userkey)
+{
+	MovieCacheKey key;
+	key.cache_owner = cache;
+	key.userkey = userkey;
+	BLI_ghash_remove(cache->hash, &key, moviecache_keyfree, moviecache_valfree);
+}
+
 ImBuf *IMB_moviecache_get(MovieCache *cache, void *userkey)
 {
 	MovieCacheKey key;



More information about the Bf-blender-cvs mailing list