Revision: 14159
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14159
Author:   blendix
Date:     2008-03-17 21:57:16 +0100 (Mon, 17 Mar 2008)

Log Message:
-----------

Fix for bug #6758: material nodes were not working correct with
ray mirror and transparency, was using the same stack for all
recursion depths, now creates new stacks as needed.

Fix for bug #8592: crash saving non-float image as 16bit tiff.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/imbuf/intern/tiff.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c       2008-03-17 
19:58:11 UTC (rev 14158)
+++ trunk/blender/source/blender/blenkernel/intern/node.c       2008-03-17 
20:57:16 UTC (rev 14159)
@@ -1803,7 +1803,7 @@
                
                if(is_group==0) {
                        for(sock= node->outputs.first; sock; sock= sock->next) {
-                               bNodeStack *ns= ntree->stack[0] + 
sock->stack_index;
+                               bNodeStack *ns= ntree->stack + 
sock->stack_index;
                                
                                if(sock->ns.data) {
                                        ns->data= sock->ns.data;
@@ -1836,7 +1836,7 @@
                        bNodeSocket *sock;
                
                        for(sock= node->outputs.first; sock; sock= sock->next) {
-                               ns= ntree->stack[0] + sock->stack_index;
+                               ns= ntree->stack + sock->stack_index;
                                if(ns->data) {
                                        sock->ns.data= ns->data;
                                        ns->data= NULL;
@@ -1854,7 +1854,7 @@
        
        if(is_group==0) {
                /* internally, group buffers are not stored */
-               for(ns= ntree->stack[0], a=0; a<ntree->stacksize; a++, ns++) {
+               for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) {
                        if(ns->data) {
                                printf("freed leftover buffer from stack\n");
                                free_compbuf(ns->data);
@@ -1895,15 +1895,47 @@
 /* per tree (and per group) unique indices are created */
 /* the index_ext we need to be able to map from groups to the group-node own 
stack */
 
+typedef struct bNodeThreadStack {
+       struct bNodeThreadStack *next, *prev;
+       bNodeStack *stack;
+       int used;
+} bNodeThreadStack;
+
+static bNodeThreadStack *ntreeGetThreadStack(bNodeTree *ntree, int thread)
+{
+       ListBase *lb= &ntree->threadstack[thread];
+       bNodeThreadStack *nts;
+
+       for(nts=lb->first; nts; nts=nts->next) {
+               if(!nts->used) {
+                       nts->used= 1;
+                       return nts;
+               }
+       }
+       
+       nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack");
+       nts->stack= MEM_dupallocN(ntree->stack);
+       nts->used= 1;
+       BLI_addtail(lb, nts);
+
+       return nts;
+}
+
+static void ntreeReleaseThreadStack(bNodeThreadStack *nts)
+{
+       nts->used= 0;
+}
+
 void ntreeBeginExecTree(bNodeTree *ntree)
 {
        /* let's make it sure */
        if(ntree->init & NTREE_EXEC_INIT)
                return;
-       
-       /* allocate the stack pointer array */
-       ntree->stack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(void *), "stack 
array");
-       
+
+       /* allocate the thread stack listbase array */
+       if(ntree->type!=NTREE_COMPOSIT)
+               ntree->threadstack= 
MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
+
        /* goes recursive over all groups */
        ntree->stacksize= ntree_begin_exec_tree(ntree);
 
@@ -1913,7 +1945,7 @@
                int a;
                
                /* allocate the base stack */
-               ns=ntree->stack[0]= 
MEM_callocN(ntree->stacksize*sizeof(bNodeStack), "node stack");
+               ns=ntree->stack= 
MEM_callocN(ntree->stacksize*sizeof(bNodeStack), "node stack");
                
                /* tag inputs, the get_stack() gives own socket stackdata if 
not in use */
                for(a=0; a<ntree->stacksize; a++, ns++) ns->hasinput= 1;
@@ -1923,7 +1955,7 @@
                        bNodeSocket *sock;
                        for(sock= node->inputs.first; sock; sock= sock->next) {
                                if(sock->link) {
-                                       ns= ntree->stack[0] + 
sock->link->fromsock->stack_index;
+                                       ns= ntree->stack + 
sock->link->fromsock->stack_index;
                                        ns->hasoutput= 1;
                                        ns->sockettype= 
sock->link->fromsock->type;
                                }
@@ -1931,16 +1963,11 @@
                                        sock->ns.sockettype= sock->type;
                        }
                        if(node->type==NODE_GROUP && node->id)
-                               group_tag_used_outputs(node, ntree->stack[0]);
+                               group_tag_used_outputs(node, ntree->stack);
                }
                
-               /* composite does 1 node per thread, so no multiple stacks 
needed */
                if(ntree->type==NTREE_COMPOSIT)
                        composit_begin_exec(ntree, 0);
-               else {
-                       for(a=1; a<BLENDER_MAX_THREADS; a++)
-                               ntree->stack[a]= MEM_dupallocN(ntree->stack[0]);
-               }
        }
        
        ntree->init |= NTREE_EXEC_INIT;
@@ -1950,6 +1977,7 @@
 {
        
        if(ntree->init & NTREE_EXEC_INIT) {
+               bNodeThreadStack *nts;
                int a;
                
                /* another callback candidate! */
@@ -1957,14 +1985,21 @@
                        composit_end_exec(ntree, 0);
                
                if(ntree->stack) {
-                       for(a=0; a<BLENDER_MAX_THREADS; a++)
-                               if(ntree->stack[a])
-                                       MEM_freeN(ntree->stack[a]);
-               
                        MEM_freeN(ntree->stack);
                        ntree->stack= NULL;
                }
 
+               if(ntree->threadstack) {
+                       for(a=0; a<BLENDER_MAX_THREADS; a++) {
+                               for(nts=ntree->threadstack[a].first; nts; 
nts=nts->next)
+                                       MEM_freeN(nts->stack);
+                               BLI_freelistN(&ntree->threadstack[a]);
+                       }
+
+                       MEM_freeN(ntree->threadstack);
+                       ntree->threadstack= NULL;
+               }
+
                ntree->init &= ~NTREE_EXEC_INIT;
        }
 }
@@ -1993,12 +2028,20 @@
        bNodeStack *nsin[MAX_SOCKET];   /* arbitrary... watch this */
        bNodeStack *nsout[MAX_SOCKET];  /* arbitrary... watch this */
        bNodeStack *stack;
+       bNodeThreadStack *nts = NULL;
        
        /* only when initialized */
        if((ntree->init & NTREE_EXEC_INIT)==0)
                ntreeBeginExecTree(ntree);
                
-       stack= ntree->stack[thread];
+       /* composite does 1 node per thread, so no multiple stacks needed */
+       if(ntree->type==NTREE_COMPOSIT) {
+               stack= ntree->stack;
+       }
+       else {
+               nts= ntreeGetThreadStack(ntree, thread);
+               stack= nts->stack;
+       }
        
        for(node= ntree->nodes.first; node; node= node->next) {
                if(node->typeinfo->execfunc) {
@@ -2010,6 +2053,9 @@
                        node_group_execute(stack, callerdata, node, nsin, 
nsout); 
                }
        }
+
+       if(nts)
+               ntreeReleaseThreadStack(nts);
 }
 
 
@@ -2191,7 +2237,7 @@
        for(node= ntree->nodes.first; node; node= node->next) {
                if(node->exec & NODE_FREEBUFS) {
                        for(sock= node->outputs.first; sock; sock= sock->next) {
-                               bNodeStack *ns= ntree->stack[0] + 
sock->stack_index;
+                               bNodeStack *ns= ntree->stack + 
sock->stack_index;
                                if(ns->data) {
                                        free_compbuf(ns->data);
                                        ns->data= NULL;
@@ -2245,7 +2291,7 @@
        
        /* setup callerdata for thread callback */
        thdata.rd= rd;
-       thdata.stack= ntree->stack[0];
+       thdata.stack= ntree->stack;
        
        /* fixed seed, for example noise texture */
        BLI_srandom(rd->cfra);

Modified: trunk/blender/source/blender/imbuf/intern/tiff.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/tiff.c    2008-03-17 19:58:11 UTC 
(rev 14158)
+++ trunk/blender/source/blender/imbuf/intern/tiff.c    2008-03-17 20:57:16 UTC 
(rev 14159)
@@ -484,7 +484,7 @@
 
        /* allocate array for pixel data */
        npixels = ibuf->x * ibuf->y;
-       if(ibuf->ftype & TIF_16BIT)
+       if(bitspersample == 16)
                pixels16 = (unsigned short*)libtiff__TIFFmalloc(npixels *
                        samplesperpixel * sizeof(unsigned short));
        else
@@ -499,7 +499,7 @@
        }
 
        /* setup pointers */
-       if(ibuf->ftype & TIF_16BIT) {
+       if(bitspersample == 16) {
                fromf = ibuf->rect_float;
                to16   = pixels16;
        }

Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_node_types.h      2008-03-17 
19:58:11 UTC (rev 14158)
+++ trunk/blender/source/blender/makesdna/DNA_node_types.h      2008-03-17 
20:57:16 UTC (rev 14159)
@@ -162,7 +162,8 @@
        
        ListBase nodes, links;
        
-       bNodeStack **stack;                             /* stack is only while 
executing, no read/write in file */
+       bNodeStack *stack;                              /* stack is only while 
executing, no read/write in file */
+       struct ListBase *threadstack;   /* same as above */
        
        int type, init;                                 /* set init on fileread 
*/
        int stacksize;                                  /* amount of elements 
in stack */


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to