diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index c4188fda421..8f3682cc349 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -230,6 +230,11 @@ void SVMCompiler::stack_clear_users(ShaderNode *node, set& done) for(int i = 0; i < size; i++) active_stack.users[output->stack_offset + i]--; + + output->stack_offset = SVM_STACK_INVALID; + + foreach(ShaderInput *in, output->links) + in->stack_offset = SVM_STACK_INVALID; } } } @@ -243,6 +248,8 @@ void SVMCompiler::stack_clear_temporary(ShaderNode *node) for(int i = 0; i < size; i++) active_stack.users[input->stack_offset + i]--; + + input->stack_offset = SVM_STACK_INVALID; } } } @@ -397,6 +404,10 @@ void SVMCompiler::generate_closure(ShaderNode *node, set done, Stac /* set jump for mix node, -1 because offset is already incremented when this jump is added to it */ svm_nodes[mix_offset].z = cl2_offset - mix_offset - 1; + + done.insert(node); + stack_clear_users(node, done); + stack_clear_temporary(node); } else { /* execute dependencies for closure */ diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h index 05fb85b057f..dfd78cf3c40 100644 --- a/intern/cycles/render/svm.h +++ b/intern/cycles/render/svm.h @@ -78,6 +78,27 @@ public: protected: struct Stack { Stack() { memset(users, 0, sizeof(users)); } + Stack(const Stack& other) { memcpy(users, other.users, sizeof(users)); } + Stack& operator=(const Stack& other) { memcpy(users, other.users, sizeof(users)); return *this; } + + bool empty() + { + for(int i = 0; i < SVM_STACK_SIZE; i++) + if(users[i]) + return false; + + return true; + } + + void print() + { + printf("stack <"); + + for(int i = 0; i < SVM_STACK_SIZE; i++) + printf((users[i])? "*": " "); + + printf(">\n"); + } int users[SVM_STACK_SIZE]; };