[Bf-blender-cvs] [5edf8a8] cycles_memory_experiments: Cycles: Fix threading issue caused by several nodes sharing the same image

Sergey Sharybin noreply at git.blender.org
Mon Apr 20 13:38:04 CEST 2015


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();
 }




More information about the Bf-blender-cvs mailing list