template<typename _Tp> int set(int i, const _Tp& value)
{ return set(i, &value, sizeof(value)); }
- template<typename _Tp0>
- Kernel& args(const _Tp0& a0)
- {
- set(0, a0); return *this;
- }
-
- template<typename _Tp0, typename _Tp1>
- Kernel& args(const _Tp0& a0, const _Tp1& a1)
- {
- int i = set(0, a0); set(i, a1); return *this;
- }
- template<typename _Tp0, typename _Tp1, typename _Tp2>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
- {
- int i = set(0, a0); i = set(i, a1); set(i, a2); return *this;
- }
+protected:
+ template<typename _Tp0> inline
+ int set_args_(int i, const _Tp0& a0) { return set(i, a0); }
+ template<typename _Tp0, typename... _Tps> inline
+ int set_args_(int i, const _Tp0& a0, const _Tps&... rest_args) { i = set(i, a0); return set_args_(i, rest_args...); }
+public:
+ /** @brief Setup OpenCL Kernel arguments.
+ Avoid direct using of set(i, ...) methods.
+ @code
+ bool ok = kernel
+ .args(
+ srcUMat, dstUMat,
+ (float)some_float_param
+ ).run(ndims, globalSize, localSize);
+ if (!ok) return false;
+ @endcode
+ */
+ template<typename... _Tps> inline
+ Kernel& args(const _Tps&... kernel_args) { set_args_(0, kernel_args...); return *this; }
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); return *this;
- }
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
- const _Tp3& a3, const _Tp4& a4)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2);
- i = set(i, a3); set(i, a4); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2,
- typename _Tp3, typename _Tp4, typename _Tp5>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
- const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2);
- i = set(i, a3); i = set(i, a4); set(i, a5); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
- i = set(i, a4); i = set(i, a5); set(i, a6); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
- i = set(i, a4); i = set(i, a5); i = set(i, a6); set(i, a7); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
- typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
- i = set(i, a5); i = set(i, a6); i = set(i, a7); set(i, a8); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
- typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); set(i, a9); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); set(i, a10); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); set(i, a11); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- set(i, a12); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
- typename _Tp13>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12, const _Tp13& a13)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- i = set(i, a12); set(i, a13); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
- typename _Tp13, typename _Tp14>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12, const _Tp13& a13, const _Tp14& a14)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- i = set(i, a12); i = set(i, a13); set(i, a14); return *this;
- }
-
- template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
- typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
- typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
- typename _Tp13, typename _Tp14, typename _Tp15>
- Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
- const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
- const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
- const _Tp12& a12, const _Tp13& a13, const _Tp14& a14, const _Tp15& a15)
- {
- int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
- i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
- i = set(i, a12); i = set(i, a13); i = set(i, a14); set(i, a15); return *this;
- }
/** @brief Run the OpenCL kernel.
@param dims the work problem dimensions. It is the length of globalsize and localsize. It can be either 1, 2 or 3.
@param globalsize work items for each dimension. It is not the final globalsize passed to