[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28460] branches/render25/source/blender: Render Branch: Image tile cache was not thread safe combined with threaded

Brecht Van Lommel brecht at blender.org
Tue Apr 27 14:07:33 CEST 2010


Revision: 28460
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28460
Author:   blendix
Date:     2010-04-27 14:07:33 +0200 (Tue, 27 Apr 2010)

Log Message:
-----------
Render Branch: Image tile cache was not thread safe combined with threaded
compositing nodes causing crashes.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/intern/brush.c
    branches/render25/source/blender/blenkernel/intern/effect.c
    branches/render25/source/blender/blenkernel/intern/node.c
    branches/render25/source/blender/imbuf/intern/cache.c
    branches/render25/source/blender/makesdna/DNA_node_types.h
    branches/render25/source/blender/modifiers/intern/MOD_util.c
    branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
    branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
    branches/render25/source/blender/nodes/intern/CMP_util.c
    branches/render25/source/blender/nodes/intern/CMP_util.h
    branches/render25/source/blender/render/extern/include/RE_shader_ext.h
    branches/render25/source/blender/render/intern/source/texture_stack.c

Modified: branches/render25/source/blender/blenkernel/intern/brush.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/brush.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/blenkernel/intern/brush.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -930,7 +930,7 @@
 				co[2]= 0.0f;
 				
 				/* This is copied from displace modifier code */
-				hasrgb = multitex_ext(mtex->tex, co, NULL, NULL, 0, &texres);
+				hasrgb = multitex_ext(mtex->tex, co, NULL, NULL, 0, &texres, 0);
 			
 				/* if the texture gave an RGB value, we assume it didn't give a valid
 				 * intensity, so calculate one (formula from do_material_tex).

Modified: branches/render25/source/blender/blenkernel/intern/effect.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/effect.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/blenkernel/intern/effect.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -783,7 +783,7 @@
 		mul_mat3_m4_v3(eff->ob->obmat, tex_co);
 	}
 
-	hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL,NULL, 0, result);
+	hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL,NULL, 0, result, 0);
 
 	if(hasrgb && mode==PFIELD_TEX_RGB) {
 		force[0] = (0.5f - result->tr) * strength;
@@ -794,15 +794,15 @@
 		strength/=nabla;
 
 		tex_co[0] += nabla;
-		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+1);
+		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+1, 0);
 
 		tex_co[0] -= nabla;
 		tex_co[1] += nabla;
-		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+2);
+		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+2, 0);
 
 		tex_co[1] -= nabla;
 		tex_co[2] += nabla;
-		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+3);
+		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+3, 0);
 
 		if(mode == PFIELD_TEX_GRAD || !hasrgb) { /* if we dont have rgb fall back to grad */
 			force[0] = (result[0].tin - result[1].tin) * strength;

Modified: branches/render25/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/node.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/blenkernel/intern/node.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -2241,6 +2241,7 @@
 typedef struct ThreadData {
 	bNodeStack *stack;
 	RenderData *rd;
+	int thread;
 } ThreadData;
 
 static void *exec_composite_node(void *node_v)
@@ -2453,6 +2454,9 @@
 	/* fixed seed, for example noise texture */
 	BLI_srandom(rd->cfra);
 
+	/* image tile cache init */
+	IMB_tile_cache_params(rd->threads, U.imagetilememory);
+
 	/* sets need_exec tags in nodes */
 	totnode= setExecutableNodes(ntree, &thdata);
 
@@ -2473,7 +2477,8 @@
 				}
 				totnode--;
 				
-				node->threaddata = &thdata;
+				node->threaddata= &thdata;
+				node->thread= BLI_available_thread_index(&threads);
 				node->exec= NODE_PROCESSING;
 				BLI_insert_thread(&threads, node);
 			}

Modified: branches/render25/source/blender/imbuf/intern/cache.c
===================================================================
--- branches/render25/source/blender/imbuf/intern/cache.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/imbuf/intern/cache.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -370,6 +370,9 @@
 		BLI_remlink(&cache->unused, ttile);
 	}
 
+	BLI_addhead(&cache->tiles, ttile);
+	BLI_ghash_insert(cache->tilehash, ttile, ttile);
+
 	gtile= imb_global_cache_get_tile(ibuf, tx, ty, replacetile);
 
 	ttile->ibuf= gtile->ibuf;
@@ -377,9 +380,6 @@
 	ttile->ty= gtile->ty;
 	ttile->global= gtile;
 
-	BLI_addhead(&cache->tiles, ttile);
-	BLI_ghash_insert(cache->tilehash, ttile, ttile);
-
 	return ibuf->tiles[toffs];
 }
 

Modified: branches/render25/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_node_types.h	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/makesdna/DNA_node_types.h	2010-04-27 12:07:33 UTC (rev 28460)
@@ -125,6 +125,7 @@
 	
 	short need_exec, exec;	/* need_exec is set as UI execution event, exec is flag during exec */
 	void *threaddata;		/* optional extra storage for use in thread (read only then!) */
+	int thread, pad;		/* thread number executing the node */
 	
 	rctf totr;				/* entire boundbox */
 	rctf butr;				/* optional buttons area */

