Cycles: Tag shaders for update after the threading part is over

This avoids write access happening in non-atomic manner in
Shader::tag_update which modifies the global managers. Even
for 1 byte data types it's quite dangerous.
This commit is contained in:
Sergey Sharybin
2017-04-04 13:36:58 +02:00
parent 7b149bfde6
commit 92aeb84fde
2 changed files with 12 additions and 11 deletions

View File

@@ -27,7 +27,9 @@
#include "blender/blender_util.h" #include "blender/blender_util.h"
#include "util/util_debug.h" #include "util/util_debug.h"
#include "util/util_foreach.h"
#include "util/util_string.h" #include "util/util_string.h"
#include "util/util_set.h"
#include "util/util_task.h" #include "util/util_task.h"
CCL_NAMESPACE_BEGIN CCL_NAMESPACE_BEGIN
@@ -1158,13 +1160,6 @@ static void add_nodes(Scene *scene,
/* Sync Materials */ /* 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) void BlenderSync::sync_materials(bool update_all)
{ {
shader_map.set_default(scene->default_surface); shader_map.set_default(scene->default_surface);
@@ -1173,6 +1168,7 @@ void BlenderSync::sync_materials(bool update_all)
BL::BlendData::materials_iterator b_mat; BL::BlendData::materials_iterator b_mat;
TaskPool pool; TaskPool pool;
set<Shader*> updated_shaders;
for(b_data.materials.begin(b_mat); b_mat != b_data.materials.end(); ++b_mat) { for(b_data.materials.begin(b_mat); b_mat != b_data.materials.end(); ++b_mat) {
Shader *shader; Shader *shader;
@@ -1220,9 +1216,11 @@ void BlenderSync::sync_materials(bool update_all)
* right before compiling. * right before compiling.
*/ */
if(!preview) { if(!preview) {
pool.push(function_bind(&BlenderSync::sync_materials_simpligy, pool.push(function_bind(&ShaderGraph::simplify, graph, scene));
this, /* NOTE: Update shaders out of the threads since those routines
shader)); * are accessing and writing to a global context.
*/
updated_shaders.insert(shader);
} }
else { else {
/* NOTE: Update tagging can access links which are being /* NOTE: Update tagging can access links which are being
@@ -1234,6 +1232,10 @@ void BlenderSync::sync_materials(bool update_all)
} }
pool.wait_work(); pool.wait_work();
foreach(Shader *shader, updated_shaders) {
shader->tag_update(scene);
}
} }
/* Sync World */ /* Sync World */

View File

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