Revision: 28390
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28390
Author:   blendix
Date:     2010-04-23 20:04:16 +0200 (Fri, 23 Apr 2010)

Log Message:
-----------
Render Branch: Image Tile Cache

* Loading of tiles from .tx files, so that large images which
  are only partially in view consume less memory.
* Caching of tiles with a memory limit. This is currently disabled
  by default, the memory limit can be set in the user preferences.

More detailed notes here:
http://wiki.blender.org/index.php/Dev:2.5/Source/Imaging/ImageTileCache

This should basically be functional now for rendering durian, though
some things should be added still for ease of use:

* Auto-generating .tx files.
* Automatic memory limit, how can you find a reasonable value?
* Included non-tiled images in cache (or perhaps just autogen)?
* Image thumbnails don't use this system yet.

Modified Paths:
--------------
    branches/render25/release/scripts/ui/space_userpref.py
    branches/render25/source/blender/blenkernel/intern/image.c
    branches/render25/source/blender/blenkernel/intern/texture.c
    branches/render25/source/blender/blenlib/BLI_storage.h
    branches/render25/source/blender/blenlib/intern/storage.c
    branches/render25/source/blender/blenloader/intern/readfile.c
    branches/render25/source/blender/blenloader/intern/writefile.c
    branches/render25/source/blender/editors/interface/interface_draw.c
    branches/render25/source/blender/editors/interface/interface_icons.c
    branches/render25/source/blender/editors/space_file/filelist.c
    branches/render25/source/blender/imbuf/IMB_imbuf.h
    branches/render25/source/blender/imbuf/IMB_imbuf_types.h
    branches/render25/source/blender/imbuf/intern/IMB_filetype.h
    branches/render25/source/blender/imbuf/intern/IMB_filter.h
    branches/render25/source/blender/imbuf/intern/allocimbuf.c
    branches/render25/source/blender/imbuf/intern/anim.c
    branches/render25/source/blender/imbuf/intern/dynlibtiff.c
    branches/render25/source/blender/imbuf/intern/dynlibtiff.h
    branches/render25/source/blender/imbuf/intern/filetype.c
    branches/render25/source/blender/imbuf/intern/filter.c
    branches/render25/source/blender/imbuf/intern/module.c
    branches/render25/source/blender/imbuf/intern/readimage.c
    branches/render25/source/blender/imbuf/intern/tiff.c
    branches/render25/source/blender/makesdna/DNA_image_types.h
    branches/render25/source/blender/makesdna/DNA_userdef_types.h
    branches/render25/source/blender/makesrna/intern/rna_userdef.c
    branches/render25/source/blender/render/intern/include/envmap.h
    branches/render25/source/blender/render/intern/include/part.h
    branches/render25/source/blender/render/intern/include/texture.h
    branches/render25/source/blender/render/intern/source/pipeline.c
    branches/render25/source/blender/render/intern/source/texture.c
    branches/render25/source/blender/render/intern/source/texture_envmap.c
    branches/render25/source/blender/render/intern/source/texture_image.c
    branches/render25/source/blender/render/intern/source/texture_stack.c

Added Paths:
-----------
    branches/render25/source/blender/imbuf/intern/cache.c

Modified: branches/render25/release/scripts/ui/space_userpref.py
===================================================================
--- branches/render25/release/scripts/ui/space_userpref.py      2010-04-23 
18:03:06 UTC (rev 28389)
+++ branches/render25/release/scripts/ui/space_userpref.py      2010-04-23 
18:04:16 UTC (rev 28390)
@@ -432,6 +432,8 @@
         col.prop(system, "prefetch_frames")
         col.prop(system, "memory_cache_limit")
 
+        col.label(text="Image Tiles:")
+        col.prop(system, "image_tile_memory_limit", text="Memory Limit")
 
         # 3. Column
         column = split.column()

