[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