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:
@@ -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 */
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user