Modified: branches/render25/source/blender/blenkernel/intern/image.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/image.c  2010-04-23 
18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/blenkernel/intern/image.c  2010-04-23 
18:04:16 UTC (rev 28390)
@@ -1553,8 +1553,8 @@
                BLI_path_abs(name, G.sce);
        
        flag= IB_rect|IB_multilayer;
-       if(iuser && iuser->flag & IMA_USECACHE)
-               flag |= IB_usecache;
+       if(iuser && iuser->flag & IMA_TILECACHE)
+               flag |= IB_tilecache;
        if(ima->flag & IMA_DO_PREMUL)
                flag |= IB_premul;
 
@@ -1705,12 +1705,12 @@
        
        /* is there a PackedFile with this image ? */
        if (ima->packedfile) {
-               ibuf = IMB_ibImageFromMemory((int *) ima->packedfile->data, 
ima->packedfile->size, IB_rect|IB_multilayer);
+               ibuf = IMB_ibImageFromMemory((unsigned 
char*)ima->packedfile->data, ima->packedfile->size, IB_rect|IB_multilayer);
        } 
        else {
                flag= IB_rect|IB_multilayer|IB_metadata;
-               if(iuser && iuser->flag & IMA_USECACHE)
-                       flag |= IB_usecache;
+               if(iuser && iuser->flag & IMA_TILECACHE)
+                       flag |= IB_tilecache;
                if(ima->flag & IMA_DO_PREMUL)
                        flag |= IB_premul;
                        
@@ -2084,12 +2084,24 @@
 
                BLI_unlock_thread(LOCK_IMAGE);
        }
+       else {
+               /* fallback from tiles to rect if no tiles requested, we keep
+                  tiles in memory because they may be in use by render thread 
*/
+               if(ibuf->tiles && !(iuser && (iuser->flag & IMA_TILECACHE))) {
+                       BLI_lock_thread(LOCK_IMAGE);
+                       IMB_tiles_to_rect(ibuf);
+                       BLI_unlock_thread(LOCK_IMAGE);
+               }
+       }
 
-       /* XXX temp code until tiles are used for cache, forces
-          full image rect to be loaded into memory */
-       if((!iuser || !(iuser->flag & IMA_USECACHE)) && ibuf && (ibuf->flags & 
IB_usecache)) {
-               IMB_getmipmaplevel(ibuf, 0);
-               ibuf->flags &= ~IB_usecache;
+       /* create mipmap levels if requested */
+       if(ibuf) {
+               if(!ibuf->mipmap[0] && (iuser && (iuser->flag & IMA_MIPMAP))) {
+                       BLI_lock_thread(LOCK_IMAGE);
+                       if(ibuf->mipmap[0] == NULL)
+                               IMB_makemipmap(ibuf, iuser->flag & 
IMA_GAUSS_MIP);
+                       BLI_unlock_thread(LOCK_IMAGE);
+               }
        }
 
        /* we assuming that if it is not rendering, it's also not multithreaded

Modified: branches/render25/source/blender/blenkernel/intern/texture.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/texture.c        
2010-04-23 18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/blenkernel/intern/texture.c        
2010-04-23 18:04:16 UTC (rev 28390)
@@ -505,7 +505,7 @@
        tex->iuser.fie_ima= 2;
        tex->iuser.ok= 1;
        tex->iuser.frames= 100;
-       tex->iuser.flag |= IMA_USECACHE;
+       tex->iuser.flag |= IMA_TILECACHE;
        
        tex->preview = NULL;
 }

Modified: branches/render25/source/blender/blenlib/BLI_storage.h
===================================================================
--- branches/render25/source/blender/blenlib/BLI_storage.h      2010-04-23 
18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/blenlib/BLI_storage.h      2010-04-23 
18:04:16 UTC (rev 28390)
@@ -76,8 +76,8 @@
         */
 void BLI_free_file_lines(struct LinkNode *lines);
 
-       /* Compare which of two files was last modified */
-int            BLI_file_newer(const char *file1, const char *file2);
+       /* Compare if one was last modified before the other */
+int            BLI_file_older(const char *file1, const char *file2);
 
 #endif /* BLI_STORAGE_H */
 

Modified: branches/render25/source/blender/blenlib/intern/storage.c
===================================================================
--- branches/render25/source/blender/blenlib/intern/storage.c   2010-04-23 
18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/blenlib/intern/storage.c   2010-04-23 
18:04:16 UTC (rev 28390)
@@ -501,13 +501,13 @@
        BLI_linklist_free(lines, (void(*)(void*)) MEM_freeN);
 }
 
