[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