Cycles: optimization to not compile shaders and load images that are not

used by any mesh/lamp/world.
This commit is contained in:
Brecht Van Lommel
2012-10-30 11:51:17 +00:00
parent e09a1bc7cf
commit 0c3d3e5562
5 changed files with 77 additions and 30 deletions

View File

@@ -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,37 +612,39 @@ 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(use_multi_closure)
generate_multi_closure(clin->link->parent, done, SVM_STACK_INVALID);
else
generate_closure(clin->link->parent, 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);
}
/* compile output node */
node->compile(*this);
}
/* compile output node */
node->compile(*this);
add_node(NODE_END, 0, 0, 0);
}