vec_math.hpp 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. // By downloading, copying, installing or using the software you agree to this license.
  6. // If you do not agree to this license, do not download, install,
  7. // copy or use the software.
  8. //
  9. //
  10. // License Agreement
  11. // For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
  14. // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
  15. // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
  16. // Third party copyrights are property of their respective owners.
  17. //
  18. // Redistribution and use in source and binary forms, with or without modification,
  19. // are permitted provided that the following conditions are met:
  20. //
  21. // * Redistribution's of source code must retain the above copyright notice,
  22. // this list of conditions and the following disclaimer.
  23. //
  24. // * Redistribution's in binary form must reproduce the above copyright notice,
  25. // this list of conditions and the following disclaimer in the documentation
  26. // and/or other materials provided with the distribution.
  27. //
  28. // * The name of the copyright holders may not be used to endorse or promote products
  29. // derived from this software without specific prior written permission.
  30. //
  31. // This software is provided by the copyright holders and contributors "as is" and
  32. // any express or implied warranties, including, but not limited to, the implied
  33. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  34. // In no event shall the Intel Corporation or contributors be liable for any direct,
  35. // indirect, incidental, special, exemplary, or consequential damages
  36. // (including, but not limited to, procurement of substitute goods or services;
  37. // loss of use, data, or profits; or business interruption) however caused
  38. // and on any theory of liability, whether in contract, strict liability,
  39. // or tort (including negligence or otherwise) arising in any way out of
  40. // the use of this software, even if advised of the possibility of such damage.
  41. //
  42. //M*/
  43. #pragma once
  44. #ifndef OPENCV_CUDEV_UTIL_VEC_MATH_HPP
  45. #define OPENCV_CUDEV_UTIL_VEC_MATH_HPP
  46. #include "vec_traits.hpp"
  47. #include "saturate_cast.hpp"
  48. namespace cv { namespace cudev {
  49. //! @addtogroup cudev
  50. //! @{
  51. // saturate_cast
  52. namespace vec_math_detail
  53. {
  54. template <int cn, typename VecD> struct SatCastHelper;
  55. template <typename VecD> struct SatCastHelper<1, VecD>
  56. {
  57. template <typename VecS> __device__ __forceinline__ static VecD cast(const VecS& v)
  58. {
  59. typedef typename VecTraits<VecD>::elem_type D;
  60. return VecTraits<VecD>::make(saturate_cast<D>(v.x));
  61. }
  62. };
  63. template <typename VecD> struct SatCastHelper<2, VecD>
  64. {
  65. template <typename VecS> __device__ __forceinline__ static VecD cast(const VecS& v)
  66. {
  67. typedef typename VecTraits<VecD>::elem_type D;
  68. return VecTraits<VecD>::make(saturate_cast<D>(v.x), saturate_cast<D>(v.y));
  69. }
  70. };
  71. template <typename VecD> struct SatCastHelper<3, VecD>
  72. {
  73. template <typename VecS> __device__ __forceinline__ static VecD cast(const VecS& v)
  74. {
  75. typedef typename VecTraits<VecD>::elem_type D;
  76. return VecTraits<VecD>::make(saturate_cast<D>(v.x), saturate_cast<D>(v.y), saturate_cast<D>(v.z));
  77. }
  78. };
  79. template <typename VecD> struct SatCastHelper<4, VecD>
  80. {
  81. template <typename VecS> __device__ __forceinline__ static VecD cast(const VecS& v)
  82. {
  83. typedef typename VecTraits<VecD>::elem_type D;
  84. return VecTraits<VecD>::make(saturate_cast<D>(v.x), saturate_cast<D>(v.y), saturate_cast<D>(v.z), saturate_cast<D>(v.w));
  85. }
  86. };
  87. }
  88. template<typename T> __device__ __forceinline__ T saturate_cast(const uchar1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  89. template<typename T> __device__ __forceinline__ T saturate_cast(const char1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  90. template<typename T> __device__ __forceinline__ T saturate_cast(const ushort1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  91. template<typename T> __device__ __forceinline__ T saturate_cast(const short1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  92. template<typename T> __device__ __forceinline__ T saturate_cast(const uint1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  93. template<typename T> __device__ __forceinline__ T saturate_cast(const int1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  94. template<typename T> __device__ __forceinline__ T saturate_cast(const float1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  95. template<typename T> __device__ __forceinline__ T saturate_cast(const double1& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  96. template<typename T> __device__ __forceinline__ T saturate_cast(const uchar2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  97. template<typename T> __device__ __forceinline__ T saturate_cast(const char2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  98. template<typename T> __device__ __forceinline__ T saturate_cast(const ushort2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  99. template<typename T> __device__ __forceinline__ T saturate_cast(const short2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  100. template<typename T> __device__ __forceinline__ T saturate_cast(const uint2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  101. template<typename T> __device__ __forceinline__ T saturate_cast(const int2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  102. template<typename T> __device__ __forceinline__ T saturate_cast(const float2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  103. template<typename T> __device__ __forceinline__ T saturate_cast(const double2& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  104. template<typename T> __device__ __forceinline__ T saturate_cast(const uchar3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  105. template<typename T> __device__ __forceinline__ T saturate_cast(const char3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  106. template<typename T> __device__ __forceinline__ T saturate_cast(const ushort3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  107. template<typename T> __device__ __forceinline__ T saturate_cast(const short3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  108. template<typename T> __device__ __forceinline__ T saturate_cast(const uint3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  109. template<typename T> __device__ __forceinline__ T saturate_cast(const int3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  110. template<typename T> __device__ __forceinline__ T saturate_cast(const float3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  111. template<typename T> __device__ __forceinline__ T saturate_cast(const double3& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  112. template<typename T> __device__ __forceinline__ T saturate_cast(const uchar4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  113. template<typename T> __device__ __forceinline__ T saturate_cast(const char4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  114. template<typename T> __device__ __forceinline__ T saturate_cast(const ushort4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  115. template<typename T> __device__ __forceinline__ T saturate_cast(const short4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  116. template<typename T> __device__ __forceinline__ T saturate_cast(const uint4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  117. template<typename T> __device__ __forceinline__ T saturate_cast(const int4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  118. template<typename T> __device__ __forceinline__ T saturate_cast(const float4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  119. template<typename T> __device__ __forceinline__ T saturate_cast(const double4& v) { return vec_math_detail::SatCastHelper<VecTraits<T>::cn, T>::cast(v); }
  120. // unary operators
  121. #define CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(op, input_type, output_type) \
  122. __device__ __forceinline__ output_type ## 1 operator op(const input_type ## 1 & a) \
  123. { \
  124. return VecTraits<output_type ## 1>::make(op (a.x)); \
  125. } \
  126. __device__ __forceinline__ output_type ## 2 operator op(const input_type ## 2 & a) \
  127. { \
  128. return VecTraits<output_type ## 2>::make(op (a.x), op (a.y)); \
  129. } \
  130. __device__ __forceinline__ output_type ## 3 operator op(const input_type ## 3 & a) \
  131. { \
  132. return VecTraits<output_type ## 3>::make(op (a.x), op (a.y), op (a.z)); \
  133. } \
  134. __device__ __forceinline__ output_type ## 4 operator op(const input_type ## 4 & a) \
  135. { \
  136. return VecTraits<output_type ## 4>::make(op (a.x), op (a.y), op (a.z), op (a.w)); \
  137. }
  138. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, char, char)
  139. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, short, short)
  140. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, int, int)
  141. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, float, float)
  142. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, double, double)
  143. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, uchar, uchar)
  144. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, char, uchar)
  145. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, ushort, uchar)
  146. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, short, uchar)
  147. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, int, uchar)
  148. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, uint, uchar)
  149. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, float, uchar)
  150. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, double, uchar)
  151. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, uchar, uchar)
  152. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, char, char)
  153. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, ushort, ushort)
  154. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, short, short)
  155. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, int, int)
  156. CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, uint, uint)
  157. #undef CV_CUDEV_IMPLEMENT_VEC_UNARY_OP
  158. // unary functions
  159. #define CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(func_name, func, input_type, output_type) \
  160. __device__ __forceinline__ output_type ## 1 func_name(const input_type ## 1 & a) \
  161. { \
  162. return VecTraits<output_type ## 1>::make(func (a.x)); \
  163. } \
  164. __device__ __forceinline__ output_type ## 2 func_name(const input_type ## 2 & a) \
  165. { \
  166. return VecTraits<output_type ## 2>::make(func (a.x), func (a.y)); \
  167. } \
  168. __device__ __forceinline__ output_type ## 3 func_name(const input_type ## 3 & a) \
  169. { \
  170. return VecTraits<output_type ## 3>::make(func (a.x), func (a.y), func (a.z)); \
  171. } \
  172. __device__ __forceinline__ output_type ## 4 func_name(const input_type ## 4 & a) \
  173. { \
  174. return VecTraits<output_type ## 4>::make(func (a.x), func (a.y), func (a.z), func (a.w)); \
  175. }
  176. namespace vec_math_detail
  177. {
  178. __device__ __forceinline__ schar abs_(schar val)
  179. {
  180. return (schar) ::abs((int) val);
  181. }
  182. __device__ __forceinline__ short abs_(short val)
  183. {
  184. return (short) ::abs((int) val);
  185. }
  186. }
  187. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uchar, uchar)
  188. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, vec_math_detail::abs_, char, char)
  189. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, ushort, ushort)
  190. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, vec_math_detail::abs_, short, short)
  191. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::abs, int, int)
  192. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, /*::abs*/, uint, uint)
  193. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::fabsf, float, float)
  194. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::fabs, double, double)
  195. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, uchar, float)
  196. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, char, float)
  197. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, ushort, float)
  198. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, short, float)
  199. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, int, float)
  200. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, uint, float)
  201. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, float, float)
  202. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrt, double, double)
  203. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, uchar, float)
  204. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, char, float)
  205. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, ushort, float)
  206. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, short, float)
  207. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, int, float)
  208. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, uint, float)
  209. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, float, float)
  210. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::exp, double, double)
  211. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, uchar, float)
  212. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, char, float)
  213. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, ushort, float)
  214. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, short, float)
  215. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, int, float)
  216. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, uint, float)
  217. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, float, float)
  218. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2, double, double)
  219. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, uchar, float)
  220. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, char, float)
  221. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, ushort, float)
  222. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, short, float)
  223. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, int, float)
  224. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, uint, float)
  225. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, float, float)
  226. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10, double, double)
  227. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, uchar, float)
  228. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, char, float)
  229. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, ushort, float)
  230. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, short, float)
  231. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, int, float)
  232. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, uint, float)
  233. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, float, float)
  234. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::log, double, double)
  235. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, uchar, float)
  236. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, char, float)
  237. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, ushort, float)
  238. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, short, float)
  239. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, int, float)
  240. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, uint, float)
  241. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, float, float)
  242. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2, double, double)
  243. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, uchar, float)
  244. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, char, float)
  245. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, ushort, float)
  246. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, short, float)
  247. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, int, float)
  248. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, uint, float)
  249. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, float, float)
  250. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10, double, double)
  251. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, uchar, float)
  252. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, char, float)
  253. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, ushort, float)
  254. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, short, float)
  255. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, int, float)
  256. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, uint, float)
  257. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, float, float)
  258. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sin, double, double)
  259. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, uchar, float)
  260. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, char, float)
  261. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, ushort, float)
  262. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, short, float)
  263. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, int, float)
  264. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, uint, float)
  265. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, float, float)
  266. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cos, double, double)
  267. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, uchar, float)
  268. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, char, float)
  269. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, ushort, float)
  270. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, short, float)
  271. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, int, float)
  272. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, uint, float)
  273. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, float, float)
  274. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tan, double, double)
  275. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, uchar, float)
  276. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, char, float)
  277. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, ushort, float)
  278. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, short, float)
  279. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, int, float)
  280. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, uint, float)
  281. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, float, float)
  282. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asin, double, double)
  283. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, uchar, float)
  284. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, char, float)
  285. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, ushort, float)
  286. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, short, float)
  287. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, int, float)
  288. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, uint, float)
  289. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, float, float)
  290. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acos, double, double)
  291. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, uchar, float)
  292. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, char, float)
  293. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, ushort, float)
  294. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, short, float)
  295. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, int, float)
  296. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, uint, float)
  297. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, float, float)
  298. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atan, double, double)
  299. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, uchar, float)
  300. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, char, float)
  301. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, ushort, float)
  302. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, short, float)
  303. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, int, float)
  304. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, uint, float)
  305. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, float, float)
  306. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinh, double, double)
  307. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, uchar, float)
  308. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, char, float)
  309. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, ushort, float)
  310. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, short, float)
  311. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, int, float)
  312. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, uint, float)
  313. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, float, float)
  314. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::cosh, double, double)
  315. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, uchar, float)
  316. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, char, float)
  317. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, ushort, float)
  318. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, short, float)
  319. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, int, float)
  320. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, uint, float)
  321. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, float, float)
  322. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanh, double, double)
  323. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, uchar, float)
  324. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, char, float)
  325. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, ushort, float)
  326. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, short, float)
  327. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, int, float)
  328. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, uint, float)
  329. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, float, float)
  330. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinh, double, double)
  331. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, uchar, float)
  332. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, char, float)
  333. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, ushort, float)
  334. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, short, float)
  335. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, int, float)
  336. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, uint, float)
  337. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, float, float)
  338. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acosh, double, double)
  339. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, uchar, float)
  340. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, char, float)
  341. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, ushort, float)
  342. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, short, float)
  343. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, int, float)
  344. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, uint, float)
  345. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, float, float)
  346. CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanh, double, double)
  347. #undef CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
  348. // binary operators (vec & vec)
  349. #define CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(op, input_type, output_type) \
  350. __device__ __forceinline__ output_type ## 1 operator op(const input_type ## 1 & a, const input_type ## 1 & b) \
  351. { \
  352. return VecTraits<output_type ## 1>::make(a.x op b.x); \
  353. } \
  354. __device__ __forceinline__ output_type ## 2 operator op(const input_type ## 2 & a, const input_type ## 2 & b) \
  355. { \
  356. return VecTraits<output_type ## 2>::make(a.x op b.x, a.y op b.y); \
  357. } \
  358. __device__ __forceinline__ output_type ## 3 operator op(const input_type ## 3 & a, const input_type ## 3 & b) \
  359. { \
  360. return VecTraits<output_type ## 3>::make(a.x op b.x, a.y op b.y, a.z op b.z); \
  361. } \
  362. __device__ __forceinline__ output_type ## 4 operator op(const input_type ## 4 & a, const input_type ## 4 & b) \
  363. { \
  364. return VecTraits<output_type ## 4>::make(a.x op b.x, a.y op b.y, a.z op b.z, a.w op b.w); \
  365. }
  366. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, uchar, int)
  367. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, char, int)
  368. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, ushort, int)
  369. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, short, int)
  370. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, int, int)
  371. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, uint, uint)
  372. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, float, float)
  373. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, double, double)
  374. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, uchar, int)
  375. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, char, int)
  376. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, ushort, int)
  377. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, short, int)
  378. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, int, int)
  379. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, uint, uint)
  380. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, float, float)
  381. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, double, double)
  382. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, uchar, int)
  383. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, char, int)
  384. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, ushort, int)
  385. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, short, int)
  386. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, int, int)
  387. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, uint, uint)
  388. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, float, float)
  389. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, double, double)
  390. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, uchar, int)
  391. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, char, int)
  392. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, ushort, int)
  393. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, short, int)
  394. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, int, int)
  395. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, uint, uint)
  396. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, float, float)
  397. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, double, double)
  398. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, uchar, uchar)
  399. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, char, uchar)
  400. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, ushort, uchar)
  401. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, short, uchar)
  402. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, int, uchar)
  403. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, uint, uchar)
  404. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, float, uchar)
  405. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, double, uchar)
  406. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, uchar, uchar)
  407. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, char, uchar)
  408. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, ushort, uchar)
  409. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, short, uchar)
  410. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, int, uchar)
  411. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, uint, uchar)
  412. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, float, uchar)
  413. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, double, uchar)
  414. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, uchar, uchar)
  415. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, char, uchar)
  416. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, ushort, uchar)
  417. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, short, uchar)
  418. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, int, uchar)
  419. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, uint, uchar)
  420. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, float, uchar)
  421. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, double, uchar)
  422. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, uchar, uchar)
  423. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, char, uchar)
  424. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, ushort, uchar)
  425. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, short, uchar)
  426. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, int, uchar)
  427. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, uint, uchar)
  428. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, float, uchar)
  429. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, double, uchar)
  430. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, uchar, uchar)
  431. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, char, uchar)
  432. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, ushort, uchar)
  433. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, short, uchar)
  434. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, int, uchar)
  435. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, uint, uchar)
  436. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, float, uchar)
  437. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, double, uchar)
  438. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, uchar, uchar)
  439. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, char, uchar)
  440. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, ushort, uchar)
  441. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, short, uchar)
  442. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, int, uchar)
  443. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, uint, uchar)
  444. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, float, uchar)
  445. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, double, uchar)
  446. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, uchar, uchar)
  447. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, char, uchar)
  448. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, ushort, uchar)
  449. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, short, uchar)
  450. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, int, uchar)
  451. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, uint, uchar)
  452. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, float, uchar)
  453. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, double, uchar)
  454. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, uchar, uchar)
  455. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, char, uchar)
  456. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, ushort, uchar)
  457. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, short, uchar)
  458. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, int, uchar)
  459. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, uint, uchar)
  460. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, float, uchar)
  461. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, double, uchar)
  462. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, uchar, uchar)
  463. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, char, char)
  464. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, ushort, ushort)
  465. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, short, short)
  466. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, int, int)
  467. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, uint, uint)
  468. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, uchar, uchar)
  469. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, char, char)
  470. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, ushort, ushort)
  471. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, short, short)
  472. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, int, int)
  473. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, uint, uint)
  474. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, uchar, uchar)
  475. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, char, char)
  476. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, ushort, ushort)
  477. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, short, short)
  478. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, int, int)
  479. CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, uint, uint)
  480. #undef CV_CUDEV_IMPLEMENT_VEC_BINARY_OP
  481. // binary operators (vec & scalar)
  482. #define CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(op, input_type, scalar_type, output_type) \
  483. __device__ __forceinline__ output_type ## 1 operator op(const input_type ## 1 & a, scalar_type s) \
  484. { \
  485. return VecTraits<output_type ## 1>::make(a.x op s); \
  486. } \
  487. __device__ __forceinline__ output_type ## 1 operator op(scalar_type s, const input_type ## 1 & b) \
  488. { \
  489. return VecTraits<output_type ## 1>::make(s op b.x); \
  490. } \
  491. __device__ __forceinline__ output_type ## 2 operator op(const input_type ## 2 & a, scalar_type s) \
  492. { \
  493. return VecTraits<output_type ## 2>::make(a.x op s, a.y op s); \
  494. } \
  495. __device__ __forceinline__ output_type ## 2 operator op(scalar_type s, const input_type ## 2 & b) \
  496. { \
  497. return VecTraits<output_type ## 2>::make(s op b.x, s op b.y); \
  498. } \
  499. __device__ __forceinline__ output_type ## 3 operator op(const input_type ## 3 & a, scalar_type s) \
  500. { \
  501. return VecTraits<output_type ## 3>::make(a.x op s, a.y op s, a.z op s); \
  502. } \
  503. __device__ __forceinline__ output_type ## 3 operator op(scalar_type s, const input_type ## 3 & b) \
  504. { \
  505. return VecTraits<output_type ## 3>::make(s op b.x, s op b.y, s op b.z); \
  506. } \
  507. __device__ __forceinline__ output_type ## 4 operator op(const input_type ## 4 & a, scalar_type s) \
  508. { \
  509. return VecTraits<output_type ## 4>::make(a.x op s, a.y op s, a.z op s, a.w op s); \
  510. } \
  511. __device__ __forceinline__ output_type ## 4 operator op(scalar_type s, const input_type ## 4 & b) \
  512. { \
  513. return VecTraits<output_type ## 4>::make(s op b.x, s op b.y, s op b.z, s op b.w); \
  514. }
  515. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uchar, int, int)
  516. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uchar, float, float)
  517. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uchar, double, double)
  518. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, char, int, int)
  519. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, char, float, float)
  520. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, char, double, double)
  521. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, ushort, int, int)
  522. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, ushort, float, float)
  523. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, ushort, double, double)
  524. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, short, int, int)
  525. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, short, float, float)
  526. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, short, double, double)
  527. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, int, int, int)
  528. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, int, float, float)
  529. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, int, double, double)
  530. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uint, uint, uint)
  531. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uint, float, float)
  532. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uint, double, double)
  533. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, float, float, float)
  534. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, float, double, double)
  535. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, double, double, double)
  536. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uchar, int, int)
  537. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uchar, float, float)
  538. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uchar, double, double)
  539. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, char, int, int)
  540. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, char, float, float)
  541. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, char, double, double)
  542. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, ushort, int, int)
  543. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, ushort, float, float)
  544. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, ushort, double, double)
  545. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, short, int, int)
  546. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, short, float, float)
  547. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, short, double, double)
  548. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, int, int, int)
  549. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, int, float, float)
  550. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, int, double, double)
  551. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uint, uint, uint)
  552. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uint, float, float)
  553. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uint, double, double)
  554. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, float, float, float)
  555. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, float, double, double)
  556. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, double, double, double)
  557. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uchar, int, int)
  558. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uchar, float, float)
  559. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uchar, double, double)
  560. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, char, int, int)
  561. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, char, float, float)
  562. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, char, double, double)
  563. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, ushort, int, int)
  564. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, ushort, float, float)
  565. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, ushort, double, double)
  566. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, short, int, int)
  567. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, short, float, float)
  568. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, short, double, double)
  569. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, int, int, int)
  570. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, int, float, float)
  571. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, int, double, double)
  572. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uint, uint, uint)
  573. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uint, float, float)
  574. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uint, double, double)
  575. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, float, float, float)
  576. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, float, double, double)
  577. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, double, double, double)
  578. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uchar, int, int)
  579. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uchar, float, float)
  580. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uchar, double, double)
  581. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, char, int, int)
  582. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, char, float, float)
  583. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, char, double, double)
  584. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, ushort, int, int)
  585. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, ushort, float, float)
  586. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, ushort, double, double)
  587. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, short, int, int)
  588. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, short, float, float)
  589. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, short, double, double)
  590. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, int, int, int)
  591. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, int, float, float)
  592. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, int, double, double)
  593. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uint, uint, uint)
  594. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uint, float, float)
  595. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uint, double, double)
  596. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, float, float, float)
  597. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, float, double, double)
  598. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, double, double, double)
  599. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, uchar, uchar, uchar)
  600. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, char, char, uchar)
  601. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, ushort, ushort, uchar)
  602. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, short, short, uchar)
  603. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, int, int, uchar)
  604. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, uint, uint, uchar)
  605. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, float, float, uchar)
  606. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, double, double, uchar)
  607. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, uchar, uchar, uchar)
  608. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, char, char, uchar)
  609. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, ushort, ushort, uchar)
  610. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, short, short, uchar)
  611. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, int, int, uchar)
  612. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, uint, uint, uchar)
  613. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, float, float, uchar)
  614. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, double, double, uchar)
  615. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, uchar, uchar, uchar)
  616. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, char, char, uchar)
  617. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, ushort, ushort, uchar)
  618. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, short, short, uchar)
  619. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, int, int, uchar)
  620. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, uint, uint, uchar)
  621. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, float, float, uchar)
  622. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, double, double, uchar)
  623. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, uchar, uchar, uchar)
  624. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, char, char, uchar)
  625. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, ushort, ushort, uchar)
  626. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, short, short, uchar)
  627. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, int, int, uchar)
  628. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, uint, uint, uchar)
  629. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, float, float, uchar)
  630. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, double, double, uchar)
  631. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, uchar, uchar, uchar)
  632. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, char, char, uchar)
  633. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, ushort, ushort, uchar)
  634. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, short, short, uchar)
  635. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, int, int, uchar)
  636. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, uint, uint, uchar)
  637. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, float, float, uchar)
  638. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, double, double, uchar)
  639. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, uchar, uchar, uchar)
  640. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, char, char, uchar)
  641. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, ushort, ushort, uchar)
  642. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, short, short, uchar)
  643. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, int, int, uchar)
  644. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, uint, uint, uchar)
  645. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, float, float, uchar)
  646. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, double, double, uchar)
  647. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, uchar, uchar, uchar)
  648. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, char, char, uchar)
  649. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, ushort, ushort, uchar)
  650. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, short, short, uchar)
  651. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, int, int, uchar)
  652. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, uint, uint, uchar)
  653. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, float, float, uchar)
  654. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, double, double, uchar)
  655. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, uchar, uchar, uchar)
  656. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, char, char, uchar)
  657. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, ushort, ushort, uchar)
  658. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, short, short, uchar)
  659. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, int, int, uchar)
  660. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, uint, uint, uchar)
  661. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, float, float, uchar)
  662. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, double, double, uchar)
  663. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, uchar, uchar, uchar)
  664. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, char, char, char)
  665. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, ushort, ushort, ushort)
  666. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, short, short, short)
  667. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, int, int, int)
  668. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, uint, uint, uint)
  669. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, uchar, uchar, uchar)
  670. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, char, char, char)
  671. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, ushort, ushort, ushort)
  672. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, short, short, short)
  673. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, int, int, int)
  674. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, uint, uint, uint)
  675. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, uchar, uchar, uchar)
  676. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, char, char, char)
  677. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, ushort, ushort, ushort)
  678. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, short, short, short)
  679. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, int, int, int)
  680. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, uint, uint, uint)
  681. #undef CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP
  682. // binary function (vec & vec)
  683. #define CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(func_name, func, input_type, output_type) \
  684. __device__ __forceinline__ output_type ## 1 func_name(const input_type ## 1 & a, const input_type ## 1 & b) \
  685. { \
  686. return VecTraits<output_type ## 1>::make(func (a.x, b.x)); \
  687. } \
  688. __device__ __forceinline__ output_type ## 2 func_name(const input_type ## 2 & a, const input_type ## 2 & b) \
  689. { \
  690. return VecTraits<output_type ## 2>::make(func (a.x, b.x), func (a.y, b.y)); \
  691. } \
  692. __device__ __forceinline__ output_type ## 3 func_name(const input_type ## 3 & a, const input_type ## 3 & b) \
  693. { \
  694. return VecTraits<output_type ## 3>::make(func (a.x, b.x), func (a.y, b.y), func (a.z, b.z)); \
  695. } \
  696. __device__ __forceinline__ output_type ## 4 func_name(const input_type ## 4 & a, const input_type ## 4 & b) \
  697. { \
  698. return VecTraits<output_type ## 4>::make(func (a.x, b.x), func (a.y, b.y), func (a.z, b.z), func (a.w, b.w)); \
  699. }
  700. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, uchar, uchar)
  701. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, char, char)
  702. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, ushort, ushort)
  703. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, short, short)
  704. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, uint, uint)
  705. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, int, int)
  706. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::fmaxf, float, float)
  707. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::fmax, double, double)
  708. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, uchar, uchar)
  709. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, char, char)
  710. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, ushort, ushort)
  711. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, short, short)
  712. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, uint, uint)
  713. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, int, int)
  714. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::fminf, float, float)
  715. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::fmin, double, double)
  716. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, uchar, float)
  717. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, char, float)
  718. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, ushort, float)
  719. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, short, float)
  720. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, uint, float)
  721. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, int, float)
  722. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, float, float)
  723. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypot, double, double)
  724. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, uchar, float)
  725. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, char, float)
  726. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, ushort, float)
  727. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, short, float)
  728. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, uint, float)
  729. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, int, float)
  730. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, float, float)
  731. CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2, double, double)
  732. #undef CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC
  733. // binary function (vec & scalar)
  734. #define CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(func_name, func, input_type, scalar_type, output_type) \
  735. __device__ __forceinline__ output_type ## 1 func_name(const input_type ## 1 & a, scalar_type s) \
  736. { \
  737. return VecTraits<output_type ## 1>::make(func ((output_type) a.x, (output_type) s)); \
  738. } \
  739. __device__ __forceinline__ output_type ## 1 func_name(scalar_type s, const input_type ## 1 & b) \
  740. { \
  741. return VecTraits<output_type ## 1>::make(func ((output_type) s, (output_type) b.x)); \
  742. } \
  743. __device__ __forceinline__ output_type ## 2 func_name(const input_type ## 2 & a, scalar_type s) \
  744. { \
  745. return VecTraits<output_type ## 2>::make(func ((output_type) a.x, (output_type) s), func ((output_type) a.y, (output_type) s)); \
  746. } \
  747. __device__ __forceinline__ output_type ## 2 func_name(scalar_type s, const input_type ## 2 & b) \
  748. { \
  749. return VecTraits<output_type ## 2>::make(func ((output_type) s, (output_type) b.x), func ((output_type) s, (output_type) b.y)); \
  750. } \
  751. __device__ __forceinline__ output_type ## 3 func_name(const input_type ## 3 & a, scalar_type s) \
  752. { \
  753. return VecTraits<output_type ## 3>::make(func ((output_type) a.x, (output_type) s), func ((output_type) a.y, (output_type) s), func ((output_type) a.z, (output_type) s)); \
  754. } \
  755. __device__ __forceinline__ output_type ## 3 func_name(scalar_type s, const input_type ## 3 & b) \
  756. { \
  757. return VecTraits<output_type ## 3>::make(func ((output_type) s, (output_type) b.x), func ((output_type) s, (output_type) b.y), func ((output_type) s, (output_type) b.z)); \
  758. } \
  759. __device__ __forceinline__ output_type ## 4 func_name(const input_type ## 4 & a, scalar_type s) \
  760. { \
  761. return VecTraits<output_type ## 4>::make(func ((output_type) a.x, (output_type) s), func ((output_type) a.y, (output_type) s), func ((output_type) a.z, (output_type) s), func ((output_type) a.w, (output_type) s)); \
  762. } \
  763. __device__ __forceinline__ output_type ## 4 func_name(scalar_type s, const input_type ## 4 & b) \
  764. { \
  765. return VecTraits<output_type ## 4>::make(func ((output_type) s, (output_type) b.x), func ((output_type) s, (output_type) b.y), func ((output_type) s, (output_type) b.z), func ((output_type) s, (output_type) b.w)); \
  766. }
  767. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, uchar, uchar, uchar)
  768. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, uchar, float, float)
  769. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, uchar, double, double)
  770. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, char, char, char)
  771. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, char, float, float)
  772. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, char, double, double)
  773. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, ushort, ushort, ushort)
  774. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, ushort, float, float)
  775. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, ushort, double, double)
  776. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, short, short, short)
  777. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, short, float, float)
  778. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, short, double, double)
  779. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, uint, uint, uint)
  780. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, uint, float, float)
  781. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, uint, double, double)
  782. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, int, int, int)
  783. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, int, float, float)
  784. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, int, double, double)
  785. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, float, float, float)
  786. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, float, double, double)
  787. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, double, double, double)
  788. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, uchar, uchar, uchar)
  789. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, uchar, float, float)
  790. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, uchar, double, double)
  791. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, char, char, char)
  792. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, char, float, float)
  793. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, char, double, double)
  794. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, ushort, ushort, ushort)
  795. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, ushort, float, float)
  796. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, ushort, double, double)
  797. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, short, short, short)
  798. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, short, float, float)
  799. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, short, double, double)
  800. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, uint, uint, uint)
  801. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, uint, float, float)
  802. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, uint, double, double)
  803. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, int, int, int)
  804. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, int, float, float)
  805. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, int, double, double)
  806. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, float, float, float)
  807. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, float, double, double)
  808. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, double, double, double)
  809. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, uchar, float, float)
  810. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, uchar, double, double)
  811. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, char, float, float)
  812. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, char, double, double)
  813. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, ushort, float, float)
  814. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, ushort, double, double)
  815. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, short, float, float)
  816. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, short, double, double)
  817. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, uint, float, float)
  818. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, uint, double, double)
  819. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, int, float, float)
  820. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, int, double, double)
  821. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, float, float, float)
  822. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, float, double, double)
  823. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, double, double, double)
  824. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, uchar, float, float)
  825. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, uchar, double, double)
  826. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, char, float, float)
  827. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, char, double, double)
  828. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, ushort, float, float)
  829. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, ushort, double, double)
  830. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, short, float, float)
  831. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, short, double, double)
  832. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, uint, float, float)
  833. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, uint, double, double)
  834. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, int, float, float)
  835. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, int, double, double)
  836. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, float, float, float)
  837. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, float, double, double)
  838. CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, double, double, double)
  839. #undef CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC
  840. //! @}
  841. }}
  842. #endif