Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions src/backend/cpu/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
********************************************************/

#include <Array.hpp>
#include <copy.hpp>
#include <kernel/transform.hpp>
#include <math.hpp>
#include <platform.hpp>
Expand All @@ -22,23 +23,27 @@ void transform(Array<T> &out, const Array<T> &in, const Array<float> &tf,
const bool perspective) {
out.eval();
in.eval();

// TODO: Temporary Fix, must fix handling subarrays upstream
// tf has to be linear, although offset is allowed
const Array<float> tf_Lin = tf.isLinear() ? tf : copyArray(tf);
tf.eval();

switch (method) {
case AF_INTERP_NEAREST:
case AF_INTERP_LOWER:
getQueue().enqueue(kernel::transform<T, 1>, out, in, tf, inverse,
perspective, method);
getQueue().enqueue(kernel::transform<T, 1>, out, in, tf_Lin,
inverse, perspective, method);
break;
case AF_INTERP_BILINEAR:
case AF_INTERP_BILINEAR_COSINE:
getQueue().enqueue(kernel::transform<T, 2>, out, in, tf, inverse,
perspective, method);
getQueue().enqueue(kernel::transform<T, 2>, out, in, tf_Lin,
inverse, perspective, method);
break;
case AF_INTERP_BICUBIC:
case AF_INTERP_BICUBIC_SPLINE:
getQueue().enqueue(kernel::transform<T, 3>, out, in, tf, inverse,
perspective, method);
getQueue().enqueue(kernel::transform<T, 3>, out, in, tf_Lin,
inverse, perspective, method);
break;
default: AF_ERROR("Unsupported interpolation type", AF_ERR_ARG); break;
}
Expand Down
7 changes: 6 additions & 1 deletion src/backend/cuda/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <transform.hpp>

#include <copy.hpp>
#include <kernel/transform.hpp>
#include <utility.hpp>

Expand All @@ -19,7 +20,11 @@ template<typename T>
void transform(Array<T> &out, const Array<T> &in, const Array<float> &tf,
const af::interpType method, const bool inverse,
const bool perspective) {
kernel::transform<T>(out, in, tf, inverse, perspective, method,
// TODO: Temporary Fix, must fix handling subarrays upstream
// tf has to be linear, although offset is allowed.
const Array<float> tf_Lin = tf.isLinear() ? tf : copyArray(tf);

kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
interpOrder(method));
}

Expand Down
3 changes: 2 additions & 1 deletion src/backend/oneapi/kernel/transform.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ class transformCreateKernel {
using TMatTy =
typename std::conditional<PERSPECTIVE, float[9], float[6]>::type;
TMatTy tmat;
const float *tmat_ptr = c_tmat_.get_pointer() + t_idx * transf_len;
const float *tmat_ptr =
c_tmat_.get_pointer() + tf_.offset + t_idx * transf_len;

// We expect a inverse transform matrix by default
// If it is an forward transform, then we need its inverse
Expand Down
14 changes: 11 additions & 3 deletions src/backend/oneapi/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <transform.hpp>

#include <copy.hpp>
#include <err_oneapi.hpp>
#include <kernel/transform.hpp>

Expand All @@ -19,18 +20,25 @@ template<typename T>
void transform(Array<T> &out, const Array<T> &in, const Array<float> &tf,
const af_interp_type method, const bool inverse,
const bool perspective) {
// TODO: Temporary Fix, must fix handling subarrays upstream
// tf has to be linear, although offset is allowed.
const Array<float> tf_Lin = tf.isLinear() ? tf : copyArray(tf);

switch (method) {
case AF_INTERP_NEAREST:
case AF_INTERP_LOWER:
kernel::transform<T>(out, in, tf, inverse, perspective, method, 1);
kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
1);
break;
case AF_INTERP_BILINEAR:
case AF_INTERP_BILINEAR_COSINE:
kernel::transform<T>(out, in, tf, inverse, perspective, method, 2);
kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
2);
break;
case AF_INTERP_BICUBIC:
case AF_INTERP_BICUBIC_SPLINE:
kernel::transform<T>(out, in, tf, inverse, perspective, method, 3);
kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
3);
break;
default: AF_ERROR("Unsupported interpolation type", AF_ERR_ARG);
}
Expand Down
2 changes: 1 addition & 1 deletion src/backend/opencl/kernel/transform.cl
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ kernel void transformKernel(global T *d_out, const KParam out,
const int transf_len = 6;
float tmat[6];
#endif
global const float *tmat_ptr = c_tmat + t_idx * transf_len;
global const float *tmat_ptr = c_tmat + tf.offset + t_idx * transf_len;

// We expect a inverse transform matrix by default
// If it is an forward transform, then we need its inverse
Expand Down
14 changes: 11 additions & 3 deletions src/backend/opencl/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <transform.hpp>

#include <copy.hpp>
#include <kernel/transform.hpp>

namespace arrayfire {
Expand All @@ -18,18 +19,25 @@ template<typename T>
void transform(Array<T> &out, const Array<T> &in, const Array<float> &tf,
const af_interp_type method, const bool inverse,
const bool perspective) {
// TODO: Temporary Fix, must fix handling subarrays upstream
// tf has to be linear, although offset is allowed.
const Array<float> tf_Lin = tf.isLinear() ? tf : copyArray(tf);

switch (method) {
case AF_INTERP_NEAREST:
case AF_INTERP_LOWER:
kernel::transform<T>(out, in, tf, inverse, perspective, method, 1);
kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
1);
break;
case AF_INTERP_BILINEAR:
case AF_INTERP_BILINEAR_COSINE:
kernel::transform<T>(out, in, tf, inverse, perspective, method, 2);
kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
2);
break;
case AF_INTERP_BICUBIC:
case AF_INTERP_BICUBIC_SPLINE:
kernel::transform<T>(out, in, tf, inverse, perspective, method, 3);
kernel::transform<T>(out, in, tf_Lin, inverse, perspective, method,
3);
break;
default: AF_ERROR("Unsupported interpolation type", AF_ERR_ARG);
}
Expand Down
Loading