Fix T39395: Switching to "Textured solid" and "GLSL" view will cause the FPS drop...
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 25 Mar 2014 06:30:41 +0000 (12:30 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 25 Mar 2014 06:30:41 +0000 (12:30 +0600)
Issue was caused by the cache limitor which was removing 4k textures from the
memory when accessing other images.

This is pretty much awful situation and solved by making it so only image sequences
and movies ace cache-guarded.

Could be optimized further so images used by viewport are not being freed, but
that's much more tricky to do..

This is a nice candidature for 'a'.

source/blender/blenkernel/intern/image.c
source/blender/imbuf/intern/moviecache.c

index aaeead431b947560bb6b8f80a7c0a23f666bd579..7d8ada0fa68efcf0fea3171b9757e9f5b6fa8690 100644 (file)
@@ -3058,7 +3058,6 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
                        if (ima->type == IMA_TYPE_MULTILAYER)
                                /* keeps render result, stores ibufs in listbase, allows saving */
                                ibuf = image_get_ibuf_multilayer(ima, iuser);
-
                }
                else if (ima->source == IMA_SRC_GENERATED) {
                        /* generated is: ibuf is allocated dynamically */
@@ -3076,9 +3075,6 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
                                /* always verify entirely, and potentially
                                 * returns pointer to release later */
                                ibuf = image_get_render_result(ima, iuser, lock_r);
-                               if (ibuf) {
-                                       ibuf->userflags |= IB_PERSISTENT;
-                               }
                        }
                        else if (ima->type == IMA_TYPE_COMPOSITE) {
                                /* requires lock/unlock, otherwise don't return image */
@@ -3097,10 +3093,14 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
                                                ibuf = IMB_allocImBuf(256, 256, 32, IB_rect);
                                                image_assign_ibuf(ima, ibuf, 0, frame);
                                        }
-                                       ibuf->userflags |= IB_PERSISTENT;
                                }
                        }
                }
+
+               /* We only want movies and sequences to be memory limited. */
+               if (ibuf != NULL && !ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+                       ibuf->userflags |= IB_PERSISTENT;
+               }
        }
 
        BKE_image_tag_time(ima);
index 07ce3c39d73c4c9ccab175f0496e06963ce538c5..f699afd3475a6064149d18a2d2d32310a22ba86a 100644 (file)
@@ -200,6 +200,18 @@ static size_t IMB_get_size_in_memory(ImBuf *ibuf)
        int a;
        size_t size = 0, channel_size = 0;
 
+       /* Persistent images should have no affect on how "normal"
+        * images are cached.
+        *
+        * This is a bit arbitrary, but would make it so only movies
+        * and sequences are memory limited, keeping textures in the
+        * memory in order to avoid constant file reload on viewport
+        * update.
+        */
+       if (ibuf->userflags & IB_PERSISTENT) {
+               return 0;
+       }
+
        size += sizeof(ImBuf);
 
        if (ibuf->rect)