Commit: 5edf8a8a5b01cfec2e83ae0fa33c067ac894dba8
Author: Sergey Sharybin
Date:   Mon Apr 20 16:36:08 2015 +0500
Branches: cycles_memory_experiments
https://developer.blender.org/rB5edf8a8a5b01cfec2e83ae0fa33c067ac894dba8

Cycles: Fix threading issue caused by several nodes sharing the same image

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

M       intern/cycles/render/image.cpp
M       intern/cycles/render/mesh.cpp

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

diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 0dd8041..f060896 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -809,7 +809,7 @@ void ImageManager::device_update_slot(Device *device,
        if(image->users == 0) {
                device_free_image(device, dscene, slot);
        }
-       else {
+       else if(image->need_load) {
                if(!osl_texture_system || float_images[slot]->builtin_data)
                        device_load_image(device,
                                          dscene,
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 3fabe01..884186c 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1166,6 +1166,7 @@ void 
MeshManager::device_update_displacement_images(Device *device,
        progress.set_status("Updating Displacement Images");
        TaskPool pool;
        ImageManager *image_manager = scene->image_manager;
+       set<int> bump_images;
        foreach(Mesh *mesh, scene->meshes) {
                if(mesh->need_update) {
                        foreach(uint shader_index, mesh->used_shaders) {
@@ -1187,17 +1188,22 @@ void 
MeshManager::device_update_displacement_images(Device *device,
                                                return;
                                        }
                                        ImageSlotNode *image_node = 
static_cast<ImageSlotNode*>(node);
-                                       assert(image_node->slot != -1);
-                                       
pool.push(function_bind(&ImageManager::device_update_slot,
-                                                               image_manager,
-                                                               device,
-                                                               dscene,
-                                                               
image_node->slot,
-                                                               &progress));
+                                       int slot = image_node->slot;
+                                       if(slot != -1) {
+                                               bump_images.insert(slot);
+                                       }
                                }
                        }
                }
        }
+       foreach(int slot, bump_images) {
+               pool.push(function_bind(&ImageManager::device_update_slot,
+                                       image_manager,
+                                       device,
+                                       dscene,
+                                       slot,
+                                       &progress));
+       }
        pool.wait_work();
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to