Commit: 90df1142a35dd9b738ef21ceb5f3b12249846482
Author: Sergey Sharybin
Date:   Fri Mar 31 15:29:20 2017 +0200
Branches: master
https://developer.blender.org/rB90df1142a35dd9b738ef21ceb5f3b12249846482

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.

===================================================================

M       intern/cycles/blender/blender_shader.cpp
M       intern/cycles/blender/blender_sync.h

===================================================================

diff --git a/intern/cycles/blender/blender_shader.cpp 
b/intern/cycles/blender/blender_shader.cpp
index 0cd4b90340b..df21e2640bd 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -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,17 +1210,26 @@ 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);
                        }
-
-                       shader->tag_update(scene);
                }
        }
 
diff --git a/intern/cycles/blender/blender_sync.h 
b/intern/cycles/blender/blender_sync.h
index 36bedc505af..62e2f8f563a 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -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,

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to