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:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-11-25 11:07:29 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-11-25 11:07:32 +0300
commit443b159f023a872472d8e61c7270dab472a3d8ee (patch)
tree011015dbde30f6adc8b95c2710e2e5a5f13ca528 /intern/cycles/render/svm.h
parentde35827612f85511aed50b9f05953ad857fe7e1c (diff)
Cycles: Ensure order of shader nodes in the dependnecies set
The issue was than nodes dependencies were stored as set<ShaderNode*> which is actually a so called "strict weak ordered", meaning order of nodes in the set is strictly defined, but based on the ShaderNode pointer. This means that between different render invokations order of original nodes could be different due to different pointers allocated for ShaderNode. This commit makes it so dependencies and maps used for ShaderNodes are based on the node->id which has much more predictable order. It's still possible to trick the system by doing some crazy edits during viewport rendfer and cause difference between viewport and final render stacks. Reviewers: brecht Reviewed By: brecht Subscribers: LazyDodo Differential Revision: https://developer.blender.org/D1630
Diffstat (limited to 'intern/cycles/render/svm.h')
-rw-r--r--intern/cycles/render/svm.h27
1 files changed, 14 insertions, 13 deletions
diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h
index e48fe5e32ed..02855f22fb3 100644
--- a/intern/cycles/render/svm.h
+++ b/intern/cycles/render/svm.h
@@ -112,35 +112,36 @@ protected:
struct StackBackup {
Stack stack;
vector<int> offsets;
- set<ShaderNode*> done;
+ ShaderNodeSet done;
};
- void stack_backup(StackBackup& backup, set<ShaderNode*>& done);
- void stack_restore(StackBackup& backup, set<ShaderNode*>& done);
+ void stack_backup(StackBackup& backup, ShaderNodeSet& done);
+ void stack_restore(StackBackup& backup, ShaderNodeSet& done);
void stack_clear_temporary(ShaderNode *node);
int stack_size(ShaderSocketType type);
- void stack_clear_users(ShaderNode *node, set<ShaderNode*>& done);
+ void stack_clear_users(ShaderNode *node, ShaderNodeSet& done);
bool node_skip_input(ShaderNode *node, ShaderInput *input);
/* single closure */
- void find_dependencies(set<ShaderNode*>& dependencies,
- const set<ShaderNode*>& done,
+ void find_dependencies(ShaderNodeSet& dependencies,
+ const ShaderNodeSet& done,
ShaderInput *input,
ShaderNode *skip_node = NULL);
- void generate_node(ShaderNode *node, set<ShaderNode*>& done);
- void generate_closure_node(ShaderNode *node, set<ShaderNode*>& done);
+ void generate_node(ShaderNode *node, ShaderNodeSet& done);
+ void generate_closure_node(ShaderNode *node, ShaderNodeSet& done);
void generated_shared_closure_nodes(ShaderNode *root_node, ShaderNode *node,
- set<ShaderNode*>& done,
- set<ShaderNode*>& closure_done, const set<ShaderNode*>& shared);
- void generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNode*>& done);
+ ShaderNodeSet& done,
+ ShaderNodeSet& closure_done,
+ const ShaderNodeSet& shared);
+ void generate_svm_nodes(const ShaderNodeSet& nodes, ShaderNodeSet& done);
/* multi closure */
void generate_multi_closure(ShaderNode *root_node,
ShaderNode *node,
- set<ShaderNode*>& done,
- set<ShaderNode*>& closure_done);
+ ShaderNodeSet& done,
+ ShaderNodeSet& closure_done);
/* compile */
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);