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:
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user