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) 2013, OpenCV Foundation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 //   * Redistribution's of source code must retain the above copyright notice,
20 //     this list of conditions and the following disclaimer.
21 //
22 //   * Redistribution's in binary form must reproduce the above copyright notice,
23 //     this list of conditions and the following disclaimer in the documentation
24 //     and/or other materials provided with the distribution.
25 //
26 //   * The name of the copyright holders may not be used to endorse or promote products
27 //     derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the OpenCV Foundation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41 
42 #ifndef __OPENCV_OPENCL_HPP__
43 #define __OPENCV_OPENCL_HPP__
44 
45 #include "opencv2/core.hpp"
46 
47 namespace cv { namespace ocl {
48 
49 //! @addtogroup core_opencl
50 //! @{
51 
52 CV_EXPORTS_W bool haveOpenCL();
53 CV_EXPORTS_W bool useOpenCL();
54 CV_EXPORTS_W bool haveAmdBlas();
55 CV_EXPORTS_W bool haveAmdFft();
56 CV_EXPORTS_W void setUseOpenCL(bool flag);
57 CV_EXPORTS_W void finish();
58 
59 CV_EXPORTS bool haveSVM();
60 
61 class CV_EXPORTS Context;
62 class CV_EXPORTS Device;
63 class CV_EXPORTS Kernel;
64 class CV_EXPORTS Program;
65 class CV_EXPORTS ProgramSource;
66 class CV_EXPORTS Queue;
67 class CV_EXPORTS PlatformInfo;
68 class CV_EXPORTS Image2D;
69 
70 class CV_EXPORTS Device
71 {
72 public:
73     Device();
74     explicit Device(void* d);
75     Device(const Device& d);
76     Device& operator = (const Device& d);
77     ~Device();
78 
79     void set(void* d);
80 
81     enum
82     {
83         TYPE_DEFAULT     = (1 << 0),
84         TYPE_CPU         = (1 << 1),
85         TYPE_GPU         = (1 << 2),
86         TYPE_ACCELERATOR = (1 << 3),
87         TYPE_DGPU        = TYPE_GPU + (1 << 16),
88         TYPE_IGPU        = TYPE_GPU + (1 << 17),
89         TYPE_ALL         = 0xFFFFFFFF
90     };
91 
92     String name() const;
93     String extensions() const;
94     String version() const;
95     String vendorName() const;
96     String OpenCL_C_Version() const;
97     String OpenCLVersion() const;
98     int deviceVersionMajor() const;
99     int deviceVersionMinor() const;
100     String driverVersion() const;
101     void* ptr() const;
102 
103     int type() const;
104 
105     int addressBits() const;
106     bool available() const;
107     bool compilerAvailable() const;
108     bool linkerAvailable() const;
109 
110     enum
111     {
112         FP_DENORM=(1 << 0),
113         FP_INF_NAN=(1 << 1),
114         FP_ROUND_TO_NEAREST=(1 << 2),
115         FP_ROUND_TO_ZERO=(1 << 3),
116         FP_ROUND_TO_INF=(1 << 4),
117         FP_FMA=(1 << 5),
118         FP_SOFT_FLOAT=(1 << 6),
119         FP_CORRECTLY_ROUNDED_DIVIDE_SQRT=(1 << 7)
120     };
121     int doubleFPConfig() const;
122     int singleFPConfig() const;
123     int halfFPConfig() const;
124 
125     bool endianLittle() const;
126     bool errorCorrectionSupport() const;
127 
128     enum
129     {
130         EXEC_KERNEL=(1 << 0),
131         EXEC_NATIVE_KERNEL=(1 << 1)
132     };
133     int executionCapabilities() const;
134 
135     size_t globalMemCacheSize() const;
136 
137     enum
138     {
139         NO_CACHE=0,
140         READ_ONLY_CACHE=1,
141         READ_WRITE_CACHE=2
142     };
143     int globalMemCacheType() const;
144     int globalMemCacheLineSize() const;
145     size_t globalMemSize() const;
146 
147     size_t localMemSize() const;
148     enum
149     {
150         NO_LOCAL_MEM=0,
151         LOCAL_IS_LOCAL=1,
152         LOCAL_IS_GLOBAL=2
153     };
154     int localMemType() const;
155     bool hostUnifiedMemory() const;
156 
157     bool imageSupport() const;
158 
159     bool imageFromBufferSupport() const;
160     uint imagePitchAlignment() const;
161     uint imageBaseAddressAlignment() const;
162 
163     size_t image2DMaxWidth() const;
164     size_t image2DMaxHeight() const;
165 
166     size_t image3DMaxWidth() const;
167     size_t image3DMaxHeight() const;
168     size_t image3DMaxDepth() const;
169 
170     size_t imageMaxBufferSize() const;
171     size_t imageMaxArraySize() const;
172 
173     enum
174     {
175         UNKNOWN_VENDOR=0,
176         VENDOR_AMD=1,
177         VENDOR_INTEL=2,
178         VENDOR_NVIDIA=3
179     };
180     int vendorID() const;
181     // FIXIT
182     // dev.isAMD() doesn't work for OpenCL CPU devices from AMD OpenCL platform.
183     // This method should use platform name instead of vendor name.
184     // After fix restore code in arithm.cpp: ocl_compare()
isAMD() const185     inline bool isAMD() const { return vendorID() == VENDOR_AMD; }
isIntel() const186     inline bool isIntel() const { return vendorID() == VENDOR_INTEL; }
isNVidia() const187     inline bool isNVidia() const { return vendorID() == VENDOR_NVIDIA; }
188 
189     int maxClockFrequency() const;
190     int maxComputeUnits() const;
191     int maxConstantArgs() const;
192     size_t maxConstantBufferSize() const;
193 
194     size_t maxMemAllocSize() const;
195     size_t maxParameterSize() const;
196 
197     int maxReadImageArgs() const;
198     int maxWriteImageArgs() const;
199     int maxSamplers() const;
200 
201     size_t maxWorkGroupSize() const;
202     int maxWorkItemDims() const;
203     void maxWorkItemSizes(size_t*) const;
204 
205     int memBaseAddrAlign() const;
206 
207     int nativeVectorWidthChar() const;
208     int nativeVectorWidthShort() const;
209     int nativeVectorWidthInt() const;
210     int nativeVectorWidthLong() const;
211     int nativeVectorWidthFloat() const;
212     int nativeVectorWidthDouble() const;
213     int nativeVectorWidthHalf() const;
214 
215     int preferredVectorWidthChar() const;
216     int preferredVectorWidthShort() const;
217     int preferredVectorWidthInt() const;
218     int preferredVectorWidthLong() const;
219     int preferredVectorWidthFloat() const;
220     int preferredVectorWidthDouble() const;
221     int preferredVectorWidthHalf() const;
222 
223     size_t printfBufferSize() const;
224     size_t profilingTimerResolution() const;
225 
226     static const Device& getDefault();
227 
228 protected:
229     struct Impl;
230     Impl* p;
231 };
232 
233 
234 class CV_EXPORTS Context
235 {
236 public:
237     Context();
238     explicit Context(int dtype);
239     ~Context();
240     Context(const Context& c);
241     Context& operator = (const Context& c);
242 
243     bool create();
244     bool create(int dtype);
245     size_t ndevices() const;
246     const Device& device(size_t idx) const;
247     Program getProg(const ProgramSource& prog,
248                     const String& buildopt, String& errmsg);
249 
250     static Context& getDefault(bool initialize = true);
251     void* ptr() const;
252 
253     friend void initializeContextFromHandle(Context& ctx, void* platform, void* context, void* device);
254 
255     bool useSVM() const;
256     void setUseSVM(bool enabled);
257 
258     struct Impl;
259     Impl* p;
260 };
261 
262 class CV_EXPORTS Platform
263 {
264 public:
265     Platform();
266     ~Platform();
267     Platform(const Platform& p);
268     Platform& operator = (const Platform& p);
269 
270     void* ptr() const;
271     static Platform& getDefault();
272 
273     friend void initializeContextFromHandle(Context& ctx, void* platform, void* context, void* device);
274 protected:
275     struct Impl;
276     Impl* p;
277 };
278 
279 // TODO Move to internal header
280 void initializeContextFromHandle(Context& ctx, void* platform, void* context, void* device);
281 
282 class CV_EXPORTS Queue
283 {
284 public:
285     Queue();
286     explicit Queue(const Context& c, const Device& d=Device());
287     ~Queue();
288     Queue(const Queue& q);
289     Queue& operator = (const Queue& q);
290 
291     bool create(const Context& c=Context(), const Device& d=Device());
292     void finish();
293     void* ptr() const;
294     static Queue& getDefault();
295 
296 protected:
297     struct Impl;
298     Impl* p;
299 };
300 
301 
302 class CV_EXPORTS KernelArg
303 {
304 public:
305     enum { LOCAL=1, READ_ONLY=2, WRITE_ONLY=4, READ_WRITE=6, CONSTANT=8, PTR_ONLY = 16, NO_SIZE=256 };
306     KernelArg(int _flags, UMat* _m, int wscale=1, int iwscale=1, const void* _obj=0, size_t _sz=0);
307     KernelArg();
308 
Local()309     static KernelArg Local() { return KernelArg(LOCAL, 0); }
PtrWriteOnly(const UMat & m)310     static KernelArg PtrWriteOnly(const UMat& m)
311     { return KernelArg(PTR_ONLY+WRITE_ONLY, (UMat*)&m); }
PtrReadOnly(const UMat & m)312     static KernelArg PtrReadOnly(const UMat& m)
313     { return KernelArg(PTR_ONLY+READ_ONLY, (UMat*)&m); }
PtrReadWrite(const UMat & m)314     static KernelArg PtrReadWrite(const UMat& m)
315     { return KernelArg(PTR_ONLY+READ_WRITE, (UMat*)&m); }
ReadWrite(const UMat & m,int wscale=1,int iwscale=1)316     static KernelArg ReadWrite(const UMat& m, int wscale=1, int iwscale=1)
317     { return KernelArg(READ_WRITE, (UMat*)&m, wscale, iwscale); }
ReadWriteNoSize(const UMat & m,int wscale=1,int iwscale=1)318     static KernelArg ReadWriteNoSize(const UMat& m, int wscale=1, int iwscale=1)
319     { return KernelArg(READ_WRITE+NO_SIZE, (UMat*)&m, wscale, iwscale); }
ReadOnly(const UMat & m,int wscale=1,int iwscale=1)320     static KernelArg ReadOnly(const UMat& m, int wscale=1, int iwscale=1)
321     { return KernelArg(READ_ONLY, (UMat*)&m, wscale, iwscale); }
WriteOnly(const UMat & m,int wscale=1,int iwscale=1)322     static KernelArg WriteOnly(const UMat& m, int wscale=1, int iwscale=1)
323     { return KernelArg(WRITE_ONLY, (UMat*)&m, wscale, iwscale); }
ReadOnlyNoSize(const UMat & m,int wscale=1,int iwscale=1)324     static KernelArg ReadOnlyNoSize(const UMat& m, int wscale=1, int iwscale=1)
325     { return KernelArg(READ_ONLY+NO_SIZE, (UMat*)&m, wscale, iwscale); }
WriteOnlyNoSize(const UMat & m,int wscale=1,int iwscale=1)326     static KernelArg WriteOnlyNoSize(const UMat& m, int wscale=1, int iwscale=1)
327     { return KernelArg(WRITE_ONLY+NO_SIZE, (UMat*)&m, wscale, iwscale); }
328     static KernelArg Constant(const Mat& m);
Constant(const _Tp * arr,size_t n)329     template<typename _Tp> static KernelArg Constant(const _Tp* arr, size_t n)
330     { return KernelArg(CONSTANT, 0, 1, 1, (void*)arr, n); }
331 
332     int flags;
333     UMat* m;
334     const void* obj;
335     size_t sz;
336     int wscale, iwscale;
337 };
338 
339 
340 class CV_EXPORTS Kernel
341 {
342 public:
343     Kernel();
344     Kernel(const char* kname, const Program& prog);
345     Kernel(const char* kname, const ProgramSource& prog,
346            const String& buildopts = String(), String* errmsg=0);
347     ~Kernel();
348     Kernel(const Kernel& k);
349     Kernel& operator = (const Kernel& k);
350 
351     bool empty() const;
352     bool create(const char* kname, const Program& prog);
353     bool create(const char* kname, const ProgramSource& prog,
354                 const String& buildopts, String* errmsg=0);
355 
356     int set(int i, const void* value, size_t sz);
357     int set(int i, const Image2D& image2D);
358     int set(int i, const UMat& m);
359     int set(int i, const KernelArg& arg);
set(int i,const _Tp & value)360     template<typename _Tp> int set(int i, const _Tp& value)
361     { return set(i, &value, sizeof(value)); }
362 
363     template<typename _Tp0>
args(const _Tp0 & a0)364     Kernel& args(const _Tp0& a0)
365     {
366         set(0, a0); return *this;
367     }
368 
369     template<typename _Tp0, typename _Tp1>
args(const _Tp0 & a0,const _Tp1 & a1)370     Kernel& args(const _Tp0& a0, const _Tp1& a1)
371     {
372         int i = set(0, a0); set(i, a1); return *this;
373     }
374 
375     template<typename _Tp0, typename _Tp1, typename _Tp2>
args(const _Tp0 & a0,const _Tp1 & a1,const _Tp2 & a2)376     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
377     {
378         int i = set(0, a0); i = set(i, a1); set(i, a2); return *this;
379     }
380 
381     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
args(const _Tp0 & a0,const _Tp1 & a1,const _Tp2 & a2,const _Tp3 & a3)382     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
383     {
384         int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); return *this;
385     }
386 
387     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
args(const _Tp0 & a0,const _Tp1 & a1,const _Tp2 & a2,const _Tp3 & a3,const _Tp4 & a4)388     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
389                  const _Tp3& a3, const _Tp4& a4)
390     {
391         int i = set(0, a0); i = set(i, a1); i = set(i, a2);
392         i = set(i, a3); set(i, a4); return *this;
393     }
394 
395     template<typename _Tp0, typename _Tp1, typename _Tp2,
396              typename _Tp3, typename _Tp4, typename _Tp5>
args(const _Tp0 & a0,const _Tp1 & a1,const _Tp2 & a2,const _Tp3 & a3,const _Tp4 & a4,const _Tp5 & a5)397     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
398                  const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
399     {
400         int i = set(0, a0); i = set(i, a1); i = set(i, a2);
401         i = set(i, a3); i = set(i, a4); set(i, a5); return *this;
402     }
403 
404     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
405              typename _Tp4, typename _Tp5, typename _Tp6>
args(const _Tp0 & a0,const _Tp1 & a1,const _Tp2 & a2,const _Tp3 & a3,const _Tp4 & a4,const _Tp5 & a5,const _Tp6 & a6)406     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
407                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
408     {
409         int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
410         i = set(i, a4); i = set(i, a5); set(i, a6); return *this;
411     }
412 
413     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
414              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
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)415     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
416                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
417     {
418         int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
419         i = set(i, a4); i = set(i, a5); i = set(i, a6); set(i, a7); return *this;
420     }
421 
422     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
423              typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
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)424     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
425                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
426                  const _Tp8& a8)
427     {
428         int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
429         i = set(i, a5); i = set(i, a6); i = set(i, a7); set(i, a8); return *this;
430     }
431 
432     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
433              typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
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)434     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
435                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
436                  const _Tp8& a8, const _Tp9& a9)
437     {
438         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);
439         i = set(i, a6); i = set(i, a7); i = set(i, a8); set(i, a9); return *this;
440     }
441 
442     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
443              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
444              typename _Tp8, typename _Tp9, typename _Tp10>
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)445     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
446                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
447                  const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
448     {
449         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);
450         i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); set(i, a10); return *this;
451     }
452 
453     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
454              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
455              typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
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)456     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
457                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
458                  const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
459     {
460         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);
461         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;
462     }
463 
464     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
465              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
466              typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12>
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)467     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
468                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
469                  const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
470                  const _Tp12& a12)
471     {
472         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);
473         i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
474         set(i, a12); return *this;
475     }
476 
477     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
478              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
479              typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
480              typename _Tp13>
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)481     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
482                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
483                  const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
484                  const _Tp12& a12, const _Tp13& a13)
485     {
486         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);
487         i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
488         i = set(i, a12); set(i, a13); return *this;
489     }
490 
491     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
492              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
493              typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
494              typename _Tp13, typename _Tp14>
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)495     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
496                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
497                  const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
498                  const _Tp12& a12, const _Tp13& a13, const _Tp14& a14)
499     {
500         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);
501         i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
502         i = set(i, a12); i = set(i, a13); set(i, a14); return *this;
503     }
504 
505     template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
506              typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
507              typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
508              typename _Tp13, typename _Tp14, typename _Tp15>
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)509     Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
510                  const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
511                  const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
512                  const _Tp12& a12, const _Tp13& a13, const _Tp14& a14, const _Tp15& a15)
513     {
514         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);
515         i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
516         i = set(i, a12); i = set(i, a13); i = set(i, a14); set(i, a15); return *this;
517     }
518 
519     bool run(int dims, size_t globalsize[],
520              size_t localsize[], bool sync, const Queue& q=Queue());
521     bool runTask(bool sync, const Queue& q=Queue());
522 
523     size_t workGroupSize() const;
524     size_t preferedWorkGroupSizeMultiple() const;
525     bool compileWorkGroupSize(size_t wsz[]) const;
526     size_t localMemSize() const;
527 
528     void* ptr() const;
529     struct Impl;
530 
531 protected:
532     Impl* p;
533 };
534 
535 class CV_EXPORTS Program
536 {
537 public:
538     Program();
539     Program(const ProgramSource& src,
540             const String& buildflags, String& errmsg);
541     explicit Program(const String& buf);
542     Program(const Program& prog);
543 
544     Program& operator = (const Program& prog);
545     ~Program();
546 
547     bool create(const ProgramSource& src,
548                 const String& buildflags, String& errmsg);
549     bool read(const String& buf, const String& buildflags);
550     bool write(String& buf) const;
551 
552     const ProgramSource& source() const;
553     void* ptr() const;
554 
555     String getPrefix() const;
556     static String getPrefix(const String& buildflags);
557 
558 protected:
559     struct Impl;
560     Impl* p;
561 };
562 
563 
564 class CV_EXPORTS ProgramSource
565 {
566 public:
567     typedef uint64 hash_t;
568 
569     ProgramSource();
570     explicit ProgramSource(const String& prog);
571     explicit ProgramSource(const char* prog);
572     ~ProgramSource();
573     ProgramSource(const ProgramSource& prog);
574     ProgramSource& operator = (const ProgramSource& prog);
575 
576     const String& source() const;
577     hash_t hash() const;
578 
579 protected:
580     struct Impl;
581     Impl* p;
582 };
583 
584 class CV_EXPORTS PlatformInfo
585 {
586 public:
587     PlatformInfo();
588     explicit PlatformInfo(void* id);
589     ~PlatformInfo();
590 
591     PlatformInfo(const PlatformInfo& i);
592     PlatformInfo& operator =(const PlatformInfo& i);
593 
594     String name() const;
595     String vendor() const;
596     String version() const;
597     int deviceNumber() const;
598     void getDevice(Device& device, int d) const;
599 
600 protected:
601     struct Impl;
602     Impl* p;
603 };
604 
605 CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf);
606 CV_EXPORTS const char* typeToStr(int t);
607 CV_EXPORTS const char* memopTypeToStr(int t);
608 CV_EXPORTS const char* vecopTypeToStr(int t);
609 CV_EXPORTS String kernelToStr(InputArray _kernel, int ddepth = -1, const char * name = NULL);
610 CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInfo>& platform_info);
611 
612 
613 enum OclVectorStrategy
614 {
615     // all matrices have its own vector width
616     OCL_VECTOR_OWN = 0,
617     // all matrices have maximal vector width among all matrices
618     // (useful for cases when matrices have different data types)
619     OCL_VECTOR_MAX = 1,
620 
621     // default strategy
622     OCL_VECTOR_DEFAULT = OCL_VECTOR_OWN
623 };
624 
625 CV_EXPORTS int predictOptimalVectorWidth(InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(),
626                                          InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(),
627                                          InputArray src7 = noArray(), InputArray src8 = noArray(), InputArray src9 = noArray(),
628                                          OclVectorStrategy strat = OCL_VECTOR_DEFAULT);
629 
630 CV_EXPORTS int checkOptimalVectorWidth(const int *vectorWidths,
631                                        InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(),
632                                        InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(),
633                                        InputArray src7 = noArray(), InputArray src8 = noArray(), InputArray src9 = noArray(),
634                                        OclVectorStrategy strat = OCL_VECTOR_DEFAULT);
635 
636 // with OCL_VECTOR_MAX strategy
637 CV_EXPORTS int predictOptimalVectorWidthMax(InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(),
638                                             InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(),
639                                             InputArray src7 = noArray(), InputArray src8 = noArray(), InputArray src9 = noArray());
640 
641 CV_EXPORTS void buildOptionsAddMatrixDescription(String& buildOptions, const String& name, InputArray _m);
642 
643 class CV_EXPORTS Image2D
644 {
645 public:
646     Image2D();
647 
648     // src:     The UMat from which to get image properties and data
649     // norm:    Flag to enable the use of normalized channel data types
650     // alias:   Flag indicating that the image should alias the src UMat.
651     //          If true, changes to the image or src will be reflected in
652     //          both objects.
653     explicit Image2D(const UMat &src, bool norm = false, bool alias = false);
654     Image2D(const Image2D & i);
655     ~Image2D();
656 
657     Image2D & operator = (const Image2D & i);
658 
659     // Indicates if creating an aliased image should succeed.  Depends on the
660     // underlying platform and the dimensions of the UMat.
661     static bool canCreateAlias(const UMat &u);
662 
663     // Indicates if the image format is supported.
664     static bool isFormatSupported(int depth, int cn, bool norm);
665 
666     void* ptr() const;
667 protected:
668     struct Impl;
669     Impl* p;
670 };
671 
672 
673 CV_EXPORTS MatAllocator* getOpenCLAllocator();
674 
675 
676 #ifdef __OPENCV_BUILD
677 namespace internal {
678 
679 CV_EXPORTS bool isPerformanceCheckBypassed();
680 #define OCL_PERFORMANCE_CHECK(condition) (cv::ocl::internal::isPerformanceCheckBypassed() || (condition))
681 
682 CV_EXPORTS bool isCLBuffer(UMat& u);
683 
684 } // namespace internal
685 #endif
686 
687 //! @}
688 
689 }}
690 
691 #endif
692