Cycles: Solve threading conflict in shader synchronization

Update tag might access links (when checking for attributes) and
the links might be in the middle of rebuild in simplification
logic.
This commit is contained in:
Sergey Sharybin 2017-03-31 15:29:20 +02:00
parent 27d20a04b5
commit 90df1142a3
2 changed files with 25 additions and 8 deletions

@ -1158,6 +1158,13 @@ static void add_nodes(Scene *scene,
/* Sync Materials */
void BlenderSync::sync_materials_simpligy(Shader *shader)
{
ShaderGraph *graph = shader->graph;
graph->simplify(scene);
shader->tag_update(scene);
}
void BlenderSync::sync_materials(bool update_all)
{
shader_map.set_default(scene->default_surface);
@ -1203,19 +1210,28 @@ void BlenderSync::sync_materials(bool update_all)
shader->set_graph(graph);
/* By simplifying the shader graph as soon as possible, some redundant shader nodes
* might be removed which prevents loading unneccessary attributes later.
/* By simplifying the shader graph as soon as possible, some
* redundant shader nodes might be removed which prevents loading
* unnecessary attributes later.
*
* However, since graph simplification also accounts for e.g. mix weight, this would
* cause frequent expensive resyncs in interactive sessions, so for those sessions
* optimization is only performed right before compiling. */
* However, since graph simplification also accounts for e.g. mix
* weight, this would cause frequent expensive resyncs in interactive
* sessions, so for those sessions optimization is only performed
* right before compiling.
*/
if(!preview) {
pool.push(function_bind(&ShaderGraph::simplify, shader->graph, scene));
pool.push(function_bind(&BlenderSync::sync_materials_simpligy,
this,
shader));
}
else {
/* NOTE: Update tagging can access links which are being
* optimized out.
*/
shader->tag_update(scene);
}
}
}
pool.wait_work();
}

@ -96,6 +96,7 @@ public:
private:
/* sync */
void sync_lamps(bool update_all);
void sync_materials_simpligy(Shader *shader);
void sync_materials(bool update_all);
void sync_objects(BL::SpaceView3D& b_v3d, float motion_time = 0.0f);
void sync_motion(BL::RenderSettings& b_render,