diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index e5140ea990b..538b1aae313 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -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); } diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h index 9693e54ce75..3d84a67e173 100644 --- a/intern/cycles/render/svm.h +++ b/intern/cycles/render/svm.h @@ -141,6 +141,7 @@ protected: int max_stack_use; uint mix_weight_offset; bool use_multi_closure; + bool compile_failed; }; CCL_NAMESPACE_END