Fix T37706: avoid cycles crash when using a stack that exceeds SVM stack limits.

This should be pretty rare, the shader in question had many parallel node links
because of copying the nodes many times, which is inefficient to run anyway.
This commit is contained in:
Brecht Van Lommel 2014-01-16 22:36:30 +01:00
parent 568e678fa3
commit e9227c76d4
Notes: blender-bot 2023-02-14 11:31:06 +01:00
Referenced by issue #37706, Cycles node setup crash blender.
2 changed files with 13 additions and 3 deletions

View File

@ -115,6 +115,7 @@ SVMCompiler::SVMCompiler(ShaderManager *shader_manager_, ImageManager *image_man
background = false;
mix_weight_offset = SVM_STACK_INVALID;
use_multi_closure = use_multi_closure_;
compile_failed = false;
}
int SVMCompiler::stack_size(ShaderSocketType type)
@ -164,10 +165,12 @@ int SVMCompiler::stack_find_offset(ShaderSocketType type)
}
}
fprintf(stderr, "Out of SVM stack space.\n");
assert(0);
if(!compile_failed) {
compile_failed = true;
fprintf(stderr, "Cycles: out of SVM stack space, shader \"%s\" too big.\n", current_shader->name.c_str());
}
return offset;
return 0;
}
void SVMCompiler::stack_clear_offset(ShaderSocketType type, int offset)
@ -654,6 +657,12 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
node->compile(*this);
}
/* if compile failed, generate empty shader */
if(compile_failed) {
svm_nodes.clear();
compile_failed = false;
}
add_node(NODE_END, 0, 0, 0);
}

View File

@ -141,6 +141,7 @@ protected:
int max_stack_use;
uint mix_weight_offset;
bool use_multi_closure;
bool compile_failed;
};
CCL_NAMESPACE_END