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-12-29 18:42:20 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-12-31 13:58:18 +0300
commit0b4abd08b3e820e185313ccf741d31947198de91 (patch)
tree2776c4fbcfa5173f1b61a950a5eb5cc0ca4b27fd /intern/cycles/render/svm.cpp
parent0ffc603553bb6a5dd3ce96e88bc9be34356fc0cf (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.cpp20
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