-int BLI_file_newer(const char *file1, const char *file2)
+int BLI_file_older(const char *file1, const char *file2)
 {
        struct stat st1, st2;
 
        if(stat(file1, &st1)) return 0;
        if(stat(file2, &st2)) return 0;
 
-       return (st1.st_mtime > st2.st_mtime);
+       return (st1.st_mtime < st2.st_mtime);
 }
 

Modified: branches/render25/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/render25/source/blender/blenloader/intern/readfile.c       
2010-04-23 18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/blenloader/intern/readfile.c       
2010-04-23 18:04:16 UTC (rev 28390)
@@ -6529,7 +6529,7 @@
        Tex *tex;
 
        for(tex= main->tex.first; tex; tex=tex->id.next)
-               tex->iuser.flag |= IMA_USECACHE;
+               tex->iuser.flag |= IMA_TILECACHE;
 }
 
 static void do_version_sss_scale_250(FileData *fd, Library *lib, Main *main)

Modified: branches/render25/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/render25/source/blender/blenloader/intern/writefile.c      
2010-04-23 18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/blenloader/intern/writefile.c      
2010-04-23 18:04:16 UTC (rev 28390)
@@ -1233,6 +1233,8 @@
 
                        writedata(wd, DATA, 
sizeof(float)*mmd->totvert*mmd->totcagevert,
                                mmd->bindweights);
+                       writestruct(wd, DATA, "MDefInfluence", 
mmd->totinfluence, mmd->bindinfluences);
+                       writedata(wd, DATA, sizeof(int)*(mmd->totvert+1), 
mmd->bindoffsets);
                        writedata(wd, DATA, sizeof(float)*3*mmd->totcagevert,
                                mmd->bindcagecos);
                        writestruct(wd, DATA, "MDefCell", size*size*size, 
mmd->dyngrid);

Modified: branches/render25/source/blender/editors/interface/interface_draw.c
===================================================================
--- branches/render25/source/blender/editors/interface/interface_draw.c 
2010-04-23 18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/editors/interface/interface_draw.c 
2010-04-23 18:04:16 UTC (rev 28390)
@@ -469,7 +469,7 @@
        //int w, h;
        
        /* hardcoded to splash, loading and freeing every draw, eek! */
-       ibuf= IMB_ibImageFromMemory((int *)datatoc_splash_png, 
datatoc_splash_png_size, IB_rect);
+       ibuf= IMB_ibImageFromMemory((unsigned char*)datatoc_splash_png, 
datatoc_splash_png_size, IB_rect);
 
        if (!ibuf) return;
        

Modified: branches/render25/source/blender/editors/interface/interface_icons.c
===================================================================
--- branches/render25/source/blender/editors/interface/interface_icons.c        
2010-04-23 18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/editors/interface/interface_icons.c        
2010-04-23 18:04:16 UTC (rev 28390)
@@ -480,7 +480,7 @@
                }
        }
        if(bbuf==NULL)
