diff options
Diffstat (limited to 'intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h')
-rw-r--r-- | intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h index 00bb0686b98..8f20251afd7 100644 --- a/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h +++ b/intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h @@ -96,18 +96,16 @@ ccl_device_inline float4 svm_image_texture_read(KernelGlobals *kg, const int *offsets, int id, int x, int y, int z) { - int tix = x / TILE_SIZE, itix = x % TILE_SIZE, - tiy = y / TILE_SIZE, itiy = y % TILE_SIZE, - tiz = z / TILE_SIZE, itiz = z % TILE_SIZE; - int tile_index = tix + s_info->tiled_w * (tiy + tiz * s_info->tiled_h); - int sparse_index = offsets[tile_index]; - if(sparse_index < 0) { + int tile_start = offsets[(x >> TILE_INDEX_SHIFT) + s_info->tiled_w + * ((y >> TILE_INDEX_SHIFT) + (z >> TILE_INDEX_SHIFT) * s_info->tiled_h)]; + if(tile_start < 0) { return make_float4(0.0f); } - int itiw = (x > s_info.div_w) ? s_info.remain_w : TILE_SIZE; - int itih = (y > s_info.div_h) ? s_info.remain_h : TILE_SIZE; - int in_tile_index = itix + itiw * (itiy + itiz * itih); - return svm_image_texture_read(kg, info, id, sparse_index + in_tile_index); + int index = tile_start + (x & TILE_INDEX_MASK) + + ((x > s_info.div_w) ? s_info.remain_w : TILE_SIZE) + * ((y & TILE_INDEX_MASK) + (z & TILE_INDEX_MASK) + * ((y > s_info.div_h) ? s_info.remain_h : TILE_SIZE)); + return svm_image_texture_read(kg, info, id, index); } ccl_device_inline float4 svm_image_texture_read_2d(KernelGlobals *kg, int id, int x, int y) |