diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-11-24 18:50:21 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-11-24 18:50:21 +0400 |
commit | ed986b62e8f8b4fb1caa9c03ec0f05780f3d7aec (patch) | |
tree | 382a24818bbecb2d7b26a03650b185029d528594 /intern/cycles/render/svm.h | |
parent | 9b701b7d32c2de0656c7bc1e21200ccbe3d70c38 (diff) |
Fix #33152: cycles SVM crash with certain shader nodes setups where closures would
appear multiple times after flattening the mix/add shader part of the graph into a
tree structure.
Diffstat (limited to 'intern/cycles/render/svm.h')
-rw-r--r-- | intern/cycles/render/svm.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h index 0db68f400fc..c7b66d97289 100644 --- a/intern/cycles/render/svm.h +++ b/intern/cycles/render/svm.h @@ -81,6 +81,7 @@ public: bool background; protected: + /* stack */ struct Stack { Stack() { memset(users, 0, sizeof(users)); } Stack(const Stack& other) { memcpy(users, other.users, sizeof(users)); } @@ -123,11 +124,22 @@ protected: bool node_skip_input(ShaderNode *node, ShaderInput *input); + /* single closure */ void find_dependencies(set<ShaderNode*>& dependencies, const set<ShaderNode*>& done, ShaderInput *input); void generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNode*>& done); void generate_closure(ShaderNode *node, set<ShaderNode*>& done); - void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, uint in_offset); + /* multi closure */ + struct MultiClosureData { + int stack_offset; + int users; + }; + + void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, + map<ShaderNode*,MultiClosureData>& closure_data, uint in_offset); + void count_closure_users(ShaderNode *node, map<ShaderNode*, MultiClosureData>& closure_data); + + /* compile */ void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type); vector<int4> svm_nodes; |