diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-05-05 00:57:33 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-05-05 00:58:39 +0400 |
commit | ff34c2de64df696317a2dc88fdcce3eb991065b4 (patch) | |
tree | c27c80096caff30f15135ff4aa0e24a7c57104e4 /intern | |
parent | f7aac45488c40b047235a7fe3f8807409aa5989c (diff) |
Cycles: avoid int->float conversions for pixel lookups
Gives ~3% speedup for image.blend test, and 6% for image heavy file.
Overall speedup in real-world use is likely much less.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_compat_cpu.h | 38 |
2 files changed, 28 insertions, 18 deletions
diff --git a/intern/cycles/kernel/kernel.cpp b/intern/cycles/kernel/kernel.cpp index 41cf7a6b66c..173028d50c8 100644 --- a/intern/cycles/kernel/kernel.cpp +++ b/intern/cycles/kernel/kernel.cpp @@ -61,9 +61,7 @@ void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t if(tex) { tex->data = (float4*)mem; - tex->width = width; - tex->height = height; - tex->depth = depth; + tex->dimensions_set(width, height, depth); tex->interpolation = interpolation; } } @@ -78,9 +76,7 @@ void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t if(tex) { tex->data = (uchar4*)mem; - tex->width = width; - tex->height = height; - tex->depth = depth; + tex->dimensions_set(width, height, depth); tex->interpolation = interpolation; } } diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h index feaff503212..e393663361a 100644 --- a/intern/cycles/kernel/kernel_compat_cpu.h +++ b/intern/cycles/kernel/kernel_compat_cpu.h @@ -95,14 +95,14 @@ template<typename T> struct texture_image { ccl_always_inline float4 interp(float x, float y, bool periodic = true) { - if(!data) + if(UNLIKELY(!data)) return make_float4(0.0f, 0.0f, 0.0f, 0.0f); int ix, iy, nix, niy; if(interpolation == INTERPOLATION_CLOSEST) { - frac(x*width, &ix); - frac(y*height, &iy); + frac(x*width_fl, &ix); + frac(y*height_fl, &iy); if(periodic) { ix = wrap_periodic(ix, width); iy = wrap_periodic(iy, height); @@ -115,8 +115,8 @@ template<typename T> struct texture_image { return read(data[ix + iy*width]); } else { - float tx = frac(x*width - 0.5f, &ix); - float ty = frac(y*height - 0.5f, &iy); + float tx = frac(x*width_fl - 0.5f, &ix); + float ty = frac(y*height_fl - 0.5f, &iy); if(periodic) { ix = wrap_periodic(ix, width); @@ -144,15 +144,15 @@ template<typename T> struct texture_image { ccl_always_inline float4 interp_3d(float x, float y, float z, bool periodic = false) { - if(!data) + if(UNLIKELY(!data)) return make_float4(0.0f, 0.0f, 0.0f, 0.0f); int ix, iy, iz, nix, niy, niz; if(interpolation == INTERPOLATION_CLOSEST) { - frac(x*width, &ix); - frac(y*height, &iy); - frac(z*depth, &iz); + frac(x*width_fl, &ix); + frac(y*height_fl, &iy); + frac(z*depth_fl, &iz); if(periodic) { ix = wrap_periodic(ix, width); @@ -168,9 +168,9 @@ template<typename T> struct texture_image { return read(data[ix + iy*width + iz*width*height]); } else { - float tx = frac(x*width - 0.5f, &ix); - float ty = frac(y*height - 0.5f, &iy); - float tz = frac(z*depth - 0.5f, &iz); + float tx = frac(x*width_fl - 0.5f, &ix); + float ty = frac(y*height_fl - 0.5f, &iy); + float tz = frac(z*depth_fl - 0.5f, &iz); if(periodic) { ix = wrap_periodic(ix, width); @@ -207,9 +207,23 @@ template<typename T> struct texture_image { } } + ccl_always_inline void dimensions_set(int width_, int height_, int depth_) + { + width = width_; + height = height_; + depth = depth_; + + width_fl = (float)width_; + height_fl = (float)height_; + depth_fl = (float)depth_; + } + T *data; int interpolation; int width, height, depth; + + /* avoid int/float conversion */ + float width_fl, height_fl, depth_fl; }; typedef texture<float4> texture_float4; |