diff options
Diffstat (limited to 'source/blender/imbuf/intern')
-rw-r--r-- | source/blender/imbuf/intern/IMB_allocimbuf.h | 3 | ||||
-rw-r--r-- | source/blender/imbuf/intern/allocimbuf.c | 23 | ||||
-rw-r--r-- | source/blender/imbuf/intern/module.c | 6 | ||||
-rw-r--r-- | source/blender/imbuf/intern/moviecache.c | 12 | ||||
-rw-r--r-- | source/blender/imbuf/intern/tiff.c | 2 | ||||
-rw-r--r-- | source/blender/imbuf/intern/util.c | 1 |
6 files changed, 46 insertions, 1 deletions
diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h index 02b738cc2cd..f4d6d869f1b 100644 --- a/source/blender/imbuf/intern/IMB_allocimbuf.h +++ b/source/blender/imbuf/intern/IMB_allocimbuf.h @@ -35,6 +35,9 @@ struct ImBuf; +void imb_refcounter_lock_init(void); +void imb_refcounter_lock_exit(void); + bool imb_addencodedbufferImBuf(struct ImBuf *ibuf); bool imb_enlargeencodedbufferImBuf(struct ImBuf *ibuf); diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c index d7ca381bae6..d0e81f2f383 100644 --- a/source/blender/imbuf/intern/allocimbuf.c +++ b/source/blender/imbuf/intern/allocimbuf.c @@ -49,6 +49,19 @@ #include "MEM_CacheLimiterC-Api.h" #include "BLI_utildefines.h" +#include "BLI_threads.h" + +static SpinLock refcounter_spin; + +void imb_refcounter_lock_init(void) +{ + BLI_spin_init(&refcounter_spin); +} + +void imb_refcounter_lock_exit(void) +{ + BLI_spin_end(&refcounter_spin); +} void imb_freemipmapImBuf(ImBuf *ibuf) { @@ -154,10 +167,18 @@ void IMB_freezbuffloatImBuf(ImBuf *ibuf) void IMB_freeImBuf(ImBuf *ibuf) { if (ibuf) { + bool needs_free = false; + + BLI_spin_lock(&refcounter_spin); if (ibuf->refcounter > 0) { ibuf->refcounter--; } else { + needs_free = true; + } + BLI_spin_unlock(&refcounter_spin); + + if (needs_free) { imb_freerectImBuf(ibuf); imb_freerectfloatImBuf(ibuf); imb_freetilesImBuf(ibuf); @@ -177,7 +198,9 @@ void IMB_freeImBuf(ImBuf *ibuf) void IMB_refImBuf(ImBuf *ibuf) { + BLI_spin_lock(&refcounter_spin); ibuf->refcounter++; + BLI_spin_unlock(&refcounter_spin); } ImBuf *IMB_makeSingleUser(ImBuf *ibuf) diff --git a/source/blender/imbuf/intern/module.c b/source/blender/imbuf/intern/module.c index 9141dad6f9c..4097deb00ed 100644 --- a/source/blender/imbuf/intern/module.c +++ b/source/blender/imbuf/intern/module.c @@ -26,12 +26,17 @@ #include <stddef.h> + +#include "BLI_utildefines.h" + +#include "IMB_allocimbuf.h" #include "IMB_imbuf.h" #include "IMB_filetype.h" #include "IMB_colormanagement_intern.h" void IMB_init(void) { + imb_refcounter_lock_init(); imb_filetypes_init(); imb_tile_cache_init(); colormanagement_init(); @@ -42,5 +47,6 @@ void IMB_exit(void) imb_tile_cache_exit(); imb_filetypes_exit(); colormanagement_exit(); + imb_refcounter_lock_exit(); } diff --git a/source/blender/imbuf/intern/moviecache.c b/source/blender/imbuf/intern/moviecache.c index 07ce3c39d73..f699afd3475 100644 --- a/source/blender/imbuf/intern/moviecache.c +++ b/source/blender/imbuf/intern/moviecache.c @@ -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) diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 05e9a4fa134..eb8f94cbc6e 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -859,7 +859,7 @@ int imb_savetiff(ImBuf *ibuf, const char *name, int flags) TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); if (TIFFWriteEncodedStrip(image, 0, (bitspersample == 16) ? (unsigned char *)pixels16 : pixels, - ibuf->x * ibuf->y * samplesperpixel * bitspersample / 8) == -1) + (size_t)ibuf->x * ibuf->y * samplesperpixel * bitspersample / 8) == -1) { fprintf(stderr, "imb_savetiff: Could not write encoded TIFF.\n"); diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index 7efd0223368..087f26dda44 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -179,6 +179,7 @@ const char *imb_ext_audio[] = { ".aif", ".aiff", ".m4a", + ".mka", NULL }; |