[Bf-blender-cvs] [a523dfd2fd8] master: Fix T51412: Instant crash with texture plugged into the Displacement output

Sergey Sharybin noreply at git.blender.org
Thu May 4 16:28:25 CEST 2017


Commit: a523dfd2fd8c19ca0fbf9891a3be0988945d585f
Author: Sergey Sharybin
Date:   Thu May 4 16:27:31 2017 +0200
Branches: master
https://developer.blender.org/rBa523dfd2fd8c19ca0fbf9891a3be0988945d585f

Fix T51412: Instant crash with texture plugged into the Displacement output

The issue was caused by unlimited textures commit, root of the issue is that
displacement code updates some of the image slots directly, so it needs to
ensure device vectors are all proper size.

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

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

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

diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index d26ea3e14e0..b66d694c82a 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -949,16 +949,8 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, ImageD
 	}
 }
 
-void ImageManager::device_update(Device *device,
-                                 DeviceScene *dscene,
-                                 Scene *scene,
-                                 Progress& progress)
+void ImageManager::device_prepare_update(DeviceScene *dscene)
 {
-	if(!need_update)
-		return;
-
-	TaskPool pool;
-
 	for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) {
 		switch(type) {
 			case IMAGE_DATA_TYPE_FLOAT4:
@@ -986,6 +978,23 @@ void ImageManager::device_update(Device *device,
 					dscene->tex_half_image.resize(tex_num_images[IMAGE_DATA_TYPE_HALF]);
 				break;
 		}
+	}
+}
+
+void ImageManager::device_update(Device *device,
+                                 DeviceScene *dscene,
+                                 Scene *scene,
+                                 Progress& progress)
+{
+	if(!need_update) {
+		return;
+	}
+
+	/* Make sure arrays are proper size. */
+	device_prepare_update(dscene);
+
+	TaskPool pool;
+	for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) {
 		for(size_t slot = 0; slot < images[type].size(); slot++) {
 			if(!images[type][slot])
 				continue;
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 5550d019868..77214bf25bc 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -59,6 +59,7 @@ public:
 	                      bool use_alpha);
 	ImageDataType get_image_metadata(const string& filename, void *builtin_data, bool& is_linear);
 
+	void device_prepare_update(DeviceScene *dscene);
 	void device_update(Device *device,
 	                   DeviceScene *dscene,
 	                   Scene *scene,
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index a4dc06c4345..33d1936659b 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1944,6 +1944,7 @@ void MeshManager::device_update_displacement_images(Device *device,
 			}
 		}
 	}
+	image_manager->device_prepare_update(dscene);
 	foreach(int slot, bump_images) {
 		pool.push(function_bind(&ImageManager::device_update_slot,
 		                        image_manager,




More information about the Bf-blender-cvs mailing list