Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-11-24 18:50:21 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-11-24 18:50:21 +0400
commited986b62e8f8b4fb1caa9c03ec0f05780f3d7aec (patch)
tree382a24818bbecb2d7b26a03650b185029d528594 /intern/cycles/render/svm.h
parent9b701b7d32c2de0656c7bc1e21200ccbe3d70c38 (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.h14
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;