[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28390] branches/render25: Render Branch: Image Tile Cache

Brecht Van Lommel brecht at blender.org
Fri Apr 23 20:04:16 CEST 2010


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. @@




More information about the Bf-blender-cvs mailing list