Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-05-05 00:57:33 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-05 00:58:39 +0400
commitff34c2de64df696317a2dc88fdcce3eb991065b4 (patch)
treec27c80096caff30f15135ff4aa0e24a7c57104e4 /intern/cycles/kernel
parentf7aac45488c40b047235a7fe3f8807409aa5989c (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/cycles/kernel')
-rw-r--r--intern/cycles/kernel/kernel.cpp8
-rw-r--r--intern/cycles/kernel/kernel_compat_cpu.h38
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;