diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-12-29 18:42:20 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-12-31 13:58:18 +0300 |
commit | 0b4abd08b3e820e185313ccf741d31947198de91 (patch) | |
tree | 2776c4fbcfa5173f1b61a950a5eb5cc0ca4b27fd /intern/cycles/render/svm.cpp | |
parent | 0ffc603553bb6a5dd3ce96e88bc9be34356fc0cf (diff) |
Cycles: Experiment with use of runtime tag instead of set for SVM generation
This gives about 2x speedup (3.2sec vs. 11.9sec with 32716 handled nodes) when
updating shader for the shader tree.
Reviewers: brecht, juicyfruit, dingto, lukasstockner97
Differential Revision: https://developer.blender.org/D1700
Diffstat (limited to 'intern/cycles/render/svm.cpp')
-rw-r--r-- | intern/cycles/render/svm.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index 11c60365c1d..48f31ebe298 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -415,24 +415,25 @@ void SVMCompiler::generate_svm_nodes(const ShaderNodeSet& nodes, CompilerState *state) { ShaderNodeSet& done = state->nodes_done; + vector<bool>& done_flag = state->nodes_done_flag; bool nodes_done; - do { nodes_done = true; foreach(ShaderNode *node, nodes) { - if(done.find(node) == done.end()) { + if(!done_flag[node->id]) { bool inputs_done = true; foreach(ShaderInput *input, node->inputs) if(!node_skip_input(node, input)) - if(input->link && done.find(input->link->parent) == done.end()) + if(input->link && !done_flag[input->link->parent->id]) inputs_done = false; if(inputs_done) { generate_node(node, done); done.insert(node); + done_flag[node->id] = true; } else nodes_done = false; @@ -697,7 +698,7 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty } if(generate) { - CompilerState state; + CompilerState state(graph); generate_multi_closure(clin->link->parent, clin->link->parent, &state); @@ -844,5 +845,16 @@ string SVMCompiler::Summary::full_report() const return report; } +/* Global state of the compiler. */ + +SVMCompiler::CompilerState::CompilerState(ShaderGraph *graph) +{ + int max_id = 0; + foreach(ShaderNode *node, graph->nodes) { + max_id = max(node->id, max_id); + } + nodes_done_flag.resize(max_id + 1, false); +} + CCL_NAMESPACE_END |