Using environment map type "load" increased user counter on each
preview render.

Also noticed that this type of envmap use wasn't threadsafe, causing
imbufs being allocated for all threads. Also fixed that.
This commit is contained in:
Ton Roosendaal 2011-03-21 17:10:55 +00:00
parent 9a75ba4463
commit 67cbf22211
2 changed files with 49 additions and 39 deletions

@ -788,7 +788,10 @@ Tex *localize_texture(Tex *tex)
}
if(texn->coba) texn->coba= MEM_dupallocN(texn->coba);
if(texn->env) texn->env= BKE_copy_envmap(texn->env);
if(texn->env) {
texn->env= BKE_copy_envmap(texn->env);
id_us_min(texn->env->ima);
}
if(texn->pd) texn->pd= MEM_dupallocN(texn->pd);
if(texn->vd) {
texn->vd= MEM_dupallocN(texn->vd);

@ -75,47 +75,54 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
{
int dx, part;
BKE_free_envmapdata(env);
/* after lock we test cube[1], if set the other thread has done it fine */
BLI_lock_thread(LOCK_IMAGE);
if(env->cube[1]==NULL) {
BKE_free_envmapdata(env);
dx= ibuf->y;
dx/= 2;
if (3*dx == ibuf->x) {
env->type = ENV_CUBE;
} else if (ibuf->x == ibuf->y) {
env->type = ENV_PLANE;
} else {
printf("Incorrect envmap size\n");
env->ok= 0;
env->ima->ok= 0;
return;
}
if (env->type == ENV_CUBE) {
for(part=0; part<6; part++) {
env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat);
dx= ibuf->y;
dx/= 2;
if (3*dx == ibuf->x) {
env->type = ENV_CUBE;
env->ok= ENV_OSA;
} else if (ibuf->x == ibuf->y) {
env->type = ENV_PLANE;
env->ok= ENV_OSA;
} else {
printf("Incorrect envmap size\n");
env->ok= 0;
env->ima->ok= 0;
}
IMB_float_from_rect(ibuf);
IMB_rectcpy(env->cube[0], ibuf,
0, 0, 0, 0, dx, dx);
IMB_rectcpy(env->cube[1], ibuf,
0, 0, dx, 0, dx, dx);
IMB_rectcpy(env->cube[2], ibuf,
0, 0, 2*dx, 0, dx, dx);
IMB_rectcpy(env->cube[3], ibuf,
0, 0, 0, dx, dx, dx);
IMB_rectcpy(env->cube[4], ibuf,
0, 0, dx, dx, dx, dx);
IMB_rectcpy(env->cube[5], ibuf,
0, 0, 2*dx, dx, dx, dx);
env->ok= ENV_OSA;
}
else { /* ENV_PLANE */
env->cube[1]= IMB_dupImBuf(ibuf);
IMB_float_from_rect(env->cube[1]);
env->ok= ENV_OSA;
}
if(env->ok) {
if (env->type == ENV_CUBE) {
for(part=0; part<6; part++) {
env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat);
}
IMB_float_from_rect(ibuf);
IMB_rectcpy(env->cube[0], ibuf,
0, 0, 0, 0, dx, dx);
IMB_rectcpy(env->cube[1], ibuf,
0, 0, dx, 0, dx, dx);
IMB_rectcpy(env->cube[2], ibuf,
0, 0, 2*dx, 0, dx, dx);
IMB_rectcpy(env->cube[3], ibuf,
0, 0, 0, dx, dx, dx);
IMB_rectcpy(env->cube[4], ibuf,
0, 0, dx, dx, dx, dx);
IMB_rectcpy(env->cube[5], ibuf,
0, 0, 2*dx, dx, dx, dx);
}
else { /* ENV_PLANE */
env->cube[1]= IMB_dupImBuf(ibuf);
IMB_float_from_rect(env->cube[1]);
}
}
}
BLI_unlock_thread(LOCK_IMAGE);
}
/* ------------------------------------------------------------------------- */