diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2006-09-06 23:13:23 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2006-09-06 23:13:23 +0400 |
commit | e7d6537f1c5227005ccddc52987ea720ba66bc80 (patch) | |
tree | 5ac48fd44121194b879fc002d369281494a7598d /source | |
parent | d444f25b2864b7d4a9ae39211c695e36ffd813a8 (diff) |
Added support for threadsafe MEM_mallocN/MEM_freeN in the guardedalloc
module itself, replacing the special MEM_mallocT/MEM_freeT functions.
Mutex locking is only enabled when threads are running.
There was no good reason to have these separate, it just led to ugly
hacks when calling functions with non-threadsafe malloc from threads.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 18 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_composite.c | 94 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_threads.h | 10 | ||||
-rw-r--r-- | source/blender/blenlib/intern/threads.c | 56 | ||||
-rw-r--r-- | source/blender/blenpluginapi/intern/pluginapi.c | 9 | ||||
-rw-r--r-- | source/blender/include/BIF_glutil.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/envmap.c | 6 | ||||
-rw-r--r-- | source/blender/render/intern/source/imagetexture.c | 24 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 42 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 42 | ||||
-rw-r--r-- | source/blender/render/intern/source/zbuf.c | 44 | ||||
-rw-r--r-- | source/blender/src/glutil.c | 7 |
13 files changed, 139 insertions, 216 deletions
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index dba66f615f8..17cba6c2a94 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -53,8 +53,6 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" -/* NOTE: uses threadsafe malloc/calloc/free, for use in compositor */ - /* ********************************* color curve ********************* */ /* ***************** operations on full struct ************* */ @@ -295,7 +293,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) cuma->maxtable= clipr->xmax; /* hrmf... we now rely on blender ipo beziers, these are more advanced */ - bezt= MEM_callocT(cuma->totpoint*sizeof(BezTriple), "beztarr"); + bezt= MEM_callocN(cuma->totpoint*sizeof(BezTriple), "beztarr"); for(a=0; a<cuma->totpoint; a++) { cuma->mintable= MIN2(cuma->mintable, cmp[a].x); @@ -356,9 +354,9 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) } /* make the bezier curve */ if(cuma->table) - MEM_freeT(cuma->table); + MEM_freeN(cuma->table); totpoint= (cuma->totpoint-1)*CM_RESOL; - fp= allpoints= MEM_callocT(totpoint*2*sizeof(float), "table"); + fp= allpoints= MEM_callocN(totpoint*2*sizeof(float), "table"); for(a=0; a<cuma->totpoint-1; a++, fp += 2*CM_RESOL) { correct_bezpart(bezt[a].vec[1], bezt[a].vec[2], bezt[a+1].vec[0], bezt[a+1].vec[1]); @@ -366,7 +364,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) forward_diff_bezier(bezt[a].vec[1][1], bezt[a].vec[2][1], bezt[a+1].vec[0][1], bezt[a+1].vec[1][1], fp+1, CM_RESOL-1, 2); } - MEM_freeT(bezt); + MEM_freeN(bezt); range= CM_TABLEDIV*(cuma->maxtable - cuma->mintable); cuma->range= 1.0f/range; @@ -374,7 +372,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) /* now make a table with CM_TABLE equal x distances */ fp= allpoints; lastpoint= allpoints + 2*(totpoint-1); - cmp= MEM_callocT((CM_TABLE+1)*sizeof(CurveMapPoint), "dist table"); + cmp= MEM_callocN((CM_TABLE+1)*sizeof(CurveMapPoint), "dist table"); cmp[0].x= cuma->mintable; cmp[0].y= allpoints[1]; @@ -401,7 +399,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr) cmp[CM_TABLE].x= cuma->maxtable; cmp[CM_TABLE].y= allpoints[2*totpoint-1]; - MEM_freeT(allpoints); + MEM_freeN(allpoints); cuma->table= cmp; } @@ -414,7 +412,7 @@ void curvemapping_premultiply(CurveMapping *cumap, int restore) if(restore) { if(cumap->flag & CUMA_PREMULLED) { for(a=0; a<3; a++) { - MEM_freeT(cumap->cm[a].table); + MEM_freeN(cumap->cm[a].table); cumap->cm[a].table= cumap->cm[a].premultable; cumap->cm[a].premultable= NULL; } @@ -429,7 +427,7 @@ void curvemapping_premultiply(CurveMapping *cumap, int restore) if(cumap->cm[a].table==NULL) curvemap_make_table(cumap->cm+a, &cumap->clipr); cumap->cm[a].premultable= cumap->cm[a].table; - cumap->cm[a].table= MEM_mallocT((CM_TABLE+1)*sizeof(CurveMapPoint), "premul table"); + cumap->cm[a].table= MEM_mallocN((CM_TABLE+1)*sizeof(CurveMapPoint), "premul table"); memcpy(cumap->cm[a].table, cumap->cm[a].premultable, (CM_TABLE+1)*sizeof(CurveMapPoint)); } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 3f296d613d2..696e7050ad6 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -623,8 +623,6 @@ void image_de_interlace(Image *ima, int odd) de_interlace_ng(ima->ibuf); } -/* important note: all calls here and calls inside can NOT use threadsafe malloc! */ -/* this entire function is mutex'ed with the same lock as for mallocs */ void ima_ibuf_is_nul(Tex *tex, Image *ima) { void (*de_interlacefunc)(struct ImBuf *ibuf); diff --git a/source/blender/blenkernel/intern/node_composite.c b/source/blender/blenkernel/intern/node_composite.c index 3b4390a0025..7dc5eede9e1 100644 --- a/source/blender/blenkernel/intern/node_composite.c +++ b/source/blender/blenkernel/intern/node_composite.c @@ -31,6 +31,8 @@ #include <string.h> #include <math.h> +#include "MEM_guardedalloc.h" + #include "DNA_ID.h" #include "DNA_image_types.h" #include "DNA_node_types.h" @@ -52,7 +54,6 @@ #include "BLI_blenlib.h" #include "BLI_threads.h" -/* NOTE: no imbuf calls allowed in composit, we need threadsafe malloc! */ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" @@ -88,7 +89,7 @@ typedef struct CompBuf { static CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc) { - CompBuf *cbuf= MEM_callocT(sizeof(CompBuf), "compbuf"); + CompBuf *cbuf= MEM_callocN(sizeof(CompBuf), "compbuf"); cbuf->x= sizex; cbuf->y= sizey; @@ -98,13 +99,13 @@ static CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc) cbuf->type= type; if(alloc) { if(cbuf->type==CB_RGBA) - cbuf->rect= MEM_mapallocT(4*sizeof(float)*sizex*sizey, "compbuf RGBA rect"); + cbuf->rect= MEM_mapallocN(4*sizeof(float)*sizex*sizey, "compbuf RGBA rect"); else if(cbuf->type==CB_VEC3) - cbuf->rect= MEM_mapallocT(3*sizeof(float)*sizex*sizey, "compbuf Vector3 rect"); + cbuf->rect= MEM_mapallocN(3*sizeof(float)*sizex*sizey, "compbuf Vector3 rect"); else if(cbuf->type==CB_VEC2) - cbuf->rect= MEM_mapallocT(2*sizeof(float)*sizex*sizey, "compbuf Vector2 rect"); + cbuf->rect= MEM_mapallocN(2*sizeof(float)*sizex*sizey, "compbuf Vector2 rect"); else - cbuf->rect= MEM_mapallocT(sizeof(float)*sizex*sizey, "compbuf Fac rect"); + cbuf->rect= MEM_mapallocN(sizeof(float)*sizex*sizey, "compbuf Fac rect"); cbuf->malloc= 1; } cbuf->disprect.xmin= 0; @@ -140,9 +141,9 @@ static CompBuf *pass_on_compbuf(CompBuf *cbuf) void free_compbuf(CompBuf *cbuf) { if(cbuf->malloc && cbuf->rect) - MEM_freeT(cbuf->rect); + MEM_freeN(cbuf->rect); - MEM_freeT(cbuf); + MEM_freeN(cbuf); } void print_compbuf(char *str, CompBuf *cbuf) @@ -531,31 +532,27 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, recty= tbuf->y; } - /* full copy of imbuf, but threadsafe... */ - if(ima->ibuf==NULL) { - ima->ibuf = MEM_callocT(sizeof(struct ImBuf), "ImBuf_struct"); - ima->ibuf->depth= 32; - ima->ibuf->ftype= TGA; - } + if(ima->ibuf==NULL) + ima->ibuf= IMB_allocImBuf(rectx, recty, 32, 0, 0); /* cleanup of composit image */ if(ima->ibuf->rect) { - MEM_freeT(ima->ibuf->rect); + MEM_freeN(ima->ibuf->rect); ima->ibuf->rect= NULL; ima->ibuf->mall &= ~IB_rect; } if(ima->ibuf->zbuf_float) { - MEM_freeT(ima->ibuf->zbuf_float); + MEM_freeN(ima->ibuf->zbuf_float); ima->ibuf->zbuf_float= NULL; ima->ibuf->mall &= ~IB_zbuffloat; } if(ima->ibuf->rect_float) - MEM_freeT(ima->ibuf->rect_float); + MEM_freeN(ima->ibuf->rect_float); ima->ibuf->x= rectx; ima->ibuf->y= recty; ima->ibuf->mall |= IB_rectfloat; - ima->ibuf->rect_float= MEM_mallocT(4*rectx*recty*sizeof(float), "viewer rect"); + ima->ibuf->rect_float= MEM_mallocN(4*rectx*recty*sizeof(float), "viewer rect"); /* now we combine the input with ibuf */ cbuf= alloc_compbuf(rectx, recty, CB_RGBA, 0); // no alloc @@ -632,7 +629,7 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i CompBuf *outbuf, *zbuf=NULL; if(rr->rectf) - MEM_freeT(rr->rectf); + MEM_freeN(rr->rectf); outbuf= alloc_compbuf(rr->rectx, rr->recty, CB_RGBA, 1); if(in[1]->data==NULL) @@ -642,7 +639,7 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i if(in[2]->data) { if(rr->rectz) - MEM_freeT(rr->rectz); + MEM_freeN(rr->rectz); zbuf= alloc_compbuf(rr->rectx, rr->recty, CB_VAL, 1); composit1_pixel_processor(node, zbuf, in[2]->data, in[2]->vec, do_copy_value, CB_VAL); rr->rectz= zbuf->rect; @@ -787,10 +784,8 @@ static void animated_image(bNode *node, int cfra) if(imanr < 0) imanr = 0; if(imanr > (dur-1)) imanr= dur-1; - BLI_lock_thread(LOCK_MALLOC); if(ima->ibuf) IMB_freeImBuf(ima->ibuf); ima->ibuf = IMB_anim_absolute(ima->anim, imanr); - BLI_unlock_thread(LOCK_MALLOC); /* patch for textbutton with name ima (B_NAMEIMA) */ if(ima->ibuf) { @@ -826,26 +821,6 @@ static void animated_image(bNode *node, int cfra) } } -static float *float_from_byte_rect(int rectx, int recty, char *rect) -{ - /* quick method to convert byte to floatbuf */ - float *rect_float= MEM_mallocT(4*sizeof(float)*rectx*recty, "float rect"); - float *tof = rect_float; - int i; - - for (i = rectx*recty; i > 0; i--) { - tof[0] = ((float)rect[0])*(1.0f/255.0f); - tof[1] = ((float)rect[1])*(1.0f/255.0f); - tof[2] = ((float)rect[2])*(1.0f/255.0f); - tof[3] = ((float)rect[3])*(1.0f/255.0f); - rect += 4; - tof += 4; - } - return rect_float; -} - - - static CompBuf *node_composit_get_image(bNode *node, RenderData *rd) { Image *ima; @@ -861,19 +836,14 @@ static CompBuf *node_composit_get_image(bNode *node, RenderData *rd) if(ima->ok==0) return NULL; if(ima->ibuf==NULL) { - BLI_lock_thread(LOCK_MALLOC); load_image(ima, IB_rect, G.sce, rd->cfra); /* G.sce is current .blend path */ - BLI_unlock_thread(LOCK_MALLOC); if(ima->ibuf==NULL) { ima->ok= 0; return NULL; } } - if(ima->ibuf->rect_float==NULL) { - /* can't use imbuf module, we need secure malloc */ - ima->ibuf->rect_float= float_from_byte_rect(ima->ibuf->x, ima->ibuf->y, (char *)ima->ibuf->rect); - ima->ibuf->mall |= IB_rectfloat; - } + if(ima->ibuf->rect_float==NULL) + IMB_float_from_rect(ima->ibuf); if(rd->scemode & R_COMP_CROP) { stackbuf= get_cropped_compbuf(&rd->disprect, ima->ibuf->rect_float, ima->ibuf->x, ima->ibuf->y, CB_RGBA); @@ -2309,7 +2279,7 @@ static float *make_gausstab(int filtertype, int rad) n = 2 * rad + 1; - gausstab = (float *) MEM_mallocT(n * sizeof(float), "gauss"); + gausstab = (float *) MEM_mallocN(n * sizeof(float), "gauss"); sum = 0.0f; for (i = -rad; i <= rad; i++) { @@ -2332,7 +2302,7 @@ static float *make_bloomtab(int rad) n = 2 * rad + 1; - bloomtab = (float *) MEM_mallocT(n * sizeof(float), "bloom"); + bloomtab = (float *) MEM_mallocN(n * sizeof(float), "bloom"); for (i = -rad; i <= rad; i++) { val = pow(1.0 - fabs((float)i)/((float)rad), 4.0); @@ -2400,7 +2370,7 @@ static void blur_single_image(CompBuf *new, CompBuf *img, float scale, NodeBlurD } /* vertical */ - MEM_freeT(gausstab); + MEM_freeN(gausstab); rad = scale*(float)nbd->sizey; if(rad>imgy/2) @@ -2447,7 +2417,7 @@ static void blur_single_image(CompBuf *new, CompBuf *img, float scale, NodeBlurD } free_compbuf(work); - MEM_freeT(gausstab); + MEM_freeN(gausstab); } /* reference has to be mapped 0-1, and equal in size */ @@ -2481,7 +2451,7 @@ static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *ref, float rady= 1; x= MAX2(radx, rady); - maintabs= MEM_mallocT(x*sizeof(void *), "gauss array"); + maintabs= MEM_mallocN(x*sizeof(void *), "gauss array"); for(i= 0; i<x; i++) maintabs[i]= make_bloomtab(i+1); @@ -2563,8 +2533,8 @@ static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *ref, float x= MAX2(radx, rady); for(i= 0; i<x; i++) - MEM_freeT(maintabs[i]); - MEM_freeT(maintabs); + MEM_freeN(maintabs[i]); + MEM_freeN(maintabs); } @@ -2641,7 +2611,7 @@ static void bokeh_single_image(CompBuf *new, CompBuf *img, float fac, NodeBlurDa n = (2*radx+1)*(2*rady+1); /* create a full filter image */ - gausstab= MEM_mallocT(sizeof(float)*n, "filter tab"); + gausstab= MEM_mallocN(sizeof(float)*n, "filter tab"); dgauss= gausstab; val= 0.0f; for(j=-rady; j<=rady; j++) { @@ -2701,7 +2671,7 @@ static void bokeh_single_image(CompBuf *new, CompBuf *img, float fac, NodeBlurDa } } - MEM_freeT(gausstab); + MEM_freeN(gausstab); } @@ -2751,7 +2721,7 @@ static void blur_with_reference(CompBuf *new, CompBuf *img, CompBuf *ref, NodeBl rady= 1; x= MAX2(radx, rady); - maintabs= MEM_mallocT(x*sizeof(void *), "gauss array"); + maintabs= MEM_mallocN(x*sizeof(void *), "gauss array"); for(i= 0; i<x; i++) maintabs[i]= make_gausstab(nbd->filtertype, i+1); @@ -2821,8 +2791,8 @@ static void blur_with_reference(CompBuf *new, CompBuf *img, CompBuf *ref, NodeBl x= MAX2(radx, rady); for(i= 0; i<x; i++) - MEM_freeT(maintabs[i]); - MEM_freeT(maintabs); + MEM_freeN(maintabs[i]); + MEM_freeN(maintabs); if(ref_use!=ref) free_compbuf(ref_use); @@ -3179,7 +3149,7 @@ static void bilinear_interpolation_rotate(CompBuf *in, float *out, float u, floa static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - if(out[0]->hasoutput==NULL) + if(out[0]->hasoutput==0) return; if(in[0]->data) { diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h index 43792ccb1bc..af2565e3ae5 100644 --- a/source/blender/blenlib/BLI_threads.h +++ b/source/blender/blenlib/BLI_threads.h @@ -31,11 +31,9 @@ #ifndef BLI_THREADS_H #define BLI_THREADS_H -/* default lock is to protect MEM_ module calls, one custom lock available now. van be extended */ -#define LOCK_MALLOC 0 +/* one custom lock available now. can be extended */ #define LOCK_CUSTOM1 1 - void BLI_init_threads (ListBase *threadbase, void *(*do_thread)(void *), int tot); int BLI_available_threads(ListBase *threadbase); int BLI_available_thread_index(ListBase *threadbase); @@ -46,11 +44,5 @@ void BLI_end_threads (ListBase *threadbase); void BLI_lock_thread (int type); void BLI_unlock_thread (int type); - /* threadsafe version of MEM_malloc and friends */ -void *MEM_mallocT(int len, char *name); -void *MEM_callocT(int len, char *name); -void *MEM_mapallocT(int len, char *name); -void MEM_freeT(void *poin); - #endif diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index f94d959d46a..d9cf2ec0e57 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -97,6 +97,16 @@ typedef struct ThreadSlot { int avail; } ThreadSlot; +static void BLI_lock_malloc_thread() +{ + pthread_mutex_lock(&_malloc_lock); +} + +static void BLI_unlock_malloc_thread() +{ + pthread_mutex_unlock(&_malloc_lock); +} + void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot) { int a; @@ -114,6 +124,8 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot) tslot->do_thread= do_thread; tslot->avail= 1; } + + MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread); } /* amount of available threads */ @@ -182,57 +194,19 @@ void BLI_end_threads(ListBase *threadbase) } BLI_freelistN(threadbase); + MEM_set_lock_callback(NULL, NULL); } void BLI_lock_thread(int type) { - if(type==LOCK_MALLOC) - pthread_mutex_lock(&_malloc_lock); - else + if (type==LOCK_CUSTOM1) pthread_mutex_lock(&_custom1_lock); } void BLI_unlock_thread(int type) { - if(type==LOCK_MALLOC) - pthread_mutex_unlock(&_malloc_lock); - else + if(type==LOCK_CUSTOM1) pthread_mutex_unlock(&_custom1_lock); } - -/* ***************** Thread safe MEM_malloc/calloc/free ************************** */ - -void *MEM_mallocT(int len, char *name) -{ - void *mem; - pthread_mutex_lock(&_malloc_lock); - mem= MEM_mallocN(len, name); - pthread_mutex_unlock(&_malloc_lock); - return mem; -} -void *MEM_callocT(int len, char *name) -{ - void *mem; - pthread_mutex_lock(&_malloc_lock); - mem= MEM_callocN(len, name); - pthread_mutex_unlock(&_malloc_lock); - return mem; -} -void *MEM_mapallocT(int len, char *name) -{ - void *mem; - pthread_mutex_lock(&_malloc_lock); - mem= MEM_mapallocN(len, name); - pthread_mutex_unlock(&_malloc_lock); - return mem; -} -void MEM_freeT(void *poin) -{ - pthread_mutex_lock(&_malloc_lock); - MEM_freeN(poin); - pthread_mutex_unlock(&_malloc_lock); -} - - /* eof */ diff --git a/source/blender/blenpluginapi/intern/pluginapi.c b/source/blender/blenpluginapi/intern/pluginapi.c index 872c8c55141..43c4727cea1 100644 --- a/source/blender/blenpluginapi/intern/pluginapi.c +++ b/source/blender/blenpluginapi/intern/pluginapi.c @@ -76,20 +76,21 @@ LIBEXPORT short freeN(void *vmemh) return MEM_freeN(vmemh); } - +/* these are not needed anymore, mallocN/callocN/freeN is now threadsafe */ LIBEXPORT void *mallocT(int len, char *str) { - return MEM_mallocT(len, str); + return MEM_mallocN(len, str); } LIBEXPORT void *callocT(int len, char *str) { - return MEM_callocT(len, str); + return MEM_callocN(len, str); } LIBEXPORT void freeT(void *vmemh) { - return MEM_freeT(vmemh); + MEM_freeN(vmemh); + return; } diff --git a/source/blender/include/BIF_glutil.h b/source/blender/include/BIF_glutil.h index db2b55aab86..60ac6a3b041 100644 --- a/source/blender/include/BIF_glutil.h +++ b/source/blender/include/BIF_glutil.h @@ -141,7 +141,6 @@ void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, int row_w, int */ /* only for float rects, converts to 32 bits and draws */ - /* uses threadsafe malloc */ void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf); diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index d313bc3c360..6e9088b364a 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -33,7 +33,6 @@ #include "BLI_arithb.h" #include "BLI_blenlib.h" -#include "BLI_threads.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" /* for rectcpy */ @@ -646,10 +645,9 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe if(env->ima && env->ima->ok) { if(env->ima->ibuf==NULL) { printf("load ibuf\n"); - BLI_lock_thread(LOCK_MALLOC); ima_ibuf_is_nul(tex, tex->ima); - if(env->ima->ok && env->ok==0) envmap_split_ima(env); - BLI_unlock_thread(LOCK_MALLOC); + if(env->ima->ok && env->ok==0) + envmap_split_ima(env); } } } diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 94e917c1917..db0c388735d 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -48,7 +48,6 @@ #include "DNA_texture_types.h" #include "BLI_blenlib.h" -#include "BLI_threads.h" #include "BKE_utildefines.h" #include "BKE_global.h" @@ -105,9 +104,8 @@ int imagewrap(Tex *tex, Image *ima, float *texvec, TexResult *texres) /* hack for icon render */ if(R.r.scemode &R_NO_IMAGE_LOAD) return 0; - BLI_lock_thread(LOCK_MALLOC); - if(ima->ibuf==NULL) ima_ibuf_is_nul(tex, ima); - BLI_unlock_thread(LOCK_MALLOC); + if(ima->ibuf==NULL) + ima_ibuf_is_nul(tex, ima); } if (ima->ok) { @@ -628,21 +626,15 @@ int imagewraposa(Tex *tex, Image *ima, float *texvec, float *dxt, float *dyt, Te return retval; } - if(ima->ibuf==NULL) { - BLI_lock_thread(LOCK_MALLOC); - if(ima->ibuf==NULL) ima_ibuf_is_nul(tex, ima); - BLI_unlock_thread(LOCK_MALLOC); - } + if(ima->ibuf==NULL) + ima_ibuf_is_nul(tex, ima); if (ima->ok) { - if(tex->imaflag & TEX_MIPMAP) { - if(ima->mipmap[0]==NULL) { - BLI_lock_thread(LOCK_MALLOC); - if(ima->mipmap[0]==NULL) makemipmap(tex, ima); - BLI_unlock_thread(LOCK_MALLOC); - } - } + if(tex->imaflag & TEX_MIPMAP) + if(ima->mipmap[0]==NULL) + if(ima->mipmap[0]==NULL) + makemipmap(tex, ima); ibuf = ima->ibuf; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 1ac8b56dd94..f6c51753204 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -163,28 +163,28 @@ static void free_render_result(RenderResult *res) while(res->layers.first) { RenderLayer *rl= res->layers.first; - if(rl->rectf) MEM_freeT(rl->rectf); + if(rl->rectf) MEM_freeN(rl->rectf); /* acolrect is optionally allocated in shade_tile, only free here since it can be used for drawing */ - if(rl->acolrect) MEM_freeT(rl->acolrect); + if(rl->acolrect) MEM_freeN(rl->acolrect); while(rl->passes.first) { RenderPass *rpass= rl->passes.first; - if(rpass->rect) MEM_freeT(rpass->rect); + if(rpass->rect) MEM_freeN(rpass->rect); BLI_remlink(&rl->passes, rpass); - MEM_freeT(rpass); + MEM_freeN(rpass); } BLI_remlink(&res->layers, rl); - MEM_freeT(rl); + MEM_freeN(rl); } if(res->rect32) - MEM_freeT(res->rect32); + MEM_freeN(res->rect32); if(res->rectz) - MEM_freeT(res->rectz); + MEM_freeN(res->rectz); if(res->rectf) - MEM_freeT(res->rectf); + MEM_freeN(res->rectf); - MEM_freeT(res); + MEM_freeN(res); } /* all layers except the active one get temporally pushed away */ @@ -309,7 +309,7 @@ static void render_unique_exr_name(Render *re, char *str) static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, int passtype) { char *typestr= get_pass_name(passtype, 0); - RenderPass *rpass= MEM_callocT(sizeof(RenderPass), typestr); + RenderPass *rpass= MEM_callocN(sizeof(RenderPass), typestr); int rectsize= rr->rectx*rr->recty*channels; BLI_addtail(&rl->passes, rpass); @@ -327,12 +327,12 @@ static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channel int x; /* initialize to max speed */ - rect= rpass->rect= MEM_mapallocT(sizeof(float)*rectsize, typestr); + rect= rpass->rect= MEM_mapallocN(sizeof(float)*rectsize, typestr); for(x= rectsize-1; x>=0; x--) rect[x]= PASS_VECTOR_MAX; } else - rpass->rect= MEM_mapallocT(sizeof(float)*rectsize, typestr); + rpass->rect= MEM_mapallocN(sizeof(float)*rectsize, typestr); } } @@ -376,7 +376,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int if(rectx<=0 || recty<=0) return NULL; - rr= MEM_callocT(sizeof(RenderResult), "new render result"); + rr= MEM_callocN(sizeof(RenderResult), "new render result"); rr->rectx= rectx; rr->recty= recty; rr->renrect.xmin= 0; rr->renrect.xmax= rectx-2*crop; @@ -399,7 +399,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int if((re->r.scemode & R_SINGLE_LAYER) && nr!=re->r.actlay) continue; - rl= MEM_callocT(sizeof(RenderLayer), "new render layer"); + rl= MEM_callocN(sizeof(RenderLayer), "new render layer"); BLI_addtail(&rr->layers, rl); strcpy(rl->name, srl->name); @@ -414,7 +414,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A"); } else - rl->rectf= MEM_mapallocT(rectx*recty*sizeof(float)*4, "Combined rgba"); + rl->rectf= MEM_mapallocN(rectx*recty*sizeof(float)*4, "Combined rgba"); if(srl->passflag & SCE_PASS_Z) render_layer_add_pass(rr, rl, 1, SCE_PASS_Z); @@ -438,10 +438,10 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int } /* previewrender and envmap don't do layers, so we make a default one */ if(rr->layers.first==NULL) { - rl= MEM_callocT(sizeof(RenderLayer), "new render layer"); + rl= MEM_callocN(sizeof(RenderLayer), "new render layer"); BLI_addtail(&rr->layers, rl); - rl->rectf= MEM_mapallocT(rectx*recty*sizeof(float)*4, "prev/env float rgba"); + rl->rectf= MEM_mapallocN(rectx*recty*sizeof(float)*4, "prev/env float rgba"); /* note, this has to be in sync with scene.c */ rl->lay= (1<<20) -1; @@ -716,7 +716,7 @@ Render *RE_NewRender(const char *name) if(re==NULL) { /* new render data struct */ - re= MEM_callocT(sizeof(Render), "new render"); + re= MEM_callocN(sizeof(Render), "new render"); BLI_addtail(&RenderList, re); strncpy(re->name, name, RE_MAXNAME); } @@ -751,7 +751,7 @@ void RE_FreeRender(Render *re) free_render_result(re->pushedresult); BLI_remlink(&RenderList, re); - MEM_freeT(re); + MEM_freeN(re); } /* exit blender */ @@ -1921,13 +1921,13 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh) int dofree = 0; /* note; the way it gets 32 bits rects is weak... */ if(rres.rect32==NULL) { - rres.rect32= MEM_mapallocT(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect"); + rres.rect32= MEM_mapallocN(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect"); dofree = 1; } RE_ResultGet32(re, rres.rect32); mh->append_movie(scene->r.cfra, rres.rect32, rres.rectx, rres.recty); if(dofree) { - MEM_freeT(rres.rect32); + MEM_freeN(rres.rect32); } printf("Append frame %d", scene->r.cfra); } else { diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 2eb9ce8c43d..4ab9e8b2347 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -33,6 +33,8 @@ #include <stdlib.h> /* External modules: */ +#include "MEM_guardedalloc.h" + #include "MTC_matrixops.h" #include "BLI_arithb.h" @@ -3088,10 +3090,10 @@ static PixStrMain *addpsmain(ListBase *lb) { PixStrMain *psm; - psm= (PixStrMain *)MEM_mallocT(sizeof(PixStrMain),"pixstrMain"); + psm= (PixStrMain *)MEM_mallocN(sizeof(PixStrMain),"pixstrMain"); BLI_addtail(lb, psm); - psm->ps= (PixStr *)MEM_mallocT(4096*sizeof(PixStr),"pixstr"); + psm->ps= (PixStr *)MEM_mallocN(4096*sizeof(PixStr),"pixstr"); psm->counter= 0; return psm; @@ -3104,8 +3106,8 @@ static void freeps(ListBase *lb) for(psm= lb->first; psm; psm= psmnext) { psmnext= psm->next; if(psm->ps) - MEM_freeT(psm->ps); - MEM_freeT(psm); + MEM_freeN(psm->ps); + MEM_freeN(psm); } lb->first= lb->last= NULL; } @@ -3189,15 +3191,15 @@ void zbufshadeDA_tile(RenderPart *pa) /* allocate the necessary buffers */ /* zbuffer inits these rects */ - pa->rectp= MEM_mallocT(sizeof(int)*pa->rectx*pa->recty, "rectp"); - pa->rectz= MEM_mallocT(sizeof(int)*pa->rectx*pa->recty, "rectz"); + pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp"); + pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz"); for(rl= rr->layers.first; rl; rl= rl->next) { /* initialize pixelstructs and edge buffer */ addpsmain(&psmlist); - pa->rectdaps= MEM_callocT(sizeof(long)*pa->rectx*pa->recty+4, "zbufDArectd"); - if(R.r.mode & R_EDGE) edgerect= MEM_callocT(sizeof(float)*pa->rectx*pa->recty, "rectedge"); + pa->rectdaps= MEM_callocN(sizeof(long)*pa->rectx*pa->recty+4, "zbufDArectd"); + if(R.r.mode & R_EDGE) edgerect= MEM_callocN(sizeof(float)*pa->rectx*pa->recty, "rectedge"); /* always fill visibility */ for(pa->sample=0; pa->sample<R.osa; pa->sample++) { @@ -3235,7 +3237,7 @@ void zbufshadeDA_tile(RenderPart *pa) int x; /* allocate, but not free here, for asynchronous display of this rect in main thread */ - rl->acolrect= MEM_callocT(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer"); + rl->acolrect= MEM_callocN(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer"); if(rl->passflag & SCE_PASS_VECTOR) if(rl->layflag & SCE_LAY_SOLID) @@ -3266,16 +3268,16 @@ void zbufshadeDA_tile(RenderPart *pa) convert_to_key_alpha(pa, rl->rectf); /* free stuff within loop! */ - MEM_freeT(pa->rectdaps); pa->rectdaps= NULL; + MEM_freeN(pa->rectdaps); pa->rectdaps= NULL; freeps(&psmlist); - if(edgerect) MEM_freeT(edgerect); + if(edgerect) MEM_freeN(edgerect); edgerect= NULL; } /* free all */ - MEM_freeT(pa->rectp); pa->rectp= NULL; - MEM_freeT(pa->rectz); pa->rectz= NULL; + MEM_freeN(pa->rectp); pa->rectp= NULL; + MEM_freeN(pa->rectz); pa->rectz= NULL; /* display active layer */ rr->renrect.ymin=rr->renrect.ymax= 0; @@ -3297,14 +3299,14 @@ void zbufshade_tile(RenderPart *pa) set_part_zbuf_clipflag(pa); /* zbuffer code clears/inits rects */ - pa->rectp= MEM_mallocT(sizeof(int)*pa->rectx*pa->recty, "rectp"); - pa->rectz= MEM_mallocT(sizeof(int)*pa->rectx*pa->recty, "rectz"); + pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp"); + pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz"); shpi.thread= pa->thread; for(rl= rr->layers.first; rl; rl= rl->next) { - if(R.r.mode & R_EDGE) edgerect= MEM_callocT(sizeof(float)*pa->rectx*pa->recty, "rectedge"); + if(R.r.mode & R_EDGE) edgerect= MEM_callocN(sizeof(float)*pa->rectx*pa->recty, "rectedge"); /* fill shadepixel info struct */ shpi.lay= rl->lay; @@ -3369,7 +3371,7 @@ void zbufshade_tile(RenderPart *pa) int x; /* allocate, but not free here, for asynchronous display of this rect in main thread */ - rl->acolrect= MEM_callocT(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer"); + rl->acolrect= MEM_callocN(4*sizeof(float)*pa->rectx*pa->recty, "alpha layer"); if(addpassflag & SCE_PASS_VECTOR) if(rl->layflag & SCE_LAY_SOLID) @@ -3400,7 +3402,7 @@ void zbufshade_tile(RenderPart *pa) if(R.r.alphamode & R_ALPHAKEY) convert_to_key_alpha(pa, rl->rectf); - if(edgerect) MEM_freeT(edgerect); + if(edgerect) MEM_freeN(edgerect); edgerect= NULL; } @@ -3408,8 +3410,8 @@ void zbufshade_tile(RenderPart *pa) rr->renrect.ymin=rr->renrect.ymax= 0; rr->renlay= render_get_active_layer(&R, rr); - MEM_freeT(pa->rectp); pa->rectp= NULL; - MEM_freeT(pa->rectz); pa->rectz= NULL; + MEM_freeN(pa->rectp); pa->rectp= NULL; + MEM_freeN(pa->rectz); pa->rectz= NULL; } /* ------------------------------------------------------------------------ */ diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 50a3ad88502..d684bff629e 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -85,15 +85,15 @@ void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty) zspan->rectx= rectx; zspan->recty= recty; - zspan->span1= MEM_mallocT(recty*sizeof(float), "zspan"); - zspan->span2= MEM_mallocT(recty*sizeof(float), "zspan"); + zspan->span1= MEM_mallocN(recty*sizeof(float), "zspan"); + zspan->span2= MEM_mallocN(recty*sizeof(float), "zspan"); } static void zbuf_free_span(ZSpan *zspan) { if(zspan) { - if(zspan->span1) MEM_freeT(zspan->span1); - if(zspan->span2) MEM_freeT(zspan->span2); + if(zspan->span1) MEM_freeN(zspan->span1); + if(zspan->span2) MEM_freeN(zspan->span2); zspan->span1= zspan->span2= NULL; } } @@ -259,9 +259,9 @@ static APixstr *addpsmainA(ListBase *lb) { APixstrMain *psm; - psm= MEM_mallocT(sizeof(APixstrMain), "addpsmainA"); + psm= MEM_mallocN(sizeof(APixstrMain), "addpsmainA"); BLI_addtail(lb, psm); - psm->ps= MEM_callocT(4096*sizeof(APixstr),"pixstr"); + psm->ps= MEM_callocN(4096*sizeof(APixstr),"pixstr"); return psm->ps; } @@ -273,8 +273,8 @@ static void freepsA(ListBase *lb) for(psm= lb->first; psm; psm= psmnext) { psmnext= psm->next; if(psm->ps) - MEM_freeT(psm->ps); - MEM_freeT(psm); + MEM_freeN(psm->ps); + MEM_freeN(psm); } } @@ -2099,11 +2099,11 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float * zspan.zofsy= 0.0f; /* the buffers */ - rectz= MEM_mapallocT(sizeof(float)*xsize*ysize, "zbuf accum"); + rectz= MEM_mapallocN(sizeof(float)*xsize*ysize, "zbuf accum"); zspan.rectz= (int *)rectz; - rectmove= MEM_mapallocT(xsize*ysize, "rectmove"); - rectdraw= MEM_mapallocT(sizeof(DrawBufPixel)*xsize*ysize, "rect draw"); + rectmove= MEM_mapallocN(xsize*ysize, "rectmove"); + rectdraw= MEM_mapallocN(sizeof(DrawBufPixel)*xsize*ysize, "rect draw"); zspan.rectp= (int *)rectdraw; /* debug... check if PASS_VECTOR_MAX still is in buffers */ @@ -2121,7 +2121,7 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float * float minspeed= (float)nbd->minspeed; float minspeedsq= minspeed*minspeed; - minvecbufrect= MEM_mapallocT(4*sizeof(float)*xsize*ysize, "minspeed buf"); + minvecbufrect= MEM_mapallocN(4*sizeof(float)*xsize*ysize, "minspeed buf"); dvec1= vecbufrect; dvec2= minvecbufrect; @@ -2147,7 +2147,7 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float * } /* make vertex buffer with averaged speed and zvalues */ - rectvz= MEM_mapallocT(5*sizeof(float)*(xsize+1)*(ysize+1), "vertices"); + rectvz= MEM_mapallocN(5*sizeof(float)*(xsize+1)*(ysize+1), "vertices"); dvz= rectvz; for(y=0; y<=ysize; y++) { @@ -2343,11 +2343,11 @@ void RE_zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float * } } - MEM_freeT(rectz); - MEM_freeT(rectmove); - MEM_freeT(rectdraw); - MEM_freeT(rectvz); - if(minvecbufrect) MEM_freeT(vecbufrect); /* rects were swapped! */ + MEM_freeN(rectz); + MEM_freeN(rectmove); + MEM_freeN(rectdraw); + MEM_freeN(rectvz); + if(minvecbufrect) MEM_freeN(vecbufrect); /* rects were swapped! */ zbuf_free_span(&zspan); } @@ -2415,7 +2415,7 @@ static void zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, u zspan.zmuly= ((float)R.winy)/2.0; /* the buffers */ - zspan.arectz= MEM_mallocT(sizeof(int)*pa->rectx*pa->recty, "Arectz"); + zspan.arectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "Arectz"); zspan.apixbuf= APixbuf; zspan.apsmbase= apsmbase; @@ -2508,7 +2508,7 @@ static void zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, u if(R.test_break()) break; } - MEM_freeT(zspan.arectz); + MEM_freeN(zspan.arectz); zbuf_free_span(&zspan); } @@ -2694,7 +2694,7 @@ void zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pass) if(R.test_break()) return; - APixbuf= MEM_callocT(pa->rectx*pa->recty*sizeof(APixstr), "APixbuf"); + APixbuf= MEM_callocN(pa->rectx*pa->recty*sizeof(APixstr), "APixbuf"); if(R.osa>16) { printf("abufsetrow: osa too large\n"); @@ -2861,7 +2861,7 @@ void zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pass) /* disable scanline updating */ rr->renlay= NULL; - MEM_freeT(APixbuf); + MEM_freeN(APixbuf); freepsA(&apsmbase); } diff --git a/source/blender/src/glutil.c b/source/blender/src/glutil.c index dced81579c3..87d20c66ef9 100644 --- a/source/blender/src/glutil.c +++ b/source/blender/src/glutil.c @@ -297,8 +297,7 @@ void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, /* copy imgw-imgh to a temporal 32 bits rect */ if(img_w<1 || img_h<1) return; - /* happens during threaded render... */ - rc= rect32= MEM_mallocT(img_w*img_h*sizeof(int), "temp 32 bits"); + rc= rect32= MEM_mallocN(img_w*img_h*sizeof(int), "temp 32 bits"); for(y=0; y<img_h; y++) { rf= rectf; @@ -312,8 +311,8 @@ void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, } glaDrawPixelsSafe(fx, fy, img_w, img_h, img_w, GL_RGBA, GL_UNSIGNED_BYTE, rect32); - - MEM_freeT(rect32); + + MEM_freeN(rect32); } void glaDrawPixelsSafe(float x, float y, int img_w, int img_h, int row_w, int format, int type, void *rect) |