-               bbuf = IMB_ibImageFromMemory((int *)datatoc_blenderbuttons, 
datatoc_blenderbuttons_size, IB_rect);
+               bbuf = IMB_ibImageFromMemory((unsigned 
char*)datatoc_blenderbuttons, datatoc_blenderbuttons_size, IB_rect);
 
        if(bbuf) {
                /* free existing texture if any */

Modified: branches/render25/source/blender/editors/space_file/filelist.c
===================================================================
--- branches/render25/source/blender/editors/space_file/filelist.c      
2010-04-23 18:03:06 UTC (rev 28389)
+++ branches/render25/source/blender/editors/space_file/filelist.c      
2010-04-23 18:04:16 UTC (rev 28390)
@@ -375,7 +375,7 @@
        short x, y, k;
        ImBuf *bbuf;
        ImBuf *ibuf;
-       bbuf = IMB_ibImageFromMemory((int *)datatoc_prvicons, 
datatoc_prvicons_size, IB_rect);
+       bbuf = IMB_ibImageFromMemory((unsigned char*)datatoc_prvicons, 
datatoc_prvicons_size, IB_rect);
        if (bbuf) {
                for (y=0; y<SPECIAL_IMG_ROWS; y++) {
                        for (x=0; x<SPECIAL_IMG_COLS; x++) {

Modified: branches/render25/source/blender/imbuf/IMB_imbuf.h
===================================================================
--- branches/render25/source/blender/imbuf/IMB_imbuf.h  2010-04-23 18:03:06 UTC 
(rev 28389)
+++ branches/render25/source/blender/imbuf/IMB_imbuf.h  2010-04-23 18:04:16 UTC 
(rev 28390)
@@ -93,7 +93,7 @@
  *
  * @attention Defined in readimage.c
  */
-struct ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags);
+struct ImBuf *IMB_ibImageFromMemory(unsigned char *mem, int size, int flags);
 
 /**
  *
@@ -111,7 +111,7 @@
  *
  * @attention Defined in allocimbuf.c
  */
-void IMB_freeImBuf(struct ImBuf * ibuf);
+void IMB_freeImBuf(struct ImBuf *ibuf);
 
 /**
  *
@@ -130,18 +130,18 @@
  * @attention Defined in allocimbuf.c
  */
 
-void IMB_refImBuf(struct ImBuf * ibuf);
+void IMB_refImBuf(struct ImBuf *ibuf);
 
 /**
  *
  * @attention Defined in allocimbuf.c
  */
-void IMB_cache_limiter_insert(struct ImBuf * i);
-void IMB_cache_limiter_unmanage(struct ImBuf * i);
-void IMB_cache_limiter_touch(struct ImBuf * i);
-void IMB_cache_limiter_ref(struct ImBuf * i);
-void IMB_cache_limiter_unref(struct ImBuf * i);
-int IMB_cache_limiter_get_refcount(struct ImBuf * i);
+void IMB_cache_limiter_insert(struct ImBuf *i);
+void IMB_cache_limiter_unmanage(struct ImBuf *i);
+void IMB_cache_limiter_touch(struct ImBuf *i);
+void IMB_cache_limiter_ref(struct ImBuf *i);
+void IMB_cache_limiter_unref(struct ImBuf *i);
+int IMB_cache_limiter_get_refcount(struct ImBuf *i);
 
 void IMB_free_cache_limiter(void);
 
@@ -155,8 +155,8 @@
  *
  * @attention Defined in allocimbuf.c
  */
-short addzbufImBuf(struct ImBuf * ibuf);
-short addzbuffloatImBuf(struct ImBuf * ibuf);
+short addzbufImBuf(struct ImBuf *ibuf);
+short addzbuffloatImBuf(struct ImBuf *ibuf);
 
 /**
  *
@@ -199,8 +199,8 @@
  *
  * @attention Defined in anim.c
  */
-struct anim * IMB_open_anim(const char * name, int ib_flags);
-void IMB_close_anim(struct anim * anim);
+struct anim *IMB_open_anim(const char *name, int ib_flags);
+void IMB_close_anim(struct anim *anim);
 
 /**
  *
@@ -208,34 +208,34 @@
  */
 
 int ismovie(char *name);
-void IMB_anim_set_preseek(struct anim * anim, int preseek);
-int IMB_anim_get_preseek(struct anim * anim);
+void IMB_anim_set_preseek(struct anim *anim, int preseek);
+int IMB_anim_get_preseek(struct anim *anim);
 
 /**
  *

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to