diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-04-28 15:04:27 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-04-28 15:04:27 +0300 |
commit | 8f4166ee495531fa38b676b0a5ef4c482e89f9a5 (patch) | |
tree | a2c8af463cb4abde1659574778e1c63a2b102dfd | |
parent | e3fc945fe2ba1883bd706c1fd04acce83c3529c3 (diff) |
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
-rw-r--r-- | intern/cycles/kernel/kernel_image_opencl.h | 8 | ||||
-rw-r--r-- | intern/cycles/render/image.cpp | 22 |
2 files changed, 15 insertions, 15 deletions
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(); |