Modified: branches/render25/source/blender/modifiers/intern/MOD_util.c
===================================================================
--- branches/render25/source/blender/modifiers/intern/MOD_util.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/modifiers/intern/MOD_util.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -53,7 +53,7 @@
 {
 	int result_type;
 
-	result_type = multitex_ext(texture, tex_co, NULL, NULL, 0, texres);
+	result_type = multitex_ext(texture, tex_co, NULL, NULL, 0, texres, 0);
 
 	/* if the texture gave an RGB value, we assume it didn't give a valid
 	* intensity, so calculate one (formula from do_material_tex).

Modified: branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
===================================================================
--- branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_displace.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_displace.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -44,14 +44,14 @@
 	{	-1, 0, ""	}
 };
 
-static float *vecbuf_get_pixel(CompBuf *vecbuf, float *veccol, int x, int y)
+static float *vecbuf_get_pixel(CompBuf *vecbuf, float *veccol, int x, int y, int thread)
 {
 	/* the x-xrad stuff is a bit weird, but i seem to need it otherwise 
 	 * my returned pixels are offset weirdly */
-	return compbuf_get_pixel(vecbuf, veccol, x-vecbuf->xrad, y-vecbuf->yrad, vecbuf->xrad, vecbuf->yrad);
+	return compbuf_get_pixel(vecbuf, veccol, x-vecbuf->xrad, y-vecbuf->yrad, vecbuf->xrad, vecbuf->yrad, thread);
 }
 
-static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, float *xscale, float *yscale)
+static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, float *xscale, float *yscale, int thread)
 {
 	ImBuf *ibuf;
 	float dx=0.0, dy=0.0;
@@ -77,7 +77,7 @@
 	for(y=0; y<sy; y++) {
 		for(x= 0; x< sx; x++, out+=4, in+=4, vec+=3) {
 			
-			vp = vecbuf_get_pixel(vecbuf, col, x, y);
+			vp = vecbuf_get_pixel(vecbuf, col, x, y, thread);
 
 			/* this happens in compbuf_get_pixel, need to make sure the following
 			 * check takes them into account */
@@ -96,21 +96,21 @@
 				/* adaptive sampling, X and Y channel.
 				 * we call vecbuf_get_pixel for every pixel since the input
 				 * might be a procedural, and then we can't use offsets */
-				vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y);
-				vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y);
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y, thread);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y, thread);
 				dx= 0.5f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0]));
 
-				vpprev = vecbuf_get_pixel(vecbuf, colprev, x, y-1);
-				vpnext = vecbuf_get_pixel(vecbuf, colnext, x, y+1);
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x, y-1, thread);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x, y+1, thread);
 				dy= 0.5f*(fabs(vp[1]-vpnext[1]) + fabs(vp[1]-vpprev[1]));
 
-				vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y-1);
-				vpnext = vecbuf_get_pixel(vecbuf, colnext, x-1, y+1);
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y-1, thread);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x-1, y+1, thread);
 				dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0]));
 				dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1]));
 
-				vpprev = vecbuf_get_pixel(vecbuf, colprev, x+1, y-1);
-				vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y+1);
+				vpprev = vecbuf_get_pixel(vecbuf, colprev, x+1, y-1, thread);
+				vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y+1, thread);
 				dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0]));
 				dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1]));
 				
@@ -149,7 +149,7 @@
 		vecbuf= typecheck_compbuf(vecbuf, CB_VEC3);
 		stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
 
-		do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, in[2]->vec, in[3]->vec);
+		do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, in[2]->vec, in[3]->vec, node->thread);
 		
 		out[0]->data= stackbuf;
 		

Modified: branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
===================================================================
--- branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_texture.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/nodes/intern/CMP_nodes/CMP_texture.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -42,7 +42,7 @@
 };
 
 /* called without rect allocated */
-static void texture_procedural(CompBuf *cbuf, float *out, float xco, float yco)
+static void texture_procedural(CompBuf *cbuf, float *out, float xco, float yco, int thread)
 {
 	bNode *node= cbuf->node;
 	TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
@@ -55,7 +55,7 @@
 	vec[1]= size[1]*(yco + cbuf->procedural_offset[1]);
 	vec[2]= size[2]*cbuf->procedural_offset[2];
 	
-	retval= multitex_ext((Tex *)node->id, vec, NULL, NULL, 0, &texres);
+	retval= multitex_ext((Tex *)node->id, vec, NULL, NULL, 0, &texres, thread);
 	
 	if(type==CB_VAL) {
 		if(texres.talpha)

Modified: branches/render25/source/blender/nodes/intern/CMP_util.c
===================================================================
--- branches/render25/source/blender/nodes/intern/CMP_util.c	2010-04-27 11:09:52 UTC (rev 28459)
+++ branches/render25/source/blender/nodes/intern/CMP_util.c	2010-04-27 12:07:33 UTC (rev 28460)
@@ -414,11 +414,11 @@
 	return inbuf;
 }
 
-float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, int yrad)
+float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, int yrad, int thread)
 {
 	if(cbuf) {
 		if(cbuf->rect_procedural) {
-			cbuf->rect_procedural(cbuf, rectf, (float)x/(float)xrad, (float)y/(float)yrad);
+			cbuf->rect_procedural(cbuf, rectf, (float)x/(float)xrad, (float)y/(float)yrad, thread);
 			return rectf;
 		}
 		else {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list