Bugfix #26549
authorTon Roosendaal <ton@blender.org>
Mon, 21 Mar 2011 17:10:55 +0000 (17:10 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 21 Mar 2011 17:10:55 +0000 (17:10 +0000)
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.

source/blender/blenkernel/intern/texture.c
source/blender/render/intern/source/envmap.c

index 12aef5f4b29bf7606e2f14832d7908ac9d1da6ce..3ce4acf5902812032d76cb1a739920d4095829a2 100644 (file)
@@ -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);
index 2e75e0c9870c599fef82c92a0bcc355593d958b8..c4065b30cb095d6312097e70a2b18de3961cac86 100644 (file)
@@ -75,47 +75,54 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
 {
        int dx, part;
        
-       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);
+       /* 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;
+                       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);
 }
 
 /* ------------------------------------------------------------------------- */