diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-10-30 15:51:17 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-10-30 15:51:17 +0400 |
commit | 0c3d3e5562770586eaa95d6087d190240de5b8f2 (patch) | |
tree | cf72e859a15a12d2bbf5c6129dc7d5f91f384e6e /intern/cycles/render/svm.cpp | |
parent | e09a1bc7cff068484ec43bb3383d4981e998c0cf (diff) |
Cycles: optimization to not compile shaders and load images that are not
used by any mesh/lamp/world.
Diffstat (limited to 'intern/cycles/render/svm.cpp')
-rw-r--r-- | intern/cycles/render/svm.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index c41d503b217..dc249984499 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -48,6 +48,9 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene /* test if we need to update */ device_free(device, dscene); + /* determine which shaders are in use */ + device_update_shaders_used(scene); + /* svm_nodes */ vector<int4> svm_nodes; size_t i; @@ -609,36 +612,38 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty output->stack_offset = SVM_STACK_INVALID; } - if(clin->link) { - bool generate = false; - if(type == SHADER_TYPE_SURFACE) { - /* generate surface shader */ - generate = true; - shader->has_surface = true; - } - else if(type == SHADER_TYPE_VOLUME) { - /* generate volume shader */ - generate = true; - shader->has_volume = true; - } - else if(type == SHADER_TYPE_DISPLACEMENT) { - /* generate displacement shader */ - generate = true; - shader->has_displacement = true; - } + if(shader->used) { + if(clin->link) { + bool generate = false; + if(type == SHADER_TYPE_SURFACE) { + /* generate surface shader */ + generate = true; + shader->has_surface = true; + } + else if(type == SHADER_TYPE_VOLUME) { + /* generate volume shader */ + generate = true; + shader->has_volume = true; + } + else if(type == SHADER_TYPE_DISPLACEMENT) { + /* generate displacement shader */ + generate = true; + shader->has_displacement = true; + } - if(generate) { - set<ShaderNode*> done; + if(generate) { + set<ShaderNode*> done; - if(use_multi_closure) - generate_multi_closure(clin->link->parent, done, SVM_STACK_INVALID); - else - generate_closure(clin->link->parent, done); + if(use_multi_closure) + generate_multi_closure(clin->link->parent, done, SVM_STACK_INVALID); + else + generate_closure(clin->link->parent, done); + } } - } - /* compile output node */ - node->compile(*this); + /* compile output node */ + node->compile(*this); + } add_node(NODE_END, 0, 0, 0); } |