[Bf-blender-cvs] [8f4166ee495] master: Cycles: Fix image textures were completely broken since recent unlimited textures commit

Sergey Sharybin noreply at git.blender.org
Fri Apr 28 14:07:37 CEST 2017


Commit: 8f4166ee495531fa38b676b0a5ef4c482e89f9a5
Author: Sergey Sharybin
Date:   Fri Apr 28 14:04:27 2017 +0200
Branches: master
https://developer.blender.org/rB8f4166ee495531fa38b676b0a5ef4c482e89f9a5

Cycles: Fix image textures were completely broken since recent unlimited textures commit

The indexing was totally wrong in both image packing code and image sampling in kernel.

Fixes T51341: Cycles OpenCL corruption in todays buildbot

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

M	intern/cycles/kernel/kernel_image_opencl.h
M	intern/cycles/render/image.cpp

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

diff --git a/intern/cycles/kernel/kernel_image_opencl.h b/intern/cycles/kernel/kernel_image_opencl.h
index 15579f55a41..c1ac39e7f1e 100644
--- a/intern/cycles/kernel/kernel_image_opencl.h
+++ b/intern/cycles/kernel/kernel_image_opencl.h
@@ -66,7 +66,8 @@ ccl_device_inline float svm_image_texture_frac(float x, int *ix)
 
 ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, float y)
 {
-	uint4 info = kernel_tex_fetch(__tex_image_packed_info, id*2);
+	const int texture_id = kernel_tex_index(id);
+	uint4 info = kernel_tex_fetch(__tex_image_packed_info, texture_id*2);
 	uint width = info.x;
 	uint height = info.y;
 	uint offset = info.z;
@@ -140,11 +141,12 @@ ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, fl
 
 ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg, int id, float x, float y, float z)
 {
-	uint4 info = kernel_tex_fetch(__tex_image_packed_info, id*2);
+	const int texture_id = kernel_tex_index(id);
+	uint4 info = kernel_tex_fetch(__tex_image_packed_info, texture_id*2);
 	uint width = info.x;
 	uint height = info.y;
 	uint offset = info.z;
-	uint depth = kernel_tex_fetch(__tex_image_packed_info, id*2+1).x;
+	uint depth = kernel_tex_fetch(__tex_image_packed_info, texture_id*2+1).x;
 
 	/* Image Options */
 	uint interpolation = (info.w & (1 << 0)) ? INTERPOLATION_CLOSEST : INTERPOLATION_LINEAR;
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index f79a057f1d4..e0bb8a16949 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -1049,6 +1049,8 @@ void ImageManager::device_pack_images(Device *device,
 	                + tex_num_images[IMAGE_DATA_TYPE_FLOAT] + tex_num_images[IMAGE_DATA_TYPE_BYTE];
 	uint4 *info = dscene->tex_image_packed_info.resize(info_size*2);
 
+	size_t index = 0;
+
 	/* Byte4 Textures*/
 	type = IMAGE_DATA_TYPE_BYTE4;
 
@@ -1070,9 +1072,8 @@ void ImageManager::device_pack_images(Device *device,
 
 		uint8_t options = pack_image_options(type, slot);
 
-		int index = type_index_to_flattened_slot(slot, type) * 2;
-		info[index] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
-		info[index+1] = make_uint4(tex_img.data_depth, 0, 0, 0);
+		info[index++] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
+		info[index++] = make_uint4(tex_img.data_depth, 0, 0, 0);
 
 		memcpy(pixels_byte4+offset, (void*)tex_img.data_pointer, tex_img.memory_size());
 		offset += tex_img.size();
@@ -1102,9 +1103,8 @@ void ImageManager::device_pack_images(Device *device,
 
 		uint8_t options = pack_image_options(type, slot);
 
-		int index = type_index_to_flattened_slot(slot, type) * 2;
-		info[index] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
-		info[index+1] = make_uint4(tex_img.data_depth, 0, 0, 0);
+		info[index++] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
+		info[index++] = make_uint4(tex_img.data_depth, 0, 0, 0);
 
 		memcpy(pixels_float4+offset, (void*)tex_img.data_pointer, tex_img.memory_size());
 		offset += tex_img.size();
@@ -1132,9 +1132,8 @@ void ImageManager::device_pack_images(Device *device,
 
 		uint8_t options = pack_image_options(type, slot);
 
-		int index = type_index_to_flattened_slot(slot, type) * 2;
-		info[index] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
-		info[index+1] = make_uint4(tex_img.data_depth, 0, 0, 0);
+		info[index++] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
+		info[index++] = make_uint4(tex_img.data_depth, 0, 0, 0);
 
 		memcpy(pixels_byte+offset, (void*)tex_img.data_pointer, tex_img.memory_size());
 		offset += tex_img.size();
@@ -1164,9 +1163,8 @@ void ImageManager::device_pack_images(Device *device,
 
 		uint8_t options = pack_image_options(type, slot);
 
-		int index = type_index_to_flattened_slot(slot, type) * 2;
-		info[index] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
-		info[index+1] = make_uint4(tex_img.data_depth, 0, 0, 0);
+		info[index++] = make_uint4(tex_img.data_width, tex_img.data_height, offset, options);
+		info[index++] = make_uint4(tex_img.data_depth, 0, 0, 0);
 
 		memcpy(pixels_float+offset, (void*)tex_img.data_pointer, tex_img.memory_size());
 		offset += tex_img.size();




More information about the Bf-blender-cvs mailing list