xref: /aosp_15_r20/external/mesa3d/include/CL/cl.hpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker //
2*61046927SAndroid Build Coastguard Worker // Copyright (c) 2008-2020 The Khronos Group Inc.
3*61046927SAndroid Build Coastguard Worker //
4*61046927SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*61046927SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*61046927SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*61046927SAndroid Build Coastguard Worker //
8*61046927SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
9*61046927SAndroid Build Coastguard Worker //
10*61046927SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*61046927SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*61046927SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*61046927SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*61046927SAndroid Build Coastguard Worker // limitations under the License.
15*61046927SAndroid Build Coastguard Worker //
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker /*! \file
18*61046927SAndroid Build Coastguard Worker  *
19*61046927SAndroid Build Coastguard Worker  *   \brief C++ bindings for OpenCL 1.0 (rev 48), OpenCL 1.1 (rev 33) and
20*61046927SAndroid Build Coastguard Worker  *       OpenCL 1.2 (rev 15)
21*61046927SAndroid Build Coastguard Worker  *   \author Benedict R. Gaster, Laurent Morichetti and Lee Howes
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  *   Additions and fixes from:
24*61046927SAndroid Build Coastguard Worker  *       Brian Cole, March 3rd 2010 and April 2012
25*61046927SAndroid Build Coastguard Worker  *       Matt Gruenke, April 2012.
26*61046927SAndroid Build Coastguard Worker  *       Bruce Merry, February 2013.
27*61046927SAndroid Build Coastguard Worker  *       Tom Deakin and Simon McIntosh-Smith, July 2013
28*61046927SAndroid Build Coastguard Worker  *
29*61046927SAndroid Build Coastguard Worker  *   \version 1.2.9
30*61046927SAndroid Build Coastguard Worker  *   \date December 2015
31*61046927SAndroid Build Coastguard Worker  *
32*61046927SAndroid Build Coastguard Worker  *   Optional extension support
33*61046927SAndroid Build Coastguard Worker  *
34*61046927SAndroid Build Coastguard Worker  *         cl
35*61046927SAndroid Build Coastguard Worker  *         cl_ext_device_fission
36*61046927SAndroid Build Coastguard Worker  *				#define USE_CL_DEVICE_FISSION
37*61046927SAndroid Build Coastguard Worker  */
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker /*! \mainpage
40*61046927SAndroid Build Coastguard Worker  * \section intro Introduction
41*61046927SAndroid Build Coastguard Worker  * For many large applications C++ is the language of choice and so it seems
42*61046927SAndroid Build Coastguard Worker  * reasonable to define C++ bindings for OpenCL.
43*61046927SAndroid Build Coastguard Worker  *
44*61046927SAndroid Build Coastguard Worker  *
45*61046927SAndroid Build Coastguard Worker  * The interface is contained with a single C++ header file \em cl.hpp and all
46*61046927SAndroid Build Coastguard Worker  * definitions are contained within the namespace \em cl. There is no additional
47*61046927SAndroid Build Coastguard Worker  * requirement to include \em cl.h and to use either the C++ or original C
48*61046927SAndroid Build Coastguard Worker  * bindings it is enough to simply include \em cl.hpp.
49*61046927SAndroid Build Coastguard Worker  *
50*61046927SAndroid Build Coastguard Worker  * The bindings themselves are lightweight and correspond closely to the
51*61046927SAndroid Build Coastguard Worker  * underlying C API. Using the C++ bindings introduces no additional execution
52*61046927SAndroid Build Coastguard Worker  * overhead.
53*61046927SAndroid Build Coastguard Worker  *
54*61046927SAndroid Build Coastguard Worker  * For detail documentation on the bindings see:
55*61046927SAndroid Build Coastguard Worker  *
56*61046927SAndroid Build Coastguard Worker  * The OpenCL C++ Wrapper API 1.2 (revision 09)
57*61046927SAndroid Build Coastguard Worker  *  http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf
58*61046927SAndroid Build Coastguard Worker  *
59*61046927SAndroid Build Coastguard Worker  * \section example Example
60*61046927SAndroid Build Coastguard Worker  *
61*61046927SAndroid Build Coastguard Worker  * The following example shows a general use case for the C++
62*61046927SAndroid Build Coastguard Worker  * bindings, including support for the optional exception feature and
63*61046927SAndroid Build Coastguard Worker  * also the supplied vector and string classes, see following sections for
64*61046927SAndroid Build Coastguard Worker  * decriptions of these features.
65*61046927SAndroid Build Coastguard Worker  *
66*61046927SAndroid Build Coastguard Worker  * \code
67*61046927SAndroid Build Coastguard Worker  * #define __CL_ENABLE_EXCEPTIONS
68*61046927SAndroid Build Coastguard Worker  *
69*61046927SAndroid Build Coastguard Worker  * #if defined(__APPLE__) || defined(__MACOSX)
70*61046927SAndroid Build Coastguard Worker  * #include <OpenCL/cl.hpp>
71*61046927SAndroid Build Coastguard Worker  * #else
72*61046927SAndroid Build Coastguard Worker  * #include <CL/cl.hpp>
73*61046927SAndroid Build Coastguard Worker  * #endif
74*61046927SAndroid Build Coastguard Worker  * #include <cstdio>
75*61046927SAndroid Build Coastguard Worker  * #include <cstdlib>
76*61046927SAndroid Build Coastguard Worker  * #include <iostream>
77*61046927SAndroid Build Coastguard Worker  *
78*61046927SAndroid Build Coastguard Worker  *  const char * helloStr  = "__kernel void "
79*61046927SAndroid Build Coastguard Worker  *                           "hello(void) "
80*61046927SAndroid Build Coastguard Worker  *                           "{ "
81*61046927SAndroid Build Coastguard Worker  *                           "  "
82*61046927SAndroid Build Coastguard Worker  *                           "} ";
83*61046927SAndroid Build Coastguard Worker  *
84*61046927SAndroid Build Coastguard Worker  *  int
85*61046927SAndroid Build Coastguard Worker  *  main(void)
86*61046927SAndroid Build Coastguard Worker  *  {
87*61046927SAndroid Build Coastguard Worker  *     cl_int err = CL_SUCCESS;
88*61046927SAndroid Build Coastguard Worker  *     try {
89*61046927SAndroid Build Coastguard Worker  *
90*61046927SAndroid Build Coastguard Worker  *       std::vector<cl::Platform> platforms;
91*61046927SAndroid Build Coastguard Worker  *       cl::Platform::get(&platforms);
92*61046927SAndroid Build Coastguard Worker  *       if (platforms.size() == 0) {
93*61046927SAndroid Build Coastguard Worker  *           std::cout << "Platform size 0\n";
94*61046927SAndroid Build Coastguard Worker  *           return -1;
95*61046927SAndroid Build Coastguard Worker  *       }
96*61046927SAndroid Build Coastguard Worker  *
97*61046927SAndroid Build Coastguard Worker  *       cl_context_properties properties[] =
98*61046927SAndroid Build Coastguard Worker  *          { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
99*61046927SAndroid Build Coastguard Worker  *       cl::Context context(CL_DEVICE_TYPE_CPU, properties);
100*61046927SAndroid Build Coastguard Worker  *
101*61046927SAndroid Build Coastguard Worker  *       std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
102*61046927SAndroid Build Coastguard Worker  *
103*61046927SAndroid Build Coastguard Worker  *       cl::Program::Sources source(1,
104*61046927SAndroid Build Coastguard Worker  *           std::make_pair(helloStr,strlen(helloStr)));
105*61046927SAndroid Build Coastguard Worker  *       cl::Program program_ = cl::Program(context, source);
106*61046927SAndroid Build Coastguard Worker  *       program_.build(devices);
107*61046927SAndroid Build Coastguard Worker  *
108*61046927SAndroid Build Coastguard Worker  *       cl::Kernel kernel(program_, "hello", &err);
109*61046927SAndroid Build Coastguard Worker  *
110*61046927SAndroid Build Coastguard Worker  *       cl::Event event;
111*61046927SAndroid Build Coastguard Worker  *       cl::CommandQueue queue(context, devices[0], 0, &err);
112*61046927SAndroid Build Coastguard Worker  *       queue.enqueueNDRangeKernel(
113*61046927SAndroid Build Coastguard Worker  *           kernel,
114*61046927SAndroid Build Coastguard Worker  *           cl::NullRange,
115*61046927SAndroid Build Coastguard Worker  *           cl::NDRange(4,4),
116*61046927SAndroid Build Coastguard Worker  *           cl::NullRange,
117*61046927SAndroid Build Coastguard Worker  *           NULL,
118*61046927SAndroid Build Coastguard Worker  *           &event);
119*61046927SAndroid Build Coastguard Worker  *
120*61046927SAndroid Build Coastguard Worker  *       event.wait();
121*61046927SAndroid Build Coastguard Worker  *     }
122*61046927SAndroid Build Coastguard Worker  *     catch (cl::Error err) {
123*61046927SAndroid Build Coastguard Worker  *        std::cerr
124*61046927SAndroid Build Coastguard Worker  *           << "ERROR: "
125*61046927SAndroid Build Coastguard Worker  *           << err.what()
126*61046927SAndroid Build Coastguard Worker  *           << "("
127*61046927SAndroid Build Coastguard Worker  *           << err.err()
128*61046927SAndroid Build Coastguard Worker  *           << ")"
129*61046927SAndroid Build Coastguard Worker  *           << std::endl;
130*61046927SAndroid Build Coastguard Worker  *     }
131*61046927SAndroid Build Coastguard Worker  *
132*61046927SAndroid Build Coastguard Worker  *    return EXIT_SUCCESS;
133*61046927SAndroid Build Coastguard Worker  *  }
134*61046927SAndroid Build Coastguard Worker  *
135*61046927SAndroid Build Coastguard Worker  * \endcode
136*61046927SAndroid Build Coastguard Worker  *
137*61046927SAndroid Build Coastguard Worker  */
138*61046927SAndroid Build Coastguard Worker #ifndef CL_HPP_
139*61046927SAndroid Build Coastguard Worker #define CL_HPP_
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker // The latest version of the OpenCL C++ bindings can be found on GitHub:
142*61046927SAndroid Build Coastguard Worker // -> https://github.com/KhronosGroup/OpenCL-CLHPP
143*61046927SAndroid Build Coastguard Worker #pragma message("This version of the OpenCL Host API C++ bindings is deprecated, please use cl2.hpp instead.")
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker #include <malloc.h>
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker #if defined(USE_DX_INTEROP)
150*61046927SAndroid Build Coastguard Worker #include <CL/cl_d3d10.h>
151*61046927SAndroid Build Coastguard Worker #include <CL/cl_dx9_media_sharing.h>
152*61046927SAndroid Build Coastguard Worker #endif
153*61046927SAndroid Build Coastguard Worker #endif // _WIN32
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker #if defined(_MSC_VER)
156*61046927SAndroid Build Coastguard Worker #include <intrin.h>
157*61046927SAndroid Build Coastguard Worker #endif // _MSC_VER
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker //
160*61046927SAndroid Build Coastguard Worker #if defined(USE_CL_DEVICE_FISSION)
161*61046927SAndroid Build Coastguard Worker #include <CL/cl_ext.h>
162*61046927SAndroid Build Coastguard Worker #endif
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker #if defined(__APPLE__) || defined(__MACOSX)
165*61046927SAndroid Build Coastguard Worker #include <OpenCL/opencl.h>
166*61046927SAndroid Build Coastguard Worker #else
167*61046927SAndroid Build Coastguard Worker #include <CL/opencl.h>
168*61046927SAndroid Build Coastguard Worker #endif // !__APPLE__
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker #if (_MSC_VER >= 1700) || (__cplusplus >= 201103L)
171*61046927SAndroid Build Coastguard Worker #define CL_HPP_RVALUE_REFERENCES_SUPPORTED
172*61046927SAndroid Build Coastguard Worker #define CL_HPP_CPP11_ATOMICS_SUPPORTED
173*61046927SAndroid Build Coastguard Worker #include <atomic>
174*61046927SAndroid Build Coastguard Worker #endif
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker #if (__cplusplus >= 201103L)
177*61046927SAndroid Build Coastguard Worker #define CL_HPP_NOEXCEPT noexcept
178*61046927SAndroid Build Coastguard Worker #else
179*61046927SAndroid Build Coastguard Worker #define CL_HPP_NOEXCEPT
180*61046927SAndroid Build Coastguard Worker #endif
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker // To avoid accidentally taking ownership of core OpenCL types
184*61046927SAndroid Build Coastguard Worker // such as cl_kernel constructors are made explicit
185*61046927SAndroid Build Coastguard Worker // under OpenCL 1.2
186*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
187*61046927SAndroid Build Coastguard Worker #define __CL_EXPLICIT_CONSTRUCTORS explicit
188*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
189*61046927SAndroid Build Coastguard Worker #define __CL_EXPLICIT_CONSTRUCTORS
190*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker // Define deprecated prefixes and suffixes to ensure compilation
193*61046927SAndroid Build Coastguard Worker // in case they are not pre-defined
194*61046927SAndroid Build Coastguard Worker #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
195*61046927SAndroid Build Coastguard Worker #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
196*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
197*61046927SAndroid Build Coastguard Worker #if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED)
198*61046927SAndroid Build Coastguard Worker #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
199*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker #if !defined(CL_CALLBACK)
202*61046927SAndroid Build Coastguard Worker #define CL_CALLBACK
203*61046927SAndroid Build Coastguard Worker #endif //CL_CALLBACK
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker #include <utility>
206*61046927SAndroid Build Coastguard Worker #include <limits>
207*61046927SAndroid Build Coastguard Worker #include <iterator>
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker #if defined(__CL_ENABLE_EXCEPTIONS)
210*61046927SAndroid Build Coastguard Worker #include <exception>
211*61046927SAndroid Build Coastguard Worker #endif // #if defined(__CL_ENABLE_EXCEPTIONS)
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker #if !defined(__NO_STD_VECTOR)
214*61046927SAndroid Build Coastguard Worker #include <vector>
215*61046927SAndroid Build Coastguard Worker #endif
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker #if !defined(__NO_STD_STRING)
218*61046927SAndroid Build Coastguard Worker #include <string>
219*61046927SAndroid Build Coastguard Worker #endif
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(linux) || defined(__APPLE__) || defined(__MACOSX)
222*61046927SAndroid Build Coastguard Worker #include <alloca.h>
223*61046927SAndroid Build Coastguard Worker #endif // linux
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker #include <cstring>
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker // Compiler specific weak linking
228*61046927SAndroid Build Coastguard Worker #ifndef CL_WEAK_ATTRIB_PREFIX
229*61046927SAndroid Build Coastguard Worker // C++17: use inline variables/functions
230*61046927SAndroid Build Coastguard Worker #if __cplusplus >= 201703L
231*61046927SAndroid Build Coastguard Worker #define CL_USE_INLINE
232*61046927SAndroid Build Coastguard Worker #endif
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker #ifdef CL_USE_INLINE
235*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_PREFIX inline
236*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_SUFFIX
237*61046927SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
238*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_PREFIX __declspec(selectany)
239*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_SUFFIX
240*61046927SAndroid Build Coastguard Worker #elif defined(__MINGW32__)
241*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_PREFIX
242*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_SUFFIX __attribute__((selectany))
243*61046927SAndroid Build Coastguard Worker #else // GCC, CLANG, etc.
244*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_PREFIX
245*61046927SAndroid Build Coastguard Worker #define CL_WEAK_ATTRIB_SUFFIX __attribute__((weak))
246*61046927SAndroid Build Coastguard Worker #endif // CL_USE_INLINE
247*61046927SAndroid Build Coastguard Worker 
248*61046927SAndroid Build Coastguard Worker #endif // CL_WEAK_ATTRIB_PREFIX
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker /*! \namespace cl
251*61046927SAndroid Build Coastguard Worker  *
252*61046927SAndroid Build Coastguard Worker  * \brief The OpenCL C++ bindings are defined within this namespace.
253*61046927SAndroid Build Coastguard Worker  *
254*61046927SAndroid Build Coastguard Worker  */
255*61046927SAndroid Build Coastguard Worker namespace cl {
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker class Memory;
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker /**
260*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
261*61046927SAndroid Build Coastguard Worker  */
262*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
263*61046927SAndroid Build Coastguard Worker #define __INIT_CL_EXT_FCN_PTR(name) \
264*61046927SAndroid Build Coastguard Worker     if(!pfn_##name) { \
265*61046927SAndroid Build Coastguard Worker         pfn_##name = (PFN_##name) \
266*61046927SAndroid Build Coastguard Worker             clGetExtensionFunctionAddress(#name); \
267*61046927SAndroid Build Coastguard Worker         if(!pfn_##name) { \
268*61046927SAndroid Build Coastguard Worker         } \
269*61046927SAndroid Build Coastguard Worker     }
270*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
273*61046927SAndroid Build Coastguard Worker #define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \
274*61046927SAndroid Build Coastguard Worker     if(!pfn_##name) { \
275*61046927SAndroid Build Coastguard Worker         pfn_##name = (PFN_##name) \
276*61046927SAndroid Build Coastguard Worker             clGetExtensionFunctionAddressForPlatform(platform, #name); \
277*61046927SAndroid Build Coastguard Worker         if(!pfn_##name) { \
278*61046927SAndroid Build Coastguard Worker         } \
279*61046927SAndroid Build Coastguard Worker     }
280*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker class Program;
283*61046927SAndroid Build Coastguard Worker class Device;
284*61046927SAndroid Build Coastguard Worker class Context;
285*61046927SAndroid Build Coastguard Worker class CommandQueue;
286*61046927SAndroid Build Coastguard Worker class Memory;
287*61046927SAndroid Build Coastguard Worker class Buffer;
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker #if defined(__CL_ENABLE_EXCEPTIONS)
290*61046927SAndroid Build Coastguard Worker /*! \brief Exception class
291*61046927SAndroid Build Coastguard Worker  *
292*61046927SAndroid Build Coastguard Worker  *  This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined.
293*61046927SAndroid Build Coastguard Worker  */
294*61046927SAndroid Build Coastguard Worker class Error : public std::exception
295*61046927SAndroid Build Coastguard Worker {
296*61046927SAndroid Build Coastguard Worker private:
297*61046927SAndroid Build Coastguard Worker     cl_int err_;
298*61046927SAndroid Build Coastguard Worker     const char * errStr_;
299*61046927SAndroid Build Coastguard Worker public:
300*61046927SAndroid Build Coastguard Worker     /*! \brief Create a new CL error exception for a given error code
301*61046927SAndroid Build Coastguard Worker      *  and corresponding message.
302*61046927SAndroid Build Coastguard Worker      *
303*61046927SAndroid Build Coastguard Worker      *  \param err error code value.
304*61046927SAndroid Build Coastguard Worker      *
305*61046927SAndroid Build Coastguard Worker      *  \param errStr a descriptive string that must remain in scope until
306*61046927SAndroid Build Coastguard Worker      *                handling of the exception has concluded.  If set, it
307*61046927SAndroid Build Coastguard Worker      *                will be returned by what().
308*61046927SAndroid Build Coastguard Worker      */
Error(cl_int err,const char * errStr=NULL)309*61046927SAndroid Build Coastguard Worker     Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr)
310*61046927SAndroid Build Coastguard Worker     {}
311*61046927SAndroid Build Coastguard Worker 
~Error()312*61046927SAndroid Build Coastguard Worker     ~Error() throw() {}
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker     /*! \brief Get error string associated with exception
315*61046927SAndroid Build Coastguard Worker      *
316*61046927SAndroid Build Coastguard Worker      * \return A memory pointer to the error message string.
317*61046927SAndroid Build Coastguard Worker      */
what() const318*61046927SAndroid Build Coastguard Worker     virtual const char * what() const throw ()
319*61046927SAndroid Build Coastguard Worker     {
320*61046927SAndroid Build Coastguard Worker         if (errStr_ == NULL) {
321*61046927SAndroid Build Coastguard Worker             return "empty";
322*61046927SAndroid Build Coastguard Worker         }
323*61046927SAndroid Build Coastguard Worker         else {
324*61046927SAndroid Build Coastguard Worker             return errStr_;
325*61046927SAndroid Build Coastguard Worker         }
326*61046927SAndroid Build Coastguard Worker     }
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker     /*! \brief Get error code associated with exception
329*61046927SAndroid Build Coastguard Worker      *
330*61046927SAndroid Build Coastguard Worker      *  \return The error code.
331*61046927SAndroid Build Coastguard Worker      */
err(void) const332*61046927SAndroid Build Coastguard Worker     cl_int err(void) const { return err_; }
333*61046927SAndroid Build Coastguard Worker };
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker #define __ERR_STR(x) #x
336*61046927SAndroid Build Coastguard Worker #else
337*61046927SAndroid Build Coastguard Worker #define __ERR_STR(x) NULL
338*61046927SAndroid Build Coastguard Worker #endif // __CL_ENABLE_EXCEPTIONS
339*61046927SAndroid Build Coastguard Worker 
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker namespace detail
342*61046927SAndroid Build Coastguard Worker {
343*61046927SAndroid Build Coastguard Worker #if defined(__CL_ENABLE_EXCEPTIONS)
errHandler(cl_int err,const char * errStr=NULL)344*61046927SAndroid Build Coastguard Worker static inline cl_int errHandler (
345*61046927SAndroid Build Coastguard Worker     cl_int err,
346*61046927SAndroid Build Coastguard Worker     const char * errStr = NULL)
347*61046927SAndroid Build Coastguard Worker {
348*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
349*61046927SAndroid Build Coastguard Worker         throw Error(err, errStr);
350*61046927SAndroid Build Coastguard Worker     }
351*61046927SAndroid Build Coastguard Worker     return err;
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker #else
354*61046927SAndroid Build Coastguard Worker static inline cl_int errHandler (cl_int err, const char * errStr = NULL)
355*61046927SAndroid Build Coastguard Worker {
356*61046927SAndroid Build Coastguard Worker     (void) errStr; // suppress unused variable warning
357*61046927SAndroid Build Coastguard Worker     return err;
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker #endif // __CL_ENABLE_EXCEPTIONS
360*61046927SAndroid Build Coastguard Worker }
361*61046927SAndroid Build Coastguard Worker 
362*61046927SAndroid Build Coastguard Worker 
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker //! \cond DOXYGEN_DETAIL
365*61046927SAndroid Build Coastguard Worker #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
366*61046927SAndroid Build Coastguard Worker #define __GET_DEVICE_INFO_ERR               __ERR_STR(clGetDeviceInfo)
367*61046927SAndroid Build Coastguard Worker #define __GET_PLATFORM_INFO_ERR             __ERR_STR(clGetPlatformInfo)
368*61046927SAndroid Build Coastguard Worker #define __GET_DEVICE_IDS_ERR                __ERR_STR(clGetDeviceIDs)
369*61046927SAndroid Build Coastguard Worker #define __GET_PLATFORM_IDS_ERR              __ERR_STR(clGetPlatformIDs)
370*61046927SAndroid Build Coastguard Worker #define __GET_CONTEXT_INFO_ERR              __ERR_STR(clGetContextInfo)
371*61046927SAndroid Build Coastguard Worker #define __GET_EVENT_INFO_ERR                __ERR_STR(clGetEventInfo)
372*61046927SAndroid Build Coastguard Worker #define __GET_EVENT_PROFILE_INFO_ERR        __ERR_STR(clGetEventProfileInfo)
373*61046927SAndroid Build Coastguard Worker #define __GET_MEM_OBJECT_INFO_ERR           __ERR_STR(clGetMemObjectInfo)
374*61046927SAndroid Build Coastguard Worker #define __GET_IMAGE_INFO_ERR                __ERR_STR(clGetImageInfo)
375*61046927SAndroid Build Coastguard Worker #define __GET_SAMPLER_INFO_ERR              __ERR_STR(clGetSamplerInfo)
376*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_INFO_ERR               __ERR_STR(clGetKernelInfo)
377*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
378*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_ARG_INFO_ERR               __ERR_STR(clGetKernelArgInfo)
379*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
380*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_WORK_GROUP_INFO_ERR    __ERR_STR(clGetKernelWorkGroupInfo)
381*61046927SAndroid Build Coastguard Worker #define __GET_PROGRAM_INFO_ERR              __ERR_STR(clGetProgramInfo)
382*61046927SAndroid Build Coastguard Worker #define __GET_PROGRAM_BUILD_INFO_ERR        __ERR_STR(clGetProgramBuildInfo)
383*61046927SAndroid Build Coastguard Worker #define __GET_COMMAND_QUEUE_INFO_ERR        __ERR_STR(clGetCommandQueueInfo)
384*61046927SAndroid Build Coastguard Worker 
385*61046927SAndroid Build Coastguard Worker #define __CREATE_CONTEXT_ERR                __ERR_STR(clCreateContext)
386*61046927SAndroid Build Coastguard Worker #define __CREATE_CONTEXT_FROM_TYPE_ERR      __ERR_STR(clCreateContextFromType)
387*61046927SAndroid Build Coastguard Worker #define __GET_SUPPORTED_IMAGE_FORMATS_ERR   __ERR_STR(clGetSupportedImageFormats)
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker #define __CREATE_BUFFER_ERR                 __ERR_STR(clCreateBuffer)
390*61046927SAndroid Build Coastguard Worker #define __COPY_ERR                          __ERR_STR(cl::copy)
391*61046927SAndroid Build Coastguard Worker #define __CREATE_SUBBUFFER_ERR              __ERR_STR(clCreateSubBuffer)
392*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_BUFFER_ERR              __ERR_STR(clCreateFromGLBuffer)
393*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_RENDER_BUFFER_ERR       __ERR_STR(clCreateFromGLBuffer)
394*61046927SAndroid Build Coastguard Worker #define __GET_GL_OBJECT_INFO_ERR            __ERR_STR(clGetGLObjectInfo)
395*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
396*61046927SAndroid Build Coastguard Worker #define __CREATE_IMAGE_ERR                  __ERR_STR(clCreateImage)
397*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_TEXTURE_ERR             __ERR_STR(clCreateFromGLTexture)
398*61046927SAndroid Build Coastguard Worker #define __IMAGE_DIMENSION_ERR               __ERR_STR(Incorrect image dimensions)
399*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
400*61046927SAndroid Build Coastguard Worker #define __CREATE_SAMPLER_ERR                __ERR_STR(clCreateSampler)
401*61046927SAndroid Build Coastguard Worker #define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback)
402*61046927SAndroid Build Coastguard Worker 
403*61046927SAndroid Build Coastguard Worker #define __CREATE_USER_EVENT_ERR             __ERR_STR(clCreateUserEvent)
404*61046927SAndroid Build Coastguard Worker #define __SET_USER_EVENT_STATUS_ERR         __ERR_STR(clSetUserEventStatus)
405*61046927SAndroid Build Coastguard Worker #define __SET_EVENT_CALLBACK_ERR            __ERR_STR(clSetEventCallback)
406*61046927SAndroid Build Coastguard Worker #define __WAIT_FOR_EVENTS_ERR               __ERR_STR(clWaitForEvents)
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker #define __CREATE_KERNEL_ERR                 __ERR_STR(clCreateKernel)
409*61046927SAndroid Build Coastguard Worker #define __SET_KERNEL_ARGS_ERR               __ERR_STR(clSetKernelArg)
410*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_SOURCE_ERR    __ERR_STR(clCreateProgramWithSource)
411*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_BINARY_ERR    __ERR_STR(clCreateProgramWithBinary)
412*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
413*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR    __ERR_STR(clCreateProgramWithBuiltInKernels)
414*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
415*61046927SAndroid Build Coastguard Worker #define __BUILD_PROGRAM_ERR                 __ERR_STR(clBuildProgram)
416*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
417*61046927SAndroid Build Coastguard Worker #define __COMPILE_PROGRAM_ERR                  __ERR_STR(clCompileProgram)
418*61046927SAndroid Build Coastguard Worker #define __LINK_PROGRAM_ERR                  __ERR_STR(clLinkProgram)
419*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
420*61046927SAndroid Build Coastguard Worker #define __CREATE_KERNELS_IN_PROGRAM_ERR     __ERR_STR(clCreateKernelsInProgram)
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker #define __CREATE_COMMAND_QUEUE_ERR          __ERR_STR(clCreateCommandQueue)
423*61046927SAndroid Build Coastguard Worker #define __SET_COMMAND_QUEUE_PROPERTY_ERR    __ERR_STR(clSetCommandQueueProperty)
424*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_READ_BUFFER_ERR           __ERR_STR(clEnqueueReadBuffer)
425*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_READ_BUFFER_RECT_ERR      __ERR_STR(clEnqueueReadBufferRect)
426*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WRITE_BUFFER_ERR          __ERR_STR(clEnqueueWriteBuffer)
427*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WRITE_BUFFER_RECT_ERR     __ERR_STR(clEnqueueWriteBufferRect)
428*61046927SAndroid Build Coastguard Worker #define __ENQEUE_COPY_BUFFER_ERR            __ERR_STR(clEnqueueCopyBuffer)
429*61046927SAndroid Build Coastguard Worker #define __ENQEUE_COPY_BUFFER_RECT_ERR       __ERR_STR(clEnqueueCopyBufferRect)
430*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_FILL_BUFFER_ERR           __ERR_STR(clEnqueueFillBuffer)
431*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_READ_IMAGE_ERR            __ERR_STR(clEnqueueReadImage)
432*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WRITE_IMAGE_ERR           __ERR_STR(clEnqueueWriteImage)
433*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_COPY_IMAGE_ERR            __ERR_STR(clEnqueueCopyImage)
434*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_FILL_IMAGE_ERR           __ERR_STR(clEnqueueFillImage)
435*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR  __ERR_STR(clEnqueueCopyImageToBuffer)
436*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR  __ERR_STR(clEnqueueCopyBufferToImage)
437*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MAP_BUFFER_ERR            __ERR_STR(clEnqueueMapBuffer)
438*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MAP_IMAGE_ERR             __ERR_STR(clEnqueueMapImage)
439*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_UNMAP_MEM_OBJECT_ERR      __ERR_STR(clEnqueueUnMapMemObject)
440*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_NDRANGE_KERNEL_ERR        __ERR_STR(clEnqueueNDRangeKernel)
441*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_TASK_ERR                  __ERR_STR(clEnqueueTask)
442*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_NATIVE_KERNEL             __ERR_STR(clEnqueueNativeKernel)
443*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
444*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR   __ERR_STR(clEnqueueMigrateMemObjects)
445*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
446*61046927SAndroid Build Coastguard Worker 
447*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_ACQUIRE_GL_ERR            __ERR_STR(clEnqueueAcquireGLObjects)
448*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_RELEASE_GL_ERR            __ERR_STR(clEnqueueReleaseGLObjects)
449*61046927SAndroid Build Coastguard Worker 
450*61046927SAndroid Build Coastguard Worker 
451*61046927SAndroid Build Coastguard Worker #define __RETAIN_ERR                        __ERR_STR(Retain Object)
452*61046927SAndroid Build Coastguard Worker #define __RELEASE_ERR                       __ERR_STR(Release Object)
453*61046927SAndroid Build Coastguard Worker #define __FLUSH_ERR                         __ERR_STR(clFlush)
454*61046927SAndroid Build Coastguard Worker #define __FINISH_ERR                        __ERR_STR(clFinish)
455*61046927SAndroid Build Coastguard Worker #define __VECTOR_CAPACITY_ERR               __ERR_STR(Vector capacity error)
456*61046927SAndroid Build Coastguard Worker 
457*61046927SAndroid Build Coastguard Worker /**
458*61046927SAndroid Build Coastguard Worker  * CL 1.2 version that uses device fission.
459*61046927SAndroid Build Coastguard Worker  */
460*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
461*61046927SAndroid Build Coastguard Worker #define __CREATE_SUB_DEVICES                __ERR_STR(clCreateSubDevices)
462*61046927SAndroid Build Coastguard Worker #else
463*61046927SAndroid Build Coastguard Worker #define __CREATE_SUB_DEVICES                __ERR_STR(clCreateSubDevicesEXT)
464*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker /**
467*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
468*61046927SAndroid Build Coastguard Worker  */
469*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
470*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MARKER_ERR                __ERR_STR(clEnqueueMarker)
471*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WAIT_FOR_EVENTS_ERR       __ERR_STR(clEnqueueWaitForEvents)
472*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_BARRIER_ERR               __ERR_STR(clEnqueueBarrier)
473*61046927SAndroid Build Coastguard Worker #define __UNLOAD_COMPILER_ERR               __ERR_STR(clUnloadCompiler)
474*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_TEXTURE_2D_ERR          __ERR_STR(clCreateFromGLTexture2D)
475*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_TEXTURE_3D_ERR          __ERR_STR(clCreateFromGLTexture3D)
476*61046927SAndroid Build Coastguard Worker #define __CREATE_IMAGE2D_ERR                __ERR_STR(clCreateImage2D)
477*61046927SAndroid Build Coastguard Worker #define __CREATE_IMAGE3D_ERR                __ERR_STR(clCreateImage3D)
478*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
479*61046927SAndroid Build Coastguard Worker 
480*61046927SAndroid Build Coastguard Worker #endif // __CL_USER_OVERRIDE_ERROR_STRINGS
481*61046927SAndroid Build Coastguard Worker //! \endcond
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker /**
484*61046927SAndroid Build Coastguard Worker  * CL 1.2 marker and barrier commands
485*61046927SAndroid Build Coastguard Worker  */
486*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
487*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MARKER_WAIT_LIST_ERR                __ERR_STR(clEnqueueMarkerWithWaitList)
488*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_BARRIER_WAIT_LIST_ERR               __ERR_STR(clEnqueueBarrierWithWaitList)
489*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker #if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING)
492*61046927SAndroid Build Coastguard Worker typedef std::string STRING_CLASS;
493*61046927SAndroid Build Coastguard Worker #elif !defined(__USE_DEV_STRING)
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker /*! \class string
496*61046927SAndroid Build Coastguard Worker  * \brief Simple string class, that provides a limited subset of std::string
497*61046927SAndroid Build Coastguard Worker  * functionality but avoids many of the issues that come with that class.
498*61046927SAndroid Build Coastguard Worker 
499*61046927SAndroid Build Coastguard Worker  *  \note Deprecated. Please use std::string as default or
500*61046927SAndroid Build Coastguard Worker  *  re-define the string class to match the std::string
501*61046927SAndroid Build Coastguard Worker  *  interface by defining STRING_CLASS
502*61046927SAndroid Build Coastguard Worker  */
503*61046927SAndroid Build Coastguard Worker class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string
504*61046927SAndroid Build Coastguard Worker {
505*61046927SAndroid Build Coastguard Worker private:
506*61046927SAndroid Build Coastguard Worker     ::size_t size_;
507*61046927SAndroid Build Coastguard Worker     char * str_;
508*61046927SAndroid Build Coastguard Worker public:
509*61046927SAndroid Build Coastguard Worker     //! \brief Constructs an empty string, allocating no memory.
string(void)510*61046927SAndroid Build Coastguard Worker     string(void) : size_(0), str_(NULL)
511*61046927SAndroid Build Coastguard Worker     {
512*61046927SAndroid Build Coastguard Worker     }
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a string populated from an arbitrary value of
515*61046927SAndroid Build Coastguard Worker      *  specified size.
516*61046927SAndroid Build Coastguard Worker      *
517*61046927SAndroid Build Coastguard Worker      *  An extra '\0' is added, in case none was contained in str.
518*61046927SAndroid Build Coastguard Worker      *
519*61046927SAndroid Build Coastguard Worker      *  \param str the initial value of the string instance.  Note that '\0'
520*61046927SAndroid Build Coastguard Worker      *             characters receive no special treatment.  If NULL,
521*61046927SAndroid Build Coastguard Worker      *             the string is left empty, with a size of 0.
522*61046927SAndroid Build Coastguard Worker      *
523*61046927SAndroid Build Coastguard Worker      *  \param size the number of characters to copy from str.
524*61046927SAndroid Build Coastguard Worker      */
string(const char * str,::size_t size)525*61046927SAndroid Build Coastguard Worker     string(const char * str, ::size_t size) :
526*61046927SAndroid Build Coastguard Worker         size_(size),
527*61046927SAndroid Build Coastguard Worker         str_(NULL)
528*61046927SAndroid Build Coastguard Worker     {
529*61046927SAndroid Build Coastguard Worker         if( size > 0 ) {
530*61046927SAndroid Build Coastguard Worker             str_ = new char[size_+1];
531*61046927SAndroid Build Coastguard Worker             if (str_ != NULL) {
532*61046927SAndroid Build Coastguard Worker                 memcpy(str_, str, size_  * sizeof(char));
533*61046927SAndroid Build Coastguard Worker                 str_[size_] = '\0';
534*61046927SAndroid Build Coastguard Worker             }
535*61046927SAndroid Build Coastguard Worker             else {
536*61046927SAndroid Build Coastguard Worker                 size_ = 0;
537*61046927SAndroid Build Coastguard Worker             }
538*61046927SAndroid Build Coastguard Worker         }
539*61046927SAndroid Build Coastguard Worker     }
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a string populated from a null-terminated value.
542*61046927SAndroid Build Coastguard Worker      *
543*61046927SAndroid Build Coastguard Worker      *  \param str the null-terminated initial value of the string instance.
544*61046927SAndroid Build Coastguard Worker      *             If NULL, the string is left empty, with a size of 0.
545*61046927SAndroid Build Coastguard Worker      */
string(const char * str)546*61046927SAndroid Build Coastguard Worker     string(const char * str) :
547*61046927SAndroid Build Coastguard Worker         size_(0),
548*61046927SAndroid Build Coastguard Worker         str_(NULL)
549*61046927SAndroid Build Coastguard Worker     {
550*61046927SAndroid Build Coastguard Worker         if( str ) {
551*61046927SAndroid Build Coastguard Worker             size_= ::strlen(str);
552*61046927SAndroid Build Coastguard Worker         }
553*61046927SAndroid Build Coastguard Worker         if( size_ > 0 ) {
554*61046927SAndroid Build Coastguard Worker             str_ = new char[size_ + 1];
555*61046927SAndroid Build Coastguard Worker             if (str_ != NULL) {
556*61046927SAndroid Build Coastguard Worker                 memcpy(str_, str, (size_ + 1) * sizeof(char));
557*61046927SAndroid Build Coastguard Worker             }
558*61046927SAndroid Build Coastguard Worker         }
559*61046927SAndroid Build Coastguard Worker     }
560*61046927SAndroid Build Coastguard Worker 
resize(::size_t n)561*61046927SAndroid Build Coastguard Worker     void resize( ::size_t n )
562*61046927SAndroid Build Coastguard Worker     {
563*61046927SAndroid Build Coastguard Worker         if( size_ == n ) {
564*61046927SAndroid Build Coastguard Worker             return;
565*61046927SAndroid Build Coastguard Worker         }
566*61046927SAndroid Build Coastguard Worker         if (n == 0) {
567*61046927SAndroid Build Coastguard Worker             if( str_ ) {
568*61046927SAndroid Build Coastguard Worker                 delete [] str_;
569*61046927SAndroid Build Coastguard Worker             }
570*61046927SAndroid Build Coastguard Worker             str_ = NULL;
571*61046927SAndroid Build Coastguard Worker             size_ = 0;
572*61046927SAndroid Build Coastguard Worker         }
573*61046927SAndroid Build Coastguard Worker         else {
574*61046927SAndroid Build Coastguard Worker             char *newString = new char[n + 1];
575*61046927SAndroid Build Coastguard Worker             ::size_t copySize = n;
576*61046927SAndroid Build Coastguard Worker             if( size_ < n ) {
577*61046927SAndroid Build Coastguard Worker                 copySize = size_;
578*61046927SAndroid Build Coastguard Worker             }
579*61046927SAndroid Build Coastguard Worker             size_ = n;
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker             if(str_) {
582*61046927SAndroid Build Coastguard Worker                 memcpy(newString, str_, (copySize + 1) * sizeof(char));
583*61046927SAndroid Build Coastguard Worker             }
584*61046927SAndroid Build Coastguard Worker             if( copySize < size_ ) {
585*61046927SAndroid Build Coastguard Worker                 memset(newString + copySize, 0, size_ - copySize);
586*61046927SAndroid Build Coastguard Worker             }
587*61046927SAndroid Build Coastguard Worker             newString[size_] = '\0';
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker             delete [] str_;
590*61046927SAndroid Build Coastguard Worker             str_ = newString;
591*61046927SAndroid Build Coastguard Worker         }
592*61046927SAndroid Build Coastguard Worker     }
593*61046927SAndroid Build Coastguard Worker 
operator [](::size_t pos) const594*61046927SAndroid Build Coastguard Worker     const char& operator[] ( ::size_t pos ) const
595*61046927SAndroid Build Coastguard Worker     {
596*61046927SAndroid Build Coastguard Worker         return str_[pos];
597*61046927SAndroid Build Coastguard Worker     }
598*61046927SAndroid Build Coastguard Worker 
operator [](::size_t pos)599*61046927SAndroid Build Coastguard Worker     char& operator[] ( ::size_t pos )
600*61046927SAndroid Build Coastguard Worker     {
601*61046927SAndroid Build Coastguard Worker         return str_[pos];
602*61046927SAndroid Build Coastguard Worker     }
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker     /*! \brief Copies the value of another string to this one.
605*61046927SAndroid Build Coastguard Worker      *
606*61046927SAndroid Build Coastguard Worker      *  \param rhs the string to copy.
607*61046927SAndroid Build Coastguard Worker      *
608*61046927SAndroid Build Coastguard Worker      *  \returns a reference to the modified instance.
609*61046927SAndroid Build Coastguard Worker      */
operator =(const string & rhs)610*61046927SAndroid Build Coastguard Worker     string& operator=(const string& rhs)
611*61046927SAndroid Build Coastguard Worker     {
612*61046927SAndroid Build Coastguard Worker         if (this == &rhs) {
613*61046927SAndroid Build Coastguard Worker             return *this;
614*61046927SAndroid Build Coastguard Worker         }
615*61046927SAndroid Build Coastguard Worker 
616*61046927SAndroid Build Coastguard Worker         if( str_ != NULL ) {
617*61046927SAndroid Build Coastguard Worker             delete [] str_;
618*61046927SAndroid Build Coastguard Worker             str_ = NULL;
619*61046927SAndroid Build Coastguard Worker             size_ = 0;
620*61046927SAndroid Build Coastguard Worker         }
621*61046927SAndroid Build Coastguard Worker 
622*61046927SAndroid Build Coastguard Worker         if (rhs.size_ == 0 || rhs.str_ == NULL) {
623*61046927SAndroid Build Coastguard Worker             str_ = NULL;
624*61046927SAndroid Build Coastguard Worker             size_ = 0;
625*61046927SAndroid Build Coastguard Worker         }
626*61046927SAndroid Build Coastguard Worker         else {
627*61046927SAndroid Build Coastguard Worker             str_ = new char[rhs.size_ + 1];
628*61046927SAndroid Build Coastguard Worker             size_ = rhs.size_;
629*61046927SAndroid Build Coastguard Worker 
630*61046927SAndroid Build Coastguard Worker             if (str_ != NULL) {
631*61046927SAndroid Build Coastguard Worker                 memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char));
632*61046927SAndroid Build Coastguard Worker             }
633*61046927SAndroid Build Coastguard Worker             else {
634*61046927SAndroid Build Coastguard Worker                 size_ = 0;
635*61046927SAndroid Build Coastguard Worker             }
636*61046927SAndroid Build Coastguard Worker         }
637*61046927SAndroid Build Coastguard Worker 
638*61046927SAndroid Build Coastguard Worker         return *this;
639*61046927SAndroid Build Coastguard Worker     }
640*61046927SAndroid Build Coastguard Worker 
641*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a string by copying the value of another instance.
642*61046927SAndroid Build Coastguard Worker      *
643*61046927SAndroid Build Coastguard Worker      *  \param rhs the string to copy.
644*61046927SAndroid Build Coastguard Worker      */
string(const string & rhs)645*61046927SAndroid Build Coastguard Worker     string(const string& rhs) :
646*61046927SAndroid Build Coastguard Worker         size_(0),
647*61046927SAndroid Build Coastguard Worker         str_(NULL)
648*61046927SAndroid Build Coastguard Worker     {
649*61046927SAndroid Build Coastguard Worker         *this = rhs;
650*61046927SAndroid Build Coastguard Worker     }
651*61046927SAndroid Build Coastguard Worker 
652*61046927SAndroid Build Coastguard Worker     //! \brief Destructor - frees memory used to hold the current value.
~string()653*61046927SAndroid Build Coastguard Worker     ~string()
654*61046927SAndroid Build Coastguard Worker     {
655*61046927SAndroid Build Coastguard Worker         delete[] str_;
656*61046927SAndroid Build Coastguard Worker         str_ = NULL;
657*61046927SAndroid Build Coastguard Worker     }
658*61046927SAndroid Build Coastguard Worker 
659*61046927SAndroid Build Coastguard Worker     //! \brief Queries the length of the string, excluding any added '\0's.
size(void) const660*61046927SAndroid Build Coastguard Worker     ::size_t size(void) const   { return size_; }
661*61046927SAndroid Build Coastguard Worker 
662*61046927SAndroid Build Coastguard Worker     //! \brief Queries the length of the string, excluding any added '\0's.
length(void) const663*61046927SAndroid Build Coastguard Worker     ::size_t length(void) const { return size(); }
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker     /*! \brief Returns a pointer to the private copy held by this instance,
666*61046927SAndroid Build Coastguard Worker      *  or "" if empty/unset.
667*61046927SAndroid Build Coastguard Worker      */
c_str(void) const668*61046927SAndroid Build Coastguard Worker     const char * c_str(void) const { return (str_) ? str_ : "";}
669*61046927SAndroid Build Coastguard Worker } CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
670*61046927SAndroid Build Coastguard Worker typedef cl::string STRING_CLASS;
671*61046927SAndroid Build Coastguard Worker #endif // #elif !defined(__USE_DEV_STRING)
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
674*61046927SAndroid Build Coastguard Worker #define VECTOR_CLASS std::vector
675*61046927SAndroid Build Coastguard Worker #elif !defined(__USE_DEV_VECTOR)
676*61046927SAndroid Build Coastguard Worker #define VECTOR_CLASS cl::vector
677*61046927SAndroid Build Coastguard Worker 
678*61046927SAndroid Build Coastguard Worker #if !defined(__MAX_DEFAULT_VECTOR_SIZE)
679*61046927SAndroid Build Coastguard Worker #define __MAX_DEFAULT_VECTOR_SIZE 10
680*61046927SAndroid Build Coastguard Worker #endif
681*61046927SAndroid Build Coastguard Worker 
682*61046927SAndroid Build Coastguard Worker /*! \class vector
683*61046927SAndroid Build Coastguard Worker  * \brief Fixed sized vector implementation that mirroring
684*61046927SAndroid Build Coastguard Worker  *
685*61046927SAndroid Build Coastguard Worker  *  \note Deprecated. Please use std::vector as default or
686*61046927SAndroid Build Coastguard Worker  *  re-define the vector class to match the std::vector
687*61046927SAndroid Build Coastguard Worker  *  interface by defining VECTOR_CLASS
688*61046927SAndroid Build Coastguard Worker 
689*61046927SAndroid Build Coastguard Worker  *  \note Not recommended for use with custom objects as
690*61046927SAndroid Build Coastguard Worker  *  current implementation will construct N elements
691*61046927SAndroid Build Coastguard Worker  *
692*61046927SAndroid Build Coastguard Worker  * std::vector functionality.
693*61046927SAndroid Build Coastguard Worker  *  \brief Fixed sized vector compatible with std::vector.
694*61046927SAndroid Build Coastguard Worker  *
695*61046927SAndroid Build Coastguard Worker  *  \note
696*61046927SAndroid Build Coastguard Worker  *  This differs from std::vector<> not just in memory allocation,
697*61046927SAndroid Build Coastguard Worker  *  but also in terms of when members are constructed, destroyed,
698*61046927SAndroid Build Coastguard Worker  *  and assigned instead of being copy constructed.
699*61046927SAndroid Build Coastguard Worker  *
700*61046927SAndroid Build Coastguard Worker  *  \param T type of element contained in the vector.
701*61046927SAndroid Build Coastguard Worker  *
702*61046927SAndroid Build Coastguard Worker  *  \param N maximum size of the vector.
703*61046927SAndroid Build Coastguard Worker  */
704*61046927SAndroid Build Coastguard Worker template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE>
705*61046927SAndroid Build Coastguard Worker class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector
706*61046927SAndroid Build Coastguard Worker {
707*61046927SAndroid Build Coastguard Worker private:
708*61046927SAndroid Build Coastguard Worker     T data_[N];
709*61046927SAndroid Build Coastguard Worker     unsigned int size_;
710*61046927SAndroid Build Coastguard Worker 
711*61046927SAndroid Build Coastguard Worker public:
712*61046927SAndroid Build Coastguard Worker     //! \brief Constructs an empty vector with no memory allocated.
vector()713*61046927SAndroid Build Coastguard Worker     vector() :
714*61046927SAndroid Build Coastguard Worker         size_(static_cast<unsigned int>(0))
715*61046927SAndroid Build Coastguard Worker     {}
716*61046927SAndroid Build Coastguard Worker 
717*61046927SAndroid Build Coastguard Worker     //! \brief Deallocates the vector's memory and destroys all of its elements.
~vector()718*61046927SAndroid Build Coastguard Worker     ~vector()
719*61046927SAndroid Build Coastguard Worker     {
720*61046927SAndroid Build Coastguard Worker         clear();
721*61046927SAndroid Build Coastguard Worker     }
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker     //! \brief Returns the number of elements currently contained.
size(void) const724*61046927SAndroid Build Coastguard Worker     unsigned int size(void) const
725*61046927SAndroid Build Coastguard Worker     {
726*61046927SAndroid Build Coastguard Worker         return size_;
727*61046927SAndroid Build Coastguard Worker     }
728*61046927SAndroid Build Coastguard Worker 
729*61046927SAndroid Build Coastguard Worker     /*! \brief Empties the vector of all elements.
730*61046927SAndroid Build Coastguard Worker      *  \note
731*61046927SAndroid Build Coastguard Worker      *  This does not deallocate memory but will invoke destructors
732*61046927SAndroid Build Coastguard Worker      *  on contained elements.
733*61046927SAndroid Build Coastguard Worker      */
clear()734*61046927SAndroid Build Coastguard Worker     void clear()
735*61046927SAndroid Build Coastguard Worker     {
736*61046927SAndroid Build Coastguard Worker         while(!empty()) {
737*61046927SAndroid Build Coastguard Worker             pop_back();
738*61046927SAndroid Build Coastguard Worker         }
739*61046927SAndroid Build Coastguard Worker     }
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker     /*! \brief Appends an element after the last valid element.
742*61046927SAndroid Build Coastguard Worker      * Calling this on a vector that has reached capacity will throw an
743*61046927SAndroid Build Coastguard Worker      * exception if exceptions are enabled.
744*61046927SAndroid Build Coastguard Worker      */
push_back(const T & x)745*61046927SAndroid Build Coastguard Worker     void push_back (const T& x)
746*61046927SAndroid Build Coastguard Worker     {
747*61046927SAndroid Build Coastguard Worker         if (size() < N) {
748*61046927SAndroid Build Coastguard Worker             new (&data_[size_]) T(x);
749*61046927SAndroid Build Coastguard Worker             size_++;
750*61046927SAndroid Build Coastguard Worker         } else {
751*61046927SAndroid Build Coastguard Worker             detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
752*61046927SAndroid Build Coastguard Worker         }
753*61046927SAndroid Build Coastguard Worker     }
754*61046927SAndroid Build Coastguard Worker 
755*61046927SAndroid Build Coastguard Worker     /*! \brief Removes the last valid element from the vector.
756*61046927SAndroid Build Coastguard Worker      * Calling this on an empty vector will throw an exception
757*61046927SAndroid Build Coastguard Worker      * if exceptions are enabled.
758*61046927SAndroid Build Coastguard Worker      */
pop_back(void)759*61046927SAndroid Build Coastguard Worker     void pop_back(void)
760*61046927SAndroid Build Coastguard Worker     {
761*61046927SAndroid Build Coastguard Worker         if (size_ != 0) {
762*61046927SAndroid Build Coastguard Worker             --size_;
763*61046927SAndroid Build Coastguard Worker             data_[size_].~T();
764*61046927SAndroid Build Coastguard Worker         } else {
765*61046927SAndroid Build Coastguard Worker             detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
766*61046927SAndroid Build Coastguard Worker         }
767*61046927SAndroid Build Coastguard Worker     }
768*61046927SAndroid Build Coastguard Worker 
769*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs with a value copied from another.
770*61046927SAndroid Build Coastguard Worker      *
771*61046927SAndroid Build Coastguard Worker      *  \param vec the vector to copy.
772*61046927SAndroid Build Coastguard Worker      */
vector(const vector<T,N> & vec)773*61046927SAndroid Build Coastguard Worker     vector(const vector<T, N>& vec) :
774*61046927SAndroid Build Coastguard Worker         size_(vec.size_)
775*61046927SAndroid Build Coastguard Worker     {
776*61046927SAndroid Build Coastguard Worker         if (size_ != 0) {
777*61046927SAndroid Build Coastguard Worker             assign(vec.begin(), vec.end());
778*61046927SAndroid Build Coastguard Worker         }
779*61046927SAndroid Build Coastguard Worker     }
780*61046927SAndroid Build Coastguard Worker 
781*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs with a specified number of initial elements.
782*61046927SAndroid Build Coastguard Worker      *
783*61046927SAndroid Build Coastguard Worker      *  \param size number of initial elements.
784*61046927SAndroid Build Coastguard Worker      *
785*61046927SAndroid Build Coastguard Worker      *  \param val value of initial elements.
786*61046927SAndroid Build Coastguard Worker      */
vector(unsigned int size,const T & val=T ())787*61046927SAndroid Build Coastguard Worker     vector(unsigned int size, const T& val = T()) :
788*61046927SAndroid Build Coastguard Worker         size_(0)
789*61046927SAndroid Build Coastguard Worker     {
790*61046927SAndroid Build Coastguard Worker         for (unsigned int i = 0; i < size; i++) {
791*61046927SAndroid Build Coastguard Worker             push_back(val);
792*61046927SAndroid Build Coastguard Worker         }
793*61046927SAndroid Build Coastguard Worker     }
794*61046927SAndroid Build Coastguard Worker 
795*61046927SAndroid Build Coastguard Worker     /*! \brief Overwrites the current content with that copied from another
796*61046927SAndroid Build Coastguard Worker      *         instance.
797*61046927SAndroid Build Coastguard Worker      *
798*61046927SAndroid Build Coastguard Worker      *  \param rhs vector to copy.
799*61046927SAndroid Build Coastguard Worker      *
800*61046927SAndroid Build Coastguard Worker      *  \returns a reference to this.
801*61046927SAndroid Build Coastguard Worker      */
operator =(const vector<T,N> & rhs)802*61046927SAndroid Build Coastguard Worker     vector<T, N>& operator=(const vector<T, N>& rhs)
803*61046927SAndroid Build Coastguard Worker     {
804*61046927SAndroid Build Coastguard Worker         if (this == &rhs) {
805*61046927SAndroid Build Coastguard Worker             return *this;
806*61046927SAndroid Build Coastguard Worker         }
807*61046927SAndroid Build Coastguard Worker 
808*61046927SAndroid Build Coastguard Worker         if (rhs.size_ != 0) {
809*61046927SAndroid Build Coastguard Worker             assign(rhs.begin(), rhs.end());
810*61046927SAndroid Build Coastguard Worker         } else {
811*61046927SAndroid Build Coastguard Worker             clear();
812*61046927SAndroid Build Coastguard Worker         }
813*61046927SAndroid Build Coastguard Worker 
814*61046927SAndroid Build Coastguard Worker         return *this;
815*61046927SAndroid Build Coastguard Worker     }
816*61046927SAndroid Build Coastguard Worker 
817*61046927SAndroid Build Coastguard Worker     /*! \brief Tests equality against another instance.
818*61046927SAndroid Build Coastguard Worker      *
819*61046927SAndroid Build Coastguard Worker      *  \param vec the vector against which to compare.
820*61046927SAndroid Build Coastguard Worker      */
operator ==(vector<T,N> & vec)821*61046927SAndroid Build Coastguard Worker     bool operator==(vector<T,N> &vec)
822*61046927SAndroid Build Coastguard Worker     {
823*61046927SAndroid Build Coastguard Worker         if (size() != vec.size()) {
824*61046927SAndroid Build Coastguard Worker             return false;
825*61046927SAndroid Build Coastguard Worker         }
826*61046927SAndroid Build Coastguard Worker 
827*61046927SAndroid Build Coastguard Worker         for( unsigned int i = 0; i < size(); ++i ) {
828*61046927SAndroid Build Coastguard Worker             if( operator[](i) != vec[i] ) {
829*61046927SAndroid Build Coastguard Worker                 return false;
830*61046927SAndroid Build Coastguard Worker             }
831*61046927SAndroid Build Coastguard Worker         }
832*61046927SAndroid Build Coastguard Worker         return true;
833*61046927SAndroid Build Coastguard Worker     }
834*61046927SAndroid Build Coastguard Worker 
835*61046927SAndroid Build Coastguard Worker     //! \brief Conversion operator to T*.
operator T*()836*61046927SAndroid Build Coastguard Worker     operator T* ()             { return data_; }
837*61046927SAndroid Build Coastguard Worker 
838*61046927SAndroid Build Coastguard Worker     //! \brief Conversion operator to const T*.
operator const T*() const839*61046927SAndroid Build Coastguard Worker     operator const T* () const { return data_; }
840*61046927SAndroid Build Coastguard Worker 
841*61046927SAndroid Build Coastguard Worker     //! \brief Tests whether this instance has any elements.
empty(void) const842*61046927SAndroid Build Coastguard Worker     bool empty (void) const
843*61046927SAndroid Build Coastguard Worker     {
844*61046927SAndroid Build Coastguard Worker         return size_==0;
845*61046927SAndroid Build Coastguard Worker     }
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker     //! \brief Returns the maximum number of elements this instance can hold.
max_size(void) const848*61046927SAndroid Build Coastguard Worker     unsigned int max_size (void) const
849*61046927SAndroid Build Coastguard Worker     {
850*61046927SAndroid Build Coastguard Worker         return N;
851*61046927SAndroid Build Coastguard Worker     }
852*61046927SAndroid Build Coastguard Worker 
853*61046927SAndroid Build Coastguard Worker     //! \brief Returns the maximum number of elements this instance can hold.
capacity() const854*61046927SAndroid Build Coastguard Worker     unsigned int capacity () const
855*61046927SAndroid Build Coastguard Worker     {
856*61046927SAndroid Build Coastguard Worker         return N;
857*61046927SAndroid Build Coastguard Worker     }
858*61046927SAndroid Build Coastguard Worker 
859*61046927SAndroid Build Coastguard Worker     //! \brief Resizes the vector to the given size
resize(unsigned int newSize,T fill=T ())860*61046927SAndroid Build Coastguard Worker     void resize(unsigned int newSize, T fill = T())
861*61046927SAndroid Build Coastguard Worker     {
862*61046927SAndroid Build Coastguard Worker         if (newSize > N)
863*61046927SAndroid Build Coastguard Worker         {
864*61046927SAndroid Build Coastguard Worker             detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
865*61046927SAndroid Build Coastguard Worker         }
866*61046927SAndroid Build Coastguard Worker         else
867*61046927SAndroid Build Coastguard Worker         {
868*61046927SAndroid Build Coastguard Worker             while (size_ < newSize)
869*61046927SAndroid Build Coastguard Worker             {
870*61046927SAndroid Build Coastguard Worker                 new (&data_[size_]) T(fill);
871*61046927SAndroid Build Coastguard Worker                 size_++;
872*61046927SAndroid Build Coastguard Worker             }
873*61046927SAndroid Build Coastguard Worker             while (size_ > newSize)
874*61046927SAndroid Build Coastguard Worker             {
875*61046927SAndroid Build Coastguard Worker                 --size_;
876*61046927SAndroid Build Coastguard Worker                 data_[size_].~T();
877*61046927SAndroid Build Coastguard Worker             }
878*61046927SAndroid Build Coastguard Worker         }
879*61046927SAndroid Build Coastguard Worker     }
880*61046927SAndroid Build Coastguard Worker 
881*61046927SAndroid Build Coastguard Worker     /*! \brief Returns a reference to a given element.
882*61046927SAndroid Build Coastguard Worker      *
883*61046927SAndroid Build Coastguard Worker      *  \param index which element to access.     *
884*61046927SAndroid Build Coastguard Worker      *  \note
885*61046927SAndroid Build Coastguard Worker      *  The caller is responsible for ensuring index is >= 0 and < size().
886*61046927SAndroid Build Coastguard Worker      */
operator [](int index)887*61046927SAndroid Build Coastguard Worker     T& operator[](int index)
888*61046927SAndroid Build Coastguard Worker     {
889*61046927SAndroid Build Coastguard Worker         return data_[index];
890*61046927SAndroid Build Coastguard Worker     }
891*61046927SAndroid Build Coastguard Worker 
892*61046927SAndroid Build Coastguard Worker     /*! \brief Returns a const reference to a given element.
893*61046927SAndroid Build Coastguard Worker      *
894*61046927SAndroid Build Coastguard Worker      *  \param index which element to access.
895*61046927SAndroid Build Coastguard Worker      *
896*61046927SAndroid Build Coastguard Worker      *  \note
897*61046927SAndroid Build Coastguard Worker      *  The caller is responsible for ensuring index is >= 0 and < size().
898*61046927SAndroid Build Coastguard Worker      */
operator [](int index) const899*61046927SAndroid Build Coastguard Worker     const T& operator[](int index) const
900*61046927SAndroid Build Coastguard Worker     {
901*61046927SAndroid Build Coastguard Worker         return data_[index];
902*61046927SAndroid Build Coastguard Worker     }
903*61046927SAndroid Build Coastguard Worker 
904*61046927SAndroid Build Coastguard Worker     /*! \brief Assigns elements of the vector based on a source iterator range.
905*61046927SAndroid Build Coastguard Worker      *
906*61046927SAndroid Build Coastguard Worker      *  \param start Beginning iterator of source range
907*61046927SAndroid Build Coastguard Worker      *  \param end Enditerator of source range
908*61046927SAndroid Build Coastguard Worker      *
909*61046927SAndroid Build Coastguard Worker      *  \note
910*61046927SAndroid Build Coastguard Worker      *  Will throw an exception if exceptions are enabled and size exceeded.
911*61046927SAndroid Build Coastguard Worker      */
912*61046927SAndroid Build Coastguard Worker     template<class I>
assign(I start,I end)913*61046927SAndroid Build Coastguard Worker     void assign(I start, I end)
914*61046927SAndroid Build Coastguard Worker     {
915*61046927SAndroid Build Coastguard Worker         clear();
916*61046927SAndroid Build Coastguard Worker         while(start != end) {
917*61046927SAndroid Build Coastguard Worker             push_back(*start);
918*61046927SAndroid Build Coastguard Worker             start++;
919*61046927SAndroid Build Coastguard Worker         }
920*61046927SAndroid Build Coastguard Worker     }
921*61046927SAndroid Build Coastguard Worker 
922*61046927SAndroid Build Coastguard Worker     /*! \class iterator
923*61046927SAndroid Build Coastguard Worker      * \brief Const iterator class for vectors
924*61046927SAndroid Build Coastguard Worker      */
925*61046927SAndroid Build Coastguard Worker     class iterator
926*61046927SAndroid Build Coastguard Worker     {
927*61046927SAndroid Build Coastguard Worker     private:
928*61046927SAndroid Build Coastguard Worker         const vector<T,N> *vec_;
929*61046927SAndroid Build Coastguard Worker         int index_;
930*61046927SAndroid Build Coastguard Worker 
931*61046927SAndroid Build Coastguard Worker         /**
932*61046927SAndroid Build Coastguard Worker          * Internal iterator constructor to capture reference
933*61046927SAndroid Build Coastguard Worker          * to the vector it iterates over rather than taking
934*61046927SAndroid Build Coastguard Worker          * the vector by copy.
935*61046927SAndroid Build Coastguard Worker          */
iterator(const vector<T,N> & vec,int index)936*61046927SAndroid Build Coastguard Worker         iterator (const vector<T,N> &vec, int index) :
937*61046927SAndroid Build Coastguard Worker             vec_(&vec)
938*61046927SAndroid Build Coastguard Worker         {
939*61046927SAndroid Build Coastguard Worker             if( !vec.empty() ) {
940*61046927SAndroid Build Coastguard Worker                 index_ = index;
941*61046927SAndroid Build Coastguard Worker             } else {
942*61046927SAndroid Build Coastguard Worker                 index_ = -1;
943*61046927SAndroid Build Coastguard Worker             }
944*61046927SAndroid Build Coastguard Worker         }
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker     public:
iterator(void)947*61046927SAndroid Build Coastguard Worker         iterator(void) :
948*61046927SAndroid Build Coastguard Worker             index_(-1),
949*61046927SAndroid Build Coastguard Worker             vec_(NULL)
950*61046927SAndroid Build Coastguard Worker         {
951*61046927SAndroid Build Coastguard Worker         }
952*61046927SAndroid Build Coastguard Worker 
iterator(const iterator & rhs)953*61046927SAndroid Build Coastguard Worker         iterator(const iterator& rhs) :
954*61046927SAndroid Build Coastguard Worker             vec_(rhs.vec_),
955*61046927SAndroid Build Coastguard Worker             index_(rhs.index_)
956*61046927SAndroid Build Coastguard Worker         {
957*61046927SAndroid Build Coastguard Worker         }
958*61046927SAndroid Build Coastguard Worker 
~iterator(void)959*61046927SAndroid Build Coastguard Worker         ~iterator(void) {}
960*61046927SAndroid Build Coastguard Worker 
begin(const cl::vector<T,N> & vec)961*61046927SAndroid Build Coastguard Worker         static iterator begin(const cl::vector<T,N> &vec)
962*61046927SAndroid Build Coastguard Worker         {
963*61046927SAndroid Build Coastguard Worker             iterator i(vec, 0);
964*61046927SAndroid Build Coastguard Worker 
965*61046927SAndroid Build Coastguard Worker             return i;
966*61046927SAndroid Build Coastguard Worker         }
967*61046927SAndroid Build Coastguard Worker 
end(const cl::vector<T,N> & vec)968*61046927SAndroid Build Coastguard Worker         static iterator end(const cl::vector<T,N> &vec)
969*61046927SAndroid Build Coastguard Worker         {
970*61046927SAndroid Build Coastguard Worker             iterator i(vec, vec.size());
971*61046927SAndroid Build Coastguard Worker 
972*61046927SAndroid Build Coastguard Worker             return i;
973*61046927SAndroid Build Coastguard Worker         }
974*61046927SAndroid Build Coastguard Worker 
operator ==(iterator i)975*61046927SAndroid Build Coastguard Worker         bool operator==(iterator i)
976*61046927SAndroid Build Coastguard Worker         {
977*61046927SAndroid Build Coastguard Worker             return ((vec_ == i.vec_) &&
978*61046927SAndroid Build Coastguard Worker                     (index_ == i.index_));
979*61046927SAndroid Build Coastguard Worker         }
980*61046927SAndroid Build Coastguard Worker 
operator !=(iterator i)981*61046927SAndroid Build Coastguard Worker         bool operator!=(iterator i)
982*61046927SAndroid Build Coastguard Worker         {
983*61046927SAndroid Build Coastguard Worker             return (!(*this==i));
984*61046927SAndroid Build Coastguard Worker         }
985*61046927SAndroid Build Coastguard Worker 
operator ++()986*61046927SAndroid Build Coastguard Worker         iterator& operator++()
987*61046927SAndroid Build Coastguard Worker         {
988*61046927SAndroid Build Coastguard Worker             ++index_;
989*61046927SAndroid Build Coastguard Worker             return *this;
990*61046927SAndroid Build Coastguard Worker         }
991*61046927SAndroid Build Coastguard Worker 
operator ++(int)992*61046927SAndroid Build Coastguard Worker         iterator operator++(int)
993*61046927SAndroid Build Coastguard Worker         {
994*61046927SAndroid Build Coastguard Worker             iterator retVal(*this);
995*61046927SAndroid Build Coastguard Worker             ++index_;
996*61046927SAndroid Build Coastguard Worker             return retVal;
997*61046927SAndroid Build Coastguard Worker         }
998*61046927SAndroid Build Coastguard Worker 
operator --()999*61046927SAndroid Build Coastguard Worker         iterator& operator--()
1000*61046927SAndroid Build Coastguard Worker         {
1001*61046927SAndroid Build Coastguard Worker             --index_;
1002*61046927SAndroid Build Coastguard Worker             return *this;
1003*61046927SAndroid Build Coastguard Worker         }
1004*61046927SAndroid Build Coastguard Worker 
operator --(int)1005*61046927SAndroid Build Coastguard Worker         iterator operator--(int)
1006*61046927SAndroid Build Coastguard Worker         {
1007*61046927SAndroid Build Coastguard Worker             iterator retVal(*this);
1008*61046927SAndroid Build Coastguard Worker             --index_;
1009*61046927SAndroid Build Coastguard Worker             return retVal;
1010*61046927SAndroid Build Coastguard Worker         }
1011*61046927SAndroid Build Coastguard Worker 
operator *() const1012*61046927SAndroid Build Coastguard Worker         const T& operator *() const
1013*61046927SAndroid Build Coastguard Worker         {
1014*61046927SAndroid Build Coastguard Worker             return (*vec_)[index_];
1015*61046927SAndroid Build Coastguard Worker         }
1016*61046927SAndroid Build Coastguard Worker     };
1017*61046927SAndroid Build Coastguard Worker 
begin(void)1018*61046927SAndroid Build Coastguard Worker     iterator begin(void)
1019*61046927SAndroid Build Coastguard Worker     {
1020*61046927SAndroid Build Coastguard Worker         return iterator::begin(*this);
1021*61046927SAndroid Build Coastguard Worker     }
1022*61046927SAndroid Build Coastguard Worker 
begin(void) const1023*61046927SAndroid Build Coastguard Worker     iterator begin(void) const
1024*61046927SAndroid Build Coastguard Worker     {
1025*61046927SAndroid Build Coastguard Worker         return iterator::begin(*this);
1026*61046927SAndroid Build Coastguard Worker     }
1027*61046927SAndroid Build Coastguard Worker 
end(void)1028*61046927SAndroid Build Coastguard Worker     iterator end(void)
1029*61046927SAndroid Build Coastguard Worker     {
1030*61046927SAndroid Build Coastguard Worker         return iterator::end(*this);
1031*61046927SAndroid Build Coastguard Worker     }
1032*61046927SAndroid Build Coastguard Worker 
end(void) const1033*61046927SAndroid Build Coastguard Worker     iterator end(void) const
1034*61046927SAndroid Build Coastguard Worker     {
1035*61046927SAndroid Build Coastguard Worker         return iterator::end(*this);
1036*61046927SAndroid Build Coastguard Worker     }
1037*61046927SAndroid Build Coastguard Worker 
front(void)1038*61046927SAndroid Build Coastguard Worker     T& front(void)
1039*61046927SAndroid Build Coastguard Worker     {
1040*61046927SAndroid Build Coastguard Worker         return data_[0];
1041*61046927SAndroid Build Coastguard Worker     }
1042*61046927SAndroid Build Coastguard Worker 
back(void)1043*61046927SAndroid Build Coastguard Worker     T& back(void)
1044*61046927SAndroid Build Coastguard Worker     {
1045*61046927SAndroid Build Coastguard Worker         return data_[size_];
1046*61046927SAndroid Build Coastguard Worker     }
1047*61046927SAndroid Build Coastguard Worker 
front(void) const1048*61046927SAndroid Build Coastguard Worker     const T& front(void) const
1049*61046927SAndroid Build Coastguard Worker     {
1050*61046927SAndroid Build Coastguard Worker         return data_[0];
1051*61046927SAndroid Build Coastguard Worker     }
1052*61046927SAndroid Build Coastguard Worker 
back(void) const1053*61046927SAndroid Build Coastguard Worker     const T& back(void) const
1054*61046927SAndroid Build Coastguard Worker     {
1055*61046927SAndroid Build Coastguard Worker         return data_[size_-1];
1056*61046927SAndroid Build Coastguard Worker     }
1057*61046927SAndroid Build Coastguard Worker } CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
1058*61046927SAndroid Build Coastguard Worker #endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
1059*61046927SAndroid Build Coastguard Worker 
1060*61046927SAndroid Build Coastguard Worker 
1061*61046927SAndroid Build Coastguard Worker 
1062*61046927SAndroid Build Coastguard Worker 
1063*61046927SAndroid Build Coastguard Worker 
1064*61046927SAndroid Build Coastguard Worker namespace detail {
1065*61046927SAndroid Build Coastguard Worker #define __DEFAULT_NOT_INITIALIZED 1
1066*61046927SAndroid Build Coastguard Worker #define __DEFAULT_BEING_INITIALIZED 2
1067*61046927SAndroid Build Coastguard Worker #define __DEFAULT_INITIALIZED 4
1068*61046927SAndroid Build Coastguard Worker 
1069*61046927SAndroid Build Coastguard Worker     /*
1070*61046927SAndroid Build Coastguard Worker      * Compare and exchange primitives are needed for handling of defaults
1071*61046927SAndroid Build Coastguard Worker     */
1072*61046927SAndroid Build Coastguard Worker 
1073*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
compare_exchange(std::atomic<int> * dest,int exchange,int comparand)1074*61046927SAndroid Build Coastguard Worker     inline int compare_exchange(std::atomic<int> * dest, int exchange, int comparand)
1075*61046927SAndroid Build Coastguard Worker #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1076*61046927SAndroid Build Coastguard Worker     inline int compare_exchange(volatile int * dest, int exchange, int comparand)
1077*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1078*61046927SAndroid Build Coastguard Worker     {
1079*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
1080*61046927SAndroid Build Coastguard Worker         std::atomic_compare_exchange_strong(dest, &comparand, exchange);
1081*61046927SAndroid Build Coastguard Worker         return comparand;
1082*61046927SAndroid Build Coastguard Worker #elif _MSC_VER
1083*61046927SAndroid Build Coastguard Worker         return (int)(_InterlockedCompareExchange(
1084*61046927SAndroid Build Coastguard Worker             (volatile long*)dest,
1085*61046927SAndroid Build Coastguard Worker             (long)exchange,
1086*61046927SAndroid Build Coastguard Worker             (long)comparand));
1087*61046927SAndroid Build Coastguard Worker #else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
1088*61046927SAndroid Build Coastguard Worker         return (__sync_val_compare_and_swap(
1089*61046927SAndroid Build Coastguard Worker             dest,
1090*61046927SAndroid Build Coastguard Worker             comparand,
1091*61046927SAndroid Build Coastguard Worker             exchange));
1092*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1093*61046927SAndroid Build Coastguard Worker     }
1094*61046927SAndroid Build Coastguard Worker 
fence()1095*61046927SAndroid Build Coastguard Worker     inline void fence() {
1096*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
1097*61046927SAndroid Build Coastguard Worker         std::atomic_thread_fence(std::memory_order_seq_cst);
1098*61046927SAndroid Build Coastguard Worker #elif _MSC_VER // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1099*61046927SAndroid Build Coastguard Worker         _ReadWriteBarrier();
1100*61046927SAndroid Build Coastguard Worker #else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
1101*61046927SAndroid Build Coastguard Worker         __sync_synchronize();
1102*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1103*61046927SAndroid Build Coastguard Worker     }
1104*61046927SAndroid Build Coastguard Worker } // namespace detail
1105*61046927SAndroid Build Coastguard Worker 
1106*61046927SAndroid Build Coastguard Worker 
1107*61046927SAndroid Build Coastguard Worker /*! \brief class used to interface between C++ and
1108*61046927SAndroid Build Coastguard Worker  *  OpenCL C calls that require arrays of size_t values, whose
1109*61046927SAndroid Build Coastguard Worker  *  size is known statically.
1110*61046927SAndroid Build Coastguard Worker  */
1111*61046927SAndroid Build Coastguard Worker template <int N>
1112*61046927SAndroid Build Coastguard Worker class size_t
1113*61046927SAndroid Build Coastguard Worker {
1114*61046927SAndroid Build Coastguard Worker private:
1115*61046927SAndroid Build Coastguard Worker     ::size_t data_[N];
1116*61046927SAndroid Build Coastguard Worker 
1117*61046927SAndroid Build Coastguard Worker public:
1118*61046927SAndroid Build Coastguard Worker     //! \brief Initialize size_t to all 0s
size_t()1119*61046927SAndroid Build Coastguard Worker     size_t()
1120*61046927SAndroid Build Coastguard Worker     {
1121*61046927SAndroid Build Coastguard Worker         for( int i = 0; i < N; ++i ) {
1122*61046927SAndroid Build Coastguard Worker             data_[i] = 0;
1123*61046927SAndroid Build Coastguard Worker         }
1124*61046927SAndroid Build Coastguard Worker     }
1125*61046927SAndroid Build Coastguard Worker 
operator [](int index)1126*61046927SAndroid Build Coastguard Worker     ::size_t& operator[](int index)
1127*61046927SAndroid Build Coastguard Worker     {
1128*61046927SAndroid Build Coastguard Worker         return data_[index];
1129*61046927SAndroid Build Coastguard Worker     }
1130*61046927SAndroid Build Coastguard Worker 
operator [](int index) const1131*61046927SAndroid Build Coastguard Worker     const ::size_t& operator[](int index) const
1132*61046927SAndroid Build Coastguard Worker     {
1133*61046927SAndroid Build Coastguard Worker         return data_[index];
1134*61046927SAndroid Build Coastguard Worker     }
1135*61046927SAndroid Build Coastguard Worker 
1136*61046927SAndroid Build Coastguard Worker     //! \brief Conversion operator to T*.
operator ::size_t*()1137*61046927SAndroid Build Coastguard Worker     operator ::size_t* ()             { return data_; }
1138*61046927SAndroid Build Coastguard Worker 
1139*61046927SAndroid Build Coastguard Worker     //! \brief Conversion operator to const T*.
operator const::size_t*() const1140*61046927SAndroid Build Coastguard Worker     operator const ::size_t* () const { return data_; }
1141*61046927SAndroid Build Coastguard Worker };
1142*61046927SAndroid Build Coastguard Worker 
1143*61046927SAndroid Build Coastguard Worker namespace detail {
1144*61046927SAndroid Build Coastguard Worker 
1145*61046927SAndroid Build Coastguard Worker // Generic getInfoHelper. The final parameter is used to guide overload
1146*61046927SAndroid Build Coastguard Worker // resolution: the actual parameter passed is an int, which makes this
1147*61046927SAndroid Build Coastguard Worker // a worse conversion sequence than a specialization that declares the
1148*61046927SAndroid Build Coastguard Worker // parameter as an int.
1149*61046927SAndroid Build Coastguard Worker template<typename Functor, typename T>
getInfoHelper(Functor f,cl_uint name,T * param,long)1150*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)
1151*61046927SAndroid Build Coastguard Worker {
1152*61046927SAndroid Build Coastguard Worker     return f(name, sizeof(T), param, NULL);
1153*61046927SAndroid Build Coastguard Worker }
1154*61046927SAndroid Build Coastguard Worker 
1155*61046927SAndroid Build Coastguard Worker // Specialized getInfoHelper for VECTOR_CLASS params
1156*61046927SAndroid Build Coastguard Worker template <typename Func, typename T>
getInfoHelper(Func f,cl_uint name,VECTOR_CLASS<T> * param,long)1157*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, long)
1158*61046927SAndroid Build Coastguard Worker {
1159*61046927SAndroid Build Coastguard Worker     ::size_t required;
1160*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1161*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1162*61046927SAndroid Build Coastguard Worker         return err;
1163*61046927SAndroid Build Coastguard Worker     }
1164*61046927SAndroid Build Coastguard Worker 
1165*61046927SAndroid Build Coastguard Worker     T* value = (T*) alloca(required);
1166*61046927SAndroid Build Coastguard Worker     err = f(name, required, value, NULL);
1167*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1168*61046927SAndroid Build Coastguard Worker         return err;
1169*61046927SAndroid Build Coastguard Worker     }
1170*61046927SAndroid Build Coastguard Worker 
1171*61046927SAndroid Build Coastguard Worker     param->assign(&value[0], &value[required/sizeof(T)]);
1172*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1173*61046927SAndroid Build Coastguard Worker }
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker /* Specialization for reference-counted types. This depends on the
1176*61046927SAndroid Build Coastguard Worker  * existence of Wrapper<T>::cl_type, and none of the other types having the
1177*61046927SAndroid Build Coastguard Worker  * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1178*61046927SAndroid Build Coastguard Worker  * does not work, because when using a derived type (e.g. Context) the generic
1179*61046927SAndroid Build Coastguard Worker  * template will provide a better match.
1180*61046927SAndroid Build Coastguard Worker  */
1181*61046927SAndroid Build Coastguard Worker template <typename Func, typename T>
getInfoHelper(Func f,cl_uint name,VECTOR_CLASS<T> * param,int,typename T::cl_type=0)1182*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, int, typename T::cl_type = 0)
1183*61046927SAndroid Build Coastguard Worker {
1184*61046927SAndroid Build Coastguard Worker     ::size_t required;
1185*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1186*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1187*61046927SAndroid Build Coastguard Worker         return err;
1188*61046927SAndroid Build Coastguard Worker     }
1189*61046927SAndroid Build Coastguard Worker 
1190*61046927SAndroid Build Coastguard Worker     typename T::cl_type * value = (typename T::cl_type *) alloca(required);
1191*61046927SAndroid Build Coastguard Worker     err = f(name, required, value, NULL);
1192*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1193*61046927SAndroid Build Coastguard Worker         return err;
1194*61046927SAndroid Build Coastguard Worker     }
1195*61046927SAndroid Build Coastguard Worker 
1196*61046927SAndroid Build Coastguard Worker     ::size_t elements = required / sizeof(typename T::cl_type);
1197*61046927SAndroid Build Coastguard Worker     param->assign(&value[0], &value[elements]);
1198*61046927SAndroid Build Coastguard Worker     for (::size_t i = 0; i < elements; i++)
1199*61046927SAndroid Build Coastguard Worker     {
1200*61046927SAndroid Build Coastguard Worker         if (value[i] != NULL)
1201*61046927SAndroid Build Coastguard Worker         {
1202*61046927SAndroid Build Coastguard Worker             err = (*param)[i].retain();
1203*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
1204*61046927SAndroid Build Coastguard Worker                 return err;
1205*61046927SAndroid Build Coastguard Worker             }
1206*61046927SAndroid Build Coastguard Worker         }
1207*61046927SAndroid Build Coastguard Worker     }
1208*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1209*61046927SAndroid Build Coastguard Worker }
1210*61046927SAndroid Build Coastguard Worker 
1211*61046927SAndroid Build Coastguard Worker // Specialized for getInfo<CL_PROGRAM_BINARIES>
1212*61046927SAndroid Build Coastguard Worker template <typename Func>
getInfoHelper(Func f,cl_uint name,VECTOR_CLASS<char * > * param,int)1213*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, int)
1214*61046927SAndroid Build Coastguard Worker {
1215*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);
1216*61046927SAndroid Build Coastguard Worker 
1217*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1218*61046927SAndroid Build Coastguard Worker         return err;
1219*61046927SAndroid Build Coastguard Worker     }
1220*61046927SAndroid Build Coastguard Worker 
1221*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1222*61046927SAndroid Build Coastguard Worker }
1223*61046927SAndroid Build Coastguard Worker 
1224*61046927SAndroid Build Coastguard Worker // Specialized GetInfoHelper for STRING_CLASS params
1225*61046927SAndroid Build Coastguard Worker template <typename Func>
getInfoHelper(Func f,cl_uint name,STRING_CLASS * param,long)1226*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
1227*61046927SAndroid Build Coastguard Worker {
1228*61046927SAndroid Build Coastguard Worker #if defined(__NO_STD_VECTOR) || defined(__NO_STD_STRING)
1229*61046927SAndroid Build Coastguard Worker     ::size_t required;
1230*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1231*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1232*61046927SAndroid Build Coastguard Worker         return err;
1233*61046927SAndroid Build Coastguard Worker     }
1234*61046927SAndroid Build Coastguard Worker 
1235*61046927SAndroid Build Coastguard Worker     char* value = (char*)alloca(required);
1236*61046927SAndroid Build Coastguard Worker     err = f(name, required, value, NULL);
1237*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1238*61046927SAndroid Build Coastguard Worker         return err;
1239*61046927SAndroid Build Coastguard Worker     }
1240*61046927SAndroid Build Coastguard Worker 
1241*61046927SAndroid Build Coastguard Worker     *param = value;
1242*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1243*61046927SAndroid Build Coastguard Worker #else
1244*61046927SAndroid Build Coastguard Worker     ::size_t required;
1245*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1246*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1247*61046927SAndroid Build Coastguard Worker         return err;
1248*61046927SAndroid Build Coastguard Worker     }
1249*61046927SAndroid Build Coastguard Worker 
1250*61046927SAndroid Build Coastguard Worker     if (required > 0) {
1251*61046927SAndroid Build Coastguard Worker         // std::string has a constant data member
1252*61046927SAndroid Build Coastguard Worker         // a char vector does not
1253*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<char> value(required);
1254*61046927SAndroid Build Coastguard Worker         err = f(name, required, value.data(), NULL);
1255*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
1256*61046927SAndroid Build Coastguard Worker             return err;
1257*61046927SAndroid Build Coastguard Worker         }
1258*61046927SAndroid Build Coastguard Worker         if (param) {
1259*61046927SAndroid Build Coastguard Worker             param->assign(value.begin(), value.end() - 1u);
1260*61046927SAndroid Build Coastguard Worker         }
1261*61046927SAndroid Build Coastguard Worker     }
1262*61046927SAndroid Build Coastguard Worker     else if (param) {
1263*61046927SAndroid Build Coastguard Worker         param->assign("");
1264*61046927SAndroid Build Coastguard Worker     }
1265*61046927SAndroid Build Coastguard Worker #endif
1266*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1267*61046927SAndroid Build Coastguard Worker }
1268*61046927SAndroid Build Coastguard Worker 
1269*61046927SAndroid Build Coastguard Worker // Specialized GetInfoHelper for cl::size_t params
1270*61046927SAndroid Build Coastguard Worker template <typename Func, ::size_t N>
getInfoHelper(Func f,cl_uint name,size_t<N> * param,long)1271*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, size_t<N>* param, long)
1272*61046927SAndroid Build Coastguard Worker {
1273*61046927SAndroid Build Coastguard Worker     ::size_t required;
1274*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1275*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1276*61046927SAndroid Build Coastguard Worker         return err;
1277*61046927SAndroid Build Coastguard Worker     }
1278*61046927SAndroid Build Coastguard Worker 
1279*61046927SAndroid Build Coastguard Worker     ::size_t* value = (::size_t*) alloca(required);
1280*61046927SAndroid Build Coastguard Worker     err = f(name, required, value, NULL);
1281*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1282*61046927SAndroid Build Coastguard Worker         return err;
1283*61046927SAndroid Build Coastguard Worker     }
1284*61046927SAndroid Build Coastguard Worker 
1285*61046927SAndroid Build Coastguard Worker     for(int i = 0; i < N; ++i) {
1286*61046927SAndroid Build Coastguard Worker         (*param)[i] = value[i];
1287*61046927SAndroid Build Coastguard Worker     }
1288*61046927SAndroid Build Coastguard Worker 
1289*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1290*61046927SAndroid Build Coastguard Worker }
1291*61046927SAndroid Build Coastguard Worker 
1292*61046927SAndroid Build Coastguard Worker template<typename T> struct ReferenceHandler;
1293*61046927SAndroid Build Coastguard Worker 
1294*61046927SAndroid Build Coastguard Worker /* Specialization for reference-counted types. This depends on the
1295*61046927SAndroid Build Coastguard Worker  * existence of Wrapper<T>::cl_type, and none of the other types having the
1296*61046927SAndroid Build Coastguard Worker  * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1297*61046927SAndroid Build Coastguard Worker  * does not work, because when using a derived type (e.g. Context) the generic
1298*61046927SAndroid Build Coastguard Worker  * template will provide a better match.
1299*61046927SAndroid Build Coastguard Worker  */
1300*61046927SAndroid Build Coastguard Worker template<typename Func, typename T>
getInfoHelper(Func f,cl_uint name,T * param,int,typename T::cl_type=0)1301*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)
1302*61046927SAndroid Build Coastguard Worker {
1303*61046927SAndroid Build Coastguard Worker     typename T::cl_type value;
1304*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, sizeof(value), &value, NULL);
1305*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1306*61046927SAndroid Build Coastguard Worker         return err;
1307*61046927SAndroid Build Coastguard Worker     }
1308*61046927SAndroid Build Coastguard Worker     *param = value;
1309*61046927SAndroid Build Coastguard Worker     if (value != NULL)
1310*61046927SAndroid Build Coastguard Worker     {
1311*61046927SAndroid Build Coastguard Worker         err = param->retain();
1312*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
1313*61046927SAndroid Build Coastguard Worker             return err;
1314*61046927SAndroid Build Coastguard Worker         }
1315*61046927SAndroid Build Coastguard Worker     }
1316*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1317*61046927SAndroid Build Coastguard Worker }
1318*61046927SAndroid Build Coastguard Worker 
1319*61046927SAndroid Build Coastguard Worker #define __PARAM_NAME_INFO_1_0(F) \
1320*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \
1321*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \
1322*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \
1323*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \
1324*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \
1325*61046927SAndroid Build Coastguard Worker     \
1326*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \
1327*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \
1328*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \
1329*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \
1330*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \
1331*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \
1332*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \
1333*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \
1334*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \
1335*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \
1336*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \
1337*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \
1338*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \
1339*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \
1340*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \
1341*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \
1342*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \
1343*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \
1344*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \
1345*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \
1346*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \
1347*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \
1348*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \
1349*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \
1350*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \
1351*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \
1352*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \
1353*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \
1354*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \
1355*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \
1356*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \
1357*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\
1358*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \
1359*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \
1360*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \
1361*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \
1362*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \
1363*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \
1364*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \
1365*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \
1366*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \
1367*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \
1368*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \
1369*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \
1370*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \
1371*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \
1372*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \
1373*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \
1374*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \
1375*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \
1376*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \
1377*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \
1378*61046927SAndroid Build Coastguard Worker     \
1379*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \
1380*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS<Device>) \
1381*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS<cl_context_properties>) \
1382*61046927SAndroid Build Coastguard Worker     \
1383*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \
1384*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \
1385*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \
1386*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_int) \
1387*61046927SAndroid Build Coastguard Worker     \
1388*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \
1389*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \
1390*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \
1391*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \
1392*61046927SAndroid Build Coastguard Worker     \
1393*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \
1394*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \
1395*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_SIZE, ::size_t) \
1396*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_HOST_PTR, void*) \
1397*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \
1398*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \
1399*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \
1400*61046927SAndroid Build Coastguard Worker     \
1401*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \
1402*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \
1403*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \
1404*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \
1405*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \
1406*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \
1407*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \
1408*61046927SAndroid Build Coastguard Worker     \
1409*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \
1410*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \
1411*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_bool) \
1412*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_addressing_mode) \
1413*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_filter_mode) \
1414*61046927SAndroid Build Coastguard Worker     \
1415*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \
1416*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \
1417*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \
1418*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS<Device>) \
1419*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \
1420*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \
1421*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS<char *>) \
1422*61046927SAndroid Build Coastguard Worker     \
1423*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \
1424*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \
1425*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \
1426*61046927SAndroid Build Coastguard Worker     \
1427*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \
1428*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \
1429*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \
1430*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \
1431*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \
1432*61046927SAndroid Build Coastguard Worker     \
1433*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \
1434*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \
1435*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \
1436*61046927SAndroid Build Coastguard Worker     \
1437*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \
1438*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \
1439*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \
1440*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties)
1441*61046927SAndroid Build Coastguard Worker 
1442*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
1443*61046927SAndroid Build Coastguard Worker #define __PARAM_NAME_INFO_1_1(F) \
1444*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\
1445*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \
1446*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \
1447*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \
1448*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \
1449*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \
1450*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \
1451*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \
1452*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \
1453*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \
1454*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \
1455*61046927SAndroid Build Coastguard Worker     \
1456*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \
1457*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \
1458*61046927SAndroid Build Coastguard Worker     \
1459*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \
1460*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \
1461*61046927SAndroid Build Coastguard Worker     \
1462*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_CONTEXT, cl::Context)
1463*61046927SAndroid Build Coastguard Worker #endif // CL_VERSION_1_1
1464*61046927SAndroid Build Coastguard Worker 
1465*61046927SAndroid Build Coastguard Worker 
1466*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
1467*61046927SAndroid Build Coastguard Worker #define __PARAM_NAME_INFO_1_2(F) \
1468*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_ARRAY_SIZE, ::size_t) \
1469*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \
1470*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_NUM_MIP_LEVELS, cl_uint) \
1471*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_NUM_SAMPLES, cl_uint) \
1472*61046927SAndroid Build Coastguard Worker     \
1473*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \
1474*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \
1475*61046927SAndroid Build Coastguard Worker     \
1476*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \
1477*61046927SAndroid Build Coastguard Worker     \
1478*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \
1479*61046927SAndroid Build Coastguard Worker     \
1480*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \
1481*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \
1482*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \
1483*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_QUALIFIER, cl_kernel_arg_type_qualifier) \
1484*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \
1485*61046927SAndroid Build Coastguard Worker     \
1486*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_MAX_BUFFER_SIZE, ::size_t) \
1487*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_MAX_ARRAY_SIZE, ::size_t) \
1488*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LINKER_AVAILABLE, cl_bool) \
1489*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS) \
1490*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PRINTF_BUFFER_SIZE, ::size_t) \
1491*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, cl_bool) \
1492*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \
1493*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_MAX_SUB_DEVICES, cl_uint) \
1494*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \
1495*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \
1496*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS<cl_device_partition_property>)  \
1497*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint)
1498*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
1499*61046927SAndroid Build Coastguard Worker 
1500*61046927SAndroid Build Coastguard Worker #if defined(USE_CL_DEVICE_FISSION)
1501*61046927SAndroid Build Coastguard Worker #define __PARAM_NAME_DEVICE_FISSION(F) \
1502*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \
1503*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
1504*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
1505*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \
1506*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS<cl_device_partition_property_ext>)
1507*61046927SAndroid Build Coastguard Worker #endif // USE_CL_DEVICE_FISSION
1508*61046927SAndroid Build Coastguard Worker 
1509*61046927SAndroid Build Coastguard Worker template <typename enum_type, cl_int Name>
1510*61046927SAndroid Build Coastguard Worker struct param_traits {};
1511*61046927SAndroid Build Coastguard Worker 
1512*61046927SAndroid Build Coastguard Worker #define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \
1513*61046927SAndroid Build Coastguard Worker struct token;                                        \
1514*61046927SAndroid Build Coastguard Worker template<>                                           \
1515*61046927SAndroid Build Coastguard Worker struct param_traits<detail:: token,param_name>       \
1516*61046927SAndroid Build Coastguard Worker {                                                    \
1517*61046927SAndroid Build Coastguard Worker     enum { value = param_name };                     \
1518*61046927SAndroid Build Coastguard Worker     typedef T param_type;                            \
1519*61046927SAndroid Build Coastguard Worker };
1520*61046927SAndroid Build Coastguard Worker 
1521*61046927SAndroid Build Coastguard Worker __PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS)
1522*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
1523*61046927SAndroid Build Coastguard Worker __PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS)
1524*61046927SAndroid Build Coastguard Worker #endif // CL_VERSION_1_1
1525*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
1526*61046927SAndroid Build Coastguard Worker __PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS)
1527*61046927SAndroid Build Coastguard Worker #endif // CL_VERSION_1_1
1528*61046927SAndroid Build Coastguard Worker 
1529*61046927SAndroid Build Coastguard Worker #if defined(USE_CL_DEVICE_FISSION)
1530*61046927SAndroid Build Coastguard Worker __PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS);
1531*61046927SAndroid Build Coastguard Worker #endif // USE_CL_DEVICE_FISSION
1532*61046927SAndroid Build Coastguard Worker 
1533*61046927SAndroid Build Coastguard Worker #ifdef CL_PLATFORM_ICD_SUFFIX_KHR
__CL_DECLARE_PARAM_TRAITS(cl_platform_info,CL_PLATFORM_ICD_SUFFIX_KHR,STRING_CLASS)1534*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS)
1535*61046927SAndroid Build Coastguard Worker #endif
1536*61046927SAndroid Build Coastguard Worker 
1537*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
1538*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong)
1539*61046927SAndroid Build Coastguard Worker #endif
1540*61046927SAndroid Build Coastguard Worker 
1541*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
1542*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>)
1543*61046927SAndroid Build Coastguard Worker #endif
1544*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
1545*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint)
1546*61046927SAndroid Build Coastguard Worker #endif
1547*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SIMD_WIDTH_AMD
1548*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint)
1549*61046927SAndroid Build Coastguard Worker #endif
1550*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
1551*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint)
1552*61046927SAndroid Build Coastguard Worker #endif
1553*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
1554*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint)
1555*61046927SAndroid Build Coastguard Worker #endif
1556*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
1557*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint)
1558*61046927SAndroid Build Coastguard Worker #endif
1559*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
1560*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint)
1561*61046927SAndroid Build Coastguard Worker #endif
1562*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
1563*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint)
1564*61046927SAndroid Build Coastguard Worker #endif
1565*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
1566*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint)
1567*61046927SAndroid Build Coastguard Worker #endif
1568*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
1569*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint)
1570*61046927SAndroid Build Coastguard Worker #endif
1571*61046927SAndroid Build Coastguard Worker 
1572*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
1573*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint)
1574*61046927SAndroid Build Coastguard Worker #endif
1575*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV
1576*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint)
1577*61046927SAndroid Build Coastguard Worker #endif
1578*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV
1579*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint)
1580*61046927SAndroid Build Coastguard Worker #endif
1581*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_WARP_SIZE_NV
1582*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint)
1583*61046927SAndroid Build Coastguard Worker #endif
1584*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GPU_OVERLAP_NV
1585*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool)
1586*61046927SAndroid Build Coastguard Worker #endif
1587*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV
1588*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool)
1589*61046927SAndroid Build Coastguard Worker #endif
1590*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_INTEGRATED_MEMORY_NV
1591*61046927SAndroid Build Coastguard Worker __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool)
1592*61046927SAndroid Build Coastguard Worker #endif
1593*61046927SAndroid Build Coastguard Worker 
1594*61046927SAndroid Build Coastguard Worker // Convenience functions
1595*61046927SAndroid Build Coastguard Worker 
1596*61046927SAndroid Build Coastguard Worker template <typename Func, typename T>
1597*61046927SAndroid Build Coastguard Worker inline cl_int
1598*61046927SAndroid Build Coastguard Worker getInfo(Func f, cl_uint name, T* param)
1599*61046927SAndroid Build Coastguard Worker {
1600*61046927SAndroid Build Coastguard Worker     return getInfoHelper(f, name, param, 0);
1601*61046927SAndroid Build Coastguard Worker }
1602*61046927SAndroid Build Coastguard Worker 
1603*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0>
1604*61046927SAndroid Build Coastguard Worker struct GetInfoFunctor0
1605*61046927SAndroid Build Coastguard Worker {
1606*61046927SAndroid Build Coastguard Worker     Func f_; const Arg0& arg0_;
operator ()cl::detail::GetInfoFunctor01607*61046927SAndroid Build Coastguard Worker     cl_int operator ()(
1608*61046927SAndroid Build Coastguard Worker         cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
1609*61046927SAndroid Build Coastguard Worker     { return f_(arg0_, param, size, value, size_ret); }
1610*61046927SAndroid Build Coastguard Worker };
1611*61046927SAndroid Build Coastguard Worker 
1612*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0, typename Arg1>
1613*61046927SAndroid Build Coastguard Worker struct GetInfoFunctor1
1614*61046927SAndroid Build Coastguard Worker {
1615*61046927SAndroid Build Coastguard Worker     Func f_; const Arg0& arg0_; const Arg1& arg1_;
operator ()cl::detail::GetInfoFunctor11616*61046927SAndroid Build Coastguard Worker     cl_int operator ()(
1617*61046927SAndroid Build Coastguard Worker         cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
1618*61046927SAndroid Build Coastguard Worker     { return f_(arg0_, arg1_, param, size, value, size_ret); }
1619*61046927SAndroid Build Coastguard Worker };
1620*61046927SAndroid Build Coastguard Worker 
1621*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0, typename T>
1622*61046927SAndroid Build Coastguard Worker inline cl_int
getInfo(Func f,const Arg0 & arg0,cl_uint name,T * param)1623*61046927SAndroid Build Coastguard Worker getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)
1624*61046927SAndroid Build Coastguard Worker {
1625*61046927SAndroid Build Coastguard Worker     GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };
1626*61046927SAndroid Build Coastguard Worker     return getInfoHelper(f0, name, param, 0);
1627*61046927SAndroid Build Coastguard Worker }
1628*61046927SAndroid Build Coastguard Worker 
1629*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0, typename Arg1, typename T>
1630*61046927SAndroid Build Coastguard Worker inline cl_int
getInfo(Func f,const Arg0 & arg0,const Arg1 & arg1,cl_uint name,T * param)1631*61046927SAndroid Build Coastguard Worker getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)
1632*61046927SAndroid Build Coastguard Worker {
1633*61046927SAndroid Build Coastguard Worker     GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };
1634*61046927SAndroid Build Coastguard Worker     return getInfoHelper(f0, name, param, 0);
1635*61046927SAndroid Build Coastguard Worker }
1636*61046927SAndroid Build Coastguard Worker 
1637*61046927SAndroid Build Coastguard Worker template<typename T>
1638*61046927SAndroid Build Coastguard Worker struct ReferenceHandler
1639*61046927SAndroid Build Coastguard Worker { };
1640*61046927SAndroid Build Coastguard Worker 
1641*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
1642*61046927SAndroid Build Coastguard Worker /**
1643*61046927SAndroid Build Coastguard Worker  * OpenCL 1.2 devices do have retain/release.
1644*61046927SAndroid Build Coastguard Worker  */
1645*61046927SAndroid Build Coastguard Worker template <>
1646*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_device_id>
1647*61046927SAndroid Build Coastguard Worker {
1648*61046927SAndroid Build Coastguard Worker     /**
1649*61046927SAndroid Build Coastguard Worker      * Retain the device.
1650*61046927SAndroid Build Coastguard Worker      * \param device A valid device created using createSubDevices
1651*61046927SAndroid Build Coastguard Worker      * \return
1652*61046927SAndroid Build Coastguard Worker      *   CL_SUCCESS if the function executed successfully.
1653*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_DEVICE if device was not a valid subdevice
1654*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_RESOURCES
1655*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_HOST_MEMORY
1656*61046927SAndroid Build Coastguard Worker      */
retaincl::detail::ReferenceHandler1657*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_device_id device)
1658*61046927SAndroid Build Coastguard Worker     { return ::clRetainDevice(device); }
1659*61046927SAndroid Build Coastguard Worker     /**
1660*61046927SAndroid Build Coastguard Worker      * Retain the device.
1661*61046927SAndroid Build Coastguard Worker      * \param device A valid device created using createSubDevices
1662*61046927SAndroid Build Coastguard Worker      * \return
1663*61046927SAndroid Build Coastguard Worker      *   CL_SUCCESS if the function executed successfully.
1664*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_DEVICE if device was not a valid subdevice
1665*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_RESOURCES
1666*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_HOST_MEMORY
1667*61046927SAndroid Build Coastguard Worker      */
releasecl::detail::ReferenceHandler1668*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_device_id device)
1669*61046927SAndroid Build Coastguard Worker     { return ::clReleaseDevice(device); }
1670*61046927SAndroid Build Coastguard Worker };
1671*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
1672*61046927SAndroid Build Coastguard Worker /**
1673*61046927SAndroid Build Coastguard Worker  * OpenCL 1.1 devices do not have retain/release.
1674*61046927SAndroid Build Coastguard Worker  */
1675*61046927SAndroid Build Coastguard Worker template <>
1676*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_device_id>
1677*61046927SAndroid Build Coastguard Worker {
1678*61046927SAndroid Build Coastguard Worker     // cl_device_id does not have retain().
retaincl::detail::ReferenceHandler1679*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_device_id)
1680*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1681*61046927SAndroid Build Coastguard Worker     // cl_device_id does not have release().
releasecl::detail::ReferenceHandler1682*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_device_id)
1683*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1684*61046927SAndroid Build Coastguard Worker };
1685*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
1686*61046927SAndroid Build Coastguard Worker 
1687*61046927SAndroid Build Coastguard Worker template <>
1688*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_platform_id>
1689*61046927SAndroid Build Coastguard Worker {
1690*61046927SAndroid Build Coastguard Worker     // cl_platform_id does not have retain().
retaincl::detail::ReferenceHandler1691*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_platform_id)
1692*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1693*61046927SAndroid Build Coastguard Worker     // cl_platform_id does not have release().
releasecl::detail::ReferenceHandler1694*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_platform_id)
1695*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1696*61046927SAndroid Build Coastguard Worker };
1697*61046927SAndroid Build Coastguard Worker 
1698*61046927SAndroid Build Coastguard Worker template <>
1699*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_context>
1700*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1701*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_context context)
1702*61046927SAndroid Build Coastguard Worker     { return ::clRetainContext(context); }
releasecl::detail::ReferenceHandler1703*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_context context)
1704*61046927SAndroid Build Coastguard Worker     { return ::clReleaseContext(context); }
1705*61046927SAndroid Build Coastguard Worker };
1706*61046927SAndroid Build Coastguard Worker 
1707*61046927SAndroid Build Coastguard Worker template <>
1708*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_command_queue>
1709*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1710*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_command_queue queue)
1711*61046927SAndroid Build Coastguard Worker     { return ::clRetainCommandQueue(queue); }
releasecl::detail::ReferenceHandler1712*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_command_queue queue)
1713*61046927SAndroid Build Coastguard Worker     { return ::clReleaseCommandQueue(queue); }
1714*61046927SAndroid Build Coastguard Worker };
1715*61046927SAndroid Build Coastguard Worker 
1716*61046927SAndroid Build Coastguard Worker template <>
1717*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_mem>
1718*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1719*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_mem memory)
1720*61046927SAndroid Build Coastguard Worker     { return ::clRetainMemObject(memory); }
releasecl::detail::ReferenceHandler1721*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_mem memory)
1722*61046927SAndroid Build Coastguard Worker     { return ::clReleaseMemObject(memory); }
1723*61046927SAndroid Build Coastguard Worker };
1724*61046927SAndroid Build Coastguard Worker 
1725*61046927SAndroid Build Coastguard Worker template <>
1726*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_sampler>
1727*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1728*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_sampler sampler)
1729*61046927SAndroid Build Coastguard Worker     { return ::clRetainSampler(sampler); }
releasecl::detail::ReferenceHandler1730*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_sampler sampler)
1731*61046927SAndroid Build Coastguard Worker     { return ::clReleaseSampler(sampler); }
1732*61046927SAndroid Build Coastguard Worker };
1733*61046927SAndroid Build Coastguard Worker 
1734*61046927SAndroid Build Coastguard Worker template <>
1735*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_program>
1736*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1737*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_program program)
1738*61046927SAndroid Build Coastguard Worker     { return ::clRetainProgram(program); }
releasecl::detail::ReferenceHandler1739*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_program program)
1740*61046927SAndroid Build Coastguard Worker     { return ::clReleaseProgram(program); }
1741*61046927SAndroid Build Coastguard Worker };
1742*61046927SAndroid Build Coastguard Worker 
1743*61046927SAndroid Build Coastguard Worker template <>
1744*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_kernel>
1745*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1746*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_kernel kernel)
1747*61046927SAndroid Build Coastguard Worker     { return ::clRetainKernel(kernel); }
releasecl::detail::ReferenceHandler1748*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_kernel kernel)
1749*61046927SAndroid Build Coastguard Worker     { return ::clReleaseKernel(kernel); }
1750*61046927SAndroid Build Coastguard Worker };
1751*61046927SAndroid Build Coastguard Worker 
1752*61046927SAndroid Build Coastguard Worker template <>
1753*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_event>
1754*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1755*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_event event)
1756*61046927SAndroid Build Coastguard Worker     { return ::clRetainEvent(event); }
releasecl::detail::ReferenceHandler1757*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_event event)
1758*61046927SAndroid Build Coastguard Worker     { return ::clReleaseEvent(event); }
1759*61046927SAndroid Build Coastguard Worker };
1760*61046927SAndroid Build Coastguard Worker 
1761*61046927SAndroid Build Coastguard Worker 
1762*61046927SAndroid Build Coastguard Worker // Extracts version number with major in the upper 16 bits, minor in the lower 16
getVersion(const char * versionInfo)1763*61046927SAndroid Build Coastguard Worker static cl_uint getVersion(const char *versionInfo)
1764*61046927SAndroid Build Coastguard Worker {
1765*61046927SAndroid Build Coastguard Worker     int highVersion = 0;
1766*61046927SAndroid Build Coastguard Worker     int lowVersion = 0;
1767*61046927SAndroid Build Coastguard Worker     int index = 7;
1768*61046927SAndroid Build Coastguard Worker     while(versionInfo[index] != '.' ) {
1769*61046927SAndroid Build Coastguard Worker         highVersion *= 10;
1770*61046927SAndroid Build Coastguard Worker         highVersion += versionInfo[index]-'0';
1771*61046927SAndroid Build Coastguard Worker         ++index;
1772*61046927SAndroid Build Coastguard Worker     }
1773*61046927SAndroid Build Coastguard Worker     ++index;
1774*61046927SAndroid Build Coastguard Worker     while(versionInfo[index] != ' ' &&  versionInfo[index] != '\0') {
1775*61046927SAndroid Build Coastguard Worker         lowVersion *= 10;
1776*61046927SAndroid Build Coastguard Worker         lowVersion += versionInfo[index]-'0';
1777*61046927SAndroid Build Coastguard Worker         ++index;
1778*61046927SAndroid Build Coastguard Worker     }
1779*61046927SAndroid Build Coastguard Worker     return (highVersion << 16) | lowVersion;
1780*61046927SAndroid Build Coastguard Worker }
1781*61046927SAndroid Build Coastguard Worker 
getPlatformVersion(cl_platform_id platform)1782*61046927SAndroid Build Coastguard Worker static cl_uint getPlatformVersion(cl_platform_id platform)
1783*61046927SAndroid Build Coastguard Worker {
1784*61046927SAndroid Build Coastguard Worker     ::size_t size = 0;
1785*61046927SAndroid Build Coastguard Worker     clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);
1786*61046927SAndroid Build Coastguard Worker     char *versionInfo = (char *) alloca(size);
1787*61046927SAndroid Build Coastguard Worker     clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size);
1788*61046927SAndroid Build Coastguard Worker     return getVersion(versionInfo);
1789*61046927SAndroid Build Coastguard Worker }
1790*61046927SAndroid Build Coastguard Worker 
getDevicePlatformVersion(cl_device_id device)1791*61046927SAndroid Build Coastguard Worker static cl_uint getDevicePlatformVersion(cl_device_id device)
1792*61046927SAndroid Build Coastguard Worker {
1793*61046927SAndroid Build Coastguard Worker     cl_platform_id platform;
1794*61046927SAndroid Build Coastguard Worker     clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);
1795*61046927SAndroid Build Coastguard Worker     return getPlatformVersion(platform);
1796*61046927SAndroid Build Coastguard Worker }
1797*61046927SAndroid Build Coastguard Worker 
1798*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
getContextPlatformVersion(cl_context context)1799*61046927SAndroid Build Coastguard Worker static cl_uint getContextPlatformVersion(cl_context context)
1800*61046927SAndroid Build Coastguard Worker {
1801*61046927SAndroid Build Coastguard Worker     // The platform cannot be queried directly, so we first have to grab a
1802*61046927SAndroid Build Coastguard Worker     // device and obtain its context
1803*61046927SAndroid Build Coastguard Worker     ::size_t size = 0;
1804*61046927SAndroid Build Coastguard Worker     clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);
1805*61046927SAndroid Build Coastguard Worker     if (size == 0)
1806*61046927SAndroid Build Coastguard Worker         return 0;
1807*61046927SAndroid Build Coastguard Worker     cl_device_id *devices = (cl_device_id *) alloca(size);
1808*61046927SAndroid Build Coastguard Worker     clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL);
1809*61046927SAndroid Build Coastguard Worker     return getDevicePlatformVersion(devices[0]);
1810*61046927SAndroid Build Coastguard Worker }
1811*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
1812*61046927SAndroid Build Coastguard Worker 
1813*61046927SAndroid Build Coastguard Worker template <typename T>
1814*61046927SAndroid Build Coastguard Worker class Wrapper
1815*61046927SAndroid Build Coastguard Worker {
1816*61046927SAndroid Build Coastguard Worker public:
1817*61046927SAndroid Build Coastguard Worker     typedef T cl_type;
1818*61046927SAndroid Build Coastguard Worker 
1819*61046927SAndroid Build Coastguard Worker protected:
1820*61046927SAndroid Build Coastguard Worker     cl_type object_;
1821*61046927SAndroid Build Coastguard Worker 
1822*61046927SAndroid Build Coastguard Worker public:
Wrapper()1823*61046927SAndroid Build Coastguard Worker     Wrapper() : object_(NULL) { }
1824*61046927SAndroid Build Coastguard Worker 
Wrapper(const cl_type & obj)1825*61046927SAndroid Build Coastguard Worker     Wrapper(const cl_type &obj) : object_(obj) { }
1826*61046927SAndroid Build Coastguard Worker 
~Wrapper()1827*61046927SAndroid Build Coastguard Worker     ~Wrapper()
1828*61046927SAndroid Build Coastguard Worker     {
1829*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { release(); }
1830*61046927SAndroid Build Coastguard Worker     }
1831*61046927SAndroid Build Coastguard Worker 
Wrapper(const Wrapper<cl_type> & rhs)1832*61046927SAndroid Build Coastguard Worker     Wrapper(const Wrapper<cl_type>& rhs)
1833*61046927SAndroid Build Coastguard Worker     {
1834*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
1835*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1836*61046927SAndroid Build Coastguard Worker     }
1837*61046927SAndroid Build Coastguard Worker 
1838*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper(Wrapper<cl_type> && rhs)1839*61046927SAndroid Build Coastguard Worker     Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
1840*61046927SAndroid Build Coastguard Worker     {
1841*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
1842*61046927SAndroid Build Coastguard Worker         rhs.object_ = NULL;
1843*61046927SAndroid Build Coastguard Worker     }
1844*61046927SAndroid Build Coastguard Worker #endif
1845*61046927SAndroid Build Coastguard Worker 
operator =(const Wrapper<cl_type> & rhs)1846*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1847*61046927SAndroid Build Coastguard Worker     {
1848*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
1849*61046927SAndroid Build Coastguard Worker             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1850*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
1851*61046927SAndroid Build Coastguard Worker             if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1852*61046927SAndroid Build Coastguard Worker         }
1853*61046927SAndroid Build Coastguard Worker         return *this;
1854*61046927SAndroid Build Coastguard Worker     }
1855*61046927SAndroid Build Coastguard Worker 
1856*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
operator =(Wrapper<cl_type> && rhs)1857*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
1858*61046927SAndroid Build Coastguard Worker     {
1859*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
1860*61046927SAndroid Build Coastguard Worker             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1861*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
1862*61046927SAndroid Build Coastguard Worker             rhs.object_ = NULL;
1863*61046927SAndroid Build Coastguard Worker         }
1864*61046927SAndroid Build Coastguard Worker         return *this;
1865*61046927SAndroid Build Coastguard Worker     }
1866*61046927SAndroid Build Coastguard Worker #endif
1867*61046927SAndroid Build Coastguard Worker 
operator =(const cl_type & rhs)1868*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const cl_type &rhs)
1869*61046927SAndroid Build Coastguard Worker     {
1870*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1871*61046927SAndroid Build Coastguard Worker         object_ = rhs;
1872*61046927SAndroid Build Coastguard Worker         return *this;
1873*61046927SAndroid Build Coastguard Worker     }
1874*61046927SAndroid Build Coastguard Worker 
operator ()() const1875*61046927SAndroid Build Coastguard Worker     cl_type operator ()() const { return object_; }
1876*61046927SAndroid Build Coastguard Worker 
operator ()()1877*61046927SAndroid Build Coastguard Worker     cl_type& operator ()() { return object_; }
1878*61046927SAndroid Build Coastguard Worker 
1879*61046927SAndroid Build Coastguard Worker protected:
1880*61046927SAndroid Build Coastguard Worker     template<typename Func, typename U>
1881*61046927SAndroid Build Coastguard Worker     friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1882*61046927SAndroid Build Coastguard Worker 
retain() const1883*61046927SAndroid Build Coastguard Worker     cl_int retain() const
1884*61046927SAndroid Build Coastguard Worker     {
1885*61046927SAndroid Build Coastguard Worker         return ReferenceHandler<cl_type>::retain(object_);
1886*61046927SAndroid Build Coastguard Worker     }
1887*61046927SAndroid Build Coastguard Worker 
release() const1888*61046927SAndroid Build Coastguard Worker     cl_int release() const
1889*61046927SAndroid Build Coastguard Worker     {
1890*61046927SAndroid Build Coastguard Worker         return ReferenceHandler<cl_type>::release(object_);
1891*61046927SAndroid Build Coastguard Worker     }
1892*61046927SAndroid Build Coastguard Worker };
1893*61046927SAndroid Build Coastguard Worker 
1894*61046927SAndroid Build Coastguard Worker template <>
1895*61046927SAndroid Build Coastguard Worker class Wrapper<cl_device_id>
1896*61046927SAndroid Build Coastguard Worker {
1897*61046927SAndroid Build Coastguard Worker public:
1898*61046927SAndroid Build Coastguard Worker     typedef cl_device_id cl_type;
1899*61046927SAndroid Build Coastguard Worker 
1900*61046927SAndroid Build Coastguard Worker protected:
1901*61046927SAndroid Build Coastguard Worker     cl_type object_;
1902*61046927SAndroid Build Coastguard Worker     bool referenceCountable_;
1903*61046927SAndroid Build Coastguard Worker 
isReferenceCountable(cl_device_id device)1904*61046927SAndroid Build Coastguard Worker     static bool isReferenceCountable(cl_device_id device)
1905*61046927SAndroid Build Coastguard Worker     {
1906*61046927SAndroid Build Coastguard Worker         bool retVal = false;
1907*61046927SAndroid Build Coastguard Worker         if (device != NULL) {
1908*61046927SAndroid Build Coastguard Worker             int version = getDevicePlatformVersion(device);
1909*61046927SAndroid Build Coastguard Worker             if(version > ((1 << 16) + 1)) {
1910*61046927SAndroid Build Coastguard Worker                 retVal = true;
1911*61046927SAndroid Build Coastguard Worker             }
1912*61046927SAndroid Build Coastguard Worker         }
1913*61046927SAndroid Build Coastguard Worker         return retVal;
1914*61046927SAndroid Build Coastguard Worker     }
1915*61046927SAndroid Build Coastguard Worker 
1916*61046927SAndroid Build Coastguard Worker public:
Wrapper()1917*61046927SAndroid Build Coastguard Worker     Wrapper() : object_(NULL), referenceCountable_(false)
1918*61046927SAndroid Build Coastguard Worker     {
1919*61046927SAndroid Build Coastguard Worker     }
1920*61046927SAndroid Build Coastguard Worker 
Wrapper(const cl_type & obj)1921*61046927SAndroid Build Coastguard Worker     Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false)
1922*61046927SAndroid Build Coastguard Worker     {
1923*61046927SAndroid Build Coastguard Worker         referenceCountable_ = isReferenceCountable(obj);
1924*61046927SAndroid Build Coastguard Worker     }
1925*61046927SAndroid Build Coastguard Worker 
~Wrapper()1926*61046927SAndroid Build Coastguard Worker     ~Wrapper()
1927*61046927SAndroid Build Coastguard Worker     {
1928*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { release(); }
1929*61046927SAndroid Build Coastguard Worker     }
1930*61046927SAndroid Build Coastguard Worker 
Wrapper(const Wrapper<cl_type> & rhs)1931*61046927SAndroid Build Coastguard Worker     Wrapper(const Wrapper<cl_type>& rhs)
1932*61046927SAndroid Build Coastguard Worker     {
1933*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
1934*61046927SAndroid Build Coastguard Worker         referenceCountable_ = isReferenceCountable(object_);
1935*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1936*61046927SAndroid Build Coastguard Worker     }
1937*61046927SAndroid Build Coastguard Worker 
1938*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper(Wrapper<cl_type> && rhs)1939*61046927SAndroid Build Coastguard Worker     Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
1940*61046927SAndroid Build Coastguard Worker     {
1941*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
1942*61046927SAndroid Build Coastguard Worker         referenceCountable_ = rhs.referenceCountable_;
1943*61046927SAndroid Build Coastguard Worker         rhs.object_ = NULL;
1944*61046927SAndroid Build Coastguard Worker         rhs.referenceCountable_ = false;
1945*61046927SAndroid Build Coastguard Worker     }
1946*61046927SAndroid Build Coastguard Worker #endif
1947*61046927SAndroid Build Coastguard Worker 
operator =(const Wrapper<cl_type> & rhs)1948*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1949*61046927SAndroid Build Coastguard Worker     {
1950*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
1951*61046927SAndroid Build Coastguard Worker             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1952*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
1953*61046927SAndroid Build Coastguard Worker             referenceCountable_ = rhs.referenceCountable_;
1954*61046927SAndroid Build Coastguard Worker             if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1955*61046927SAndroid Build Coastguard Worker         }
1956*61046927SAndroid Build Coastguard Worker         return *this;
1957*61046927SAndroid Build Coastguard Worker     }
1958*61046927SAndroid Build Coastguard Worker 
1959*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
operator =(Wrapper<cl_type> && rhs)1960*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
1961*61046927SAndroid Build Coastguard Worker     {
1962*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
1963*61046927SAndroid Build Coastguard Worker             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1964*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
1965*61046927SAndroid Build Coastguard Worker             referenceCountable_ = rhs.referenceCountable_;
1966*61046927SAndroid Build Coastguard Worker             rhs.object_ = NULL;
1967*61046927SAndroid Build Coastguard Worker             rhs.referenceCountable_ = false;
1968*61046927SAndroid Build Coastguard Worker         }
1969*61046927SAndroid Build Coastguard Worker         return *this;
1970*61046927SAndroid Build Coastguard Worker     }
1971*61046927SAndroid Build Coastguard Worker #endif
1972*61046927SAndroid Build Coastguard Worker 
operator =(const cl_type & rhs)1973*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const cl_type &rhs)
1974*61046927SAndroid Build Coastguard Worker     {
1975*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1976*61046927SAndroid Build Coastguard Worker         object_ = rhs;
1977*61046927SAndroid Build Coastguard Worker         referenceCountable_ = isReferenceCountable(object_);
1978*61046927SAndroid Build Coastguard Worker         return *this;
1979*61046927SAndroid Build Coastguard Worker     }
1980*61046927SAndroid Build Coastguard Worker 
operator ()() const1981*61046927SAndroid Build Coastguard Worker     cl_type operator ()() const { return object_; }
1982*61046927SAndroid Build Coastguard Worker 
operator ()()1983*61046927SAndroid Build Coastguard Worker     cl_type& operator ()() { return object_; }
1984*61046927SAndroid Build Coastguard Worker 
1985*61046927SAndroid Build Coastguard Worker protected:
1986*61046927SAndroid Build Coastguard Worker     template<typename Func, typename U>
1987*61046927SAndroid Build Coastguard Worker     friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1988*61046927SAndroid Build Coastguard Worker 
1989*61046927SAndroid Build Coastguard Worker     template<typename Func, typename U>
1990*61046927SAndroid Build Coastguard Worker     friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS<U>*, int, typename U::cl_type);
1991*61046927SAndroid Build Coastguard Worker 
retain() const1992*61046927SAndroid Build Coastguard Worker     cl_int retain() const
1993*61046927SAndroid Build Coastguard Worker     {
1994*61046927SAndroid Build Coastguard Worker         if( referenceCountable_ ) {
1995*61046927SAndroid Build Coastguard Worker             return ReferenceHandler<cl_type>::retain(object_);
1996*61046927SAndroid Build Coastguard Worker         }
1997*61046927SAndroid Build Coastguard Worker         else {
1998*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
1999*61046927SAndroid Build Coastguard Worker         }
2000*61046927SAndroid Build Coastguard Worker     }
2001*61046927SAndroid Build Coastguard Worker 
release() const2002*61046927SAndroid Build Coastguard Worker     cl_int release() const
2003*61046927SAndroid Build Coastguard Worker     {
2004*61046927SAndroid Build Coastguard Worker         if( referenceCountable_ ) {
2005*61046927SAndroid Build Coastguard Worker             return ReferenceHandler<cl_type>::release(object_);
2006*61046927SAndroid Build Coastguard Worker         }
2007*61046927SAndroid Build Coastguard Worker         else {
2008*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
2009*61046927SAndroid Build Coastguard Worker         }
2010*61046927SAndroid Build Coastguard Worker     }
2011*61046927SAndroid Build Coastguard Worker };
2012*61046927SAndroid Build Coastguard Worker 
2013*61046927SAndroid Build Coastguard Worker } // namespace detail
2014*61046927SAndroid Build Coastguard Worker //! \endcond
2015*61046927SAndroid Build Coastguard Worker 
2016*61046927SAndroid Build Coastguard Worker /*! \stuct ImageFormat
2017*61046927SAndroid Build Coastguard Worker  *  \brief Adds constructors and member functions for cl_image_format.
2018*61046927SAndroid Build Coastguard Worker  *
2019*61046927SAndroid Build Coastguard Worker  *  \see cl_image_format
2020*61046927SAndroid Build Coastguard Worker  */
2021*61046927SAndroid Build Coastguard Worker struct ImageFormat : public cl_image_format
2022*61046927SAndroid Build Coastguard Worker {
2023*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - performs no initialization.
ImageFormatcl::ImageFormat2024*61046927SAndroid Build Coastguard Worker     ImageFormat(){}
2025*61046927SAndroid Build Coastguard Worker 
2026*61046927SAndroid Build Coastguard Worker     //! \brief Initializing constructor.
ImageFormatcl::ImageFormat2027*61046927SAndroid Build Coastguard Worker     ImageFormat(cl_channel_order order, cl_channel_type type)
2028*61046927SAndroid Build Coastguard Worker     {
2029*61046927SAndroid Build Coastguard Worker         image_channel_order = order;
2030*61046927SAndroid Build Coastguard Worker         image_channel_data_type = type;
2031*61046927SAndroid Build Coastguard Worker     }
2032*61046927SAndroid Build Coastguard Worker 
2033*61046927SAndroid Build Coastguard Worker     //! \brief Assignment operator.
operator =cl::ImageFormat2034*61046927SAndroid Build Coastguard Worker     ImageFormat& operator = (const ImageFormat& rhs)
2035*61046927SAndroid Build Coastguard Worker     {
2036*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
2037*61046927SAndroid Build Coastguard Worker             this->image_channel_data_type = rhs.image_channel_data_type;
2038*61046927SAndroid Build Coastguard Worker             this->image_channel_order     = rhs.image_channel_order;
2039*61046927SAndroid Build Coastguard Worker         }
2040*61046927SAndroid Build Coastguard Worker         return *this;
2041*61046927SAndroid Build Coastguard Worker     }
2042*61046927SAndroid Build Coastguard Worker };
2043*61046927SAndroid Build Coastguard Worker 
2044*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_device_id.
2045*61046927SAndroid Build Coastguard Worker  *
2046*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are inexpensive, since they don't 'own'
2047*61046927SAndroid Build Coastguard Worker  *        any underlying resources or data structures.
2048*61046927SAndroid Build Coastguard Worker  *
2049*61046927SAndroid Build Coastguard Worker  *  \see cl_device_id
2050*61046927SAndroid Build Coastguard Worker  */
2051*61046927SAndroid Build Coastguard Worker class Device : public detail::Wrapper<cl_device_id>
2052*61046927SAndroid Build Coastguard Worker {
2053*61046927SAndroid Build Coastguard Worker public:
2054*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Device()2055*61046927SAndroid Build Coastguard Worker     Device() : detail::Wrapper<cl_type>() { }
2056*61046927SAndroid Build Coastguard Worker 
2057*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_device_id.
2058*61046927SAndroid Build Coastguard Worker      *
2059*61046927SAndroid Build Coastguard Worker      *  This simply copies the device ID value, which is an inexpensive operation.
2060*61046927SAndroid Build Coastguard Worker      */
Device(const cl_device_id & device)2061*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { }
2062*61046927SAndroid Build Coastguard Worker 
2063*61046927SAndroid Build Coastguard Worker     /*! \brief Returns the first device on the default context.
2064*61046927SAndroid Build Coastguard Worker      *
2065*61046927SAndroid Build Coastguard Worker      *  \see Context::getDefault()
2066*61046927SAndroid Build Coastguard Worker      */
2067*61046927SAndroid Build Coastguard Worker     static Device getDefault(cl_int * err = NULL);
2068*61046927SAndroid Build Coastguard Worker 
2069*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_device_id.
2070*61046927SAndroid Build Coastguard Worker      *
2071*61046927SAndroid Build Coastguard Worker      *  This simply copies the device ID value, which is an inexpensive operation.
2072*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_device_id & rhs)2073*61046927SAndroid Build Coastguard Worker     Device& operator = (const cl_device_id& rhs)
2074*61046927SAndroid Build Coastguard Worker     {
2075*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
2076*61046927SAndroid Build Coastguard Worker         return *this;
2077*61046927SAndroid Build Coastguard Worker     }
2078*61046927SAndroid Build Coastguard Worker 
2079*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
2080*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2081*61046927SAndroid Build Coastguard Worker      */
Device(const Device & dev)2082*61046927SAndroid Build Coastguard Worker     Device(const Device& dev) : detail::Wrapper<cl_type>(dev) {}
2083*61046927SAndroid Build Coastguard Worker 
2084*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
2085*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2086*61046927SAndroid Build Coastguard Worker      */
operator =(const Device & dev)2087*61046927SAndroid Build Coastguard Worker     Device& operator = (const Device &dev)
2088*61046927SAndroid Build Coastguard Worker     {
2089*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(dev);
2090*61046927SAndroid Build Coastguard Worker         return *this;
2091*61046927SAndroid Build Coastguard Worker     }
2092*61046927SAndroid Build Coastguard Worker 
2093*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2094*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
2095*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2096*61046927SAndroid Build Coastguard Worker      */
Device(Device && dev)2097*61046927SAndroid Build Coastguard Worker     Device(Device&& dev) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(dev)) {}
2098*61046927SAndroid Build Coastguard Worker 
2099*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
2100*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2101*61046927SAndroid Build Coastguard Worker      */
operator =(Device && dev)2102*61046927SAndroid Build Coastguard Worker     Device& operator = (Device &&dev)
2103*61046927SAndroid Build Coastguard Worker     {
2104*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(dev));
2105*61046927SAndroid Build Coastguard Worker         return *this;
2106*61046927SAndroid Build Coastguard Worker     }
2107*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2108*61046927SAndroid Build Coastguard Worker 
2109*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetDeviceInfo().
2110*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_device_info name,T * param) const2111*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_device_info name, T* param) const
2112*61046927SAndroid Build Coastguard Worker     {
2113*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2114*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetDeviceInfo, object_, name, param),
2115*61046927SAndroid Build Coastguard Worker             __GET_DEVICE_INFO_ERR);
2116*61046927SAndroid Build Coastguard Worker     }
2117*61046927SAndroid Build Coastguard Worker 
2118*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetDeviceInfo() that returns by value.
2119*61046927SAndroid Build Coastguard Worker     template <cl_device_info name> typename
2120*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_device_info, name>::param_type
getInfo(cl_int * err=NULL) const2121*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
2122*61046927SAndroid Build Coastguard Worker     {
2123*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2124*61046927SAndroid Build Coastguard Worker             detail::cl_device_info, name>::param_type param;
2125*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
2126*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2127*61046927SAndroid Build Coastguard Worker             *err = result;
2128*61046927SAndroid Build Coastguard Worker         }
2129*61046927SAndroid Build Coastguard Worker         return param;
2130*61046927SAndroid Build Coastguard Worker     }
2131*61046927SAndroid Build Coastguard Worker 
2132*61046927SAndroid Build Coastguard Worker     /**
2133*61046927SAndroid Build Coastguard Worker      * CL 1.2 version
2134*61046927SAndroid Build Coastguard Worker      */
2135*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
2136*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clCreateSubDevicesEXT().
createSubDevices(const cl_device_partition_property * properties,VECTOR_CLASS<Device> * devices)2137*61046927SAndroid Build Coastguard Worker     cl_int createSubDevices(
2138*61046927SAndroid Build Coastguard Worker         const cl_device_partition_property * properties,
2139*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<Device>* devices)
2140*61046927SAndroid Build Coastguard Worker     {
2141*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2142*61046927SAndroid Build Coastguard Worker         cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n);
2143*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2144*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2145*61046927SAndroid Build Coastguard Worker         }
2146*61046927SAndroid Build Coastguard Worker 
2147*61046927SAndroid Build Coastguard Worker         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2148*61046927SAndroid Build Coastguard Worker         err = clCreateSubDevices(object_, properties, n, ids, NULL);
2149*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2150*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2151*61046927SAndroid Build Coastguard Worker         }
2152*61046927SAndroid Build Coastguard Worker 
2153*61046927SAndroid Build Coastguard Worker         devices->assign(&ids[0], &ids[n]);
2154*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2155*61046927SAndroid Build Coastguard Worker     }
2156*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
2157*61046927SAndroid Build Coastguard Worker 
2158*61046927SAndroid Build Coastguard Worker /**
2159*61046927SAndroid Build Coastguard Worker  * CL 1.1 version that uses device fission.
2160*61046927SAndroid Build Coastguard Worker  */
2161*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
2162*61046927SAndroid Build Coastguard Worker #if defined(USE_CL_DEVICE_FISSION)
createSubDevices(const cl_device_partition_property_ext * properties,VECTOR_CLASS<Device> * devices)2163*61046927SAndroid Build Coastguard Worker     cl_int createSubDevices(
2164*61046927SAndroid Build Coastguard Worker         const cl_device_partition_property_ext * properties,
2165*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<Device>* devices)
2166*61046927SAndroid Build Coastguard Worker     {
2167*61046927SAndroid Build Coastguard Worker         typedef CL_API_ENTRY cl_int
2168*61046927SAndroid Build Coastguard Worker             ( CL_API_CALL * PFN_clCreateSubDevicesEXT)(
2169*61046927SAndroid Build Coastguard Worker                 cl_device_id /*in_device*/,
2170*61046927SAndroid Build Coastguard Worker                 const cl_device_partition_property_ext * /* properties */,
2171*61046927SAndroid Build Coastguard Worker                 cl_uint /*num_entries*/,
2172*61046927SAndroid Build Coastguard Worker                 cl_device_id * /*out_devices*/,
2173*61046927SAndroid Build Coastguard Worker                 cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
2174*61046927SAndroid Build Coastguard Worker 
2175*61046927SAndroid Build Coastguard Worker         static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL;
2176*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT);
2177*61046927SAndroid Build Coastguard Worker 
2178*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2179*61046927SAndroid Build Coastguard Worker         cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n);
2180*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2181*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2182*61046927SAndroid Build Coastguard Worker         }
2183*61046927SAndroid Build Coastguard Worker 
2184*61046927SAndroid Build Coastguard Worker         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2185*61046927SAndroid Build Coastguard Worker         err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL);
2186*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2187*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2188*61046927SAndroid Build Coastguard Worker         }
2189*61046927SAndroid Build Coastguard Worker 
2190*61046927SAndroid Build Coastguard Worker         devices->assign(&ids[0], &ids[n]);
2191*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2192*61046927SAndroid Build Coastguard Worker     }
2193*61046927SAndroid Build Coastguard Worker #endif // #if defined(USE_CL_DEVICE_FISSION)
2194*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
2195*61046927SAndroid Build Coastguard Worker };
2196*61046927SAndroid Build Coastguard Worker 
2197*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_platform_id.
2198*61046927SAndroid Build Coastguard Worker  *
2199*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are inexpensive, since they don't 'own'
2200*61046927SAndroid Build Coastguard Worker  *        any underlying resources or data structures.
2201*61046927SAndroid Build Coastguard Worker  *
2202*61046927SAndroid Build Coastguard Worker  *  \see cl_platform_id
2203*61046927SAndroid Build Coastguard Worker  */
2204*61046927SAndroid Build Coastguard Worker class Platform : public detail::Wrapper<cl_platform_id>
2205*61046927SAndroid Build Coastguard Worker {
2206*61046927SAndroid Build Coastguard Worker public:
2207*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Platform()2208*61046927SAndroid Build Coastguard Worker     Platform() : detail::Wrapper<cl_type>()  { }
2209*61046927SAndroid Build Coastguard Worker 
2210*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_platform_id.
2211*61046927SAndroid Build Coastguard Worker      *
2212*61046927SAndroid Build Coastguard Worker      *  This simply copies the platform ID value, which is an inexpensive operation.
2213*61046927SAndroid Build Coastguard Worker      */
Platform(const cl_platform_id & platform)2214*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { }
2215*61046927SAndroid Build Coastguard Worker 
2216*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_platform_id.
2217*61046927SAndroid Build Coastguard Worker      *
2218*61046927SAndroid Build Coastguard Worker      *  This simply copies the platform ID value, which is an inexpensive operation.
2219*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_platform_id & rhs)2220*61046927SAndroid Build Coastguard Worker     Platform& operator = (const cl_platform_id& rhs)
2221*61046927SAndroid Build Coastguard Worker     {
2222*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
2223*61046927SAndroid Build Coastguard Worker         return *this;
2224*61046927SAndroid Build Coastguard Worker     }
2225*61046927SAndroid Build Coastguard Worker 
2226*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetPlatformInfo().
getInfo(cl_platform_info name,STRING_CLASS * param) const2227*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const
2228*61046927SAndroid Build Coastguard Worker     {
2229*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2230*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetPlatformInfo, object_, name, param),
2231*61046927SAndroid Build Coastguard Worker             __GET_PLATFORM_INFO_ERR);
2232*61046927SAndroid Build Coastguard Worker     }
2233*61046927SAndroid Build Coastguard Worker 
2234*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetPlatformInfo() that returns by value.
2235*61046927SAndroid Build Coastguard Worker     template <cl_platform_info name> typename
2236*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_platform_info, name>::param_type
getInfo(cl_int * err=NULL) const2237*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
2238*61046927SAndroid Build Coastguard Worker     {
2239*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2240*61046927SAndroid Build Coastguard Worker             detail::cl_platform_info, name>::param_type param;
2241*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
2242*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2243*61046927SAndroid Build Coastguard Worker             *err = result;
2244*61046927SAndroid Build Coastguard Worker         }
2245*61046927SAndroid Build Coastguard Worker         return param;
2246*61046927SAndroid Build Coastguard Worker     }
2247*61046927SAndroid Build Coastguard Worker 
2248*61046927SAndroid Build Coastguard Worker     /*! \brief Gets a list of devices for this platform.
2249*61046927SAndroid Build Coastguard Worker      *
2250*61046927SAndroid Build Coastguard Worker      *  Wraps clGetDeviceIDs().
2251*61046927SAndroid Build Coastguard Worker      */
getDevices(cl_device_type type,VECTOR_CLASS<Device> * devices) const2252*61046927SAndroid Build Coastguard Worker     cl_int getDevices(
2253*61046927SAndroid Build Coastguard Worker         cl_device_type type,
2254*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<Device>* devices) const
2255*61046927SAndroid Build Coastguard Worker     {
2256*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2257*61046927SAndroid Build Coastguard Worker         if( devices == NULL ) {
2258*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2259*61046927SAndroid Build Coastguard Worker         }
2260*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n);
2261*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS && err != CL_DEVICE_NOT_FOUND) {
2262*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2263*61046927SAndroid Build Coastguard Worker         }
2264*61046927SAndroid Build Coastguard Worker 
2265*61046927SAndroid Build Coastguard Worker         if (n > 0) {
2266*61046927SAndroid Build Coastguard Worker                 cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2267*61046927SAndroid Build Coastguard Worker                 err = ::clGetDeviceIDs(object_, type, n, ids, NULL);
2268*61046927SAndroid Build Coastguard Worker                 if (err != CL_SUCCESS) {
2269*61046927SAndroid Build Coastguard Worker                     return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2270*61046927SAndroid Build Coastguard Worker                 }
2271*61046927SAndroid Build Coastguard Worker 
2272*61046927SAndroid Build Coastguard Worker                 devices->assign(&ids[0], &ids[n]);
2273*61046927SAndroid Build Coastguard Worker         } else {
2274*61046927SAndroid Build Coastguard Worker             devices->clear();
2275*61046927SAndroid Build Coastguard Worker         }
2276*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2277*61046927SAndroid Build Coastguard Worker     }
2278*61046927SAndroid Build Coastguard Worker 
2279*61046927SAndroid Build Coastguard Worker #if defined(USE_DX_INTEROP)
2280*61046927SAndroid Build Coastguard Worker    /*! \brief Get the list of available D3D10 devices.
2281*61046927SAndroid Build Coastguard Worker      *
2282*61046927SAndroid Build Coastguard Worker      *  \param d3d_device_source.
2283*61046927SAndroid Build Coastguard Worker      *
2284*61046927SAndroid Build Coastguard Worker      *  \param d3d_object.
2285*61046927SAndroid Build Coastguard Worker      *
2286*61046927SAndroid Build Coastguard Worker      *  \param d3d_device_set.
2287*61046927SAndroid Build Coastguard Worker      *
2288*61046927SAndroid Build Coastguard Worker      *  \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device
2289*61046927SAndroid Build Coastguard Worker      *  values returned in devices can be used to identify a specific OpenCL
2290*61046927SAndroid Build Coastguard Worker      *  device. If \a devices argument is NULL, this argument is ignored.
2291*61046927SAndroid Build Coastguard Worker      *
2292*61046927SAndroid Build Coastguard Worker      *  \return One of the following values:
2293*61046927SAndroid Build Coastguard Worker      *    - CL_SUCCESS if the function is executed successfully.
2294*61046927SAndroid Build Coastguard Worker      *
2295*61046927SAndroid Build Coastguard Worker      *  The application can query specific capabilities of the OpenCL device(s)
2296*61046927SAndroid Build Coastguard Worker      *  returned by cl::getDevices. This can be used by the application to
2297*61046927SAndroid Build Coastguard Worker      *  determine which device(s) to use.
2298*61046927SAndroid Build Coastguard Worker      *
2299*61046927SAndroid Build Coastguard Worker      * \note In the case that exceptions are enabled and a return value
2300*61046927SAndroid Build Coastguard Worker      * other than CL_SUCCESS is generated, then cl::Error exception is
2301*61046927SAndroid Build Coastguard Worker      * generated.
2302*61046927SAndroid Build Coastguard Worker      */
getDevices(cl_d3d10_device_source_khr d3d_device_source,void * d3d_object,cl_d3d10_device_set_khr d3d_device_set,VECTOR_CLASS<Device> * devices) const2303*61046927SAndroid Build Coastguard Worker     cl_int getDevices(
2304*61046927SAndroid Build Coastguard Worker         cl_d3d10_device_source_khr d3d_device_source,
2305*61046927SAndroid Build Coastguard Worker         void *                     d3d_object,
2306*61046927SAndroid Build Coastguard Worker         cl_d3d10_device_set_khr    d3d_device_set,
2307*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<Device>* devices) const
2308*61046927SAndroid Build Coastguard Worker     {
2309*61046927SAndroid Build Coastguard Worker         typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)(
2310*61046927SAndroid Build Coastguard Worker             cl_platform_id platform,
2311*61046927SAndroid Build Coastguard Worker             cl_d3d10_device_source_khr d3d_device_source,
2312*61046927SAndroid Build Coastguard Worker             void * d3d_object,
2313*61046927SAndroid Build Coastguard Worker             cl_d3d10_device_set_khr d3d_device_set,
2314*61046927SAndroid Build Coastguard Worker             cl_uint num_entries,
2315*61046927SAndroid Build Coastguard Worker             cl_device_id * devices,
2316*61046927SAndroid Build Coastguard Worker             cl_uint* num_devices);
2317*61046927SAndroid Build Coastguard Worker 
2318*61046927SAndroid Build Coastguard Worker         if( devices == NULL ) {
2319*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2320*61046927SAndroid Build Coastguard Worker         }
2321*61046927SAndroid Build Coastguard Worker 
2322*61046927SAndroid Build Coastguard Worker         static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL;
2323*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR);
2324*61046927SAndroid Build Coastguard Worker 
2325*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2326*61046927SAndroid Build Coastguard Worker         cl_int err = pfn_clGetDeviceIDsFromD3D10KHR(
2327*61046927SAndroid Build Coastguard Worker             object_,
2328*61046927SAndroid Build Coastguard Worker             d3d_device_source,
2329*61046927SAndroid Build Coastguard Worker             d3d_object,
2330*61046927SAndroid Build Coastguard Worker             d3d_device_set,
2331*61046927SAndroid Build Coastguard Worker             0,
2332*61046927SAndroid Build Coastguard Worker             NULL,
2333*61046927SAndroid Build Coastguard Worker             &n);
2334*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2335*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2336*61046927SAndroid Build Coastguard Worker         }
2337*61046927SAndroid Build Coastguard Worker 
2338*61046927SAndroid Build Coastguard Worker         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2339*61046927SAndroid Build Coastguard Worker         err = pfn_clGetDeviceIDsFromD3D10KHR(
2340*61046927SAndroid Build Coastguard Worker             object_,
2341*61046927SAndroid Build Coastguard Worker             d3d_device_source,
2342*61046927SAndroid Build Coastguard Worker             d3d_object,
2343*61046927SAndroid Build Coastguard Worker             d3d_device_set,
2344*61046927SAndroid Build Coastguard Worker             n,
2345*61046927SAndroid Build Coastguard Worker             ids,
2346*61046927SAndroid Build Coastguard Worker             NULL);
2347*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2348*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2349*61046927SAndroid Build Coastguard Worker         }
2350*61046927SAndroid Build Coastguard Worker 
2351*61046927SAndroid Build Coastguard Worker         devices->assign(&ids[0], &ids[n]);
2352*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2353*61046927SAndroid Build Coastguard Worker     }
2354*61046927SAndroid Build Coastguard Worker #endif
2355*61046927SAndroid Build Coastguard Worker 
2356*61046927SAndroid Build Coastguard Worker     /*! \brief Gets a list of available platforms.
2357*61046927SAndroid Build Coastguard Worker      *
2358*61046927SAndroid Build Coastguard Worker      *  Wraps clGetPlatformIDs().
2359*61046927SAndroid Build Coastguard Worker      */
get(VECTOR_CLASS<Platform> * platforms)2360*61046927SAndroid Build Coastguard Worker     static cl_int get(
2361*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<Platform>* platforms)
2362*61046927SAndroid Build Coastguard Worker     {
2363*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2364*61046927SAndroid Build Coastguard Worker 
2365*61046927SAndroid Build Coastguard Worker         if( platforms == NULL ) {
2366*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2367*61046927SAndroid Build Coastguard Worker         }
2368*61046927SAndroid Build Coastguard Worker 
2369*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2370*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2371*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2372*61046927SAndroid Build Coastguard Worker         }
2373*61046927SAndroid Build Coastguard Worker 
2374*61046927SAndroid Build Coastguard Worker         cl_platform_id* ids = (cl_platform_id*) alloca(
2375*61046927SAndroid Build Coastguard Worker             n * sizeof(cl_platform_id));
2376*61046927SAndroid Build Coastguard Worker         err = ::clGetPlatformIDs(n, ids, NULL);
2377*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2378*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2379*61046927SAndroid Build Coastguard Worker         }
2380*61046927SAndroid Build Coastguard Worker 
2381*61046927SAndroid Build Coastguard Worker         platforms->assign(&ids[0], &ids[n]);
2382*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2383*61046927SAndroid Build Coastguard Worker     }
2384*61046927SAndroid Build Coastguard Worker 
2385*61046927SAndroid Build Coastguard Worker     /*! \brief Gets the first available platform.
2386*61046927SAndroid Build Coastguard Worker      *
2387*61046927SAndroid Build Coastguard Worker      *  Wraps clGetPlatformIDs(), returning the first result.
2388*61046927SAndroid Build Coastguard Worker      */
get(Platform * platform)2389*61046927SAndroid Build Coastguard Worker     static cl_int get(
2390*61046927SAndroid Build Coastguard Worker         Platform * platform)
2391*61046927SAndroid Build Coastguard Worker     {
2392*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2393*61046927SAndroid Build Coastguard Worker 
2394*61046927SAndroid Build Coastguard Worker         if( platform == NULL ) {
2395*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2396*61046927SAndroid Build Coastguard Worker         }
2397*61046927SAndroid Build Coastguard Worker 
2398*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2399*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2400*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2401*61046927SAndroid Build Coastguard Worker         }
2402*61046927SAndroid Build Coastguard Worker 
2403*61046927SAndroid Build Coastguard Worker         cl_platform_id* ids = (cl_platform_id*) alloca(
2404*61046927SAndroid Build Coastguard Worker             n * sizeof(cl_platform_id));
2405*61046927SAndroid Build Coastguard Worker         err = ::clGetPlatformIDs(n, ids, NULL);
2406*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2407*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2408*61046927SAndroid Build Coastguard Worker         }
2409*61046927SAndroid Build Coastguard Worker 
2410*61046927SAndroid Build Coastguard Worker         *platform = ids[0];
2411*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2412*61046927SAndroid Build Coastguard Worker     }
2413*61046927SAndroid Build Coastguard Worker 
2414*61046927SAndroid Build Coastguard Worker     /*! \brief Gets the first available platform, returning it by value.
2415*61046927SAndroid Build Coastguard Worker      *
2416*61046927SAndroid Build Coastguard Worker      *  Wraps clGetPlatformIDs(), returning the first result.
2417*61046927SAndroid Build Coastguard Worker      */
get(cl_int * errResult=NULL)2418*61046927SAndroid Build Coastguard Worker     static Platform get(
2419*61046927SAndroid Build Coastguard Worker         cl_int * errResult = NULL)
2420*61046927SAndroid Build Coastguard Worker     {
2421*61046927SAndroid Build Coastguard Worker         Platform platform;
2422*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2423*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2424*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2425*61046927SAndroid Build Coastguard Worker             detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2426*61046927SAndroid Build Coastguard Worker             if (errResult != NULL) {
2427*61046927SAndroid Build Coastguard Worker                 *errResult = err;
2428*61046927SAndroid Build Coastguard Worker             }
2429*61046927SAndroid Build Coastguard Worker             return Platform();
2430*61046927SAndroid Build Coastguard Worker         }
2431*61046927SAndroid Build Coastguard Worker 
2432*61046927SAndroid Build Coastguard Worker         cl_platform_id* ids = (cl_platform_id*) alloca(
2433*61046927SAndroid Build Coastguard Worker             n * sizeof(cl_platform_id));
2434*61046927SAndroid Build Coastguard Worker         err = ::clGetPlatformIDs(n, ids, NULL);
2435*61046927SAndroid Build Coastguard Worker 
2436*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2437*61046927SAndroid Build Coastguard Worker             detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2438*61046927SAndroid Build Coastguard Worker             if (errResult != NULL) {
2439*61046927SAndroid Build Coastguard Worker                 *errResult = err;
2440*61046927SAndroid Build Coastguard Worker             }
2441*61046927SAndroid Build Coastguard Worker             return Platform();
2442*61046927SAndroid Build Coastguard Worker         }
2443*61046927SAndroid Build Coastguard Worker 
2444*61046927SAndroid Build Coastguard Worker 
2445*61046927SAndroid Build Coastguard Worker         return Platform(ids[0]);
2446*61046927SAndroid Build Coastguard Worker     }
2447*61046927SAndroid Build Coastguard Worker 
getDefault(cl_int * errResult=NULL)2448*61046927SAndroid Build Coastguard Worker     static Platform getDefault(
2449*61046927SAndroid Build Coastguard Worker         cl_int *errResult = NULL )
2450*61046927SAndroid Build Coastguard Worker     {
2451*61046927SAndroid Build Coastguard Worker         return get(errResult);
2452*61046927SAndroid Build Coastguard Worker     }
2453*61046927SAndroid Build Coastguard Worker 
2454*61046927SAndroid Build Coastguard Worker 
2455*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
2456*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clUnloadCompiler().
2457*61046927SAndroid Build Coastguard Worker     cl_int
unloadCompiler()2458*61046927SAndroid Build Coastguard Worker     unloadCompiler()
2459*61046927SAndroid Build Coastguard Worker     {
2460*61046927SAndroid Build Coastguard Worker         return ::clUnloadPlatformCompiler(object_);
2461*61046927SAndroid Build Coastguard Worker     }
2462*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
2463*61046927SAndroid Build Coastguard Worker }; // class Platform
2464*61046927SAndroid Build Coastguard Worker 
2465*61046927SAndroid Build Coastguard Worker /**
2466*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
2467*61046927SAndroid Build Coastguard Worker  */
2468*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
2469*61046927SAndroid Build Coastguard Worker /**
2470*61046927SAndroid Build Coastguard Worker  * Unload the OpenCL compiler.
2471*61046927SAndroid Build Coastguard Worker  * \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead.
2472*61046927SAndroid Build Coastguard Worker  */
2473*61046927SAndroid Build Coastguard Worker inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int
2474*61046927SAndroid Build Coastguard Worker UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
2475*61046927SAndroid Build Coastguard Worker inline cl_int
UnloadCompiler()2476*61046927SAndroid Build Coastguard Worker UnloadCompiler()
2477*61046927SAndroid Build Coastguard Worker {
2478*61046927SAndroid Build Coastguard Worker     return ::clUnloadCompiler();
2479*61046927SAndroid Build Coastguard Worker }
2480*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
2481*61046927SAndroid Build Coastguard Worker 
2482*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_context.
2483*61046927SAndroid Build Coastguard Worker  *
2484*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
2485*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_context as the original.  For details, see
2486*61046927SAndroid Build Coastguard Worker  *        clRetainContext() and clReleaseContext().
2487*61046927SAndroid Build Coastguard Worker  *
2488*61046927SAndroid Build Coastguard Worker  *  \see cl_context
2489*61046927SAndroid Build Coastguard Worker  */
2490*61046927SAndroid Build Coastguard Worker class Context
2491*61046927SAndroid Build Coastguard Worker     : public detail::Wrapper<cl_context>
2492*61046927SAndroid Build Coastguard Worker {
2493*61046927SAndroid Build Coastguard Worker private:
2494*61046927SAndroid Build Coastguard Worker 
2495*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
2496*61046927SAndroid Build Coastguard Worker     static std::atomic<int> default_initialized_;
2497*61046927SAndroid Build Coastguard Worker #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2498*61046927SAndroid Build Coastguard Worker     static volatile int default_initialized_;
2499*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2500*61046927SAndroid Build Coastguard Worker     static Context default_;
2501*61046927SAndroid Build Coastguard Worker     static volatile cl_int default_error_;
2502*61046927SAndroid Build Coastguard Worker public:
2503*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a context including a list of specified devices.
2504*61046927SAndroid Build Coastguard Worker      *
2505*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateContext().
2506*61046927SAndroid Build Coastguard Worker      */
Context(const VECTOR_CLASS<Device> & devices,cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,::size_t,void *)=NULL,void * data=NULL,cl_int * err=NULL)2507*61046927SAndroid Build Coastguard Worker     Context(
2508*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Device>& devices,
2509*61046927SAndroid Build Coastguard Worker         cl_context_properties* properties = NULL,
2510*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(
2511*61046927SAndroid Build Coastguard Worker             const char *,
2512*61046927SAndroid Build Coastguard Worker             const void *,
2513*61046927SAndroid Build Coastguard Worker             ::size_t,
2514*61046927SAndroid Build Coastguard Worker             void *) = NULL,
2515*61046927SAndroid Build Coastguard Worker         void* data = NULL,
2516*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
2517*61046927SAndroid Build Coastguard Worker     {
2518*61046927SAndroid Build Coastguard Worker         cl_int error;
2519*61046927SAndroid Build Coastguard Worker 
2520*61046927SAndroid Build Coastguard Worker         ::size_t numDevices = devices.size();
2521*61046927SAndroid Build Coastguard Worker         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
2522*61046927SAndroid Build Coastguard Worker         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
2523*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
2524*61046927SAndroid Build Coastguard Worker         }
2525*61046927SAndroid Build Coastguard Worker 
2526*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateContext(
2527*61046927SAndroid Build Coastguard Worker             properties, (cl_uint) numDevices,
2528*61046927SAndroid Build Coastguard Worker             deviceIDs,
2529*61046927SAndroid Build Coastguard Worker             notifyFptr, data, &error);
2530*61046927SAndroid Build Coastguard Worker 
2531*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
2532*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2533*61046927SAndroid Build Coastguard Worker             *err = error;
2534*61046927SAndroid Build Coastguard Worker         }
2535*61046927SAndroid Build Coastguard Worker     }
2536*61046927SAndroid Build Coastguard Worker 
Context(const Device & device,cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,::size_t,void *)=NULL,void * data=NULL,cl_int * err=NULL)2537*61046927SAndroid Build Coastguard Worker     Context(
2538*61046927SAndroid Build Coastguard Worker         const Device& device,
2539*61046927SAndroid Build Coastguard Worker         cl_context_properties* properties = NULL,
2540*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(
2541*61046927SAndroid Build Coastguard Worker             const char *,
2542*61046927SAndroid Build Coastguard Worker             const void *,
2543*61046927SAndroid Build Coastguard Worker             ::size_t,
2544*61046927SAndroid Build Coastguard Worker             void *) = NULL,
2545*61046927SAndroid Build Coastguard Worker         void* data = NULL,
2546*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
2547*61046927SAndroid Build Coastguard Worker     {
2548*61046927SAndroid Build Coastguard Worker         cl_int error;
2549*61046927SAndroid Build Coastguard Worker 
2550*61046927SAndroid Build Coastguard Worker         cl_device_id deviceID = device();
2551*61046927SAndroid Build Coastguard Worker 
2552*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateContext(
2553*61046927SAndroid Build Coastguard Worker             properties, 1,
2554*61046927SAndroid Build Coastguard Worker             &deviceID,
2555*61046927SAndroid Build Coastguard Worker             notifyFptr, data, &error);
2556*61046927SAndroid Build Coastguard Worker 
2557*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
2558*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2559*61046927SAndroid Build Coastguard Worker             *err = error;
2560*61046927SAndroid Build Coastguard Worker         }
2561*61046927SAndroid Build Coastguard Worker     }
2562*61046927SAndroid Build Coastguard Worker 
2563*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a context including all or a subset of devices of a specified type.
2564*61046927SAndroid Build Coastguard Worker      *
2565*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateContextFromType().
2566*61046927SAndroid Build Coastguard Worker      */
Context(cl_device_type type,cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,::size_t,void *)=NULL,void * data=NULL,cl_int * err=NULL)2567*61046927SAndroid Build Coastguard Worker     Context(
2568*61046927SAndroid Build Coastguard Worker         cl_device_type type,
2569*61046927SAndroid Build Coastguard Worker         cl_context_properties* properties = NULL,
2570*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(
2571*61046927SAndroid Build Coastguard Worker             const char *,
2572*61046927SAndroid Build Coastguard Worker             const void *,
2573*61046927SAndroid Build Coastguard Worker             ::size_t,
2574*61046927SAndroid Build Coastguard Worker             void *) = NULL,
2575*61046927SAndroid Build Coastguard Worker         void* data = NULL,
2576*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
2577*61046927SAndroid Build Coastguard Worker     {
2578*61046927SAndroid Build Coastguard Worker         cl_int error;
2579*61046927SAndroid Build Coastguard Worker 
2580*61046927SAndroid Build Coastguard Worker #if !defined(__APPLE__) && !defined(__MACOS)
2581*61046927SAndroid Build Coastguard Worker         cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };
2582*61046927SAndroid Build Coastguard Worker 
2583*61046927SAndroid Build Coastguard Worker         if (properties == NULL) {
2584*61046927SAndroid Build Coastguard Worker             // Get a valid platform ID as we cannot send in a blank one
2585*61046927SAndroid Build Coastguard Worker             VECTOR_CLASS<Platform> platforms;
2586*61046927SAndroid Build Coastguard Worker             error = Platform::get(&platforms);
2587*61046927SAndroid Build Coastguard Worker             if (error != CL_SUCCESS) {
2588*61046927SAndroid Build Coastguard Worker                 detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2589*61046927SAndroid Build Coastguard Worker                 if (err != NULL) {
2590*61046927SAndroid Build Coastguard Worker                     *err = error;
2591*61046927SAndroid Build Coastguard Worker                 }
2592*61046927SAndroid Build Coastguard Worker                 return;
2593*61046927SAndroid Build Coastguard Worker             }
2594*61046927SAndroid Build Coastguard Worker 
2595*61046927SAndroid Build Coastguard Worker             // Check the platforms we found for a device of our specified type
2596*61046927SAndroid Build Coastguard Worker             cl_context_properties platform_id = 0;
2597*61046927SAndroid Build Coastguard Worker             for (unsigned int i = 0; i < platforms.size(); i++) {
2598*61046927SAndroid Build Coastguard Worker 
2599*61046927SAndroid Build Coastguard Worker                 VECTOR_CLASS<Device> devices;
2600*61046927SAndroid Build Coastguard Worker 
2601*61046927SAndroid Build Coastguard Worker #if defined(__CL_ENABLE_EXCEPTIONS)
2602*61046927SAndroid Build Coastguard Worker                 try {
2603*61046927SAndroid Build Coastguard Worker #endif
2604*61046927SAndroid Build Coastguard Worker 
2605*61046927SAndroid Build Coastguard Worker                     error = platforms[i].getDevices(type, &devices);
2606*61046927SAndroid Build Coastguard Worker 
2607*61046927SAndroid Build Coastguard Worker #if defined(__CL_ENABLE_EXCEPTIONS)
2608*61046927SAndroid Build Coastguard Worker                 } catch (Error &) {}
2609*61046927SAndroid Build Coastguard Worker     // Catch if exceptions are enabled as we don't want to exit if first platform has no devices of type
2610*61046927SAndroid Build Coastguard Worker     // We do error checking next anyway, and can throw there if needed
2611*61046927SAndroid Build Coastguard Worker #endif
2612*61046927SAndroid Build Coastguard Worker 
2613*61046927SAndroid Build Coastguard Worker                 // Only squash CL_SUCCESS and CL_DEVICE_NOT_FOUND
2614*61046927SAndroid Build Coastguard Worker                 if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND) {
2615*61046927SAndroid Build Coastguard Worker                     detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2616*61046927SAndroid Build Coastguard Worker                     if (err != NULL) {
2617*61046927SAndroid Build Coastguard Worker                         *err = error;
2618*61046927SAndroid Build Coastguard Worker                     }
2619*61046927SAndroid Build Coastguard Worker                 }
2620*61046927SAndroid Build Coastguard Worker 
2621*61046927SAndroid Build Coastguard Worker                 if (devices.size() > 0) {
2622*61046927SAndroid Build Coastguard Worker                     platform_id = (cl_context_properties)platforms[i]();
2623*61046927SAndroid Build Coastguard Worker                     break;
2624*61046927SAndroid Build Coastguard Worker                 }
2625*61046927SAndroid Build Coastguard Worker             }
2626*61046927SAndroid Build Coastguard Worker 
2627*61046927SAndroid Build Coastguard Worker             if (platform_id == 0) {
2628*61046927SAndroid Build Coastguard Worker                 detail::errHandler(CL_DEVICE_NOT_FOUND, __CREATE_CONTEXT_FROM_TYPE_ERR);
2629*61046927SAndroid Build Coastguard Worker                 if (err != NULL) {
2630*61046927SAndroid Build Coastguard Worker                     *err = CL_DEVICE_NOT_FOUND;
2631*61046927SAndroid Build Coastguard Worker                 }
2632*61046927SAndroid Build Coastguard Worker                 return;
2633*61046927SAndroid Build Coastguard Worker             }
2634*61046927SAndroid Build Coastguard Worker 
2635*61046927SAndroid Build Coastguard Worker             prop[1] = platform_id;
2636*61046927SAndroid Build Coastguard Worker             properties = &prop[0];
2637*61046927SAndroid Build Coastguard Worker         }
2638*61046927SAndroid Build Coastguard Worker #endif
2639*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateContextFromType(
2640*61046927SAndroid Build Coastguard Worker             properties, type, notifyFptr, data, &error);
2641*61046927SAndroid Build Coastguard Worker 
2642*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2643*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2644*61046927SAndroid Build Coastguard Worker             *err = error;
2645*61046927SAndroid Build Coastguard Worker         }
2646*61046927SAndroid Build Coastguard Worker     }
2647*61046927SAndroid Build Coastguard Worker 
2648*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
2649*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2650*61046927SAndroid Build Coastguard Worker      */
Context(const Context & ctx)2651*61046927SAndroid Build Coastguard Worker     Context(const Context& ctx) : detail::Wrapper<cl_type>(ctx) {}
2652*61046927SAndroid Build Coastguard Worker 
2653*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
2654*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2655*61046927SAndroid Build Coastguard Worker      */
operator =(const Context & ctx)2656*61046927SAndroid Build Coastguard Worker     Context& operator = (const Context &ctx)
2657*61046927SAndroid Build Coastguard Worker     {
2658*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(ctx);
2659*61046927SAndroid Build Coastguard Worker         return *this;
2660*61046927SAndroid Build Coastguard Worker     }
2661*61046927SAndroid Build Coastguard Worker 
2662*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2663*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
2664*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2665*61046927SAndroid Build Coastguard Worker      */
Context(Context && ctx)2666*61046927SAndroid Build Coastguard Worker     Context(Context&& ctx) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(ctx)) {}
2667*61046927SAndroid Build Coastguard Worker 
2668*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
2669*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
2670*61046927SAndroid Build Coastguard Worker      */
operator =(Context && ctx)2671*61046927SAndroid Build Coastguard Worker     Context& operator = (Context &&ctx)
2672*61046927SAndroid Build Coastguard Worker     {
2673*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(ctx));
2674*61046927SAndroid Build Coastguard Worker         return *this;
2675*61046927SAndroid Build Coastguard Worker     }
2676*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2677*61046927SAndroid Build Coastguard Worker 
2678*61046927SAndroid Build Coastguard Worker     /*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.
2679*61046927SAndroid Build Coastguard Worker      *
2680*61046927SAndroid Build Coastguard Worker      *  \note All calls to this function return the same cl_context as the first.
2681*61046927SAndroid Build Coastguard Worker      */
getDefault(cl_int * err=NULL)2682*61046927SAndroid Build Coastguard Worker     static Context getDefault(cl_int * err = NULL)
2683*61046927SAndroid Build Coastguard Worker     {
2684*61046927SAndroid Build Coastguard Worker         int state = detail::compare_exchange(
2685*61046927SAndroid Build Coastguard Worker             &default_initialized_,
2686*61046927SAndroid Build Coastguard Worker             __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
2687*61046927SAndroid Build Coastguard Worker 
2688*61046927SAndroid Build Coastguard Worker         if (state & __DEFAULT_INITIALIZED) {
2689*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
2690*61046927SAndroid Build Coastguard Worker                 *err = default_error_;
2691*61046927SAndroid Build Coastguard Worker             }
2692*61046927SAndroid Build Coastguard Worker             return default_;
2693*61046927SAndroid Build Coastguard Worker         }
2694*61046927SAndroid Build Coastguard Worker 
2695*61046927SAndroid Build Coastguard Worker         if (state & __DEFAULT_BEING_INITIALIZED) {
2696*61046927SAndroid Build Coastguard Worker               // Assume writes will propagate eventually...
2697*61046927SAndroid Build Coastguard Worker               while(default_initialized_ != __DEFAULT_INITIALIZED) {
2698*61046927SAndroid Build Coastguard Worker                   detail::fence();
2699*61046927SAndroid Build Coastguard Worker               }
2700*61046927SAndroid Build Coastguard Worker 
2701*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
2702*61046927SAndroid Build Coastguard Worker                 *err = default_error_;
2703*61046927SAndroid Build Coastguard Worker             }
2704*61046927SAndroid Build Coastguard Worker             return default_;
2705*61046927SAndroid Build Coastguard Worker         }
2706*61046927SAndroid Build Coastguard Worker 
2707*61046927SAndroid Build Coastguard Worker         cl_int error;
2708*61046927SAndroid Build Coastguard Worker         default_ = Context(
2709*61046927SAndroid Build Coastguard Worker             CL_DEVICE_TYPE_DEFAULT,
2710*61046927SAndroid Build Coastguard Worker             NULL,
2711*61046927SAndroid Build Coastguard Worker             NULL,
2712*61046927SAndroid Build Coastguard Worker             NULL,
2713*61046927SAndroid Build Coastguard Worker             &error);
2714*61046927SAndroid Build Coastguard Worker 
2715*61046927SAndroid Build Coastguard Worker         detail::fence();
2716*61046927SAndroid Build Coastguard Worker 
2717*61046927SAndroid Build Coastguard Worker         default_error_ = error;
2718*61046927SAndroid Build Coastguard Worker         // Assume writes will propagate eventually...
2719*61046927SAndroid Build Coastguard Worker         default_initialized_ = __DEFAULT_INITIALIZED;
2720*61046927SAndroid Build Coastguard Worker 
2721*61046927SAndroid Build Coastguard Worker         detail::fence();
2722*61046927SAndroid Build Coastguard Worker 
2723*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2724*61046927SAndroid Build Coastguard Worker             *err = default_error_;
2725*61046927SAndroid Build Coastguard Worker         }
2726*61046927SAndroid Build Coastguard Worker         return default_;
2727*61046927SAndroid Build Coastguard Worker 
2728*61046927SAndroid Build Coastguard Worker     }
2729*61046927SAndroid Build Coastguard Worker 
2730*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Context()2731*61046927SAndroid Build Coastguard Worker     Context() : detail::Wrapper<cl_type>() { }
2732*61046927SAndroid Build Coastguard Worker 
2733*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_context - takes ownership.
2734*61046927SAndroid Build Coastguard Worker      *
2735*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_context
2736*61046927SAndroid Build Coastguard Worker      *  into the new Context object.
2737*61046927SAndroid Build Coastguard Worker      */
Context(const cl_context & context)2738*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { }
2739*61046927SAndroid Build Coastguard Worker 
2740*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_context - takes ownership.
2741*61046927SAndroid Build Coastguard Worker      *
2742*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
2743*61046927SAndroid Build Coastguard Worker      *  clReleaseContext() on the value previously held by this instance.
2744*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_context & rhs)2745*61046927SAndroid Build Coastguard Worker     Context& operator = (const cl_context& rhs)
2746*61046927SAndroid Build Coastguard Worker     {
2747*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
2748*61046927SAndroid Build Coastguard Worker         return *this;
2749*61046927SAndroid Build Coastguard Worker     }
2750*61046927SAndroid Build Coastguard Worker 
2751*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetContextInfo().
2752*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_context_info name,T * param) const2753*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_context_info name, T* param) const
2754*61046927SAndroid Build Coastguard Worker     {
2755*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2756*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetContextInfo, object_, name, param),
2757*61046927SAndroid Build Coastguard Worker             __GET_CONTEXT_INFO_ERR);
2758*61046927SAndroid Build Coastguard Worker     }
2759*61046927SAndroid Build Coastguard Worker 
2760*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetContextInfo() that returns by value.
2761*61046927SAndroid Build Coastguard Worker     template <cl_context_info name> typename
2762*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_context_info, name>::param_type
getInfo(cl_int * err=NULL) const2763*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
2764*61046927SAndroid Build Coastguard Worker     {
2765*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2766*61046927SAndroid Build Coastguard Worker             detail::cl_context_info, name>::param_type param;
2767*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
2768*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2769*61046927SAndroid Build Coastguard Worker             *err = result;
2770*61046927SAndroid Build Coastguard Worker         }
2771*61046927SAndroid Build Coastguard Worker         return param;
2772*61046927SAndroid Build Coastguard Worker     }
2773*61046927SAndroid Build Coastguard Worker 
2774*61046927SAndroid Build Coastguard Worker     /*! \brief Gets a list of supported image formats.
2775*61046927SAndroid Build Coastguard Worker      *
2776*61046927SAndroid Build Coastguard Worker      *  Wraps clGetSupportedImageFormats().
2777*61046927SAndroid Build Coastguard Worker      */
getSupportedImageFormats(cl_mem_flags flags,cl_mem_object_type type,VECTOR_CLASS<ImageFormat> * formats) const2778*61046927SAndroid Build Coastguard Worker     cl_int getSupportedImageFormats(
2779*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
2780*61046927SAndroid Build Coastguard Worker         cl_mem_object_type type,
2781*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<ImageFormat>* formats) const
2782*61046927SAndroid Build Coastguard Worker     {
2783*61046927SAndroid Build Coastguard Worker         cl_uint numEntries;
2784*61046927SAndroid Build Coastguard Worker 
2785*61046927SAndroid Build Coastguard Worker         if (!formats) {
2786*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
2787*61046927SAndroid Build Coastguard Worker         }
2788*61046927SAndroid Build Coastguard Worker 
2789*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetSupportedImageFormats(
2790*61046927SAndroid Build Coastguard Worker             object_,
2791*61046927SAndroid Build Coastguard Worker             flags,
2792*61046927SAndroid Build Coastguard Worker             type,
2793*61046927SAndroid Build Coastguard Worker             0,
2794*61046927SAndroid Build Coastguard Worker             NULL,
2795*61046927SAndroid Build Coastguard Worker             &numEntries);
2796*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2797*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
2798*61046927SAndroid Build Coastguard Worker         }
2799*61046927SAndroid Build Coastguard Worker 
2800*61046927SAndroid Build Coastguard Worker         if (numEntries > 0) {
2801*61046927SAndroid Build Coastguard Worker             ImageFormat* value = (ImageFormat*)
2802*61046927SAndroid Build Coastguard Worker                 alloca(numEntries * sizeof(ImageFormat));
2803*61046927SAndroid Build Coastguard Worker             err = ::clGetSupportedImageFormats(
2804*61046927SAndroid Build Coastguard Worker                 object_,
2805*61046927SAndroid Build Coastguard Worker                 flags,
2806*61046927SAndroid Build Coastguard Worker                 type,
2807*61046927SAndroid Build Coastguard Worker                 numEntries,
2808*61046927SAndroid Build Coastguard Worker                 (cl_image_format*)value,
2809*61046927SAndroid Build Coastguard Worker                 NULL);
2810*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
2811*61046927SAndroid Build Coastguard Worker                 return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
2812*61046927SAndroid Build Coastguard Worker             }
2813*61046927SAndroid Build Coastguard Worker 
2814*61046927SAndroid Build Coastguard Worker             formats->assign(&value[0], &value[numEntries]);
2815*61046927SAndroid Build Coastguard Worker         }
2816*61046927SAndroid Build Coastguard Worker         else {
2817*61046927SAndroid Build Coastguard Worker             formats->clear();
2818*61046927SAndroid Build Coastguard Worker         }
2819*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2820*61046927SAndroid Build Coastguard Worker     }
2821*61046927SAndroid Build Coastguard Worker };
2822*61046927SAndroid Build Coastguard Worker 
getDefault(cl_int * err)2823*61046927SAndroid Build Coastguard Worker inline Device Device::getDefault(cl_int * err)
2824*61046927SAndroid Build Coastguard Worker {
2825*61046927SAndroid Build Coastguard Worker     cl_int error;
2826*61046927SAndroid Build Coastguard Worker     Device device;
2827*61046927SAndroid Build Coastguard Worker 
2828*61046927SAndroid Build Coastguard Worker     Context context = Context::getDefault(&error);
2829*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_CONTEXT_ERR);
2830*61046927SAndroid Build Coastguard Worker 
2831*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
2832*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2833*61046927SAndroid Build Coastguard Worker             *err = error;
2834*61046927SAndroid Build Coastguard Worker         }
2835*61046927SAndroid Build Coastguard Worker     }
2836*61046927SAndroid Build Coastguard Worker     else {
2837*61046927SAndroid Build Coastguard Worker         device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
2838*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2839*61046927SAndroid Build Coastguard Worker             *err = CL_SUCCESS;
2840*61046927SAndroid Build Coastguard Worker         }
2841*61046927SAndroid Build Coastguard Worker     }
2842*61046927SAndroid Build Coastguard Worker 
2843*61046927SAndroid Build Coastguard Worker     return device;
2844*61046927SAndroid Build Coastguard Worker }
2845*61046927SAndroid Build Coastguard Worker 
2846*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
2847*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX std::atomic<int> CL_WEAK_ATTRIB_SUFFIX Context::default_initialized_;
2848*61046927SAndroid Build Coastguard Worker #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2849*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX volatile int CL_WEAK_ATTRIB_SUFFIX Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
2850*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2851*61046927SAndroid Build Coastguard Worker 
2852*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX Context CL_WEAK_ATTRIB_SUFFIX Context::default_;
2853*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX volatile cl_int CL_WEAK_ATTRIB_SUFFIX Context::default_error_ = CL_SUCCESS;
2854*61046927SAndroid Build Coastguard Worker 
2855*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_event.
2856*61046927SAndroid Build Coastguard Worker  *
2857*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
2858*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_event as the original.  For details, see
2859*61046927SAndroid Build Coastguard Worker  *        clRetainEvent() and clReleaseEvent().
2860*61046927SAndroid Build Coastguard Worker  *
2861*61046927SAndroid Build Coastguard Worker  *  \see cl_event
2862*61046927SAndroid Build Coastguard Worker  */
2863*61046927SAndroid Build Coastguard Worker class Event : public detail::Wrapper<cl_event>
2864*61046927SAndroid Build Coastguard Worker {
2865*61046927SAndroid Build Coastguard Worker public:
2866*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Event()2867*61046927SAndroid Build Coastguard Worker     Event() : detail::Wrapper<cl_type>() { }
2868*61046927SAndroid Build Coastguard Worker 
2869*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_event - takes ownership.
2870*61046927SAndroid Build Coastguard Worker      *
2871*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_event
2872*61046927SAndroid Build Coastguard Worker      *  into the new Event object.
2873*61046927SAndroid Build Coastguard Worker      */
Event(const cl_event & event)2874*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { }
2875*61046927SAndroid Build Coastguard Worker 
2876*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_event - takes ownership.
2877*61046927SAndroid Build Coastguard Worker      *
2878*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
2879*61046927SAndroid Build Coastguard Worker      *  clReleaseEvent() on the value previously held by this instance.
2880*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_event & rhs)2881*61046927SAndroid Build Coastguard Worker     Event& operator = (const cl_event& rhs)
2882*61046927SAndroid Build Coastguard Worker     {
2883*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
2884*61046927SAndroid Build Coastguard Worker         return *this;
2885*61046927SAndroid Build Coastguard Worker     }
2886*61046927SAndroid Build Coastguard Worker 
2887*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventInfo().
2888*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_event_info name,T * param) const2889*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_event_info name, T* param) const
2890*61046927SAndroid Build Coastguard Worker     {
2891*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2892*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetEventInfo, object_, name, param),
2893*61046927SAndroid Build Coastguard Worker             __GET_EVENT_INFO_ERR);
2894*61046927SAndroid Build Coastguard Worker     }
2895*61046927SAndroid Build Coastguard Worker 
2896*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventInfo() that returns by value.
2897*61046927SAndroid Build Coastguard Worker     template <cl_event_info name> typename
2898*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_event_info, name>::param_type
getInfo(cl_int * err=NULL) const2899*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
2900*61046927SAndroid Build Coastguard Worker     {
2901*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2902*61046927SAndroid Build Coastguard Worker             detail::cl_event_info, name>::param_type param;
2903*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
2904*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2905*61046927SAndroid Build Coastguard Worker             *err = result;
2906*61046927SAndroid Build Coastguard Worker         }
2907*61046927SAndroid Build Coastguard Worker         return param;
2908*61046927SAndroid Build Coastguard Worker     }
2909*61046927SAndroid Build Coastguard Worker 
2910*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventProfilingInfo().
2911*61046927SAndroid Build Coastguard Worker     template <typename T>
getProfilingInfo(cl_profiling_info name,T * param) const2912*61046927SAndroid Build Coastguard Worker     cl_int getProfilingInfo(cl_profiling_info name, T* param) const
2913*61046927SAndroid Build Coastguard Worker     {
2914*61046927SAndroid Build Coastguard Worker         return detail::errHandler(detail::getInfo(
2915*61046927SAndroid Build Coastguard Worker             &::clGetEventProfilingInfo, object_, name, param),
2916*61046927SAndroid Build Coastguard Worker             __GET_EVENT_PROFILE_INFO_ERR);
2917*61046927SAndroid Build Coastguard Worker     }
2918*61046927SAndroid Build Coastguard Worker 
2919*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventProfilingInfo() that returns by value.
2920*61046927SAndroid Build Coastguard Worker     template <cl_profiling_info name> typename
2921*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_profiling_info, name>::param_type
getProfilingInfo(cl_int * err=NULL) const2922*61046927SAndroid Build Coastguard Worker     getProfilingInfo(cl_int* err = NULL) const
2923*61046927SAndroid Build Coastguard Worker     {
2924*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2925*61046927SAndroid Build Coastguard Worker             detail::cl_profiling_info, name>::param_type param;
2926*61046927SAndroid Build Coastguard Worker         cl_int result = getProfilingInfo(name, &param);
2927*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2928*61046927SAndroid Build Coastguard Worker             *err = result;
2929*61046927SAndroid Build Coastguard Worker         }
2930*61046927SAndroid Build Coastguard Worker         return param;
2931*61046927SAndroid Build Coastguard Worker     }
2932*61046927SAndroid Build Coastguard Worker 
2933*61046927SAndroid Build Coastguard Worker     /*! \brief Blocks the calling thread until this event completes.
2934*61046927SAndroid Build Coastguard Worker      *
2935*61046927SAndroid Build Coastguard Worker      *  Wraps clWaitForEvents().
2936*61046927SAndroid Build Coastguard Worker      */
wait() const2937*61046927SAndroid Build Coastguard Worker     cl_int wait() const
2938*61046927SAndroid Build Coastguard Worker     {
2939*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2940*61046927SAndroid Build Coastguard Worker             ::clWaitForEvents(1, &object_),
2941*61046927SAndroid Build Coastguard Worker             __WAIT_FOR_EVENTS_ERR);
2942*61046927SAndroid Build Coastguard Worker     }
2943*61046927SAndroid Build Coastguard Worker 
2944*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
2945*61046927SAndroid Build Coastguard Worker     /*! \brief Registers a user callback function for a specific command execution status.
2946*61046927SAndroid Build Coastguard Worker      *
2947*61046927SAndroid Build Coastguard Worker      *  Wraps clSetEventCallback().
2948*61046927SAndroid Build Coastguard Worker      */
setCallback(cl_int type,void (CL_CALLBACK * pfn_notify)(cl_event,cl_int,void *),void * user_data=NULL)2949*61046927SAndroid Build Coastguard Worker     cl_int setCallback(
2950*61046927SAndroid Build Coastguard Worker         cl_int type,
2951*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *),
2952*61046927SAndroid Build Coastguard Worker         void * user_data = NULL)
2953*61046927SAndroid Build Coastguard Worker     {
2954*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2955*61046927SAndroid Build Coastguard Worker             ::clSetEventCallback(
2956*61046927SAndroid Build Coastguard Worker                 object_,
2957*61046927SAndroid Build Coastguard Worker                 type,
2958*61046927SAndroid Build Coastguard Worker                 pfn_notify,
2959*61046927SAndroid Build Coastguard Worker                 user_data),
2960*61046927SAndroid Build Coastguard Worker             __SET_EVENT_CALLBACK_ERR);
2961*61046927SAndroid Build Coastguard Worker     }
2962*61046927SAndroid Build Coastguard Worker #endif
2963*61046927SAndroid Build Coastguard Worker 
2964*61046927SAndroid Build Coastguard Worker     /*! \brief Blocks the calling thread until every event specified is complete.
2965*61046927SAndroid Build Coastguard Worker      *
2966*61046927SAndroid Build Coastguard Worker      *  Wraps clWaitForEvents().
2967*61046927SAndroid Build Coastguard Worker      */
2968*61046927SAndroid Build Coastguard Worker     static cl_int
waitForEvents(const VECTOR_CLASS<Event> & events)2969*61046927SAndroid Build Coastguard Worker     waitForEvents(const VECTOR_CLASS<Event>& events)
2970*61046927SAndroid Build Coastguard Worker     {
2971*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2972*61046927SAndroid Build Coastguard Worker             ::clWaitForEvents(
2973*61046927SAndroid Build Coastguard Worker                 (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
2974*61046927SAndroid Build Coastguard Worker             __WAIT_FOR_EVENTS_ERR);
2975*61046927SAndroid Build Coastguard Worker     }
2976*61046927SAndroid Build Coastguard Worker };
2977*61046927SAndroid Build Coastguard Worker 
2978*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
2979*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for user events (a subset of cl_event's).
2980*61046927SAndroid Build Coastguard Worker  *
2981*61046927SAndroid Build Coastguard Worker  *  See Event for details about copy semantics, etc.
2982*61046927SAndroid Build Coastguard Worker  */
2983*61046927SAndroid Build Coastguard Worker class UserEvent : public Event
2984*61046927SAndroid Build Coastguard Worker {
2985*61046927SAndroid Build Coastguard Worker public:
2986*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a user event on a given context.
2987*61046927SAndroid Build Coastguard Worker      *
2988*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateUserEvent().
2989*61046927SAndroid Build Coastguard Worker      */
UserEvent(const Context & context,cl_int * err=NULL)2990*61046927SAndroid Build Coastguard Worker     UserEvent(
2991*61046927SAndroid Build Coastguard Worker         const Context& context,
2992*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
2993*61046927SAndroid Build Coastguard Worker     {
2994*61046927SAndroid Build Coastguard Worker         cl_int error;
2995*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateUserEvent(
2996*61046927SAndroid Build Coastguard Worker             context(),
2997*61046927SAndroid Build Coastguard Worker             &error);
2998*61046927SAndroid Build Coastguard Worker 
2999*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_USER_EVENT_ERR);
3000*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3001*61046927SAndroid Build Coastguard Worker             *err = error;
3002*61046927SAndroid Build Coastguard Worker         }
3003*61046927SAndroid Build Coastguard Worker     }
3004*61046927SAndroid Build Coastguard Worker 
3005*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
UserEvent()3006*61046927SAndroid Build Coastguard Worker     UserEvent() : Event() { }
3007*61046927SAndroid Build Coastguard Worker 
3008*61046927SAndroid Build Coastguard Worker     /*! \brief Sets the execution status of a user event object.
3009*61046927SAndroid Build Coastguard Worker      *
3010*61046927SAndroid Build Coastguard Worker      *  Wraps clSetUserEventStatus().
3011*61046927SAndroid Build Coastguard Worker      */
setStatus(cl_int status)3012*61046927SAndroid Build Coastguard Worker     cl_int setStatus(cl_int status)
3013*61046927SAndroid Build Coastguard Worker     {
3014*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3015*61046927SAndroid Build Coastguard Worker             ::clSetUserEventStatus(object_,status),
3016*61046927SAndroid Build Coastguard Worker             __SET_USER_EVENT_STATUS_ERR);
3017*61046927SAndroid Build Coastguard Worker     }
3018*61046927SAndroid Build Coastguard Worker };
3019*61046927SAndroid Build Coastguard Worker #endif
3020*61046927SAndroid Build Coastguard Worker 
3021*61046927SAndroid Build Coastguard Worker /*! \brief Blocks the calling thread until every event specified is complete.
3022*61046927SAndroid Build Coastguard Worker  *
3023*61046927SAndroid Build Coastguard Worker  *  Wraps clWaitForEvents().
3024*61046927SAndroid Build Coastguard Worker  */
3025*61046927SAndroid Build Coastguard Worker inline static cl_int
WaitForEvents(const VECTOR_CLASS<Event> & events)3026*61046927SAndroid Build Coastguard Worker WaitForEvents(const VECTOR_CLASS<Event>& events)
3027*61046927SAndroid Build Coastguard Worker {
3028*61046927SAndroid Build Coastguard Worker     return detail::errHandler(
3029*61046927SAndroid Build Coastguard Worker         ::clWaitForEvents(
3030*61046927SAndroid Build Coastguard Worker             (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
3031*61046927SAndroid Build Coastguard Worker         __WAIT_FOR_EVENTS_ERR);
3032*61046927SAndroid Build Coastguard Worker }
3033*61046927SAndroid Build Coastguard Worker 
3034*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_mem.
3035*61046927SAndroid Build Coastguard Worker  *
3036*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
3037*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_mem as the original.  For details, see
3038*61046927SAndroid Build Coastguard Worker  *        clRetainMemObject() and clReleaseMemObject().
3039*61046927SAndroid Build Coastguard Worker  *
3040*61046927SAndroid Build Coastguard Worker  *  \see cl_mem
3041*61046927SAndroid Build Coastguard Worker  */
3042*61046927SAndroid Build Coastguard Worker class Memory : public detail::Wrapper<cl_mem>
3043*61046927SAndroid Build Coastguard Worker {
3044*61046927SAndroid Build Coastguard Worker public:
3045*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Memory()3046*61046927SAndroid Build Coastguard Worker     Memory() : detail::Wrapper<cl_type>() { }
3047*61046927SAndroid Build Coastguard Worker 
3048*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3049*61046927SAndroid Build Coastguard Worker      *
3050*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_mem
3051*61046927SAndroid Build Coastguard Worker      *  into the new Memory object.
3052*61046927SAndroid Build Coastguard Worker      */
Memory(const cl_mem & memory)3053*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { }
3054*61046927SAndroid Build Coastguard Worker 
3055*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_mem - takes ownership.
3056*61046927SAndroid Build Coastguard Worker      *
3057*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
3058*61046927SAndroid Build Coastguard Worker      *  clReleaseMemObject() on the value previously held by this instance.
3059*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3060*61046927SAndroid Build Coastguard Worker     Memory& operator = (const cl_mem& rhs)
3061*61046927SAndroid Build Coastguard Worker     {
3062*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
3063*61046927SAndroid Build Coastguard Worker         return *this;
3064*61046927SAndroid Build Coastguard Worker     }
3065*61046927SAndroid Build Coastguard Worker 
3066*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3067*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3068*61046927SAndroid Build Coastguard Worker      */
Memory(const Memory & mem)3069*61046927SAndroid Build Coastguard Worker     Memory(const Memory& mem) : detail::Wrapper<cl_type>(mem) {}
3070*61046927SAndroid Build Coastguard Worker 
3071*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3072*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3073*61046927SAndroid Build Coastguard Worker      */
operator =(const Memory & mem)3074*61046927SAndroid Build Coastguard Worker     Memory& operator = (const Memory &mem)
3075*61046927SAndroid Build Coastguard Worker     {
3076*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(mem);
3077*61046927SAndroid Build Coastguard Worker         return *this;
3078*61046927SAndroid Build Coastguard Worker     }
3079*61046927SAndroid Build Coastguard Worker 
3080*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3081*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3082*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3083*61046927SAndroid Build Coastguard Worker      */
Memory(Memory && mem)3084*61046927SAndroid Build Coastguard Worker     Memory(Memory&& mem) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(mem)) {}
3085*61046927SAndroid Build Coastguard Worker 
3086*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3087*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3088*61046927SAndroid Build Coastguard Worker      */
operator =(Memory && mem)3089*61046927SAndroid Build Coastguard Worker     Memory& operator = (Memory &&mem)
3090*61046927SAndroid Build Coastguard Worker     {
3091*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(mem));
3092*61046927SAndroid Build Coastguard Worker         return *this;
3093*61046927SAndroid Build Coastguard Worker     }
3094*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3095*61046927SAndroid Build Coastguard Worker 
3096*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetMemObjectInfo().
3097*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_mem_info name,T * param) const3098*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_mem_info name, T* param) const
3099*61046927SAndroid Build Coastguard Worker     {
3100*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3101*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetMemObjectInfo, object_, name, param),
3102*61046927SAndroid Build Coastguard Worker             __GET_MEM_OBJECT_INFO_ERR);
3103*61046927SAndroid Build Coastguard Worker     }
3104*61046927SAndroid Build Coastguard Worker 
3105*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetMemObjectInfo() that returns by value.
3106*61046927SAndroid Build Coastguard Worker     template <cl_mem_info name> typename
3107*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_mem_info, name>::param_type
getInfo(cl_int * err=NULL) const3108*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
3109*61046927SAndroid Build Coastguard Worker     {
3110*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
3111*61046927SAndroid Build Coastguard Worker             detail::cl_mem_info, name>::param_type param;
3112*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
3113*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3114*61046927SAndroid Build Coastguard Worker             *err = result;
3115*61046927SAndroid Build Coastguard Worker         }
3116*61046927SAndroid Build Coastguard Worker         return param;
3117*61046927SAndroid Build Coastguard Worker     }
3118*61046927SAndroid Build Coastguard Worker 
3119*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
3120*61046927SAndroid Build Coastguard Worker     /*! \brief Registers a callback function to be called when the memory object
3121*61046927SAndroid Build Coastguard Worker      *         is no longer needed.
3122*61046927SAndroid Build Coastguard Worker      *
3123*61046927SAndroid Build Coastguard Worker      *  Wraps clSetMemObjectDestructorCallback().
3124*61046927SAndroid Build Coastguard Worker      *
3125*61046927SAndroid Build Coastguard Worker      *  Repeated calls to this function, for a given cl_mem value, will append
3126*61046927SAndroid Build Coastguard Worker      *  to the list of functions called (in reverse order) when memory object's
3127*61046927SAndroid Build Coastguard Worker      *  resources are freed and the memory object is deleted.
3128*61046927SAndroid Build Coastguard Worker      *
3129*61046927SAndroid Build Coastguard Worker      *  \note
3130*61046927SAndroid Build Coastguard Worker      *  The registered callbacks are associated with the underlying cl_mem
3131*61046927SAndroid Build Coastguard Worker      *  value - not the Memory class instance.
3132*61046927SAndroid Build Coastguard Worker      */
setDestructorCallback(void (CL_CALLBACK * pfn_notify)(cl_mem,void *),void * user_data=NULL)3133*61046927SAndroid Build Coastguard Worker     cl_int setDestructorCallback(
3134*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * pfn_notify)(cl_mem, void *),
3135*61046927SAndroid Build Coastguard Worker         void * user_data = NULL)
3136*61046927SAndroid Build Coastguard Worker     {
3137*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3138*61046927SAndroid Build Coastguard Worker             ::clSetMemObjectDestructorCallback(
3139*61046927SAndroid Build Coastguard Worker                 object_,
3140*61046927SAndroid Build Coastguard Worker                 pfn_notify,
3141*61046927SAndroid Build Coastguard Worker                 user_data),
3142*61046927SAndroid Build Coastguard Worker             __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR);
3143*61046927SAndroid Build Coastguard Worker     }
3144*61046927SAndroid Build Coastguard Worker #endif
3145*61046927SAndroid Build Coastguard Worker 
3146*61046927SAndroid Build Coastguard Worker };
3147*61046927SAndroid Build Coastguard Worker 
3148*61046927SAndroid Build Coastguard Worker // Pre-declare copy functions
3149*61046927SAndroid Build Coastguard Worker class Buffer;
3150*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3151*61046927SAndroid Build Coastguard Worker cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
3152*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3153*61046927SAndroid Build Coastguard Worker cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
3154*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3155*61046927SAndroid Build Coastguard Worker cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
3156*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3157*61046927SAndroid Build Coastguard Worker cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
3158*61046927SAndroid Build Coastguard Worker 
3159*61046927SAndroid Build Coastguard Worker 
3160*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for Buffer Memory Objects.
3161*61046927SAndroid Build Coastguard Worker  *
3162*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3163*61046927SAndroid Build Coastguard Worker  *
3164*61046927SAndroid Build Coastguard Worker  *  \see Memory
3165*61046927SAndroid Build Coastguard Worker  */
3166*61046927SAndroid Build Coastguard Worker class Buffer : public Memory
3167*61046927SAndroid Build Coastguard Worker {
3168*61046927SAndroid Build Coastguard Worker public:
3169*61046927SAndroid Build Coastguard Worker 
3170*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Buffer in a specified context.
3171*61046927SAndroid Build Coastguard Worker      *
3172*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateBuffer().
3173*61046927SAndroid Build Coastguard Worker      *
3174*61046927SAndroid Build Coastguard Worker      *  \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3175*61046927SAndroid Build Coastguard Worker      *                  specified.  Note alignment & exclusivity requirements.
3176*61046927SAndroid Build Coastguard Worker      */
Buffer(const Context & context,cl_mem_flags flags,::size_t size,void * host_ptr=NULL,cl_int * err=NULL)3177*61046927SAndroid Build Coastguard Worker     Buffer(
3178*61046927SAndroid Build Coastguard Worker         const Context& context,
3179*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3180*61046927SAndroid Build Coastguard Worker         ::size_t size,
3181*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3182*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3183*61046927SAndroid Build Coastguard Worker     {
3184*61046927SAndroid Build Coastguard Worker         cl_int error;
3185*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3186*61046927SAndroid Build Coastguard Worker 
3187*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
3188*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3189*61046927SAndroid Build Coastguard Worker             *err = error;
3190*61046927SAndroid Build Coastguard Worker         }
3191*61046927SAndroid Build Coastguard Worker     }
3192*61046927SAndroid Build Coastguard Worker 
3193*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Buffer in the default context.
3194*61046927SAndroid Build Coastguard Worker      *
3195*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateBuffer().
3196*61046927SAndroid Build Coastguard Worker      *
3197*61046927SAndroid Build Coastguard Worker      *  \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3198*61046927SAndroid Build Coastguard Worker      *                  specified.  Note alignment & exclusivity requirements.
3199*61046927SAndroid Build Coastguard Worker      *
3200*61046927SAndroid Build Coastguard Worker      *  \see Context::getDefault()
3201*61046927SAndroid Build Coastguard Worker      */
Buffer(cl_mem_flags flags,::size_t size,void * host_ptr=NULL,cl_int * err=NULL)3202*61046927SAndroid Build Coastguard Worker     Buffer(
3203*61046927SAndroid Build Coastguard Worker          cl_mem_flags flags,
3204*61046927SAndroid Build Coastguard Worker         ::size_t size,
3205*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3206*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3207*61046927SAndroid Build Coastguard Worker     {
3208*61046927SAndroid Build Coastguard Worker         cl_int error;
3209*61046927SAndroid Build Coastguard Worker 
3210*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
3211*61046927SAndroid Build Coastguard Worker 
3212*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3213*61046927SAndroid Build Coastguard Worker 
3214*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
3215*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3216*61046927SAndroid Build Coastguard Worker             *err = error;
3217*61046927SAndroid Build Coastguard Worker         }
3218*61046927SAndroid Build Coastguard Worker     }
3219*61046927SAndroid Build Coastguard Worker 
3220*61046927SAndroid Build Coastguard Worker     /*!
3221*61046927SAndroid Build Coastguard Worker      * \brief Construct a Buffer from a host container via iterators.
3222*61046927SAndroid Build Coastguard Worker      * IteratorType must be random access.
3223*61046927SAndroid Build Coastguard Worker      * If useHostPtr is specified iterators must represent contiguous data.
3224*61046927SAndroid Build Coastguard Worker      */
3225*61046927SAndroid Build Coastguard Worker     template< typename IteratorType >
Buffer(IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr=false,cl_int * err=NULL)3226*61046927SAndroid Build Coastguard Worker     Buffer(
3227*61046927SAndroid Build Coastguard Worker         IteratorType startIterator,
3228*61046927SAndroid Build Coastguard Worker         IteratorType endIterator,
3229*61046927SAndroid Build Coastguard Worker         bool readOnly,
3230*61046927SAndroid Build Coastguard Worker         bool useHostPtr = false,
3231*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3232*61046927SAndroid Build Coastguard Worker     {
3233*61046927SAndroid Build Coastguard Worker         typedef typename std::iterator_traits<IteratorType>::value_type DataType;
3234*61046927SAndroid Build Coastguard Worker         cl_int error;
3235*61046927SAndroid Build Coastguard Worker 
3236*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags = 0;
3237*61046927SAndroid Build Coastguard Worker         if( readOnly ) {
3238*61046927SAndroid Build Coastguard Worker             flags |= CL_MEM_READ_ONLY;
3239*61046927SAndroid Build Coastguard Worker         }
3240*61046927SAndroid Build Coastguard Worker         else {
3241*61046927SAndroid Build Coastguard Worker             flags |= CL_MEM_READ_WRITE;
3242*61046927SAndroid Build Coastguard Worker         }
3243*61046927SAndroid Build Coastguard Worker         if( useHostPtr ) {
3244*61046927SAndroid Build Coastguard Worker             flags |= CL_MEM_USE_HOST_PTR;
3245*61046927SAndroid Build Coastguard Worker         }
3246*61046927SAndroid Build Coastguard Worker 
3247*61046927SAndroid Build Coastguard Worker         ::size_t size = sizeof(DataType)*(endIterator - startIterator);
3248*61046927SAndroid Build Coastguard Worker 
3249*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
3250*61046927SAndroid Build Coastguard Worker 
3251*61046927SAndroid Build Coastguard Worker         if( useHostPtr ) {
3252*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
3253*61046927SAndroid Build Coastguard Worker         } else {
3254*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
3255*61046927SAndroid Build Coastguard Worker         }
3256*61046927SAndroid Build Coastguard Worker 
3257*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
3258*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3259*61046927SAndroid Build Coastguard Worker             *err = error;
3260*61046927SAndroid Build Coastguard Worker         }
3261*61046927SAndroid Build Coastguard Worker 
3262*61046927SAndroid Build Coastguard Worker         if( !useHostPtr ) {
3263*61046927SAndroid Build Coastguard Worker             error = cl::copy(startIterator, endIterator, *this);
3264*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_BUFFER_ERR);
3265*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
3266*61046927SAndroid Build Coastguard Worker                 *err = error;
3267*61046927SAndroid Build Coastguard Worker             }
3268*61046927SAndroid Build Coastguard Worker         }
3269*61046927SAndroid Build Coastguard Worker     }
3270*61046927SAndroid Build Coastguard Worker 
3271*61046927SAndroid Build Coastguard Worker     /*!
3272*61046927SAndroid Build Coastguard Worker      * \brief Construct a Buffer from a host container via iterators using a specified context.
3273*61046927SAndroid Build Coastguard Worker      * IteratorType must be random access.
3274*61046927SAndroid Build Coastguard Worker      * If useHostPtr is specified iterators must represent contiguous data.
3275*61046927SAndroid Build Coastguard Worker      */
3276*61046927SAndroid Build Coastguard Worker     template< typename IteratorType >
3277*61046927SAndroid Build Coastguard Worker     Buffer(const Context &context, IteratorType startIterator, IteratorType endIterator,
3278*61046927SAndroid Build Coastguard Worker         bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
3279*61046927SAndroid Build Coastguard Worker 
3280*61046927SAndroid Build Coastguard Worker     /*!
3281*61046927SAndroid Build Coastguard Worker     * \brief Construct a Buffer from a host container via iterators using a specified queue.
3282*61046927SAndroid Build Coastguard Worker     * If useHostPtr is specified iterators must represent contiguous data.
3283*61046927SAndroid Build Coastguard Worker     */
3284*61046927SAndroid Build Coastguard Worker     template< typename IteratorType >
3285*61046927SAndroid Build Coastguard Worker     Buffer(const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator,
3286*61046927SAndroid Build Coastguard Worker         bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
3287*61046927SAndroid Build Coastguard Worker 
3288*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Buffer()3289*61046927SAndroid Build Coastguard Worker     Buffer() : Memory() { }
3290*61046927SAndroid Build Coastguard Worker 
3291*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3292*61046927SAndroid Build Coastguard Worker      *
3293*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3294*61046927SAndroid Build Coastguard Worker      */
Buffer(const cl_mem & buffer)3295*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { }
3296*61046927SAndroid Build Coastguard Worker 
3297*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
3298*61046927SAndroid Build Coastguard Worker      *
3299*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3300*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3301*61046927SAndroid Build Coastguard Worker     Buffer& operator = (const cl_mem& rhs)
3302*61046927SAndroid Build Coastguard Worker     {
3303*61046927SAndroid Build Coastguard Worker         Memory::operator=(rhs);
3304*61046927SAndroid Build Coastguard Worker         return *this;
3305*61046927SAndroid Build Coastguard Worker     }
3306*61046927SAndroid Build Coastguard Worker 
3307*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3308*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3309*61046927SAndroid Build Coastguard Worker      */
Buffer(const Buffer & buf)3310*61046927SAndroid Build Coastguard Worker     Buffer(const Buffer& buf) : Memory(buf) {}
3311*61046927SAndroid Build Coastguard Worker 
3312*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3313*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3314*61046927SAndroid Build Coastguard Worker      */
operator =(const Buffer & buf)3315*61046927SAndroid Build Coastguard Worker     Buffer& operator = (const Buffer &buf)
3316*61046927SAndroid Build Coastguard Worker     {
3317*61046927SAndroid Build Coastguard Worker         Memory::operator=(buf);
3318*61046927SAndroid Build Coastguard Worker         return *this;
3319*61046927SAndroid Build Coastguard Worker     }
3320*61046927SAndroid Build Coastguard Worker 
3321*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3322*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3323*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3324*61046927SAndroid Build Coastguard Worker      */
Buffer(Buffer && buf)3325*61046927SAndroid Build Coastguard Worker     Buffer(Buffer&& buf) CL_HPP_NOEXCEPT : Memory(std::move(buf)) {}
3326*61046927SAndroid Build Coastguard Worker 
3327*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3328*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3329*61046927SAndroid Build Coastguard Worker      */
operator =(Buffer && buf)3330*61046927SAndroid Build Coastguard Worker     Buffer& operator = (Buffer &&buf)
3331*61046927SAndroid Build Coastguard Worker     {
3332*61046927SAndroid Build Coastguard Worker         Memory::operator=(std::move(buf));
3333*61046927SAndroid Build Coastguard Worker         return *this;
3334*61046927SAndroid Build Coastguard Worker     }
3335*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3336*61046927SAndroid Build Coastguard Worker 
3337*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
3338*61046927SAndroid Build Coastguard Worker     /*! \brief Creates a new buffer object from this.
3339*61046927SAndroid Build Coastguard Worker      *
3340*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateSubBuffer().
3341*61046927SAndroid Build Coastguard Worker      */
createSubBuffer(cl_mem_flags flags,cl_buffer_create_type buffer_create_type,const void * buffer_create_info,cl_int * err=NULL)3342*61046927SAndroid Build Coastguard Worker     Buffer createSubBuffer(
3343*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3344*61046927SAndroid Build Coastguard Worker         cl_buffer_create_type buffer_create_type,
3345*61046927SAndroid Build Coastguard Worker         const void * buffer_create_info,
3346*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
3347*61046927SAndroid Build Coastguard Worker     {
3348*61046927SAndroid Build Coastguard Worker         Buffer result;
3349*61046927SAndroid Build Coastguard Worker         cl_int error;
3350*61046927SAndroid Build Coastguard Worker         result.object_ = ::clCreateSubBuffer(
3351*61046927SAndroid Build Coastguard Worker             object_,
3352*61046927SAndroid Build Coastguard Worker             flags,
3353*61046927SAndroid Build Coastguard Worker             buffer_create_type,
3354*61046927SAndroid Build Coastguard Worker             buffer_create_info,
3355*61046927SAndroid Build Coastguard Worker             &error);
3356*61046927SAndroid Build Coastguard Worker 
3357*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_SUBBUFFER_ERR);
3358*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3359*61046927SAndroid Build Coastguard Worker             *err = error;
3360*61046927SAndroid Build Coastguard Worker         }
3361*61046927SAndroid Build Coastguard Worker 
3362*61046927SAndroid Build Coastguard Worker         return result;
3363*61046927SAndroid Build Coastguard Worker     }
3364*61046927SAndroid Build Coastguard Worker #endif
3365*61046927SAndroid Build Coastguard Worker };
3366*61046927SAndroid Build Coastguard Worker 
3367*61046927SAndroid Build Coastguard Worker #if defined (USE_DX_INTEROP)
3368*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.
3369*61046927SAndroid Build Coastguard Worker  *
3370*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with Direct3D.
3371*61046927SAndroid Build Coastguard Worker  *
3372*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3373*61046927SAndroid Build Coastguard Worker  *
3374*61046927SAndroid Build Coastguard Worker  *  \see Memory
3375*61046927SAndroid Build Coastguard Worker  */
3376*61046927SAndroid Build Coastguard Worker class BufferD3D10 : public Buffer
3377*61046927SAndroid Build Coastguard Worker {
3378*61046927SAndroid Build Coastguard Worker public:
3379*61046927SAndroid Build Coastguard Worker     typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)(
3380*61046927SAndroid Build Coastguard Worker     cl_context context, cl_mem_flags flags, ID3D10Buffer*  buffer,
3381*61046927SAndroid Build Coastguard Worker     cl_int* errcode_ret);
3382*61046927SAndroid Build Coastguard Worker 
3383*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a BufferD3D10, in a specified context, from a
3384*61046927SAndroid Build Coastguard Worker      *         given ID3D10Buffer.
3385*61046927SAndroid Build Coastguard Worker      *
3386*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromD3D10BufferKHR().
3387*61046927SAndroid Build Coastguard Worker      */
BufferD3D10(const Context & context,cl_mem_flags flags,ID3D10Buffer * bufobj,cl_int * err=NULL)3388*61046927SAndroid Build Coastguard Worker     BufferD3D10(
3389*61046927SAndroid Build Coastguard Worker         const Context& context,
3390*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3391*61046927SAndroid Build Coastguard Worker         ID3D10Buffer* bufobj,
3392*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
3393*61046927SAndroid Build Coastguard Worker     {
3394*61046927SAndroid Build Coastguard Worker         static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL;
3395*61046927SAndroid Build Coastguard Worker 
3396*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
3397*61046927SAndroid Build Coastguard Worker         vector<cl_context_properties> props = context.getInfo<CL_CONTEXT_PROPERTIES>();
3398*61046927SAndroid Build Coastguard Worker         cl_platform platform = -1;
3399*61046927SAndroid Build Coastguard Worker         for( int i = 0; i < props.size(); ++i ) {
3400*61046927SAndroid Build Coastguard Worker             if( props[i] == CL_CONTEXT_PLATFORM ) {
3401*61046927SAndroid Build Coastguard Worker                 platform = props[i+1];
3402*61046927SAndroid Build Coastguard Worker             }
3403*61046927SAndroid Build Coastguard Worker         }
3404*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR);
3405*61046927SAndroid Build Coastguard Worker #endif
3406*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
3407*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR);
3408*61046927SAndroid Build Coastguard Worker #endif
3409*61046927SAndroid Build Coastguard Worker 
3410*61046927SAndroid Build Coastguard Worker         cl_int error;
3411*61046927SAndroid Build Coastguard Worker         object_ = pfn_clCreateFromD3D10BufferKHR(
3412*61046927SAndroid Build Coastguard Worker             context(),
3413*61046927SAndroid Build Coastguard Worker             flags,
3414*61046927SAndroid Build Coastguard Worker             bufobj,
3415*61046927SAndroid Build Coastguard Worker             &error);
3416*61046927SAndroid Build Coastguard Worker 
3417*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
3418*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3419*61046927SAndroid Build Coastguard Worker             *err = error;
3420*61046927SAndroid Build Coastguard Worker         }
3421*61046927SAndroid Build Coastguard Worker     }
3422*61046927SAndroid Build Coastguard Worker 
3423*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
BufferD3D10()3424*61046927SAndroid Build Coastguard Worker     BufferD3D10() : Buffer() { }
3425*61046927SAndroid Build Coastguard Worker 
3426*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3427*61046927SAndroid Build Coastguard Worker      *
3428*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3429*61046927SAndroid Build Coastguard Worker      */
BufferD3D10(const cl_mem & buffer)3430*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { }
3431*61046927SAndroid Build Coastguard Worker 
3432*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
3433*61046927SAndroid Build Coastguard Worker      *
3434*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3435*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3436*61046927SAndroid Build Coastguard Worker     BufferD3D10& operator = (const cl_mem& rhs)
3437*61046927SAndroid Build Coastguard Worker     {
3438*61046927SAndroid Build Coastguard Worker         Buffer::operator=(rhs);
3439*61046927SAndroid Build Coastguard Worker         return *this;
3440*61046927SAndroid Build Coastguard Worker     }
3441*61046927SAndroid Build Coastguard Worker 
3442*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3443*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3444*61046927SAndroid Build Coastguard Worker     */
BufferD3D10(const BufferD3D10 & buf)3445*61046927SAndroid Build Coastguard Worker     BufferD3D10(const BufferD3D10& buf) : Buffer(buf) {}
3446*61046927SAndroid Build Coastguard Worker 
3447*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3448*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3449*61046927SAndroid Build Coastguard Worker     */
operator =(const BufferD3D10 & buf)3450*61046927SAndroid Build Coastguard Worker     BufferD3D10& operator = (const BufferD3D10 &buf)
3451*61046927SAndroid Build Coastguard Worker     {
3452*61046927SAndroid Build Coastguard Worker         Buffer::operator=(buf);
3453*61046927SAndroid Build Coastguard Worker         return *this;
3454*61046927SAndroid Build Coastguard Worker     }
3455*61046927SAndroid Build Coastguard Worker 
3456*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3457*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3458*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3459*61046927SAndroid Build Coastguard Worker     */
BufferD3D10(BufferD3D10 && buf)3460*61046927SAndroid Build Coastguard Worker     BufferD3D10(BufferD3D10&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {}
3461*61046927SAndroid Build Coastguard Worker 
3462*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3463*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3464*61046927SAndroid Build Coastguard Worker     */
operator =(BufferD3D10 && buf)3465*61046927SAndroid Build Coastguard Worker     BufferD3D10& operator = (BufferD3D10 &&buf)
3466*61046927SAndroid Build Coastguard Worker     {
3467*61046927SAndroid Build Coastguard Worker         Buffer::operator=(std::move(buf));
3468*61046927SAndroid Build Coastguard Worker         return *this;
3469*61046927SAndroid Build Coastguard Worker     }
3470*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3471*61046927SAndroid Build Coastguard Worker };
3472*61046927SAndroid Build Coastguard Worker #endif
3473*61046927SAndroid Build Coastguard Worker 
3474*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL Buffer Memory Objects.
3475*61046927SAndroid Build Coastguard Worker  *
3476*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
3477*61046927SAndroid Build Coastguard Worker  *
3478*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3479*61046927SAndroid Build Coastguard Worker  *
3480*61046927SAndroid Build Coastguard Worker  *  \see Memory
3481*61046927SAndroid Build Coastguard Worker  */
3482*61046927SAndroid Build Coastguard Worker class BufferGL : public Buffer
3483*61046927SAndroid Build Coastguard Worker {
3484*61046927SAndroid Build Coastguard Worker public:
3485*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a BufferGL in a specified context, from a given
3486*61046927SAndroid Build Coastguard Worker      *         GL buffer.
3487*61046927SAndroid Build Coastguard Worker      *
3488*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLBuffer().
3489*61046927SAndroid Build Coastguard Worker      */
BufferGL(const Context & context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * err=NULL)3490*61046927SAndroid Build Coastguard Worker     BufferGL(
3491*61046927SAndroid Build Coastguard Worker         const Context& context,
3492*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3493*61046927SAndroid Build Coastguard Worker         cl_GLuint bufobj,
3494*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
3495*61046927SAndroid Build Coastguard Worker     {
3496*61046927SAndroid Build Coastguard Worker         cl_int error;
3497*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLBuffer(
3498*61046927SAndroid Build Coastguard Worker             context(),
3499*61046927SAndroid Build Coastguard Worker             flags,
3500*61046927SAndroid Build Coastguard Worker             bufobj,
3501*61046927SAndroid Build Coastguard Worker             &error);
3502*61046927SAndroid Build Coastguard Worker 
3503*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
3504*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3505*61046927SAndroid Build Coastguard Worker             *err = error;
3506*61046927SAndroid Build Coastguard Worker         }
3507*61046927SAndroid Build Coastguard Worker     }
3508*61046927SAndroid Build Coastguard Worker 
3509*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
BufferGL()3510*61046927SAndroid Build Coastguard Worker     BufferGL() : Buffer() { }
3511*61046927SAndroid Build Coastguard Worker 
3512*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3513*61046927SAndroid Build Coastguard Worker      *
3514*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3515*61046927SAndroid Build Coastguard Worker      */
BufferGL(const cl_mem & buffer)3516*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { }
3517*61046927SAndroid Build Coastguard Worker 
3518*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
3519*61046927SAndroid Build Coastguard Worker      *
3520*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3521*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3522*61046927SAndroid Build Coastguard Worker     BufferGL& operator = (const cl_mem& rhs)
3523*61046927SAndroid Build Coastguard Worker     {
3524*61046927SAndroid Build Coastguard Worker         Buffer::operator=(rhs);
3525*61046927SAndroid Build Coastguard Worker         return *this;
3526*61046927SAndroid Build Coastguard Worker     }
3527*61046927SAndroid Build Coastguard Worker 
3528*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3529*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3530*61046927SAndroid Build Coastguard Worker     */
BufferGL(const BufferGL & buf)3531*61046927SAndroid Build Coastguard Worker     BufferGL(const BufferGL& buf) : Buffer(buf) {}
3532*61046927SAndroid Build Coastguard Worker 
3533*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3534*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3535*61046927SAndroid Build Coastguard Worker     */
operator =(const BufferGL & buf)3536*61046927SAndroid Build Coastguard Worker     BufferGL& operator = (const BufferGL &buf)
3537*61046927SAndroid Build Coastguard Worker     {
3538*61046927SAndroid Build Coastguard Worker         Buffer::operator=(buf);
3539*61046927SAndroid Build Coastguard Worker         return *this;
3540*61046927SAndroid Build Coastguard Worker     }
3541*61046927SAndroid Build Coastguard Worker 
3542*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3543*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3544*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3545*61046927SAndroid Build Coastguard Worker     */
BufferGL(BufferGL && buf)3546*61046927SAndroid Build Coastguard Worker     BufferGL(BufferGL&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {}
3547*61046927SAndroid Build Coastguard Worker 
3548*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3549*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
3550*61046927SAndroid Build Coastguard Worker     */
operator =(BufferGL && buf)3551*61046927SAndroid Build Coastguard Worker     BufferGL& operator = (BufferGL &&buf)
3552*61046927SAndroid Build Coastguard Worker     {
3553*61046927SAndroid Build Coastguard Worker         Buffer::operator=(std::move(buf));
3554*61046927SAndroid Build Coastguard Worker         return *this;
3555*61046927SAndroid Build Coastguard Worker     }
3556*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3557*61046927SAndroid Build Coastguard Worker 
3558*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetGLObjectInfo().
getObjectInfo(cl_gl_object_type * type,cl_GLuint * gl_object_name)3559*61046927SAndroid Build Coastguard Worker     cl_int getObjectInfo(
3560*61046927SAndroid Build Coastguard Worker         cl_gl_object_type *type,
3561*61046927SAndroid Build Coastguard Worker         cl_GLuint * gl_object_name)
3562*61046927SAndroid Build Coastguard Worker     {
3563*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3564*61046927SAndroid Build Coastguard Worker             ::clGetGLObjectInfo(object_,type,gl_object_name),
3565*61046927SAndroid Build Coastguard Worker             __GET_GL_OBJECT_INFO_ERR);
3566*61046927SAndroid Build Coastguard Worker     }
3567*61046927SAndroid Build Coastguard Worker };
3568*61046927SAndroid Build Coastguard Worker 
3569*61046927SAndroid Build Coastguard Worker /*! \brief C++ base class for Image Memory objects.
3570*61046927SAndroid Build Coastguard Worker  *
3571*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3572*61046927SAndroid Build Coastguard Worker  *
3573*61046927SAndroid Build Coastguard Worker  *  \see Memory
3574*61046927SAndroid Build Coastguard Worker  */
3575*61046927SAndroid Build Coastguard Worker class Image : public Memory
3576*61046927SAndroid Build Coastguard Worker {
3577*61046927SAndroid Build Coastguard Worker protected:
3578*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image()3579*61046927SAndroid Build Coastguard Worker     Image() : Memory() { }
3580*61046927SAndroid Build Coastguard Worker 
3581*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3582*61046927SAndroid Build Coastguard Worker      *
3583*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3584*61046927SAndroid Build Coastguard Worker      */
Image(const cl_mem & image)3585*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { }
3586*61046927SAndroid Build Coastguard Worker 
3587*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
3588*61046927SAndroid Build Coastguard Worker      *
3589*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3590*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3591*61046927SAndroid Build Coastguard Worker     Image& operator = (const cl_mem& rhs)
3592*61046927SAndroid Build Coastguard Worker     {
3593*61046927SAndroid Build Coastguard Worker         Memory::operator=(rhs);
3594*61046927SAndroid Build Coastguard Worker         return *this;
3595*61046927SAndroid Build Coastguard Worker     }
3596*61046927SAndroid Build Coastguard Worker 
3597*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3598*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3599*61046927SAndroid Build Coastguard Worker      */
Image(const Image & img)3600*61046927SAndroid Build Coastguard Worker     Image(const Image& img) : Memory(img) {}
3601*61046927SAndroid Build Coastguard Worker 
3602*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3603*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3604*61046927SAndroid Build Coastguard Worker      */
operator =(const Image & img)3605*61046927SAndroid Build Coastguard Worker     Image& operator = (const Image &img)
3606*61046927SAndroid Build Coastguard Worker     {
3607*61046927SAndroid Build Coastguard Worker         Memory::operator=(img);
3608*61046927SAndroid Build Coastguard Worker         return *this;
3609*61046927SAndroid Build Coastguard Worker     }
3610*61046927SAndroid Build Coastguard Worker 
3611*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3612*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3613*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3614*61046927SAndroid Build Coastguard Worker      */
Image(Image && img)3615*61046927SAndroid Build Coastguard Worker     Image(Image&& img) CL_HPP_NOEXCEPT : Memory(std::move(img)) {}
3616*61046927SAndroid Build Coastguard Worker 
3617*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3618*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3619*61046927SAndroid Build Coastguard Worker      */
operator =(Image && img)3620*61046927SAndroid Build Coastguard Worker     Image& operator = (Image &&img)
3621*61046927SAndroid Build Coastguard Worker     {
3622*61046927SAndroid Build Coastguard Worker         Memory::operator=(std::move(img));
3623*61046927SAndroid Build Coastguard Worker         return *this;
3624*61046927SAndroid Build Coastguard Worker     }
3625*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3626*61046927SAndroid Build Coastguard Worker 
3627*61046927SAndroid Build Coastguard Worker public:
3628*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetImageInfo().
3629*61046927SAndroid Build Coastguard Worker     template <typename T>
getImageInfo(cl_image_info name,T * param) const3630*61046927SAndroid Build Coastguard Worker     cl_int getImageInfo(cl_image_info name, T* param) const
3631*61046927SAndroid Build Coastguard Worker     {
3632*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3633*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetImageInfo, object_, name, param),
3634*61046927SAndroid Build Coastguard Worker             __GET_IMAGE_INFO_ERR);
3635*61046927SAndroid Build Coastguard Worker     }
3636*61046927SAndroid Build Coastguard Worker 
3637*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetImageInfo() that returns by value.
3638*61046927SAndroid Build Coastguard Worker     template <cl_image_info name> typename
3639*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_image_info, name>::param_type
getImageInfo(cl_int * err=NULL) const3640*61046927SAndroid Build Coastguard Worker     getImageInfo(cl_int* err = NULL) const
3641*61046927SAndroid Build Coastguard Worker     {
3642*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
3643*61046927SAndroid Build Coastguard Worker             detail::cl_image_info, name>::param_type param;
3644*61046927SAndroid Build Coastguard Worker         cl_int result = getImageInfo(name, &param);
3645*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3646*61046927SAndroid Build Coastguard Worker             *err = result;
3647*61046927SAndroid Build Coastguard Worker         }
3648*61046927SAndroid Build Coastguard Worker         return param;
3649*61046927SAndroid Build Coastguard Worker     }
3650*61046927SAndroid Build Coastguard Worker };
3651*61046927SAndroid Build Coastguard Worker 
3652*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
3653*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for 1D Image Memory objects.
3654*61046927SAndroid Build Coastguard Worker  *
3655*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3656*61046927SAndroid Build Coastguard Worker  *
3657*61046927SAndroid Build Coastguard Worker  *  \see Memory
3658*61046927SAndroid Build Coastguard Worker  */
3659*61046927SAndroid Build Coastguard Worker class Image1D : public Image
3660*61046927SAndroid Build Coastguard Worker {
3661*61046927SAndroid Build Coastguard Worker public:
3662*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 1D Image in a specified context.
3663*61046927SAndroid Build Coastguard Worker      *
3664*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateImage().
3665*61046927SAndroid Build Coastguard Worker      */
Image1D(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,void * host_ptr=NULL,cl_int * err=NULL)3666*61046927SAndroid Build Coastguard Worker     Image1D(
3667*61046927SAndroid Build Coastguard Worker         const Context& context,
3668*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3669*61046927SAndroid Build Coastguard Worker         ImageFormat format,
3670*61046927SAndroid Build Coastguard Worker         ::size_t width,
3671*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3672*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3673*61046927SAndroid Build Coastguard Worker     {
3674*61046927SAndroid Build Coastguard Worker         cl_int error;
3675*61046927SAndroid Build Coastguard Worker         cl_image_desc desc =
3676*61046927SAndroid Build Coastguard Worker         {
3677*61046927SAndroid Build Coastguard Worker             CL_MEM_OBJECT_IMAGE1D,
3678*61046927SAndroid Build Coastguard Worker             width,
3679*61046927SAndroid Build Coastguard Worker             0, 0, 0, 0, 0, 0, 0, 0
3680*61046927SAndroid Build Coastguard Worker         };
3681*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
3682*61046927SAndroid Build Coastguard Worker             context(),
3683*61046927SAndroid Build Coastguard Worker             flags,
3684*61046927SAndroid Build Coastguard Worker             &format,
3685*61046927SAndroid Build Coastguard Worker             &desc,
3686*61046927SAndroid Build Coastguard Worker             host_ptr,
3687*61046927SAndroid Build Coastguard Worker             &error);
3688*61046927SAndroid Build Coastguard Worker 
3689*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
3690*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3691*61046927SAndroid Build Coastguard Worker             *err = error;
3692*61046927SAndroid Build Coastguard Worker         }
3693*61046927SAndroid Build Coastguard Worker     }
3694*61046927SAndroid Build Coastguard Worker 
3695*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image1D()3696*61046927SAndroid Build Coastguard Worker     Image1D() { }
3697*61046927SAndroid Build Coastguard Worker 
3698*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3699*61046927SAndroid Build Coastguard Worker      *
3700*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3701*61046927SAndroid Build Coastguard Worker      */
Image1D(const cl_mem & image1D)3702*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { }
3703*61046927SAndroid Build Coastguard Worker 
3704*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
3705*61046927SAndroid Build Coastguard Worker      *
3706*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3707*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3708*61046927SAndroid Build Coastguard Worker     Image1D& operator = (const cl_mem& rhs)
3709*61046927SAndroid Build Coastguard Worker     {
3710*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
3711*61046927SAndroid Build Coastguard Worker         return *this;
3712*61046927SAndroid Build Coastguard Worker     }
3713*61046927SAndroid Build Coastguard Worker 
3714*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3715*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3716*61046927SAndroid Build Coastguard Worker      */
Image1D(const Image1D & img)3717*61046927SAndroid Build Coastguard Worker     Image1D(const Image1D& img) : Image(img) {}
3718*61046927SAndroid Build Coastguard Worker 
3719*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3720*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3721*61046927SAndroid Build Coastguard Worker      */
operator =(const Image1D & img)3722*61046927SAndroid Build Coastguard Worker     Image1D& operator = (const Image1D &img)
3723*61046927SAndroid Build Coastguard Worker     {
3724*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
3725*61046927SAndroid Build Coastguard Worker         return *this;
3726*61046927SAndroid Build Coastguard Worker     }
3727*61046927SAndroid Build Coastguard Worker 
3728*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3729*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3730*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3731*61046927SAndroid Build Coastguard Worker      */
Image1D(Image1D && img)3732*61046927SAndroid Build Coastguard Worker     Image1D(Image1D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
3733*61046927SAndroid Build Coastguard Worker 
3734*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3735*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3736*61046927SAndroid Build Coastguard Worker      */
operator =(Image1D && img)3737*61046927SAndroid Build Coastguard Worker     Image1D& operator = (Image1D &&img)
3738*61046927SAndroid Build Coastguard Worker     {
3739*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
3740*61046927SAndroid Build Coastguard Worker         return *this;
3741*61046927SAndroid Build Coastguard Worker     }
3742*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3743*61046927SAndroid Build Coastguard Worker };
3744*61046927SAndroid Build Coastguard Worker 
3745*61046927SAndroid Build Coastguard Worker /*! \class Image1DBuffer
3746*61046927SAndroid Build Coastguard Worker  * \brief Image interface for 1D buffer images.
3747*61046927SAndroid Build Coastguard Worker  */
3748*61046927SAndroid Build Coastguard Worker class Image1DBuffer : public Image
3749*61046927SAndroid Build Coastguard Worker {
3750*61046927SAndroid Build Coastguard Worker public:
Image1DBuffer(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,const Buffer & buffer,cl_int * err=NULL)3751*61046927SAndroid Build Coastguard Worker     Image1DBuffer(
3752*61046927SAndroid Build Coastguard Worker         const Context& context,
3753*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3754*61046927SAndroid Build Coastguard Worker         ImageFormat format,
3755*61046927SAndroid Build Coastguard Worker         ::size_t width,
3756*61046927SAndroid Build Coastguard Worker         const Buffer &buffer,
3757*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3758*61046927SAndroid Build Coastguard Worker     {
3759*61046927SAndroid Build Coastguard Worker         cl_int error;
3760*61046927SAndroid Build Coastguard Worker         cl_image_desc desc =
3761*61046927SAndroid Build Coastguard Worker         {
3762*61046927SAndroid Build Coastguard Worker             CL_MEM_OBJECT_IMAGE1D_BUFFER,
3763*61046927SAndroid Build Coastguard Worker             width,
3764*61046927SAndroid Build Coastguard Worker             0, 0, 0, 0, 0, 0, 0,
3765*61046927SAndroid Build Coastguard Worker             buffer()
3766*61046927SAndroid Build Coastguard Worker         };
3767*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
3768*61046927SAndroid Build Coastguard Worker             context(),
3769*61046927SAndroid Build Coastguard Worker             flags,
3770*61046927SAndroid Build Coastguard Worker             &format,
3771*61046927SAndroid Build Coastguard Worker             &desc,
3772*61046927SAndroid Build Coastguard Worker             NULL,
3773*61046927SAndroid Build Coastguard Worker             &error);
3774*61046927SAndroid Build Coastguard Worker 
3775*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
3776*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3777*61046927SAndroid Build Coastguard Worker             *err = error;
3778*61046927SAndroid Build Coastguard Worker         }
3779*61046927SAndroid Build Coastguard Worker     }
3780*61046927SAndroid Build Coastguard Worker 
Image1DBuffer()3781*61046927SAndroid Build Coastguard Worker     Image1DBuffer() { }
3782*61046927SAndroid Build Coastguard Worker 
Image1DBuffer(const cl_mem & image1D)3783*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { }
3784*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)3785*61046927SAndroid Build Coastguard Worker     Image1DBuffer& operator = (const cl_mem& rhs)
3786*61046927SAndroid Build Coastguard Worker     {
3787*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
3788*61046927SAndroid Build Coastguard Worker         return *this;
3789*61046927SAndroid Build Coastguard Worker     }
3790*61046927SAndroid Build Coastguard Worker 
3791*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3792*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3793*61046927SAndroid Build Coastguard Worker      */
Image1DBuffer(const Image1DBuffer & img)3794*61046927SAndroid Build Coastguard Worker     Image1DBuffer(const Image1DBuffer& img) : Image(img) {}
3795*61046927SAndroid Build Coastguard Worker 
3796*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3797*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3798*61046927SAndroid Build Coastguard Worker      */
operator =(const Image1DBuffer & img)3799*61046927SAndroid Build Coastguard Worker     Image1DBuffer& operator = (const Image1DBuffer &img)
3800*61046927SAndroid Build Coastguard Worker     {
3801*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
3802*61046927SAndroid Build Coastguard Worker         return *this;
3803*61046927SAndroid Build Coastguard Worker     }
3804*61046927SAndroid Build Coastguard Worker 
3805*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3806*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3807*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3808*61046927SAndroid Build Coastguard Worker      */
Image1DBuffer(Image1DBuffer && img)3809*61046927SAndroid Build Coastguard Worker     Image1DBuffer(Image1DBuffer&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
3810*61046927SAndroid Build Coastguard Worker 
3811*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3812*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3813*61046927SAndroid Build Coastguard Worker      */
operator =(Image1DBuffer && img)3814*61046927SAndroid Build Coastguard Worker     Image1DBuffer& operator = (Image1DBuffer &&img)
3815*61046927SAndroid Build Coastguard Worker     {
3816*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
3817*61046927SAndroid Build Coastguard Worker         return *this;
3818*61046927SAndroid Build Coastguard Worker     }
3819*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3820*61046927SAndroid Build Coastguard Worker };
3821*61046927SAndroid Build Coastguard Worker 
3822*61046927SAndroid Build Coastguard Worker /*! \class Image1DArray
3823*61046927SAndroid Build Coastguard Worker  * \brief Image interface for arrays of 1D images.
3824*61046927SAndroid Build Coastguard Worker  */
3825*61046927SAndroid Build Coastguard Worker class Image1DArray : public Image
3826*61046927SAndroid Build Coastguard Worker {
3827*61046927SAndroid Build Coastguard Worker public:
Image1DArray(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t arraySize,::size_t width,::size_t rowPitch,void * host_ptr=NULL,cl_int * err=NULL)3828*61046927SAndroid Build Coastguard Worker     Image1DArray(
3829*61046927SAndroid Build Coastguard Worker         const Context& context,
3830*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3831*61046927SAndroid Build Coastguard Worker         ImageFormat format,
3832*61046927SAndroid Build Coastguard Worker         ::size_t arraySize,
3833*61046927SAndroid Build Coastguard Worker         ::size_t width,
3834*61046927SAndroid Build Coastguard Worker         ::size_t rowPitch,
3835*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3836*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3837*61046927SAndroid Build Coastguard Worker     {
3838*61046927SAndroid Build Coastguard Worker         cl_int error;
3839*61046927SAndroid Build Coastguard Worker         cl_image_desc desc =
3840*61046927SAndroid Build Coastguard Worker         {
3841*61046927SAndroid Build Coastguard Worker             CL_MEM_OBJECT_IMAGE1D_ARRAY,
3842*61046927SAndroid Build Coastguard Worker             width,
3843*61046927SAndroid Build Coastguard Worker             0, 0,  // height, depth (unused)
3844*61046927SAndroid Build Coastguard Worker             arraySize,
3845*61046927SAndroid Build Coastguard Worker             rowPitch,
3846*61046927SAndroid Build Coastguard Worker             0, 0, 0, 0
3847*61046927SAndroid Build Coastguard Worker         };
3848*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
3849*61046927SAndroid Build Coastguard Worker             context(),
3850*61046927SAndroid Build Coastguard Worker             flags,
3851*61046927SAndroid Build Coastguard Worker             &format,
3852*61046927SAndroid Build Coastguard Worker             &desc,
3853*61046927SAndroid Build Coastguard Worker             host_ptr,
3854*61046927SAndroid Build Coastguard Worker             &error);
3855*61046927SAndroid Build Coastguard Worker 
3856*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
3857*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3858*61046927SAndroid Build Coastguard Worker             *err = error;
3859*61046927SAndroid Build Coastguard Worker         }
3860*61046927SAndroid Build Coastguard Worker     }
3861*61046927SAndroid Build Coastguard Worker 
Image1DArray()3862*61046927SAndroid Build Coastguard Worker     Image1DArray() { }
3863*61046927SAndroid Build Coastguard Worker 
Image1DArray(const cl_mem & imageArray)3864*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { }
3865*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)3866*61046927SAndroid Build Coastguard Worker     Image1DArray& operator = (const cl_mem& rhs)
3867*61046927SAndroid Build Coastguard Worker     {
3868*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
3869*61046927SAndroid Build Coastguard Worker         return *this;
3870*61046927SAndroid Build Coastguard Worker     }
3871*61046927SAndroid Build Coastguard Worker 
3872*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3873*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3874*61046927SAndroid Build Coastguard Worker      */
Image1DArray(const Image1DArray & img)3875*61046927SAndroid Build Coastguard Worker     Image1DArray(const Image1DArray& img) : Image(img) {}
3876*61046927SAndroid Build Coastguard Worker 
3877*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3878*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3879*61046927SAndroid Build Coastguard Worker      */
operator =(const Image1DArray & img)3880*61046927SAndroid Build Coastguard Worker     Image1DArray& operator = (const Image1DArray &img)
3881*61046927SAndroid Build Coastguard Worker     {
3882*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
3883*61046927SAndroid Build Coastguard Worker         return *this;
3884*61046927SAndroid Build Coastguard Worker     }
3885*61046927SAndroid Build Coastguard Worker 
3886*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3887*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3888*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3889*61046927SAndroid Build Coastguard Worker      */
Image1DArray(Image1DArray && img)3890*61046927SAndroid Build Coastguard Worker     Image1DArray(Image1DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
3891*61046927SAndroid Build Coastguard Worker 
3892*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3893*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3894*61046927SAndroid Build Coastguard Worker      */
operator =(Image1DArray && img)3895*61046927SAndroid Build Coastguard Worker     Image1DArray& operator = (Image1DArray &&img)
3896*61046927SAndroid Build Coastguard Worker     {
3897*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
3898*61046927SAndroid Build Coastguard Worker         return *this;
3899*61046927SAndroid Build Coastguard Worker     }
3900*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3901*61046927SAndroid Build Coastguard Worker };
3902*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
3903*61046927SAndroid Build Coastguard Worker 
3904*61046927SAndroid Build Coastguard Worker 
3905*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for 2D Image Memory objects.
3906*61046927SAndroid Build Coastguard Worker  *
3907*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3908*61046927SAndroid Build Coastguard Worker  *
3909*61046927SAndroid Build Coastguard Worker  *  \see Memory
3910*61046927SAndroid Build Coastguard Worker  */
3911*61046927SAndroid Build Coastguard Worker class Image2D : public Image
3912*61046927SAndroid Build Coastguard Worker {
3913*61046927SAndroid Build Coastguard Worker public:
3914*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 1D Image in a specified context.
3915*61046927SAndroid Build Coastguard Worker      *
3916*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateImage().
3917*61046927SAndroid Build Coastguard Worker      */
Image2D(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,::size_t height,::size_t row_pitch=0,void * host_ptr=NULL,cl_int * err=NULL)3918*61046927SAndroid Build Coastguard Worker     Image2D(
3919*61046927SAndroid Build Coastguard Worker         const Context& context,
3920*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3921*61046927SAndroid Build Coastguard Worker         ImageFormat format,
3922*61046927SAndroid Build Coastguard Worker         ::size_t width,
3923*61046927SAndroid Build Coastguard Worker         ::size_t height,
3924*61046927SAndroid Build Coastguard Worker         ::size_t row_pitch = 0,
3925*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3926*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3927*61046927SAndroid Build Coastguard Worker     {
3928*61046927SAndroid Build Coastguard Worker         cl_int error;
3929*61046927SAndroid Build Coastguard Worker         bool useCreateImage;
3930*61046927SAndroid Build Coastguard Worker 
3931*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3932*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
3933*61046927SAndroid Build Coastguard Worker         {
3934*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
3935*61046927SAndroid Build Coastguard Worker             useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
3936*61046927SAndroid Build Coastguard Worker         }
3937*61046927SAndroid Build Coastguard Worker #elif defined(CL_VERSION_1_2)
3938*61046927SAndroid Build Coastguard Worker         useCreateImage = true;
3939*61046927SAndroid Build Coastguard Worker #else
3940*61046927SAndroid Build Coastguard Worker         useCreateImage = false;
3941*61046927SAndroid Build Coastguard Worker #endif
3942*61046927SAndroid Build Coastguard Worker 
3943*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
3944*61046927SAndroid Build Coastguard Worker         if (useCreateImage)
3945*61046927SAndroid Build Coastguard Worker         {
3946*61046927SAndroid Build Coastguard Worker             cl_image_desc desc =
3947*61046927SAndroid Build Coastguard Worker             {
3948*61046927SAndroid Build Coastguard Worker                 CL_MEM_OBJECT_IMAGE2D,
3949*61046927SAndroid Build Coastguard Worker                 width,
3950*61046927SAndroid Build Coastguard Worker                 height,
3951*61046927SAndroid Build Coastguard Worker                 0, 0, // depth, array size (unused)
3952*61046927SAndroid Build Coastguard Worker                 row_pitch,
3953*61046927SAndroid Build Coastguard Worker                 0, 0, 0, 0
3954*61046927SAndroid Build Coastguard Worker             };
3955*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage(
3956*61046927SAndroid Build Coastguard Worker                 context(),
3957*61046927SAndroid Build Coastguard Worker                 flags,
3958*61046927SAndroid Build Coastguard Worker                 &format,
3959*61046927SAndroid Build Coastguard Worker                 &desc,
3960*61046927SAndroid Build Coastguard Worker                 host_ptr,
3961*61046927SAndroid Build Coastguard Worker                 &error);
3962*61046927SAndroid Build Coastguard Worker 
3963*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE_ERR);
3964*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
3965*61046927SAndroid Build Coastguard Worker                 *err = error;
3966*61046927SAndroid Build Coastguard Worker             }
3967*61046927SAndroid Build Coastguard Worker         }
3968*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
3969*61046927SAndroid Build Coastguard Worker #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3970*61046927SAndroid Build Coastguard Worker         if (!useCreateImage)
3971*61046927SAndroid Build Coastguard Worker         {
3972*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage2D(
3973*61046927SAndroid Build Coastguard Worker                 context(), flags,&format, width, height, row_pitch, host_ptr, &error);
3974*61046927SAndroid Build Coastguard Worker 
3975*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE2D_ERR);
3976*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
3977*61046927SAndroid Build Coastguard Worker                 *err = error;
3978*61046927SAndroid Build Coastguard Worker             }
3979*61046927SAndroid Build Coastguard Worker         }
3980*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3981*61046927SAndroid Build Coastguard Worker     }
3982*61046927SAndroid Build Coastguard Worker 
3983*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image2D()3984*61046927SAndroid Build Coastguard Worker     Image2D() { }
3985*61046927SAndroid Build Coastguard Worker 
3986*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3987*61046927SAndroid Build Coastguard Worker      *
3988*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3989*61046927SAndroid Build Coastguard Worker      */
Image2D(const cl_mem & image2D)3990*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { }
3991*61046927SAndroid Build Coastguard Worker 
3992*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
3993*61046927SAndroid Build Coastguard Worker      *
3994*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3995*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3996*61046927SAndroid Build Coastguard Worker     Image2D& operator = (const cl_mem& rhs)
3997*61046927SAndroid Build Coastguard Worker     {
3998*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
3999*61046927SAndroid Build Coastguard Worker         return *this;
4000*61046927SAndroid Build Coastguard Worker     }
4001*61046927SAndroid Build Coastguard Worker 
4002*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4003*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4004*61046927SAndroid Build Coastguard Worker      */
Image2D(const Image2D & img)4005*61046927SAndroid Build Coastguard Worker     Image2D(const Image2D& img) : Image(img) {}
4006*61046927SAndroid Build Coastguard Worker 
4007*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4008*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4009*61046927SAndroid Build Coastguard Worker      */
operator =(const Image2D & img)4010*61046927SAndroid Build Coastguard Worker     Image2D& operator = (const Image2D &img)
4011*61046927SAndroid Build Coastguard Worker     {
4012*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4013*61046927SAndroid Build Coastguard Worker         return *this;
4014*61046927SAndroid Build Coastguard Worker     }
4015*61046927SAndroid Build Coastguard Worker 
4016*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4017*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4018*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4019*61046927SAndroid Build Coastguard Worker      */
Image2D(Image2D && img)4020*61046927SAndroid Build Coastguard Worker     Image2D(Image2D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4021*61046927SAndroid Build Coastguard Worker 
4022*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4023*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4024*61046927SAndroid Build Coastguard Worker      */
operator =(Image2D && img)4025*61046927SAndroid Build Coastguard Worker     Image2D& operator = (Image2D &&img)
4026*61046927SAndroid Build Coastguard Worker     {
4027*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4028*61046927SAndroid Build Coastguard Worker         return *this;
4029*61046927SAndroid Build Coastguard Worker     }
4030*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4031*61046927SAndroid Build Coastguard Worker };
4032*61046927SAndroid Build Coastguard Worker 
4033*61046927SAndroid Build Coastguard Worker 
4034*61046927SAndroid Build Coastguard Worker #if !defined(CL_VERSION_1_2)
4035*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL 2D Image Memory objects.
4036*61046927SAndroid Build Coastguard Worker  *
4037*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
4038*61046927SAndroid Build Coastguard Worker  *
4039*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4040*61046927SAndroid Build Coastguard Worker  *
4041*61046927SAndroid Build Coastguard Worker  *  \see Memory
4042*61046927SAndroid Build Coastguard Worker  *  \note Deprecated for OpenCL 1.2. Please use ImageGL instead.
4043*61046927SAndroid Build Coastguard Worker  */
4044*61046927SAndroid Build Coastguard Worker class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D
4045*61046927SAndroid Build Coastguard Worker {
4046*61046927SAndroid Build Coastguard Worker public:
4047*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs an Image2DGL in a specified context, from a given
4048*61046927SAndroid Build Coastguard Worker      *         GL Texture.
4049*61046927SAndroid Build Coastguard Worker      *
4050*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLTexture2D().
4051*61046927SAndroid Build Coastguard Worker      */
Image2DGL(const Context & context,cl_mem_flags flags,cl_GLenum target,cl_GLint miplevel,cl_GLuint texobj,cl_int * err=NULL)4052*61046927SAndroid Build Coastguard Worker     Image2DGL(
4053*61046927SAndroid Build Coastguard Worker         const Context& context,
4054*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4055*61046927SAndroid Build Coastguard Worker         cl_GLenum target,
4056*61046927SAndroid Build Coastguard Worker         cl_GLint  miplevel,
4057*61046927SAndroid Build Coastguard Worker         cl_GLuint texobj,
4058*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4059*61046927SAndroid Build Coastguard Worker     {
4060*61046927SAndroid Build Coastguard Worker         cl_int error;
4061*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLTexture2D(
4062*61046927SAndroid Build Coastguard Worker             context(),
4063*61046927SAndroid Build Coastguard Worker             flags,
4064*61046927SAndroid Build Coastguard Worker             target,
4065*61046927SAndroid Build Coastguard Worker             miplevel,
4066*61046927SAndroid Build Coastguard Worker             texobj,
4067*61046927SAndroid Build Coastguard Worker             &error);
4068*61046927SAndroid Build Coastguard Worker 
4069*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR);
4070*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4071*61046927SAndroid Build Coastguard Worker             *err = error;
4072*61046927SAndroid Build Coastguard Worker         }
4073*61046927SAndroid Build Coastguard Worker 
4074*61046927SAndroid Build Coastguard Worker     }
4075*61046927SAndroid Build Coastguard Worker 
4076*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image2DGL()4077*61046927SAndroid Build Coastguard Worker     Image2DGL() : Image2D() { }
4078*61046927SAndroid Build Coastguard Worker 
4079*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4080*61046927SAndroid Build Coastguard Worker      *
4081*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4082*61046927SAndroid Build Coastguard Worker      */
Image2DGL(const cl_mem & image)4083*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { }
4084*61046927SAndroid Build Coastguard Worker 
4085*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4086*61046927SAndroid Build Coastguard Worker      *
4087*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4088*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4089*61046927SAndroid Build Coastguard Worker     Image2DGL& operator = (const cl_mem& rhs)
4090*61046927SAndroid Build Coastguard Worker     {
4091*61046927SAndroid Build Coastguard Worker         Image2D::operator=(rhs);
4092*61046927SAndroid Build Coastguard Worker         return *this;
4093*61046927SAndroid Build Coastguard Worker     }
4094*61046927SAndroid Build Coastguard Worker 
4095*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4096*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4097*61046927SAndroid Build Coastguard Worker      */
Image2DGL(const Image2DGL & img)4098*61046927SAndroid Build Coastguard Worker     Image2DGL(const Image2DGL& img) : Image2D(img) {}
4099*61046927SAndroid Build Coastguard Worker 
4100*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4101*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4102*61046927SAndroid Build Coastguard Worker      */
operator =(const Image2DGL & img)4103*61046927SAndroid Build Coastguard Worker     Image2DGL& operator = (const Image2DGL &img)
4104*61046927SAndroid Build Coastguard Worker     {
4105*61046927SAndroid Build Coastguard Worker         Image2D::operator=(img);
4106*61046927SAndroid Build Coastguard Worker         return *this;
4107*61046927SAndroid Build Coastguard Worker     }
4108*61046927SAndroid Build Coastguard Worker 
4109*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4110*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4111*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4112*61046927SAndroid Build Coastguard Worker      */
Image2DGL(Image2DGL && img)4113*61046927SAndroid Build Coastguard Worker     Image2DGL(Image2DGL&& img) CL_HPP_NOEXCEPT : Image2D(std::move(img)) {}
4114*61046927SAndroid Build Coastguard Worker 
4115*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4116*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4117*61046927SAndroid Build Coastguard Worker      */
operator =(Image2DGL && img)4118*61046927SAndroid Build Coastguard Worker     Image2DGL& operator = (Image2DGL &&img)
4119*61046927SAndroid Build Coastguard Worker     {
4120*61046927SAndroid Build Coastguard Worker         Image2D::operator=(std::move(img));
4121*61046927SAndroid Build Coastguard Worker         return *this;
4122*61046927SAndroid Build Coastguard Worker     }
4123*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4124*61046927SAndroid Build Coastguard Worker };
4125*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_VERSION_1_2)
4126*61046927SAndroid Build Coastguard Worker 
4127*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4128*61046927SAndroid Build Coastguard Worker /*! \class Image2DArray
4129*61046927SAndroid Build Coastguard Worker  * \brief Image interface for arrays of 2D images.
4130*61046927SAndroid Build Coastguard Worker  */
4131*61046927SAndroid Build Coastguard Worker class Image2DArray : public Image
4132*61046927SAndroid Build Coastguard Worker {
4133*61046927SAndroid Build Coastguard Worker public:
Image2DArray(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t arraySize,::size_t width,::size_t height,::size_t rowPitch,::size_t slicePitch,void * host_ptr=NULL,cl_int * err=NULL)4134*61046927SAndroid Build Coastguard Worker     Image2DArray(
4135*61046927SAndroid Build Coastguard Worker         const Context& context,
4136*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4137*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4138*61046927SAndroid Build Coastguard Worker         ::size_t arraySize,
4139*61046927SAndroid Build Coastguard Worker         ::size_t width,
4140*61046927SAndroid Build Coastguard Worker         ::size_t height,
4141*61046927SAndroid Build Coastguard Worker         ::size_t rowPitch,
4142*61046927SAndroid Build Coastguard Worker         ::size_t slicePitch,
4143*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
4144*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4145*61046927SAndroid Build Coastguard Worker     {
4146*61046927SAndroid Build Coastguard Worker         cl_int error;
4147*61046927SAndroid Build Coastguard Worker         cl_image_desc desc =
4148*61046927SAndroid Build Coastguard Worker         {
4149*61046927SAndroid Build Coastguard Worker             CL_MEM_OBJECT_IMAGE2D_ARRAY,
4150*61046927SAndroid Build Coastguard Worker             width,
4151*61046927SAndroid Build Coastguard Worker             height,
4152*61046927SAndroid Build Coastguard Worker             0,       // depth (unused)
4153*61046927SAndroid Build Coastguard Worker             arraySize,
4154*61046927SAndroid Build Coastguard Worker             rowPitch,
4155*61046927SAndroid Build Coastguard Worker             slicePitch,
4156*61046927SAndroid Build Coastguard Worker             0, 0, 0
4157*61046927SAndroid Build Coastguard Worker         };
4158*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
4159*61046927SAndroid Build Coastguard Worker             context(),
4160*61046927SAndroid Build Coastguard Worker             flags,
4161*61046927SAndroid Build Coastguard Worker             &format,
4162*61046927SAndroid Build Coastguard Worker             &desc,
4163*61046927SAndroid Build Coastguard Worker             host_ptr,
4164*61046927SAndroid Build Coastguard Worker             &error);
4165*61046927SAndroid Build Coastguard Worker 
4166*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
4167*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4168*61046927SAndroid Build Coastguard Worker             *err = error;
4169*61046927SAndroid Build Coastguard Worker         }
4170*61046927SAndroid Build Coastguard Worker     }
4171*61046927SAndroid Build Coastguard Worker 
Image2DArray()4172*61046927SAndroid Build Coastguard Worker     Image2DArray() { }
4173*61046927SAndroid Build Coastguard Worker 
Image2DArray(const cl_mem & imageArray)4174*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { }
4175*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)4176*61046927SAndroid Build Coastguard Worker     Image2DArray& operator = (const cl_mem& rhs)
4177*61046927SAndroid Build Coastguard Worker     {
4178*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4179*61046927SAndroid Build Coastguard Worker         return *this;
4180*61046927SAndroid Build Coastguard Worker     }
4181*61046927SAndroid Build Coastguard Worker 
4182*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4183*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4184*61046927SAndroid Build Coastguard Worker      */
Image2DArray(const Image2DArray & img)4185*61046927SAndroid Build Coastguard Worker     Image2DArray(const Image2DArray& img) : Image(img) {}
4186*61046927SAndroid Build Coastguard Worker 
4187*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4188*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4189*61046927SAndroid Build Coastguard Worker      */
operator =(const Image2DArray & img)4190*61046927SAndroid Build Coastguard Worker     Image2DArray& operator = (const Image2DArray &img)
4191*61046927SAndroid Build Coastguard Worker     {
4192*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4193*61046927SAndroid Build Coastguard Worker         return *this;
4194*61046927SAndroid Build Coastguard Worker     }
4195*61046927SAndroid Build Coastguard Worker 
4196*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4197*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4198*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4199*61046927SAndroid Build Coastguard Worker      */
Image2DArray(Image2DArray && img)4200*61046927SAndroid Build Coastguard Worker     Image2DArray(Image2DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4201*61046927SAndroid Build Coastguard Worker 
4202*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4203*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4204*61046927SAndroid Build Coastguard Worker      */
operator =(Image2DArray && img)4205*61046927SAndroid Build Coastguard Worker     Image2DArray& operator = (Image2DArray &&img)
4206*61046927SAndroid Build Coastguard Worker     {
4207*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4208*61046927SAndroid Build Coastguard Worker         return *this;
4209*61046927SAndroid Build Coastguard Worker     }
4210*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4211*61046927SAndroid Build Coastguard Worker };
4212*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
4213*61046927SAndroid Build Coastguard Worker 
4214*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for 3D Image Memory objects.
4215*61046927SAndroid Build Coastguard Worker  *
4216*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4217*61046927SAndroid Build Coastguard Worker  *
4218*61046927SAndroid Build Coastguard Worker  *  \see Memory
4219*61046927SAndroid Build Coastguard Worker  */
4220*61046927SAndroid Build Coastguard Worker class Image3D : public Image
4221*61046927SAndroid Build Coastguard Worker {
4222*61046927SAndroid Build Coastguard Worker public:
4223*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 3D Image in a specified context.
4224*61046927SAndroid Build Coastguard Worker      *
4225*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateImage().
4226*61046927SAndroid Build Coastguard Worker      */
Image3D(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,::size_t height,::size_t depth,::size_t row_pitch=0,::size_t slice_pitch=0,void * host_ptr=NULL,cl_int * err=NULL)4227*61046927SAndroid Build Coastguard Worker     Image3D(
4228*61046927SAndroid Build Coastguard Worker         const Context& context,
4229*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4230*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4231*61046927SAndroid Build Coastguard Worker         ::size_t width,
4232*61046927SAndroid Build Coastguard Worker         ::size_t height,
4233*61046927SAndroid Build Coastguard Worker         ::size_t depth,
4234*61046927SAndroid Build Coastguard Worker         ::size_t row_pitch = 0,
4235*61046927SAndroid Build Coastguard Worker         ::size_t slice_pitch = 0,
4236*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
4237*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4238*61046927SAndroid Build Coastguard Worker     {
4239*61046927SAndroid Build Coastguard Worker         cl_int error;
4240*61046927SAndroid Build Coastguard Worker         bool useCreateImage;
4241*61046927SAndroid Build Coastguard Worker 
4242*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4243*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
4244*61046927SAndroid Build Coastguard Worker         {
4245*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
4246*61046927SAndroid Build Coastguard Worker             useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
4247*61046927SAndroid Build Coastguard Worker         }
4248*61046927SAndroid Build Coastguard Worker #elif defined(CL_VERSION_1_2)
4249*61046927SAndroid Build Coastguard Worker         useCreateImage = true;
4250*61046927SAndroid Build Coastguard Worker #else
4251*61046927SAndroid Build Coastguard Worker         useCreateImage = false;
4252*61046927SAndroid Build Coastguard Worker #endif
4253*61046927SAndroid Build Coastguard Worker 
4254*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4255*61046927SAndroid Build Coastguard Worker         if (useCreateImage)
4256*61046927SAndroid Build Coastguard Worker         {
4257*61046927SAndroid Build Coastguard Worker             cl_image_desc desc =
4258*61046927SAndroid Build Coastguard Worker             {
4259*61046927SAndroid Build Coastguard Worker                 CL_MEM_OBJECT_IMAGE3D,
4260*61046927SAndroid Build Coastguard Worker                 width,
4261*61046927SAndroid Build Coastguard Worker                 height,
4262*61046927SAndroid Build Coastguard Worker                 depth,
4263*61046927SAndroid Build Coastguard Worker                 0,      // array size (unused)
4264*61046927SAndroid Build Coastguard Worker                 row_pitch,
4265*61046927SAndroid Build Coastguard Worker                 slice_pitch,
4266*61046927SAndroid Build Coastguard Worker                 0, 0, 0
4267*61046927SAndroid Build Coastguard Worker             };
4268*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage(
4269*61046927SAndroid Build Coastguard Worker                 context(),
4270*61046927SAndroid Build Coastguard Worker                 flags,
4271*61046927SAndroid Build Coastguard Worker                 &format,
4272*61046927SAndroid Build Coastguard Worker                 &desc,
4273*61046927SAndroid Build Coastguard Worker                 host_ptr,
4274*61046927SAndroid Build Coastguard Worker                 &error);
4275*61046927SAndroid Build Coastguard Worker 
4276*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE_ERR);
4277*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
4278*61046927SAndroid Build Coastguard Worker                 *err = error;
4279*61046927SAndroid Build Coastguard Worker             }
4280*61046927SAndroid Build Coastguard Worker         }
4281*61046927SAndroid Build Coastguard Worker #endif  // #if defined(CL_VERSION_1_2)
4282*61046927SAndroid Build Coastguard Worker #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4283*61046927SAndroid Build Coastguard Worker         if (!useCreateImage)
4284*61046927SAndroid Build Coastguard Worker         {
4285*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage3D(
4286*61046927SAndroid Build Coastguard Worker                 context(), flags, &format, width, height, depth, row_pitch,
4287*61046927SAndroid Build Coastguard Worker                 slice_pitch, host_ptr, &error);
4288*61046927SAndroid Build Coastguard Worker 
4289*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE3D_ERR);
4290*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
4291*61046927SAndroid Build Coastguard Worker                 *err = error;
4292*61046927SAndroid Build Coastguard Worker             }
4293*61046927SAndroid Build Coastguard Worker         }
4294*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4295*61046927SAndroid Build Coastguard Worker     }
4296*61046927SAndroid Build Coastguard Worker 
4297*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image3D()4298*61046927SAndroid Build Coastguard Worker     Image3D() : Image() { }
4299*61046927SAndroid Build Coastguard Worker 
4300*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4301*61046927SAndroid Build Coastguard Worker      *
4302*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4303*61046927SAndroid Build Coastguard Worker      */
Image3D(const cl_mem & image3D)4304*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { }
4305*61046927SAndroid Build Coastguard Worker 
4306*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4307*61046927SAndroid Build Coastguard Worker      *
4308*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4309*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4310*61046927SAndroid Build Coastguard Worker     Image3D& operator = (const cl_mem& rhs)
4311*61046927SAndroid Build Coastguard Worker     {
4312*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4313*61046927SAndroid Build Coastguard Worker         return *this;
4314*61046927SAndroid Build Coastguard Worker     }
4315*61046927SAndroid Build Coastguard Worker 
4316*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4317*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4318*61046927SAndroid Build Coastguard Worker      */
Image3D(const Image3D & img)4319*61046927SAndroid Build Coastguard Worker     Image3D(const Image3D& img) : Image(img) {}
4320*61046927SAndroid Build Coastguard Worker 
4321*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4322*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4323*61046927SAndroid Build Coastguard Worker      */
operator =(const Image3D & img)4324*61046927SAndroid Build Coastguard Worker     Image3D& operator = (const Image3D &img)
4325*61046927SAndroid Build Coastguard Worker     {
4326*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4327*61046927SAndroid Build Coastguard Worker         return *this;
4328*61046927SAndroid Build Coastguard Worker     }
4329*61046927SAndroid Build Coastguard Worker 
4330*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4331*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4332*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4333*61046927SAndroid Build Coastguard Worker      */
Image3D(Image3D && img)4334*61046927SAndroid Build Coastguard Worker     Image3D(Image3D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4335*61046927SAndroid Build Coastguard Worker 
4336*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4337*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4338*61046927SAndroid Build Coastguard Worker      */
operator =(Image3D && img)4339*61046927SAndroid Build Coastguard Worker     Image3D& operator = (Image3D &&img)
4340*61046927SAndroid Build Coastguard Worker     {
4341*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4342*61046927SAndroid Build Coastguard Worker         return *this;
4343*61046927SAndroid Build Coastguard Worker     }
4344*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4345*61046927SAndroid Build Coastguard Worker };
4346*61046927SAndroid Build Coastguard Worker 
4347*61046927SAndroid Build Coastguard Worker #if !defined(CL_VERSION_1_2)
4348*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL 3D Image Memory objects.
4349*61046927SAndroid Build Coastguard Worker  *
4350*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
4351*61046927SAndroid Build Coastguard Worker  *
4352*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4353*61046927SAndroid Build Coastguard Worker  *
4354*61046927SAndroid Build Coastguard Worker  *  \see Memory
4355*61046927SAndroid Build Coastguard Worker  */
4356*61046927SAndroid Build Coastguard Worker class Image3DGL : public Image3D
4357*61046927SAndroid Build Coastguard Worker {
4358*61046927SAndroid Build Coastguard Worker public:
4359*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs an Image3DGL in a specified context, from a given
4360*61046927SAndroid Build Coastguard Worker      *         GL Texture.
4361*61046927SAndroid Build Coastguard Worker      *
4362*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLTexture3D().
4363*61046927SAndroid Build Coastguard Worker      */
Image3DGL(const Context & context,cl_mem_flags flags,cl_GLenum target,cl_GLint miplevel,cl_GLuint texobj,cl_int * err=NULL)4364*61046927SAndroid Build Coastguard Worker     Image3DGL(
4365*61046927SAndroid Build Coastguard Worker         const Context& context,
4366*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4367*61046927SAndroid Build Coastguard Worker         cl_GLenum target,
4368*61046927SAndroid Build Coastguard Worker         cl_GLint  miplevel,
4369*61046927SAndroid Build Coastguard Worker         cl_GLuint texobj,
4370*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4371*61046927SAndroid Build Coastguard Worker     {
4372*61046927SAndroid Build Coastguard Worker         cl_int error;
4373*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLTexture3D(
4374*61046927SAndroid Build Coastguard Worker             context(),
4375*61046927SAndroid Build Coastguard Worker             flags,
4376*61046927SAndroid Build Coastguard Worker             target,
4377*61046927SAndroid Build Coastguard Worker             miplevel,
4378*61046927SAndroid Build Coastguard Worker             texobj,
4379*61046927SAndroid Build Coastguard Worker             &error);
4380*61046927SAndroid Build Coastguard Worker 
4381*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR);
4382*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4383*61046927SAndroid Build Coastguard Worker             *err = error;
4384*61046927SAndroid Build Coastguard Worker         }
4385*61046927SAndroid Build Coastguard Worker     }
4386*61046927SAndroid Build Coastguard Worker 
4387*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image3DGL()4388*61046927SAndroid Build Coastguard Worker     Image3DGL() : Image3D() { }
4389*61046927SAndroid Build Coastguard Worker 
4390*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4391*61046927SAndroid Build Coastguard Worker      *
4392*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4393*61046927SAndroid Build Coastguard Worker      */
Image3DGL(const cl_mem & image)4394*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { }
4395*61046927SAndroid Build Coastguard Worker 
4396*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4397*61046927SAndroid Build Coastguard Worker      *
4398*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4399*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4400*61046927SAndroid Build Coastguard Worker     Image3DGL& operator = (const cl_mem& rhs)
4401*61046927SAndroid Build Coastguard Worker     {
4402*61046927SAndroid Build Coastguard Worker         Image3D::operator=(rhs);
4403*61046927SAndroid Build Coastguard Worker         return *this;
4404*61046927SAndroid Build Coastguard Worker     }
4405*61046927SAndroid Build Coastguard Worker 
4406*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4407*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4408*61046927SAndroid Build Coastguard Worker      */
Image3DGL(const Image3DGL & img)4409*61046927SAndroid Build Coastguard Worker     Image3DGL(const Image3DGL& img) : Image3D(img) {}
4410*61046927SAndroid Build Coastguard Worker 
4411*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4412*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4413*61046927SAndroid Build Coastguard Worker      */
operator =(const Image3DGL & img)4414*61046927SAndroid Build Coastguard Worker     Image3DGL& operator = (const Image3DGL &img)
4415*61046927SAndroid Build Coastguard Worker     {
4416*61046927SAndroid Build Coastguard Worker         Image3D::operator=(img);
4417*61046927SAndroid Build Coastguard Worker         return *this;
4418*61046927SAndroid Build Coastguard Worker     }
4419*61046927SAndroid Build Coastguard Worker 
4420*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4421*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4422*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4423*61046927SAndroid Build Coastguard Worker      */
Image3DGL(Image3DGL && img)4424*61046927SAndroid Build Coastguard Worker     Image3DGL(Image3DGL&& img) CL_HPP_NOEXCEPT : Image3D(std::move(img)) {}
4425*61046927SAndroid Build Coastguard Worker 
4426*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4427*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4428*61046927SAndroid Build Coastguard Worker      */
operator =(Image3DGL && img)4429*61046927SAndroid Build Coastguard Worker     Image3DGL& operator = (Image3DGL &&img)
4430*61046927SAndroid Build Coastguard Worker     {
4431*61046927SAndroid Build Coastguard Worker         Image3D::operator=(std::move(img));
4432*61046927SAndroid Build Coastguard Worker         return *this;
4433*61046927SAndroid Build Coastguard Worker     }
4434*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4435*61046927SAndroid Build Coastguard Worker };
4436*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_VERSION_1_2)
4437*61046927SAndroid Build Coastguard Worker 
4438*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4439*61046927SAndroid Build Coastguard Worker /*! \class ImageGL
4440*61046927SAndroid Build Coastguard Worker  * \brief general image interface for GL interop.
4441*61046927SAndroid Build Coastguard Worker  * We abstract the 2D and 3D GL images into a single instance here
4442*61046927SAndroid Build Coastguard Worker  * that wraps all GL sourced images on the grounds that setup information
4443*61046927SAndroid Build Coastguard Worker  * was performed by OpenCL anyway.
4444*61046927SAndroid Build Coastguard Worker  */
4445*61046927SAndroid Build Coastguard Worker class ImageGL : public Image
4446*61046927SAndroid Build Coastguard Worker {
4447*61046927SAndroid Build Coastguard Worker public:
ImageGL(const Context & context,cl_mem_flags flags,cl_GLenum target,cl_GLint miplevel,cl_GLuint texobj,cl_int * err=NULL)4448*61046927SAndroid Build Coastguard Worker     ImageGL(
4449*61046927SAndroid Build Coastguard Worker         const Context& context,
4450*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4451*61046927SAndroid Build Coastguard Worker         cl_GLenum target,
4452*61046927SAndroid Build Coastguard Worker         cl_GLint  miplevel,
4453*61046927SAndroid Build Coastguard Worker         cl_GLuint texobj,
4454*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4455*61046927SAndroid Build Coastguard Worker     {
4456*61046927SAndroid Build Coastguard Worker         cl_int error;
4457*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLTexture(
4458*61046927SAndroid Build Coastguard Worker             context(),
4459*61046927SAndroid Build Coastguard Worker             flags,
4460*61046927SAndroid Build Coastguard Worker             target,
4461*61046927SAndroid Build Coastguard Worker             miplevel,
4462*61046927SAndroid Build Coastguard Worker             texobj,
4463*61046927SAndroid Build Coastguard Worker             &error);
4464*61046927SAndroid Build Coastguard Worker 
4465*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_TEXTURE_ERR);
4466*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4467*61046927SAndroid Build Coastguard Worker             *err = error;
4468*61046927SAndroid Build Coastguard Worker         }
4469*61046927SAndroid Build Coastguard Worker     }
4470*61046927SAndroid Build Coastguard Worker 
ImageGL()4471*61046927SAndroid Build Coastguard Worker     ImageGL() : Image() { }
4472*61046927SAndroid Build Coastguard Worker 
ImageGL(const cl_mem & image)4473*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { }
4474*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)4475*61046927SAndroid Build Coastguard Worker     ImageGL& operator = (const cl_mem& rhs)
4476*61046927SAndroid Build Coastguard Worker     {
4477*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4478*61046927SAndroid Build Coastguard Worker         return *this;
4479*61046927SAndroid Build Coastguard Worker     }
4480*61046927SAndroid Build Coastguard Worker 
4481*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4482*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4483*61046927SAndroid Build Coastguard Worker      */
ImageGL(const ImageGL & img)4484*61046927SAndroid Build Coastguard Worker     ImageGL(const ImageGL& img) : Image(img) {}
4485*61046927SAndroid Build Coastguard Worker 
4486*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4487*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4488*61046927SAndroid Build Coastguard Worker      */
operator =(const ImageGL & img)4489*61046927SAndroid Build Coastguard Worker     ImageGL& operator = (const ImageGL &img)
4490*61046927SAndroid Build Coastguard Worker     {
4491*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4492*61046927SAndroid Build Coastguard Worker         return *this;
4493*61046927SAndroid Build Coastguard Worker     }
4494*61046927SAndroid Build Coastguard Worker 
4495*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4496*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4497*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4498*61046927SAndroid Build Coastguard Worker      */
ImageGL(ImageGL && img)4499*61046927SAndroid Build Coastguard Worker     ImageGL(ImageGL&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4500*61046927SAndroid Build Coastguard Worker 
4501*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4502*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4503*61046927SAndroid Build Coastguard Worker      */
operator =(ImageGL && img)4504*61046927SAndroid Build Coastguard Worker     ImageGL& operator = (ImageGL &&img)
4505*61046927SAndroid Build Coastguard Worker     {
4506*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4507*61046927SAndroid Build Coastguard Worker         return *this;
4508*61046927SAndroid Build Coastguard Worker     }
4509*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4510*61046927SAndroid Build Coastguard Worker };
4511*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
4512*61046927SAndroid Build Coastguard Worker 
4513*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL Render Buffer Memory Objects.
4514*61046927SAndroid Build Coastguard Worker *
4515*61046927SAndroid Build Coastguard Worker *  This is provided to facilitate interoperability with OpenGL.
4516*61046927SAndroid Build Coastguard Worker *
4517*61046927SAndroid Build Coastguard Worker *  See Memory for details about copy semantics, etc.
4518*61046927SAndroid Build Coastguard Worker *
4519*61046927SAndroid Build Coastguard Worker *  \see Memory
4520*61046927SAndroid Build Coastguard Worker */
4521*61046927SAndroid Build Coastguard Worker class BufferRenderGL :
4522*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4523*61046927SAndroid Build Coastguard Worker     public ImageGL
4524*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
4525*61046927SAndroid Build Coastguard Worker     public Image2DGL
4526*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4527*61046927SAndroid Build Coastguard Worker {
4528*61046927SAndroid Build Coastguard Worker public:
4529*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a BufferRenderGL in a specified context, from a given
4530*61046927SAndroid Build Coastguard Worker     *         GL Renderbuffer.
4531*61046927SAndroid Build Coastguard Worker     *
4532*61046927SAndroid Build Coastguard Worker     *  Wraps clCreateFromGLRenderbuffer().
4533*61046927SAndroid Build Coastguard Worker     */
BufferRenderGL(const Context & context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * err=NULL)4534*61046927SAndroid Build Coastguard Worker     BufferRenderGL(
4535*61046927SAndroid Build Coastguard Worker         const Context& context,
4536*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4537*61046927SAndroid Build Coastguard Worker         cl_GLuint bufobj,
4538*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4539*61046927SAndroid Build Coastguard Worker     {
4540*61046927SAndroid Build Coastguard Worker         cl_int error;
4541*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLRenderbuffer(
4542*61046927SAndroid Build Coastguard Worker             context(),
4543*61046927SAndroid Build Coastguard Worker             flags,
4544*61046927SAndroid Build Coastguard Worker             bufobj,
4545*61046927SAndroid Build Coastguard Worker             &error);
4546*61046927SAndroid Build Coastguard Worker 
4547*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
4548*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4549*61046927SAndroid Build Coastguard Worker             *err = error;
4550*61046927SAndroid Build Coastguard Worker         }
4551*61046927SAndroid Build Coastguard Worker     }
4552*61046927SAndroid Build Coastguard Worker 
4553*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
4554*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
BufferRenderGL()4555*61046927SAndroid Build Coastguard Worker     BufferRenderGL() : ImageGL() {};
4556*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
BufferRenderGL()4557*61046927SAndroid Build Coastguard Worker     BufferRenderGL() : Image2DGL() {};
4558*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4559*61046927SAndroid Build Coastguard Worker 
4560*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4561*61046927SAndroid Build Coastguard Worker     *
4562*61046927SAndroid Build Coastguard Worker     *  See Memory for further details.
4563*61046927SAndroid Build Coastguard Worker     */
4564*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
BufferRenderGL(const cl_mem & buffer)4565*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : ImageGL(buffer) { }
4566*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
BufferRenderGL(const cl_mem & buffer)4567*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Image2DGL(buffer) { }
4568*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4569*61046927SAndroid Build Coastguard Worker 
4570*61046927SAndroid Build Coastguard Worker 
4571*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4572*61046927SAndroid Build Coastguard Worker     *
4573*61046927SAndroid Build Coastguard Worker     *  See Memory for further details.
4574*61046927SAndroid Build Coastguard Worker     */
operator =(const cl_mem & rhs)4575*61046927SAndroid Build Coastguard Worker     BufferRenderGL& operator = (const cl_mem& rhs)
4576*61046927SAndroid Build Coastguard Worker     {
4577*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4578*61046927SAndroid Build Coastguard Worker         ImageGL::operator=(rhs);
4579*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
4580*61046927SAndroid Build Coastguard Worker         Image2DGL::operator=(rhs);
4581*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4582*61046927SAndroid Build Coastguard Worker 
4583*61046927SAndroid Build Coastguard Worker         return *this;
4584*61046927SAndroid Build Coastguard Worker     }
4585*61046927SAndroid Build Coastguard Worker 
4586*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4587*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
4588*61046927SAndroid Build Coastguard Worker     */
4589*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
BufferRenderGL(const BufferRenderGL & buf)4590*61046927SAndroid Build Coastguard Worker     BufferRenderGL(const BufferRenderGL& buf) : ImageGL(buf) {}
4591*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
BufferRenderGL(const BufferRenderGL & buf)4592*61046927SAndroid Build Coastguard Worker     BufferRenderGL(const BufferRenderGL& buf) : Image2DGL(buf) {}
4593*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4594*61046927SAndroid Build Coastguard Worker 
4595*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4596*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
4597*61046927SAndroid Build Coastguard Worker     */
operator =(const BufferRenderGL & rhs)4598*61046927SAndroid Build Coastguard Worker     BufferRenderGL& operator = (const BufferRenderGL &rhs)
4599*61046927SAndroid Build Coastguard Worker     {
4600*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4601*61046927SAndroid Build Coastguard Worker         ImageGL::operator=(rhs);
4602*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
4603*61046927SAndroid Build Coastguard Worker         Image2DGL::operator=(rhs);
4604*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4605*61046927SAndroid Build Coastguard Worker         return *this;
4606*61046927SAndroid Build Coastguard Worker     }
4607*61046927SAndroid Build Coastguard Worker 
4608*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4609*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4610*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
4611*61046927SAndroid Build Coastguard Worker     */
4612*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
BufferRenderGL(BufferRenderGL && buf)4613*61046927SAndroid Build Coastguard Worker     BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : ImageGL(std::move(buf)) {}
4614*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
BufferRenderGL(BufferRenderGL && buf)4615*61046927SAndroid Build Coastguard Worker     BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : Image2DGL(std::move(buf)) {}
4616*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4617*61046927SAndroid Build Coastguard Worker 
4618*61046927SAndroid Build Coastguard Worker 
4619*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4620*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
4621*61046927SAndroid Build Coastguard Worker     */
operator =(BufferRenderGL && buf)4622*61046927SAndroid Build Coastguard Worker     BufferRenderGL& operator = (BufferRenderGL &&buf)
4623*61046927SAndroid Build Coastguard Worker     {
4624*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4625*61046927SAndroid Build Coastguard Worker         ImageGL::operator=(std::move(buf));
4626*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_VERSION_1_2)
4627*61046927SAndroid Build Coastguard Worker         Image2DGL::operator=(std::move(buf));
4628*61046927SAndroid Build Coastguard Worker #endif //#if defined(CL_VERSION_1_2)
4629*61046927SAndroid Build Coastguard Worker 
4630*61046927SAndroid Build Coastguard Worker         return *this;
4631*61046927SAndroid Build Coastguard Worker     }
4632*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4633*61046927SAndroid Build Coastguard Worker 
4634*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetGLObjectInfo().
getObjectInfo(cl_gl_object_type * type,cl_GLuint * gl_object_name)4635*61046927SAndroid Build Coastguard Worker     cl_int getObjectInfo(
4636*61046927SAndroid Build Coastguard Worker         cl_gl_object_type *type,
4637*61046927SAndroid Build Coastguard Worker         cl_GLuint * gl_object_name)
4638*61046927SAndroid Build Coastguard Worker     {
4639*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4640*61046927SAndroid Build Coastguard Worker             ::clGetGLObjectInfo(object_, type, gl_object_name),
4641*61046927SAndroid Build Coastguard Worker             __GET_GL_OBJECT_INFO_ERR);
4642*61046927SAndroid Build Coastguard Worker     }
4643*61046927SAndroid Build Coastguard Worker };
4644*61046927SAndroid Build Coastguard Worker 
4645*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_sampler.
4646*61046927SAndroid Build Coastguard Worker  *
4647*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
4648*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_sampler as the original.  For details, see
4649*61046927SAndroid Build Coastguard Worker  *        clRetainSampler() and clReleaseSampler().
4650*61046927SAndroid Build Coastguard Worker  *
4651*61046927SAndroid Build Coastguard Worker  *  \see cl_sampler
4652*61046927SAndroid Build Coastguard Worker  */
4653*61046927SAndroid Build Coastguard Worker class Sampler : public detail::Wrapper<cl_sampler>
4654*61046927SAndroid Build Coastguard Worker {
4655*61046927SAndroid Build Coastguard Worker public:
4656*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Sampler()4657*61046927SAndroid Build Coastguard Worker     Sampler() { }
4658*61046927SAndroid Build Coastguard Worker 
4659*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Sampler in a specified context.
4660*61046927SAndroid Build Coastguard Worker      *
4661*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateSampler().
4662*61046927SAndroid Build Coastguard Worker      */
Sampler(const Context & context,cl_bool normalized_coords,cl_addressing_mode addressing_mode,cl_filter_mode filter_mode,cl_int * err=NULL)4663*61046927SAndroid Build Coastguard Worker     Sampler(
4664*61046927SAndroid Build Coastguard Worker         const Context& context,
4665*61046927SAndroid Build Coastguard Worker         cl_bool normalized_coords,
4666*61046927SAndroid Build Coastguard Worker         cl_addressing_mode addressing_mode,
4667*61046927SAndroid Build Coastguard Worker         cl_filter_mode filter_mode,
4668*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4669*61046927SAndroid Build Coastguard Worker     {
4670*61046927SAndroid Build Coastguard Worker         cl_int error;
4671*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateSampler(
4672*61046927SAndroid Build Coastguard Worker             context(),
4673*61046927SAndroid Build Coastguard Worker             normalized_coords,
4674*61046927SAndroid Build Coastguard Worker             addressing_mode,
4675*61046927SAndroid Build Coastguard Worker             filter_mode,
4676*61046927SAndroid Build Coastguard Worker             &error);
4677*61046927SAndroid Build Coastguard Worker 
4678*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_SAMPLER_ERR);
4679*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4680*61046927SAndroid Build Coastguard Worker             *err = error;
4681*61046927SAndroid Build Coastguard Worker         }
4682*61046927SAndroid Build Coastguard Worker     }
4683*61046927SAndroid Build Coastguard Worker 
4684*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_sampler - takes ownership.
4685*61046927SAndroid Build Coastguard Worker      *
4686*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_sampler
4687*61046927SAndroid Build Coastguard Worker      *  into the new Sampler object.
4688*61046927SAndroid Build Coastguard Worker      */
Sampler(const cl_sampler & sampler)4689*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
4690*61046927SAndroid Build Coastguard Worker 
4691*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_sampler - takes ownership.
4692*61046927SAndroid Build Coastguard Worker      *
4693*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
4694*61046927SAndroid Build Coastguard Worker      *  clReleaseSampler() on the value previously held by this instance.
4695*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_sampler & rhs)4696*61046927SAndroid Build Coastguard Worker     Sampler& operator = (const cl_sampler& rhs)
4697*61046927SAndroid Build Coastguard Worker     {
4698*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
4699*61046927SAndroid Build Coastguard Worker         return *this;
4700*61046927SAndroid Build Coastguard Worker     }
4701*61046927SAndroid Build Coastguard Worker 
4702*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4703*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4704*61046927SAndroid Build Coastguard Worker      */
Sampler(const Sampler & sam)4705*61046927SAndroid Build Coastguard Worker     Sampler(const Sampler& sam) : detail::Wrapper<cl_type>(sam) {}
4706*61046927SAndroid Build Coastguard Worker 
4707*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4708*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4709*61046927SAndroid Build Coastguard Worker      */
operator =(const Sampler & sam)4710*61046927SAndroid Build Coastguard Worker     Sampler& operator = (const Sampler &sam)
4711*61046927SAndroid Build Coastguard Worker     {
4712*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(sam);
4713*61046927SAndroid Build Coastguard Worker         return *this;
4714*61046927SAndroid Build Coastguard Worker     }
4715*61046927SAndroid Build Coastguard Worker 
4716*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4717*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4718*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4719*61046927SAndroid Build Coastguard Worker      */
Sampler(Sampler && sam)4720*61046927SAndroid Build Coastguard Worker     Sampler(Sampler&& sam) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(sam)) {}
4721*61046927SAndroid Build Coastguard Worker 
4722*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4723*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4724*61046927SAndroid Build Coastguard Worker      */
operator =(Sampler && sam)4725*61046927SAndroid Build Coastguard Worker     Sampler& operator = (Sampler &&sam)
4726*61046927SAndroid Build Coastguard Worker     {
4727*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(sam));
4728*61046927SAndroid Build Coastguard Worker         return *this;
4729*61046927SAndroid Build Coastguard Worker     }
4730*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4731*61046927SAndroid Build Coastguard Worker 
4732*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetSamplerInfo().
4733*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_sampler_info name,T * param) const4734*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_sampler_info name, T* param) const
4735*61046927SAndroid Build Coastguard Worker     {
4736*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4737*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetSamplerInfo, object_, name, param),
4738*61046927SAndroid Build Coastguard Worker             __GET_SAMPLER_INFO_ERR);
4739*61046927SAndroid Build Coastguard Worker     }
4740*61046927SAndroid Build Coastguard Worker 
4741*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetSamplerInfo() that returns by value.
4742*61046927SAndroid Build Coastguard Worker     template <cl_sampler_info name> typename
4743*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_sampler_info, name>::param_type
getInfo(cl_int * err=NULL) const4744*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
4745*61046927SAndroid Build Coastguard Worker     {
4746*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
4747*61046927SAndroid Build Coastguard Worker             detail::cl_sampler_info, name>::param_type param;
4748*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
4749*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4750*61046927SAndroid Build Coastguard Worker             *err = result;
4751*61046927SAndroid Build Coastguard Worker         }
4752*61046927SAndroid Build Coastguard Worker         return param;
4753*61046927SAndroid Build Coastguard Worker     }
4754*61046927SAndroid Build Coastguard Worker };
4755*61046927SAndroid Build Coastguard Worker 
4756*61046927SAndroid Build Coastguard Worker class Program;
4757*61046927SAndroid Build Coastguard Worker class CommandQueue;
4758*61046927SAndroid Build Coastguard Worker class Kernel;
4759*61046927SAndroid Build Coastguard Worker 
4760*61046927SAndroid Build Coastguard Worker //! \brief Class interface for specifying NDRange values.
4761*61046927SAndroid Build Coastguard Worker class NDRange
4762*61046927SAndroid Build Coastguard Worker {
4763*61046927SAndroid Build Coastguard Worker private:
4764*61046927SAndroid Build Coastguard Worker     size_t<3> sizes_;
4765*61046927SAndroid Build Coastguard Worker     cl_uint dimensions_;
4766*61046927SAndroid Build Coastguard Worker 
4767*61046927SAndroid Build Coastguard Worker public:
4768*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - resulting range has zero dimensions.
NDRange()4769*61046927SAndroid Build Coastguard Worker     NDRange()
4770*61046927SAndroid Build Coastguard Worker         : dimensions_(0)
4771*61046927SAndroid Build Coastguard Worker     { }
4772*61046927SAndroid Build Coastguard Worker 
4773*61046927SAndroid Build Coastguard Worker     //! \brief Constructs one-dimensional range.
NDRange(::size_t size0)4774*61046927SAndroid Build Coastguard Worker     NDRange(::size_t size0)
4775*61046927SAndroid Build Coastguard Worker         : dimensions_(1)
4776*61046927SAndroid Build Coastguard Worker     {
4777*61046927SAndroid Build Coastguard Worker         sizes_[0] = size0;
4778*61046927SAndroid Build Coastguard Worker     }
4779*61046927SAndroid Build Coastguard Worker 
4780*61046927SAndroid Build Coastguard Worker     //! \brief Constructs two-dimensional range.
NDRange(::size_t size0,::size_t size1)4781*61046927SAndroid Build Coastguard Worker     NDRange(::size_t size0, ::size_t size1)
4782*61046927SAndroid Build Coastguard Worker         : dimensions_(2)
4783*61046927SAndroid Build Coastguard Worker     {
4784*61046927SAndroid Build Coastguard Worker         sizes_[0] = size0;
4785*61046927SAndroid Build Coastguard Worker         sizes_[1] = size1;
4786*61046927SAndroid Build Coastguard Worker     }
4787*61046927SAndroid Build Coastguard Worker 
4788*61046927SAndroid Build Coastguard Worker     //! \brief Constructs three-dimensional range.
NDRange(::size_t size0,::size_t size1,::size_t size2)4789*61046927SAndroid Build Coastguard Worker     NDRange(::size_t size0, ::size_t size1, ::size_t size2)
4790*61046927SAndroid Build Coastguard Worker         : dimensions_(3)
4791*61046927SAndroid Build Coastguard Worker     {
4792*61046927SAndroid Build Coastguard Worker         sizes_[0] = size0;
4793*61046927SAndroid Build Coastguard Worker         sizes_[1] = size1;
4794*61046927SAndroid Build Coastguard Worker         sizes_[2] = size2;
4795*61046927SAndroid Build Coastguard Worker     }
4796*61046927SAndroid Build Coastguard Worker 
4797*61046927SAndroid Build Coastguard Worker     /*! \brief Conversion operator to const ::size_t *.
4798*61046927SAndroid Build Coastguard Worker      *
4799*61046927SAndroid Build Coastguard Worker      *  \returns a pointer to the size of the first dimension.
4800*61046927SAndroid Build Coastguard Worker      */
operator const::size_t*() const4801*61046927SAndroid Build Coastguard Worker     operator const ::size_t*() const {
4802*61046927SAndroid Build Coastguard Worker         return (const ::size_t*) sizes_;
4803*61046927SAndroid Build Coastguard Worker     }
4804*61046927SAndroid Build Coastguard Worker 
4805*61046927SAndroid Build Coastguard Worker     //! \brief Queries the number of dimensions in the range.
dimensions() const4806*61046927SAndroid Build Coastguard Worker     ::size_t dimensions() const { return dimensions_; }
4807*61046927SAndroid Build Coastguard Worker };
4808*61046927SAndroid Build Coastguard Worker 
4809*61046927SAndroid Build Coastguard Worker //! \brief A zero-dimensional range.
4810*61046927SAndroid Build Coastguard Worker static const NDRange NullRange;
4811*61046927SAndroid Build Coastguard Worker 
4812*61046927SAndroid Build Coastguard Worker //! \brief Local address wrapper for use with Kernel::setArg
4813*61046927SAndroid Build Coastguard Worker struct LocalSpaceArg
4814*61046927SAndroid Build Coastguard Worker {
4815*61046927SAndroid Build Coastguard Worker     ::size_t size_;
4816*61046927SAndroid Build Coastguard Worker };
4817*61046927SAndroid Build Coastguard Worker 
4818*61046927SAndroid Build Coastguard Worker namespace detail {
4819*61046927SAndroid Build Coastguard Worker 
4820*61046927SAndroid Build Coastguard Worker template <typename T>
4821*61046927SAndroid Build Coastguard Worker struct KernelArgumentHandler
4822*61046927SAndroid Build Coastguard Worker {
sizecl::detail::KernelArgumentHandler4823*61046927SAndroid Build Coastguard Worker     static ::size_t size(const T&) { return sizeof(T); }
ptrcl::detail::KernelArgumentHandler4824*61046927SAndroid Build Coastguard Worker     static const T* ptr(const T& value) { return &value; }
4825*61046927SAndroid Build Coastguard Worker };
4826*61046927SAndroid Build Coastguard Worker 
4827*61046927SAndroid Build Coastguard Worker template <>
4828*61046927SAndroid Build Coastguard Worker struct KernelArgumentHandler<LocalSpaceArg>
4829*61046927SAndroid Build Coastguard Worker {
sizecl::detail::KernelArgumentHandler4830*61046927SAndroid Build Coastguard Worker     static ::size_t size(const LocalSpaceArg& value) { return value.size_; }
ptrcl::detail::KernelArgumentHandler4831*61046927SAndroid Build Coastguard Worker     static const void* ptr(const LocalSpaceArg&) { return NULL; }
4832*61046927SAndroid Build Coastguard Worker };
4833*61046927SAndroid Build Coastguard Worker 
4834*61046927SAndroid Build Coastguard Worker }
4835*61046927SAndroid Build Coastguard Worker //! \endcond
4836*61046927SAndroid Build Coastguard Worker 
4837*61046927SAndroid Build Coastguard Worker /*! __local
4838*61046927SAndroid Build Coastguard Worker  * \brief Helper function for generating LocalSpaceArg objects.
4839*61046927SAndroid Build Coastguard Worker  * Deprecated. Replaced with Local.
4840*61046927SAndroid Build Coastguard Worker  */
4841*61046927SAndroid Build Coastguard Worker inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg
4842*61046927SAndroid Build Coastguard Worker __local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
4843*61046927SAndroid Build Coastguard Worker inline LocalSpaceArg
__local(::size_t size)4844*61046927SAndroid Build Coastguard Worker __local(::size_t size)
4845*61046927SAndroid Build Coastguard Worker {
4846*61046927SAndroid Build Coastguard Worker     LocalSpaceArg ret = { size };
4847*61046927SAndroid Build Coastguard Worker     return ret;
4848*61046927SAndroid Build Coastguard Worker }
4849*61046927SAndroid Build Coastguard Worker 
4850*61046927SAndroid Build Coastguard Worker /*! Local
4851*61046927SAndroid Build Coastguard Worker  * \brief Helper function for generating LocalSpaceArg objects.
4852*61046927SAndroid Build Coastguard Worker  */
4853*61046927SAndroid Build Coastguard Worker inline LocalSpaceArg
Local(::size_t size)4854*61046927SAndroid Build Coastguard Worker Local(::size_t size)
4855*61046927SAndroid Build Coastguard Worker {
4856*61046927SAndroid Build Coastguard Worker     LocalSpaceArg ret = { size };
4857*61046927SAndroid Build Coastguard Worker     return ret;
4858*61046927SAndroid Build Coastguard Worker }
4859*61046927SAndroid Build Coastguard Worker 
4860*61046927SAndroid Build Coastguard Worker //class KernelFunctor;
4861*61046927SAndroid Build Coastguard Worker 
4862*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_kernel.
4863*61046927SAndroid Build Coastguard Worker  *
4864*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
4865*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_kernel as the original.  For details, see
4866*61046927SAndroid Build Coastguard Worker  *        clRetainKernel() and clReleaseKernel().
4867*61046927SAndroid Build Coastguard Worker  *
4868*61046927SAndroid Build Coastguard Worker  *  \see cl_kernel
4869*61046927SAndroid Build Coastguard Worker  */
4870*61046927SAndroid Build Coastguard Worker class Kernel : public detail::Wrapper<cl_kernel>
4871*61046927SAndroid Build Coastguard Worker {
4872*61046927SAndroid Build Coastguard Worker public:
4873*61046927SAndroid Build Coastguard Worker     inline Kernel(const Program& program, const char* name, cl_int* err = NULL);
4874*61046927SAndroid Build Coastguard Worker 
4875*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Kernel()4876*61046927SAndroid Build Coastguard Worker     Kernel() { }
4877*61046927SAndroid Build Coastguard Worker 
4878*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_kernel - takes ownership.
4879*61046927SAndroid Build Coastguard Worker      *
4880*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_kernel
4881*61046927SAndroid Build Coastguard Worker      *  into the new Kernel object.
4882*61046927SAndroid Build Coastguard Worker      */
Kernel(const cl_kernel & kernel)4883*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
4884*61046927SAndroid Build Coastguard Worker 
4885*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_kernel - takes ownership.
4886*61046927SAndroid Build Coastguard Worker      *
4887*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
4888*61046927SAndroid Build Coastguard Worker      *  clReleaseKernel() on the value previously held by this instance.
4889*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_kernel & rhs)4890*61046927SAndroid Build Coastguard Worker     Kernel& operator = (const cl_kernel& rhs)
4891*61046927SAndroid Build Coastguard Worker     {
4892*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
4893*61046927SAndroid Build Coastguard Worker         return *this;
4894*61046927SAndroid Build Coastguard Worker     }
4895*61046927SAndroid Build Coastguard Worker 
4896*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4897*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4898*61046927SAndroid Build Coastguard Worker      */
Kernel(const Kernel & kernel)4899*61046927SAndroid Build Coastguard Worker     Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) {}
4900*61046927SAndroid Build Coastguard Worker 
4901*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4902*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4903*61046927SAndroid Build Coastguard Worker      */
operator =(const Kernel & kernel)4904*61046927SAndroid Build Coastguard Worker     Kernel& operator = (const Kernel &kernel)
4905*61046927SAndroid Build Coastguard Worker     {
4906*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(kernel);
4907*61046927SAndroid Build Coastguard Worker         return *this;
4908*61046927SAndroid Build Coastguard Worker     }
4909*61046927SAndroid Build Coastguard Worker 
4910*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4911*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4912*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4913*61046927SAndroid Build Coastguard Worker      */
Kernel(Kernel && kernel)4914*61046927SAndroid Build Coastguard Worker     Kernel(Kernel&& kernel) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(kernel)) {}
4915*61046927SAndroid Build Coastguard Worker 
4916*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4917*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4918*61046927SAndroid Build Coastguard Worker      */
operator =(Kernel && kernel)4919*61046927SAndroid Build Coastguard Worker     Kernel& operator = (Kernel &&kernel)
4920*61046927SAndroid Build Coastguard Worker     {
4921*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(kernel));
4922*61046927SAndroid Build Coastguard Worker         return *this;
4923*61046927SAndroid Build Coastguard Worker     }
4924*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4925*61046927SAndroid Build Coastguard Worker 
4926*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_kernel_info name,T * param) const4927*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_kernel_info name, T* param) const
4928*61046927SAndroid Build Coastguard Worker     {
4929*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4930*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetKernelInfo, object_, name, param),
4931*61046927SAndroid Build Coastguard Worker             __GET_KERNEL_INFO_ERR);
4932*61046927SAndroid Build Coastguard Worker     }
4933*61046927SAndroid Build Coastguard Worker 
4934*61046927SAndroid Build Coastguard Worker     template <cl_kernel_info name> typename
4935*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_kernel_info, name>::param_type
getInfo(cl_int * err=NULL) const4936*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
4937*61046927SAndroid Build Coastguard Worker     {
4938*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
4939*61046927SAndroid Build Coastguard Worker             detail::cl_kernel_info, name>::param_type param;
4940*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
4941*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4942*61046927SAndroid Build Coastguard Worker             *err = result;
4943*61046927SAndroid Build Coastguard Worker         }
4944*61046927SAndroid Build Coastguard Worker         return param;
4945*61046927SAndroid Build Coastguard Worker     }
4946*61046927SAndroid Build Coastguard Worker 
4947*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
4948*61046927SAndroid Build Coastguard Worker     template <typename T>
getArgInfo(cl_uint argIndex,cl_kernel_arg_info name,T * param) const4949*61046927SAndroid Build Coastguard Worker     cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const
4950*61046927SAndroid Build Coastguard Worker     {
4951*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4952*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param),
4953*61046927SAndroid Build Coastguard Worker             __GET_KERNEL_ARG_INFO_ERR);
4954*61046927SAndroid Build Coastguard Worker     }
4955*61046927SAndroid Build Coastguard Worker 
4956*61046927SAndroid Build Coastguard Worker     template <cl_kernel_arg_info name> typename
4957*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_kernel_arg_info, name>::param_type
getArgInfo(cl_uint argIndex,cl_int * err=NULL) const4958*61046927SAndroid Build Coastguard Worker     getArgInfo(cl_uint argIndex, cl_int* err = NULL) const
4959*61046927SAndroid Build Coastguard Worker     {
4960*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
4961*61046927SAndroid Build Coastguard Worker             detail::cl_kernel_arg_info, name>::param_type param;
4962*61046927SAndroid Build Coastguard Worker         cl_int result = getArgInfo(argIndex, name, &param);
4963*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4964*61046927SAndroid Build Coastguard Worker             *err = result;
4965*61046927SAndroid Build Coastguard Worker         }
4966*61046927SAndroid Build Coastguard Worker         return param;
4967*61046927SAndroid Build Coastguard Worker     }
4968*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
4969*61046927SAndroid Build Coastguard Worker 
4970*61046927SAndroid Build Coastguard Worker     template <typename T>
getWorkGroupInfo(const Device & device,cl_kernel_work_group_info name,T * param) const4971*61046927SAndroid Build Coastguard Worker     cl_int getWorkGroupInfo(
4972*61046927SAndroid Build Coastguard Worker         const Device& device, cl_kernel_work_group_info name, T* param) const
4973*61046927SAndroid Build Coastguard Worker     {
4974*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4975*61046927SAndroid Build Coastguard Worker             detail::getInfo(
4976*61046927SAndroid Build Coastguard Worker                 &::clGetKernelWorkGroupInfo, object_, device(), name, param),
4977*61046927SAndroid Build Coastguard Worker                 __GET_KERNEL_WORK_GROUP_INFO_ERR);
4978*61046927SAndroid Build Coastguard Worker     }
4979*61046927SAndroid Build Coastguard Worker 
4980*61046927SAndroid Build Coastguard Worker     template <cl_kernel_work_group_info name> typename
4981*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type
getWorkGroupInfo(const Device & device,cl_int * err=NULL) const4982*61046927SAndroid Build Coastguard Worker         getWorkGroupInfo(const Device& device, cl_int* err = NULL) const
4983*61046927SAndroid Build Coastguard Worker     {
4984*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
4985*61046927SAndroid Build Coastguard Worker         detail::cl_kernel_work_group_info, name>::param_type param;
4986*61046927SAndroid Build Coastguard Worker         cl_int result = getWorkGroupInfo(device, name, &param);
4987*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4988*61046927SAndroid Build Coastguard Worker             *err = result;
4989*61046927SAndroid Build Coastguard Worker         }
4990*61046927SAndroid Build Coastguard Worker         return param;
4991*61046927SAndroid Build Coastguard Worker     }
4992*61046927SAndroid Build Coastguard Worker 
4993*61046927SAndroid Build Coastguard Worker     template <typename T>
setArg(cl_uint index,const T & value)4994*61046927SAndroid Build Coastguard Worker     cl_int setArg(cl_uint index, const T &value)
4995*61046927SAndroid Build Coastguard Worker     {
4996*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4997*61046927SAndroid Build Coastguard Worker             ::clSetKernelArg(
4998*61046927SAndroid Build Coastguard Worker                 object_,
4999*61046927SAndroid Build Coastguard Worker                 index,
5000*61046927SAndroid Build Coastguard Worker                 detail::KernelArgumentHandler<T>::size(value),
5001*61046927SAndroid Build Coastguard Worker                 detail::KernelArgumentHandler<T>::ptr(value)),
5002*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
5003*61046927SAndroid Build Coastguard Worker     }
5004*61046927SAndroid Build Coastguard Worker 
setArg(cl_uint index,::size_t size,const void * argPtr)5005*61046927SAndroid Build Coastguard Worker     cl_int setArg(cl_uint index, ::size_t size, const void* argPtr)
5006*61046927SAndroid Build Coastguard Worker     {
5007*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5008*61046927SAndroid Build Coastguard Worker             ::clSetKernelArg(object_, index, size, argPtr),
5009*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
5010*61046927SAndroid Build Coastguard Worker     }
5011*61046927SAndroid Build Coastguard Worker };
5012*61046927SAndroid Build Coastguard Worker 
5013*61046927SAndroid Build Coastguard Worker /*! \class Program
5014*61046927SAndroid Build Coastguard Worker  * \brief Program interface that implements cl_program.
5015*61046927SAndroid Build Coastguard Worker  */
5016*61046927SAndroid Build Coastguard Worker class Program : public detail::Wrapper<cl_program>
5017*61046927SAndroid Build Coastguard Worker {
5018*61046927SAndroid Build Coastguard Worker public:
5019*61046927SAndroid Build Coastguard Worker     typedef VECTOR_CLASS<std::pair<const void*, ::size_t> > Binaries;
5020*61046927SAndroid Build Coastguard Worker     typedef VECTOR_CLASS<std::pair<const char*, ::size_t> > Sources;
5021*61046927SAndroid Build Coastguard Worker 
Program(const STRING_CLASS & source,bool build=false,cl_int * err=NULL)5022*61046927SAndroid Build Coastguard Worker     Program(
5023*61046927SAndroid Build Coastguard Worker         const STRING_CLASS& source,
5024*61046927SAndroid Build Coastguard Worker         bool build = false,
5025*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5026*61046927SAndroid Build Coastguard Worker     {
5027*61046927SAndroid Build Coastguard Worker         cl_int error;
5028*61046927SAndroid Build Coastguard Worker 
5029*61046927SAndroid Build Coastguard Worker         const char * strings = source.c_str();
5030*61046927SAndroid Build Coastguard Worker         const ::size_t length  = source.size();
5031*61046927SAndroid Build Coastguard Worker 
5032*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
5033*61046927SAndroid Build Coastguard Worker 
5034*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
5035*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)1, &strings, &length, &error);
5036*61046927SAndroid Build Coastguard Worker 
5037*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
5038*61046927SAndroid Build Coastguard Worker 
5039*61046927SAndroid Build Coastguard Worker         if (error == CL_SUCCESS && build) {
5040*61046927SAndroid Build Coastguard Worker 
5041*61046927SAndroid Build Coastguard Worker             error = ::clBuildProgram(
5042*61046927SAndroid Build Coastguard Worker                 object_,
5043*61046927SAndroid Build Coastguard Worker                 0,
5044*61046927SAndroid Build Coastguard Worker                 NULL,
5045*61046927SAndroid Build Coastguard Worker                 "",
5046*61046927SAndroid Build Coastguard Worker                 NULL,
5047*61046927SAndroid Build Coastguard Worker                 NULL);
5048*61046927SAndroid Build Coastguard Worker 
5049*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __BUILD_PROGRAM_ERR);
5050*61046927SAndroid Build Coastguard Worker         }
5051*61046927SAndroid Build Coastguard Worker 
5052*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5053*61046927SAndroid Build Coastguard Worker             *err = error;
5054*61046927SAndroid Build Coastguard Worker         }
5055*61046927SAndroid Build Coastguard Worker     }
5056*61046927SAndroid Build Coastguard Worker 
Program(const Context & context,const STRING_CLASS & source,bool build=false,cl_int * err=NULL)5057*61046927SAndroid Build Coastguard Worker     Program(
5058*61046927SAndroid Build Coastguard Worker         const Context& context,
5059*61046927SAndroid Build Coastguard Worker         const STRING_CLASS& source,
5060*61046927SAndroid Build Coastguard Worker         bool build = false,
5061*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5062*61046927SAndroid Build Coastguard Worker     {
5063*61046927SAndroid Build Coastguard Worker         cl_int error;
5064*61046927SAndroid Build Coastguard Worker 
5065*61046927SAndroid Build Coastguard Worker         const char * strings = source.c_str();
5066*61046927SAndroid Build Coastguard Worker         const ::size_t length  = source.size();
5067*61046927SAndroid Build Coastguard Worker 
5068*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
5069*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)1, &strings, &length, &error);
5070*61046927SAndroid Build Coastguard Worker 
5071*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
5072*61046927SAndroid Build Coastguard Worker 
5073*61046927SAndroid Build Coastguard Worker         if (error == CL_SUCCESS && build) {
5074*61046927SAndroid Build Coastguard Worker 
5075*61046927SAndroid Build Coastguard Worker             error = ::clBuildProgram(
5076*61046927SAndroid Build Coastguard Worker                 object_,
5077*61046927SAndroid Build Coastguard Worker                 0,
5078*61046927SAndroid Build Coastguard Worker                 NULL,
5079*61046927SAndroid Build Coastguard Worker                 "",
5080*61046927SAndroid Build Coastguard Worker                 NULL,
5081*61046927SAndroid Build Coastguard Worker                 NULL);
5082*61046927SAndroid Build Coastguard Worker 
5083*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __BUILD_PROGRAM_ERR);
5084*61046927SAndroid Build Coastguard Worker         }
5085*61046927SAndroid Build Coastguard Worker 
5086*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5087*61046927SAndroid Build Coastguard Worker             *err = error;
5088*61046927SAndroid Build Coastguard Worker         }
5089*61046927SAndroid Build Coastguard Worker     }
5090*61046927SAndroid Build Coastguard Worker 
Program(const Context & context,const Sources & sources,cl_int * err=NULL)5091*61046927SAndroid Build Coastguard Worker     Program(
5092*61046927SAndroid Build Coastguard Worker         const Context& context,
5093*61046927SAndroid Build Coastguard Worker         const Sources& sources,
5094*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5095*61046927SAndroid Build Coastguard Worker     {
5096*61046927SAndroid Build Coastguard Worker         cl_int error;
5097*61046927SAndroid Build Coastguard Worker 
5098*61046927SAndroid Build Coastguard Worker         const ::size_t n = (::size_t)sources.size();
5099*61046927SAndroid Build Coastguard Worker         ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t));
5100*61046927SAndroid Build Coastguard Worker         const char** strings = (const char**) alloca(n * sizeof(const char*));
5101*61046927SAndroid Build Coastguard Worker 
5102*61046927SAndroid Build Coastguard Worker         for (::size_t i = 0; i < n; ++i) {
5103*61046927SAndroid Build Coastguard Worker             strings[i] = sources[(int)i].first;
5104*61046927SAndroid Build Coastguard Worker             lengths[i] = sources[(int)i].second;
5105*61046927SAndroid Build Coastguard Worker         }
5106*61046927SAndroid Build Coastguard Worker 
5107*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
5108*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)n, strings, lengths, &error);
5109*61046927SAndroid Build Coastguard Worker 
5110*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
5111*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5112*61046927SAndroid Build Coastguard Worker             *err = error;
5113*61046927SAndroid Build Coastguard Worker         }
5114*61046927SAndroid Build Coastguard Worker     }
5115*61046927SAndroid Build Coastguard Worker 
5116*61046927SAndroid Build Coastguard Worker     /**
5117*61046927SAndroid Build Coastguard Worker      * Construct a program object from a list of devices and a per-device list of binaries.
5118*61046927SAndroid Build Coastguard Worker      * \param context A valid OpenCL context in which to construct the program.
5119*61046927SAndroid Build Coastguard Worker      * \param devices A vector of OpenCL device objects for which the program will be created.
5120*61046927SAndroid Build Coastguard Worker      * \param binaries A vector of pairs of a pointer to a binary object and its length.
5121*61046927SAndroid Build Coastguard Worker      * \param binaryStatus An optional vector that on completion will be resized to
5122*61046927SAndroid Build Coastguard Worker      *   match the size of binaries and filled with values to specify if each binary
5123*61046927SAndroid Build Coastguard Worker      *   was successfully loaded.
5124*61046927SAndroid Build Coastguard Worker      *   Set to CL_SUCCESS if the binary was successfully loaded.
5125*61046927SAndroid Build Coastguard Worker      *   Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.
5126*61046927SAndroid Build Coastguard Worker      *   Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.
5127*61046927SAndroid Build Coastguard Worker      * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:
5128*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_CONTEXT if context is not a valid context.
5129*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices;
5130*61046927SAndroid Build Coastguard Worker      *     or if any entry in binaries is NULL or has length 0.
5131*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.
5132*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device.
5133*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
5134*61046927SAndroid Build Coastguard Worker      */
Program(const Context & context,const VECTOR_CLASS<Device> & devices,const Binaries & binaries,VECTOR_CLASS<cl_int> * binaryStatus=NULL,cl_int * err=NULL)5135*61046927SAndroid Build Coastguard Worker     Program(
5136*61046927SAndroid Build Coastguard Worker         const Context& context,
5137*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Device>& devices,
5138*61046927SAndroid Build Coastguard Worker         const Binaries& binaries,
5139*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<cl_int>* binaryStatus = NULL,
5140*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5141*61046927SAndroid Build Coastguard Worker     {
5142*61046927SAndroid Build Coastguard Worker         cl_int error;
5143*61046927SAndroid Build Coastguard Worker 
5144*61046927SAndroid Build Coastguard Worker         const ::size_t numDevices = devices.size();
5145*61046927SAndroid Build Coastguard Worker 
5146*61046927SAndroid Build Coastguard Worker         // Catch size mismatch early and return
5147*61046927SAndroid Build Coastguard Worker         if(binaries.size() != numDevices) {
5148*61046927SAndroid Build Coastguard Worker             error = CL_INVALID_VALUE;
5149*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
5150*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5151*61046927SAndroid Build Coastguard Worker                 *err = error;
5152*61046927SAndroid Build Coastguard Worker             }
5153*61046927SAndroid Build Coastguard Worker             return;
5154*61046927SAndroid Build Coastguard Worker         }
5155*61046927SAndroid Build Coastguard Worker 
5156*61046927SAndroid Build Coastguard Worker         ::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t));
5157*61046927SAndroid Build Coastguard Worker         const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**));
5158*61046927SAndroid Build Coastguard Worker 
5159*61046927SAndroid Build Coastguard Worker         for (::size_t i = 0; i < numDevices; ++i) {
5160*61046927SAndroid Build Coastguard Worker             images[i] = (const unsigned char*)binaries[i].first;
5161*61046927SAndroid Build Coastguard Worker             lengths[i] = binaries[(int)i].second;
5162*61046927SAndroid Build Coastguard Worker         }
5163*61046927SAndroid Build Coastguard Worker 
5164*61046927SAndroid Build Coastguard Worker         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
5165*61046927SAndroid Build Coastguard Worker         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
5166*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
5167*61046927SAndroid Build Coastguard Worker         }
5168*61046927SAndroid Build Coastguard Worker 
5169*61046927SAndroid Build Coastguard Worker         if(binaryStatus) {
5170*61046927SAndroid Build Coastguard Worker             binaryStatus->resize(numDevices);
5171*61046927SAndroid Build Coastguard Worker         }
5172*61046927SAndroid Build Coastguard Worker 
5173*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithBinary(
5174*61046927SAndroid Build Coastguard Worker             context(), (cl_uint) devices.size(),
5175*61046927SAndroid Build Coastguard Worker             deviceIDs,
5176*61046927SAndroid Build Coastguard Worker             lengths, images, (binaryStatus != NULL && numDevices > 0)
5177*61046927SAndroid Build Coastguard Worker                ? &binaryStatus->front()
5178*61046927SAndroid Build Coastguard Worker                : NULL, &error);
5179*61046927SAndroid Build Coastguard Worker 
5180*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
5181*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5182*61046927SAndroid Build Coastguard Worker             *err = error;
5183*61046927SAndroid Build Coastguard Worker         }
5184*61046927SAndroid Build Coastguard Worker     }
5185*61046927SAndroid Build Coastguard Worker 
5186*61046927SAndroid Build Coastguard Worker 
5187*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
5188*61046927SAndroid Build Coastguard Worker     /**
5189*61046927SAndroid Build Coastguard Worker      * Create program using builtin kernels.
5190*61046927SAndroid Build Coastguard Worker      * \param kernelNames Semi-colon separated list of builtin kernel names
5191*61046927SAndroid Build Coastguard Worker      */
Program(const Context & context,const VECTOR_CLASS<Device> & devices,const STRING_CLASS & kernelNames,cl_int * err=NULL)5192*61046927SAndroid Build Coastguard Worker     Program(
5193*61046927SAndroid Build Coastguard Worker         const Context& context,
5194*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Device>& devices,
5195*61046927SAndroid Build Coastguard Worker         const STRING_CLASS& kernelNames,
5196*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5197*61046927SAndroid Build Coastguard Worker     {
5198*61046927SAndroid Build Coastguard Worker         cl_int error;
5199*61046927SAndroid Build Coastguard Worker 
5200*61046927SAndroid Build Coastguard Worker 
5201*61046927SAndroid Build Coastguard Worker         ::size_t numDevices = devices.size();
5202*61046927SAndroid Build Coastguard Worker         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
5203*61046927SAndroid Build Coastguard Worker         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
5204*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
5205*61046927SAndroid Build Coastguard Worker         }
5206*61046927SAndroid Build Coastguard Worker 
5207*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithBuiltInKernels(
5208*61046927SAndroid Build Coastguard Worker             context(),
5209*61046927SAndroid Build Coastguard Worker             (cl_uint) devices.size(),
5210*61046927SAndroid Build Coastguard Worker             deviceIDs,
5211*61046927SAndroid Build Coastguard Worker             kernelNames.c_str(),
5212*61046927SAndroid Build Coastguard Worker             &error);
5213*61046927SAndroid Build Coastguard Worker 
5214*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR);
5215*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5216*61046927SAndroid Build Coastguard Worker             *err = error;
5217*61046927SAndroid Build Coastguard Worker         }
5218*61046927SAndroid Build Coastguard Worker     }
5219*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
5220*61046927SAndroid Build Coastguard Worker 
Program()5221*61046927SAndroid Build Coastguard Worker     Program() { }
5222*61046927SAndroid Build Coastguard Worker 
Program(const cl_program & program)5223*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { }
5224*61046927SAndroid Build Coastguard Worker 
operator =(const cl_program & rhs)5225*61046927SAndroid Build Coastguard Worker     Program& operator = (const cl_program& rhs)
5226*61046927SAndroid Build Coastguard Worker     {
5227*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
5228*61046927SAndroid Build Coastguard Worker         return *this;
5229*61046927SAndroid Build Coastguard Worker     }
5230*61046927SAndroid Build Coastguard Worker 
5231*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5232*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5233*61046927SAndroid Build Coastguard Worker      */
Program(const Program & program)5234*61046927SAndroid Build Coastguard Worker     Program(const Program& program) : detail::Wrapper<cl_type>(program) {}
5235*61046927SAndroid Build Coastguard Worker 
5236*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5237*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5238*61046927SAndroid Build Coastguard Worker      */
operator =(const Program & program)5239*61046927SAndroid Build Coastguard Worker     Program& operator = (const Program &program)
5240*61046927SAndroid Build Coastguard Worker     {
5241*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(program);
5242*61046927SAndroid Build Coastguard Worker         return *this;
5243*61046927SAndroid Build Coastguard Worker     }
5244*61046927SAndroid Build Coastguard Worker 
5245*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5246*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5247*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5248*61046927SAndroid Build Coastguard Worker      */
Program(Program && program)5249*61046927SAndroid Build Coastguard Worker     Program(Program&& program) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(program)) {}
5250*61046927SAndroid Build Coastguard Worker 
5251*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5252*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5253*61046927SAndroid Build Coastguard Worker      */
operator =(Program && program)5254*61046927SAndroid Build Coastguard Worker     Program& operator = (Program &&program)
5255*61046927SAndroid Build Coastguard Worker     {
5256*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(program));
5257*61046927SAndroid Build Coastguard Worker         return *this;
5258*61046927SAndroid Build Coastguard Worker     }
5259*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5260*61046927SAndroid Build Coastguard Worker 
build(const VECTOR_CLASS<Device> & devices,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const5261*61046927SAndroid Build Coastguard Worker     cl_int build(
5262*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Device>& devices,
5263*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
5264*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5265*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
5266*61046927SAndroid Build Coastguard Worker     {
5267*61046927SAndroid Build Coastguard Worker         ::size_t numDevices = devices.size();
5268*61046927SAndroid Build Coastguard Worker         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
5269*61046927SAndroid Build Coastguard Worker         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
5270*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
5271*61046927SAndroid Build Coastguard Worker         }
5272*61046927SAndroid Build Coastguard Worker 
5273*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5274*61046927SAndroid Build Coastguard Worker             ::clBuildProgram(
5275*61046927SAndroid Build Coastguard Worker                 object_,
5276*61046927SAndroid Build Coastguard Worker                 (cl_uint)
5277*61046927SAndroid Build Coastguard Worker                 devices.size(),
5278*61046927SAndroid Build Coastguard Worker                 deviceIDs,
5279*61046927SAndroid Build Coastguard Worker                 options,
5280*61046927SAndroid Build Coastguard Worker                 notifyFptr,
5281*61046927SAndroid Build Coastguard Worker                 data),
5282*61046927SAndroid Build Coastguard Worker                 __BUILD_PROGRAM_ERR);
5283*61046927SAndroid Build Coastguard Worker     }
5284*61046927SAndroid Build Coastguard Worker 
build(const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const5285*61046927SAndroid Build Coastguard Worker     cl_int build(
5286*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
5287*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5288*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
5289*61046927SAndroid Build Coastguard Worker     {
5290*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5291*61046927SAndroid Build Coastguard Worker             ::clBuildProgram(
5292*61046927SAndroid Build Coastguard Worker                 object_,
5293*61046927SAndroid Build Coastguard Worker                 0,
5294*61046927SAndroid Build Coastguard Worker                 NULL,
5295*61046927SAndroid Build Coastguard Worker                 options,
5296*61046927SAndroid Build Coastguard Worker                 notifyFptr,
5297*61046927SAndroid Build Coastguard Worker                 data),
5298*61046927SAndroid Build Coastguard Worker                 __BUILD_PROGRAM_ERR);
5299*61046927SAndroid Build Coastguard Worker     }
5300*61046927SAndroid Build Coastguard Worker 
5301*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
compile(const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const5302*61046927SAndroid Build Coastguard Worker     cl_int compile(
5303*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
5304*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5305*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
5306*61046927SAndroid Build Coastguard Worker     {
5307*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5308*61046927SAndroid Build Coastguard Worker             ::clCompileProgram(
5309*61046927SAndroid Build Coastguard Worker                 object_,
5310*61046927SAndroid Build Coastguard Worker                 0,
5311*61046927SAndroid Build Coastguard Worker                 NULL,
5312*61046927SAndroid Build Coastguard Worker                 options,
5313*61046927SAndroid Build Coastguard Worker                 0,
5314*61046927SAndroid Build Coastguard Worker                 NULL,
5315*61046927SAndroid Build Coastguard Worker                 NULL,
5316*61046927SAndroid Build Coastguard Worker                 notifyFptr,
5317*61046927SAndroid Build Coastguard Worker                 data),
5318*61046927SAndroid Build Coastguard Worker                 __COMPILE_PROGRAM_ERR);
5319*61046927SAndroid Build Coastguard Worker     }
5320*61046927SAndroid Build Coastguard Worker #endif
5321*61046927SAndroid Build Coastguard Worker 
5322*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_program_info name,T * param) const5323*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_program_info name, T* param) const
5324*61046927SAndroid Build Coastguard Worker     {
5325*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5326*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetProgramInfo, object_, name, param),
5327*61046927SAndroid Build Coastguard Worker             __GET_PROGRAM_INFO_ERR);
5328*61046927SAndroid Build Coastguard Worker     }
5329*61046927SAndroid Build Coastguard Worker 
5330*61046927SAndroid Build Coastguard Worker     template <cl_program_info name> typename
5331*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_program_info, name>::param_type
getInfo(cl_int * err=NULL) const5332*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
5333*61046927SAndroid Build Coastguard Worker     {
5334*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
5335*61046927SAndroid Build Coastguard Worker             detail::cl_program_info, name>::param_type param;
5336*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
5337*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5338*61046927SAndroid Build Coastguard Worker             *err = result;
5339*61046927SAndroid Build Coastguard Worker         }
5340*61046927SAndroid Build Coastguard Worker         return param;
5341*61046927SAndroid Build Coastguard Worker     }
5342*61046927SAndroid Build Coastguard Worker 
5343*61046927SAndroid Build Coastguard Worker     template <typename T>
getBuildInfo(const Device & device,cl_program_build_info name,T * param) const5344*61046927SAndroid Build Coastguard Worker     cl_int getBuildInfo(
5345*61046927SAndroid Build Coastguard Worker         const Device& device, cl_program_build_info name, T* param) const
5346*61046927SAndroid Build Coastguard Worker     {
5347*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5348*61046927SAndroid Build Coastguard Worker             detail::getInfo(
5349*61046927SAndroid Build Coastguard Worker                 &::clGetProgramBuildInfo, object_, device(), name, param),
5350*61046927SAndroid Build Coastguard Worker                 __GET_PROGRAM_BUILD_INFO_ERR);
5351*61046927SAndroid Build Coastguard Worker     }
5352*61046927SAndroid Build Coastguard Worker 
5353*61046927SAndroid Build Coastguard Worker     template <cl_program_build_info name> typename
5354*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_program_build_info, name>::param_type
getBuildInfo(const Device & device,cl_int * err=NULL) const5355*61046927SAndroid Build Coastguard Worker     getBuildInfo(const Device& device, cl_int* err = NULL) const
5356*61046927SAndroid Build Coastguard Worker     {
5357*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
5358*61046927SAndroid Build Coastguard Worker             detail::cl_program_build_info, name>::param_type param;
5359*61046927SAndroid Build Coastguard Worker         cl_int result = getBuildInfo(device, name, &param);
5360*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5361*61046927SAndroid Build Coastguard Worker             *err = result;
5362*61046927SAndroid Build Coastguard Worker         }
5363*61046927SAndroid Build Coastguard Worker         return param;
5364*61046927SAndroid Build Coastguard Worker     }
5365*61046927SAndroid Build Coastguard Worker 
createKernels(VECTOR_CLASS<Kernel> * kernels)5366*61046927SAndroid Build Coastguard Worker     cl_int createKernels(VECTOR_CLASS<Kernel>* kernels)
5367*61046927SAndroid Build Coastguard Worker     {
5368*61046927SAndroid Build Coastguard Worker         cl_uint numKernels;
5369*61046927SAndroid Build Coastguard Worker         cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels);
5370*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
5371*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
5372*61046927SAndroid Build Coastguard Worker         }
5373*61046927SAndroid Build Coastguard Worker 
5374*61046927SAndroid Build Coastguard Worker         Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel));
5375*61046927SAndroid Build Coastguard Worker         err = ::clCreateKernelsInProgram(
5376*61046927SAndroid Build Coastguard Worker             object_, numKernels, (cl_kernel*) value, NULL);
5377*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
5378*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
5379*61046927SAndroid Build Coastguard Worker         }
5380*61046927SAndroid Build Coastguard Worker 
5381*61046927SAndroid Build Coastguard Worker         kernels->assign(&value[0], &value[numKernels]);
5382*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
5383*61046927SAndroid Build Coastguard Worker     }
5384*61046927SAndroid Build Coastguard Worker };
5385*61046927SAndroid Build Coastguard Worker 
5386*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
linkProgram(Program input1,Program input2,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL,cl_int * err=NULL)5387*61046927SAndroid Build Coastguard Worker inline Program linkProgram(
5388*61046927SAndroid Build Coastguard Worker     Program input1,
5389*61046927SAndroid Build Coastguard Worker     Program input2,
5390*61046927SAndroid Build Coastguard Worker     const char* options = NULL,
5391*61046927SAndroid Build Coastguard Worker     void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5392*61046927SAndroid Build Coastguard Worker     void* data = NULL,
5393*61046927SAndroid Build Coastguard Worker     cl_int* err = NULL)
5394*61046927SAndroid Build Coastguard Worker {
5395*61046927SAndroid Build Coastguard Worker     cl_int error_local = CL_SUCCESS;
5396*61046927SAndroid Build Coastguard Worker 
5397*61046927SAndroid Build Coastguard Worker     cl_program programs[2] = { input1(), input2() };
5398*61046927SAndroid Build Coastguard Worker 
5399*61046927SAndroid Build Coastguard Worker     Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>(&error_local);
5400*61046927SAndroid Build Coastguard Worker     if(error_local!=CL_SUCCESS) {
5401*61046927SAndroid Build Coastguard Worker         detail::errHandler(error_local, __LINK_PROGRAM_ERR);
5402*61046927SAndroid Build Coastguard Worker     }
5403*61046927SAndroid Build Coastguard Worker 
5404*61046927SAndroid Build Coastguard Worker     cl_program prog = ::clLinkProgram(
5405*61046927SAndroid Build Coastguard Worker         ctx(),
5406*61046927SAndroid Build Coastguard Worker         0,
5407*61046927SAndroid Build Coastguard Worker         NULL,
5408*61046927SAndroid Build Coastguard Worker         options,
5409*61046927SAndroid Build Coastguard Worker         2,
5410*61046927SAndroid Build Coastguard Worker         programs,
5411*61046927SAndroid Build Coastguard Worker         notifyFptr,
5412*61046927SAndroid Build Coastguard Worker         data,
5413*61046927SAndroid Build Coastguard Worker         &error_local);
5414*61046927SAndroid Build Coastguard Worker 
5415*61046927SAndroid Build Coastguard Worker     detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
5416*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
5417*61046927SAndroid Build Coastguard Worker         *err = error_local;
5418*61046927SAndroid Build Coastguard Worker     }
5419*61046927SAndroid Build Coastguard Worker 
5420*61046927SAndroid Build Coastguard Worker     return Program(prog);
5421*61046927SAndroid Build Coastguard Worker }
5422*61046927SAndroid Build Coastguard Worker 
linkProgram(VECTOR_CLASS<Program> inputPrograms,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL,cl_int * err=NULL)5423*61046927SAndroid Build Coastguard Worker inline Program linkProgram(
5424*61046927SAndroid Build Coastguard Worker     VECTOR_CLASS<Program> inputPrograms,
5425*61046927SAndroid Build Coastguard Worker     const char* options = NULL,
5426*61046927SAndroid Build Coastguard Worker     void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5427*61046927SAndroid Build Coastguard Worker     void* data = NULL,
5428*61046927SAndroid Build Coastguard Worker     cl_int* err = NULL)
5429*61046927SAndroid Build Coastguard Worker {
5430*61046927SAndroid Build Coastguard Worker     cl_int error_local = CL_SUCCESS;
5431*61046927SAndroid Build Coastguard Worker 
5432*61046927SAndroid Build Coastguard Worker     cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));
5433*61046927SAndroid Build Coastguard Worker 
5434*61046927SAndroid Build Coastguard Worker     if (programs != NULL) {
5435*61046927SAndroid Build Coastguard Worker         for (unsigned int i = 0; i < inputPrograms.size(); i++) {
5436*61046927SAndroid Build Coastguard Worker           programs[i] = inputPrograms[i]();
5437*61046927SAndroid Build Coastguard Worker         }
5438*61046927SAndroid Build Coastguard Worker     }
5439*61046927SAndroid Build Coastguard Worker 
5440*61046927SAndroid Build Coastguard Worker     Context ctx;
5441*61046927SAndroid Build Coastguard Worker     if(inputPrograms.size() > 0) {
5442*61046927SAndroid Build Coastguard Worker         ctx = inputPrograms[0].getInfo<CL_PROGRAM_CONTEXT>(&error_local);
5443*61046927SAndroid Build Coastguard Worker         if(error_local!=CL_SUCCESS) {
5444*61046927SAndroid Build Coastguard Worker             detail::errHandler(error_local, __LINK_PROGRAM_ERR);
5445*61046927SAndroid Build Coastguard Worker         }
5446*61046927SAndroid Build Coastguard Worker     }
5447*61046927SAndroid Build Coastguard Worker     cl_program prog = ::clLinkProgram(
5448*61046927SAndroid Build Coastguard Worker         ctx(),
5449*61046927SAndroid Build Coastguard Worker         0,
5450*61046927SAndroid Build Coastguard Worker         NULL,
5451*61046927SAndroid Build Coastguard Worker         options,
5452*61046927SAndroid Build Coastguard Worker         (cl_uint)inputPrograms.size(),
5453*61046927SAndroid Build Coastguard Worker         programs,
5454*61046927SAndroid Build Coastguard Worker         notifyFptr,
5455*61046927SAndroid Build Coastguard Worker         data,
5456*61046927SAndroid Build Coastguard Worker         &error_local);
5457*61046927SAndroid Build Coastguard Worker 
5458*61046927SAndroid Build Coastguard Worker     detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
5459*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
5460*61046927SAndroid Build Coastguard Worker         *err = error_local;
5461*61046927SAndroid Build Coastguard Worker     }
5462*61046927SAndroid Build Coastguard Worker 
5463*61046927SAndroid Build Coastguard Worker     return Program(prog);
5464*61046927SAndroid Build Coastguard Worker }
5465*61046927SAndroid Build Coastguard Worker #endif
5466*61046927SAndroid Build Coastguard Worker 
5467*61046927SAndroid Build Coastguard Worker template<>
getInfo(cl_int * err) const5468*61046927SAndroid Build Coastguard Worker inline VECTOR_CLASS<char *> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* err) const
5469*61046927SAndroid Build Coastguard Worker {
5470*61046927SAndroid Build Coastguard Worker     VECTOR_CLASS< ::size_t> sizes = getInfo<CL_PROGRAM_BINARY_SIZES>();
5471*61046927SAndroid Build Coastguard Worker     VECTOR_CLASS<char *> binaries;
5472*61046927SAndroid Build Coastguard Worker     for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s)
5473*61046927SAndroid Build Coastguard Worker     {
5474*61046927SAndroid Build Coastguard Worker         char *ptr = NULL;
5475*61046927SAndroid Build Coastguard Worker         if (*s != 0)
5476*61046927SAndroid Build Coastguard Worker             ptr = new char[*s];
5477*61046927SAndroid Build Coastguard Worker         binaries.push_back(ptr);
5478*61046927SAndroid Build Coastguard Worker     }
5479*61046927SAndroid Build Coastguard Worker 
5480*61046927SAndroid Build Coastguard Worker     cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries);
5481*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
5482*61046927SAndroid Build Coastguard Worker         *err = result;
5483*61046927SAndroid Build Coastguard Worker     }
5484*61046927SAndroid Build Coastguard Worker     return binaries;
5485*61046927SAndroid Build Coastguard Worker }
5486*61046927SAndroid Build Coastguard Worker 
Kernel(const Program & program,const char * name,cl_int * err)5487*61046927SAndroid Build Coastguard Worker inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
5488*61046927SAndroid Build Coastguard Worker {
5489*61046927SAndroid Build Coastguard Worker     cl_int error;
5490*61046927SAndroid Build Coastguard Worker 
5491*61046927SAndroid Build Coastguard Worker     object_ = ::clCreateKernel(program(), name, &error);
5492*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_KERNEL_ERR);
5493*61046927SAndroid Build Coastguard Worker 
5494*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
5495*61046927SAndroid Build Coastguard Worker         *err = error;
5496*61046927SAndroid Build Coastguard Worker     }
5497*61046927SAndroid Build Coastguard Worker 
5498*61046927SAndroid Build Coastguard Worker }
5499*61046927SAndroid Build Coastguard Worker 
5500*61046927SAndroid Build Coastguard Worker /*! \class CommandQueue
5501*61046927SAndroid Build Coastguard Worker  * \brief CommandQueue interface for cl_command_queue.
5502*61046927SAndroid Build Coastguard Worker  */
5503*61046927SAndroid Build Coastguard Worker class CommandQueue : public detail::Wrapper<cl_command_queue>
5504*61046927SAndroid Build Coastguard Worker {
5505*61046927SAndroid Build Coastguard Worker private:
5506*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
5507*61046927SAndroid Build Coastguard Worker     static std::atomic<int> default_initialized_;
5508*61046927SAndroid Build Coastguard Worker #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
5509*61046927SAndroid Build Coastguard Worker     static volatile int default_initialized_;
5510*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
5511*61046927SAndroid Build Coastguard Worker     static CommandQueue default_;
5512*61046927SAndroid Build Coastguard Worker     static volatile cl_int default_error_;
5513*61046927SAndroid Build Coastguard Worker public:
CommandQueue(cl_command_queue_properties properties,cl_int * err=NULL)5514*61046927SAndroid Build Coastguard Worker    CommandQueue(
5515*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties,
5516*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5517*61046927SAndroid Build Coastguard Worker     {
5518*61046927SAndroid Build Coastguard Worker         cl_int error;
5519*61046927SAndroid Build Coastguard Worker 
5520*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(&error);
5521*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
5522*61046927SAndroid Build Coastguard Worker 
5523*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS) {
5524*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5525*61046927SAndroid Build Coastguard Worker                 *err = error;
5526*61046927SAndroid Build Coastguard Worker             }
5527*61046927SAndroid Build Coastguard Worker         }
5528*61046927SAndroid Build Coastguard Worker         else {
5529*61046927SAndroid Build Coastguard Worker             Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
5530*61046927SAndroid Build Coastguard Worker 
5531*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueue(
5532*61046927SAndroid Build Coastguard Worker                 context(), device(), properties, &error);
5533*61046927SAndroid Build Coastguard Worker 
5534*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5535*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5536*61046927SAndroid Build Coastguard Worker                 *err = error;
5537*61046927SAndroid Build Coastguard Worker             }
5538*61046927SAndroid Build Coastguard Worker         }
5539*61046927SAndroid Build Coastguard Worker     }
5540*61046927SAndroid Build Coastguard Worker     /*!
5541*61046927SAndroid Build Coastguard Worker     * \brief Constructs a CommandQueue for an implementation defined device in the given context
5542*61046927SAndroid Build Coastguard Worker     */
CommandQueue(const Context & context,cl_command_queue_properties properties=0,cl_int * err=NULL)5543*61046927SAndroid Build Coastguard Worker     explicit CommandQueue(
5544*61046927SAndroid Build Coastguard Worker         const Context& context,
5545*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties = 0,
5546*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5547*61046927SAndroid Build Coastguard Worker     {
5548*61046927SAndroid Build Coastguard Worker         cl_int error;
5549*61046927SAndroid Build Coastguard Worker         VECTOR_CLASS<cl::Device> devices;
5550*61046927SAndroid Build Coastguard Worker         error = context.getInfo(CL_CONTEXT_DEVICES, &devices);
5551*61046927SAndroid Build Coastguard Worker 
5552*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
5553*61046927SAndroid Build Coastguard Worker 
5554*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS)
5555*61046927SAndroid Build Coastguard Worker         {
5556*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5557*61046927SAndroid Build Coastguard Worker                 *err = error;
5558*61046927SAndroid Build Coastguard Worker             }
5559*61046927SAndroid Build Coastguard Worker             return;
5560*61046927SAndroid Build Coastguard Worker         }
5561*61046927SAndroid Build Coastguard Worker 
5562*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateCommandQueue(context(), devices[0](), properties, &error);
5563*61046927SAndroid Build Coastguard Worker 
5564*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5565*61046927SAndroid Build Coastguard Worker 
5566*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5567*61046927SAndroid Build Coastguard Worker             *err = error;
5568*61046927SAndroid Build Coastguard Worker         }
5569*61046927SAndroid Build Coastguard Worker 
5570*61046927SAndroid Build Coastguard Worker     }
5571*61046927SAndroid Build Coastguard Worker 
CommandQueue(const Context & context,const Device & device,cl_command_queue_properties properties=0,cl_int * err=NULL)5572*61046927SAndroid Build Coastguard Worker     CommandQueue(
5573*61046927SAndroid Build Coastguard Worker         const Context& context,
5574*61046927SAndroid Build Coastguard Worker         const Device& device,
5575*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties = 0,
5576*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5577*61046927SAndroid Build Coastguard Worker     {
5578*61046927SAndroid Build Coastguard Worker         cl_int error;
5579*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateCommandQueue(
5580*61046927SAndroid Build Coastguard Worker             context(), device(), properties, &error);
5581*61046927SAndroid Build Coastguard Worker 
5582*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5583*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5584*61046927SAndroid Build Coastguard Worker             *err = error;
5585*61046927SAndroid Build Coastguard Worker         }
5586*61046927SAndroid Build Coastguard Worker     }
5587*61046927SAndroid Build Coastguard Worker 
5588*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5589*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5590*61046927SAndroid Build Coastguard Worker      */
CommandQueue(const CommandQueue & queue)5591*61046927SAndroid Build Coastguard Worker     CommandQueue(const CommandQueue& queue) : detail::Wrapper<cl_type>(queue) {}
5592*61046927SAndroid Build Coastguard Worker 
5593*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5594*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5595*61046927SAndroid Build Coastguard Worker      */
operator =(const CommandQueue & queue)5596*61046927SAndroid Build Coastguard Worker     CommandQueue& operator = (const CommandQueue &queue)
5597*61046927SAndroid Build Coastguard Worker     {
5598*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(queue);
5599*61046927SAndroid Build Coastguard Worker         return *this;
5600*61046927SAndroid Build Coastguard Worker     }
5601*61046927SAndroid Build Coastguard Worker 
5602*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5603*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5604*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5605*61046927SAndroid Build Coastguard Worker      */
CommandQueue(CommandQueue && queue)5606*61046927SAndroid Build Coastguard Worker     CommandQueue(CommandQueue&& queue) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(queue)) {}
5607*61046927SAndroid Build Coastguard Worker 
5608*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5609*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5610*61046927SAndroid Build Coastguard Worker      */
operator =(CommandQueue && queue)5611*61046927SAndroid Build Coastguard Worker     CommandQueue& operator = (CommandQueue &&queue)
5612*61046927SAndroid Build Coastguard Worker     {
5613*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(queue));
5614*61046927SAndroid Build Coastguard Worker         return *this;
5615*61046927SAndroid Build Coastguard Worker     }
5616*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5617*61046927SAndroid Build Coastguard Worker 
getDefault(cl_int * err=NULL)5618*61046927SAndroid Build Coastguard Worker     static CommandQueue getDefault(cl_int * err = NULL)
5619*61046927SAndroid Build Coastguard Worker     {
5620*61046927SAndroid Build Coastguard Worker         int state = detail::compare_exchange(
5621*61046927SAndroid Build Coastguard Worker             &default_initialized_,
5622*61046927SAndroid Build Coastguard Worker             __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
5623*61046927SAndroid Build Coastguard Worker 
5624*61046927SAndroid Build Coastguard Worker         if (state & __DEFAULT_INITIALIZED) {
5625*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5626*61046927SAndroid Build Coastguard Worker                 *err = default_error_;
5627*61046927SAndroid Build Coastguard Worker             }
5628*61046927SAndroid Build Coastguard Worker             return default_;
5629*61046927SAndroid Build Coastguard Worker         }
5630*61046927SAndroid Build Coastguard Worker 
5631*61046927SAndroid Build Coastguard Worker         if (state & __DEFAULT_BEING_INITIALIZED) {
5632*61046927SAndroid Build Coastguard Worker               // Assume writes will propagate eventually...
5633*61046927SAndroid Build Coastguard Worker               while(default_initialized_ != __DEFAULT_INITIALIZED) {
5634*61046927SAndroid Build Coastguard Worker                   detail::fence();
5635*61046927SAndroid Build Coastguard Worker               }
5636*61046927SAndroid Build Coastguard Worker 
5637*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5638*61046927SAndroid Build Coastguard Worker                 *err = default_error_;
5639*61046927SAndroid Build Coastguard Worker             }
5640*61046927SAndroid Build Coastguard Worker             return default_;
5641*61046927SAndroid Build Coastguard Worker         }
5642*61046927SAndroid Build Coastguard Worker 
5643*61046927SAndroid Build Coastguard Worker         cl_int error;
5644*61046927SAndroid Build Coastguard Worker 
5645*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(&error);
5646*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5647*61046927SAndroid Build Coastguard Worker 
5648*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS) {
5649*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5650*61046927SAndroid Build Coastguard Worker                 *err = error;
5651*61046927SAndroid Build Coastguard Worker             }
5652*61046927SAndroid Build Coastguard Worker         }
5653*61046927SAndroid Build Coastguard Worker         else {
5654*61046927SAndroid Build Coastguard Worker             Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
5655*61046927SAndroid Build Coastguard Worker 
5656*61046927SAndroid Build Coastguard Worker             default_ = CommandQueue(context, device, 0, &error);
5657*61046927SAndroid Build Coastguard Worker 
5658*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5659*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5660*61046927SAndroid Build Coastguard Worker                 *err = error;
5661*61046927SAndroid Build Coastguard Worker             }
5662*61046927SAndroid Build Coastguard Worker         }
5663*61046927SAndroid Build Coastguard Worker 
5664*61046927SAndroid Build Coastguard Worker         detail::fence();
5665*61046927SAndroid Build Coastguard Worker 
5666*61046927SAndroid Build Coastguard Worker         default_error_ = error;
5667*61046927SAndroid Build Coastguard Worker         // Assume writes will propagate eventually...
5668*61046927SAndroid Build Coastguard Worker         default_initialized_ = __DEFAULT_INITIALIZED;
5669*61046927SAndroid Build Coastguard Worker 
5670*61046927SAndroid Build Coastguard Worker         detail::fence();
5671*61046927SAndroid Build Coastguard Worker 
5672*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5673*61046927SAndroid Build Coastguard Worker             *err = default_error_;
5674*61046927SAndroid Build Coastguard Worker         }
5675*61046927SAndroid Build Coastguard Worker         return default_;
5676*61046927SAndroid Build Coastguard Worker 
5677*61046927SAndroid Build Coastguard Worker     }
5678*61046927SAndroid Build Coastguard Worker 
CommandQueue()5679*61046927SAndroid Build Coastguard Worker     CommandQueue() { }
5680*61046927SAndroid Build Coastguard Worker 
CommandQueue(const cl_command_queue & commandQueue)5681*61046927SAndroid Build Coastguard Worker     __CL_EXPLICIT_CONSTRUCTORS CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
5682*61046927SAndroid Build Coastguard Worker 
operator =(const cl_command_queue & rhs)5683*61046927SAndroid Build Coastguard Worker     CommandQueue& operator = (const cl_command_queue& rhs)
5684*61046927SAndroid Build Coastguard Worker     {
5685*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
5686*61046927SAndroid Build Coastguard Worker         return *this;
5687*61046927SAndroid Build Coastguard Worker     }
5688*61046927SAndroid Build Coastguard Worker 
5689*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_command_queue_info name,T * param) const5690*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_command_queue_info name, T* param) const
5691*61046927SAndroid Build Coastguard Worker     {
5692*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5693*61046927SAndroid Build Coastguard Worker             detail::getInfo(
5694*61046927SAndroid Build Coastguard Worker                 &::clGetCommandQueueInfo, object_, name, param),
5695*61046927SAndroid Build Coastguard Worker                 __GET_COMMAND_QUEUE_INFO_ERR);
5696*61046927SAndroid Build Coastguard Worker     }
5697*61046927SAndroid Build Coastguard Worker 
5698*61046927SAndroid Build Coastguard Worker     template <cl_command_queue_info name> typename
5699*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_command_queue_info, name>::param_type
getInfo(cl_int * err=NULL) const5700*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
5701*61046927SAndroid Build Coastguard Worker     {
5702*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
5703*61046927SAndroid Build Coastguard Worker             detail::cl_command_queue_info, name>::param_type param;
5704*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
5705*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5706*61046927SAndroid Build Coastguard Worker             *err = result;
5707*61046927SAndroid Build Coastguard Worker         }
5708*61046927SAndroid Build Coastguard Worker         return param;
5709*61046927SAndroid Build Coastguard Worker     }
5710*61046927SAndroid Build Coastguard Worker 
enqueueReadBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5711*61046927SAndroid Build Coastguard Worker     cl_int enqueueReadBuffer(
5712*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
5713*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
5714*61046927SAndroid Build Coastguard Worker         ::size_t offset,
5715*61046927SAndroid Build Coastguard Worker         ::size_t size,
5716*61046927SAndroid Build Coastguard Worker         void* ptr,
5717*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5718*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5719*61046927SAndroid Build Coastguard Worker     {
5720*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5721*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5722*61046927SAndroid Build Coastguard Worker             ::clEnqueueReadBuffer(
5723*61046927SAndroid Build Coastguard Worker                 object_, buffer(), blocking, offset, size,
5724*61046927SAndroid Build Coastguard Worker                 ptr,
5725*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5726*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5727*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5728*61046927SAndroid Build Coastguard Worker             __ENQUEUE_READ_BUFFER_ERR);
5729*61046927SAndroid Build Coastguard Worker 
5730*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5731*61046927SAndroid Build Coastguard Worker             *event = tmp;
5732*61046927SAndroid Build Coastguard Worker 
5733*61046927SAndroid Build Coastguard Worker         return err;
5734*61046927SAndroid Build Coastguard Worker     }
5735*61046927SAndroid Build Coastguard Worker 
enqueueWriteBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5736*61046927SAndroid Build Coastguard Worker     cl_int enqueueWriteBuffer(
5737*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
5738*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
5739*61046927SAndroid Build Coastguard Worker         ::size_t offset,
5740*61046927SAndroid Build Coastguard Worker         ::size_t size,
5741*61046927SAndroid Build Coastguard Worker         const void* ptr,
5742*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5743*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5744*61046927SAndroid Build Coastguard Worker     {
5745*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5746*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5747*61046927SAndroid Build Coastguard Worker             ::clEnqueueWriteBuffer(
5748*61046927SAndroid Build Coastguard Worker                 object_, buffer(), blocking, offset, size,
5749*61046927SAndroid Build Coastguard Worker                 ptr,
5750*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5751*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5752*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5753*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_WRITE_BUFFER_ERR);
5754*61046927SAndroid Build Coastguard Worker 
5755*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5756*61046927SAndroid Build Coastguard Worker             *event = tmp;
5757*61046927SAndroid Build Coastguard Worker 
5758*61046927SAndroid Build Coastguard Worker         return err;
5759*61046927SAndroid Build Coastguard Worker     }
5760*61046927SAndroid Build Coastguard Worker 
enqueueCopyBuffer(const Buffer & src,const Buffer & dst,::size_t src_offset,::size_t dst_offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5761*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyBuffer(
5762*61046927SAndroid Build Coastguard Worker         const Buffer& src,
5763*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
5764*61046927SAndroid Build Coastguard Worker         ::size_t src_offset,
5765*61046927SAndroid Build Coastguard Worker         ::size_t dst_offset,
5766*61046927SAndroid Build Coastguard Worker         ::size_t size,
5767*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5768*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5769*61046927SAndroid Build Coastguard Worker     {
5770*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5771*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5772*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyBuffer(
5773*61046927SAndroid Build Coastguard Worker                 object_, src(), dst(), src_offset, dst_offset, size,
5774*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5775*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5776*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5777*61046927SAndroid Build Coastguard Worker             __ENQEUE_COPY_BUFFER_ERR);
5778*61046927SAndroid Build Coastguard Worker 
5779*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5780*61046927SAndroid Build Coastguard Worker             *event = tmp;
5781*61046927SAndroid Build Coastguard Worker 
5782*61046927SAndroid Build Coastguard Worker         return err;
5783*61046927SAndroid Build Coastguard Worker     }
5784*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
5785*61046927SAndroid Build Coastguard Worker 
enqueueReadBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5786*61046927SAndroid Build Coastguard Worker     cl_int enqueueReadBufferRect(
5787*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
5788*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
5789*61046927SAndroid Build Coastguard Worker         const size_t<3>& buffer_offset,
5790*61046927SAndroid Build Coastguard Worker         const size_t<3>& host_offset,
5791*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
5792*61046927SAndroid Build Coastguard Worker         ::size_t buffer_row_pitch,
5793*61046927SAndroid Build Coastguard Worker         ::size_t buffer_slice_pitch,
5794*61046927SAndroid Build Coastguard Worker         ::size_t host_row_pitch,
5795*61046927SAndroid Build Coastguard Worker         ::size_t host_slice_pitch,
5796*61046927SAndroid Build Coastguard Worker         void *ptr,
5797*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5798*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5799*61046927SAndroid Build Coastguard Worker     {
5800*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5801*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5802*61046927SAndroid Build Coastguard Worker             ::clEnqueueReadBufferRect(
5803*61046927SAndroid Build Coastguard Worker                 object_,
5804*61046927SAndroid Build Coastguard Worker                 buffer(),
5805*61046927SAndroid Build Coastguard Worker                 blocking,
5806*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)buffer_offset,
5807*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)host_offset,
5808*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)region,
5809*61046927SAndroid Build Coastguard Worker                 buffer_row_pitch,
5810*61046927SAndroid Build Coastguard Worker                 buffer_slice_pitch,
5811*61046927SAndroid Build Coastguard Worker                 host_row_pitch,
5812*61046927SAndroid Build Coastguard Worker                 host_slice_pitch,
5813*61046927SAndroid Build Coastguard Worker                 ptr,
5814*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5815*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5816*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5817*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_READ_BUFFER_RECT_ERR);
5818*61046927SAndroid Build Coastguard Worker 
5819*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5820*61046927SAndroid Build Coastguard Worker             *event = tmp;
5821*61046927SAndroid Build Coastguard Worker 
5822*61046927SAndroid Build Coastguard Worker         return err;
5823*61046927SAndroid Build Coastguard Worker     }
5824*61046927SAndroid Build Coastguard Worker 
enqueueWriteBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5825*61046927SAndroid Build Coastguard Worker     cl_int enqueueWriteBufferRect(
5826*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
5827*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
5828*61046927SAndroid Build Coastguard Worker         const size_t<3>& buffer_offset,
5829*61046927SAndroid Build Coastguard Worker         const size_t<3>& host_offset,
5830*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
5831*61046927SAndroid Build Coastguard Worker         ::size_t buffer_row_pitch,
5832*61046927SAndroid Build Coastguard Worker         ::size_t buffer_slice_pitch,
5833*61046927SAndroid Build Coastguard Worker         ::size_t host_row_pitch,
5834*61046927SAndroid Build Coastguard Worker         ::size_t host_slice_pitch,
5835*61046927SAndroid Build Coastguard Worker         const void *ptr,
5836*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5837*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5838*61046927SAndroid Build Coastguard Worker     {
5839*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5840*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5841*61046927SAndroid Build Coastguard Worker             ::clEnqueueWriteBufferRect(
5842*61046927SAndroid Build Coastguard Worker                 object_,
5843*61046927SAndroid Build Coastguard Worker                 buffer(),
5844*61046927SAndroid Build Coastguard Worker                 blocking,
5845*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)buffer_offset,
5846*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)host_offset,
5847*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)region,
5848*61046927SAndroid Build Coastguard Worker                 buffer_row_pitch,
5849*61046927SAndroid Build Coastguard Worker                 buffer_slice_pitch,
5850*61046927SAndroid Build Coastguard Worker                 host_row_pitch,
5851*61046927SAndroid Build Coastguard Worker                 host_slice_pitch,
5852*61046927SAndroid Build Coastguard Worker                 ptr,
5853*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5854*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5855*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5856*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_WRITE_BUFFER_RECT_ERR);
5857*61046927SAndroid Build Coastguard Worker 
5858*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5859*61046927SAndroid Build Coastguard Worker             *event = tmp;
5860*61046927SAndroid Build Coastguard Worker 
5861*61046927SAndroid Build Coastguard Worker         return err;
5862*61046927SAndroid Build Coastguard Worker     }
5863*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferRect(const Buffer & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,::size_t src_row_pitch,::size_t src_slice_pitch,::size_t dst_row_pitch,::size_t dst_slice_pitch,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5864*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyBufferRect(
5865*61046927SAndroid Build Coastguard Worker         const Buffer& src,
5866*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
5867*61046927SAndroid Build Coastguard Worker         const size_t<3>& src_origin,
5868*61046927SAndroid Build Coastguard Worker         const size_t<3>& dst_origin,
5869*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
5870*61046927SAndroid Build Coastguard Worker         ::size_t src_row_pitch,
5871*61046927SAndroid Build Coastguard Worker         ::size_t src_slice_pitch,
5872*61046927SAndroid Build Coastguard Worker         ::size_t dst_row_pitch,
5873*61046927SAndroid Build Coastguard Worker         ::size_t dst_slice_pitch,
5874*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5875*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5876*61046927SAndroid Build Coastguard Worker     {
5877*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5878*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5879*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyBufferRect(
5880*61046927SAndroid Build Coastguard Worker                 object_,
5881*61046927SAndroid Build Coastguard Worker                 src(),
5882*61046927SAndroid Build Coastguard Worker                 dst(),
5883*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)src_origin,
5884*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)dst_origin,
5885*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)region,
5886*61046927SAndroid Build Coastguard Worker                 src_row_pitch,
5887*61046927SAndroid Build Coastguard Worker                 src_slice_pitch,
5888*61046927SAndroid Build Coastguard Worker                 dst_row_pitch,
5889*61046927SAndroid Build Coastguard Worker                 dst_slice_pitch,
5890*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5891*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5892*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5893*61046927SAndroid Build Coastguard Worker             __ENQEUE_COPY_BUFFER_RECT_ERR);
5894*61046927SAndroid Build Coastguard Worker 
5895*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5896*61046927SAndroid Build Coastguard Worker             *event = tmp;
5897*61046927SAndroid Build Coastguard Worker 
5898*61046927SAndroid Build Coastguard Worker         return err;
5899*61046927SAndroid Build Coastguard Worker     }
5900*61046927SAndroid Build Coastguard Worker #endif //if defined(CL_VERSION_1_1)
5901*61046927SAndroid Build Coastguard Worker 
5902*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
5903*61046927SAndroid Build Coastguard Worker     /**
5904*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill a buffer object with a pattern
5905*61046927SAndroid Build Coastguard Worker      * of a given size. The pattern is specified a as vector.
5906*61046927SAndroid Build Coastguard Worker      * \tparam PatternType The datatype of the pattern field.
5907*61046927SAndroid Build Coastguard Worker      *     The pattern type must be an accepted OpenCL data type.
5908*61046927SAndroid Build Coastguard Worker      */
5909*61046927SAndroid Build Coastguard Worker     template<typename PatternType>
enqueueFillBuffer(const Buffer & buffer,PatternType pattern,::size_t offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5910*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillBuffer(
5911*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
5912*61046927SAndroid Build Coastguard Worker         PatternType pattern,
5913*61046927SAndroid Build Coastguard Worker         ::size_t offset,
5914*61046927SAndroid Build Coastguard Worker         ::size_t size,
5915*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5916*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5917*61046927SAndroid Build Coastguard Worker     {
5918*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5919*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5920*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillBuffer(
5921*61046927SAndroid Build Coastguard Worker                 object_,
5922*61046927SAndroid Build Coastguard Worker                 buffer(),
5923*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&pattern),
5924*61046927SAndroid Build Coastguard Worker                 sizeof(PatternType),
5925*61046927SAndroid Build Coastguard Worker                 offset,
5926*61046927SAndroid Build Coastguard Worker                 size,
5927*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5928*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5929*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5930*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_BUFFER_ERR);
5931*61046927SAndroid Build Coastguard Worker 
5932*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5933*61046927SAndroid Build Coastguard Worker             *event = tmp;
5934*61046927SAndroid Build Coastguard Worker 
5935*61046927SAndroid Build Coastguard Worker         return err;
5936*61046927SAndroid Build Coastguard Worker     }
5937*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
5938*61046927SAndroid Build Coastguard Worker 
enqueueReadImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5939*61046927SAndroid Build Coastguard Worker     cl_int enqueueReadImage(
5940*61046927SAndroid Build Coastguard Worker         const Image& image,
5941*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
5942*61046927SAndroid Build Coastguard Worker         const size_t<3>& origin,
5943*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
5944*61046927SAndroid Build Coastguard Worker         ::size_t row_pitch,
5945*61046927SAndroid Build Coastguard Worker         ::size_t slice_pitch,
5946*61046927SAndroid Build Coastguard Worker         void* ptr,
5947*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5948*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5949*61046927SAndroid Build Coastguard Worker     {
5950*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5951*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5952*61046927SAndroid Build Coastguard Worker             ::clEnqueueReadImage(
5953*61046927SAndroid Build Coastguard Worker                 object_, image(), blocking, (const ::size_t *) origin,
5954*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) region, row_pitch, slice_pitch, ptr,
5955*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5956*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5957*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5958*61046927SAndroid Build Coastguard Worker             __ENQUEUE_READ_IMAGE_ERR);
5959*61046927SAndroid Build Coastguard Worker 
5960*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5961*61046927SAndroid Build Coastguard Worker             *event = tmp;
5962*61046927SAndroid Build Coastguard Worker 
5963*61046927SAndroid Build Coastguard Worker         return err;
5964*61046927SAndroid Build Coastguard Worker     }
5965*61046927SAndroid Build Coastguard Worker 
enqueueWriteImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5966*61046927SAndroid Build Coastguard Worker     cl_int enqueueWriteImage(
5967*61046927SAndroid Build Coastguard Worker         const Image& image,
5968*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
5969*61046927SAndroid Build Coastguard Worker         const size_t<3>& origin,
5970*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
5971*61046927SAndroid Build Coastguard Worker         ::size_t row_pitch,
5972*61046927SAndroid Build Coastguard Worker         ::size_t slice_pitch,
5973*61046927SAndroid Build Coastguard Worker         const void* ptr,
5974*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
5975*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
5976*61046927SAndroid Build Coastguard Worker     {
5977*61046927SAndroid Build Coastguard Worker         cl_event tmp;
5978*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
5979*61046927SAndroid Build Coastguard Worker             ::clEnqueueWriteImage(
5980*61046927SAndroid Build Coastguard Worker                 object_, image(), blocking, (const ::size_t *) origin,
5981*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) region, row_pitch, slice_pitch, ptr,
5982*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
5983*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5984*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
5985*61046927SAndroid Build Coastguard Worker             __ENQUEUE_WRITE_IMAGE_ERR);
5986*61046927SAndroid Build Coastguard Worker 
5987*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
5988*61046927SAndroid Build Coastguard Worker             *event = tmp;
5989*61046927SAndroid Build Coastguard Worker 
5990*61046927SAndroid Build Coastguard Worker         return err;
5991*61046927SAndroid Build Coastguard Worker     }
5992*61046927SAndroid Build Coastguard Worker 
enqueueCopyImage(const Image & src,const Image & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5993*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyImage(
5994*61046927SAndroid Build Coastguard Worker         const Image& src,
5995*61046927SAndroid Build Coastguard Worker         const Image& dst,
5996*61046927SAndroid Build Coastguard Worker         const size_t<3>& src_origin,
5997*61046927SAndroid Build Coastguard Worker         const size_t<3>& dst_origin,
5998*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
5999*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6000*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6001*61046927SAndroid Build Coastguard Worker     {
6002*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6003*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6004*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyImage(
6005*61046927SAndroid Build Coastguard Worker                 object_, src(), dst(), (const ::size_t *) src_origin,
6006*61046927SAndroid Build Coastguard Worker                 (const ::size_t *)dst_origin, (const ::size_t *) region,
6007*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6008*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6009*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6010*61046927SAndroid Build Coastguard Worker             __ENQUEUE_COPY_IMAGE_ERR);
6011*61046927SAndroid Build Coastguard Worker 
6012*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6013*61046927SAndroid Build Coastguard Worker             *event = tmp;
6014*61046927SAndroid Build Coastguard Worker 
6015*61046927SAndroid Build Coastguard Worker         return err;
6016*61046927SAndroid Build Coastguard Worker     }
6017*61046927SAndroid Build Coastguard Worker 
6018*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
6019*61046927SAndroid Build Coastguard Worker     /**
6020*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill an image object with a specified color.
6021*61046927SAndroid Build Coastguard Worker      * \param fillColor is the color to use to fill the image.
6022*61046927SAndroid Build Coastguard Worker      *     This is a four component RGBA floating-point color value if
6023*61046927SAndroid Build Coastguard Worker      *     the image channel data type is not an unnormalized signed or
6024*61046927SAndroid Build Coastguard Worker      *     unsigned data type.
6025*61046927SAndroid Build Coastguard Worker      */
enqueueFillImage(const Image & image,cl_float4 fillColor,const size_t<3> & origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6026*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillImage(
6027*61046927SAndroid Build Coastguard Worker         const Image& image,
6028*61046927SAndroid Build Coastguard Worker         cl_float4 fillColor,
6029*61046927SAndroid Build Coastguard Worker         const size_t<3>& origin,
6030*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
6031*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6032*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6033*61046927SAndroid Build Coastguard Worker     {
6034*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6035*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6036*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillImage(
6037*61046927SAndroid Build Coastguard Worker                 object_,
6038*61046927SAndroid Build Coastguard Worker                 image(),
6039*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&fillColor),
6040*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) origin,
6041*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) region,
6042*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6043*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6044*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6045*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_IMAGE_ERR);
6046*61046927SAndroid Build Coastguard Worker 
6047*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6048*61046927SAndroid Build Coastguard Worker             *event = tmp;
6049*61046927SAndroid Build Coastguard Worker 
6050*61046927SAndroid Build Coastguard Worker         return err;
6051*61046927SAndroid Build Coastguard Worker     }
6052*61046927SAndroid Build Coastguard Worker 
6053*61046927SAndroid Build Coastguard Worker     /**
6054*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill an image object with a specified color.
6055*61046927SAndroid Build Coastguard Worker      * \param fillColor is the color to use to fill the image.
6056*61046927SAndroid Build Coastguard Worker      *     This is a four component RGBA signed integer color value if
6057*61046927SAndroid Build Coastguard Worker      *     the image channel data type is an unnormalized signed integer
6058*61046927SAndroid Build Coastguard Worker      *     type.
6059*61046927SAndroid Build Coastguard Worker      */
enqueueFillImage(const Image & image,cl_int4 fillColor,const size_t<3> & origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6060*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillImage(
6061*61046927SAndroid Build Coastguard Worker         const Image& image,
6062*61046927SAndroid Build Coastguard Worker         cl_int4 fillColor,
6063*61046927SAndroid Build Coastguard Worker         const size_t<3>& origin,
6064*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
6065*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6066*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6067*61046927SAndroid Build Coastguard Worker     {
6068*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6069*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6070*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillImage(
6071*61046927SAndroid Build Coastguard Worker                 object_,
6072*61046927SAndroid Build Coastguard Worker                 image(),
6073*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&fillColor),
6074*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) origin,
6075*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) region,
6076*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6077*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6078*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6079*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_IMAGE_ERR);
6080*61046927SAndroid Build Coastguard Worker 
6081*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6082*61046927SAndroid Build Coastguard Worker             *event = tmp;
6083*61046927SAndroid Build Coastguard Worker 
6084*61046927SAndroid Build Coastguard Worker         return err;
6085*61046927SAndroid Build Coastguard Worker     }
6086*61046927SAndroid Build Coastguard Worker 
6087*61046927SAndroid Build Coastguard Worker     /**
6088*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill an image object with a specified color.
6089*61046927SAndroid Build Coastguard Worker      * \param fillColor is the color to use to fill the image.
6090*61046927SAndroid Build Coastguard Worker      *     This is a four component RGBA unsigned integer color value if
6091*61046927SAndroid Build Coastguard Worker      *     the image channel data type is an unnormalized unsigned integer
6092*61046927SAndroid Build Coastguard Worker      *     type.
6093*61046927SAndroid Build Coastguard Worker      */
enqueueFillImage(const Image & image,cl_uint4 fillColor,const size_t<3> & origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6094*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillImage(
6095*61046927SAndroid Build Coastguard Worker         const Image& image,
6096*61046927SAndroid Build Coastguard Worker         cl_uint4 fillColor,
6097*61046927SAndroid Build Coastguard Worker         const size_t<3>& origin,
6098*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
6099*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6100*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6101*61046927SAndroid Build Coastguard Worker     {
6102*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6103*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6104*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillImage(
6105*61046927SAndroid Build Coastguard Worker                 object_,
6106*61046927SAndroid Build Coastguard Worker                 image(),
6107*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&fillColor),
6108*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) origin,
6109*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) region,
6110*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6111*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6112*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6113*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_IMAGE_ERR);
6114*61046927SAndroid Build Coastguard Worker 
6115*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6116*61046927SAndroid Build Coastguard Worker             *event = tmp;
6117*61046927SAndroid Build Coastguard Worker 
6118*61046927SAndroid Build Coastguard Worker         return err;
6119*61046927SAndroid Build Coastguard Worker     }
6120*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
6121*61046927SAndroid Build Coastguard Worker 
enqueueCopyImageToBuffer(const Image & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & region,::size_t dst_offset,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6122*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyImageToBuffer(
6123*61046927SAndroid Build Coastguard Worker         const Image& src,
6124*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
6125*61046927SAndroid Build Coastguard Worker         const size_t<3>& src_origin,
6126*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
6127*61046927SAndroid Build Coastguard Worker         ::size_t dst_offset,
6128*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6129*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6130*61046927SAndroid Build Coastguard Worker     {
6131*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6132*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6133*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyImageToBuffer(
6134*61046927SAndroid Build Coastguard Worker                 object_, src(), dst(), (const ::size_t *) src_origin,
6135*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) region, dst_offset,
6136*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6137*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6138*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6139*61046927SAndroid Build Coastguard Worker             __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR);
6140*61046927SAndroid Build Coastguard Worker 
6141*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6142*61046927SAndroid Build Coastguard Worker             *event = tmp;
6143*61046927SAndroid Build Coastguard Worker 
6144*61046927SAndroid Build Coastguard Worker         return err;
6145*61046927SAndroid Build Coastguard Worker     }
6146*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferToImage(const Buffer & src,const Image & dst,::size_t src_offset,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6147*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyBufferToImage(
6148*61046927SAndroid Build Coastguard Worker         const Buffer& src,
6149*61046927SAndroid Build Coastguard Worker         const Image& dst,
6150*61046927SAndroid Build Coastguard Worker         ::size_t src_offset,
6151*61046927SAndroid Build Coastguard Worker         const size_t<3>& dst_origin,
6152*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
6153*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6154*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6155*61046927SAndroid Build Coastguard Worker     {
6156*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6157*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6158*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyBufferToImage(
6159*61046927SAndroid Build Coastguard Worker                 object_, src(), dst(), src_offset,
6160*61046927SAndroid Build Coastguard Worker                 (const ::size_t *) dst_origin, (const ::size_t *) region,
6161*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6162*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6163*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6164*61046927SAndroid Build Coastguard Worker             __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR);
6165*61046927SAndroid Build Coastguard Worker 
6166*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6167*61046927SAndroid Build Coastguard Worker             *event = tmp;
6168*61046927SAndroid Build Coastguard Worker 
6169*61046927SAndroid Build Coastguard Worker         return err;
6170*61046927SAndroid Build Coastguard Worker     }
6171*61046927SAndroid Build Coastguard Worker 
enqueueMapBuffer(const Buffer & buffer,cl_bool blocking,cl_map_flags flags,::size_t offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL) const6172*61046927SAndroid Build Coastguard Worker     void* enqueueMapBuffer(
6173*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
6174*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
6175*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
6176*61046927SAndroid Build Coastguard Worker         ::size_t offset,
6177*61046927SAndroid Build Coastguard Worker         ::size_t size,
6178*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6179*61046927SAndroid Build Coastguard Worker         Event* event = NULL,
6180*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL) const
6181*61046927SAndroid Build Coastguard Worker     {
6182*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6183*61046927SAndroid Build Coastguard Worker         cl_int error;
6184*61046927SAndroid Build Coastguard Worker         void * result = ::clEnqueueMapBuffer(
6185*61046927SAndroid Build Coastguard Worker             object_, buffer(), blocking, flags, offset, size,
6186*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
6187*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6188*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL,
6189*61046927SAndroid Build Coastguard Worker             &error);
6190*61046927SAndroid Build Coastguard Worker 
6191*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6192*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6193*61046927SAndroid Build Coastguard Worker             *err = error;
6194*61046927SAndroid Build Coastguard Worker         }
6195*61046927SAndroid Build Coastguard Worker         if (event != NULL && error == CL_SUCCESS)
6196*61046927SAndroid Build Coastguard Worker             *event = tmp;
6197*61046927SAndroid Build Coastguard Worker 
6198*61046927SAndroid Build Coastguard Worker         return result;
6199*61046927SAndroid Build Coastguard Worker     }
6200*61046927SAndroid Build Coastguard Worker 
enqueueMapImage(const Image & buffer,cl_bool blocking,cl_map_flags flags,const size_t<3> & origin,const size_t<3> & region,::size_t * row_pitch,::size_t * slice_pitch,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL) const6201*61046927SAndroid Build Coastguard Worker     void* enqueueMapImage(
6202*61046927SAndroid Build Coastguard Worker         const Image& buffer,
6203*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
6204*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
6205*61046927SAndroid Build Coastguard Worker         const size_t<3>& origin,
6206*61046927SAndroid Build Coastguard Worker         const size_t<3>& region,
6207*61046927SAndroid Build Coastguard Worker         ::size_t * row_pitch,
6208*61046927SAndroid Build Coastguard Worker         ::size_t * slice_pitch,
6209*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6210*61046927SAndroid Build Coastguard Worker         Event* event = NULL,
6211*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL) const
6212*61046927SAndroid Build Coastguard Worker     {
6213*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6214*61046927SAndroid Build Coastguard Worker         cl_int error;
6215*61046927SAndroid Build Coastguard Worker         void * result = ::clEnqueueMapImage(
6216*61046927SAndroid Build Coastguard Worker             object_, buffer(), blocking, flags,
6217*61046927SAndroid Build Coastguard Worker             (const ::size_t *) origin, (const ::size_t *) region,
6218*61046927SAndroid Build Coastguard Worker             row_pitch, slice_pitch,
6219*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
6220*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6221*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL,
6222*61046927SAndroid Build Coastguard Worker             &error);
6223*61046927SAndroid Build Coastguard Worker 
6224*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);
6225*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6226*61046927SAndroid Build Coastguard Worker               *err = error;
6227*61046927SAndroid Build Coastguard Worker         }
6228*61046927SAndroid Build Coastguard Worker         if (event != NULL && error == CL_SUCCESS)
6229*61046927SAndroid Build Coastguard Worker             *event = tmp;
6230*61046927SAndroid Build Coastguard Worker         return result;
6231*61046927SAndroid Build Coastguard Worker     }
6232*61046927SAndroid Build Coastguard Worker 
enqueueUnmapMemObject(const Memory & memory,void * mapped_ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6233*61046927SAndroid Build Coastguard Worker     cl_int enqueueUnmapMemObject(
6234*61046927SAndroid Build Coastguard Worker         const Memory& memory,
6235*61046927SAndroid Build Coastguard Worker         void* mapped_ptr,
6236*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6237*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6238*61046927SAndroid Build Coastguard Worker     {
6239*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6240*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6241*61046927SAndroid Build Coastguard Worker             ::clEnqueueUnmapMemObject(
6242*61046927SAndroid Build Coastguard Worker                 object_, memory(), mapped_ptr,
6243*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6244*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6245*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6246*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6247*61046927SAndroid Build Coastguard Worker 
6248*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6249*61046927SAndroid Build Coastguard Worker             *event = tmp;
6250*61046927SAndroid Build Coastguard Worker 
6251*61046927SAndroid Build Coastguard Worker         return err;
6252*61046927SAndroid Build Coastguard Worker     }
6253*61046927SAndroid Build Coastguard Worker 
6254*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
6255*61046927SAndroid Build Coastguard Worker     /**
6256*61046927SAndroid Build Coastguard Worker      * Enqueues a marker command which waits for either a list of events to complete,
6257*61046927SAndroid Build Coastguard Worker      * or all previously enqueued commands to complete.
6258*61046927SAndroid Build Coastguard Worker      *
6259*61046927SAndroid Build Coastguard Worker      * Enqueues a marker command which waits for either a list of events to complete,
6260*61046927SAndroid Build Coastguard Worker      * or if the list is empty it waits for all commands previously enqueued in command_queue
6261*61046927SAndroid Build Coastguard Worker      * to complete before it completes. This command returns an event which can be waited on,
6262*61046927SAndroid Build Coastguard Worker      * i.e. this event can be waited on to insure that all events either in the event_wait_list
6263*61046927SAndroid Build Coastguard Worker      * or all previously enqueued commands, queued before this command to command_queue,
6264*61046927SAndroid Build Coastguard Worker      * have completed.
6265*61046927SAndroid Build Coastguard Worker      */
enqueueMarkerWithWaitList(const VECTOR_CLASS<Event> * events=0,Event * event=0) const6266*61046927SAndroid Build Coastguard Worker     cl_int enqueueMarkerWithWaitList(
6267*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event> *events = 0,
6268*61046927SAndroid Build Coastguard Worker         Event *event = 0) const
6269*61046927SAndroid Build Coastguard Worker     {
6270*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6271*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6272*61046927SAndroid Build Coastguard Worker             ::clEnqueueMarkerWithWaitList(
6273*61046927SAndroid Build Coastguard Worker                 object_,
6274*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6275*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6276*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6277*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MARKER_WAIT_LIST_ERR);
6278*61046927SAndroid Build Coastguard Worker 
6279*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6280*61046927SAndroid Build Coastguard Worker             *event = tmp;
6281*61046927SAndroid Build Coastguard Worker 
6282*61046927SAndroid Build Coastguard Worker         return err;
6283*61046927SAndroid Build Coastguard Worker     }
6284*61046927SAndroid Build Coastguard Worker 
6285*61046927SAndroid Build Coastguard Worker     /**
6286*61046927SAndroid Build Coastguard Worker      * A synchronization point that enqueues a barrier operation.
6287*61046927SAndroid Build Coastguard Worker      *
6288*61046927SAndroid Build Coastguard Worker      * Enqueues a barrier command which waits for either a list of events to complete,
6289*61046927SAndroid Build Coastguard Worker      * or if the list is empty it waits for all commands previously enqueued in command_queue
6290*61046927SAndroid Build Coastguard Worker      * to complete before it completes. This command blocks command execution, that is, any
6291*61046927SAndroid Build Coastguard Worker      * following commands enqueued after it do not execute until it completes. This command
6292*61046927SAndroid Build Coastguard Worker      * returns an event which can be waited on, i.e. this event can be waited on to insure that
6293*61046927SAndroid Build Coastguard Worker      * all events either in the event_wait_list or all previously enqueued commands, queued
6294*61046927SAndroid Build Coastguard Worker      * before this command to command_queue, have completed.
6295*61046927SAndroid Build Coastguard Worker      */
enqueueBarrierWithWaitList(const VECTOR_CLASS<Event> * events=0,Event * event=0) const6296*61046927SAndroid Build Coastguard Worker     cl_int enqueueBarrierWithWaitList(
6297*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event> *events = 0,
6298*61046927SAndroid Build Coastguard Worker         Event *event = 0) const
6299*61046927SAndroid Build Coastguard Worker     {
6300*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6301*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6302*61046927SAndroid Build Coastguard Worker             ::clEnqueueBarrierWithWaitList(
6303*61046927SAndroid Build Coastguard Worker                 object_,
6304*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6305*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6306*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6307*61046927SAndroid Build Coastguard Worker             __ENQUEUE_BARRIER_WAIT_LIST_ERR);
6308*61046927SAndroid Build Coastguard Worker 
6309*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6310*61046927SAndroid Build Coastguard Worker             *event = tmp;
6311*61046927SAndroid Build Coastguard Worker 
6312*61046927SAndroid Build Coastguard Worker         return err;
6313*61046927SAndroid Build Coastguard Worker     }
6314*61046927SAndroid Build Coastguard Worker 
6315*61046927SAndroid Build Coastguard Worker     /**
6316*61046927SAndroid Build Coastguard Worker      * Enqueues a command to indicate with which device a set of memory objects
6317*61046927SAndroid Build Coastguard Worker      * should be associated.
6318*61046927SAndroid Build Coastguard Worker      */
enqueueMigrateMemObjects(const VECTOR_CLASS<Memory> & memObjects,cl_mem_migration_flags flags,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6319*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateMemObjects(
6320*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Memory> &memObjects,
6321*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags,
6322*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6323*61046927SAndroid Build Coastguard Worker         Event* event = NULL
6324*61046927SAndroid Build Coastguard Worker         ) const
6325*61046927SAndroid Build Coastguard Worker     {
6326*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6327*61046927SAndroid Build Coastguard Worker 
6328*61046927SAndroid Build Coastguard Worker         cl_mem* localMemObjects = static_cast<cl_mem*>(alloca(memObjects.size() * sizeof(cl_mem)));
6329*61046927SAndroid Build Coastguard Worker         for( int i = 0; i < (int)memObjects.size(); ++i ) {
6330*61046927SAndroid Build Coastguard Worker             localMemObjects[i] = memObjects[i]();
6331*61046927SAndroid Build Coastguard Worker         }
6332*61046927SAndroid Build Coastguard Worker 
6333*61046927SAndroid Build Coastguard Worker 
6334*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6335*61046927SAndroid Build Coastguard Worker             ::clEnqueueMigrateMemObjects(
6336*61046927SAndroid Build Coastguard Worker                 object_,
6337*61046927SAndroid Build Coastguard Worker                 (cl_uint)memObjects.size(),
6338*61046927SAndroid Build Coastguard Worker                 static_cast<const cl_mem*>(localMemObjects),
6339*61046927SAndroid Build Coastguard Worker                 flags,
6340*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6341*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6342*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6343*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6344*61046927SAndroid Build Coastguard Worker 
6345*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6346*61046927SAndroid Build Coastguard Worker             *event = tmp;
6347*61046927SAndroid Build Coastguard Worker 
6348*61046927SAndroid Build Coastguard Worker         return err;
6349*61046927SAndroid Build Coastguard Worker     }
6350*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
6351*61046927SAndroid Build Coastguard Worker 
enqueueNDRangeKernel(const Kernel & kernel,const NDRange & offset,const NDRange & global,const NDRange & local=NullRange,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6352*61046927SAndroid Build Coastguard Worker     cl_int enqueueNDRangeKernel(
6353*61046927SAndroid Build Coastguard Worker         const Kernel& kernel,
6354*61046927SAndroid Build Coastguard Worker         const NDRange& offset,
6355*61046927SAndroid Build Coastguard Worker         const NDRange& global,
6356*61046927SAndroid Build Coastguard Worker         const NDRange& local = NullRange,
6357*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6358*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6359*61046927SAndroid Build Coastguard Worker     {
6360*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6361*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6362*61046927SAndroid Build Coastguard Worker             ::clEnqueueNDRangeKernel(
6363*61046927SAndroid Build Coastguard Worker                 object_, kernel(), (cl_uint) global.dimensions(),
6364*61046927SAndroid Build Coastguard Worker                 offset.dimensions() != 0 ? (const ::size_t*) offset : NULL,
6365*61046927SAndroid Build Coastguard Worker                 (const ::size_t*) global,
6366*61046927SAndroid Build Coastguard Worker                 local.dimensions() != 0 ? (const ::size_t*) local : NULL,
6367*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6368*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6369*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6370*61046927SAndroid Build Coastguard Worker             __ENQUEUE_NDRANGE_KERNEL_ERR);
6371*61046927SAndroid Build Coastguard Worker 
6372*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6373*61046927SAndroid Build Coastguard Worker             *event = tmp;
6374*61046927SAndroid Build Coastguard Worker 
6375*61046927SAndroid Build Coastguard Worker         return err;
6376*61046927SAndroid Build Coastguard Worker     }
6377*61046927SAndroid Build Coastguard Worker 
enqueueTask(const Kernel & kernel,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6378*61046927SAndroid Build Coastguard Worker     cl_int enqueueTask(
6379*61046927SAndroid Build Coastguard Worker         const Kernel& kernel,
6380*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6381*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6382*61046927SAndroid Build Coastguard Worker     {
6383*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6384*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6385*61046927SAndroid Build Coastguard Worker             ::clEnqueueTask(
6386*61046927SAndroid Build Coastguard Worker                 object_, kernel(),
6387*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6388*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6389*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6390*61046927SAndroid Build Coastguard Worker             __ENQUEUE_TASK_ERR);
6391*61046927SAndroid Build Coastguard Worker 
6392*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6393*61046927SAndroid Build Coastguard Worker             *event = tmp;
6394*61046927SAndroid Build Coastguard Worker 
6395*61046927SAndroid Build Coastguard Worker         return err;
6396*61046927SAndroid Build Coastguard Worker     }
6397*61046927SAndroid Build Coastguard Worker 
enqueueNativeKernel(void (CL_CALLBACK * userFptr)(void *),std::pair<void *,::size_t> args,const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<const void * > * mem_locs=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6398*61046927SAndroid Build Coastguard Worker     cl_int enqueueNativeKernel(
6399*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK *userFptr)(void *),
6400*61046927SAndroid Build Coastguard Worker         std::pair<void*, ::size_t> args,
6401*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Memory>* mem_objects = NULL,
6402*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<const void*>* mem_locs = NULL,
6403*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6404*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
6405*61046927SAndroid Build Coastguard Worker     {
6406*61046927SAndroid Build Coastguard Worker         cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0)
6407*61046927SAndroid Build Coastguard Worker             ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem))
6408*61046927SAndroid Build Coastguard Worker             : NULL;
6409*61046927SAndroid Build Coastguard Worker 
6410*61046927SAndroid Build Coastguard Worker         if (mems != NULL) {
6411*61046927SAndroid Build Coastguard Worker             for (unsigned int i = 0; i < mem_objects->size(); i++) {
6412*61046927SAndroid Build Coastguard Worker                 mems[i] = ((*mem_objects)[i])();
6413*61046927SAndroid Build Coastguard Worker             }
6414*61046927SAndroid Build Coastguard Worker         }
6415*61046927SAndroid Build Coastguard Worker 
6416*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6417*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6418*61046927SAndroid Build Coastguard Worker             ::clEnqueueNativeKernel(
6419*61046927SAndroid Build Coastguard Worker                 object_, userFptr, args.first, args.second,
6420*61046927SAndroid Build Coastguard Worker                 (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6421*61046927SAndroid Build Coastguard Worker                 mems,
6422*61046927SAndroid Build Coastguard Worker                 (mem_locs != NULL && mem_locs->size() > 0) ? (const void **) &mem_locs->front() : NULL,
6423*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6424*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6425*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6426*61046927SAndroid Build Coastguard Worker             __ENQUEUE_NATIVE_KERNEL);
6427*61046927SAndroid Build Coastguard Worker 
6428*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6429*61046927SAndroid Build Coastguard Worker             *event = tmp;
6430*61046927SAndroid Build Coastguard Worker 
6431*61046927SAndroid Build Coastguard Worker         return err;
6432*61046927SAndroid Build Coastguard Worker     }
6433*61046927SAndroid Build Coastguard Worker 
6434*61046927SAndroid Build Coastguard Worker /**
6435*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
6436*61046927SAndroid Build Coastguard Worker  */
6437*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
6438*61046927SAndroid Build Coastguard Worker     CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
enqueueMarker(Event * event=NULL) const6439*61046927SAndroid Build Coastguard Worker     cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6440*61046927SAndroid Build Coastguard Worker     {
6441*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6442*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6443*61046927SAndroid Build Coastguard Worker             ::clEnqueueMarker(
6444*61046927SAndroid Build Coastguard Worker                 object_,
6445*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6446*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MARKER_ERR);
6447*61046927SAndroid Build Coastguard Worker 
6448*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6449*61046927SAndroid Build Coastguard Worker             *event = tmp;
6450*61046927SAndroid Build Coastguard Worker 
6451*61046927SAndroid Build Coastguard Worker         return err;
6452*61046927SAndroid Build Coastguard Worker     }
6453*61046927SAndroid Build Coastguard Worker 
6454*61046927SAndroid Build Coastguard Worker     CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
enqueueWaitForEvents(const VECTOR_CLASS<Event> & events) const6455*61046927SAndroid Build Coastguard Worker     cl_int enqueueWaitForEvents(const VECTOR_CLASS<Event>& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6456*61046927SAndroid Build Coastguard Worker     {
6457*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6458*61046927SAndroid Build Coastguard Worker             ::clEnqueueWaitForEvents(
6459*61046927SAndroid Build Coastguard Worker                 object_,
6460*61046927SAndroid Build Coastguard Worker                 (cl_uint) events.size(),
6461*61046927SAndroid Build Coastguard Worker                 events.size() > 0 ? (const cl_event*) &events.front() : NULL),
6462*61046927SAndroid Build Coastguard Worker             __ENQUEUE_WAIT_FOR_EVENTS_ERR);
6463*61046927SAndroid Build Coastguard Worker     }
6464*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
6465*61046927SAndroid Build Coastguard Worker 
enqueueAcquireGLObjects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6466*61046927SAndroid Build Coastguard Worker     cl_int enqueueAcquireGLObjects(
6467*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6468*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Event>* events = NULL,
6469*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
6470*61046927SAndroid Build Coastguard Worker      {
6471*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6472*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6473*61046927SAndroid Build Coastguard Worker              ::clEnqueueAcquireGLObjects(
6474*61046927SAndroid Build Coastguard Worker                  object_,
6475*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6476*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6477*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_uint) events->size() : 0,
6478*61046927SAndroid Build Coastguard Worker                  (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6479*61046927SAndroid Build Coastguard Worker                  (event != NULL) ? &tmp : NULL),
6480*61046927SAndroid Build Coastguard Worker              __ENQUEUE_ACQUIRE_GL_ERR);
6481*61046927SAndroid Build Coastguard Worker 
6482*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6483*61046927SAndroid Build Coastguard Worker             *event = tmp;
6484*61046927SAndroid Build Coastguard Worker 
6485*61046927SAndroid Build Coastguard Worker         return err;
6486*61046927SAndroid Build Coastguard Worker      }
6487*61046927SAndroid Build Coastguard Worker 
enqueueReleaseGLObjects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6488*61046927SAndroid Build Coastguard Worker     cl_int enqueueReleaseGLObjects(
6489*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6490*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Event>* events = NULL,
6491*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
6492*61046927SAndroid Build Coastguard Worker      {
6493*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6494*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6495*61046927SAndroid Build Coastguard Worker              ::clEnqueueReleaseGLObjects(
6496*61046927SAndroid Build Coastguard Worker                  object_,
6497*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6498*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6499*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_uint) events->size() : 0,
6500*61046927SAndroid Build Coastguard Worker                  (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6501*61046927SAndroid Build Coastguard Worker                  (event != NULL) ? &tmp : NULL),
6502*61046927SAndroid Build Coastguard Worker              __ENQUEUE_RELEASE_GL_ERR);
6503*61046927SAndroid Build Coastguard Worker 
6504*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6505*61046927SAndroid Build Coastguard Worker             *event = tmp;
6506*61046927SAndroid Build Coastguard Worker 
6507*61046927SAndroid Build Coastguard Worker         return err;
6508*61046927SAndroid Build Coastguard Worker      }
6509*61046927SAndroid Build Coastguard Worker 
6510*61046927SAndroid Build Coastguard Worker #if defined (USE_DX_INTEROP)
6511*61046927SAndroid Build Coastguard Worker typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)(
6512*61046927SAndroid Build Coastguard Worker     cl_command_queue command_queue, cl_uint num_objects,
6513*61046927SAndroid Build Coastguard Worker     const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
6514*61046927SAndroid Build Coastguard Worker     const cl_event* event_wait_list, cl_event* event);
6515*61046927SAndroid Build Coastguard Worker typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
6516*61046927SAndroid Build Coastguard Worker     cl_command_queue command_queue, cl_uint num_objects,
6517*61046927SAndroid Build Coastguard Worker     const cl_mem* mem_objects,  cl_uint num_events_in_wait_list,
6518*61046927SAndroid Build Coastguard Worker     const cl_event* event_wait_list, cl_event* event);
6519*61046927SAndroid Build Coastguard Worker 
enqueueAcquireD3D10Objects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6520*61046927SAndroid Build Coastguard Worker     cl_int enqueueAcquireD3D10Objects(
6521*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6522*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Event>* events = NULL,
6523*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
6524*61046927SAndroid Build Coastguard Worker     {
6525*61046927SAndroid Build Coastguard Worker         static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL;
6526*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
6527*61046927SAndroid Build Coastguard Worker         cl_context context = getInfo<CL_QUEUE_CONTEXT>();
6528*61046927SAndroid Build Coastguard Worker         cl::Device device(getInfo<CL_QUEUE_DEVICE>());
6529*61046927SAndroid Build Coastguard Worker         cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
6530*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR);
6531*61046927SAndroid Build Coastguard Worker #endif
6532*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
6533*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR);
6534*61046927SAndroid Build Coastguard Worker #endif
6535*61046927SAndroid Build Coastguard Worker 
6536*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6537*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6538*61046927SAndroid Build Coastguard Worker              pfn_clEnqueueAcquireD3D10ObjectsKHR(
6539*61046927SAndroid Build Coastguard Worker                  object_,
6540*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6541*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6542*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_uint) events->size() : 0,
6543*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_event*) &events->front() : NULL,
6544*61046927SAndroid Build Coastguard Worker                  (event != NULL) ? &tmp : NULL),
6545*61046927SAndroid Build Coastguard Worker              __ENQUEUE_ACQUIRE_GL_ERR);
6546*61046927SAndroid Build Coastguard Worker 
6547*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6548*61046927SAndroid Build Coastguard Worker             *event = tmp;
6549*61046927SAndroid Build Coastguard Worker 
6550*61046927SAndroid Build Coastguard Worker         return err;
6551*61046927SAndroid Build Coastguard Worker      }
6552*61046927SAndroid Build Coastguard Worker 
enqueueReleaseD3D10Objects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6553*61046927SAndroid Build Coastguard Worker     cl_int enqueueReleaseD3D10Objects(
6554*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6555*61046927SAndroid Build Coastguard Worker          const VECTOR_CLASS<Event>* events = NULL,
6556*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
6557*61046927SAndroid Build Coastguard Worker     {
6558*61046927SAndroid Build Coastguard Worker         static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL;
6559*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_2)
6560*61046927SAndroid Build Coastguard Worker         cl_context context = getInfo<CL_QUEUE_CONTEXT>();
6561*61046927SAndroid Build Coastguard Worker         cl::Device device(getInfo<CL_QUEUE_DEVICE>());
6562*61046927SAndroid Build Coastguard Worker         cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
6563*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR);
6564*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_2)
6565*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
6566*61046927SAndroid Build Coastguard Worker         __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR);
6567*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
6568*61046927SAndroid Build Coastguard Worker 
6569*61046927SAndroid Build Coastguard Worker         cl_event tmp;
6570*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
6571*61046927SAndroid Build Coastguard Worker             pfn_clEnqueueReleaseD3D10ObjectsKHR(
6572*61046927SAndroid Build Coastguard Worker                 object_,
6573*61046927SAndroid Build Coastguard Worker                 (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6574*61046927SAndroid Build Coastguard Worker                 (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6575*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
6576*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6577*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
6578*61046927SAndroid Build Coastguard Worker             __ENQUEUE_RELEASE_GL_ERR);
6579*61046927SAndroid Build Coastguard Worker 
6580*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
6581*61046927SAndroid Build Coastguard Worker             *event = tmp;
6582*61046927SAndroid Build Coastguard Worker 
6583*61046927SAndroid Build Coastguard Worker         return err;
6584*61046927SAndroid Build Coastguard Worker     }
6585*61046927SAndroid Build Coastguard Worker #endif
6586*61046927SAndroid Build Coastguard Worker 
6587*61046927SAndroid Build Coastguard Worker /**
6588*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
6589*61046927SAndroid Build Coastguard Worker  */
6590*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
6591*61046927SAndroid Build Coastguard Worker     CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
enqueueBarrier() const6592*61046927SAndroid Build Coastguard Worker     cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6593*61046927SAndroid Build Coastguard Worker     {
6594*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6595*61046927SAndroid Build Coastguard Worker             ::clEnqueueBarrier(object_),
6596*61046927SAndroid Build Coastguard Worker             __ENQUEUE_BARRIER_ERR);
6597*61046927SAndroid Build Coastguard Worker     }
6598*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
6599*61046927SAndroid Build Coastguard Worker 
flush() const6600*61046927SAndroid Build Coastguard Worker     cl_int flush() const
6601*61046927SAndroid Build Coastguard Worker     {
6602*61046927SAndroid Build Coastguard Worker         return detail::errHandler(::clFlush(object_), __FLUSH_ERR);
6603*61046927SAndroid Build Coastguard Worker     }
6604*61046927SAndroid Build Coastguard Worker 
finish() const6605*61046927SAndroid Build Coastguard Worker     cl_int finish() const
6606*61046927SAndroid Build Coastguard Worker     {
6607*61046927SAndroid Build Coastguard Worker         return detail::errHandler(::clFinish(object_), __FINISH_ERR);
6608*61046927SAndroid Build Coastguard Worker     }
6609*61046927SAndroid Build Coastguard Worker };
6610*61046927SAndroid Build Coastguard Worker 
6611*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
6612*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX std::atomic<int> CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_initialized_;
6613*61046927SAndroid Build Coastguard Worker #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
6614*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX volatile int CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
6615*61046927SAndroid Build Coastguard Worker #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
6616*61046927SAndroid Build Coastguard Worker 
6617*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX CommandQueue CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_;
6618*61046927SAndroid Build Coastguard Worker CL_WEAK_ATTRIB_PREFIX volatile cl_int CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_error_ = CL_SUCCESS;
6619*61046927SAndroid Build Coastguard Worker 
6620*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
Buffer(const Context & context,IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr,cl_int * err)6621*61046927SAndroid Build Coastguard Worker Buffer::Buffer(
6622*61046927SAndroid Build Coastguard Worker     const Context &context,
6623*61046927SAndroid Build Coastguard Worker     IteratorType startIterator,
6624*61046927SAndroid Build Coastguard Worker     IteratorType endIterator,
6625*61046927SAndroid Build Coastguard Worker     bool readOnly,
6626*61046927SAndroid Build Coastguard Worker     bool useHostPtr,
6627*61046927SAndroid Build Coastguard Worker     cl_int* err)
6628*61046927SAndroid Build Coastguard Worker {
6629*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6630*61046927SAndroid Build Coastguard Worker     cl_int error;
6631*61046927SAndroid Build Coastguard Worker 
6632*61046927SAndroid Build Coastguard Worker     cl_mem_flags flags = 0;
6633*61046927SAndroid Build Coastguard Worker     if( readOnly ) {
6634*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_ONLY;
6635*61046927SAndroid Build Coastguard Worker     }
6636*61046927SAndroid Build Coastguard Worker     else {
6637*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_WRITE;
6638*61046927SAndroid Build Coastguard Worker     }
6639*61046927SAndroid Build Coastguard Worker     if( useHostPtr ) {
6640*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_USE_HOST_PTR;
6641*61046927SAndroid Build Coastguard Worker     }
6642*61046927SAndroid Build Coastguard Worker 
6643*61046927SAndroid Build Coastguard Worker     ::size_t size = sizeof(DataType)*(endIterator - startIterator);
6644*61046927SAndroid Build Coastguard Worker 
6645*61046927SAndroid Build Coastguard Worker     if( useHostPtr ) {
6646*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
6647*61046927SAndroid Build Coastguard Worker     } else {
6648*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
6649*61046927SAndroid Build Coastguard Worker     }
6650*61046927SAndroid Build Coastguard Worker 
6651*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_BUFFER_ERR);
6652*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
6653*61046927SAndroid Build Coastguard Worker         *err = error;
6654*61046927SAndroid Build Coastguard Worker     }
6655*61046927SAndroid Build Coastguard Worker 
6656*61046927SAndroid Build Coastguard Worker     if( !useHostPtr ) {
6657*61046927SAndroid Build Coastguard Worker         CommandQueue queue(context, 0, &error);
6658*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
6659*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6660*61046927SAndroid Build Coastguard Worker             *err = error;
6661*61046927SAndroid Build Coastguard Worker         }
6662*61046927SAndroid Build Coastguard Worker 
6663*61046927SAndroid Build Coastguard Worker         error = cl::copy(queue, startIterator, endIterator, *this);
6664*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
6665*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6666*61046927SAndroid Build Coastguard Worker             *err = error;
6667*61046927SAndroid Build Coastguard Worker         }
6668*61046927SAndroid Build Coastguard Worker     }
6669*61046927SAndroid Build Coastguard Worker }
6670*61046927SAndroid Build Coastguard Worker 
6671*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
Buffer(const CommandQueue & queue,IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr,cl_int * err)6672*61046927SAndroid Build Coastguard Worker Buffer::Buffer(
6673*61046927SAndroid Build Coastguard Worker     const CommandQueue &queue,
6674*61046927SAndroid Build Coastguard Worker     IteratorType startIterator,
6675*61046927SAndroid Build Coastguard Worker     IteratorType endIterator,
6676*61046927SAndroid Build Coastguard Worker     bool readOnly,
6677*61046927SAndroid Build Coastguard Worker     bool useHostPtr,
6678*61046927SAndroid Build Coastguard Worker     cl_int* err)
6679*61046927SAndroid Build Coastguard Worker {
6680*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6681*61046927SAndroid Build Coastguard Worker     cl_int error;
6682*61046927SAndroid Build Coastguard Worker 
6683*61046927SAndroid Build Coastguard Worker     cl_mem_flags flags = 0;
6684*61046927SAndroid Build Coastguard Worker     if (readOnly) {
6685*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_ONLY;
6686*61046927SAndroid Build Coastguard Worker     }
6687*61046927SAndroid Build Coastguard Worker     else {
6688*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_WRITE;
6689*61046927SAndroid Build Coastguard Worker     }
6690*61046927SAndroid Build Coastguard Worker     if (useHostPtr) {
6691*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_USE_HOST_PTR;
6692*61046927SAndroid Build Coastguard Worker     }
6693*61046927SAndroid Build Coastguard Worker 
6694*61046927SAndroid Build Coastguard Worker     ::size_t size = sizeof(DataType)*(endIterator - startIterator);
6695*61046927SAndroid Build Coastguard Worker 
6696*61046927SAndroid Build Coastguard Worker     Context context = queue.getInfo<CL_QUEUE_CONTEXT>();
6697*61046927SAndroid Build Coastguard Worker 
6698*61046927SAndroid Build Coastguard Worker     if (useHostPtr) {
6699*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
6700*61046927SAndroid Build Coastguard Worker     }
6701*61046927SAndroid Build Coastguard Worker     else {
6702*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
6703*61046927SAndroid Build Coastguard Worker     }
6704*61046927SAndroid Build Coastguard Worker 
6705*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_BUFFER_ERR);
6706*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
6707*61046927SAndroid Build Coastguard Worker         *err = error;
6708*61046927SAndroid Build Coastguard Worker     }
6709*61046927SAndroid Build Coastguard Worker 
6710*61046927SAndroid Build Coastguard Worker     if (!useHostPtr) {
6711*61046927SAndroid Build Coastguard Worker         error = cl::copy(queue, startIterator, endIterator, *this);
6712*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
6713*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6714*61046927SAndroid Build Coastguard Worker             *err = error;
6715*61046927SAndroid Build Coastguard Worker         }
6716*61046927SAndroid Build Coastguard Worker     }
6717*61046927SAndroid Build Coastguard Worker }
6718*61046927SAndroid Build Coastguard Worker 
enqueueReadBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6719*61046927SAndroid Build Coastguard Worker inline cl_int enqueueReadBuffer(
6720*61046927SAndroid Build Coastguard Worker     const Buffer& buffer,
6721*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
6722*61046927SAndroid Build Coastguard Worker     ::size_t offset,
6723*61046927SAndroid Build Coastguard Worker     ::size_t size,
6724*61046927SAndroid Build Coastguard Worker     void* ptr,
6725*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
6726*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
6727*61046927SAndroid Build Coastguard Worker {
6728*61046927SAndroid Build Coastguard Worker     cl_int error;
6729*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6730*61046927SAndroid Build Coastguard Worker 
6731*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
6732*61046927SAndroid Build Coastguard Worker         return error;
6733*61046927SAndroid Build Coastguard Worker     }
6734*61046927SAndroid Build Coastguard Worker 
6735*61046927SAndroid Build Coastguard Worker     return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event);
6736*61046927SAndroid Build Coastguard Worker }
6737*61046927SAndroid Build Coastguard Worker 
enqueueWriteBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6738*61046927SAndroid Build Coastguard Worker inline cl_int enqueueWriteBuffer(
6739*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
6740*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
6741*61046927SAndroid Build Coastguard Worker         ::size_t offset,
6742*61046927SAndroid Build Coastguard Worker         ::size_t size,
6743*61046927SAndroid Build Coastguard Worker         const void* ptr,
6744*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6745*61046927SAndroid Build Coastguard Worker         Event* event = NULL)
6746*61046927SAndroid Build Coastguard Worker {
6747*61046927SAndroid Build Coastguard Worker     cl_int error;
6748*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6749*61046927SAndroid Build Coastguard Worker 
6750*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
6751*61046927SAndroid Build Coastguard Worker         return error;
6752*61046927SAndroid Build Coastguard Worker     }
6753*61046927SAndroid Build Coastguard Worker 
6754*61046927SAndroid Build Coastguard Worker     return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event);
6755*61046927SAndroid Build Coastguard Worker }
6756*61046927SAndroid Build Coastguard Worker 
enqueueMapBuffer(const Buffer & buffer,cl_bool blocking,cl_map_flags flags,::size_t offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL)6757*61046927SAndroid Build Coastguard Worker inline void* enqueueMapBuffer(
6758*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
6759*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
6760*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
6761*61046927SAndroid Build Coastguard Worker         ::size_t offset,
6762*61046927SAndroid Build Coastguard Worker         ::size_t size,
6763*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6764*61046927SAndroid Build Coastguard Worker         Event* event = NULL,
6765*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6766*61046927SAndroid Build Coastguard Worker {
6767*61046927SAndroid Build Coastguard Worker     cl_int error;
6768*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6769*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6770*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
6771*61046927SAndroid Build Coastguard Worker         *err = error;
6772*61046927SAndroid Build Coastguard Worker     }
6773*61046927SAndroid Build Coastguard Worker 
6774*61046927SAndroid Build Coastguard Worker     void * result = ::clEnqueueMapBuffer(
6775*61046927SAndroid Build Coastguard Worker             queue(), buffer(), blocking, flags, offset, size,
6776*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
6777*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6778*61046927SAndroid Build Coastguard Worker             (cl_event*) event,
6779*61046927SAndroid Build Coastguard Worker             &error);
6780*61046927SAndroid Build Coastguard Worker 
6781*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6782*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
6783*61046927SAndroid Build Coastguard Worker         *err = error;
6784*61046927SAndroid Build Coastguard Worker     }
6785*61046927SAndroid Build Coastguard Worker     return result;
6786*61046927SAndroid Build Coastguard Worker }
6787*61046927SAndroid Build Coastguard Worker 
enqueueUnmapMemObject(const Memory & memory,void * mapped_ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6788*61046927SAndroid Build Coastguard Worker inline cl_int enqueueUnmapMemObject(
6789*61046927SAndroid Build Coastguard Worker     const Memory& memory,
6790*61046927SAndroid Build Coastguard Worker     void* mapped_ptr,
6791*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
6792*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
6793*61046927SAndroid Build Coastguard Worker {
6794*61046927SAndroid Build Coastguard Worker     cl_int error;
6795*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6796*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6797*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
6798*61046927SAndroid Build Coastguard Worker         return error;
6799*61046927SAndroid Build Coastguard Worker     }
6800*61046927SAndroid Build Coastguard Worker 
6801*61046927SAndroid Build Coastguard Worker     cl_event tmp;
6802*61046927SAndroid Build Coastguard Worker     cl_int err = detail::errHandler(
6803*61046927SAndroid Build Coastguard Worker         ::clEnqueueUnmapMemObject(
6804*61046927SAndroid Build Coastguard Worker             queue(), memory(), mapped_ptr,
6805*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
6806*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6807*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
6808*61046927SAndroid Build Coastguard Worker         __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6809*61046927SAndroid Build Coastguard Worker 
6810*61046927SAndroid Build Coastguard Worker     if (event != NULL && err == CL_SUCCESS)
6811*61046927SAndroid Build Coastguard Worker         *event = tmp;
6812*61046927SAndroid Build Coastguard Worker 
6813*61046927SAndroid Build Coastguard Worker     return err;
6814*61046927SAndroid Build Coastguard Worker }
6815*61046927SAndroid Build Coastguard Worker 
enqueueCopyBuffer(const Buffer & src,const Buffer & dst,::size_t src_offset,::size_t dst_offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6816*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyBuffer(
6817*61046927SAndroid Build Coastguard Worker         const Buffer& src,
6818*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
6819*61046927SAndroid Build Coastguard Worker         ::size_t src_offset,
6820*61046927SAndroid Build Coastguard Worker         ::size_t dst_offset,
6821*61046927SAndroid Build Coastguard Worker         ::size_t size,
6822*61046927SAndroid Build Coastguard Worker         const VECTOR_CLASS<Event>* events = NULL,
6823*61046927SAndroid Build Coastguard Worker         Event* event = NULL)
6824*61046927SAndroid Build Coastguard Worker {
6825*61046927SAndroid Build Coastguard Worker     cl_int error;
6826*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6827*61046927SAndroid Build Coastguard Worker 
6828*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
6829*61046927SAndroid Build Coastguard Worker         return error;
6830*61046927SAndroid Build Coastguard Worker     }
6831*61046927SAndroid Build Coastguard Worker 
6832*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event);
6833*61046927SAndroid Build Coastguard Worker }
6834*61046927SAndroid Build Coastguard Worker 
6835*61046927SAndroid Build Coastguard Worker /**
6836*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
6837*61046927SAndroid Build Coastguard Worker  * Host to Device.
6838*61046927SAndroid Build Coastguard Worker  * Uses default command queue.
6839*61046927SAndroid Build Coastguard Worker  */
6840*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(IteratorType startIterator,IteratorType endIterator,cl::Buffer & buffer)6841*61046927SAndroid Build Coastguard Worker inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
6842*61046927SAndroid Build Coastguard Worker {
6843*61046927SAndroid Build Coastguard Worker     cl_int error;
6844*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6845*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS)
6846*61046927SAndroid Build Coastguard Worker         return error;
6847*61046927SAndroid Build Coastguard Worker 
6848*61046927SAndroid Build Coastguard Worker     return cl::copy(queue, startIterator, endIterator, buffer);
6849*61046927SAndroid Build Coastguard Worker }
6850*61046927SAndroid Build Coastguard Worker 
6851*61046927SAndroid Build Coastguard Worker /**
6852*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
6853*61046927SAndroid Build Coastguard Worker  * Device to Host.
6854*61046927SAndroid Build Coastguard Worker  * Uses default command queue.
6855*61046927SAndroid Build Coastguard Worker  */
6856*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(const cl::Buffer & buffer,IteratorType startIterator,IteratorType endIterator)6857*61046927SAndroid Build Coastguard Worker inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
6858*61046927SAndroid Build Coastguard Worker {
6859*61046927SAndroid Build Coastguard Worker     cl_int error;
6860*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6861*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS)
6862*61046927SAndroid Build Coastguard Worker         return error;
6863*61046927SAndroid Build Coastguard Worker 
6864*61046927SAndroid Build Coastguard Worker     return cl::copy(queue, buffer, startIterator, endIterator);
6865*61046927SAndroid Build Coastguard Worker }
6866*61046927SAndroid Build Coastguard Worker 
6867*61046927SAndroid Build Coastguard Worker /**
6868*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
6869*61046927SAndroid Build Coastguard Worker  * Host to Device.
6870*61046927SAndroid Build Coastguard Worker  * Uses specified queue.
6871*61046927SAndroid Build Coastguard Worker  */
6872*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(const CommandQueue & queue,IteratorType startIterator,IteratorType endIterator,cl::Buffer & buffer)6873*61046927SAndroid Build Coastguard Worker inline cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
6874*61046927SAndroid Build Coastguard Worker {
6875*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6876*61046927SAndroid Build Coastguard Worker     cl_int error;
6877*61046927SAndroid Build Coastguard Worker 
6878*61046927SAndroid Build Coastguard Worker     ::size_t length = endIterator-startIterator;
6879*61046927SAndroid Build Coastguard Worker     ::size_t byteLength = length*sizeof(DataType);
6880*61046927SAndroid Build Coastguard Worker 
6881*61046927SAndroid Build Coastguard Worker     DataType *pointer =
6882*61046927SAndroid Build Coastguard Worker         static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));
6883*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueMapBuffer will throw
6884*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
6885*61046927SAndroid Build Coastguard Worker         return error;
6886*61046927SAndroid Build Coastguard Worker     }
6887*61046927SAndroid Build Coastguard Worker #if defined(_MSC_VER)
6888*61046927SAndroid Build Coastguard Worker     std::copy(
6889*61046927SAndroid Build Coastguard Worker         startIterator,
6890*61046927SAndroid Build Coastguard Worker         endIterator,
6891*61046927SAndroid Build Coastguard Worker         stdext::checked_array_iterator<DataType*>(
6892*61046927SAndroid Build Coastguard Worker             pointer, length));
6893*61046927SAndroid Build Coastguard Worker #else
6894*61046927SAndroid Build Coastguard Worker     std::copy(startIterator, endIterator, pointer);
6895*61046927SAndroid Build Coastguard Worker #endif
6896*61046927SAndroid Build Coastguard Worker     Event endEvent;
6897*61046927SAndroid Build Coastguard Worker     error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
6898*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueUnmapMemObject will throw
6899*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
6900*61046927SAndroid Build Coastguard Worker         return error;
6901*61046927SAndroid Build Coastguard Worker     }
6902*61046927SAndroid Build Coastguard Worker     endEvent.wait();
6903*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
6904*61046927SAndroid Build Coastguard Worker }
6905*61046927SAndroid Build Coastguard Worker 
6906*61046927SAndroid Build Coastguard Worker /**
6907*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
6908*61046927SAndroid Build Coastguard Worker  * Device to Host.
6909*61046927SAndroid Build Coastguard Worker  * Uses specified queue.
6910*61046927SAndroid Build Coastguard Worker  */
6911*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(const CommandQueue & queue,const cl::Buffer & buffer,IteratorType startIterator,IteratorType endIterator)6912*61046927SAndroid Build Coastguard Worker inline cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
6913*61046927SAndroid Build Coastguard Worker {
6914*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6915*61046927SAndroid Build Coastguard Worker     cl_int error;
6916*61046927SAndroid Build Coastguard Worker 
6917*61046927SAndroid Build Coastguard Worker     ::size_t length = endIterator-startIterator;
6918*61046927SAndroid Build Coastguard Worker     ::size_t byteLength = length*sizeof(DataType);
6919*61046927SAndroid Build Coastguard Worker 
6920*61046927SAndroid Build Coastguard Worker     DataType *pointer =
6921*61046927SAndroid Build Coastguard Worker         static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));
6922*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueMapBuffer will throw
6923*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
6924*61046927SAndroid Build Coastguard Worker         return error;
6925*61046927SAndroid Build Coastguard Worker     }
6926*61046927SAndroid Build Coastguard Worker     std::copy(pointer, pointer + length, startIterator);
6927*61046927SAndroid Build Coastguard Worker     Event endEvent;
6928*61046927SAndroid Build Coastguard Worker     error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
6929*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueUnmapMemObject will throw
6930*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
6931*61046927SAndroid Build Coastguard Worker         return error;
6932*61046927SAndroid Build Coastguard Worker     }
6933*61046927SAndroid Build Coastguard Worker     endEvent.wait();
6934*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
6935*61046927SAndroid Build Coastguard Worker }
6936*61046927SAndroid Build Coastguard Worker 
6937*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
enqueueReadBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6938*61046927SAndroid Build Coastguard Worker inline cl_int enqueueReadBufferRect(
6939*61046927SAndroid Build Coastguard Worker     const Buffer& buffer,
6940*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
6941*61046927SAndroid Build Coastguard Worker     const size_t<3>& buffer_offset,
6942*61046927SAndroid Build Coastguard Worker     const size_t<3>& host_offset,
6943*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
6944*61046927SAndroid Build Coastguard Worker     ::size_t buffer_row_pitch,
6945*61046927SAndroid Build Coastguard Worker     ::size_t buffer_slice_pitch,
6946*61046927SAndroid Build Coastguard Worker     ::size_t host_row_pitch,
6947*61046927SAndroid Build Coastguard Worker     ::size_t host_slice_pitch,
6948*61046927SAndroid Build Coastguard Worker     void *ptr,
6949*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
6950*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
6951*61046927SAndroid Build Coastguard Worker {
6952*61046927SAndroid Build Coastguard Worker     cl_int error;
6953*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6954*61046927SAndroid Build Coastguard Worker 
6955*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
6956*61046927SAndroid Build Coastguard Worker         return error;
6957*61046927SAndroid Build Coastguard Worker     }
6958*61046927SAndroid Build Coastguard Worker 
6959*61046927SAndroid Build Coastguard Worker     return queue.enqueueReadBufferRect(
6960*61046927SAndroid Build Coastguard Worker         buffer,
6961*61046927SAndroid Build Coastguard Worker         blocking,
6962*61046927SAndroid Build Coastguard Worker         buffer_offset,
6963*61046927SAndroid Build Coastguard Worker         host_offset,
6964*61046927SAndroid Build Coastguard Worker         region,
6965*61046927SAndroid Build Coastguard Worker         buffer_row_pitch,
6966*61046927SAndroid Build Coastguard Worker         buffer_slice_pitch,
6967*61046927SAndroid Build Coastguard Worker         host_row_pitch,
6968*61046927SAndroid Build Coastguard Worker         host_slice_pitch,
6969*61046927SAndroid Build Coastguard Worker         ptr,
6970*61046927SAndroid Build Coastguard Worker         events,
6971*61046927SAndroid Build Coastguard Worker         event);
6972*61046927SAndroid Build Coastguard Worker }
6973*61046927SAndroid Build Coastguard Worker 
enqueueWriteBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6974*61046927SAndroid Build Coastguard Worker inline cl_int enqueueWriteBufferRect(
6975*61046927SAndroid Build Coastguard Worker     const Buffer& buffer,
6976*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
6977*61046927SAndroid Build Coastguard Worker     const size_t<3>& buffer_offset,
6978*61046927SAndroid Build Coastguard Worker     const size_t<3>& host_offset,
6979*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
6980*61046927SAndroid Build Coastguard Worker     ::size_t buffer_row_pitch,
6981*61046927SAndroid Build Coastguard Worker     ::size_t buffer_slice_pitch,
6982*61046927SAndroid Build Coastguard Worker     ::size_t host_row_pitch,
6983*61046927SAndroid Build Coastguard Worker     ::size_t host_slice_pitch,
6984*61046927SAndroid Build Coastguard Worker     const void *ptr,
6985*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
6986*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
6987*61046927SAndroid Build Coastguard Worker {
6988*61046927SAndroid Build Coastguard Worker     cl_int error;
6989*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
6990*61046927SAndroid Build Coastguard Worker 
6991*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
6992*61046927SAndroid Build Coastguard Worker         return error;
6993*61046927SAndroid Build Coastguard Worker     }
6994*61046927SAndroid Build Coastguard Worker 
6995*61046927SAndroid Build Coastguard Worker     return queue.enqueueWriteBufferRect(
6996*61046927SAndroid Build Coastguard Worker         buffer,
6997*61046927SAndroid Build Coastguard Worker         blocking,
6998*61046927SAndroid Build Coastguard Worker         buffer_offset,
6999*61046927SAndroid Build Coastguard Worker         host_offset,
7000*61046927SAndroid Build Coastguard Worker         region,
7001*61046927SAndroid Build Coastguard Worker         buffer_row_pitch,
7002*61046927SAndroid Build Coastguard Worker         buffer_slice_pitch,
7003*61046927SAndroid Build Coastguard Worker         host_row_pitch,
7004*61046927SAndroid Build Coastguard Worker         host_slice_pitch,
7005*61046927SAndroid Build Coastguard Worker         ptr,
7006*61046927SAndroid Build Coastguard Worker         events,
7007*61046927SAndroid Build Coastguard Worker         event);
7008*61046927SAndroid Build Coastguard Worker }
7009*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferRect(const Buffer & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,::size_t src_row_pitch,::size_t src_slice_pitch,::size_t dst_row_pitch,::size_t dst_slice_pitch,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7010*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyBufferRect(
7011*61046927SAndroid Build Coastguard Worker     const Buffer& src,
7012*61046927SAndroid Build Coastguard Worker     const Buffer& dst,
7013*61046927SAndroid Build Coastguard Worker     const size_t<3>& src_origin,
7014*61046927SAndroid Build Coastguard Worker     const size_t<3>& dst_origin,
7015*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
7016*61046927SAndroid Build Coastguard Worker     ::size_t src_row_pitch,
7017*61046927SAndroid Build Coastguard Worker     ::size_t src_slice_pitch,
7018*61046927SAndroid Build Coastguard Worker     ::size_t dst_row_pitch,
7019*61046927SAndroid Build Coastguard Worker     ::size_t dst_slice_pitch,
7020*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
7021*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
7022*61046927SAndroid Build Coastguard Worker {
7023*61046927SAndroid Build Coastguard Worker     cl_int error;
7024*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7025*61046927SAndroid Build Coastguard Worker 
7026*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7027*61046927SAndroid Build Coastguard Worker         return error;
7028*61046927SAndroid Build Coastguard Worker     }
7029*61046927SAndroid Build Coastguard Worker 
7030*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyBufferRect(
7031*61046927SAndroid Build Coastguard Worker         src,
7032*61046927SAndroid Build Coastguard Worker         dst,
7033*61046927SAndroid Build Coastguard Worker         src_origin,
7034*61046927SAndroid Build Coastguard Worker         dst_origin,
7035*61046927SAndroid Build Coastguard Worker         region,
7036*61046927SAndroid Build Coastguard Worker         src_row_pitch,
7037*61046927SAndroid Build Coastguard Worker         src_slice_pitch,
7038*61046927SAndroid Build Coastguard Worker         dst_row_pitch,
7039*61046927SAndroid Build Coastguard Worker         dst_slice_pitch,
7040*61046927SAndroid Build Coastguard Worker         events,
7041*61046927SAndroid Build Coastguard Worker         event);
7042*61046927SAndroid Build Coastguard Worker }
7043*61046927SAndroid Build Coastguard Worker #endif
7044*61046927SAndroid Build Coastguard Worker 
enqueueReadImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7045*61046927SAndroid Build Coastguard Worker inline cl_int enqueueReadImage(
7046*61046927SAndroid Build Coastguard Worker     const Image& image,
7047*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
7048*61046927SAndroid Build Coastguard Worker     const size_t<3>& origin,
7049*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
7050*61046927SAndroid Build Coastguard Worker     ::size_t row_pitch,
7051*61046927SAndroid Build Coastguard Worker     ::size_t slice_pitch,
7052*61046927SAndroid Build Coastguard Worker     void* ptr,
7053*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
7054*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
7055*61046927SAndroid Build Coastguard Worker {
7056*61046927SAndroid Build Coastguard Worker     cl_int error;
7057*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7058*61046927SAndroid Build Coastguard Worker 
7059*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7060*61046927SAndroid Build Coastguard Worker         return error;
7061*61046927SAndroid Build Coastguard Worker     }
7062*61046927SAndroid Build Coastguard Worker 
7063*61046927SAndroid Build Coastguard Worker     return queue.enqueueReadImage(
7064*61046927SAndroid Build Coastguard Worker         image,
7065*61046927SAndroid Build Coastguard Worker         blocking,
7066*61046927SAndroid Build Coastguard Worker         origin,
7067*61046927SAndroid Build Coastguard Worker         region,
7068*61046927SAndroid Build Coastguard Worker         row_pitch,
7069*61046927SAndroid Build Coastguard Worker         slice_pitch,
7070*61046927SAndroid Build Coastguard Worker         ptr,
7071*61046927SAndroid Build Coastguard Worker         events,
7072*61046927SAndroid Build Coastguard Worker         event);
7073*61046927SAndroid Build Coastguard Worker }
7074*61046927SAndroid Build Coastguard Worker 
enqueueWriteImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7075*61046927SAndroid Build Coastguard Worker inline cl_int enqueueWriteImage(
7076*61046927SAndroid Build Coastguard Worker     const Image& image,
7077*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
7078*61046927SAndroid Build Coastguard Worker     const size_t<3>& origin,
7079*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
7080*61046927SAndroid Build Coastguard Worker     ::size_t row_pitch,
7081*61046927SAndroid Build Coastguard Worker     ::size_t slice_pitch,
7082*61046927SAndroid Build Coastguard Worker     const void* ptr,
7083*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
7084*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
7085*61046927SAndroid Build Coastguard Worker {
7086*61046927SAndroid Build Coastguard Worker     cl_int error;
7087*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7088*61046927SAndroid Build Coastguard Worker 
7089*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7090*61046927SAndroid Build Coastguard Worker         return error;
7091*61046927SAndroid Build Coastguard Worker     }
7092*61046927SAndroid Build Coastguard Worker 
7093*61046927SAndroid Build Coastguard Worker     return queue.enqueueWriteImage(
7094*61046927SAndroid Build Coastguard Worker         image,
7095*61046927SAndroid Build Coastguard Worker         blocking,
7096*61046927SAndroid Build Coastguard Worker         origin,
7097*61046927SAndroid Build Coastguard Worker         region,
7098*61046927SAndroid Build Coastguard Worker         row_pitch,
7099*61046927SAndroid Build Coastguard Worker         slice_pitch,
7100*61046927SAndroid Build Coastguard Worker         ptr,
7101*61046927SAndroid Build Coastguard Worker         events,
7102*61046927SAndroid Build Coastguard Worker         event);
7103*61046927SAndroid Build Coastguard Worker }
7104*61046927SAndroid Build Coastguard Worker 
enqueueCopyImage(const Image & src,const Image & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7105*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyImage(
7106*61046927SAndroid Build Coastguard Worker     const Image& src,
7107*61046927SAndroid Build Coastguard Worker     const Image& dst,
7108*61046927SAndroid Build Coastguard Worker     const size_t<3>& src_origin,
7109*61046927SAndroid Build Coastguard Worker     const size_t<3>& dst_origin,
7110*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
7111*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
7112*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
7113*61046927SAndroid Build Coastguard Worker {
7114*61046927SAndroid Build Coastguard Worker     cl_int error;
7115*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7116*61046927SAndroid Build Coastguard Worker 
7117*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7118*61046927SAndroid Build Coastguard Worker         return error;
7119*61046927SAndroid Build Coastguard Worker     }
7120*61046927SAndroid Build Coastguard Worker 
7121*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyImage(
7122*61046927SAndroid Build Coastguard Worker         src,
7123*61046927SAndroid Build Coastguard Worker         dst,
7124*61046927SAndroid Build Coastguard Worker         src_origin,
7125*61046927SAndroid Build Coastguard Worker         dst_origin,
7126*61046927SAndroid Build Coastguard Worker         region,
7127*61046927SAndroid Build Coastguard Worker         events,
7128*61046927SAndroid Build Coastguard Worker         event);
7129*61046927SAndroid Build Coastguard Worker }
7130*61046927SAndroid Build Coastguard Worker 
enqueueCopyImageToBuffer(const Image & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & region,::size_t dst_offset,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7131*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyImageToBuffer(
7132*61046927SAndroid Build Coastguard Worker     const Image& src,
7133*61046927SAndroid Build Coastguard Worker     const Buffer& dst,
7134*61046927SAndroid Build Coastguard Worker     const size_t<3>& src_origin,
7135*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
7136*61046927SAndroid Build Coastguard Worker     ::size_t dst_offset,
7137*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
7138*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
7139*61046927SAndroid Build Coastguard Worker {
7140*61046927SAndroid Build Coastguard Worker     cl_int error;
7141*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7142*61046927SAndroid Build Coastguard Worker 
7143*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7144*61046927SAndroid Build Coastguard Worker         return error;
7145*61046927SAndroid Build Coastguard Worker     }
7146*61046927SAndroid Build Coastguard Worker 
7147*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyImageToBuffer(
7148*61046927SAndroid Build Coastguard Worker         src,
7149*61046927SAndroid Build Coastguard Worker         dst,
7150*61046927SAndroid Build Coastguard Worker         src_origin,
7151*61046927SAndroid Build Coastguard Worker         region,
7152*61046927SAndroid Build Coastguard Worker         dst_offset,
7153*61046927SAndroid Build Coastguard Worker         events,
7154*61046927SAndroid Build Coastguard Worker         event);
7155*61046927SAndroid Build Coastguard Worker }
7156*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferToImage(const Buffer & src,const Image & dst,::size_t src_offset,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7157*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyBufferToImage(
7158*61046927SAndroid Build Coastguard Worker     const Buffer& src,
7159*61046927SAndroid Build Coastguard Worker     const Image& dst,
7160*61046927SAndroid Build Coastguard Worker     ::size_t src_offset,
7161*61046927SAndroid Build Coastguard Worker     const size_t<3>& dst_origin,
7162*61046927SAndroid Build Coastguard Worker     const size_t<3>& region,
7163*61046927SAndroid Build Coastguard Worker     const VECTOR_CLASS<Event>* events = NULL,
7164*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
7165*61046927SAndroid Build Coastguard Worker {
7166*61046927SAndroid Build Coastguard Worker     cl_int error;
7167*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7168*61046927SAndroid Build Coastguard Worker 
7169*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7170*61046927SAndroid Build Coastguard Worker         return error;
7171*61046927SAndroid Build Coastguard Worker     }
7172*61046927SAndroid Build Coastguard Worker 
7173*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyBufferToImage(
7174*61046927SAndroid Build Coastguard Worker         src,
7175*61046927SAndroid Build Coastguard Worker         dst,
7176*61046927SAndroid Build Coastguard Worker         src_offset,
7177*61046927SAndroid Build Coastguard Worker         dst_origin,
7178*61046927SAndroid Build Coastguard Worker         region,
7179*61046927SAndroid Build Coastguard Worker         events,
7180*61046927SAndroid Build Coastguard Worker         event);
7181*61046927SAndroid Build Coastguard Worker }
7182*61046927SAndroid Build Coastguard Worker 
7183*61046927SAndroid Build Coastguard Worker 
flush(void)7184*61046927SAndroid Build Coastguard Worker inline cl_int flush(void)
7185*61046927SAndroid Build Coastguard Worker {
7186*61046927SAndroid Build Coastguard Worker     cl_int error;
7187*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7188*61046927SAndroid Build Coastguard Worker 
7189*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7190*61046927SAndroid Build Coastguard Worker         return error;
7191*61046927SAndroid Build Coastguard Worker     }
7192*61046927SAndroid Build Coastguard Worker 
7193*61046927SAndroid Build Coastguard Worker     return queue.flush();
7194*61046927SAndroid Build Coastguard Worker }
7195*61046927SAndroid Build Coastguard Worker 
finish(void)7196*61046927SAndroid Build Coastguard Worker inline cl_int finish(void)
7197*61046927SAndroid Build Coastguard Worker {
7198*61046927SAndroid Build Coastguard Worker     cl_int error;
7199*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
7200*61046927SAndroid Build Coastguard Worker 
7201*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
7202*61046927SAndroid Build Coastguard Worker         return error;
7203*61046927SAndroid Build Coastguard Worker     }
7204*61046927SAndroid Build Coastguard Worker 
7205*61046927SAndroid Build Coastguard Worker 
7206*61046927SAndroid Build Coastguard Worker     return queue.finish();
7207*61046927SAndroid Build Coastguard Worker }
7208*61046927SAndroid Build Coastguard Worker 
7209*61046927SAndroid Build Coastguard Worker // Kernel Functor support
7210*61046927SAndroid Build Coastguard Worker // New interface as of September 2011
7211*61046927SAndroid Build Coastguard Worker // Requires the C++11 std::tr1::function (note do not support TR1)
7212*61046927SAndroid Build Coastguard Worker // Visual Studio 2010 and GCC 4.2
7213*61046927SAndroid Build Coastguard Worker 
7214*61046927SAndroid Build Coastguard Worker struct EnqueueArgs
7215*61046927SAndroid Build Coastguard Worker {
7216*61046927SAndroid Build Coastguard Worker     CommandQueue queue_;
7217*61046927SAndroid Build Coastguard Worker     const NDRange offset_;
7218*61046927SAndroid Build Coastguard Worker     const NDRange global_;
7219*61046927SAndroid Build Coastguard Worker     const NDRange local_;
7220*61046927SAndroid Build Coastguard Worker     VECTOR_CLASS<Event> events_;
7221*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7222*61046927SAndroid Build Coastguard Worker     EnqueueArgs(NDRange global) :
7223*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7224*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7225*61046927SAndroid Build Coastguard Worker       global_(global),
7226*61046927SAndroid Build Coastguard Worker       local_(NullRange)
7227*61046927SAndroid Build Coastguard Worker     {
7228*61046927SAndroid Build Coastguard Worker 
7229*61046927SAndroid Build Coastguard Worker     }
7230*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7231*61046927SAndroid Build Coastguard Worker     EnqueueArgs(NDRange global, NDRange local) :
7232*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7233*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7234*61046927SAndroid Build Coastguard Worker       global_(global),
7235*61046927SAndroid Build Coastguard Worker       local_(local)
7236*61046927SAndroid Build Coastguard Worker     {
7237*61046927SAndroid Build Coastguard Worker 
7238*61046927SAndroid Build Coastguard Worker     }
7239*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7240*61046927SAndroid Build Coastguard Worker     EnqueueArgs(NDRange offset, NDRange global, NDRange local) :
7241*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7242*61046927SAndroid Build Coastguard Worker       offset_(offset),
7243*61046927SAndroid Build Coastguard Worker       global_(global),
7244*61046927SAndroid Build Coastguard Worker       local_(local)
7245*61046927SAndroid Build Coastguard Worker     {
7246*61046927SAndroid Build Coastguard Worker 
7247*61046927SAndroid Build Coastguard Worker     }
7248*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7249*61046927SAndroid Build Coastguard Worker     EnqueueArgs(Event e, NDRange global) :
7250*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7251*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7252*61046927SAndroid Build Coastguard Worker       global_(global),
7253*61046927SAndroid Build Coastguard Worker       local_(NullRange)
7254*61046927SAndroid Build Coastguard Worker     {
7255*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
7256*61046927SAndroid Build Coastguard Worker     }
7257*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7258*61046927SAndroid Build Coastguard Worker     EnqueueArgs(Event e, NDRange global, NDRange local) :
7259*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7260*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7261*61046927SAndroid Build Coastguard Worker       global_(global),
7262*61046927SAndroid Build Coastguard Worker       local_(local)
7263*61046927SAndroid Build Coastguard Worker     {
7264*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
7265*61046927SAndroid Build Coastguard Worker     }
7266*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7267*61046927SAndroid Build Coastguard Worker     EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) :
7268*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7269*61046927SAndroid Build Coastguard Worker       offset_(offset),
7270*61046927SAndroid Build Coastguard Worker       global_(global),
7271*61046927SAndroid Build Coastguard Worker       local_(local)
7272*61046927SAndroid Build Coastguard Worker     {
7273*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
7274*61046927SAndroid Build Coastguard Worker     }
7275*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7276*61046927SAndroid Build Coastguard Worker     EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global) :
7277*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7278*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7279*61046927SAndroid Build Coastguard Worker       global_(global),
7280*61046927SAndroid Build Coastguard Worker       local_(NullRange),
7281*61046927SAndroid Build Coastguard Worker       events_(events)
7282*61046927SAndroid Build Coastguard Worker     {
7283*61046927SAndroid Build Coastguard Worker 
7284*61046927SAndroid Build Coastguard Worker     }
7285*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7286*61046927SAndroid Build Coastguard Worker     EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
7287*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7288*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7289*61046927SAndroid Build Coastguard Worker       global_(global),
7290*61046927SAndroid Build Coastguard Worker       local_(local),
7291*61046927SAndroid Build Coastguard Worker       events_(events)
7292*61046927SAndroid Build Coastguard Worker     {
7293*61046927SAndroid Build Coastguard Worker 
7294*61046927SAndroid Build Coastguard Worker     }
7295*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7296*61046927SAndroid Build Coastguard Worker     EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
7297*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
7298*61046927SAndroid Build Coastguard Worker       offset_(offset),
7299*61046927SAndroid Build Coastguard Worker       global_(global),
7300*61046927SAndroid Build Coastguard Worker       local_(local),
7301*61046927SAndroid Build Coastguard Worker       events_(events)
7302*61046927SAndroid Build Coastguard Worker     {
7303*61046927SAndroid Build Coastguard Worker 
7304*61046927SAndroid Build Coastguard Worker     }
7305*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7306*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, NDRange global) :
7307*61046927SAndroid Build Coastguard Worker       queue_(queue),
7308*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7309*61046927SAndroid Build Coastguard Worker       global_(global),
7310*61046927SAndroid Build Coastguard Worker       local_(NullRange)
7311*61046927SAndroid Build Coastguard Worker     {
7312*61046927SAndroid Build Coastguard Worker 
7313*61046927SAndroid Build Coastguard Worker     }
7314*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7315*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) :
7316*61046927SAndroid Build Coastguard Worker       queue_(queue),
7317*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7318*61046927SAndroid Build Coastguard Worker       global_(global),
7319*61046927SAndroid Build Coastguard Worker       local_(local)
7320*61046927SAndroid Build Coastguard Worker     {
7321*61046927SAndroid Build Coastguard Worker 
7322*61046927SAndroid Build Coastguard Worker     }
7323*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7324*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) :
7325*61046927SAndroid Build Coastguard Worker       queue_(queue),
7326*61046927SAndroid Build Coastguard Worker       offset_(offset),
7327*61046927SAndroid Build Coastguard Worker       global_(global),
7328*61046927SAndroid Build Coastguard Worker       local_(local)
7329*61046927SAndroid Build Coastguard Worker     {
7330*61046927SAndroid Build Coastguard Worker 
7331*61046927SAndroid Build Coastguard Worker     }
7332*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7333*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, Event e, NDRange global) :
7334*61046927SAndroid Build Coastguard Worker       queue_(queue),
7335*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7336*61046927SAndroid Build Coastguard Worker       global_(global),
7337*61046927SAndroid Build Coastguard Worker       local_(NullRange)
7338*61046927SAndroid Build Coastguard Worker     {
7339*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
7340*61046927SAndroid Build Coastguard Worker     }
7341*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7342*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) :
7343*61046927SAndroid Build Coastguard Worker       queue_(queue),
7344*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7345*61046927SAndroid Build Coastguard Worker       global_(global),
7346*61046927SAndroid Build Coastguard Worker       local_(local)
7347*61046927SAndroid Build Coastguard Worker     {
7348*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
7349*61046927SAndroid Build Coastguard Worker     }
7350*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7351*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) :
7352*61046927SAndroid Build Coastguard Worker       queue_(queue),
7353*61046927SAndroid Build Coastguard Worker       offset_(offset),
7354*61046927SAndroid Build Coastguard Worker       global_(global),
7355*61046927SAndroid Build Coastguard Worker       local_(local)
7356*61046927SAndroid Build Coastguard Worker     {
7357*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
7358*61046927SAndroid Build Coastguard Worker     }
7359*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7360*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global) :
7361*61046927SAndroid Build Coastguard Worker       queue_(queue),
7362*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7363*61046927SAndroid Build Coastguard Worker       global_(global),
7364*61046927SAndroid Build Coastguard Worker       local_(NullRange),
7365*61046927SAndroid Build Coastguard Worker       events_(events)
7366*61046927SAndroid Build Coastguard Worker     {
7367*61046927SAndroid Build Coastguard Worker 
7368*61046927SAndroid Build Coastguard Worker     }
7369*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7370*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
7371*61046927SAndroid Build Coastguard Worker       queue_(queue),
7372*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
7373*61046927SAndroid Build Coastguard Worker       global_(global),
7374*61046927SAndroid Build Coastguard Worker       local_(local),
7375*61046927SAndroid Build Coastguard Worker       events_(events)
7376*61046927SAndroid Build Coastguard Worker     {
7377*61046927SAndroid Build Coastguard Worker 
7378*61046927SAndroid Build Coastguard Worker     }
7379*61046927SAndroid Build Coastguard Worker 
EnqueueArgscl::EnqueueArgs7380*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
7381*61046927SAndroid Build Coastguard Worker       queue_(queue),
7382*61046927SAndroid Build Coastguard Worker       offset_(offset),
7383*61046927SAndroid Build Coastguard Worker       global_(global),
7384*61046927SAndroid Build Coastguard Worker       local_(local),
7385*61046927SAndroid Build Coastguard Worker       events_(events)
7386*61046927SAndroid Build Coastguard Worker     {
7387*61046927SAndroid Build Coastguard Worker 
7388*61046927SAndroid Build Coastguard Worker     }
7389*61046927SAndroid Build Coastguard Worker };
7390*61046927SAndroid Build Coastguard Worker 
7391*61046927SAndroid Build Coastguard Worker namespace detail {
7392*61046927SAndroid Build Coastguard Worker 
7393*61046927SAndroid Build Coastguard Worker class NullType {};
7394*61046927SAndroid Build Coastguard Worker 
7395*61046927SAndroid Build Coastguard Worker template<int index, typename T0>
7396*61046927SAndroid Build Coastguard Worker struct SetArg
7397*61046927SAndroid Build Coastguard Worker {
setcl::detail::SetArg7398*61046927SAndroid Build Coastguard Worker     static void set (Kernel kernel, T0 arg)
7399*61046927SAndroid Build Coastguard Worker     {
7400*61046927SAndroid Build Coastguard Worker         kernel.setArg(index, arg);
7401*61046927SAndroid Build Coastguard Worker     }
7402*61046927SAndroid Build Coastguard Worker };
7403*61046927SAndroid Build Coastguard Worker 
7404*61046927SAndroid Build Coastguard Worker template<int index>
7405*61046927SAndroid Build Coastguard Worker struct SetArg<index, NullType>
7406*61046927SAndroid Build Coastguard Worker {
setcl::detail::SetArg7407*61046927SAndroid Build Coastguard Worker     static void set (Kernel, NullType)
7408*61046927SAndroid Build Coastguard Worker     {
7409*61046927SAndroid Build Coastguard Worker     }
7410*61046927SAndroid Build Coastguard Worker };
7411*61046927SAndroid Build Coastguard Worker 
7412*61046927SAndroid Build Coastguard Worker template <
7413*61046927SAndroid Build Coastguard Worker    typename T0,   typename T1,   typename T2,   typename T3,
7414*61046927SAndroid Build Coastguard Worker    typename T4,   typename T5,   typename T6,   typename T7,
7415*61046927SAndroid Build Coastguard Worker    typename T8,   typename T9,   typename T10,   typename T11,
7416*61046927SAndroid Build Coastguard Worker    typename T12,   typename T13,   typename T14,   typename T15,
7417*61046927SAndroid Build Coastguard Worker    typename T16,   typename T17,   typename T18,   typename T19,
7418*61046927SAndroid Build Coastguard Worker    typename T20,   typename T21,   typename T22,   typename T23,
7419*61046927SAndroid Build Coastguard Worker    typename T24,   typename T25,   typename T26,   typename T27,
7420*61046927SAndroid Build Coastguard Worker    typename T28,   typename T29,   typename T30,   typename T31
7421*61046927SAndroid Build Coastguard Worker >
7422*61046927SAndroid Build Coastguard Worker class KernelFunctorGlobal
7423*61046927SAndroid Build Coastguard Worker {
7424*61046927SAndroid Build Coastguard Worker private:
7425*61046927SAndroid Build Coastguard Worker     Kernel kernel_;
7426*61046927SAndroid Build Coastguard Worker 
7427*61046927SAndroid Build Coastguard Worker public:
KernelFunctorGlobal(Kernel kernel)7428*61046927SAndroid Build Coastguard Worker    KernelFunctorGlobal(
7429*61046927SAndroid Build Coastguard Worker         Kernel kernel) :
7430*61046927SAndroid Build Coastguard Worker             kernel_(kernel)
7431*61046927SAndroid Build Coastguard Worker     {}
7432*61046927SAndroid Build Coastguard Worker 
KernelFunctorGlobal(const Program & program,const STRING_CLASS name,cl_int * err=NULL)7433*61046927SAndroid Build Coastguard Worker    KernelFunctorGlobal(
7434*61046927SAndroid Build Coastguard Worker         const Program& program,
7435*61046927SAndroid Build Coastguard Worker         const STRING_CLASS name,
7436*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL) :
7437*61046927SAndroid Build Coastguard Worker             kernel_(program, name.c_str(), err)
7438*61046927SAndroid Build Coastguard Worker     {}
7439*61046927SAndroid Build Coastguard Worker 
operator ()(const EnqueueArgs & args,T0 t0,T1 t1=NullType (),T2 t2=NullType (),T3 t3=NullType (),T4 t4=NullType (),T5 t5=NullType (),T6 t6=NullType (),T7 t7=NullType (),T8 t8=NullType (),T9 t9=NullType (),T10 t10=NullType (),T11 t11=NullType (),T12 t12=NullType (),T13 t13=NullType (),T14 t14=NullType (),T15 t15=NullType (),T16 t16=NullType (),T17 t17=NullType (),T18 t18=NullType (),T19 t19=NullType (),T20 t20=NullType (),T21 t21=NullType (),T22 t22=NullType (),T23 t23=NullType (),T24 t24=NullType (),T25 t25=NullType (),T26 t26=NullType (),T27 t27=NullType (),T28 t28=NullType (),T29 t29=NullType (),T30 t30=NullType (),T31 t31=NullType ())7440*61046927SAndroid Build Coastguard Worker     Event operator() (
7441*61046927SAndroid Build Coastguard Worker         const EnqueueArgs& args,
7442*61046927SAndroid Build Coastguard Worker         T0 t0,
7443*61046927SAndroid Build Coastguard Worker         T1 t1 = NullType(),
7444*61046927SAndroid Build Coastguard Worker         T2 t2 = NullType(),
7445*61046927SAndroid Build Coastguard Worker         T3 t3 = NullType(),
7446*61046927SAndroid Build Coastguard Worker         T4 t4 = NullType(),
7447*61046927SAndroid Build Coastguard Worker         T5 t5 = NullType(),
7448*61046927SAndroid Build Coastguard Worker         T6 t6 = NullType(),
7449*61046927SAndroid Build Coastguard Worker         T7 t7 = NullType(),
7450*61046927SAndroid Build Coastguard Worker         T8 t8 = NullType(),
7451*61046927SAndroid Build Coastguard Worker         T9 t9 = NullType(),
7452*61046927SAndroid Build Coastguard Worker         T10 t10 = NullType(),
7453*61046927SAndroid Build Coastguard Worker         T11 t11 = NullType(),
7454*61046927SAndroid Build Coastguard Worker         T12 t12 = NullType(),
7455*61046927SAndroid Build Coastguard Worker         T13 t13 = NullType(),
7456*61046927SAndroid Build Coastguard Worker         T14 t14 = NullType(),
7457*61046927SAndroid Build Coastguard Worker         T15 t15 = NullType(),
7458*61046927SAndroid Build Coastguard Worker         T16 t16 = NullType(),
7459*61046927SAndroid Build Coastguard Worker         T17 t17 = NullType(),
7460*61046927SAndroid Build Coastguard Worker         T18 t18 = NullType(),
7461*61046927SAndroid Build Coastguard Worker         T19 t19 = NullType(),
7462*61046927SAndroid Build Coastguard Worker         T20 t20 = NullType(),
7463*61046927SAndroid Build Coastguard Worker         T21 t21 = NullType(),
7464*61046927SAndroid Build Coastguard Worker         T22 t22 = NullType(),
7465*61046927SAndroid Build Coastguard Worker         T23 t23 = NullType(),
7466*61046927SAndroid Build Coastguard Worker         T24 t24 = NullType(),
7467*61046927SAndroid Build Coastguard Worker         T25 t25 = NullType(),
7468*61046927SAndroid Build Coastguard Worker         T26 t26 = NullType(),
7469*61046927SAndroid Build Coastguard Worker         T27 t27 = NullType(),
7470*61046927SAndroid Build Coastguard Worker         T28 t28 = NullType(),
7471*61046927SAndroid Build Coastguard Worker         T29 t29 = NullType(),
7472*61046927SAndroid Build Coastguard Worker         T30 t30 = NullType(),
7473*61046927SAndroid Build Coastguard Worker         T31 t31 = NullType()
7474*61046927SAndroid Build Coastguard Worker         )
7475*61046927SAndroid Build Coastguard Worker     {
7476*61046927SAndroid Build Coastguard Worker         Event event;
7477*61046927SAndroid Build Coastguard Worker         SetArg<0, T0>::set(kernel_, t0);
7478*61046927SAndroid Build Coastguard Worker         SetArg<1, T1>::set(kernel_, t1);
7479*61046927SAndroid Build Coastguard Worker         SetArg<2, T2>::set(kernel_, t2);
7480*61046927SAndroid Build Coastguard Worker         SetArg<3, T3>::set(kernel_, t3);
7481*61046927SAndroid Build Coastguard Worker         SetArg<4, T4>::set(kernel_, t4);
7482*61046927SAndroid Build Coastguard Worker         SetArg<5, T5>::set(kernel_, t5);
7483*61046927SAndroid Build Coastguard Worker         SetArg<6, T6>::set(kernel_, t6);
7484*61046927SAndroid Build Coastguard Worker         SetArg<7, T7>::set(kernel_, t7);
7485*61046927SAndroid Build Coastguard Worker         SetArg<8, T8>::set(kernel_, t8);
7486*61046927SAndroid Build Coastguard Worker         SetArg<9, T9>::set(kernel_, t9);
7487*61046927SAndroid Build Coastguard Worker         SetArg<10, T10>::set(kernel_, t10);
7488*61046927SAndroid Build Coastguard Worker         SetArg<11, T11>::set(kernel_, t11);
7489*61046927SAndroid Build Coastguard Worker         SetArg<12, T12>::set(kernel_, t12);
7490*61046927SAndroid Build Coastguard Worker         SetArg<13, T13>::set(kernel_, t13);
7491*61046927SAndroid Build Coastguard Worker         SetArg<14, T14>::set(kernel_, t14);
7492*61046927SAndroid Build Coastguard Worker         SetArg<15, T15>::set(kernel_, t15);
7493*61046927SAndroid Build Coastguard Worker         SetArg<16, T16>::set(kernel_, t16);
7494*61046927SAndroid Build Coastguard Worker         SetArg<17, T17>::set(kernel_, t17);
7495*61046927SAndroid Build Coastguard Worker         SetArg<18, T18>::set(kernel_, t18);
7496*61046927SAndroid Build Coastguard Worker         SetArg<19, T19>::set(kernel_, t19);
7497*61046927SAndroid Build Coastguard Worker         SetArg<20, T20>::set(kernel_, t20);
7498*61046927SAndroid Build Coastguard Worker         SetArg<21, T21>::set(kernel_, t21);
7499*61046927SAndroid Build Coastguard Worker         SetArg<22, T22>::set(kernel_, t22);
7500*61046927SAndroid Build Coastguard Worker         SetArg<23, T23>::set(kernel_, t23);
7501*61046927SAndroid Build Coastguard Worker         SetArg<24, T24>::set(kernel_, t24);
7502*61046927SAndroid Build Coastguard Worker         SetArg<25, T25>::set(kernel_, t25);
7503*61046927SAndroid Build Coastguard Worker         SetArg<26, T26>::set(kernel_, t26);
7504*61046927SAndroid Build Coastguard Worker         SetArg<27, T27>::set(kernel_, t27);
7505*61046927SAndroid Build Coastguard Worker         SetArg<28, T28>::set(kernel_, t28);
7506*61046927SAndroid Build Coastguard Worker         SetArg<29, T29>::set(kernel_, t29);
7507*61046927SAndroid Build Coastguard Worker         SetArg<30, T30>::set(kernel_, t30);
7508*61046927SAndroid Build Coastguard Worker         SetArg<31, T31>::set(kernel_, t31);
7509*61046927SAndroid Build Coastguard Worker 
7510*61046927SAndroid Build Coastguard Worker         args.queue_.enqueueNDRangeKernel(
7511*61046927SAndroid Build Coastguard Worker             kernel_,
7512*61046927SAndroid Build Coastguard Worker             args.offset_,
7513*61046927SAndroid Build Coastguard Worker             args.global_,
7514*61046927SAndroid Build Coastguard Worker             args.local_,
7515*61046927SAndroid Build Coastguard Worker             &args.events_,
7516*61046927SAndroid Build Coastguard Worker             &event);
7517*61046927SAndroid Build Coastguard Worker 
7518*61046927SAndroid Build Coastguard Worker         return event;
7519*61046927SAndroid Build Coastguard Worker     }
7520*61046927SAndroid Build Coastguard Worker 
7521*61046927SAndroid Build Coastguard Worker };
7522*61046927SAndroid Build Coastguard Worker 
7523*61046927SAndroid Build Coastguard Worker //------------------------------------------------------------------------------------------------------
7524*61046927SAndroid Build Coastguard Worker 
7525*61046927SAndroid Build Coastguard Worker 
7526*61046927SAndroid Build Coastguard Worker template<
7527*61046927SAndroid Build Coastguard Worker 	typename T0,
7528*61046927SAndroid Build Coastguard Worker 	typename T1,
7529*61046927SAndroid Build Coastguard Worker 	typename T2,
7530*61046927SAndroid Build Coastguard Worker 	typename T3,
7531*61046927SAndroid Build Coastguard Worker 	typename T4,
7532*61046927SAndroid Build Coastguard Worker 	typename T5,
7533*61046927SAndroid Build Coastguard Worker 	typename T6,
7534*61046927SAndroid Build Coastguard Worker 	typename T7,
7535*61046927SAndroid Build Coastguard Worker 	typename T8,
7536*61046927SAndroid Build Coastguard Worker 	typename T9,
7537*61046927SAndroid Build Coastguard Worker 	typename T10,
7538*61046927SAndroid Build Coastguard Worker 	typename T11,
7539*61046927SAndroid Build Coastguard Worker 	typename T12,
7540*61046927SAndroid Build Coastguard Worker 	typename T13,
7541*61046927SAndroid Build Coastguard Worker 	typename T14,
7542*61046927SAndroid Build Coastguard Worker 	typename T15,
7543*61046927SAndroid Build Coastguard Worker 	typename T16,
7544*61046927SAndroid Build Coastguard Worker 	typename T17,
7545*61046927SAndroid Build Coastguard Worker 	typename T18,
7546*61046927SAndroid Build Coastguard Worker 	typename T19,
7547*61046927SAndroid Build Coastguard Worker 	typename T20,
7548*61046927SAndroid Build Coastguard Worker 	typename T21,
7549*61046927SAndroid Build Coastguard Worker 	typename T22,
7550*61046927SAndroid Build Coastguard Worker 	typename T23,
7551*61046927SAndroid Build Coastguard Worker 	typename T24,
7552*61046927SAndroid Build Coastguard Worker 	typename T25,
7553*61046927SAndroid Build Coastguard Worker 	typename T26,
7554*61046927SAndroid Build Coastguard Worker 	typename T27,
7555*61046927SAndroid Build Coastguard Worker 	typename T28,
7556*61046927SAndroid Build Coastguard Worker 	typename T29,
7557*61046927SAndroid Build Coastguard Worker 	typename T30,
7558*61046927SAndroid Build Coastguard Worker 	typename T31>
7559*61046927SAndroid Build Coastguard Worker struct functionImplementation_
7560*61046927SAndroid Build Coastguard Worker {
7561*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
7562*61046927SAndroid Build Coastguard Worker 		T0,
7563*61046927SAndroid Build Coastguard Worker 		T1,
7564*61046927SAndroid Build Coastguard Worker 		T2,
7565*61046927SAndroid Build Coastguard Worker 		T3,
7566*61046927SAndroid Build Coastguard Worker 		T4,
7567*61046927SAndroid Build Coastguard Worker 		T5,
7568*61046927SAndroid Build Coastguard Worker 		T6,
7569*61046927SAndroid Build Coastguard Worker 		T7,
7570*61046927SAndroid Build Coastguard Worker 		T8,
7571*61046927SAndroid Build Coastguard Worker 		T9,
7572*61046927SAndroid Build Coastguard Worker 		T10,
7573*61046927SAndroid Build Coastguard Worker 		T11,
7574*61046927SAndroid Build Coastguard Worker 		T12,
7575*61046927SAndroid Build Coastguard Worker 		T13,
7576*61046927SAndroid Build Coastguard Worker 		T14,
7577*61046927SAndroid Build Coastguard Worker 		T15,
7578*61046927SAndroid Build Coastguard Worker 		T16,
7579*61046927SAndroid Build Coastguard Worker 		T17,
7580*61046927SAndroid Build Coastguard Worker 		T18,
7581*61046927SAndroid Build Coastguard Worker 		T19,
7582*61046927SAndroid Build Coastguard Worker 		T20,
7583*61046927SAndroid Build Coastguard Worker 		T21,
7584*61046927SAndroid Build Coastguard Worker 		T22,
7585*61046927SAndroid Build Coastguard Worker 		T23,
7586*61046927SAndroid Build Coastguard Worker 		T24,
7587*61046927SAndroid Build Coastguard Worker 		T25,
7588*61046927SAndroid Build Coastguard Worker 		T26,
7589*61046927SAndroid Build Coastguard Worker 		T27,
7590*61046927SAndroid Build Coastguard Worker 		T28,
7591*61046927SAndroid Build Coastguard Worker 		T29,
7592*61046927SAndroid Build Coastguard Worker 		T30,
7593*61046927SAndroid Build Coastguard Worker 		T31> FunctorType;
7594*61046927SAndroid Build Coastguard Worker 
7595*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
7596*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_7597*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
7598*61046927SAndroid Build Coastguard Worker         functor_(functor)
7599*61046927SAndroid Build Coastguard Worker     {
7600*61046927SAndroid Build Coastguard Worker 
7601*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32))
7602*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
7603*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7604*61046927SAndroid Build Coastguard Worker         #endif
7605*61046927SAndroid Build Coastguard Worker 
7606*61046927SAndroid Build Coastguard Worker     }
7607*61046927SAndroid Build Coastguard Worker 
7608*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
7609*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
7610*61046927SAndroid Build Coastguard Worker 
7611*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
7612*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
7613*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
7614*61046927SAndroid Build Coastguard Worker 		T0,
7615*61046927SAndroid Build Coastguard Worker 		T1,
7616*61046927SAndroid Build Coastguard Worker 		T2,
7617*61046927SAndroid Build Coastguard Worker 		T3,
7618*61046927SAndroid Build Coastguard Worker 		T4,
7619*61046927SAndroid Build Coastguard Worker 		T5,
7620*61046927SAndroid Build Coastguard Worker 		T6,
7621*61046927SAndroid Build Coastguard Worker 		T7,
7622*61046927SAndroid Build Coastguard Worker 		T8,
7623*61046927SAndroid Build Coastguard Worker 		T9,
7624*61046927SAndroid Build Coastguard Worker 		T10,
7625*61046927SAndroid Build Coastguard Worker 		T11,
7626*61046927SAndroid Build Coastguard Worker 		T12,
7627*61046927SAndroid Build Coastguard Worker 		T13,
7628*61046927SAndroid Build Coastguard Worker 		T14,
7629*61046927SAndroid Build Coastguard Worker 		T15,
7630*61046927SAndroid Build Coastguard Worker 		T16,
7631*61046927SAndroid Build Coastguard Worker 		T17,
7632*61046927SAndroid Build Coastguard Worker 		T18,
7633*61046927SAndroid Build Coastguard Worker 		T19,
7634*61046927SAndroid Build Coastguard Worker 		T20,
7635*61046927SAndroid Build Coastguard Worker 		T21,
7636*61046927SAndroid Build Coastguard Worker 		T22,
7637*61046927SAndroid Build Coastguard Worker 		T23,
7638*61046927SAndroid Build Coastguard Worker 		T24,
7639*61046927SAndroid Build Coastguard Worker 		T25,
7640*61046927SAndroid Build Coastguard Worker 		T26,
7641*61046927SAndroid Build Coastguard Worker 		T27,
7642*61046927SAndroid Build Coastguard Worker 		T28,
7643*61046927SAndroid Build Coastguard Worker 		T29,
7644*61046927SAndroid Build Coastguard Worker 		T30,
7645*61046927SAndroid Build Coastguard Worker 		T31);
7646*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_7647*61046927SAndroid Build Coastguard Worker 	Event operator()(
7648*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
7649*61046927SAndroid Build Coastguard Worker 		T0 arg0,
7650*61046927SAndroid Build Coastguard Worker 		T1 arg1,
7651*61046927SAndroid Build Coastguard Worker 		T2 arg2,
7652*61046927SAndroid Build Coastguard Worker 		T3 arg3,
7653*61046927SAndroid Build Coastguard Worker 		T4 arg4,
7654*61046927SAndroid Build Coastguard Worker 		T5 arg5,
7655*61046927SAndroid Build Coastguard Worker 		T6 arg6,
7656*61046927SAndroid Build Coastguard Worker 		T7 arg7,
7657*61046927SAndroid Build Coastguard Worker 		T8 arg8,
7658*61046927SAndroid Build Coastguard Worker 		T9 arg9,
7659*61046927SAndroid Build Coastguard Worker 		T10 arg10,
7660*61046927SAndroid Build Coastguard Worker 		T11 arg11,
7661*61046927SAndroid Build Coastguard Worker 		T12 arg12,
7662*61046927SAndroid Build Coastguard Worker 		T13 arg13,
7663*61046927SAndroid Build Coastguard Worker 		T14 arg14,
7664*61046927SAndroid Build Coastguard Worker 		T15 arg15,
7665*61046927SAndroid Build Coastguard Worker 		T16 arg16,
7666*61046927SAndroid Build Coastguard Worker 		T17 arg17,
7667*61046927SAndroid Build Coastguard Worker 		T18 arg18,
7668*61046927SAndroid Build Coastguard Worker 		T19 arg19,
7669*61046927SAndroid Build Coastguard Worker 		T20 arg20,
7670*61046927SAndroid Build Coastguard Worker 		T21 arg21,
7671*61046927SAndroid Build Coastguard Worker 		T22 arg22,
7672*61046927SAndroid Build Coastguard Worker 		T23 arg23,
7673*61046927SAndroid Build Coastguard Worker 		T24 arg24,
7674*61046927SAndroid Build Coastguard Worker 		T25 arg25,
7675*61046927SAndroid Build Coastguard Worker 		T26 arg26,
7676*61046927SAndroid Build Coastguard Worker 		T27 arg27,
7677*61046927SAndroid Build Coastguard Worker 		T28 arg28,
7678*61046927SAndroid Build Coastguard Worker 		T29 arg29,
7679*61046927SAndroid Build Coastguard Worker 		T30 arg30,
7680*61046927SAndroid Build Coastguard Worker 		T31 arg31)
7681*61046927SAndroid Build Coastguard Worker 	{
7682*61046927SAndroid Build Coastguard Worker 		return functor_(
7683*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
7684*61046927SAndroid Build Coastguard Worker 			arg0,
7685*61046927SAndroid Build Coastguard Worker 			arg1,
7686*61046927SAndroid Build Coastguard Worker 			arg2,
7687*61046927SAndroid Build Coastguard Worker 			arg3,
7688*61046927SAndroid Build Coastguard Worker 			arg4,
7689*61046927SAndroid Build Coastguard Worker 			arg5,
7690*61046927SAndroid Build Coastguard Worker 			arg6,
7691*61046927SAndroid Build Coastguard Worker 			arg7,
7692*61046927SAndroid Build Coastguard Worker 			arg8,
7693*61046927SAndroid Build Coastguard Worker 			arg9,
7694*61046927SAndroid Build Coastguard Worker 			arg10,
7695*61046927SAndroid Build Coastguard Worker 			arg11,
7696*61046927SAndroid Build Coastguard Worker 			arg12,
7697*61046927SAndroid Build Coastguard Worker 			arg13,
7698*61046927SAndroid Build Coastguard Worker 			arg14,
7699*61046927SAndroid Build Coastguard Worker 			arg15,
7700*61046927SAndroid Build Coastguard Worker 			arg16,
7701*61046927SAndroid Build Coastguard Worker 			arg17,
7702*61046927SAndroid Build Coastguard Worker 			arg18,
7703*61046927SAndroid Build Coastguard Worker 			arg19,
7704*61046927SAndroid Build Coastguard Worker 			arg20,
7705*61046927SAndroid Build Coastguard Worker 			arg21,
7706*61046927SAndroid Build Coastguard Worker 			arg22,
7707*61046927SAndroid Build Coastguard Worker 			arg23,
7708*61046927SAndroid Build Coastguard Worker 			arg24,
7709*61046927SAndroid Build Coastguard Worker 			arg25,
7710*61046927SAndroid Build Coastguard Worker 			arg26,
7711*61046927SAndroid Build Coastguard Worker 			arg27,
7712*61046927SAndroid Build Coastguard Worker 			arg28,
7713*61046927SAndroid Build Coastguard Worker 			arg29,
7714*61046927SAndroid Build Coastguard Worker 			arg30,
7715*61046927SAndroid Build Coastguard Worker 			arg31);
7716*61046927SAndroid Build Coastguard Worker 	}
7717*61046927SAndroid Build Coastguard Worker 
7718*61046927SAndroid Build Coastguard Worker 
7719*61046927SAndroid Build Coastguard Worker };
7720*61046927SAndroid Build Coastguard Worker 
7721*61046927SAndroid Build Coastguard Worker template<
7722*61046927SAndroid Build Coastguard Worker 	typename T0,
7723*61046927SAndroid Build Coastguard Worker 	typename T1,
7724*61046927SAndroid Build Coastguard Worker 	typename T2,
7725*61046927SAndroid Build Coastguard Worker 	typename T3,
7726*61046927SAndroid Build Coastguard Worker 	typename T4,
7727*61046927SAndroid Build Coastguard Worker 	typename T5,
7728*61046927SAndroid Build Coastguard Worker 	typename T6,
7729*61046927SAndroid Build Coastguard Worker 	typename T7,
7730*61046927SAndroid Build Coastguard Worker 	typename T8,
7731*61046927SAndroid Build Coastguard Worker 	typename T9,
7732*61046927SAndroid Build Coastguard Worker 	typename T10,
7733*61046927SAndroid Build Coastguard Worker 	typename T11,
7734*61046927SAndroid Build Coastguard Worker 	typename T12,
7735*61046927SAndroid Build Coastguard Worker 	typename T13,
7736*61046927SAndroid Build Coastguard Worker 	typename T14,
7737*61046927SAndroid Build Coastguard Worker 	typename T15,
7738*61046927SAndroid Build Coastguard Worker 	typename T16,
7739*61046927SAndroid Build Coastguard Worker 	typename T17,
7740*61046927SAndroid Build Coastguard Worker 	typename T18,
7741*61046927SAndroid Build Coastguard Worker 	typename T19,
7742*61046927SAndroid Build Coastguard Worker 	typename T20,
7743*61046927SAndroid Build Coastguard Worker 	typename T21,
7744*61046927SAndroid Build Coastguard Worker 	typename T22,
7745*61046927SAndroid Build Coastguard Worker 	typename T23,
7746*61046927SAndroid Build Coastguard Worker 	typename T24,
7747*61046927SAndroid Build Coastguard Worker 	typename T25,
7748*61046927SAndroid Build Coastguard Worker 	typename T26,
7749*61046927SAndroid Build Coastguard Worker 	typename T27,
7750*61046927SAndroid Build Coastguard Worker 	typename T28,
7751*61046927SAndroid Build Coastguard Worker 	typename T29,
7752*61046927SAndroid Build Coastguard Worker 	typename T30>
7753*61046927SAndroid Build Coastguard Worker struct functionImplementation_
7754*61046927SAndroid Build Coastguard Worker <	T0,
7755*61046927SAndroid Build Coastguard Worker 	T1,
7756*61046927SAndroid Build Coastguard Worker 	T2,
7757*61046927SAndroid Build Coastguard Worker 	T3,
7758*61046927SAndroid Build Coastguard Worker 	T4,
7759*61046927SAndroid Build Coastguard Worker 	T5,
7760*61046927SAndroid Build Coastguard Worker 	T6,
7761*61046927SAndroid Build Coastguard Worker 	T7,
7762*61046927SAndroid Build Coastguard Worker 	T8,
7763*61046927SAndroid Build Coastguard Worker 	T9,
7764*61046927SAndroid Build Coastguard Worker 	T10,
7765*61046927SAndroid Build Coastguard Worker 	T11,
7766*61046927SAndroid Build Coastguard Worker 	T12,
7767*61046927SAndroid Build Coastguard Worker 	T13,
7768*61046927SAndroid Build Coastguard Worker 	T14,
7769*61046927SAndroid Build Coastguard Worker 	T15,
7770*61046927SAndroid Build Coastguard Worker 	T16,
7771*61046927SAndroid Build Coastguard Worker 	T17,
7772*61046927SAndroid Build Coastguard Worker 	T18,
7773*61046927SAndroid Build Coastguard Worker 	T19,
7774*61046927SAndroid Build Coastguard Worker 	T20,
7775*61046927SAndroid Build Coastguard Worker 	T21,
7776*61046927SAndroid Build Coastguard Worker 	T22,
7777*61046927SAndroid Build Coastguard Worker 	T23,
7778*61046927SAndroid Build Coastguard Worker 	T24,
7779*61046927SAndroid Build Coastguard Worker 	T25,
7780*61046927SAndroid Build Coastguard Worker 	T26,
7781*61046927SAndroid Build Coastguard Worker 	T27,
7782*61046927SAndroid Build Coastguard Worker 	T28,
7783*61046927SAndroid Build Coastguard Worker 	T29,
7784*61046927SAndroid Build Coastguard Worker 	T30,
7785*61046927SAndroid Build Coastguard Worker 	NullType>
7786*61046927SAndroid Build Coastguard Worker {
7787*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
7788*61046927SAndroid Build Coastguard Worker 		T0,
7789*61046927SAndroid Build Coastguard Worker 		T1,
7790*61046927SAndroid Build Coastguard Worker 		T2,
7791*61046927SAndroid Build Coastguard Worker 		T3,
7792*61046927SAndroid Build Coastguard Worker 		T4,
7793*61046927SAndroid Build Coastguard Worker 		T5,
7794*61046927SAndroid Build Coastguard Worker 		T6,
7795*61046927SAndroid Build Coastguard Worker 		T7,
7796*61046927SAndroid Build Coastguard Worker 		T8,
7797*61046927SAndroid Build Coastguard Worker 		T9,
7798*61046927SAndroid Build Coastguard Worker 		T10,
7799*61046927SAndroid Build Coastguard Worker 		T11,
7800*61046927SAndroid Build Coastguard Worker 		T12,
7801*61046927SAndroid Build Coastguard Worker 		T13,
7802*61046927SAndroid Build Coastguard Worker 		T14,
7803*61046927SAndroid Build Coastguard Worker 		T15,
7804*61046927SAndroid Build Coastguard Worker 		T16,
7805*61046927SAndroid Build Coastguard Worker 		T17,
7806*61046927SAndroid Build Coastguard Worker 		T18,
7807*61046927SAndroid Build Coastguard Worker 		T19,
7808*61046927SAndroid Build Coastguard Worker 		T20,
7809*61046927SAndroid Build Coastguard Worker 		T21,
7810*61046927SAndroid Build Coastguard Worker 		T22,
7811*61046927SAndroid Build Coastguard Worker 		T23,
7812*61046927SAndroid Build Coastguard Worker 		T24,
7813*61046927SAndroid Build Coastguard Worker 		T25,
7814*61046927SAndroid Build Coastguard Worker 		T26,
7815*61046927SAndroid Build Coastguard Worker 		T27,
7816*61046927SAndroid Build Coastguard Worker 		T28,
7817*61046927SAndroid Build Coastguard Worker 		T29,
7818*61046927SAndroid Build Coastguard Worker 		T30,
7819*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
7820*61046927SAndroid Build Coastguard Worker 
7821*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
7822*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_7823*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
7824*61046927SAndroid Build Coastguard Worker         functor_(functor)
7825*61046927SAndroid Build Coastguard Worker     {
7826*61046927SAndroid Build Coastguard Worker 
7827*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31))
7828*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
7829*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7830*61046927SAndroid Build Coastguard Worker         #endif
7831*61046927SAndroid Build Coastguard Worker 
7832*61046927SAndroid Build Coastguard Worker     }
7833*61046927SAndroid Build Coastguard Worker 
7834*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
7835*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
7836*61046927SAndroid Build Coastguard Worker 
7837*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
7838*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
7839*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
7840*61046927SAndroid Build Coastguard Worker 		T0,
7841*61046927SAndroid Build Coastguard Worker 		T1,
7842*61046927SAndroid Build Coastguard Worker 		T2,
7843*61046927SAndroid Build Coastguard Worker 		T3,
7844*61046927SAndroid Build Coastguard Worker 		T4,
7845*61046927SAndroid Build Coastguard Worker 		T5,
7846*61046927SAndroid Build Coastguard Worker 		T6,
7847*61046927SAndroid Build Coastguard Worker 		T7,
7848*61046927SAndroid Build Coastguard Worker 		T8,
7849*61046927SAndroid Build Coastguard Worker 		T9,
7850*61046927SAndroid Build Coastguard Worker 		T10,
7851*61046927SAndroid Build Coastguard Worker 		T11,
7852*61046927SAndroid Build Coastguard Worker 		T12,
7853*61046927SAndroid Build Coastguard Worker 		T13,
7854*61046927SAndroid Build Coastguard Worker 		T14,
7855*61046927SAndroid Build Coastguard Worker 		T15,
7856*61046927SAndroid Build Coastguard Worker 		T16,
7857*61046927SAndroid Build Coastguard Worker 		T17,
7858*61046927SAndroid Build Coastguard Worker 		T18,
7859*61046927SAndroid Build Coastguard Worker 		T19,
7860*61046927SAndroid Build Coastguard Worker 		T20,
7861*61046927SAndroid Build Coastguard Worker 		T21,
7862*61046927SAndroid Build Coastguard Worker 		T22,
7863*61046927SAndroid Build Coastguard Worker 		T23,
7864*61046927SAndroid Build Coastguard Worker 		T24,
7865*61046927SAndroid Build Coastguard Worker 		T25,
7866*61046927SAndroid Build Coastguard Worker 		T26,
7867*61046927SAndroid Build Coastguard Worker 		T27,
7868*61046927SAndroid Build Coastguard Worker 		T28,
7869*61046927SAndroid Build Coastguard Worker 		T29,
7870*61046927SAndroid Build Coastguard Worker 		T30);
7871*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_7872*61046927SAndroid Build Coastguard Worker 	Event operator()(
7873*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
7874*61046927SAndroid Build Coastguard Worker 		T0 arg0,
7875*61046927SAndroid Build Coastguard Worker 		T1 arg1,
7876*61046927SAndroid Build Coastguard Worker 		T2 arg2,
7877*61046927SAndroid Build Coastguard Worker 		T3 arg3,
7878*61046927SAndroid Build Coastguard Worker 		T4 arg4,
7879*61046927SAndroid Build Coastguard Worker 		T5 arg5,
7880*61046927SAndroid Build Coastguard Worker 		T6 arg6,
7881*61046927SAndroid Build Coastguard Worker 		T7 arg7,
7882*61046927SAndroid Build Coastguard Worker 		T8 arg8,
7883*61046927SAndroid Build Coastguard Worker 		T9 arg9,
7884*61046927SAndroid Build Coastguard Worker 		T10 arg10,
7885*61046927SAndroid Build Coastguard Worker 		T11 arg11,
7886*61046927SAndroid Build Coastguard Worker 		T12 arg12,
7887*61046927SAndroid Build Coastguard Worker 		T13 arg13,
7888*61046927SAndroid Build Coastguard Worker 		T14 arg14,
7889*61046927SAndroid Build Coastguard Worker 		T15 arg15,
7890*61046927SAndroid Build Coastguard Worker 		T16 arg16,
7891*61046927SAndroid Build Coastguard Worker 		T17 arg17,
7892*61046927SAndroid Build Coastguard Worker 		T18 arg18,
7893*61046927SAndroid Build Coastguard Worker 		T19 arg19,
7894*61046927SAndroid Build Coastguard Worker 		T20 arg20,
7895*61046927SAndroid Build Coastguard Worker 		T21 arg21,
7896*61046927SAndroid Build Coastguard Worker 		T22 arg22,
7897*61046927SAndroid Build Coastguard Worker 		T23 arg23,
7898*61046927SAndroid Build Coastguard Worker 		T24 arg24,
7899*61046927SAndroid Build Coastguard Worker 		T25 arg25,
7900*61046927SAndroid Build Coastguard Worker 		T26 arg26,
7901*61046927SAndroid Build Coastguard Worker 		T27 arg27,
7902*61046927SAndroid Build Coastguard Worker 		T28 arg28,
7903*61046927SAndroid Build Coastguard Worker 		T29 arg29,
7904*61046927SAndroid Build Coastguard Worker 		T30 arg30)
7905*61046927SAndroid Build Coastguard Worker 	{
7906*61046927SAndroid Build Coastguard Worker 		return functor_(
7907*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
7908*61046927SAndroid Build Coastguard Worker 			arg0,
7909*61046927SAndroid Build Coastguard Worker 			arg1,
7910*61046927SAndroid Build Coastguard Worker 			arg2,
7911*61046927SAndroid Build Coastguard Worker 			arg3,
7912*61046927SAndroid Build Coastguard Worker 			arg4,
7913*61046927SAndroid Build Coastguard Worker 			arg5,
7914*61046927SAndroid Build Coastguard Worker 			arg6,
7915*61046927SAndroid Build Coastguard Worker 			arg7,
7916*61046927SAndroid Build Coastguard Worker 			arg8,
7917*61046927SAndroid Build Coastguard Worker 			arg9,
7918*61046927SAndroid Build Coastguard Worker 			arg10,
7919*61046927SAndroid Build Coastguard Worker 			arg11,
7920*61046927SAndroid Build Coastguard Worker 			arg12,
7921*61046927SAndroid Build Coastguard Worker 			arg13,
7922*61046927SAndroid Build Coastguard Worker 			arg14,
7923*61046927SAndroid Build Coastguard Worker 			arg15,
7924*61046927SAndroid Build Coastguard Worker 			arg16,
7925*61046927SAndroid Build Coastguard Worker 			arg17,
7926*61046927SAndroid Build Coastguard Worker 			arg18,
7927*61046927SAndroid Build Coastguard Worker 			arg19,
7928*61046927SAndroid Build Coastguard Worker 			arg20,
7929*61046927SAndroid Build Coastguard Worker 			arg21,
7930*61046927SAndroid Build Coastguard Worker 			arg22,
7931*61046927SAndroid Build Coastguard Worker 			arg23,
7932*61046927SAndroid Build Coastguard Worker 			arg24,
7933*61046927SAndroid Build Coastguard Worker 			arg25,
7934*61046927SAndroid Build Coastguard Worker 			arg26,
7935*61046927SAndroid Build Coastguard Worker 			arg27,
7936*61046927SAndroid Build Coastguard Worker 			arg28,
7937*61046927SAndroid Build Coastguard Worker 			arg29,
7938*61046927SAndroid Build Coastguard Worker 			arg30);
7939*61046927SAndroid Build Coastguard Worker 	}
7940*61046927SAndroid Build Coastguard Worker 
7941*61046927SAndroid Build Coastguard Worker 
7942*61046927SAndroid Build Coastguard Worker };
7943*61046927SAndroid Build Coastguard Worker 
7944*61046927SAndroid Build Coastguard Worker template<
7945*61046927SAndroid Build Coastguard Worker 	typename T0,
7946*61046927SAndroid Build Coastguard Worker 	typename T1,
7947*61046927SAndroid Build Coastguard Worker 	typename T2,
7948*61046927SAndroid Build Coastguard Worker 	typename T3,
7949*61046927SAndroid Build Coastguard Worker 	typename T4,
7950*61046927SAndroid Build Coastguard Worker 	typename T5,
7951*61046927SAndroid Build Coastguard Worker 	typename T6,
7952*61046927SAndroid Build Coastguard Worker 	typename T7,
7953*61046927SAndroid Build Coastguard Worker 	typename T8,
7954*61046927SAndroid Build Coastguard Worker 	typename T9,
7955*61046927SAndroid Build Coastguard Worker 	typename T10,
7956*61046927SAndroid Build Coastguard Worker 	typename T11,
7957*61046927SAndroid Build Coastguard Worker 	typename T12,
7958*61046927SAndroid Build Coastguard Worker 	typename T13,
7959*61046927SAndroid Build Coastguard Worker 	typename T14,
7960*61046927SAndroid Build Coastguard Worker 	typename T15,
7961*61046927SAndroid Build Coastguard Worker 	typename T16,
7962*61046927SAndroid Build Coastguard Worker 	typename T17,
7963*61046927SAndroid Build Coastguard Worker 	typename T18,
7964*61046927SAndroid Build Coastguard Worker 	typename T19,
7965*61046927SAndroid Build Coastguard Worker 	typename T20,
7966*61046927SAndroid Build Coastguard Worker 	typename T21,
7967*61046927SAndroid Build Coastguard Worker 	typename T22,
7968*61046927SAndroid Build Coastguard Worker 	typename T23,
7969*61046927SAndroid Build Coastguard Worker 	typename T24,
7970*61046927SAndroid Build Coastguard Worker 	typename T25,
7971*61046927SAndroid Build Coastguard Worker 	typename T26,
7972*61046927SAndroid Build Coastguard Worker 	typename T27,
7973*61046927SAndroid Build Coastguard Worker 	typename T28,
7974*61046927SAndroid Build Coastguard Worker 	typename T29>
7975*61046927SAndroid Build Coastguard Worker struct functionImplementation_
7976*61046927SAndroid Build Coastguard Worker <	T0,
7977*61046927SAndroid Build Coastguard Worker 	T1,
7978*61046927SAndroid Build Coastguard Worker 	T2,
7979*61046927SAndroid Build Coastguard Worker 	T3,
7980*61046927SAndroid Build Coastguard Worker 	T4,
7981*61046927SAndroid Build Coastguard Worker 	T5,
7982*61046927SAndroid Build Coastguard Worker 	T6,
7983*61046927SAndroid Build Coastguard Worker 	T7,
7984*61046927SAndroid Build Coastguard Worker 	T8,
7985*61046927SAndroid Build Coastguard Worker 	T9,
7986*61046927SAndroid Build Coastguard Worker 	T10,
7987*61046927SAndroid Build Coastguard Worker 	T11,
7988*61046927SAndroid Build Coastguard Worker 	T12,
7989*61046927SAndroid Build Coastguard Worker 	T13,
7990*61046927SAndroid Build Coastguard Worker 	T14,
7991*61046927SAndroid Build Coastguard Worker 	T15,
7992*61046927SAndroid Build Coastguard Worker 	T16,
7993*61046927SAndroid Build Coastguard Worker 	T17,
7994*61046927SAndroid Build Coastguard Worker 	T18,
7995*61046927SAndroid Build Coastguard Worker 	T19,
7996*61046927SAndroid Build Coastguard Worker 	T20,
7997*61046927SAndroid Build Coastguard Worker 	T21,
7998*61046927SAndroid Build Coastguard Worker 	T22,
7999*61046927SAndroid Build Coastguard Worker 	T23,
8000*61046927SAndroid Build Coastguard Worker 	T24,
8001*61046927SAndroid Build Coastguard Worker 	T25,
8002*61046927SAndroid Build Coastguard Worker 	T26,
8003*61046927SAndroid Build Coastguard Worker 	T27,
8004*61046927SAndroid Build Coastguard Worker 	T28,
8005*61046927SAndroid Build Coastguard Worker 	T29,
8006*61046927SAndroid Build Coastguard Worker 	NullType,
8007*61046927SAndroid Build Coastguard Worker 	NullType>
8008*61046927SAndroid Build Coastguard Worker {
8009*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
8010*61046927SAndroid Build Coastguard Worker 		T0,
8011*61046927SAndroid Build Coastguard Worker 		T1,
8012*61046927SAndroid Build Coastguard Worker 		T2,
8013*61046927SAndroid Build Coastguard Worker 		T3,
8014*61046927SAndroid Build Coastguard Worker 		T4,
8015*61046927SAndroid Build Coastguard Worker 		T5,
8016*61046927SAndroid Build Coastguard Worker 		T6,
8017*61046927SAndroid Build Coastguard Worker 		T7,
8018*61046927SAndroid Build Coastguard Worker 		T8,
8019*61046927SAndroid Build Coastguard Worker 		T9,
8020*61046927SAndroid Build Coastguard Worker 		T10,
8021*61046927SAndroid Build Coastguard Worker 		T11,
8022*61046927SAndroid Build Coastguard Worker 		T12,
8023*61046927SAndroid Build Coastguard Worker 		T13,
8024*61046927SAndroid Build Coastguard Worker 		T14,
8025*61046927SAndroid Build Coastguard Worker 		T15,
8026*61046927SAndroid Build Coastguard Worker 		T16,
8027*61046927SAndroid Build Coastguard Worker 		T17,
8028*61046927SAndroid Build Coastguard Worker 		T18,
8029*61046927SAndroid Build Coastguard Worker 		T19,
8030*61046927SAndroid Build Coastguard Worker 		T20,
8031*61046927SAndroid Build Coastguard Worker 		T21,
8032*61046927SAndroid Build Coastguard Worker 		T22,
8033*61046927SAndroid Build Coastguard Worker 		T23,
8034*61046927SAndroid Build Coastguard Worker 		T24,
8035*61046927SAndroid Build Coastguard Worker 		T25,
8036*61046927SAndroid Build Coastguard Worker 		T26,
8037*61046927SAndroid Build Coastguard Worker 		T27,
8038*61046927SAndroid Build Coastguard Worker 		T28,
8039*61046927SAndroid Build Coastguard Worker 		T29,
8040*61046927SAndroid Build Coastguard Worker 		NullType,
8041*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
8042*61046927SAndroid Build Coastguard Worker 
8043*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
8044*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_8045*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
8046*61046927SAndroid Build Coastguard Worker         functor_(functor)
8047*61046927SAndroid Build Coastguard Worker     {
8048*61046927SAndroid Build Coastguard Worker 
8049*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30))
8050*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
8051*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8052*61046927SAndroid Build Coastguard Worker         #endif
8053*61046927SAndroid Build Coastguard Worker 
8054*61046927SAndroid Build Coastguard Worker     }
8055*61046927SAndroid Build Coastguard Worker 
8056*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
8057*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
8058*61046927SAndroid Build Coastguard Worker 
8059*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
8060*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
8061*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
8062*61046927SAndroid Build Coastguard Worker 		T0,
8063*61046927SAndroid Build Coastguard Worker 		T1,
8064*61046927SAndroid Build Coastguard Worker 		T2,
8065*61046927SAndroid Build Coastguard Worker 		T3,
8066*61046927SAndroid Build Coastguard Worker 		T4,
8067*61046927SAndroid Build Coastguard Worker 		T5,
8068*61046927SAndroid Build Coastguard Worker 		T6,
8069*61046927SAndroid Build Coastguard Worker 		T7,
8070*61046927SAndroid Build Coastguard Worker 		T8,
8071*61046927SAndroid Build Coastguard Worker 		T9,
8072*61046927SAndroid Build Coastguard Worker 		T10,
8073*61046927SAndroid Build Coastguard Worker 		T11,
8074*61046927SAndroid Build Coastguard Worker 		T12,
8075*61046927SAndroid Build Coastguard Worker 		T13,
8076*61046927SAndroid Build Coastguard Worker 		T14,
8077*61046927SAndroid Build Coastguard Worker 		T15,
8078*61046927SAndroid Build Coastguard Worker 		T16,
8079*61046927SAndroid Build Coastguard Worker 		T17,
8080*61046927SAndroid Build Coastguard Worker 		T18,
8081*61046927SAndroid Build Coastguard Worker 		T19,
8082*61046927SAndroid Build Coastguard Worker 		T20,
8083*61046927SAndroid Build Coastguard Worker 		T21,
8084*61046927SAndroid Build Coastguard Worker 		T22,
8085*61046927SAndroid Build Coastguard Worker 		T23,
8086*61046927SAndroid Build Coastguard Worker 		T24,
8087*61046927SAndroid Build Coastguard Worker 		T25,
8088*61046927SAndroid Build Coastguard Worker 		T26,
8089*61046927SAndroid Build Coastguard Worker 		T27,
8090*61046927SAndroid Build Coastguard Worker 		T28,
8091*61046927SAndroid Build Coastguard Worker 		T29);
8092*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_8093*61046927SAndroid Build Coastguard Worker 	Event operator()(
8094*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
8095*61046927SAndroid Build Coastguard Worker 		T0 arg0,
8096*61046927SAndroid Build Coastguard Worker 		T1 arg1,
8097*61046927SAndroid Build Coastguard Worker 		T2 arg2,
8098*61046927SAndroid Build Coastguard Worker 		T3 arg3,
8099*61046927SAndroid Build Coastguard Worker 		T4 arg4,
8100*61046927SAndroid Build Coastguard Worker 		T5 arg5,
8101*61046927SAndroid Build Coastguard Worker 		T6 arg6,
8102*61046927SAndroid Build Coastguard Worker 		T7 arg7,
8103*61046927SAndroid Build Coastguard Worker 		T8 arg8,
8104*61046927SAndroid Build Coastguard Worker 		T9 arg9,
8105*61046927SAndroid Build Coastguard Worker 		T10 arg10,
8106*61046927SAndroid Build Coastguard Worker 		T11 arg11,
8107*61046927SAndroid Build Coastguard Worker 		T12 arg12,
8108*61046927SAndroid Build Coastguard Worker 		T13 arg13,
8109*61046927SAndroid Build Coastguard Worker 		T14 arg14,
8110*61046927SAndroid Build Coastguard Worker 		T15 arg15,
8111*61046927SAndroid Build Coastguard Worker 		T16 arg16,
8112*61046927SAndroid Build Coastguard Worker 		T17 arg17,
8113*61046927SAndroid Build Coastguard Worker 		T18 arg18,
8114*61046927SAndroid Build Coastguard Worker 		T19 arg19,
8115*61046927SAndroid Build Coastguard Worker 		T20 arg20,
8116*61046927SAndroid Build Coastguard Worker 		T21 arg21,
8117*61046927SAndroid Build Coastguard Worker 		T22 arg22,
8118*61046927SAndroid Build Coastguard Worker 		T23 arg23,
8119*61046927SAndroid Build Coastguard Worker 		T24 arg24,
8120*61046927SAndroid Build Coastguard Worker 		T25 arg25,
8121*61046927SAndroid Build Coastguard Worker 		T26 arg26,
8122*61046927SAndroid Build Coastguard Worker 		T27 arg27,
8123*61046927SAndroid Build Coastguard Worker 		T28 arg28,
8124*61046927SAndroid Build Coastguard Worker 		T29 arg29)
8125*61046927SAndroid Build Coastguard Worker 	{
8126*61046927SAndroid Build Coastguard Worker 		return functor_(
8127*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
8128*61046927SAndroid Build Coastguard Worker 			arg0,
8129*61046927SAndroid Build Coastguard Worker 			arg1,
8130*61046927SAndroid Build Coastguard Worker 			arg2,
8131*61046927SAndroid Build Coastguard Worker 			arg3,
8132*61046927SAndroid Build Coastguard Worker 			arg4,
8133*61046927SAndroid Build Coastguard Worker 			arg5,
8134*61046927SAndroid Build Coastguard Worker 			arg6,
8135*61046927SAndroid Build Coastguard Worker 			arg7,
8136*61046927SAndroid Build Coastguard Worker 			arg8,
8137*61046927SAndroid Build Coastguard Worker 			arg9,
8138*61046927SAndroid Build Coastguard Worker 			arg10,
8139*61046927SAndroid Build Coastguard Worker 			arg11,
8140*61046927SAndroid Build Coastguard Worker 			arg12,
8141*61046927SAndroid Build Coastguard Worker 			arg13,
8142*61046927SAndroid Build Coastguard Worker 			arg14,
8143*61046927SAndroid Build Coastguard Worker 			arg15,
8144*61046927SAndroid Build Coastguard Worker 			arg16,
8145*61046927SAndroid Build Coastguard Worker 			arg17,
8146*61046927SAndroid Build Coastguard Worker 			arg18,
8147*61046927SAndroid Build Coastguard Worker 			arg19,
8148*61046927SAndroid Build Coastguard Worker 			arg20,
8149*61046927SAndroid Build Coastguard Worker 			arg21,
8150*61046927SAndroid Build Coastguard Worker 			arg22,
8151*61046927SAndroid Build Coastguard Worker 			arg23,
8152*61046927SAndroid Build Coastguard Worker 			arg24,
8153*61046927SAndroid Build Coastguard Worker 			arg25,
8154*61046927SAndroid Build Coastguard Worker 			arg26,
8155*61046927SAndroid Build Coastguard Worker 			arg27,
8156*61046927SAndroid Build Coastguard Worker 			arg28,
8157*61046927SAndroid Build Coastguard Worker 			arg29);
8158*61046927SAndroid Build Coastguard Worker 	}
8159*61046927SAndroid Build Coastguard Worker 
8160*61046927SAndroid Build Coastguard Worker 
8161*61046927SAndroid Build Coastguard Worker };
8162*61046927SAndroid Build Coastguard Worker 
8163*61046927SAndroid Build Coastguard Worker template<
8164*61046927SAndroid Build Coastguard Worker 	typename T0,
8165*61046927SAndroid Build Coastguard Worker 	typename T1,
8166*61046927SAndroid Build Coastguard Worker 	typename T2,
8167*61046927SAndroid Build Coastguard Worker 	typename T3,
8168*61046927SAndroid Build Coastguard Worker 	typename T4,
8169*61046927SAndroid Build Coastguard Worker 	typename T5,
8170*61046927SAndroid Build Coastguard Worker 	typename T6,
8171*61046927SAndroid Build Coastguard Worker 	typename T7,
8172*61046927SAndroid Build Coastguard Worker 	typename T8,
8173*61046927SAndroid Build Coastguard Worker 	typename T9,
8174*61046927SAndroid Build Coastguard Worker 	typename T10,
8175*61046927SAndroid Build Coastguard Worker 	typename T11,
8176*61046927SAndroid Build Coastguard Worker 	typename T12,
8177*61046927SAndroid Build Coastguard Worker 	typename T13,
8178*61046927SAndroid Build Coastguard Worker 	typename T14,
8179*61046927SAndroid Build Coastguard Worker 	typename T15,
8180*61046927SAndroid Build Coastguard Worker 	typename T16,
8181*61046927SAndroid Build Coastguard Worker 	typename T17,
8182*61046927SAndroid Build Coastguard Worker 	typename T18,
8183*61046927SAndroid Build Coastguard Worker 	typename T19,
8184*61046927SAndroid Build Coastguard Worker 	typename T20,
8185*61046927SAndroid Build Coastguard Worker 	typename T21,
8186*61046927SAndroid Build Coastguard Worker 	typename T22,
8187*61046927SAndroid Build Coastguard Worker 	typename T23,
8188*61046927SAndroid Build Coastguard Worker 	typename T24,
8189*61046927SAndroid Build Coastguard Worker 	typename T25,
8190*61046927SAndroid Build Coastguard Worker 	typename T26,
8191*61046927SAndroid Build Coastguard Worker 	typename T27,
8192*61046927SAndroid Build Coastguard Worker 	typename T28>
8193*61046927SAndroid Build Coastguard Worker struct functionImplementation_
8194*61046927SAndroid Build Coastguard Worker <	T0,
8195*61046927SAndroid Build Coastguard Worker 	T1,
8196*61046927SAndroid Build Coastguard Worker 	T2,
8197*61046927SAndroid Build Coastguard Worker 	T3,
8198*61046927SAndroid Build Coastguard Worker 	T4,
8199*61046927SAndroid Build Coastguard Worker 	T5,
8200*61046927SAndroid Build Coastguard Worker 	T6,
8201*61046927SAndroid Build Coastguard Worker 	T7,
8202*61046927SAndroid Build Coastguard Worker 	T8,
8203*61046927SAndroid Build Coastguard Worker 	T9,
8204*61046927SAndroid Build Coastguard Worker 	T10,
8205*61046927SAndroid Build Coastguard Worker 	T11,
8206*61046927SAndroid Build Coastguard Worker 	T12,
8207*61046927SAndroid Build Coastguard Worker 	T13,
8208*61046927SAndroid Build Coastguard Worker 	T14,
8209*61046927SAndroid Build Coastguard Worker 	T15,
8210*61046927SAndroid Build Coastguard Worker 	T16,
8211*61046927SAndroid Build Coastguard Worker 	T17,
8212*61046927SAndroid Build Coastguard Worker 	T18,
8213*61046927SAndroid Build Coastguard Worker 	T19,
8214*61046927SAndroid Build Coastguard Worker 	T20,
8215*61046927SAndroid Build Coastguard Worker 	T21,
8216*61046927SAndroid Build Coastguard Worker 	T22,
8217*61046927SAndroid Build Coastguard Worker 	T23,
8218*61046927SAndroid Build Coastguard Worker 	T24,
8219*61046927SAndroid Build Coastguard Worker 	T25,
8220*61046927SAndroid Build Coastguard Worker 	T26,
8221*61046927SAndroid Build Coastguard Worker 	T27,
8222*61046927SAndroid Build Coastguard Worker 	T28,
8223*61046927SAndroid Build Coastguard Worker 	NullType,
8224*61046927SAndroid Build Coastguard Worker 	NullType,
8225*61046927SAndroid Build Coastguard Worker 	NullType>
8226*61046927SAndroid Build Coastguard Worker {
8227*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
8228*61046927SAndroid Build Coastguard Worker 		T0,
8229*61046927SAndroid Build Coastguard Worker 		T1,
8230*61046927SAndroid Build Coastguard Worker 		T2,
8231*61046927SAndroid Build Coastguard Worker 		T3,
8232*61046927SAndroid Build Coastguard Worker 		T4,
8233*61046927SAndroid Build Coastguard Worker 		T5,
8234*61046927SAndroid Build Coastguard Worker 		T6,
8235*61046927SAndroid Build Coastguard Worker 		T7,
8236*61046927SAndroid Build Coastguard Worker 		T8,
8237*61046927SAndroid Build Coastguard Worker 		T9,
8238*61046927SAndroid Build Coastguard Worker 		T10,
8239*61046927SAndroid Build Coastguard Worker 		T11,
8240*61046927SAndroid Build Coastguard Worker 		T12,
8241*61046927SAndroid Build Coastguard Worker 		T13,
8242*61046927SAndroid Build Coastguard Worker 		T14,
8243*61046927SAndroid Build Coastguard Worker 		T15,
8244*61046927SAndroid Build Coastguard Worker 		T16,
8245*61046927SAndroid Build Coastguard Worker 		T17,
8246*61046927SAndroid Build Coastguard Worker 		T18,
8247*61046927SAndroid Build Coastguard Worker 		T19,
8248*61046927SAndroid Build Coastguard Worker 		T20,
8249*61046927SAndroid Build Coastguard Worker 		T21,
8250*61046927SAndroid Build Coastguard Worker 		T22,
8251*61046927SAndroid Build Coastguard Worker 		T23,
8252*61046927SAndroid Build Coastguard Worker 		T24,
8253*61046927SAndroid Build Coastguard Worker 		T25,
8254*61046927SAndroid Build Coastguard Worker 		T26,
8255*61046927SAndroid Build Coastguard Worker 		T27,
8256*61046927SAndroid Build Coastguard Worker 		T28,
8257*61046927SAndroid Build Coastguard Worker 		NullType,
8258*61046927SAndroid Build Coastguard Worker 		NullType,
8259*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
8260*61046927SAndroid Build Coastguard Worker 
8261*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
8262*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_8263*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
8264*61046927SAndroid Build Coastguard Worker         functor_(functor)
8265*61046927SAndroid Build Coastguard Worker     {
8266*61046927SAndroid Build Coastguard Worker 
8267*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29))
8268*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
8269*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8270*61046927SAndroid Build Coastguard Worker         #endif
8271*61046927SAndroid Build Coastguard Worker 
8272*61046927SAndroid Build Coastguard Worker     }
8273*61046927SAndroid Build Coastguard Worker 
8274*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
8275*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
8276*61046927SAndroid Build Coastguard Worker 
8277*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
8278*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
8279*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
8280*61046927SAndroid Build Coastguard Worker 		T0,
8281*61046927SAndroid Build Coastguard Worker 		T1,
8282*61046927SAndroid Build Coastguard Worker 		T2,
8283*61046927SAndroid Build Coastguard Worker 		T3,
8284*61046927SAndroid Build Coastguard Worker 		T4,
8285*61046927SAndroid Build Coastguard Worker 		T5,
8286*61046927SAndroid Build Coastguard Worker 		T6,
8287*61046927SAndroid Build Coastguard Worker 		T7,
8288*61046927SAndroid Build Coastguard Worker 		T8,
8289*61046927SAndroid Build Coastguard Worker 		T9,
8290*61046927SAndroid Build Coastguard Worker 		T10,
8291*61046927SAndroid Build Coastguard Worker 		T11,
8292*61046927SAndroid Build Coastguard Worker 		T12,
8293*61046927SAndroid Build Coastguard Worker 		T13,
8294*61046927SAndroid Build Coastguard Worker 		T14,
8295*61046927SAndroid Build Coastguard Worker 		T15,
8296*61046927SAndroid Build Coastguard Worker 		T16,
8297*61046927SAndroid Build Coastguard Worker 		T17,
8298*61046927SAndroid Build Coastguard Worker 		T18,
8299*61046927SAndroid Build Coastguard Worker 		T19,
8300*61046927SAndroid Build Coastguard Worker 		T20,
8301*61046927SAndroid Build Coastguard Worker 		T21,
8302*61046927SAndroid Build Coastguard Worker 		T22,
8303*61046927SAndroid Build Coastguard Worker 		T23,
8304*61046927SAndroid Build Coastguard Worker 		T24,
8305*61046927SAndroid Build Coastguard Worker 		T25,
8306*61046927SAndroid Build Coastguard Worker 		T26,
8307*61046927SAndroid Build Coastguard Worker 		T27,
8308*61046927SAndroid Build Coastguard Worker 		T28);
8309*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_8310*61046927SAndroid Build Coastguard Worker 	Event operator()(
8311*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
8312*61046927SAndroid Build Coastguard Worker 		T0 arg0,
8313*61046927SAndroid Build Coastguard Worker 		T1 arg1,
8314*61046927SAndroid Build Coastguard Worker 		T2 arg2,
8315*61046927SAndroid Build Coastguard Worker 		T3 arg3,
8316*61046927SAndroid Build Coastguard Worker 		T4 arg4,
8317*61046927SAndroid Build Coastguard Worker 		T5 arg5,
8318*61046927SAndroid Build Coastguard Worker 		T6 arg6,
8319*61046927SAndroid Build Coastguard Worker 		T7 arg7,
8320*61046927SAndroid Build Coastguard Worker 		T8 arg8,
8321*61046927SAndroid Build Coastguard Worker 		T9 arg9,
8322*61046927SAndroid Build Coastguard Worker 		T10 arg10,
8323*61046927SAndroid Build Coastguard Worker 		T11 arg11,
8324*61046927SAndroid Build Coastguard Worker 		T12 arg12,
8325*61046927SAndroid Build Coastguard Worker 		T13 arg13,
8326*61046927SAndroid Build Coastguard Worker 		T14 arg14,
8327*61046927SAndroid Build Coastguard Worker 		T15 arg15,
8328*61046927SAndroid Build Coastguard Worker 		T16 arg16,
8329*61046927SAndroid Build Coastguard Worker 		T17 arg17,
8330*61046927SAndroid Build Coastguard Worker 		T18 arg18,
8331*61046927SAndroid Build Coastguard Worker 		T19 arg19,
8332*61046927SAndroid Build Coastguard Worker 		T20 arg20,
8333*61046927SAndroid Build Coastguard Worker 		T21 arg21,
8334*61046927SAndroid Build Coastguard Worker 		T22 arg22,
8335*61046927SAndroid Build Coastguard Worker 		T23 arg23,
8336*61046927SAndroid Build Coastguard Worker 		T24 arg24,
8337*61046927SAndroid Build Coastguard Worker 		T25 arg25,
8338*61046927SAndroid Build Coastguard Worker 		T26 arg26,
8339*61046927SAndroid Build Coastguard Worker 		T27 arg27,
8340*61046927SAndroid Build Coastguard Worker 		T28 arg28)
8341*61046927SAndroid Build Coastguard Worker 	{
8342*61046927SAndroid Build Coastguard Worker 		return functor_(
8343*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
8344*61046927SAndroid Build Coastguard Worker 			arg0,
8345*61046927SAndroid Build Coastguard Worker 			arg1,
8346*61046927SAndroid Build Coastguard Worker 			arg2,
8347*61046927SAndroid Build Coastguard Worker 			arg3,
8348*61046927SAndroid Build Coastguard Worker 			arg4,
8349*61046927SAndroid Build Coastguard Worker 			arg5,
8350*61046927SAndroid Build Coastguard Worker 			arg6,
8351*61046927SAndroid Build Coastguard Worker 			arg7,
8352*61046927SAndroid Build Coastguard Worker 			arg8,
8353*61046927SAndroid Build Coastguard Worker 			arg9,
8354*61046927SAndroid Build Coastguard Worker 			arg10,
8355*61046927SAndroid Build Coastguard Worker 			arg11,
8356*61046927SAndroid Build Coastguard Worker 			arg12,
8357*61046927SAndroid Build Coastguard Worker 			arg13,
8358*61046927SAndroid Build Coastguard Worker 			arg14,
8359*61046927SAndroid Build Coastguard Worker 			arg15,
8360*61046927SAndroid Build Coastguard Worker 			arg16,
8361*61046927SAndroid Build Coastguard Worker 			arg17,
8362*61046927SAndroid Build Coastguard Worker 			arg18,
8363*61046927SAndroid Build Coastguard Worker 			arg19,
8364*61046927SAndroid Build Coastguard Worker 			arg20,
8365*61046927SAndroid Build Coastguard Worker 			arg21,
8366*61046927SAndroid Build Coastguard Worker 			arg22,
8367*61046927SAndroid Build Coastguard Worker 			arg23,
8368*61046927SAndroid Build Coastguard Worker 			arg24,
8369*61046927SAndroid Build Coastguard Worker 			arg25,
8370*61046927SAndroid Build Coastguard Worker 			arg26,
8371*61046927SAndroid Build Coastguard Worker 			arg27,
8372*61046927SAndroid Build Coastguard Worker 			arg28);
8373*61046927SAndroid Build Coastguard Worker 	}
8374*61046927SAndroid Build Coastguard Worker 
8375*61046927SAndroid Build Coastguard Worker 
8376*61046927SAndroid Build Coastguard Worker };
8377*61046927SAndroid Build Coastguard Worker 
8378*61046927SAndroid Build Coastguard Worker template<
8379*61046927SAndroid Build Coastguard Worker 	typename T0,
8380*61046927SAndroid Build Coastguard Worker 	typename T1,
8381*61046927SAndroid Build Coastguard Worker 	typename T2,
8382*61046927SAndroid Build Coastguard Worker 	typename T3,
8383*61046927SAndroid Build Coastguard Worker 	typename T4,
8384*61046927SAndroid Build Coastguard Worker 	typename T5,
8385*61046927SAndroid Build Coastguard Worker 	typename T6,
8386*61046927SAndroid Build Coastguard Worker 	typename T7,
8387*61046927SAndroid Build Coastguard Worker 	typename T8,
8388*61046927SAndroid Build Coastguard Worker 	typename T9,
8389*61046927SAndroid Build Coastguard Worker 	typename T10,
8390*61046927SAndroid Build Coastguard Worker 	typename T11,
8391*61046927SAndroid Build Coastguard Worker 	typename T12,
8392*61046927SAndroid Build Coastguard Worker 	typename T13,
8393*61046927SAndroid Build Coastguard Worker 	typename T14,
8394*61046927SAndroid Build Coastguard Worker 	typename T15,
8395*61046927SAndroid Build Coastguard Worker 	typename T16,
8396*61046927SAndroid Build Coastguard Worker 	typename T17,
8397*61046927SAndroid Build Coastguard Worker 	typename T18,
8398*61046927SAndroid Build Coastguard Worker 	typename T19,
8399*61046927SAndroid Build Coastguard Worker 	typename T20,
8400*61046927SAndroid Build Coastguard Worker 	typename T21,
8401*61046927SAndroid Build Coastguard Worker 	typename T22,
8402*61046927SAndroid Build Coastguard Worker 	typename T23,
8403*61046927SAndroid Build Coastguard Worker 	typename T24,
8404*61046927SAndroid Build Coastguard Worker 	typename T25,
8405*61046927SAndroid Build Coastguard Worker 	typename T26,
8406*61046927SAndroid Build Coastguard Worker 	typename T27>
8407*61046927SAndroid Build Coastguard Worker struct functionImplementation_
8408*61046927SAndroid Build Coastguard Worker <	T0,
8409*61046927SAndroid Build Coastguard Worker 	T1,
8410*61046927SAndroid Build Coastguard Worker 	T2,
8411*61046927SAndroid Build Coastguard Worker 	T3,
8412*61046927SAndroid Build Coastguard Worker 	T4,
8413*61046927SAndroid Build Coastguard Worker 	T5,
8414*61046927SAndroid Build Coastguard Worker 	T6,
8415*61046927SAndroid Build Coastguard Worker 	T7,
8416*61046927SAndroid Build Coastguard Worker 	T8,
8417*61046927SAndroid Build Coastguard Worker 	T9,
8418*61046927SAndroid Build Coastguard Worker 	T10,
8419*61046927SAndroid Build Coastguard Worker 	T11,
8420*61046927SAndroid Build Coastguard Worker 	T12,
8421*61046927SAndroid Build Coastguard Worker 	T13,
8422*61046927SAndroid Build Coastguard Worker 	T14,
8423*61046927SAndroid Build Coastguard Worker 	T15,
8424*61046927SAndroid Build Coastguard Worker 	T16,
8425*61046927SAndroid Build Coastguard Worker 	T17,
8426*61046927SAndroid Build Coastguard Worker 	T18,
8427*61046927SAndroid Build Coastguard Worker 	T19,
8428*61046927SAndroid Build Coastguard Worker 	T20,
8429*61046927SAndroid Build Coastguard Worker 	T21,
8430*61046927SAndroid Build Coastguard Worker 	T22,
8431*61046927SAndroid Build Coastguard Worker 	T23,
8432*61046927SAndroid Build Coastguard Worker 	T24,
8433*61046927SAndroid Build Coastguard Worker 	T25,
8434*61046927SAndroid Build Coastguard Worker 	T26,
8435*61046927SAndroid Build Coastguard Worker 	T27,
8436*61046927SAndroid Build Coastguard Worker 	NullType,
8437*61046927SAndroid Build Coastguard Worker 	NullType,
8438*61046927SAndroid Build Coastguard Worker 	NullType,
8439*61046927SAndroid Build Coastguard Worker 	NullType>
8440*61046927SAndroid Build Coastguard Worker {
8441*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
8442*61046927SAndroid Build Coastguard Worker 		T0,
8443*61046927SAndroid Build Coastguard Worker 		T1,
8444*61046927SAndroid Build Coastguard Worker 		T2,
8445*61046927SAndroid Build Coastguard Worker 		T3,
8446*61046927SAndroid Build Coastguard Worker 		T4,
8447*61046927SAndroid Build Coastguard Worker 		T5,
8448*61046927SAndroid Build Coastguard Worker 		T6,
8449*61046927SAndroid Build Coastguard Worker 		T7,
8450*61046927SAndroid Build Coastguard Worker 		T8,
8451*61046927SAndroid Build Coastguard Worker 		T9,
8452*61046927SAndroid Build Coastguard Worker 		T10,
8453*61046927SAndroid Build Coastguard Worker 		T11,
8454*61046927SAndroid Build Coastguard Worker 		T12,
8455*61046927SAndroid Build Coastguard Worker 		T13,
8456*61046927SAndroid Build Coastguard Worker 		T14,
8457*61046927SAndroid Build Coastguard Worker 		T15,
8458*61046927SAndroid Build Coastguard Worker 		T16,
8459*61046927SAndroid Build Coastguard Worker 		T17,
8460*61046927SAndroid Build Coastguard Worker 		T18,
8461*61046927SAndroid Build Coastguard Worker 		T19,
8462*61046927SAndroid Build Coastguard Worker 		T20,
8463*61046927SAndroid Build Coastguard Worker 		T21,
8464*61046927SAndroid Build Coastguard Worker 		T22,
8465*61046927SAndroid Build Coastguard Worker 		T23,
8466*61046927SAndroid Build Coastguard Worker 		T24,
8467*61046927SAndroid Build Coastguard Worker 		T25,
8468*61046927SAndroid Build Coastguard Worker 		T26,
8469*61046927SAndroid Build Coastguard Worker 		T27,
8470*61046927SAndroid Build Coastguard Worker 		NullType,
8471*61046927SAndroid Build Coastguard Worker 		NullType,
8472*61046927SAndroid Build Coastguard Worker 		NullType,
8473*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
8474*61046927SAndroid Build Coastguard Worker 
8475*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
8476*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_8477*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
8478*61046927SAndroid Build Coastguard Worker         functor_(functor)
8479*61046927SAndroid Build Coastguard Worker     {
8480*61046927SAndroid Build Coastguard Worker 
8481*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28))
8482*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
8483*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8484*61046927SAndroid Build Coastguard Worker         #endif
8485*61046927SAndroid Build Coastguard Worker 
8486*61046927SAndroid Build Coastguard Worker     }
8487*61046927SAndroid Build Coastguard Worker 
8488*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
8489*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
8490*61046927SAndroid Build Coastguard Worker 
8491*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
8492*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
8493*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
8494*61046927SAndroid Build Coastguard Worker 		T0,
8495*61046927SAndroid Build Coastguard Worker 		T1,
8496*61046927SAndroid Build Coastguard Worker 		T2,
8497*61046927SAndroid Build Coastguard Worker 		T3,
8498*61046927SAndroid Build Coastguard Worker 		T4,
8499*61046927SAndroid Build Coastguard Worker 		T5,
8500*61046927SAndroid Build Coastguard Worker 		T6,
8501*61046927SAndroid Build Coastguard Worker 		T7,
8502*61046927SAndroid Build Coastguard Worker 		T8,
8503*61046927SAndroid Build Coastguard Worker 		T9,
8504*61046927SAndroid Build Coastguard Worker 		T10,
8505*61046927SAndroid Build Coastguard Worker 		T11,
8506*61046927SAndroid Build Coastguard Worker 		T12,
8507*61046927SAndroid Build Coastguard Worker 		T13,
8508*61046927SAndroid Build Coastguard Worker 		T14,
8509*61046927SAndroid Build Coastguard Worker 		T15,
8510*61046927SAndroid Build Coastguard Worker 		T16,
8511*61046927SAndroid Build Coastguard Worker 		T17,
8512*61046927SAndroid Build Coastguard Worker 		T18,
8513*61046927SAndroid Build Coastguard Worker 		T19,
8514*61046927SAndroid Build Coastguard Worker 		T20,
8515*61046927SAndroid Build Coastguard Worker 		T21,
8516*61046927SAndroid Build Coastguard Worker 		T22,
8517*61046927SAndroid Build Coastguard Worker 		T23,
8518*61046927SAndroid Build Coastguard Worker 		T24,
8519*61046927SAndroid Build Coastguard Worker 		T25,
8520*61046927SAndroid Build Coastguard Worker 		T26,
8521*61046927SAndroid Build Coastguard Worker 		T27);
8522*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_8523*61046927SAndroid Build Coastguard Worker 	Event operator()(
8524*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
8525*61046927SAndroid Build Coastguard Worker 		T0 arg0,
8526*61046927SAndroid Build Coastguard Worker 		T1 arg1,
8527*61046927SAndroid Build Coastguard Worker 		T2 arg2,
8528*61046927SAndroid Build Coastguard Worker 		T3 arg3,
8529*61046927SAndroid Build Coastguard Worker 		T4 arg4,
8530*61046927SAndroid Build Coastguard Worker 		T5 arg5,
8531*61046927SAndroid Build Coastguard Worker 		T6 arg6,
8532*61046927SAndroid Build Coastguard Worker 		T7 arg7,
8533*61046927SAndroid Build Coastguard Worker 		T8 arg8,
8534*61046927SAndroid Build Coastguard Worker 		T9 arg9,
8535*61046927SAndroid Build Coastguard Worker 		T10 arg10,
8536*61046927SAndroid Build Coastguard Worker 		T11 arg11,
8537*61046927SAndroid Build Coastguard Worker 		T12 arg12,
8538*61046927SAndroid Build Coastguard Worker 		T13 arg13,
8539*61046927SAndroid Build Coastguard Worker 		T14 arg14,
8540*61046927SAndroid Build Coastguard Worker 		T15 arg15,
8541*61046927SAndroid Build Coastguard Worker 		T16 arg16,
8542*61046927SAndroid Build Coastguard Worker 		T17 arg17,
8543*61046927SAndroid Build Coastguard Worker 		T18 arg18,
8544*61046927SAndroid Build Coastguard Worker 		T19 arg19,
8545*61046927SAndroid Build Coastguard Worker 		T20 arg20,
8546*61046927SAndroid Build Coastguard Worker 		T21 arg21,
8547*61046927SAndroid Build Coastguard Worker 		T22 arg22,
8548*61046927SAndroid Build Coastguard Worker 		T23 arg23,
8549*61046927SAndroid Build Coastguard Worker 		T24 arg24,
8550*61046927SAndroid Build Coastguard Worker 		T25 arg25,
8551*61046927SAndroid Build Coastguard Worker 		T26 arg26,
8552*61046927SAndroid Build Coastguard Worker 		T27 arg27)
8553*61046927SAndroid Build Coastguard Worker 	{
8554*61046927SAndroid Build Coastguard Worker 		return functor_(
8555*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
8556*61046927SAndroid Build Coastguard Worker 			arg0,
8557*61046927SAndroid Build Coastguard Worker 			arg1,
8558*61046927SAndroid Build Coastguard Worker 			arg2,
8559*61046927SAndroid Build Coastguard Worker 			arg3,
8560*61046927SAndroid Build Coastguard Worker 			arg4,
8561*61046927SAndroid Build Coastguard Worker 			arg5,
8562*61046927SAndroid Build Coastguard Worker 			arg6,
8563*61046927SAndroid Build Coastguard Worker 			arg7,
8564*61046927SAndroid Build Coastguard Worker 			arg8,
8565*61046927SAndroid Build Coastguard Worker 			arg9,
8566*61046927SAndroid Build Coastguard Worker 			arg10,
8567*61046927SAndroid Build Coastguard Worker 			arg11,
8568*61046927SAndroid Build Coastguard Worker 			arg12,
8569*61046927SAndroid Build Coastguard Worker 			arg13,
8570*61046927SAndroid Build Coastguard Worker 			arg14,
8571*61046927SAndroid Build Coastguard Worker 			arg15,
8572*61046927SAndroid Build Coastguard Worker 			arg16,
8573*61046927SAndroid Build Coastguard Worker 			arg17,
8574*61046927SAndroid Build Coastguard Worker 			arg18,
8575*61046927SAndroid Build Coastguard Worker 			arg19,
8576*61046927SAndroid Build Coastguard Worker 			arg20,
8577*61046927SAndroid Build Coastguard Worker 			arg21,
8578*61046927SAndroid Build Coastguard Worker 			arg22,
8579*61046927SAndroid Build Coastguard Worker 			arg23,
8580*61046927SAndroid Build Coastguard Worker 			arg24,
8581*61046927SAndroid Build Coastguard Worker 			arg25,
8582*61046927SAndroid Build Coastguard Worker 			arg26,
8583*61046927SAndroid Build Coastguard Worker 			arg27);
8584*61046927SAndroid Build Coastguard Worker 	}
8585*61046927SAndroid Build Coastguard Worker 
8586*61046927SAndroid Build Coastguard Worker 
8587*61046927SAndroid Build Coastguard Worker };
8588*61046927SAndroid Build Coastguard Worker 
8589*61046927SAndroid Build Coastguard Worker template<
8590*61046927SAndroid Build Coastguard Worker 	typename T0,
8591*61046927SAndroid Build Coastguard Worker 	typename T1,
8592*61046927SAndroid Build Coastguard Worker 	typename T2,
8593*61046927SAndroid Build Coastguard Worker 	typename T3,
8594*61046927SAndroid Build Coastguard Worker 	typename T4,
8595*61046927SAndroid Build Coastguard Worker 	typename T5,
8596*61046927SAndroid Build Coastguard Worker 	typename T6,
8597*61046927SAndroid Build Coastguard Worker 	typename T7,
8598*61046927SAndroid Build Coastguard Worker 	typename T8,
8599*61046927SAndroid Build Coastguard Worker 	typename T9,
8600*61046927SAndroid Build Coastguard Worker 	typename T10,
8601*61046927SAndroid Build Coastguard Worker 	typename T11,
8602*61046927SAndroid Build Coastguard Worker 	typename T12,
8603*61046927SAndroid Build Coastguard Worker 	typename T13,
8604*61046927SAndroid Build Coastguard Worker 	typename T14,
8605*61046927SAndroid Build Coastguard Worker 	typename T15,
8606*61046927SAndroid Build Coastguard Worker 	typename T16,
8607*61046927SAndroid Build Coastguard Worker 	typename T17,
8608*61046927SAndroid Build Coastguard Worker 	typename T18,
8609*61046927SAndroid Build Coastguard Worker 	typename T19,
8610*61046927SAndroid Build Coastguard Worker 	typename T20,
8611*61046927SAndroid Build Coastguard Worker 	typename T21,
8612*61046927SAndroid Build Coastguard Worker 	typename T22,
8613*61046927SAndroid Build Coastguard Worker 	typename T23,
8614*61046927SAndroid Build Coastguard Worker 	typename T24,
8615*61046927SAndroid Build Coastguard Worker 	typename T25,
8616*61046927SAndroid Build Coastguard Worker 	typename T26>
8617*61046927SAndroid Build Coastguard Worker struct functionImplementation_
8618*61046927SAndroid Build Coastguard Worker <	T0,
8619*61046927SAndroid Build Coastguard Worker 	T1,
8620*61046927SAndroid Build Coastguard Worker 	T2,
8621*61046927SAndroid Build Coastguard Worker 	T3,
8622*61046927SAndroid Build Coastguard Worker 	T4,
8623*61046927SAndroid Build Coastguard Worker 	T5,
8624*61046927SAndroid Build Coastguard Worker 	T6,
8625*61046927SAndroid Build Coastguard Worker 	T7,
8626*61046927SAndroid Build Coastguard Worker 	T8,
8627*61046927SAndroid Build Coastguard Worker 	T9,
8628*61046927SAndroid Build Coastguard Worker 	T10,
8629*61046927SAndroid Build Coastguard Worker 	T11,
8630*61046927SAndroid Build Coastguard Worker 	T12,
8631*61046927SAndroid Build Coastguard Worker 	T13,
8632*61046927SAndroid Build Coastguard Worker 	T14,
8633*61046927SAndroid Build Coastguard Worker 	T15,
8634*61046927SAndroid Build Coastguard Worker 	T16,
8635*61046927SAndroid Build Coastguard Worker 	T17,
8636*61046927SAndroid Build Coastguard Worker 	T18,
8637*61046927SAndroid Build Coastguard Worker 	T19,
8638*61046927SAndroid Build Coastguard Worker 	T20,
8639*61046927SAndroid Build Coastguard Worker 	T21,
8640*61046927SAndroid Build Coastguard Worker 	T22,
8641*61046927SAndroid Build Coastguard Worker 	T23,
8642*61046927SAndroid Build Coastguard Worker 	T24,
8643*61046927SAndroid Build Coastguard Worker 	T25,
8644*61046927SAndroid Build Coastguard Worker 	T26,
8645*61046927SAndroid Build Coastguard Worker 	NullType,
8646*61046927SAndroid Build Coastguard Worker 	NullType,
8647*61046927SAndroid Build Coastguard Worker 	NullType,
8648*61046927SAndroid Build Coastguard Worker 	NullType,
8649*61046927SAndroid Build Coastguard Worker 	NullType>
8650*61046927SAndroid Build Coastguard Worker {
8651*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
8652*61046927SAndroid Build Coastguard Worker 		T0,
8653*61046927SAndroid Build Coastguard Worker 		T1,
8654*61046927SAndroid Build Coastguard Worker 		T2,
8655*61046927SAndroid Build Coastguard Worker 		T3,
8656*61046927SAndroid Build Coastguard Worker 		T4,
8657*61046927SAndroid Build Coastguard Worker 		T5,
8658*61046927SAndroid Build Coastguard Worker 		T6,
8659*61046927SAndroid Build Coastguard Worker 		T7,
8660*61046927SAndroid Build Coastguard Worker 		T8,
8661*61046927SAndroid Build Coastguard Worker 		T9,
8662*61046927SAndroid Build Coastguard Worker 		T10,
8663*61046927SAndroid Build Coastguard Worker 		T11,
8664*61046927SAndroid Build Coastguard Worker 		T12,
8665*61046927SAndroid Build Coastguard Worker 		T13,
8666*61046927SAndroid Build Coastguard Worker 		T14,
8667*61046927SAndroid Build Coastguard Worker 		T15,
8668*61046927SAndroid Build Coastguard Worker 		T16,
8669*61046927SAndroid Build Coastguard Worker 		T17,
8670*61046927SAndroid Build Coastguard Worker 		T18,
8671*61046927SAndroid Build Coastguard Worker 		T19,
8672*61046927SAndroid Build Coastguard Worker 		T20,
8673*61046927SAndroid Build Coastguard Worker 		T21,
8674*61046927SAndroid Build Coastguard Worker 		T22,
8675*61046927SAndroid Build Coastguard Worker 		T23,
8676*61046927SAndroid Build Coastguard Worker 		T24,
8677*61046927SAndroid Build Coastguard Worker 		T25,
8678*61046927SAndroid Build Coastguard Worker 		T26,
8679*61046927SAndroid Build Coastguard Worker 		NullType,
8680*61046927SAndroid Build Coastguard Worker 		NullType,
8681*61046927SAndroid Build Coastguard Worker 		NullType,
8682*61046927SAndroid Build Coastguard Worker 		NullType,
8683*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
8684*61046927SAndroid Build Coastguard Worker 
8685*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
8686*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_8687*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
8688*61046927SAndroid Build Coastguard Worker         functor_(functor)
8689*61046927SAndroid Build Coastguard Worker     {
8690*61046927SAndroid Build Coastguard Worker 
8691*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27))
8692*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
8693*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8694*61046927SAndroid Build Coastguard Worker         #endif
8695*61046927SAndroid Build Coastguard Worker 
8696*61046927SAndroid Build Coastguard Worker     }
8697*61046927SAndroid Build Coastguard Worker 
8698*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
8699*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
8700*61046927SAndroid Build Coastguard Worker 
8701*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
8702*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
8703*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
8704*61046927SAndroid Build Coastguard Worker 		T0,
8705*61046927SAndroid Build Coastguard Worker 		T1,
8706*61046927SAndroid Build Coastguard Worker 		T2,
8707*61046927SAndroid Build Coastguard Worker 		T3,
8708*61046927SAndroid Build Coastguard Worker 		T4,
8709*61046927SAndroid Build Coastguard Worker 		T5,
8710*61046927SAndroid Build Coastguard Worker 		T6,
8711*61046927SAndroid Build Coastguard Worker 		T7,
8712*61046927SAndroid Build Coastguard Worker 		T8,
8713*61046927SAndroid Build Coastguard Worker 		T9,
8714*61046927SAndroid Build Coastguard Worker 		T10,
8715*61046927SAndroid Build Coastguard Worker 		T11,
8716*61046927SAndroid Build Coastguard Worker 		T12,
8717*61046927SAndroid Build Coastguard Worker 		T13,
8718*61046927SAndroid Build Coastguard Worker 		T14,
8719*61046927SAndroid Build Coastguard Worker 		T15,
8720*61046927SAndroid Build Coastguard Worker 		T16,
8721*61046927SAndroid Build Coastguard Worker 		T17,
8722*61046927SAndroid Build Coastguard Worker 		T18,
8723*61046927SAndroid Build Coastguard Worker 		T19,
8724*61046927SAndroid Build Coastguard Worker 		T20,
8725*61046927SAndroid Build Coastguard Worker 		T21,
8726*61046927SAndroid Build Coastguard Worker 		T22,
8727*61046927SAndroid Build Coastguard Worker 		T23,
8728*61046927SAndroid Build Coastguard Worker 		T24,
8729*61046927SAndroid Build Coastguard Worker 		T25,
8730*61046927SAndroid Build Coastguard Worker 		T26);
8731*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_8732*61046927SAndroid Build Coastguard Worker 	Event operator()(
8733*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
8734*61046927SAndroid Build Coastguard Worker 		T0 arg0,
8735*61046927SAndroid Build Coastguard Worker 		T1 arg1,
8736*61046927SAndroid Build Coastguard Worker 		T2 arg2,
8737*61046927SAndroid Build Coastguard Worker 		T3 arg3,
8738*61046927SAndroid Build Coastguard Worker 		T4 arg4,
8739*61046927SAndroid Build Coastguard Worker 		T5 arg5,
8740*61046927SAndroid Build Coastguard Worker 		T6 arg6,
8741*61046927SAndroid Build Coastguard Worker 		T7 arg7,
8742*61046927SAndroid Build Coastguard Worker 		T8 arg8,
8743*61046927SAndroid Build Coastguard Worker 		T9 arg9,
8744*61046927SAndroid Build Coastguard Worker 		T10 arg10,
8745*61046927SAndroid Build Coastguard Worker 		T11 arg11,
8746*61046927SAndroid Build Coastguard Worker 		T12 arg12,
8747*61046927SAndroid Build Coastguard Worker 		T13 arg13,
8748*61046927SAndroid Build Coastguard Worker 		T14 arg14,
8749*61046927SAndroid Build Coastguard Worker 		T15 arg15,
8750*61046927SAndroid Build Coastguard Worker 		T16 arg16,
8751*61046927SAndroid Build Coastguard Worker 		T17 arg17,
8752*61046927SAndroid Build Coastguard Worker 		T18 arg18,
8753*61046927SAndroid Build Coastguard Worker 		T19 arg19,
8754*61046927SAndroid Build Coastguard Worker 		T20 arg20,
8755*61046927SAndroid Build Coastguard Worker 		T21 arg21,
8756*61046927SAndroid Build Coastguard Worker 		T22 arg22,
8757*61046927SAndroid Build Coastguard Worker 		T23 arg23,
8758*61046927SAndroid Build Coastguard Worker 		T24 arg24,
8759*61046927SAndroid Build Coastguard Worker 		T25 arg25,
8760*61046927SAndroid Build Coastguard Worker 		T26 arg26)
8761*61046927SAndroid Build Coastguard Worker 	{
8762*61046927SAndroid Build Coastguard Worker 		return functor_(
8763*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
8764*61046927SAndroid Build Coastguard Worker 			arg0,
8765*61046927SAndroid Build Coastguard Worker 			arg1,
8766*61046927SAndroid Build Coastguard Worker 			arg2,
8767*61046927SAndroid Build Coastguard Worker 			arg3,
8768*61046927SAndroid Build Coastguard Worker 			arg4,
8769*61046927SAndroid Build Coastguard Worker 			arg5,
8770*61046927SAndroid Build Coastguard Worker 			arg6,
8771*61046927SAndroid Build Coastguard Worker 			arg7,
8772*61046927SAndroid Build Coastguard Worker 			arg8,
8773*61046927SAndroid Build Coastguard Worker 			arg9,
8774*61046927SAndroid Build Coastguard Worker 			arg10,
8775*61046927SAndroid Build Coastguard Worker 			arg11,
8776*61046927SAndroid Build Coastguard Worker 			arg12,
8777*61046927SAndroid Build Coastguard Worker 			arg13,
8778*61046927SAndroid Build Coastguard Worker 			arg14,
8779*61046927SAndroid Build Coastguard Worker 			arg15,
8780*61046927SAndroid Build Coastguard Worker 			arg16,
8781*61046927SAndroid Build Coastguard Worker 			arg17,
8782*61046927SAndroid Build Coastguard Worker 			arg18,
8783*61046927SAndroid Build Coastguard Worker 			arg19,
8784*61046927SAndroid Build Coastguard Worker 			arg20,
8785*61046927SAndroid Build Coastguard Worker 			arg21,
8786*61046927SAndroid Build Coastguard Worker 			arg22,
8787*61046927SAndroid Build Coastguard Worker 			arg23,
8788*61046927SAndroid Build Coastguard Worker 			arg24,
8789*61046927SAndroid Build Coastguard Worker 			arg25,
8790*61046927SAndroid Build Coastguard Worker 			arg26);
8791*61046927SAndroid Build Coastguard Worker 	}
8792*61046927SAndroid Build Coastguard Worker 
8793*61046927SAndroid Build Coastguard Worker 
8794*61046927SAndroid Build Coastguard Worker };
8795*61046927SAndroid Build Coastguard Worker 
8796*61046927SAndroid Build Coastguard Worker template<
8797*61046927SAndroid Build Coastguard Worker 	typename T0,
8798*61046927SAndroid Build Coastguard Worker 	typename T1,
8799*61046927SAndroid Build Coastguard Worker 	typename T2,
8800*61046927SAndroid Build Coastguard Worker 	typename T3,
8801*61046927SAndroid Build Coastguard Worker 	typename T4,
8802*61046927SAndroid Build Coastguard Worker 	typename T5,
8803*61046927SAndroid Build Coastguard Worker 	typename T6,
8804*61046927SAndroid Build Coastguard Worker 	typename T7,
8805*61046927SAndroid Build Coastguard Worker 	typename T8,
8806*61046927SAndroid Build Coastguard Worker 	typename T9,
8807*61046927SAndroid Build Coastguard Worker 	typename T10,
8808*61046927SAndroid Build Coastguard Worker 	typename T11,
8809*61046927SAndroid Build Coastguard Worker 	typename T12,
8810*61046927SAndroid Build Coastguard Worker 	typename T13,
8811*61046927SAndroid Build Coastguard Worker 	typename T14,
8812*61046927SAndroid Build Coastguard Worker 	typename T15,
8813*61046927SAndroid Build Coastguard Worker 	typename T16,
8814*61046927SAndroid Build Coastguard Worker 	typename T17,
8815*61046927SAndroid Build Coastguard Worker 	typename T18,
8816*61046927SAndroid Build Coastguard Worker 	typename T19,
8817*61046927SAndroid Build Coastguard Worker 	typename T20,
8818*61046927SAndroid Build Coastguard Worker 	typename T21,
8819*61046927SAndroid Build Coastguard Worker 	typename T22,
8820*61046927SAndroid Build Coastguard Worker 	typename T23,
8821*61046927SAndroid Build Coastguard Worker 	typename T24,
8822*61046927SAndroid Build Coastguard Worker 	typename T25>
8823*61046927SAndroid Build Coastguard Worker struct functionImplementation_
8824*61046927SAndroid Build Coastguard Worker <	T0,
8825*61046927SAndroid Build Coastguard Worker 	T1,
8826*61046927SAndroid Build Coastguard Worker 	T2,
8827*61046927SAndroid Build Coastguard Worker 	T3,
8828*61046927SAndroid Build Coastguard Worker 	T4,
8829*61046927SAndroid Build Coastguard Worker 	T5,
8830*61046927SAndroid Build Coastguard Worker 	T6,
8831*61046927SAndroid Build Coastguard Worker 	T7,
8832*61046927SAndroid Build Coastguard Worker 	T8,
8833*61046927SAndroid Build Coastguard Worker 	T9,
8834*61046927SAndroid Build Coastguard Worker 	T10,
8835*61046927SAndroid Build Coastguard Worker 	T11,
8836*61046927SAndroid Build Coastguard Worker 	T12,
8837*61046927SAndroid Build Coastguard Worker 	T13,
8838*61046927SAndroid Build Coastguard Worker 	T14,
8839*61046927SAndroid Build Coastguard Worker 	T15,
8840*61046927SAndroid Build Coastguard Worker 	T16,
8841*61046927SAndroid Build Coastguard Worker 	T17,
8842*61046927SAndroid Build Coastguard Worker 	T18,
8843*61046927SAndroid Build Coastguard Worker 	T19,
8844*61046927SAndroid Build Coastguard Worker 	T20,
8845*61046927SAndroid Build Coastguard Worker 	T21,
8846*61046927SAndroid Build Coastguard Worker 	T22,
8847*61046927SAndroid Build Coastguard Worker 	T23,
8848*61046927SAndroid Build Coastguard Worker 	T24,
8849*61046927SAndroid Build Coastguard Worker 	T25,
8850*61046927SAndroid Build Coastguard Worker 	NullType,
8851*61046927SAndroid Build Coastguard Worker 	NullType,
8852*61046927SAndroid Build Coastguard Worker 	NullType,
8853*61046927SAndroid Build Coastguard Worker 	NullType,
8854*61046927SAndroid Build Coastguard Worker 	NullType,
8855*61046927SAndroid Build Coastguard Worker 	NullType>
8856*61046927SAndroid Build Coastguard Worker {
8857*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
8858*61046927SAndroid Build Coastguard Worker 		T0,
8859*61046927SAndroid Build Coastguard Worker 		T1,
8860*61046927SAndroid Build Coastguard Worker 		T2,
8861*61046927SAndroid Build Coastguard Worker 		T3,
8862*61046927SAndroid Build Coastguard Worker 		T4,
8863*61046927SAndroid Build Coastguard Worker 		T5,
8864*61046927SAndroid Build Coastguard Worker 		T6,
8865*61046927SAndroid Build Coastguard Worker 		T7,
8866*61046927SAndroid Build Coastguard Worker 		T8,
8867*61046927SAndroid Build Coastguard Worker 		T9,
8868*61046927SAndroid Build Coastguard Worker 		T10,
8869*61046927SAndroid Build Coastguard Worker 		T11,
8870*61046927SAndroid Build Coastguard Worker 		T12,
8871*61046927SAndroid Build Coastguard Worker 		T13,
8872*61046927SAndroid Build Coastguard Worker 		T14,
8873*61046927SAndroid Build Coastguard Worker 		T15,
8874*61046927SAndroid Build Coastguard Worker 		T16,
8875*61046927SAndroid Build Coastguard Worker 		T17,
8876*61046927SAndroid Build Coastguard Worker 		T18,
8877*61046927SAndroid Build Coastguard Worker 		T19,
8878*61046927SAndroid Build Coastguard Worker 		T20,
8879*61046927SAndroid Build Coastguard Worker 		T21,
8880*61046927SAndroid Build Coastguard Worker 		T22,
8881*61046927SAndroid Build Coastguard Worker 		T23,
8882*61046927SAndroid Build Coastguard Worker 		T24,
8883*61046927SAndroid Build Coastguard Worker 		T25,
8884*61046927SAndroid Build Coastguard Worker 		NullType,
8885*61046927SAndroid Build Coastguard Worker 		NullType,
8886*61046927SAndroid Build Coastguard Worker 		NullType,
8887*61046927SAndroid Build Coastguard Worker 		NullType,
8888*61046927SAndroid Build Coastguard Worker 		NullType,
8889*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
8890*61046927SAndroid Build Coastguard Worker 
8891*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
8892*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_8893*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
8894*61046927SAndroid Build Coastguard Worker         functor_(functor)
8895*61046927SAndroid Build Coastguard Worker     {
8896*61046927SAndroid Build Coastguard Worker 
8897*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26))
8898*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
8899*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8900*61046927SAndroid Build Coastguard Worker         #endif
8901*61046927SAndroid Build Coastguard Worker 
8902*61046927SAndroid Build Coastguard Worker     }
8903*61046927SAndroid Build Coastguard Worker 
8904*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
8905*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
8906*61046927SAndroid Build Coastguard Worker 
8907*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
8908*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
8909*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
8910*61046927SAndroid Build Coastguard Worker 		T0,
8911*61046927SAndroid Build Coastguard Worker 		T1,
8912*61046927SAndroid Build Coastguard Worker 		T2,
8913*61046927SAndroid Build Coastguard Worker 		T3,
8914*61046927SAndroid Build Coastguard Worker 		T4,
8915*61046927SAndroid Build Coastguard Worker 		T5,
8916*61046927SAndroid Build Coastguard Worker 		T6,
8917*61046927SAndroid Build Coastguard Worker 		T7,
8918*61046927SAndroid Build Coastguard Worker 		T8,
8919*61046927SAndroid Build Coastguard Worker 		T9,
8920*61046927SAndroid Build Coastguard Worker 		T10,
8921*61046927SAndroid Build Coastguard Worker 		T11,
8922*61046927SAndroid Build Coastguard Worker 		T12,
8923*61046927SAndroid Build Coastguard Worker 		T13,
8924*61046927SAndroid Build Coastguard Worker 		T14,
8925*61046927SAndroid Build Coastguard Worker 		T15,
8926*61046927SAndroid Build Coastguard Worker 		T16,
8927*61046927SAndroid Build Coastguard Worker 		T17,
8928*61046927SAndroid Build Coastguard Worker 		T18,
8929*61046927SAndroid Build Coastguard Worker 		T19,
8930*61046927SAndroid Build Coastguard Worker 		T20,
8931*61046927SAndroid Build Coastguard Worker 		T21,
8932*61046927SAndroid Build Coastguard Worker 		T22,
8933*61046927SAndroid Build Coastguard Worker 		T23,
8934*61046927SAndroid Build Coastguard Worker 		T24,
8935*61046927SAndroid Build Coastguard Worker 		T25);
8936*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_8937*61046927SAndroid Build Coastguard Worker 	Event operator()(
8938*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
8939*61046927SAndroid Build Coastguard Worker 		T0 arg0,
8940*61046927SAndroid Build Coastguard Worker 		T1 arg1,
8941*61046927SAndroid Build Coastguard Worker 		T2 arg2,
8942*61046927SAndroid Build Coastguard Worker 		T3 arg3,
8943*61046927SAndroid Build Coastguard Worker 		T4 arg4,
8944*61046927SAndroid Build Coastguard Worker 		T5 arg5,
8945*61046927SAndroid Build Coastguard Worker 		T6 arg6,
8946*61046927SAndroid Build Coastguard Worker 		T7 arg7,
8947*61046927SAndroid Build Coastguard Worker 		T8 arg8,
8948*61046927SAndroid Build Coastguard Worker 		T9 arg9,
8949*61046927SAndroid Build Coastguard Worker 		T10 arg10,
8950*61046927SAndroid Build Coastguard Worker 		T11 arg11,
8951*61046927SAndroid Build Coastguard Worker 		T12 arg12,
8952*61046927SAndroid Build Coastguard Worker 		T13 arg13,
8953*61046927SAndroid Build Coastguard Worker 		T14 arg14,
8954*61046927SAndroid Build Coastguard Worker 		T15 arg15,
8955*61046927SAndroid Build Coastguard Worker 		T16 arg16,
8956*61046927SAndroid Build Coastguard Worker 		T17 arg17,
8957*61046927SAndroid Build Coastguard Worker 		T18 arg18,
8958*61046927SAndroid Build Coastguard Worker 		T19 arg19,
8959*61046927SAndroid Build Coastguard Worker 		T20 arg20,
8960*61046927SAndroid Build Coastguard Worker 		T21 arg21,
8961*61046927SAndroid Build Coastguard Worker 		T22 arg22,
8962*61046927SAndroid Build Coastguard Worker 		T23 arg23,
8963*61046927SAndroid Build Coastguard Worker 		T24 arg24,
8964*61046927SAndroid Build Coastguard Worker 		T25 arg25)
8965*61046927SAndroid Build Coastguard Worker 	{
8966*61046927SAndroid Build Coastguard Worker 		return functor_(
8967*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
8968*61046927SAndroid Build Coastguard Worker 			arg0,
8969*61046927SAndroid Build Coastguard Worker 			arg1,
8970*61046927SAndroid Build Coastguard Worker 			arg2,
8971*61046927SAndroid Build Coastguard Worker 			arg3,
8972*61046927SAndroid Build Coastguard Worker 			arg4,
8973*61046927SAndroid Build Coastguard Worker 			arg5,
8974*61046927SAndroid Build Coastguard Worker 			arg6,
8975*61046927SAndroid Build Coastguard Worker 			arg7,
8976*61046927SAndroid Build Coastguard Worker 			arg8,
8977*61046927SAndroid Build Coastguard Worker 			arg9,
8978*61046927SAndroid Build Coastguard Worker 			arg10,
8979*61046927SAndroid Build Coastguard Worker 			arg11,
8980*61046927SAndroid Build Coastguard Worker 			arg12,
8981*61046927SAndroid Build Coastguard Worker 			arg13,
8982*61046927SAndroid Build Coastguard Worker 			arg14,
8983*61046927SAndroid Build Coastguard Worker 			arg15,
8984*61046927SAndroid Build Coastguard Worker 			arg16,
8985*61046927SAndroid Build Coastguard Worker 			arg17,
8986*61046927SAndroid Build Coastguard Worker 			arg18,
8987*61046927SAndroid Build Coastguard Worker 			arg19,
8988*61046927SAndroid Build Coastguard Worker 			arg20,
8989*61046927SAndroid Build Coastguard Worker 			arg21,
8990*61046927SAndroid Build Coastguard Worker 			arg22,
8991*61046927SAndroid Build Coastguard Worker 			arg23,
8992*61046927SAndroid Build Coastguard Worker 			arg24,
8993*61046927SAndroid Build Coastguard Worker 			arg25);
8994*61046927SAndroid Build Coastguard Worker 	}
8995*61046927SAndroid Build Coastguard Worker 
8996*61046927SAndroid Build Coastguard Worker 
8997*61046927SAndroid Build Coastguard Worker };
8998*61046927SAndroid Build Coastguard Worker 
8999*61046927SAndroid Build Coastguard Worker template<
9000*61046927SAndroid Build Coastguard Worker 	typename T0,
9001*61046927SAndroid Build Coastguard Worker 	typename T1,
9002*61046927SAndroid Build Coastguard Worker 	typename T2,
9003*61046927SAndroid Build Coastguard Worker 	typename T3,
9004*61046927SAndroid Build Coastguard Worker 	typename T4,
9005*61046927SAndroid Build Coastguard Worker 	typename T5,
9006*61046927SAndroid Build Coastguard Worker 	typename T6,
9007*61046927SAndroid Build Coastguard Worker 	typename T7,
9008*61046927SAndroid Build Coastguard Worker 	typename T8,
9009*61046927SAndroid Build Coastguard Worker 	typename T9,
9010*61046927SAndroid Build Coastguard Worker 	typename T10,
9011*61046927SAndroid Build Coastguard Worker 	typename T11,
9012*61046927SAndroid Build Coastguard Worker 	typename T12,
9013*61046927SAndroid Build Coastguard Worker 	typename T13,
9014*61046927SAndroid Build Coastguard Worker 	typename T14,
9015*61046927SAndroid Build Coastguard Worker 	typename T15,
9016*61046927SAndroid Build Coastguard Worker 	typename T16,
9017*61046927SAndroid Build Coastguard Worker 	typename T17,
9018*61046927SAndroid Build Coastguard Worker 	typename T18,
9019*61046927SAndroid Build Coastguard Worker 	typename T19,
9020*61046927SAndroid Build Coastguard Worker 	typename T20,
9021*61046927SAndroid Build Coastguard Worker 	typename T21,
9022*61046927SAndroid Build Coastguard Worker 	typename T22,
9023*61046927SAndroid Build Coastguard Worker 	typename T23,
9024*61046927SAndroid Build Coastguard Worker 	typename T24>
9025*61046927SAndroid Build Coastguard Worker struct functionImplementation_
9026*61046927SAndroid Build Coastguard Worker <	T0,
9027*61046927SAndroid Build Coastguard Worker 	T1,
9028*61046927SAndroid Build Coastguard Worker 	T2,
9029*61046927SAndroid Build Coastguard Worker 	T3,
9030*61046927SAndroid Build Coastguard Worker 	T4,
9031*61046927SAndroid Build Coastguard Worker 	T5,
9032*61046927SAndroid Build Coastguard Worker 	T6,
9033*61046927SAndroid Build Coastguard Worker 	T7,
9034*61046927SAndroid Build Coastguard Worker 	T8,
9035*61046927SAndroid Build Coastguard Worker 	T9,
9036*61046927SAndroid Build Coastguard Worker 	T10,
9037*61046927SAndroid Build Coastguard Worker 	T11,
9038*61046927SAndroid Build Coastguard Worker 	T12,
9039*61046927SAndroid Build Coastguard Worker 	T13,
9040*61046927SAndroid Build Coastguard Worker 	T14,
9041*61046927SAndroid Build Coastguard Worker 	T15,
9042*61046927SAndroid Build Coastguard Worker 	T16,
9043*61046927SAndroid Build Coastguard Worker 	T17,
9044*61046927SAndroid Build Coastguard Worker 	T18,
9045*61046927SAndroid Build Coastguard Worker 	T19,
9046*61046927SAndroid Build Coastguard Worker 	T20,
9047*61046927SAndroid Build Coastguard Worker 	T21,
9048*61046927SAndroid Build Coastguard Worker 	T22,
9049*61046927SAndroid Build Coastguard Worker 	T23,
9050*61046927SAndroid Build Coastguard Worker 	T24,
9051*61046927SAndroid Build Coastguard Worker 	NullType,
9052*61046927SAndroid Build Coastguard Worker 	NullType,
9053*61046927SAndroid Build Coastguard Worker 	NullType,
9054*61046927SAndroid Build Coastguard Worker 	NullType,
9055*61046927SAndroid Build Coastguard Worker 	NullType,
9056*61046927SAndroid Build Coastguard Worker 	NullType,
9057*61046927SAndroid Build Coastguard Worker 	NullType>
9058*61046927SAndroid Build Coastguard Worker {
9059*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
9060*61046927SAndroid Build Coastguard Worker 		T0,
9061*61046927SAndroid Build Coastguard Worker 		T1,
9062*61046927SAndroid Build Coastguard Worker 		T2,
9063*61046927SAndroid Build Coastguard Worker 		T3,
9064*61046927SAndroid Build Coastguard Worker 		T4,
9065*61046927SAndroid Build Coastguard Worker 		T5,
9066*61046927SAndroid Build Coastguard Worker 		T6,
9067*61046927SAndroid Build Coastguard Worker 		T7,
9068*61046927SAndroid Build Coastguard Worker 		T8,
9069*61046927SAndroid Build Coastguard Worker 		T9,
9070*61046927SAndroid Build Coastguard Worker 		T10,
9071*61046927SAndroid Build Coastguard Worker 		T11,
9072*61046927SAndroid Build Coastguard Worker 		T12,
9073*61046927SAndroid Build Coastguard Worker 		T13,
9074*61046927SAndroid Build Coastguard Worker 		T14,
9075*61046927SAndroid Build Coastguard Worker 		T15,
9076*61046927SAndroid Build Coastguard Worker 		T16,
9077*61046927SAndroid Build Coastguard Worker 		T17,
9078*61046927SAndroid Build Coastguard Worker 		T18,
9079*61046927SAndroid Build Coastguard Worker 		T19,
9080*61046927SAndroid Build Coastguard Worker 		T20,
9081*61046927SAndroid Build Coastguard Worker 		T21,
9082*61046927SAndroid Build Coastguard Worker 		T22,
9083*61046927SAndroid Build Coastguard Worker 		T23,
9084*61046927SAndroid Build Coastguard Worker 		T24,
9085*61046927SAndroid Build Coastguard Worker 		NullType,
9086*61046927SAndroid Build Coastguard Worker 		NullType,
9087*61046927SAndroid Build Coastguard Worker 		NullType,
9088*61046927SAndroid Build Coastguard Worker 		NullType,
9089*61046927SAndroid Build Coastguard Worker 		NullType,
9090*61046927SAndroid Build Coastguard Worker 		NullType,
9091*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
9092*61046927SAndroid Build Coastguard Worker 
9093*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
9094*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_9095*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
9096*61046927SAndroid Build Coastguard Worker         functor_(functor)
9097*61046927SAndroid Build Coastguard Worker     {
9098*61046927SAndroid Build Coastguard Worker 
9099*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25))
9100*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
9101*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9102*61046927SAndroid Build Coastguard Worker         #endif
9103*61046927SAndroid Build Coastguard Worker 
9104*61046927SAndroid Build Coastguard Worker     }
9105*61046927SAndroid Build Coastguard Worker 
9106*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
9107*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
9108*61046927SAndroid Build Coastguard Worker 
9109*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
9110*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
9111*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
9112*61046927SAndroid Build Coastguard Worker 		T0,
9113*61046927SAndroid Build Coastguard Worker 		T1,
9114*61046927SAndroid Build Coastguard Worker 		T2,
9115*61046927SAndroid Build Coastguard Worker 		T3,
9116*61046927SAndroid Build Coastguard Worker 		T4,
9117*61046927SAndroid Build Coastguard Worker 		T5,
9118*61046927SAndroid Build Coastguard Worker 		T6,
9119*61046927SAndroid Build Coastguard Worker 		T7,
9120*61046927SAndroid Build Coastguard Worker 		T8,
9121*61046927SAndroid Build Coastguard Worker 		T9,
9122*61046927SAndroid Build Coastguard Worker 		T10,
9123*61046927SAndroid Build Coastguard Worker 		T11,
9124*61046927SAndroid Build Coastguard Worker 		T12,
9125*61046927SAndroid Build Coastguard Worker 		T13,
9126*61046927SAndroid Build Coastguard Worker 		T14,
9127*61046927SAndroid Build Coastguard Worker 		T15,
9128*61046927SAndroid Build Coastguard Worker 		T16,
9129*61046927SAndroid Build Coastguard Worker 		T17,
9130*61046927SAndroid Build Coastguard Worker 		T18,
9131*61046927SAndroid Build Coastguard Worker 		T19,
9132*61046927SAndroid Build Coastguard Worker 		T20,
9133*61046927SAndroid Build Coastguard Worker 		T21,
9134*61046927SAndroid Build Coastguard Worker 		T22,
9135*61046927SAndroid Build Coastguard Worker 		T23,
9136*61046927SAndroid Build Coastguard Worker 		T24);
9137*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_9138*61046927SAndroid Build Coastguard Worker 	Event operator()(
9139*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
9140*61046927SAndroid Build Coastguard Worker 		T0 arg0,
9141*61046927SAndroid Build Coastguard Worker 		T1 arg1,
9142*61046927SAndroid Build Coastguard Worker 		T2 arg2,
9143*61046927SAndroid Build Coastguard Worker 		T3 arg3,
9144*61046927SAndroid Build Coastguard Worker 		T4 arg4,
9145*61046927SAndroid Build Coastguard Worker 		T5 arg5,
9146*61046927SAndroid Build Coastguard Worker 		T6 arg6,
9147*61046927SAndroid Build Coastguard Worker 		T7 arg7,
9148*61046927SAndroid Build Coastguard Worker 		T8 arg8,
9149*61046927SAndroid Build Coastguard Worker 		T9 arg9,
9150*61046927SAndroid Build Coastguard Worker 		T10 arg10,
9151*61046927SAndroid Build Coastguard Worker 		T11 arg11,
9152*61046927SAndroid Build Coastguard Worker 		T12 arg12,
9153*61046927SAndroid Build Coastguard Worker 		T13 arg13,
9154*61046927SAndroid Build Coastguard Worker 		T14 arg14,
9155*61046927SAndroid Build Coastguard Worker 		T15 arg15,
9156*61046927SAndroid Build Coastguard Worker 		T16 arg16,
9157*61046927SAndroid Build Coastguard Worker 		T17 arg17,
9158*61046927SAndroid Build Coastguard Worker 		T18 arg18,
9159*61046927SAndroid Build Coastguard Worker 		T19 arg19,
9160*61046927SAndroid Build Coastguard Worker 		T20 arg20,
9161*61046927SAndroid Build Coastguard Worker 		T21 arg21,
9162*61046927SAndroid Build Coastguard Worker 		T22 arg22,
9163*61046927SAndroid Build Coastguard Worker 		T23 arg23,
9164*61046927SAndroid Build Coastguard Worker 		T24 arg24)
9165*61046927SAndroid Build Coastguard Worker 	{
9166*61046927SAndroid Build Coastguard Worker 		return functor_(
9167*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
9168*61046927SAndroid Build Coastguard Worker 			arg0,
9169*61046927SAndroid Build Coastguard Worker 			arg1,
9170*61046927SAndroid Build Coastguard Worker 			arg2,
9171*61046927SAndroid Build Coastguard Worker 			arg3,
9172*61046927SAndroid Build Coastguard Worker 			arg4,
9173*61046927SAndroid Build Coastguard Worker 			arg5,
9174*61046927SAndroid Build Coastguard Worker 			arg6,
9175*61046927SAndroid Build Coastguard Worker 			arg7,
9176*61046927SAndroid Build Coastguard Worker 			arg8,
9177*61046927SAndroid Build Coastguard Worker 			arg9,
9178*61046927SAndroid Build Coastguard Worker 			arg10,
9179*61046927SAndroid Build Coastguard Worker 			arg11,
9180*61046927SAndroid Build Coastguard Worker 			arg12,
9181*61046927SAndroid Build Coastguard Worker 			arg13,
9182*61046927SAndroid Build Coastguard Worker 			arg14,
9183*61046927SAndroid Build Coastguard Worker 			arg15,
9184*61046927SAndroid Build Coastguard Worker 			arg16,
9185*61046927SAndroid Build Coastguard Worker 			arg17,
9186*61046927SAndroid Build Coastguard Worker 			arg18,
9187*61046927SAndroid Build Coastguard Worker 			arg19,
9188*61046927SAndroid Build Coastguard Worker 			arg20,
9189*61046927SAndroid Build Coastguard Worker 			arg21,
9190*61046927SAndroid Build Coastguard Worker 			arg22,
9191*61046927SAndroid Build Coastguard Worker 			arg23,
9192*61046927SAndroid Build Coastguard Worker 			arg24);
9193*61046927SAndroid Build Coastguard Worker 	}
9194*61046927SAndroid Build Coastguard Worker 
9195*61046927SAndroid Build Coastguard Worker 
9196*61046927SAndroid Build Coastguard Worker };
9197*61046927SAndroid Build Coastguard Worker 
9198*61046927SAndroid Build Coastguard Worker template<
9199*61046927SAndroid Build Coastguard Worker 	typename T0,
9200*61046927SAndroid Build Coastguard Worker 	typename T1,
9201*61046927SAndroid Build Coastguard Worker 	typename T2,
9202*61046927SAndroid Build Coastguard Worker 	typename T3,
9203*61046927SAndroid Build Coastguard Worker 	typename T4,
9204*61046927SAndroid Build Coastguard Worker 	typename T5,
9205*61046927SAndroid Build Coastguard Worker 	typename T6,
9206*61046927SAndroid Build Coastguard Worker 	typename T7,
9207*61046927SAndroid Build Coastguard Worker 	typename T8,
9208*61046927SAndroid Build Coastguard Worker 	typename T9,
9209*61046927SAndroid Build Coastguard Worker 	typename T10,
9210*61046927SAndroid Build Coastguard Worker 	typename T11,
9211*61046927SAndroid Build Coastguard Worker 	typename T12,
9212*61046927SAndroid Build Coastguard Worker 	typename T13,
9213*61046927SAndroid Build Coastguard Worker 	typename T14,
9214*61046927SAndroid Build Coastguard Worker 	typename T15,
9215*61046927SAndroid Build Coastguard Worker 	typename T16,
9216*61046927SAndroid Build Coastguard Worker 	typename T17,
9217*61046927SAndroid Build Coastguard Worker 	typename T18,
9218*61046927SAndroid Build Coastguard Worker 	typename T19,
9219*61046927SAndroid Build Coastguard Worker 	typename T20,
9220*61046927SAndroid Build Coastguard Worker 	typename T21,
9221*61046927SAndroid Build Coastguard Worker 	typename T22,
9222*61046927SAndroid Build Coastguard Worker 	typename T23>
9223*61046927SAndroid Build Coastguard Worker struct functionImplementation_
9224*61046927SAndroid Build Coastguard Worker <	T0,
9225*61046927SAndroid Build Coastguard Worker 	T1,
9226*61046927SAndroid Build Coastguard Worker 	T2,
9227*61046927SAndroid Build Coastguard Worker 	T3,
9228*61046927SAndroid Build Coastguard Worker 	T4,
9229*61046927SAndroid Build Coastguard Worker 	T5,
9230*61046927SAndroid Build Coastguard Worker 	T6,
9231*61046927SAndroid Build Coastguard Worker 	T7,
9232*61046927SAndroid Build Coastguard Worker 	T8,
9233*61046927SAndroid Build Coastguard Worker 	T9,
9234*61046927SAndroid Build Coastguard Worker 	T10,
9235*61046927SAndroid Build Coastguard Worker 	T11,
9236*61046927SAndroid Build Coastguard Worker 	T12,
9237*61046927SAndroid Build Coastguard Worker 	T13,
9238*61046927SAndroid Build Coastguard Worker 	T14,
9239*61046927SAndroid Build Coastguard Worker 	T15,
9240*61046927SAndroid Build Coastguard Worker 	T16,
9241*61046927SAndroid Build Coastguard Worker 	T17,
9242*61046927SAndroid Build Coastguard Worker 	T18,
9243*61046927SAndroid Build Coastguard Worker 	T19,
9244*61046927SAndroid Build Coastguard Worker 	T20,
9245*61046927SAndroid Build Coastguard Worker 	T21,
9246*61046927SAndroid Build Coastguard Worker 	T22,
9247*61046927SAndroid Build Coastguard Worker 	T23,
9248*61046927SAndroid Build Coastguard Worker 	NullType,
9249*61046927SAndroid Build Coastguard Worker 	NullType,
9250*61046927SAndroid Build Coastguard Worker 	NullType,
9251*61046927SAndroid Build Coastguard Worker 	NullType,
9252*61046927SAndroid Build Coastguard Worker 	NullType,
9253*61046927SAndroid Build Coastguard Worker 	NullType,
9254*61046927SAndroid Build Coastguard Worker 	NullType,
9255*61046927SAndroid Build Coastguard Worker 	NullType>
9256*61046927SAndroid Build Coastguard Worker {
9257*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
9258*61046927SAndroid Build Coastguard Worker 		T0,
9259*61046927SAndroid Build Coastguard Worker 		T1,
9260*61046927SAndroid Build Coastguard Worker 		T2,
9261*61046927SAndroid Build Coastguard Worker 		T3,
9262*61046927SAndroid Build Coastguard Worker 		T4,
9263*61046927SAndroid Build Coastguard Worker 		T5,
9264*61046927SAndroid Build Coastguard Worker 		T6,
9265*61046927SAndroid Build Coastguard Worker 		T7,
9266*61046927SAndroid Build Coastguard Worker 		T8,
9267*61046927SAndroid Build Coastguard Worker 		T9,
9268*61046927SAndroid Build Coastguard Worker 		T10,
9269*61046927SAndroid Build Coastguard Worker 		T11,
9270*61046927SAndroid Build Coastguard Worker 		T12,
9271*61046927SAndroid Build Coastguard Worker 		T13,
9272*61046927SAndroid Build Coastguard Worker 		T14,
9273*61046927SAndroid Build Coastguard Worker 		T15,
9274*61046927SAndroid Build Coastguard Worker 		T16,
9275*61046927SAndroid Build Coastguard Worker 		T17,
9276*61046927SAndroid Build Coastguard Worker 		T18,
9277*61046927SAndroid Build Coastguard Worker 		T19,
9278*61046927SAndroid Build Coastguard Worker 		T20,
9279*61046927SAndroid Build Coastguard Worker 		T21,
9280*61046927SAndroid Build Coastguard Worker 		T22,
9281*61046927SAndroid Build Coastguard Worker 		T23,
9282*61046927SAndroid Build Coastguard Worker 		NullType,
9283*61046927SAndroid Build Coastguard Worker 		NullType,
9284*61046927SAndroid Build Coastguard Worker 		NullType,
9285*61046927SAndroid Build Coastguard Worker 		NullType,
9286*61046927SAndroid Build Coastguard Worker 		NullType,
9287*61046927SAndroid Build Coastguard Worker 		NullType,
9288*61046927SAndroid Build Coastguard Worker 		NullType,
9289*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
9290*61046927SAndroid Build Coastguard Worker 
9291*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
9292*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_9293*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
9294*61046927SAndroid Build Coastguard Worker         functor_(functor)
9295*61046927SAndroid Build Coastguard Worker     {
9296*61046927SAndroid Build Coastguard Worker 
9297*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24))
9298*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
9299*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9300*61046927SAndroid Build Coastguard Worker         #endif
9301*61046927SAndroid Build Coastguard Worker 
9302*61046927SAndroid Build Coastguard Worker     }
9303*61046927SAndroid Build Coastguard Worker 
9304*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
9305*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
9306*61046927SAndroid Build Coastguard Worker 
9307*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
9308*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
9309*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
9310*61046927SAndroid Build Coastguard Worker 		T0,
9311*61046927SAndroid Build Coastguard Worker 		T1,
9312*61046927SAndroid Build Coastguard Worker 		T2,
9313*61046927SAndroid Build Coastguard Worker 		T3,
9314*61046927SAndroid Build Coastguard Worker 		T4,
9315*61046927SAndroid Build Coastguard Worker 		T5,
9316*61046927SAndroid Build Coastguard Worker 		T6,
9317*61046927SAndroid Build Coastguard Worker 		T7,
9318*61046927SAndroid Build Coastguard Worker 		T8,
9319*61046927SAndroid Build Coastguard Worker 		T9,
9320*61046927SAndroid Build Coastguard Worker 		T10,
9321*61046927SAndroid Build Coastguard Worker 		T11,
9322*61046927SAndroid Build Coastguard Worker 		T12,
9323*61046927SAndroid Build Coastguard Worker 		T13,
9324*61046927SAndroid Build Coastguard Worker 		T14,
9325*61046927SAndroid Build Coastguard Worker 		T15,
9326*61046927SAndroid Build Coastguard Worker 		T16,
9327*61046927SAndroid Build Coastguard Worker 		T17,
9328*61046927SAndroid Build Coastguard Worker 		T18,
9329*61046927SAndroid Build Coastguard Worker 		T19,
9330*61046927SAndroid Build Coastguard Worker 		T20,
9331*61046927SAndroid Build Coastguard Worker 		T21,
9332*61046927SAndroid Build Coastguard Worker 		T22,
9333*61046927SAndroid Build Coastguard Worker 		T23);
9334*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_9335*61046927SAndroid Build Coastguard Worker 	Event operator()(
9336*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
9337*61046927SAndroid Build Coastguard Worker 		T0 arg0,
9338*61046927SAndroid Build Coastguard Worker 		T1 arg1,
9339*61046927SAndroid Build Coastguard Worker 		T2 arg2,
9340*61046927SAndroid Build Coastguard Worker 		T3 arg3,
9341*61046927SAndroid Build Coastguard Worker 		T4 arg4,
9342*61046927SAndroid Build Coastguard Worker 		T5 arg5,
9343*61046927SAndroid Build Coastguard Worker 		T6 arg6,
9344*61046927SAndroid Build Coastguard Worker 		T7 arg7,
9345*61046927SAndroid Build Coastguard Worker 		T8 arg8,
9346*61046927SAndroid Build Coastguard Worker 		T9 arg9,
9347*61046927SAndroid Build Coastguard Worker 		T10 arg10,
9348*61046927SAndroid Build Coastguard Worker 		T11 arg11,
9349*61046927SAndroid Build Coastguard Worker 		T12 arg12,
9350*61046927SAndroid Build Coastguard Worker 		T13 arg13,
9351*61046927SAndroid Build Coastguard Worker 		T14 arg14,
9352*61046927SAndroid Build Coastguard Worker 		T15 arg15,
9353*61046927SAndroid Build Coastguard Worker 		T16 arg16,
9354*61046927SAndroid Build Coastguard Worker 		T17 arg17,
9355*61046927SAndroid Build Coastguard Worker 		T18 arg18,
9356*61046927SAndroid Build Coastguard Worker 		T19 arg19,
9357*61046927SAndroid Build Coastguard Worker 		T20 arg20,
9358*61046927SAndroid Build Coastguard Worker 		T21 arg21,
9359*61046927SAndroid Build Coastguard Worker 		T22 arg22,
9360*61046927SAndroid Build Coastguard Worker 		T23 arg23)
9361*61046927SAndroid Build Coastguard Worker 	{
9362*61046927SAndroid Build Coastguard Worker 		return functor_(
9363*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
9364*61046927SAndroid Build Coastguard Worker 			arg0,
9365*61046927SAndroid Build Coastguard Worker 			arg1,
9366*61046927SAndroid Build Coastguard Worker 			arg2,
9367*61046927SAndroid Build Coastguard Worker 			arg3,
9368*61046927SAndroid Build Coastguard Worker 			arg4,
9369*61046927SAndroid Build Coastguard Worker 			arg5,
9370*61046927SAndroid Build Coastguard Worker 			arg6,
9371*61046927SAndroid Build Coastguard Worker 			arg7,
9372*61046927SAndroid Build Coastguard Worker 			arg8,
9373*61046927SAndroid Build Coastguard Worker 			arg9,
9374*61046927SAndroid Build Coastguard Worker 			arg10,
9375*61046927SAndroid Build Coastguard Worker 			arg11,
9376*61046927SAndroid Build Coastguard Worker 			arg12,
9377*61046927SAndroid Build Coastguard Worker 			arg13,
9378*61046927SAndroid Build Coastguard Worker 			arg14,
9379*61046927SAndroid Build Coastguard Worker 			arg15,
9380*61046927SAndroid Build Coastguard Worker 			arg16,
9381*61046927SAndroid Build Coastguard Worker 			arg17,
9382*61046927SAndroid Build Coastguard Worker 			arg18,
9383*61046927SAndroid Build Coastguard Worker 			arg19,
9384*61046927SAndroid Build Coastguard Worker 			arg20,
9385*61046927SAndroid Build Coastguard Worker 			arg21,
9386*61046927SAndroid Build Coastguard Worker 			arg22,
9387*61046927SAndroid Build Coastguard Worker 			arg23);
9388*61046927SAndroid Build Coastguard Worker 	}
9389*61046927SAndroid Build Coastguard Worker 
9390*61046927SAndroid Build Coastguard Worker 
9391*61046927SAndroid Build Coastguard Worker };
9392*61046927SAndroid Build Coastguard Worker 
9393*61046927SAndroid Build Coastguard Worker template<
9394*61046927SAndroid Build Coastguard Worker 	typename T0,
9395*61046927SAndroid Build Coastguard Worker 	typename T1,
9396*61046927SAndroid Build Coastguard Worker 	typename T2,
9397*61046927SAndroid Build Coastguard Worker 	typename T3,
9398*61046927SAndroid Build Coastguard Worker 	typename T4,
9399*61046927SAndroid Build Coastguard Worker 	typename T5,
9400*61046927SAndroid Build Coastguard Worker 	typename T6,
9401*61046927SAndroid Build Coastguard Worker 	typename T7,
9402*61046927SAndroid Build Coastguard Worker 	typename T8,
9403*61046927SAndroid Build Coastguard Worker 	typename T9,
9404*61046927SAndroid Build Coastguard Worker 	typename T10,
9405*61046927SAndroid Build Coastguard Worker 	typename T11,
9406*61046927SAndroid Build Coastguard Worker 	typename T12,
9407*61046927SAndroid Build Coastguard Worker 	typename T13,
9408*61046927SAndroid Build Coastguard Worker 	typename T14,
9409*61046927SAndroid Build Coastguard Worker 	typename T15,
9410*61046927SAndroid Build Coastguard Worker 	typename T16,
9411*61046927SAndroid Build Coastguard Worker 	typename T17,
9412*61046927SAndroid Build Coastguard Worker 	typename T18,
9413*61046927SAndroid Build Coastguard Worker 	typename T19,
9414*61046927SAndroid Build Coastguard Worker 	typename T20,
9415*61046927SAndroid Build Coastguard Worker 	typename T21,
9416*61046927SAndroid Build Coastguard Worker 	typename T22>
9417*61046927SAndroid Build Coastguard Worker struct functionImplementation_
9418*61046927SAndroid Build Coastguard Worker <	T0,
9419*61046927SAndroid Build Coastguard Worker 	T1,
9420*61046927SAndroid Build Coastguard Worker 	T2,
9421*61046927SAndroid Build Coastguard Worker 	T3,
9422*61046927SAndroid Build Coastguard Worker 	T4,
9423*61046927SAndroid Build Coastguard Worker 	T5,
9424*61046927SAndroid Build Coastguard Worker 	T6,
9425*61046927SAndroid Build Coastguard Worker 	T7,
9426*61046927SAndroid Build Coastguard Worker 	T8,
9427*61046927SAndroid Build Coastguard Worker 	T9,
9428*61046927SAndroid Build Coastguard Worker 	T10,
9429*61046927SAndroid Build Coastguard Worker 	T11,
9430*61046927SAndroid Build Coastguard Worker 	T12,
9431*61046927SAndroid Build Coastguard Worker 	T13,
9432*61046927SAndroid Build Coastguard Worker 	T14,
9433*61046927SAndroid Build Coastguard Worker 	T15,
9434*61046927SAndroid Build Coastguard Worker 	T16,
9435*61046927SAndroid Build Coastguard Worker 	T17,
9436*61046927SAndroid Build Coastguard Worker 	T18,
9437*61046927SAndroid Build Coastguard Worker 	T19,
9438*61046927SAndroid Build Coastguard Worker 	T20,
9439*61046927SAndroid Build Coastguard Worker 	T21,
9440*61046927SAndroid Build Coastguard Worker 	T22,
9441*61046927SAndroid Build Coastguard Worker 	NullType,
9442*61046927SAndroid Build Coastguard Worker 	NullType,
9443*61046927SAndroid Build Coastguard Worker 	NullType,
9444*61046927SAndroid Build Coastguard Worker 	NullType,
9445*61046927SAndroid Build Coastguard Worker 	NullType,
9446*61046927SAndroid Build Coastguard Worker 	NullType,
9447*61046927SAndroid Build Coastguard Worker 	NullType,
9448*61046927SAndroid Build Coastguard Worker 	NullType,
9449*61046927SAndroid Build Coastguard Worker 	NullType>
9450*61046927SAndroid Build Coastguard Worker {
9451*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
9452*61046927SAndroid Build Coastguard Worker 		T0,
9453*61046927SAndroid Build Coastguard Worker 		T1,
9454*61046927SAndroid Build Coastguard Worker 		T2,
9455*61046927SAndroid Build Coastguard Worker 		T3,
9456*61046927SAndroid Build Coastguard Worker 		T4,
9457*61046927SAndroid Build Coastguard Worker 		T5,
9458*61046927SAndroid Build Coastguard Worker 		T6,
9459*61046927SAndroid Build Coastguard Worker 		T7,
9460*61046927SAndroid Build Coastguard Worker 		T8,
9461*61046927SAndroid Build Coastguard Worker 		T9,
9462*61046927SAndroid Build Coastguard Worker 		T10,
9463*61046927SAndroid Build Coastguard Worker 		T11,
9464*61046927SAndroid Build Coastguard Worker 		T12,
9465*61046927SAndroid Build Coastguard Worker 		T13,
9466*61046927SAndroid Build Coastguard Worker 		T14,
9467*61046927SAndroid Build Coastguard Worker 		T15,
9468*61046927SAndroid Build Coastguard Worker 		T16,
9469*61046927SAndroid Build Coastguard Worker 		T17,
9470*61046927SAndroid Build Coastguard Worker 		T18,
9471*61046927SAndroid Build Coastguard Worker 		T19,
9472*61046927SAndroid Build Coastguard Worker 		T20,
9473*61046927SAndroid Build Coastguard Worker 		T21,
9474*61046927SAndroid Build Coastguard Worker 		T22,
9475*61046927SAndroid Build Coastguard Worker 		NullType,
9476*61046927SAndroid Build Coastguard Worker 		NullType,
9477*61046927SAndroid Build Coastguard Worker 		NullType,
9478*61046927SAndroid Build Coastguard Worker 		NullType,
9479*61046927SAndroid Build Coastguard Worker 		NullType,
9480*61046927SAndroid Build Coastguard Worker 		NullType,
9481*61046927SAndroid Build Coastguard Worker 		NullType,
9482*61046927SAndroid Build Coastguard Worker 		NullType,
9483*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
9484*61046927SAndroid Build Coastguard Worker 
9485*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
9486*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_9487*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
9488*61046927SAndroid Build Coastguard Worker         functor_(functor)
9489*61046927SAndroid Build Coastguard Worker     {
9490*61046927SAndroid Build Coastguard Worker 
9491*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23))
9492*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
9493*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9494*61046927SAndroid Build Coastguard Worker         #endif
9495*61046927SAndroid Build Coastguard Worker 
9496*61046927SAndroid Build Coastguard Worker     }
9497*61046927SAndroid Build Coastguard Worker 
9498*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
9499*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
9500*61046927SAndroid Build Coastguard Worker 
9501*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
9502*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
9503*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
9504*61046927SAndroid Build Coastguard Worker 		T0,
9505*61046927SAndroid Build Coastguard Worker 		T1,
9506*61046927SAndroid Build Coastguard Worker 		T2,
9507*61046927SAndroid Build Coastguard Worker 		T3,
9508*61046927SAndroid Build Coastguard Worker 		T4,
9509*61046927SAndroid Build Coastguard Worker 		T5,
9510*61046927SAndroid Build Coastguard Worker 		T6,
9511*61046927SAndroid Build Coastguard Worker 		T7,
9512*61046927SAndroid Build Coastguard Worker 		T8,
9513*61046927SAndroid Build Coastguard Worker 		T9,
9514*61046927SAndroid Build Coastguard Worker 		T10,
9515*61046927SAndroid Build Coastguard Worker 		T11,
9516*61046927SAndroid Build Coastguard Worker 		T12,
9517*61046927SAndroid Build Coastguard Worker 		T13,
9518*61046927SAndroid Build Coastguard Worker 		T14,
9519*61046927SAndroid Build Coastguard Worker 		T15,
9520*61046927SAndroid Build Coastguard Worker 		T16,
9521*61046927SAndroid Build Coastguard Worker 		T17,
9522*61046927SAndroid Build Coastguard Worker 		T18,
9523*61046927SAndroid Build Coastguard Worker 		T19,
9524*61046927SAndroid Build Coastguard Worker 		T20,
9525*61046927SAndroid Build Coastguard Worker 		T21,
9526*61046927SAndroid Build Coastguard Worker 		T22);
9527*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_9528*61046927SAndroid Build Coastguard Worker 	Event operator()(
9529*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
9530*61046927SAndroid Build Coastguard Worker 		T0 arg0,
9531*61046927SAndroid Build Coastguard Worker 		T1 arg1,
9532*61046927SAndroid Build Coastguard Worker 		T2 arg2,
9533*61046927SAndroid Build Coastguard Worker 		T3 arg3,
9534*61046927SAndroid Build Coastguard Worker 		T4 arg4,
9535*61046927SAndroid Build Coastguard Worker 		T5 arg5,
9536*61046927SAndroid Build Coastguard Worker 		T6 arg6,
9537*61046927SAndroid Build Coastguard Worker 		T7 arg7,
9538*61046927SAndroid Build Coastguard Worker 		T8 arg8,
9539*61046927SAndroid Build Coastguard Worker 		T9 arg9,
9540*61046927SAndroid Build Coastguard Worker 		T10 arg10,
9541*61046927SAndroid Build Coastguard Worker 		T11 arg11,
9542*61046927SAndroid Build Coastguard Worker 		T12 arg12,
9543*61046927SAndroid Build Coastguard Worker 		T13 arg13,
9544*61046927SAndroid Build Coastguard Worker 		T14 arg14,
9545*61046927SAndroid Build Coastguard Worker 		T15 arg15,
9546*61046927SAndroid Build Coastguard Worker 		T16 arg16,
9547*61046927SAndroid Build Coastguard Worker 		T17 arg17,
9548*61046927SAndroid Build Coastguard Worker 		T18 arg18,
9549*61046927SAndroid Build Coastguard Worker 		T19 arg19,
9550*61046927SAndroid Build Coastguard Worker 		T20 arg20,
9551*61046927SAndroid Build Coastguard Worker 		T21 arg21,
9552*61046927SAndroid Build Coastguard Worker 		T22 arg22)
9553*61046927SAndroid Build Coastguard Worker 	{
9554*61046927SAndroid Build Coastguard Worker 		return functor_(
9555*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
9556*61046927SAndroid Build Coastguard Worker 			arg0,
9557*61046927SAndroid Build Coastguard Worker 			arg1,
9558*61046927SAndroid Build Coastguard Worker 			arg2,
9559*61046927SAndroid Build Coastguard Worker 			arg3,
9560*61046927SAndroid Build Coastguard Worker 			arg4,
9561*61046927SAndroid Build Coastguard Worker 			arg5,
9562*61046927SAndroid Build Coastguard Worker 			arg6,
9563*61046927SAndroid Build Coastguard Worker 			arg7,
9564*61046927SAndroid Build Coastguard Worker 			arg8,
9565*61046927SAndroid Build Coastguard Worker 			arg9,
9566*61046927SAndroid Build Coastguard Worker 			arg10,
9567*61046927SAndroid Build Coastguard Worker 			arg11,
9568*61046927SAndroid Build Coastguard Worker 			arg12,
9569*61046927SAndroid Build Coastguard Worker 			arg13,
9570*61046927SAndroid Build Coastguard Worker 			arg14,
9571*61046927SAndroid Build Coastguard Worker 			arg15,
9572*61046927SAndroid Build Coastguard Worker 			arg16,
9573*61046927SAndroid Build Coastguard Worker 			arg17,
9574*61046927SAndroid Build Coastguard Worker 			arg18,
9575*61046927SAndroid Build Coastguard Worker 			arg19,
9576*61046927SAndroid Build Coastguard Worker 			arg20,
9577*61046927SAndroid Build Coastguard Worker 			arg21,
9578*61046927SAndroid Build Coastguard Worker 			arg22);
9579*61046927SAndroid Build Coastguard Worker 	}
9580*61046927SAndroid Build Coastguard Worker 
9581*61046927SAndroid Build Coastguard Worker 
9582*61046927SAndroid Build Coastguard Worker };
9583*61046927SAndroid Build Coastguard Worker 
9584*61046927SAndroid Build Coastguard Worker template<
9585*61046927SAndroid Build Coastguard Worker 	typename T0,
9586*61046927SAndroid Build Coastguard Worker 	typename T1,
9587*61046927SAndroid Build Coastguard Worker 	typename T2,
9588*61046927SAndroid Build Coastguard Worker 	typename T3,
9589*61046927SAndroid Build Coastguard Worker 	typename T4,
9590*61046927SAndroid Build Coastguard Worker 	typename T5,
9591*61046927SAndroid Build Coastguard Worker 	typename T6,
9592*61046927SAndroid Build Coastguard Worker 	typename T7,
9593*61046927SAndroid Build Coastguard Worker 	typename T8,
9594*61046927SAndroid Build Coastguard Worker 	typename T9,
9595*61046927SAndroid Build Coastguard Worker 	typename T10,
9596*61046927SAndroid Build Coastguard Worker 	typename T11,
9597*61046927SAndroid Build Coastguard Worker 	typename T12,
9598*61046927SAndroid Build Coastguard Worker 	typename T13,
9599*61046927SAndroid Build Coastguard Worker 	typename T14,
9600*61046927SAndroid Build Coastguard Worker 	typename T15,
9601*61046927SAndroid Build Coastguard Worker 	typename T16,
9602*61046927SAndroid Build Coastguard Worker 	typename T17,
9603*61046927SAndroid Build Coastguard Worker 	typename T18,
9604*61046927SAndroid Build Coastguard Worker 	typename T19,
9605*61046927SAndroid Build Coastguard Worker 	typename T20,
9606*61046927SAndroid Build Coastguard Worker 	typename T21>
9607*61046927SAndroid Build Coastguard Worker struct functionImplementation_
9608*61046927SAndroid Build Coastguard Worker <	T0,
9609*61046927SAndroid Build Coastguard Worker 	T1,
9610*61046927SAndroid Build Coastguard Worker 	T2,
9611*61046927SAndroid Build Coastguard Worker 	T3,
9612*61046927SAndroid Build Coastguard Worker 	T4,
9613*61046927SAndroid Build Coastguard Worker 	T5,
9614*61046927SAndroid Build Coastguard Worker 	T6,
9615*61046927SAndroid Build Coastguard Worker 	T7,
9616*61046927SAndroid Build Coastguard Worker 	T8,
9617*61046927SAndroid Build Coastguard Worker 	T9,
9618*61046927SAndroid Build Coastguard Worker 	T10,
9619*61046927SAndroid Build Coastguard Worker 	T11,
9620*61046927SAndroid Build Coastguard Worker 	T12,
9621*61046927SAndroid Build Coastguard Worker 	T13,
9622*61046927SAndroid Build Coastguard Worker 	T14,
9623*61046927SAndroid Build Coastguard Worker 	T15,
9624*61046927SAndroid Build Coastguard Worker 	T16,
9625*61046927SAndroid Build Coastguard Worker 	T17,
9626*61046927SAndroid Build Coastguard Worker 	T18,
9627*61046927SAndroid Build Coastguard Worker 	T19,
9628*61046927SAndroid Build Coastguard Worker 	T20,
9629*61046927SAndroid Build Coastguard Worker 	T21,
9630*61046927SAndroid Build Coastguard Worker 	NullType,
9631*61046927SAndroid Build Coastguard Worker 	NullType,
9632*61046927SAndroid Build Coastguard Worker 	NullType,
9633*61046927SAndroid Build Coastguard Worker 	NullType,
9634*61046927SAndroid Build Coastguard Worker 	NullType,
9635*61046927SAndroid Build Coastguard Worker 	NullType,
9636*61046927SAndroid Build Coastguard Worker 	NullType,
9637*61046927SAndroid Build Coastguard Worker 	NullType,
9638*61046927SAndroid Build Coastguard Worker 	NullType,
9639*61046927SAndroid Build Coastguard Worker 	NullType>
9640*61046927SAndroid Build Coastguard Worker {
9641*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
9642*61046927SAndroid Build Coastguard Worker 		T0,
9643*61046927SAndroid Build Coastguard Worker 		T1,
9644*61046927SAndroid Build Coastguard Worker 		T2,
9645*61046927SAndroid Build Coastguard Worker 		T3,
9646*61046927SAndroid Build Coastguard Worker 		T4,
9647*61046927SAndroid Build Coastguard Worker 		T5,
9648*61046927SAndroid Build Coastguard Worker 		T6,
9649*61046927SAndroid Build Coastguard Worker 		T7,
9650*61046927SAndroid Build Coastguard Worker 		T8,
9651*61046927SAndroid Build Coastguard Worker 		T9,
9652*61046927SAndroid Build Coastguard Worker 		T10,
9653*61046927SAndroid Build Coastguard Worker 		T11,
9654*61046927SAndroid Build Coastguard Worker 		T12,
9655*61046927SAndroid Build Coastguard Worker 		T13,
9656*61046927SAndroid Build Coastguard Worker 		T14,
9657*61046927SAndroid Build Coastguard Worker 		T15,
9658*61046927SAndroid Build Coastguard Worker 		T16,
9659*61046927SAndroid Build Coastguard Worker 		T17,
9660*61046927SAndroid Build Coastguard Worker 		T18,
9661*61046927SAndroid Build Coastguard Worker 		T19,
9662*61046927SAndroid Build Coastguard Worker 		T20,
9663*61046927SAndroid Build Coastguard Worker 		T21,
9664*61046927SAndroid Build Coastguard Worker 		NullType,
9665*61046927SAndroid Build Coastguard Worker 		NullType,
9666*61046927SAndroid Build Coastguard Worker 		NullType,
9667*61046927SAndroid Build Coastguard Worker 		NullType,
9668*61046927SAndroid Build Coastguard Worker 		NullType,
9669*61046927SAndroid Build Coastguard Worker 		NullType,
9670*61046927SAndroid Build Coastguard Worker 		NullType,
9671*61046927SAndroid Build Coastguard Worker 		NullType,
9672*61046927SAndroid Build Coastguard Worker 		NullType,
9673*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
9674*61046927SAndroid Build Coastguard Worker 
9675*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
9676*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_9677*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
9678*61046927SAndroid Build Coastguard Worker         functor_(functor)
9679*61046927SAndroid Build Coastguard Worker     {
9680*61046927SAndroid Build Coastguard Worker 
9681*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22))
9682*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
9683*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9684*61046927SAndroid Build Coastguard Worker         #endif
9685*61046927SAndroid Build Coastguard Worker 
9686*61046927SAndroid Build Coastguard Worker     }
9687*61046927SAndroid Build Coastguard Worker 
9688*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
9689*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
9690*61046927SAndroid Build Coastguard Worker 
9691*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
9692*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
9693*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
9694*61046927SAndroid Build Coastguard Worker 		T0,
9695*61046927SAndroid Build Coastguard Worker 		T1,
9696*61046927SAndroid Build Coastguard Worker 		T2,
9697*61046927SAndroid Build Coastguard Worker 		T3,
9698*61046927SAndroid Build Coastguard Worker 		T4,
9699*61046927SAndroid Build Coastguard Worker 		T5,
9700*61046927SAndroid Build Coastguard Worker 		T6,
9701*61046927SAndroid Build Coastguard Worker 		T7,
9702*61046927SAndroid Build Coastguard Worker 		T8,
9703*61046927SAndroid Build Coastguard Worker 		T9,
9704*61046927SAndroid Build Coastguard Worker 		T10,
9705*61046927SAndroid Build Coastguard Worker 		T11,
9706*61046927SAndroid Build Coastguard Worker 		T12,
9707*61046927SAndroid Build Coastguard Worker 		T13,
9708*61046927SAndroid Build Coastguard Worker 		T14,
9709*61046927SAndroid Build Coastguard Worker 		T15,
9710*61046927SAndroid Build Coastguard Worker 		T16,
9711*61046927SAndroid Build Coastguard Worker 		T17,
9712*61046927SAndroid Build Coastguard Worker 		T18,
9713*61046927SAndroid Build Coastguard Worker 		T19,
9714*61046927SAndroid Build Coastguard Worker 		T20,
9715*61046927SAndroid Build Coastguard Worker 		T21);
9716*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_9717*61046927SAndroid Build Coastguard Worker 	Event operator()(
9718*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
9719*61046927SAndroid Build Coastguard Worker 		T0 arg0,
9720*61046927SAndroid Build Coastguard Worker 		T1 arg1,
9721*61046927SAndroid Build Coastguard Worker 		T2 arg2,
9722*61046927SAndroid Build Coastguard Worker 		T3 arg3,
9723*61046927SAndroid Build Coastguard Worker 		T4 arg4,
9724*61046927SAndroid Build Coastguard Worker 		T5 arg5,
9725*61046927SAndroid Build Coastguard Worker 		T6 arg6,
9726*61046927SAndroid Build Coastguard Worker 		T7 arg7,
9727*61046927SAndroid Build Coastguard Worker 		T8 arg8,
9728*61046927SAndroid Build Coastguard Worker 		T9 arg9,
9729*61046927SAndroid Build Coastguard Worker 		T10 arg10,
9730*61046927SAndroid Build Coastguard Worker 		T11 arg11,
9731*61046927SAndroid Build Coastguard Worker 		T12 arg12,
9732*61046927SAndroid Build Coastguard Worker 		T13 arg13,
9733*61046927SAndroid Build Coastguard Worker 		T14 arg14,
9734*61046927SAndroid Build Coastguard Worker 		T15 arg15,
9735*61046927SAndroid Build Coastguard Worker 		T16 arg16,
9736*61046927SAndroid Build Coastguard Worker 		T17 arg17,
9737*61046927SAndroid Build Coastguard Worker 		T18 arg18,
9738*61046927SAndroid Build Coastguard Worker 		T19 arg19,
9739*61046927SAndroid Build Coastguard Worker 		T20 arg20,
9740*61046927SAndroid Build Coastguard Worker 		T21 arg21)
9741*61046927SAndroid Build Coastguard Worker 	{
9742*61046927SAndroid Build Coastguard Worker 		return functor_(
9743*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
9744*61046927SAndroid Build Coastguard Worker 			arg0,
9745*61046927SAndroid Build Coastguard Worker 			arg1,
9746*61046927SAndroid Build Coastguard Worker 			arg2,
9747*61046927SAndroid Build Coastguard Worker 			arg3,
9748*61046927SAndroid Build Coastguard Worker 			arg4,
9749*61046927SAndroid Build Coastguard Worker 			arg5,
9750*61046927SAndroid Build Coastguard Worker 			arg6,
9751*61046927SAndroid Build Coastguard Worker 			arg7,
9752*61046927SAndroid Build Coastguard Worker 			arg8,
9753*61046927SAndroid Build Coastguard Worker 			arg9,
9754*61046927SAndroid Build Coastguard Worker 			arg10,
9755*61046927SAndroid Build Coastguard Worker 			arg11,
9756*61046927SAndroid Build Coastguard Worker 			arg12,
9757*61046927SAndroid Build Coastguard Worker 			arg13,
9758*61046927SAndroid Build Coastguard Worker 			arg14,
9759*61046927SAndroid Build Coastguard Worker 			arg15,
9760*61046927SAndroid Build Coastguard Worker 			arg16,
9761*61046927SAndroid Build Coastguard Worker 			arg17,
9762*61046927SAndroid Build Coastguard Worker 			arg18,
9763*61046927SAndroid Build Coastguard Worker 			arg19,
9764*61046927SAndroid Build Coastguard Worker 			arg20,
9765*61046927SAndroid Build Coastguard Worker 			arg21);
9766*61046927SAndroid Build Coastguard Worker 	}
9767*61046927SAndroid Build Coastguard Worker 
9768*61046927SAndroid Build Coastguard Worker 
9769*61046927SAndroid Build Coastguard Worker };
9770*61046927SAndroid Build Coastguard Worker 
9771*61046927SAndroid Build Coastguard Worker template<
9772*61046927SAndroid Build Coastguard Worker 	typename T0,
9773*61046927SAndroid Build Coastguard Worker 	typename T1,
9774*61046927SAndroid Build Coastguard Worker 	typename T2,
9775*61046927SAndroid Build Coastguard Worker 	typename T3,
9776*61046927SAndroid Build Coastguard Worker 	typename T4,
9777*61046927SAndroid Build Coastguard Worker 	typename T5,
9778*61046927SAndroid Build Coastguard Worker 	typename T6,
9779*61046927SAndroid Build Coastguard Worker 	typename T7,
9780*61046927SAndroid Build Coastguard Worker 	typename T8,
9781*61046927SAndroid Build Coastguard Worker 	typename T9,
9782*61046927SAndroid Build Coastguard Worker 	typename T10,
9783*61046927SAndroid Build Coastguard Worker 	typename T11,
9784*61046927SAndroid Build Coastguard Worker 	typename T12,
9785*61046927SAndroid Build Coastguard Worker 	typename T13,
9786*61046927SAndroid Build Coastguard Worker 	typename T14,
9787*61046927SAndroid Build Coastguard Worker 	typename T15,
9788*61046927SAndroid Build Coastguard Worker 	typename T16,
9789*61046927SAndroid Build Coastguard Worker 	typename T17,
9790*61046927SAndroid Build Coastguard Worker 	typename T18,
9791*61046927SAndroid Build Coastguard Worker 	typename T19,
9792*61046927SAndroid Build Coastguard Worker 	typename T20>
9793*61046927SAndroid Build Coastguard Worker struct functionImplementation_
9794*61046927SAndroid Build Coastguard Worker <	T0,
9795*61046927SAndroid Build Coastguard Worker 	T1,
9796*61046927SAndroid Build Coastguard Worker 	T2,
9797*61046927SAndroid Build Coastguard Worker 	T3,
9798*61046927SAndroid Build Coastguard Worker 	T4,
9799*61046927SAndroid Build Coastguard Worker 	T5,
9800*61046927SAndroid Build Coastguard Worker 	T6,
9801*61046927SAndroid Build Coastguard Worker 	T7,
9802*61046927SAndroid Build Coastguard Worker 	T8,
9803*61046927SAndroid Build Coastguard Worker 	T9,
9804*61046927SAndroid Build Coastguard Worker 	T10,
9805*61046927SAndroid Build Coastguard Worker 	T11,
9806*61046927SAndroid Build Coastguard Worker 	T12,
9807*61046927SAndroid Build Coastguard Worker 	T13,
9808*61046927SAndroid Build Coastguard Worker 	T14,
9809*61046927SAndroid Build Coastguard Worker 	T15,
9810*61046927SAndroid Build Coastguard Worker 	T16,
9811*61046927SAndroid Build Coastguard Worker 	T17,
9812*61046927SAndroid Build Coastguard Worker 	T18,
9813*61046927SAndroid Build Coastguard Worker 	T19,
9814*61046927SAndroid Build Coastguard Worker 	T20,
9815*61046927SAndroid Build Coastguard Worker 	NullType,
9816*61046927SAndroid Build Coastguard Worker 	NullType,
9817*61046927SAndroid Build Coastguard Worker 	NullType,
9818*61046927SAndroid Build Coastguard Worker 	NullType,
9819*61046927SAndroid Build Coastguard Worker 	NullType,
9820*61046927SAndroid Build Coastguard Worker 	NullType,
9821*61046927SAndroid Build Coastguard Worker 	NullType,
9822*61046927SAndroid Build Coastguard Worker 	NullType,
9823*61046927SAndroid Build Coastguard Worker 	NullType,
9824*61046927SAndroid Build Coastguard Worker 	NullType,
9825*61046927SAndroid Build Coastguard Worker 	NullType>
9826*61046927SAndroid Build Coastguard Worker {
9827*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
9828*61046927SAndroid Build Coastguard Worker 		T0,
9829*61046927SAndroid Build Coastguard Worker 		T1,
9830*61046927SAndroid Build Coastguard Worker 		T2,
9831*61046927SAndroid Build Coastguard Worker 		T3,
9832*61046927SAndroid Build Coastguard Worker 		T4,
9833*61046927SAndroid Build Coastguard Worker 		T5,
9834*61046927SAndroid Build Coastguard Worker 		T6,
9835*61046927SAndroid Build Coastguard Worker 		T7,
9836*61046927SAndroid Build Coastguard Worker 		T8,
9837*61046927SAndroid Build Coastguard Worker 		T9,
9838*61046927SAndroid Build Coastguard Worker 		T10,
9839*61046927SAndroid Build Coastguard Worker 		T11,
9840*61046927SAndroid Build Coastguard Worker 		T12,
9841*61046927SAndroid Build Coastguard Worker 		T13,
9842*61046927SAndroid Build Coastguard Worker 		T14,
9843*61046927SAndroid Build Coastguard Worker 		T15,
9844*61046927SAndroid Build Coastguard Worker 		T16,
9845*61046927SAndroid Build Coastguard Worker 		T17,
9846*61046927SAndroid Build Coastguard Worker 		T18,
9847*61046927SAndroid Build Coastguard Worker 		T19,
9848*61046927SAndroid Build Coastguard Worker 		T20,
9849*61046927SAndroid Build Coastguard Worker 		NullType,
9850*61046927SAndroid Build Coastguard Worker 		NullType,
9851*61046927SAndroid Build Coastguard Worker 		NullType,
9852*61046927SAndroid Build Coastguard Worker 		NullType,
9853*61046927SAndroid Build Coastguard Worker 		NullType,
9854*61046927SAndroid Build Coastguard Worker 		NullType,
9855*61046927SAndroid Build Coastguard Worker 		NullType,
9856*61046927SAndroid Build Coastguard Worker 		NullType,
9857*61046927SAndroid Build Coastguard Worker 		NullType,
9858*61046927SAndroid Build Coastguard Worker 		NullType,
9859*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
9860*61046927SAndroid Build Coastguard Worker 
9861*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
9862*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_9863*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
9864*61046927SAndroid Build Coastguard Worker         functor_(functor)
9865*61046927SAndroid Build Coastguard Worker     {
9866*61046927SAndroid Build Coastguard Worker 
9867*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21))
9868*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
9869*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9870*61046927SAndroid Build Coastguard Worker         #endif
9871*61046927SAndroid Build Coastguard Worker 
9872*61046927SAndroid Build Coastguard Worker     }
9873*61046927SAndroid Build Coastguard Worker 
9874*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
9875*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
9876*61046927SAndroid Build Coastguard Worker 
9877*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
9878*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
9879*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
9880*61046927SAndroid Build Coastguard Worker 		T0,
9881*61046927SAndroid Build Coastguard Worker 		T1,
9882*61046927SAndroid Build Coastguard Worker 		T2,
9883*61046927SAndroid Build Coastguard Worker 		T3,
9884*61046927SAndroid Build Coastguard Worker 		T4,
9885*61046927SAndroid Build Coastguard Worker 		T5,
9886*61046927SAndroid Build Coastguard Worker 		T6,
9887*61046927SAndroid Build Coastguard Worker 		T7,
9888*61046927SAndroid Build Coastguard Worker 		T8,
9889*61046927SAndroid Build Coastguard Worker 		T9,
9890*61046927SAndroid Build Coastguard Worker 		T10,
9891*61046927SAndroid Build Coastguard Worker 		T11,
9892*61046927SAndroid Build Coastguard Worker 		T12,
9893*61046927SAndroid Build Coastguard Worker 		T13,
9894*61046927SAndroid Build Coastguard Worker 		T14,
9895*61046927SAndroid Build Coastguard Worker 		T15,
9896*61046927SAndroid Build Coastguard Worker 		T16,
9897*61046927SAndroid Build Coastguard Worker 		T17,
9898*61046927SAndroid Build Coastguard Worker 		T18,
9899*61046927SAndroid Build Coastguard Worker 		T19,
9900*61046927SAndroid Build Coastguard Worker 		T20);
9901*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_9902*61046927SAndroid Build Coastguard Worker 	Event operator()(
9903*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
9904*61046927SAndroid Build Coastguard Worker 		T0 arg0,
9905*61046927SAndroid Build Coastguard Worker 		T1 arg1,
9906*61046927SAndroid Build Coastguard Worker 		T2 arg2,
9907*61046927SAndroid Build Coastguard Worker 		T3 arg3,
9908*61046927SAndroid Build Coastguard Worker 		T4 arg4,
9909*61046927SAndroid Build Coastguard Worker 		T5 arg5,
9910*61046927SAndroid Build Coastguard Worker 		T6 arg6,
9911*61046927SAndroid Build Coastguard Worker 		T7 arg7,
9912*61046927SAndroid Build Coastguard Worker 		T8 arg8,
9913*61046927SAndroid Build Coastguard Worker 		T9 arg9,
9914*61046927SAndroid Build Coastguard Worker 		T10 arg10,
9915*61046927SAndroid Build Coastguard Worker 		T11 arg11,
9916*61046927SAndroid Build Coastguard Worker 		T12 arg12,
9917*61046927SAndroid Build Coastguard Worker 		T13 arg13,
9918*61046927SAndroid Build Coastguard Worker 		T14 arg14,
9919*61046927SAndroid Build Coastguard Worker 		T15 arg15,
9920*61046927SAndroid Build Coastguard Worker 		T16 arg16,
9921*61046927SAndroid Build Coastguard Worker 		T17 arg17,
9922*61046927SAndroid Build Coastguard Worker 		T18 arg18,
9923*61046927SAndroid Build Coastguard Worker 		T19 arg19,
9924*61046927SAndroid Build Coastguard Worker 		T20 arg20)
9925*61046927SAndroid Build Coastguard Worker 	{
9926*61046927SAndroid Build Coastguard Worker 		return functor_(
9927*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
9928*61046927SAndroid Build Coastguard Worker 			arg0,
9929*61046927SAndroid Build Coastguard Worker 			arg1,
9930*61046927SAndroid Build Coastguard Worker 			arg2,
9931*61046927SAndroid Build Coastguard Worker 			arg3,
9932*61046927SAndroid Build Coastguard Worker 			arg4,
9933*61046927SAndroid Build Coastguard Worker 			arg5,
9934*61046927SAndroid Build Coastguard Worker 			arg6,
9935*61046927SAndroid Build Coastguard Worker 			arg7,
9936*61046927SAndroid Build Coastguard Worker 			arg8,
9937*61046927SAndroid Build Coastguard Worker 			arg9,
9938*61046927SAndroid Build Coastguard Worker 			arg10,
9939*61046927SAndroid Build Coastguard Worker 			arg11,
9940*61046927SAndroid Build Coastguard Worker 			arg12,
9941*61046927SAndroid Build Coastguard Worker 			arg13,
9942*61046927SAndroid Build Coastguard Worker 			arg14,
9943*61046927SAndroid Build Coastguard Worker 			arg15,
9944*61046927SAndroid Build Coastguard Worker 			arg16,
9945*61046927SAndroid Build Coastguard Worker 			arg17,
9946*61046927SAndroid Build Coastguard Worker 			arg18,
9947*61046927SAndroid Build Coastguard Worker 			arg19,
9948*61046927SAndroid Build Coastguard Worker 			arg20);
9949*61046927SAndroid Build Coastguard Worker 	}
9950*61046927SAndroid Build Coastguard Worker 
9951*61046927SAndroid Build Coastguard Worker 
9952*61046927SAndroid Build Coastguard Worker };
9953*61046927SAndroid Build Coastguard Worker 
9954*61046927SAndroid Build Coastguard Worker template<
9955*61046927SAndroid Build Coastguard Worker 	typename T0,
9956*61046927SAndroid Build Coastguard Worker 	typename T1,
9957*61046927SAndroid Build Coastguard Worker 	typename T2,
9958*61046927SAndroid Build Coastguard Worker 	typename T3,
9959*61046927SAndroid Build Coastguard Worker 	typename T4,
9960*61046927SAndroid Build Coastguard Worker 	typename T5,
9961*61046927SAndroid Build Coastguard Worker 	typename T6,
9962*61046927SAndroid Build Coastguard Worker 	typename T7,
9963*61046927SAndroid Build Coastguard Worker 	typename T8,
9964*61046927SAndroid Build Coastguard Worker 	typename T9,
9965*61046927SAndroid Build Coastguard Worker 	typename T10,
9966*61046927SAndroid Build Coastguard Worker 	typename T11,
9967*61046927SAndroid Build Coastguard Worker 	typename T12,
9968*61046927SAndroid Build Coastguard Worker 	typename T13,
9969*61046927SAndroid Build Coastguard Worker 	typename T14,
9970*61046927SAndroid Build Coastguard Worker 	typename T15,
9971*61046927SAndroid Build Coastguard Worker 	typename T16,
9972*61046927SAndroid Build Coastguard Worker 	typename T17,
9973*61046927SAndroid Build Coastguard Worker 	typename T18,
9974*61046927SAndroid Build Coastguard Worker 	typename T19>
9975*61046927SAndroid Build Coastguard Worker struct functionImplementation_
9976*61046927SAndroid Build Coastguard Worker <	T0,
9977*61046927SAndroid Build Coastguard Worker 	T1,
9978*61046927SAndroid Build Coastguard Worker 	T2,
9979*61046927SAndroid Build Coastguard Worker 	T3,
9980*61046927SAndroid Build Coastguard Worker 	T4,
9981*61046927SAndroid Build Coastguard Worker 	T5,
9982*61046927SAndroid Build Coastguard Worker 	T6,
9983*61046927SAndroid Build Coastguard Worker 	T7,
9984*61046927SAndroid Build Coastguard Worker 	T8,
9985*61046927SAndroid Build Coastguard Worker 	T9,
9986*61046927SAndroid Build Coastguard Worker 	T10,
9987*61046927SAndroid Build Coastguard Worker 	T11,
9988*61046927SAndroid Build Coastguard Worker 	T12,
9989*61046927SAndroid Build Coastguard Worker 	T13,
9990*61046927SAndroid Build Coastguard Worker 	T14,
9991*61046927SAndroid Build Coastguard Worker 	T15,
9992*61046927SAndroid Build Coastguard Worker 	T16,
9993*61046927SAndroid Build Coastguard Worker 	T17,
9994*61046927SAndroid Build Coastguard Worker 	T18,
9995*61046927SAndroid Build Coastguard Worker 	T19,
9996*61046927SAndroid Build Coastguard Worker 	NullType,
9997*61046927SAndroid Build Coastguard Worker 	NullType,
9998*61046927SAndroid Build Coastguard Worker 	NullType,
9999*61046927SAndroid Build Coastguard Worker 	NullType,
10000*61046927SAndroid Build Coastguard Worker 	NullType,
10001*61046927SAndroid Build Coastguard Worker 	NullType,
10002*61046927SAndroid Build Coastguard Worker 	NullType,
10003*61046927SAndroid Build Coastguard Worker 	NullType,
10004*61046927SAndroid Build Coastguard Worker 	NullType,
10005*61046927SAndroid Build Coastguard Worker 	NullType,
10006*61046927SAndroid Build Coastguard Worker 	NullType,
10007*61046927SAndroid Build Coastguard Worker 	NullType>
10008*61046927SAndroid Build Coastguard Worker {
10009*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
10010*61046927SAndroid Build Coastguard Worker 		T0,
10011*61046927SAndroid Build Coastguard Worker 		T1,
10012*61046927SAndroid Build Coastguard Worker 		T2,
10013*61046927SAndroid Build Coastguard Worker 		T3,
10014*61046927SAndroid Build Coastguard Worker 		T4,
10015*61046927SAndroid Build Coastguard Worker 		T5,
10016*61046927SAndroid Build Coastguard Worker 		T6,
10017*61046927SAndroid Build Coastguard Worker 		T7,
10018*61046927SAndroid Build Coastguard Worker 		T8,
10019*61046927SAndroid Build Coastguard Worker 		T9,
10020*61046927SAndroid Build Coastguard Worker 		T10,
10021*61046927SAndroid Build Coastguard Worker 		T11,
10022*61046927SAndroid Build Coastguard Worker 		T12,
10023*61046927SAndroid Build Coastguard Worker 		T13,
10024*61046927SAndroid Build Coastguard Worker 		T14,
10025*61046927SAndroid Build Coastguard Worker 		T15,
10026*61046927SAndroid Build Coastguard Worker 		T16,
10027*61046927SAndroid Build Coastguard Worker 		T17,
10028*61046927SAndroid Build Coastguard Worker 		T18,
10029*61046927SAndroid Build Coastguard Worker 		T19,
10030*61046927SAndroid Build Coastguard Worker 		NullType,
10031*61046927SAndroid Build Coastguard Worker 		NullType,
10032*61046927SAndroid Build Coastguard Worker 		NullType,
10033*61046927SAndroid Build Coastguard Worker 		NullType,
10034*61046927SAndroid Build Coastguard Worker 		NullType,
10035*61046927SAndroid Build Coastguard Worker 		NullType,
10036*61046927SAndroid Build Coastguard Worker 		NullType,
10037*61046927SAndroid Build Coastguard Worker 		NullType,
10038*61046927SAndroid Build Coastguard Worker 		NullType,
10039*61046927SAndroid Build Coastguard Worker 		NullType,
10040*61046927SAndroid Build Coastguard Worker 		NullType,
10041*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
10042*61046927SAndroid Build Coastguard Worker 
10043*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
10044*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_10045*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
10046*61046927SAndroid Build Coastguard Worker         functor_(functor)
10047*61046927SAndroid Build Coastguard Worker     {
10048*61046927SAndroid Build Coastguard Worker 
10049*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20))
10050*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
10051*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10052*61046927SAndroid Build Coastguard Worker         #endif
10053*61046927SAndroid Build Coastguard Worker 
10054*61046927SAndroid Build Coastguard Worker     }
10055*61046927SAndroid Build Coastguard Worker 
10056*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
10057*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
10058*61046927SAndroid Build Coastguard Worker 
10059*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
10060*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
10061*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
10062*61046927SAndroid Build Coastguard Worker 		T0,
10063*61046927SAndroid Build Coastguard Worker 		T1,
10064*61046927SAndroid Build Coastguard Worker 		T2,
10065*61046927SAndroid Build Coastguard Worker 		T3,
10066*61046927SAndroid Build Coastguard Worker 		T4,
10067*61046927SAndroid Build Coastguard Worker 		T5,
10068*61046927SAndroid Build Coastguard Worker 		T6,
10069*61046927SAndroid Build Coastguard Worker 		T7,
10070*61046927SAndroid Build Coastguard Worker 		T8,
10071*61046927SAndroid Build Coastguard Worker 		T9,
10072*61046927SAndroid Build Coastguard Worker 		T10,
10073*61046927SAndroid Build Coastguard Worker 		T11,
10074*61046927SAndroid Build Coastguard Worker 		T12,
10075*61046927SAndroid Build Coastguard Worker 		T13,
10076*61046927SAndroid Build Coastguard Worker 		T14,
10077*61046927SAndroid Build Coastguard Worker 		T15,
10078*61046927SAndroid Build Coastguard Worker 		T16,
10079*61046927SAndroid Build Coastguard Worker 		T17,
10080*61046927SAndroid Build Coastguard Worker 		T18,
10081*61046927SAndroid Build Coastguard Worker 		T19);
10082*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_10083*61046927SAndroid Build Coastguard Worker 	Event operator()(
10084*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
10085*61046927SAndroid Build Coastguard Worker 		T0 arg0,
10086*61046927SAndroid Build Coastguard Worker 		T1 arg1,
10087*61046927SAndroid Build Coastguard Worker 		T2 arg2,
10088*61046927SAndroid Build Coastguard Worker 		T3 arg3,
10089*61046927SAndroid Build Coastguard Worker 		T4 arg4,
10090*61046927SAndroid Build Coastguard Worker 		T5 arg5,
10091*61046927SAndroid Build Coastguard Worker 		T6 arg6,
10092*61046927SAndroid Build Coastguard Worker 		T7 arg7,
10093*61046927SAndroid Build Coastguard Worker 		T8 arg8,
10094*61046927SAndroid Build Coastguard Worker 		T9 arg9,
10095*61046927SAndroid Build Coastguard Worker 		T10 arg10,
10096*61046927SAndroid Build Coastguard Worker 		T11 arg11,
10097*61046927SAndroid Build Coastguard Worker 		T12 arg12,
10098*61046927SAndroid Build Coastguard Worker 		T13 arg13,
10099*61046927SAndroid Build Coastguard Worker 		T14 arg14,
10100*61046927SAndroid Build Coastguard Worker 		T15 arg15,
10101*61046927SAndroid Build Coastguard Worker 		T16 arg16,
10102*61046927SAndroid Build Coastguard Worker 		T17 arg17,
10103*61046927SAndroid Build Coastguard Worker 		T18 arg18,
10104*61046927SAndroid Build Coastguard Worker 		T19 arg19)
10105*61046927SAndroid Build Coastguard Worker 	{
10106*61046927SAndroid Build Coastguard Worker 		return functor_(
10107*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
10108*61046927SAndroid Build Coastguard Worker 			arg0,
10109*61046927SAndroid Build Coastguard Worker 			arg1,
10110*61046927SAndroid Build Coastguard Worker 			arg2,
10111*61046927SAndroid Build Coastguard Worker 			arg3,
10112*61046927SAndroid Build Coastguard Worker 			arg4,
10113*61046927SAndroid Build Coastguard Worker 			arg5,
10114*61046927SAndroid Build Coastguard Worker 			arg6,
10115*61046927SAndroid Build Coastguard Worker 			arg7,
10116*61046927SAndroid Build Coastguard Worker 			arg8,
10117*61046927SAndroid Build Coastguard Worker 			arg9,
10118*61046927SAndroid Build Coastguard Worker 			arg10,
10119*61046927SAndroid Build Coastguard Worker 			arg11,
10120*61046927SAndroid Build Coastguard Worker 			arg12,
10121*61046927SAndroid Build Coastguard Worker 			arg13,
10122*61046927SAndroid Build Coastguard Worker 			arg14,
10123*61046927SAndroid Build Coastguard Worker 			arg15,
10124*61046927SAndroid Build Coastguard Worker 			arg16,
10125*61046927SAndroid Build Coastguard Worker 			arg17,
10126*61046927SAndroid Build Coastguard Worker 			arg18,
10127*61046927SAndroid Build Coastguard Worker 			arg19);
10128*61046927SAndroid Build Coastguard Worker 	}
10129*61046927SAndroid Build Coastguard Worker 
10130*61046927SAndroid Build Coastguard Worker 
10131*61046927SAndroid Build Coastguard Worker };
10132*61046927SAndroid Build Coastguard Worker 
10133*61046927SAndroid Build Coastguard Worker template<
10134*61046927SAndroid Build Coastguard Worker 	typename T0,
10135*61046927SAndroid Build Coastguard Worker 	typename T1,
10136*61046927SAndroid Build Coastguard Worker 	typename T2,
10137*61046927SAndroid Build Coastguard Worker 	typename T3,
10138*61046927SAndroid Build Coastguard Worker 	typename T4,
10139*61046927SAndroid Build Coastguard Worker 	typename T5,
10140*61046927SAndroid Build Coastguard Worker 	typename T6,
10141*61046927SAndroid Build Coastguard Worker 	typename T7,
10142*61046927SAndroid Build Coastguard Worker 	typename T8,
10143*61046927SAndroid Build Coastguard Worker 	typename T9,
10144*61046927SAndroid Build Coastguard Worker 	typename T10,
10145*61046927SAndroid Build Coastguard Worker 	typename T11,
10146*61046927SAndroid Build Coastguard Worker 	typename T12,
10147*61046927SAndroid Build Coastguard Worker 	typename T13,
10148*61046927SAndroid Build Coastguard Worker 	typename T14,
10149*61046927SAndroid Build Coastguard Worker 	typename T15,
10150*61046927SAndroid Build Coastguard Worker 	typename T16,
10151*61046927SAndroid Build Coastguard Worker 	typename T17,
10152*61046927SAndroid Build Coastguard Worker 	typename T18>
10153*61046927SAndroid Build Coastguard Worker struct functionImplementation_
10154*61046927SAndroid Build Coastguard Worker <	T0,
10155*61046927SAndroid Build Coastguard Worker 	T1,
10156*61046927SAndroid Build Coastguard Worker 	T2,
10157*61046927SAndroid Build Coastguard Worker 	T3,
10158*61046927SAndroid Build Coastguard Worker 	T4,
10159*61046927SAndroid Build Coastguard Worker 	T5,
10160*61046927SAndroid Build Coastguard Worker 	T6,
10161*61046927SAndroid Build Coastguard Worker 	T7,
10162*61046927SAndroid Build Coastguard Worker 	T8,
10163*61046927SAndroid Build Coastguard Worker 	T9,
10164*61046927SAndroid Build Coastguard Worker 	T10,
10165*61046927SAndroid Build Coastguard Worker 	T11,
10166*61046927SAndroid Build Coastguard Worker 	T12,
10167*61046927SAndroid Build Coastguard Worker 	T13,
10168*61046927SAndroid Build Coastguard Worker 	T14,
10169*61046927SAndroid Build Coastguard Worker 	T15,
10170*61046927SAndroid Build Coastguard Worker 	T16,
10171*61046927SAndroid Build Coastguard Worker 	T17,
10172*61046927SAndroid Build Coastguard Worker 	T18,
10173*61046927SAndroid Build Coastguard Worker 	NullType,
10174*61046927SAndroid Build Coastguard Worker 	NullType,
10175*61046927SAndroid Build Coastguard Worker 	NullType,
10176*61046927SAndroid Build Coastguard Worker 	NullType,
10177*61046927SAndroid Build Coastguard Worker 	NullType,
10178*61046927SAndroid Build Coastguard Worker 	NullType,
10179*61046927SAndroid Build Coastguard Worker 	NullType,
10180*61046927SAndroid Build Coastguard Worker 	NullType,
10181*61046927SAndroid Build Coastguard Worker 	NullType,
10182*61046927SAndroid Build Coastguard Worker 	NullType,
10183*61046927SAndroid Build Coastguard Worker 	NullType,
10184*61046927SAndroid Build Coastguard Worker 	NullType,
10185*61046927SAndroid Build Coastguard Worker 	NullType>
10186*61046927SAndroid Build Coastguard Worker {
10187*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
10188*61046927SAndroid Build Coastguard Worker 		T0,
10189*61046927SAndroid Build Coastguard Worker 		T1,
10190*61046927SAndroid Build Coastguard Worker 		T2,
10191*61046927SAndroid Build Coastguard Worker 		T3,
10192*61046927SAndroid Build Coastguard Worker 		T4,
10193*61046927SAndroid Build Coastguard Worker 		T5,
10194*61046927SAndroid Build Coastguard Worker 		T6,
10195*61046927SAndroid Build Coastguard Worker 		T7,
10196*61046927SAndroid Build Coastguard Worker 		T8,
10197*61046927SAndroid Build Coastguard Worker 		T9,
10198*61046927SAndroid Build Coastguard Worker 		T10,
10199*61046927SAndroid Build Coastguard Worker 		T11,
10200*61046927SAndroid Build Coastguard Worker 		T12,
10201*61046927SAndroid Build Coastguard Worker 		T13,
10202*61046927SAndroid Build Coastguard Worker 		T14,
10203*61046927SAndroid Build Coastguard Worker 		T15,
10204*61046927SAndroid Build Coastguard Worker 		T16,
10205*61046927SAndroid Build Coastguard Worker 		T17,
10206*61046927SAndroid Build Coastguard Worker 		T18,
10207*61046927SAndroid Build Coastguard Worker 		NullType,
10208*61046927SAndroid Build Coastguard Worker 		NullType,
10209*61046927SAndroid Build Coastguard Worker 		NullType,
10210*61046927SAndroid Build Coastguard Worker 		NullType,
10211*61046927SAndroid Build Coastguard Worker 		NullType,
10212*61046927SAndroid Build Coastguard Worker 		NullType,
10213*61046927SAndroid Build Coastguard Worker 		NullType,
10214*61046927SAndroid Build Coastguard Worker 		NullType,
10215*61046927SAndroid Build Coastguard Worker 		NullType,
10216*61046927SAndroid Build Coastguard Worker 		NullType,
10217*61046927SAndroid Build Coastguard Worker 		NullType,
10218*61046927SAndroid Build Coastguard Worker 		NullType,
10219*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
10220*61046927SAndroid Build Coastguard Worker 
10221*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
10222*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_10223*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
10224*61046927SAndroid Build Coastguard Worker         functor_(functor)
10225*61046927SAndroid Build Coastguard Worker     {
10226*61046927SAndroid Build Coastguard Worker 
10227*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19))
10228*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
10229*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10230*61046927SAndroid Build Coastguard Worker         #endif
10231*61046927SAndroid Build Coastguard Worker 
10232*61046927SAndroid Build Coastguard Worker     }
10233*61046927SAndroid Build Coastguard Worker 
10234*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
10235*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
10236*61046927SAndroid Build Coastguard Worker 
10237*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
10238*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
10239*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
10240*61046927SAndroid Build Coastguard Worker 		T0,
10241*61046927SAndroid Build Coastguard Worker 		T1,
10242*61046927SAndroid Build Coastguard Worker 		T2,
10243*61046927SAndroid Build Coastguard Worker 		T3,
10244*61046927SAndroid Build Coastguard Worker 		T4,
10245*61046927SAndroid Build Coastguard Worker 		T5,
10246*61046927SAndroid Build Coastguard Worker 		T6,
10247*61046927SAndroid Build Coastguard Worker 		T7,
10248*61046927SAndroid Build Coastguard Worker 		T8,
10249*61046927SAndroid Build Coastguard Worker 		T9,
10250*61046927SAndroid Build Coastguard Worker 		T10,
10251*61046927SAndroid Build Coastguard Worker 		T11,
10252*61046927SAndroid Build Coastguard Worker 		T12,
10253*61046927SAndroid Build Coastguard Worker 		T13,
10254*61046927SAndroid Build Coastguard Worker 		T14,
10255*61046927SAndroid Build Coastguard Worker 		T15,
10256*61046927SAndroid Build Coastguard Worker 		T16,
10257*61046927SAndroid Build Coastguard Worker 		T17,
10258*61046927SAndroid Build Coastguard Worker 		T18);
10259*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_10260*61046927SAndroid Build Coastguard Worker 	Event operator()(
10261*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
10262*61046927SAndroid Build Coastguard Worker 		T0 arg0,
10263*61046927SAndroid Build Coastguard Worker 		T1 arg1,
10264*61046927SAndroid Build Coastguard Worker 		T2 arg2,
10265*61046927SAndroid Build Coastguard Worker 		T3 arg3,
10266*61046927SAndroid Build Coastguard Worker 		T4 arg4,
10267*61046927SAndroid Build Coastguard Worker 		T5 arg5,
10268*61046927SAndroid Build Coastguard Worker 		T6 arg6,
10269*61046927SAndroid Build Coastguard Worker 		T7 arg7,
10270*61046927SAndroid Build Coastguard Worker 		T8 arg8,
10271*61046927SAndroid Build Coastguard Worker 		T9 arg9,
10272*61046927SAndroid Build Coastguard Worker 		T10 arg10,
10273*61046927SAndroid Build Coastguard Worker 		T11 arg11,
10274*61046927SAndroid Build Coastguard Worker 		T12 arg12,
10275*61046927SAndroid Build Coastguard Worker 		T13 arg13,
10276*61046927SAndroid Build Coastguard Worker 		T14 arg14,
10277*61046927SAndroid Build Coastguard Worker 		T15 arg15,
10278*61046927SAndroid Build Coastguard Worker 		T16 arg16,
10279*61046927SAndroid Build Coastguard Worker 		T17 arg17,
10280*61046927SAndroid Build Coastguard Worker 		T18 arg18)
10281*61046927SAndroid Build Coastguard Worker 	{
10282*61046927SAndroid Build Coastguard Worker 		return functor_(
10283*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
10284*61046927SAndroid Build Coastguard Worker 			arg0,
10285*61046927SAndroid Build Coastguard Worker 			arg1,
10286*61046927SAndroid Build Coastguard Worker 			arg2,
10287*61046927SAndroid Build Coastguard Worker 			arg3,
10288*61046927SAndroid Build Coastguard Worker 			arg4,
10289*61046927SAndroid Build Coastguard Worker 			arg5,
10290*61046927SAndroid Build Coastguard Worker 			arg6,
10291*61046927SAndroid Build Coastguard Worker 			arg7,
10292*61046927SAndroid Build Coastguard Worker 			arg8,
10293*61046927SAndroid Build Coastguard Worker 			arg9,
10294*61046927SAndroid Build Coastguard Worker 			arg10,
10295*61046927SAndroid Build Coastguard Worker 			arg11,
10296*61046927SAndroid Build Coastguard Worker 			arg12,
10297*61046927SAndroid Build Coastguard Worker 			arg13,
10298*61046927SAndroid Build Coastguard Worker 			arg14,
10299*61046927SAndroid Build Coastguard Worker 			arg15,
10300*61046927SAndroid Build Coastguard Worker 			arg16,
10301*61046927SAndroid Build Coastguard Worker 			arg17,
10302*61046927SAndroid Build Coastguard Worker 			arg18);
10303*61046927SAndroid Build Coastguard Worker 	}
10304*61046927SAndroid Build Coastguard Worker 
10305*61046927SAndroid Build Coastguard Worker 
10306*61046927SAndroid Build Coastguard Worker };
10307*61046927SAndroid Build Coastguard Worker 
10308*61046927SAndroid Build Coastguard Worker template<
10309*61046927SAndroid Build Coastguard Worker 	typename T0,
10310*61046927SAndroid Build Coastguard Worker 	typename T1,
10311*61046927SAndroid Build Coastguard Worker 	typename T2,
10312*61046927SAndroid Build Coastguard Worker 	typename T3,
10313*61046927SAndroid Build Coastguard Worker 	typename T4,
10314*61046927SAndroid Build Coastguard Worker 	typename T5,
10315*61046927SAndroid Build Coastguard Worker 	typename T6,
10316*61046927SAndroid Build Coastguard Worker 	typename T7,
10317*61046927SAndroid Build Coastguard Worker 	typename T8,
10318*61046927SAndroid Build Coastguard Worker 	typename T9,
10319*61046927SAndroid Build Coastguard Worker 	typename T10,
10320*61046927SAndroid Build Coastguard Worker 	typename T11,
10321*61046927SAndroid Build Coastguard Worker 	typename T12,
10322*61046927SAndroid Build Coastguard Worker 	typename T13,
10323*61046927SAndroid Build Coastguard Worker 	typename T14,
10324*61046927SAndroid Build Coastguard Worker 	typename T15,
10325*61046927SAndroid Build Coastguard Worker 	typename T16,
10326*61046927SAndroid Build Coastguard Worker 	typename T17>
10327*61046927SAndroid Build Coastguard Worker struct functionImplementation_
10328*61046927SAndroid Build Coastguard Worker <	T0,
10329*61046927SAndroid Build Coastguard Worker 	T1,
10330*61046927SAndroid Build Coastguard Worker 	T2,
10331*61046927SAndroid Build Coastguard Worker 	T3,
10332*61046927SAndroid Build Coastguard Worker 	T4,
10333*61046927SAndroid Build Coastguard Worker 	T5,
10334*61046927SAndroid Build Coastguard Worker 	T6,
10335*61046927SAndroid Build Coastguard Worker 	T7,
10336*61046927SAndroid Build Coastguard Worker 	T8,
10337*61046927SAndroid Build Coastguard Worker 	T9,
10338*61046927SAndroid Build Coastguard Worker 	T10,
10339*61046927SAndroid Build Coastguard Worker 	T11,
10340*61046927SAndroid Build Coastguard Worker 	T12,
10341*61046927SAndroid Build Coastguard Worker 	T13,
10342*61046927SAndroid Build Coastguard Worker 	T14,
10343*61046927SAndroid Build Coastguard Worker 	T15,
10344*61046927SAndroid Build Coastguard Worker 	T16,
10345*61046927SAndroid Build Coastguard Worker 	T17,
10346*61046927SAndroid Build Coastguard Worker 	NullType,
10347*61046927SAndroid Build Coastguard Worker 	NullType,
10348*61046927SAndroid Build Coastguard Worker 	NullType,
10349*61046927SAndroid Build Coastguard Worker 	NullType,
10350*61046927SAndroid Build Coastguard Worker 	NullType,
10351*61046927SAndroid Build Coastguard Worker 	NullType,
10352*61046927SAndroid Build Coastguard Worker 	NullType,
10353*61046927SAndroid Build Coastguard Worker 	NullType,
10354*61046927SAndroid Build Coastguard Worker 	NullType,
10355*61046927SAndroid Build Coastguard Worker 	NullType,
10356*61046927SAndroid Build Coastguard Worker 	NullType,
10357*61046927SAndroid Build Coastguard Worker 	NullType,
10358*61046927SAndroid Build Coastguard Worker 	NullType,
10359*61046927SAndroid Build Coastguard Worker 	NullType>
10360*61046927SAndroid Build Coastguard Worker {
10361*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
10362*61046927SAndroid Build Coastguard Worker 		T0,
10363*61046927SAndroid Build Coastguard Worker 		T1,
10364*61046927SAndroid Build Coastguard Worker 		T2,
10365*61046927SAndroid Build Coastguard Worker 		T3,
10366*61046927SAndroid Build Coastguard Worker 		T4,
10367*61046927SAndroid Build Coastguard Worker 		T5,
10368*61046927SAndroid Build Coastguard Worker 		T6,
10369*61046927SAndroid Build Coastguard Worker 		T7,
10370*61046927SAndroid Build Coastguard Worker 		T8,
10371*61046927SAndroid Build Coastguard Worker 		T9,
10372*61046927SAndroid Build Coastguard Worker 		T10,
10373*61046927SAndroid Build Coastguard Worker 		T11,
10374*61046927SAndroid Build Coastguard Worker 		T12,
10375*61046927SAndroid Build Coastguard Worker 		T13,
10376*61046927SAndroid Build Coastguard Worker 		T14,
10377*61046927SAndroid Build Coastguard Worker 		T15,
10378*61046927SAndroid Build Coastguard Worker 		T16,
10379*61046927SAndroid Build Coastguard Worker 		T17,
10380*61046927SAndroid Build Coastguard Worker 		NullType,
10381*61046927SAndroid Build Coastguard Worker 		NullType,
10382*61046927SAndroid Build Coastguard Worker 		NullType,
10383*61046927SAndroid Build Coastguard Worker 		NullType,
10384*61046927SAndroid Build Coastguard Worker 		NullType,
10385*61046927SAndroid Build Coastguard Worker 		NullType,
10386*61046927SAndroid Build Coastguard Worker 		NullType,
10387*61046927SAndroid Build Coastguard Worker 		NullType,
10388*61046927SAndroid Build Coastguard Worker 		NullType,
10389*61046927SAndroid Build Coastguard Worker 		NullType,
10390*61046927SAndroid Build Coastguard Worker 		NullType,
10391*61046927SAndroid Build Coastguard Worker 		NullType,
10392*61046927SAndroid Build Coastguard Worker 		NullType,
10393*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
10394*61046927SAndroid Build Coastguard Worker 
10395*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
10396*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_10397*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
10398*61046927SAndroid Build Coastguard Worker         functor_(functor)
10399*61046927SAndroid Build Coastguard Worker     {
10400*61046927SAndroid Build Coastguard Worker 
10401*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18))
10402*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
10403*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10404*61046927SAndroid Build Coastguard Worker         #endif
10405*61046927SAndroid Build Coastguard Worker 
10406*61046927SAndroid Build Coastguard Worker     }
10407*61046927SAndroid Build Coastguard Worker 
10408*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
10409*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
10410*61046927SAndroid Build Coastguard Worker 
10411*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
10412*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
10413*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
10414*61046927SAndroid Build Coastguard Worker 		T0,
10415*61046927SAndroid Build Coastguard Worker 		T1,
10416*61046927SAndroid Build Coastguard Worker 		T2,
10417*61046927SAndroid Build Coastguard Worker 		T3,
10418*61046927SAndroid Build Coastguard Worker 		T4,
10419*61046927SAndroid Build Coastguard Worker 		T5,
10420*61046927SAndroid Build Coastguard Worker 		T6,
10421*61046927SAndroid Build Coastguard Worker 		T7,
10422*61046927SAndroid Build Coastguard Worker 		T8,
10423*61046927SAndroid Build Coastguard Worker 		T9,
10424*61046927SAndroid Build Coastguard Worker 		T10,
10425*61046927SAndroid Build Coastguard Worker 		T11,
10426*61046927SAndroid Build Coastguard Worker 		T12,
10427*61046927SAndroid Build Coastguard Worker 		T13,
10428*61046927SAndroid Build Coastguard Worker 		T14,
10429*61046927SAndroid Build Coastguard Worker 		T15,
10430*61046927SAndroid Build Coastguard Worker 		T16,
10431*61046927SAndroid Build Coastguard Worker 		T17);
10432*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_10433*61046927SAndroid Build Coastguard Worker 	Event operator()(
10434*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
10435*61046927SAndroid Build Coastguard Worker 		T0 arg0,
10436*61046927SAndroid Build Coastguard Worker 		T1 arg1,
10437*61046927SAndroid Build Coastguard Worker 		T2 arg2,
10438*61046927SAndroid Build Coastguard Worker 		T3 arg3,
10439*61046927SAndroid Build Coastguard Worker 		T4 arg4,
10440*61046927SAndroid Build Coastguard Worker 		T5 arg5,
10441*61046927SAndroid Build Coastguard Worker 		T6 arg6,
10442*61046927SAndroid Build Coastguard Worker 		T7 arg7,
10443*61046927SAndroid Build Coastguard Worker 		T8 arg8,
10444*61046927SAndroid Build Coastguard Worker 		T9 arg9,
10445*61046927SAndroid Build Coastguard Worker 		T10 arg10,
10446*61046927SAndroid Build Coastguard Worker 		T11 arg11,
10447*61046927SAndroid Build Coastguard Worker 		T12 arg12,
10448*61046927SAndroid Build Coastguard Worker 		T13 arg13,
10449*61046927SAndroid Build Coastguard Worker 		T14 arg14,
10450*61046927SAndroid Build Coastguard Worker 		T15 arg15,
10451*61046927SAndroid Build Coastguard Worker 		T16 arg16,
10452*61046927SAndroid Build Coastguard Worker 		T17 arg17)
10453*61046927SAndroid Build Coastguard Worker 	{
10454*61046927SAndroid Build Coastguard Worker 		return functor_(
10455*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
10456*61046927SAndroid Build Coastguard Worker 			arg0,
10457*61046927SAndroid Build Coastguard Worker 			arg1,
10458*61046927SAndroid Build Coastguard Worker 			arg2,
10459*61046927SAndroid Build Coastguard Worker 			arg3,
10460*61046927SAndroid Build Coastguard Worker 			arg4,
10461*61046927SAndroid Build Coastguard Worker 			arg5,
10462*61046927SAndroid Build Coastguard Worker 			arg6,
10463*61046927SAndroid Build Coastguard Worker 			arg7,
10464*61046927SAndroid Build Coastguard Worker 			arg8,
10465*61046927SAndroid Build Coastguard Worker 			arg9,
10466*61046927SAndroid Build Coastguard Worker 			arg10,
10467*61046927SAndroid Build Coastguard Worker 			arg11,
10468*61046927SAndroid Build Coastguard Worker 			arg12,
10469*61046927SAndroid Build Coastguard Worker 			arg13,
10470*61046927SAndroid Build Coastguard Worker 			arg14,
10471*61046927SAndroid Build Coastguard Worker 			arg15,
10472*61046927SAndroid Build Coastguard Worker 			arg16,
10473*61046927SAndroid Build Coastguard Worker 			arg17);
10474*61046927SAndroid Build Coastguard Worker 	}
10475*61046927SAndroid Build Coastguard Worker 
10476*61046927SAndroid Build Coastguard Worker 
10477*61046927SAndroid Build Coastguard Worker };
10478*61046927SAndroid Build Coastguard Worker 
10479*61046927SAndroid Build Coastguard Worker template<
10480*61046927SAndroid Build Coastguard Worker 	typename T0,
10481*61046927SAndroid Build Coastguard Worker 	typename T1,
10482*61046927SAndroid Build Coastguard Worker 	typename T2,
10483*61046927SAndroid Build Coastguard Worker 	typename T3,
10484*61046927SAndroid Build Coastguard Worker 	typename T4,
10485*61046927SAndroid Build Coastguard Worker 	typename T5,
10486*61046927SAndroid Build Coastguard Worker 	typename T6,
10487*61046927SAndroid Build Coastguard Worker 	typename T7,
10488*61046927SAndroid Build Coastguard Worker 	typename T8,
10489*61046927SAndroid Build Coastguard Worker 	typename T9,
10490*61046927SAndroid Build Coastguard Worker 	typename T10,
10491*61046927SAndroid Build Coastguard Worker 	typename T11,
10492*61046927SAndroid Build Coastguard Worker 	typename T12,
10493*61046927SAndroid Build Coastguard Worker 	typename T13,
10494*61046927SAndroid Build Coastguard Worker 	typename T14,
10495*61046927SAndroid Build Coastguard Worker 	typename T15,
10496*61046927SAndroid Build Coastguard Worker 	typename T16>
10497*61046927SAndroid Build Coastguard Worker struct functionImplementation_
10498*61046927SAndroid Build Coastguard Worker <	T0,
10499*61046927SAndroid Build Coastguard Worker 	T1,
10500*61046927SAndroid Build Coastguard Worker 	T2,
10501*61046927SAndroid Build Coastguard Worker 	T3,
10502*61046927SAndroid Build Coastguard Worker 	T4,
10503*61046927SAndroid Build Coastguard Worker 	T5,
10504*61046927SAndroid Build Coastguard Worker 	T6,
10505*61046927SAndroid Build Coastguard Worker 	T7,
10506*61046927SAndroid Build Coastguard Worker 	T8,
10507*61046927SAndroid Build Coastguard Worker 	T9,
10508*61046927SAndroid Build Coastguard Worker 	T10,
10509*61046927SAndroid Build Coastguard Worker 	T11,
10510*61046927SAndroid Build Coastguard Worker 	T12,
10511*61046927SAndroid Build Coastguard Worker 	T13,
10512*61046927SAndroid Build Coastguard Worker 	T14,
10513*61046927SAndroid Build Coastguard Worker 	T15,
10514*61046927SAndroid Build Coastguard Worker 	T16,
10515*61046927SAndroid Build Coastguard Worker 	NullType,
10516*61046927SAndroid Build Coastguard Worker 	NullType,
10517*61046927SAndroid Build Coastguard Worker 	NullType,
10518*61046927SAndroid Build Coastguard Worker 	NullType,
10519*61046927SAndroid Build Coastguard Worker 	NullType,
10520*61046927SAndroid Build Coastguard Worker 	NullType,
10521*61046927SAndroid Build Coastguard Worker 	NullType,
10522*61046927SAndroid Build Coastguard Worker 	NullType,
10523*61046927SAndroid Build Coastguard Worker 	NullType,
10524*61046927SAndroid Build Coastguard Worker 	NullType,
10525*61046927SAndroid Build Coastguard Worker 	NullType,
10526*61046927SAndroid Build Coastguard Worker 	NullType,
10527*61046927SAndroid Build Coastguard Worker 	NullType,
10528*61046927SAndroid Build Coastguard Worker 	NullType,
10529*61046927SAndroid Build Coastguard Worker 	NullType>
10530*61046927SAndroid Build Coastguard Worker {
10531*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
10532*61046927SAndroid Build Coastguard Worker 		T0,
10533*61046927SAndroid Build Coastguard Worker 		T1,
10534*61046927SAndroid Build Coastguard Worker 		T2,
10535*61046927SAndroid Build Coastguard Worker 		T3,
10536*61046927SAndroid Build Coastguard Worker 		T4,
10537*61046927SAndroid Build Coastguard Worker 		T5,
10538*61046927SAndroid Build Coastguard Worker 		T6,
10539*61046927SAndroid Build Coastguard Worker 		T7,
10540*61046927SAndroid Build Coastguard Worker 		T8,
10541*61046927SAndroid Build Coastguard Worker 		T9,
10542*61046927SAndroid Build Coastguard Worker 		T10,
10543*61046927SAndroid Build Coastguard Worker 		T11,
10544*61046927SAndroid Build Coastguard Worker 		T12,
10545*61046927SAndroid Build Coastguard Worker 		T13,
10546*61046927SAndroid Build Coastguard Worker 		T14,
10547*61046927SAndroid Build Coastguard Worker 		T15,
10548*61046927SAndroid Build Coastguard Worker 		T16,
10549*61046927SAndroid Build Coastguard Worker 		NullType,
10550*61046927SAndroid Build Coastguard Worker 		NullType,
10551*61046927SAndroid Build Coastguard Worker 		NullType,
10552*61046927SAndroid Build Coastguard Worker 		NullType,
10553*61046927SAndroid Build Coastguard Worker 		NullType,
10554*61046927SAndroid Build Coastguard Worker 		NullType,
10555*61046927SAndroid Build Coastguard Worker 		NullType,
10556*61046927SAndroid Build Coastguard Worker 		NullType,
10557*61046927SAndroid Build Coastguard Worker 		NullType,
10558*61046927SAndroid Build Coastguard Worker 		NullType,
10559*61046927SAndroid Build Coastguard Worker 		NullType,
10560*61046927SAndroid Build Coastguard Worker 		NullType,
10561*61046927SAndroid Build Coastguard Worker 		NullType,
10562*61046927SAndroid Build Coastguard Worker 		NullType,
10563*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
10564*61046927SAndroid Build Coastguard Worker 
10565*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
10566*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_10567*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
10568*61046927SAndroid Build Coastguard Worker         functor_(functor)
10569*61046927SAndroid Build Coastguard Worker     {
10570*61046927SAndroid Build Coastguard Worker 
10571*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17))
10572*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
10573*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10574*61046927SAndroid Build Coastguard Worker         #endif
10575*61046927SAndroid Build Coastguard Worker 
10576*61046927SAndroid Build Coastguard Worker     }
10577*61046927SAndroid Build Coastguard Worker 
10578*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
10579*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
10580*61046927SAndroid Build Coastguard Worker 
10581*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
10582*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
10583*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
10584*61046927SAndroid Build Coastguard Worker 		T0,
10585*61046927SAndroid Build Coastguard Worker 		T1,
10586*61046927SAndroid Build Coastguard Worker 		T2,
10587*61046927SAndroid Build Coastguard Worker 		T3,
10588*61046927SAndroid Build Coastguard Worker 		T4,
10589*61046927SAndroid Build Coastguard Worker 		T5,
10590*61046927SAndroid Build Coastguard Worker 		T6,
10591*61046927SAndroid Build Coastguard Worker 		T7,
10592*61046927SAndroid Build Coastguard Worker 		T8,
10593*61046927SAndroid Build Coastguard Worker 		T9,
10594*61046927SAndroid Build Coastguard Worker 		T10,
10595*61046927SAndroid Build Coastguard Worker 		T11,
10596*61046927SAndroid Build Coastguard Worker 		T12,
10597*61046927SAndroid Build Coastguard Worker 		T13,
10598*61046927SAndroid Build Coastguard Worker 		T14,
10599*61046927SAndroid Build Coastguard Worker 		T15,
10600*61046927SAndroid Build Coastguard Worker 		T16);
10601*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_10602*61046927SAndroid Build Coastguard Worker 	Event operator()(
10603*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
10604*61046927SAndroid Build Coastguard Worker 		T0 arg0,
10605*61046927SAndroid Build Coastguard Worker 		T1 arg1,
10606*61046927SAndroid Build Coastguard Worker 		T2 arg2,
10607*61046927SAndroid Build Coastguard Worker 		T3 arg3,
10608*61046927SAndroid Build Coastguard Worker 		T4 arg4,
10609*61046927SAndroid Build Coastguard Worker 		T5 arg5,
10610*61046927SAndroid Build Coastguard Worker 		T6 arg6,
10611*61046927SAndroid Build Coastguard Worker 		T7 arg7,
10612*61046927SAndroid Build Coastguard Worker 		T8 arg8,
10613*61046927SAndroid Build Coastguard Worker 		T9 arg9,
10614*61046927SAndroid Build Coastguard Worker 		T10 arg10,
10615*61046927SAndroid Build Coastguard Worker 		T11 arg11,
10616*61046927SAndroid Build Coastguard Worker 		T12 arg12,
10617*61046927SAndroid Build Coastguard Worker 		T13 arg13,
10618*61046927SAndroid Build Coastguard Worker 		T14 arg14,
10619*61046927SAndroid Build Coastguard Worker 		T15 arg15,
10620*61046927SAndroid Build Coastguard Worker 		T16 arg16)
10621*61046927SAndroid Build Coastguard Worker 	{
10622*61046927SAndroid Build Coastguard Worker 		return functor_(
10623*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
10624*61046927SAndroid Build Coastguard Worker 			arg0,
10625*61046927SAndroid Build Coastguard Worker 			arg1,
10626*61046927SAndroid Build Coastguard Worker 			arg2,
10627*61046927SAndroid Build Coastguard Worker 			arg3,
10628*61046927SAndroid Build Coastguard Worker 			arg4,
10629*61046927SAndroid Build Coastguard Worker 			arg5,
10630*61046927SAndroid Build Coastguard Worker 			arg6,
10631*61046927SAndroid Build Coastguard Worker 			arg7,
10632*61046927SAndroid Build Coastguard Worker 			arg8,
10633*61046927SAndroid Build Coastguard Worker 			arg9,
10634*61046927SAndroid Build Coastguard Worker 			arg10,
10635*61046927SAndroid Build Coastguard Worker 			arg11,
10636*61046927SAndroid Build Coastguard Worker 			arg12,
10637*61046927SAndroid Build Coastguard Worker 			arg13,
10638*61046927SAndroid Build Coastguard Worker 			arg14,
10639*61046927SAndroid Build Coastguard Worker 			arg15,
10640*61046927SAndroid Build Coastguard Worker 			arg16);
10641*61046927SAndroid Build Coastguard Worker 	}
10642*61046927SAndroid Build Coastguard Worker 
10643*61046927SAndroid Build Coastguard Worker 
10644*61046927SAndroid Build Coastguard Worker };
10645*61046927SAndroid Build Coastguard Worker 
10646*61046927SAndroid Build Coastguard Worker template<
10647*61046927SAndroid Build Coastguard Worker 	typename T0,
10648*61046927SAndroid Build Coastguard Worker 	typename T1,
10649*61046927SAndroid Build Coastguard Worker 	typename T2,
10650*61046927SAndroid Build Coastguard Worker 	typename T3,
10651*61046927SAndroid Build Coastguard Worker 	typename T4,
10652*61046927SAndroid Build Coastguard Worker 	typename T5,
10653*61046927SAndroid Build Coastguard Worker 	typename T6,
10654*61046927SAndroid Build Coastguard Worker 	typename T7,
10655*61046927SAndroid Build Coastguard Worker 	typename T8,
10656*61046927SAndroid Build Coastguard Worker 	typename T9,
10657*61046927SAndroid Build Coastguard Worker 	typename T10,
10658*61046927SAndroid Build Coastguard Worker 	typename T11,
10659*61046927SAndroid Build Coastguard Worker 	typename T12,
10660*61046927SAndroid Build Coastguard Worker 	typename T13,
10661*61046927SAndroid Build Coastguard Worker 	typename T14,
10662*61046927SAndroid Build Coastguard Worker 	typename T15>
10663*61046927SAndroid Build Coastguard Worker struct functionImplementation_
10664*61046927SAndroid Build Coastguard Worker <	T0,
10665*61046927SAndroid Build Coastguard Worker 	T1,
10666*61046927SAndroid Build Coastguard Worker 	T2,
10667*61046927SAndroid Build Coastguard Worker 	T3,
10668*61046927SAndroid Build Coastguard Worker 	T4,
10669*61046927SAndroid Build Coastguard Worker 	T5,
10670*61046927SAndroid Build Coastguard Worker 	T6,
10671*61046927SAndroid Build Coastguard Worker 	T7,
10672*61046927SAndroid Build Coastguard Worker 	T8,
10673*61046927SAndroid Build Coastguard Worker 	T9,
10674*61046927SAndroid Build Coastguard Worker 	T10,
10675*61046927SAndroid Build Coastguard Worker 	T11,
10676*61046927SAndroid Build Coastguard Worker 	T12,
10677*61046927SAndroid Build Coastguard Worker 	T13,
10678*61046927SAndroid Build Coastguard Worker 	T14,
10679*61046927SAndroid Build Coastguard Worker 	T15,
10680*61046927SAndroid Build Coastguard Worker 	NullType,
10681*61046927SAndroid Build Coastguard Worker 	NullType,
10682*61046927SAndroid Build Coastguard Worker 	NullType,
10683*61046927SAndroid Build Coastguard Worker 	NullType,
10684*61046927SAndroid Build Coastguard Worker 	NullType,
10685*61046927SAndroid Build Coastguard Worker 	NullType,
10686*61046927SAndroid Build Coastguard Worker 	NullType,
10687*61046927SAndroid Build Coastguard Worker 	NullType,
10688*61046927SAndroid Build Coastguard Worker 	NullType,
10689*61046927SAndroid Build Coastguard Worker 	NullType,
10690*61046927SAndroid Build Coastguard Worker 	NullType,
10691*61046927SAndroid Build Coastguard Worker 	NullType,
10692*61046927SAndroid Build Coastguard Worker 	NullType,
10693*61046927SAndroid Build Coastguard Worker 	NullType,
10694*61046927SAndroid Build Coastguard Worker 	NullType,
10695*61046927SAndroid Build Coastguard Worker 	NullType>
10696*61046927SAndroid Build Coastguard Worker {
10697*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
10698*61046927SAndroid Build Coastguard Worker 		T0,
10699*61046927SAndroid Build Coastguard Worker 		T1,
10700*61046927SAndroid Build Coastguard Worker 		T2,
10701*61046927SAndroid Build Coastguard Worker 		T3,
10702*61046927SAndroid Build Coastguard Worker 		T4,
10703*61046927SAndroid Build Coastguard Worker 		T5,
10704*61046927SAndroid Build Coastguard Worker 		T6,
10705*61046927SAndroid Build Coastguard Worker 		T7,
10706*61046927SAndroid Build Coastguard Worker 		T8,
10707*61046927SAndroid Build Coastguard Worker 		T9,
10708*61046927SAndroid Build Coastguard Worker 		T10,
10709*61046927SAndroid Build Coastguard Worker 		T11,
10710*61046927SAndroid Build Coastguard Worker 		T12,
10711*61046927SAndroid Build Coastguard Worker 		T13,
10712*61046927SAndroid Build Coastguard Worker 		T14,
10713*61046927SAndroid Build Coastguard Worker 		T15,
10714*61046927SAndroid Build Coastguard Worker 		NullType,
10715*61046927SAndroid Build Coastguard Worker 		NullType,
10716*61046927SAndroid Build Coastguard Worker 		NullType,
10717*61046927SAndroid Build Coastguard Worker 		NullType,
10718*61046927SAndroid Build Coastguard Worker 		NullType,
10719*61046927SAndroid Build Coastguard Worker 		NullType,
10720*61046927SAndroid Build Coastguard Worker 		NullType,
10721*61046927SAndroid Build Coastguard Worker 		NullType,
10722*61046927SAndroid Build Coastguard Worker 		NullType,
10723*61046927SAndroid Build Coastguard Worker 		NullType,
10724*61046927SAndroid Build Coastguard Worker 		NullType,
10725*61046927SAndroid Build Coastguard Worker 		NullType,
10726*61046927SAndroid Build Coastguard Worker 		NullType,
10727*61046927SAndroid Build Coastguard Worker 		NullType,
10728*61046927SAndroid Build Coastguard Worker 		NullType,
10729*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
10730*61046927SAndroid Build Coastguard Worker 
10731*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
10732*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_10733*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
10734*61046927SAndroid Build Coastguard Worker         functor_(functor)
10735*61046927SAndroid Build Coastguard Worker     {
10736*61046927SAndroid Build Coastguard Worker 
10737*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16))
10738*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
10739*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10740*61046927SAndroid Build Coastguard Worker         #endif
10741*61046927SAndroid Build Coastguard Worker 
10742*61046927SAndroid Build Coastguard Worker     }
10743*61046927SAndroid Build Coastguard Worker 
10744*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
10745*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
10746*61046927SAndroid Build Coastguard Worker 
10747*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
10748*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
10749*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
10750*61046927SAndroid Build Coastguard Worker 		T0,
10751*61046927SAndroid Build Coastguard Worker 		T1,
10752*61046927SAndroid Build Coastguard Worker 		T2,
10753*61046927SAndroid Build Coastguard Worker 		T3,
10754*61046927SAndroid Build Coastguard Worker 		T4,
10755*61046927SAndroid Build Coastguard Worker 		T5,
10756*61046927SAndroid Build Coastguard Worker 		T6,
10757*61046927SAndroid Build Coastguard Worker 		T7,
10758*61046927SAndroid Build Coastguard Worker 		T8,
10759*61046927SAndroid Build Coastguard Worker 		T9,
10760*61046927SAndroid Build Coastguard Worker 		T10,
10761*61046927SAndroid Build Coastguard Worker 		T11,
10762*61046927SAndroid Build Coastguard Worker 		T12,
10763*61046927SAndroid Build Coastguard Worker 		T13,
10764*61046927SAndroid Build Coastguard Worker 		T14,
10765*61046927SAndroid Build Coastguard Worker 		T15);
10766*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_10767*61046927SAndroid Build Coastguard Worker 	Event operator()(
10768*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
10769*61046927SAndroid Build Coastguard Worker 		T0 arg0,
10770*61046927SAndroid Build Coastguard Worker 		T1 arg1,
10771*61046927SAndroid Build Coastguard Worker 		T2 arg2,
10772*61046927SAndroid Build Coastguard Worker 		T3 arg3,
10773*61046927SAndroid Build Coastguard Worker 		T4 arg4,
10774*61046927SAndroid Build Coastguard Worker 		T5 arg5,
10775*61046927SAndroid Build Coastguard Worker 		T6 arg6,
10776*61046927SAndroid Build Coastguard Worker 		T7 arg7,
10777*61046927SAndroid Build Coastguard Worker 		T8 arg8,
10778*61046927SAndroid Build Coastguard Worker 		T9 arg9,
10779*61046927SAndroid Build Coastguard Worker 		T10 arg10,
10780*61046927SAndroid Build Coastguard Worker 		T11 arg11,
10781*61046927SAndroid Build Coastguard Worker 		T12 arg12,
10782*61046927SAndroid Build Coastguard Worker 		T13 arg13,
10783*61046927SAndroid Build Coastguard Worker 		T14 arg14,
10784*61046927SAndroid Build Coastguard Worker 		T15 arg15)
10785*61046927SAndroid Build Coastguard Worker 	{
10786*61046927SAndroid Build Coastguard Worker 		return functor_(
10787*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
10788*61046927SAndroid Build Coastguard Worker 			arg0,
10789*61046927SAndroid Build Coastguard Worker 			arg1,
10790*61046927SAndroid Build Coastguard Worker 			arg2,
10791*61046927SAndroid Build Coastguard Worker 			arg3,
10792*61046927SAndroid Build Coastguard Worker 			arg4,
10793*61046927SAndroid Build Coastguard Worker 			arg5,
10794*61046927SAndroid Build Coastguard Worker 			arg6,
10795*61046927SAndroid Build Coastguard Worker 			arg7,
10796*61046927SAndroid Build Coastguard Worker 			arg8,
10797*61046927SAndroid Build Coastguard Worker 			arg9,
10798*61046927SAndroid Build Coastguard Worker 			arg10,
10799*61046927SAndroid Build Coastguard Worker 			arg11,
10800*61046927SAndroid Build Coastguard Worker 			arg12,
10801*61046927SAndroid Build Coastguard Worker 			arg13,
10802*61046927SAndroid Build Coastguard Worker 			arg14,
10803*61046927SAndroid Build Coastguard Worker 			arg15);
10804*61046927SAndroid Build Coastguard Worker 	}
10805*61046927SAndroid Build Coastguard Worker 
10806*61046927SAndroid Build Coastguard Worker 
10807*61046927SAndroid Build Coastguard Worker };
10808*61046927SAndroid Build Coastguard Worker 
10809*61046927SAndroid Build Coastguard Worker template<
10810*61046927SAndroid Build Coastguard Worker 	typename T0,
10811*61046927SAndroid Build Coastguard Worker 	typename T1,
10812*61046927SAndroid Build Coastguard Worker 	typename T2,
10813*61046927SAndroid Build Coastguard Worker 	typename T3,
10814*61046927SAndroid Build Coastguard Worker 	typename T4,
10815*61046927SAndroid Build Coastguard Worker 	typename T5,
10816*61046927SAndroid Build Coastguard Worker 	typename T6,
10817*61046927SAndroid Build Coastguard Worker 	typename T7,
10818*61046927SAndroid Build Coastguard Worker 	typename T8,
10819*61046927SAndroid Build Coastguard Worker 	typename T9,
10820*61046927SAndroid Build Coastguard Worker 	typename T10,
10821*61046927SAndroid Build Coastguard Worker 	typename T11,
10822*61046927SAndroid Build Coastguard Worker 	typename T12,
10823*61046927SAndroid Build Coastguard Worker 	typename T13,
10824*61046927SAndroid Build Coastguard Worker 	typename T14>
10825*61046927SAndroid Build Coastguard Worker struct functionImplementation_
10826*61046927SAndroid Build Coastguard Worker <	T0,
10827*61046927SAndroid Build Coastguard Worker 	T1,
10828*61046927SAndroid Build Coastguard Worker 	T2,
10829*61046927SAndroid Build Coastguard Worker 	T3,
10830*61046927SAndroid Build Coastguard Worker 	T4,
10831*61046927SAndroid Build Coastguard Worker 	T5,
10832*61046927SAndroid Build Coastguard Worker 	T6,
10833*61046927SAndroid Build Coastguard Worker 	T7,
10834*61046927SAndroid Build Coastguard Worker 	T8,
10835*61046927SAndroid Build Coastguard Worker 	T9,
10836*61046927SAndroid Build Coastguard Worker 	T10,
10837*61046927SAndroid Build Coastguard Worker 	T11,
10838*61046927SAndroid Build Coastguard Worker 	T12,
10839*61046927SAndroid Build Coastguard Worker 	T13,
10840*61046927SAndroid Build Coastguard Worker 	T14,
10841*61046927SAndroid Build Coastguard Worker 	NullType,
10842*61046927SAndroid Build Coastguard Worker 	NullType,
10843*61046927SAndroid Build Coastguard Worker 	NullType,
10844*61046927SAndroid Build Coastguard Worker 	NullType,
10845*61046927SAndroid Build Coastguard Worker 	NullType,
10846*61046927SAndroid Build Coastguard Worker 	NullType,
10847*61046927SAndroid Build Coastguard Worker 	NullType,
10848*61046927SAndroid Build Coastguard Worker 	NullType,
10849*61046927SAndroid Build Coastguard Worker 	NullType,
10850*61046927SAndroid Build Coastguard Worker 	NullType,
10851*61046927SAndroid Build Coastguard Worker 	NullType,
10852*61046927SAndroid Build Coastguard Worker 	NullType,
10853*61046927SAndroid Build Coastguard Worker 	NullType,
10854*61046927SAndroid Build Coastguard Worker 	NullType,
10855*61046927SAndroid Build Coastguard Worker 	NullType,
10856*61046927SAndroid Build Coastguard Worker 	NullType,
10857*61046927SAndroid Build Coastguard Worker 	NullType>
10858*61046927SAndroid Build Coastguard Worker {
10859*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
10860*61046927SAndroid Build Coastguard Worker 		T0,
10861*61046927SAndroid Build Coastguard Worker 		T1,
10862*61046927SAndroid Build Coastguard Worker 		T2,
10863*61046927SAndroid Build Coastguard Worker 		T3,
10864*61046927SAndroid Build Coastguard Worker 		T4,
10865*61046927SAndroid Build Coastguard Worker 		T5,
10866*61046927SAndroid Build Coastguard Worker 		T6,
10867*61046927SAndroid Build Coastguard Worker 		T7,
10868*61046927SAndroid Build Coastguard Worker 		T8,
10869*61046927SAndroid Build Coastguard Worker 		T9,
10870*61046927SAndroid Build Coastguard Worker 		T10,
10871*61046927SAndroid Build Coastguard Worker 		T11,
10872*61046927SAndroid Build Coastguard Worker 		T12,
10873*61046927SAndroid Build Coastguard Worker 		T13,
10874*61046927SAndroid Build Coastguard Worker 		T14,
10875*61046927SAndroid Build Coastguard Worker 		NullType,
10876*61046927SAndroid Build Coastguard Worker 		NullType,
10877*61046927SAndroid Build Coastguard Worker 		NullType,
10878*61046927SAndroid Build Coastguard Worker 		NullType,
10879*61046927SAndroid Build Coastguard Worker 		NullType,
10880*61046927SAndroid Build Coastguard Worker 		NullType,
10881*61046927SAndroid Build Coastguard Worker 		NullType,
10882*61046927SAndroid Build Coastguard Worker 		NullType,
10883*61046927SAndroid Build Coastguard Worker 		NullType,
10884*61046927SAndroid Build Coastguard Worker 		NullType,
10885*61046927SAndroid Build Coastguard Worker 		NullType,
10886*61046927SAndroid Build Coastguard Worker 		NullType,
10887*61046927SAndroid Build Coastguard Worker 		NullType,
10888*61046927SAndroid Build Coastguard Worker 		NullType,
10889*61046927SAndroid Build Coastguard Worker 		NullType,
10890*61046927SAndroid Build Coastguard Worker 		NullType,
10891*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
10892*61046927SAndroid Build Coastguard Worker 
10893*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
10894*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_10895*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
10896*61046927SAndroid Build Coastguard Worker         functor_(functor)
10897*61046927SAndroid Build Coastguard Worker     {
10898*61046927SAndroid Build Coastguard Worker 
10899*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15))
10900*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
10901*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10902*61046927SAndroid Build Coastguard Worker         #endif
10903*61046927SAndroid Build Coastguard Worker 
10904*61046927SAndroid Build Coastguard Worker     }
10905*61046927SAndroid Build Coastguard Worker 
10906*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
10907*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
10908*61046927SAndroid Build Coastguard Worker 
10909*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
10910*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
10911*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
10912*61046927SAndroid Build Coastguard Worker 		T0,
10913*61046927SAndroid Build Coastguard Worker 		T1,
10914*61046927SAndroid Build Coastguard Worker 		T2,
10915*61046927SAndroid Build Coastguard Worker 		T3,
10916*61046927SAndroid Build Coastguard Worker 		T4,
10917*61046927SAndroid Build Coastguard Worker 		T5,
10918*61046927SAndroid Build Coastguard Worker 		T6,
10919*61046927SAndroid Build Coastguard Worker 		T7,
10920*61046927SAndroid Build Coastguard Worker 		T8,
10921*61046927SAndroid Build Coastguard Worker 		T9,
10922*61046927SAndroid Build Coastguard Worker 		T10,
10923*61046927SAndroid Build Coastguard Worker 		T11,
10924*61046927SAndroid Build Coastguard Worker 		T12,
10925*61046927SAndroid Build Coastguard Worker 		T13,
10926*61046927SAndroid Build Coastguard Worker 		T14);
10927*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_10928*61046927SAndroid Build Coastguard Worker 	Event operator()(
10929*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
10930*61046927SAndroid Build Coastguard Worker 		T0 arg0,
10931*61046927SAndroid Build Coastguard Worker 		T1 arg1,
10932*61046927SAndroid Build Coastguard Worker 		T2 arg2,
10933*61046927SAndroid Build Coastguard Worker 		T3 arg3,
10934*61046927SAndroid Build Coastguard Worker 		T4 arg4,
10935*61046927SAndroid Build Coastguard Worker 		T5 arg5,
10936*61046927SAndroid Build Coastguard Worker 		T6 arg6,
10937*61046927SAndroid Build Coastguard Worker 		T7 arg7,
10938*61046927SAndroid Build Coastguard Worker 		T8 arg8,
10939*61046927SAndroid Build Coastguard Worker 		T9 arg9,
10940*61046927SAndroid Build Coastguard Worker 		T10 arg10,
10941*61046927SAndroid Build Coastguard Worker 		T11 arg11,
10942*61046927SAndroid Build Coastguard Worker 		T12 arg12,
10943*61046927SAndroid Build Coastguard Worker 		T13 arg13,
10944*61046927SAndroid Build Coastguard Worker 		T14 arg14)
10945*61046927SAndroid Build Coastguard Worker 	{
10946*61046927SAndroid Build Coastguard Worker 		return functor_(
10947*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
10948*61046927SAndroid Build Coastguard Worker 			arg0,
10949*61046927SAndroid Build Coastguard Worker 			arg1,
10950*61046927SAndroid Build Coastguard Worker 			arg2,
10951*61046927SAndroid Build Coastguard Worker 			arg3,
10952*61046927SAndroid Build Coastguard Worker 			arg4,
10953*61046927SAndroid Build Coastguard Worker 			arg5,
10954*61046927SAndroid Build Coastguard Worker 			arg6,
10955*61046927SAndroid Build Coastguard Worker 			arg7,
10956*61046927SAndroid Build Coastguard Worker 			arg8,
10957*61046927SAndroid Build Coastguard Worker 			arg9,
10958*61046927SAndroid Build Coastguard Worker 			arg10,
10959*61046927SAndroid Build Coastguard Worker 			arg11,
10960*61046927SAndroid Build Coastguard Worker 			arg12,
10961*61046927SAndroid Build Coastguard Worker 			arg13,
10962*61046927SAndroid Build Coastguard Worker 			arg14);
10963*61046927SAndroid Build Coastguard Worker 	}
10964*61046927SAndroid Build Coastguard Worker 
10965*61046927SAndroid Build Coastguard Worker 
10966*61046927SAndroid Build Coastguard Worker };
10967*61046927SAndroid Build Coastguard Worker 
10968*61046927SAndroid Build Coastguard Worker template<
10969*61046927SAndroid Build Coastguard Worker 	typename T0,
10970*61046927SAndroid Build Coastguard Worker 	typename T1,
10971*61046927SAndroid Build Coastguard Worker 	typename T2,
10972*61046927SAndroid Build Coastguard Worker 	typename T3,
10973*61046927SAndroid Build Coastguard Worker 	typename T4,
10974*61046927SAndroid Build Coastguard Worker 	typename T5,
10975*61046927SAndroid Build Coastguard Worker 	typename T6,
10976*61046927SAndroid Build Coastguard Worker 	typename T7,
10977*61046927SAndroid Build Coastguard Worker 	typename T8,
10978*61046927SAndroid Build Coastguard Worker 	typename T9,
10979*61046927SAndroid Build Coastguard Worker 	typename T10,
10980*61046927SAndroid Build Coastguard Worker 	typename T11,
10981*61046927SAndroid Build Coastguard Worker 	typename T12,
10982*61046927SAndroid Build Coastguard Worker 	typename T13>
10983*61046927SAndroid Build Coastguard Worker struct functionImplementation_
10984*61046927SAndroid Build Coastguard Worker <	T0,
10985*61046927SAndroid Build Coastguard Worker 	T1,
10986*61046927SAndroid Build Coastguard Worker 	T2,
10987*61046927SAndroid Build Coastguard Worker 	T3,
10988*61046927SAndroid Build Coastguard Worker 	T4,
10989*61046927SAndroid Build Coastguard Worker 	T5,
10990*61046927SAndroid Build Coastguard Worker 	T6,
10991*61046927SAndroid Build Coastguard Worker 	T7,
10992*61046927SAndroid Build Coastguard Worker 	T8,
10993*61046927SAndroid Build Coastguard Worker 	T9,
10994*61046927SAndroid Build Coastguard Worker 	T10,
10995*61046927SAndroid Build Coastguard Worker 	T11,
10996*61046927SAndroid Build Coastguard Worker 	T12,
10997*61046927SAndroid Build Coastguard Worker 	T13,
10998*61046927SAndroid Build Coastguard Worker 	NullType,
10999*61046927SAndroid Build Coastguard Worker 	NullType,
11000*61046927SAndroid Build Coastguard Worker 	NullType,
11001*61046927SAndroid Build Coastguard Worker 	NullType,
11002*61046927SAndroid Build Coastguard Worker 	NullType,
11003*61046927SAndroid Build Coastguard Worker 	NullType,
11004*61046927SAndroid Build Coastguard Worker 	NullType,
11005*61046927SAndroid Build Coastguard Worker 	NullType,
11006*61046927SAndroid Build Coastguard Worker 	NullType,
11007*61046927SAndroid Build Coastguard Worker 	NullType,
11008*61046927SAndroid Build Coastguard Worker 	NullType,
11009*61046927SAndroid Build Coastguard Worker 	NullType,
11010*61046927SAndroid Build Coastguard Worker 	NullType,
11011*61046927SAndroid Build Coastguard Worker 	NullType,
11012*61046927SAndroid Build Coastguard Worker 	NullType,
11013*61046927SAndroid Build Coastguard Worker 	NullType,
11014*61046927SAndroid Build Coastguard Worker 	NullType,
11015*61046927SAndroid Build Coastguard Worker 	NullType>
11016*61046927SAndroid Build Coastguard Worker {
11017*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11018*61046927SAndroid Build Coastguard Worker 		T0,
11019*61046927SAndroid Build Coastguard Worker 		T1,
11020*61046927SAndroid Build Coastguard Worker 		T2,
11021*61046927SAndroid Build Coastguard Worker 		T3,
11022*61046927SAndroid Build Coastguard Worker 		T4,
11023*61046927SAndroid Build Coastguard Worker 		T5,
11024*61046927SAndroid Build Coastguard Worker 		T6,
11025*61046927SAndroid Build Coastguard Worker 		T7,
11026*61046927SAndroid Build Coastguard Worker 		T8,
11027*61046927SAndroid Build Coastguard Worker 		T9,
11028*61046927SAndroid Build Coastguard Worker 		T10,
11029*61046927SAndroid Build Coastguard Worker 		T11,
11030*61046927SAndroid Build Coastguard Worker 		T12,
11031*61046927SAndroid Build Coastguard Worker 		T13,
11032*61046927SAndroid Build Coastguard Worker 		NullType,
11033*61046927SAndroid Build Coastguard Worker 		NullType,
11034*61046927SAndroid Build Coastguard Worker 		NullType,
11035*61046927SAndroid Build Coastguard Worker 		NullType,
11036*61046927SAndroid Build Coastguard Worker 		NullType,
11037*61046927SAndroid Build Coastguard Worker 		NullType,
11038*61046927SAndroid Build Coastguard Worker 		NullType,
11039*61046927SAndroid Build Coastguard Worker 		NullType,
11040*61046927SAndroid Build Coastguard Worker 		NullType,
11041*61046927SAndroid Build Coastguard Worker 		NullType,
11042*61046927SAndroid Build Coastguard Worker 		NullType,
11043*61046927SAndroid Build Coastguard Worker 		NullType,
11044*61046927SAndroid Build Coastguard Worker 		NullType,
11045*61046927SAndroid Build Coastguard Worker 		NullType,
11046*61046927SAndroid Build Coastguard Worker 		NullType,
11047*61046927SAndroid Build Coastguard Worker 		NullType,
11048*61046927SAndroid Build Coastguard Worker 		NullType,
11049*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11050*61046927SAndroid Build Coastguard Worker 
11051*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11052*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11053*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11054*61046927SAndroid Build Coastguard Worker         functor_(functor)
11055*61046927SAndroid Build Coastguard Worker     {
11056*61046927SAndroid Build Coastguard Worker 
11057*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14))
11058*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11059*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11060*61046927SAndroid Build Coastguard Worker         #endif
11061*61046927SAndroid Build Coastguard Worker 
11062*61046927SAndroid Build Coastguard Worker     }
11063*61046927SAndroid Build Coastguard Worker 
11064*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11065*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11066*61046927SAndroid Build Coastguard Worker 
11067*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11068*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11069*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11070*61046927SAndroid Build Coastguard Worker 		T0,
11071*61046927SAndroid Build Coastguard Worker 		T1,
11072*61046927SAndroid Build Coastguard Worker 		T2,
11073*61046927SAndroid Build Coastguard Worker 		T3,
11074*61046927SAndroid Build Coastguard Worker 		T4,
11075*61046927SAndroid Build Coastguard Worker 		T5,
11076*61046927SAndroid Build Coastguard Worker 		T6,
11077*61046927SAndroid Build Coastguard Worker 		T7,
11078*61046927SAndroid Build Coastguard Worker 		T8,
11079*61046927SAndroid Build Coastguard Worker 		T9,
11080*61046927SAndroid Build Coastguard Worker 		T10,
11081*61046927SAndroid Build Coastguard Worker 		T11,
11082*61046927SAndroid Build Coastguard Worker 		T12,
11083*61046927SAndroid Build Coastguard Worker 		T13);
11084*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11085*61046927SAndroid Build Coastguard Worker 	Event operator()(
11086*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11087*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11088*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11089*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11090*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11091*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11092*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11093*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11094*61046927SAndroid Build Coastguard Worker 		T7 arg7,
11095*61046927SAndroid Build Coastguard Worker 		T8 arg8,
11096*61046927SAndroid Build Coastguard Worker 		T9 arg9,
11097*61046927SAndroid Build Coastguard Worker 		T10 arg10,
11098*61046927SAndroid Build Coastguard Worker 		T11 arg11,
11099*61046927SAndroid Build Coastguard Worker 		T12 arg12,
11100*61046927SAndroid Build Coastguard Worker 		T13 arg13)
11101*61046927SAndroid Build Coastguard Worker 	{
11102*61046927SAndroid Build Coastguard Worker 		return functor_(
11103*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11104*61046927SAndroid Build Coastguard Worker 			arg0,
11105*61046927SAndroid Build Coastguard Worker 			arg1,
11106*61046927SAndroid Build Coastguard Worker 			arg2,
11107*61046927SAndroid Build Coastguard Worker 			arg3,
11108*61046927SAndroid Build Coastguard Worker 			arg4,
11109*61046927SAndroid Build Coastguard Worker 			arg5,
11110*61046927SAndroid Build Coastguard Worker 			arg6,
11111*61046927SAndroid Build Coastguard Worker 			arg7,
11112*61046927SAndroid Build Coastguard Worker 			arg8,
11113*61046927SAndroid Build Coastguard Worker 			arg9,
11114*61046927SAndroid Build Coastguard Worker 			arg10,
11115*61046927SAndroid Build Coastguard Worker 			arg11,
11116*61046927SAndroid Build Coastguard Worker 			arg12,
11117*61046927SAndroid Build Coastguard Worker 			arg13);
11118*61046927SAndroid Build Coastguard Worker 	}
11119*61046927SAndroid Build Coastguard Worker 
11120*61046927SAndroid Build Coastguard Worker 
11121*61046927SAndroid Build Coastguard Worker };
11122*61046927SAndroid Build Coastguard Worker 
11123*61046927SAndroid Build Coastguard Worker template<
11124*61046927SAndroid Build Coastguard Worker 	typename T0,
11125*61046927SAndroid Build Coastguard Worker 	typename T1,
11126*61046927SAndroid Build Coastguard Worker 	typename T2,
11127*61046927SAndroid Build Coastguard Worker 	typename T3,
11128*61046927SAndroid Build Coastguard Worker 	typename T4,
11129*61046927SAndroid Build Coastguard Worker 	typename T5,
11130*61046927SAndroid Build Coastguard Worker 	typename T6,
11131*61046927SAndroid Build Coastguard Worker 	typename T7,
11132*61046927SAndroid Build Coastguard Worker 	typename T8,
11133*61046927SAndroid Build Coastguard Worker 	typename T9,
11134*61046927SAndroid Build Coastguard Worker 	typename T10,
11135*61046927SAndroid Build Coastguard Worker 	typename T11,
11136*61046927SAndroid Build Coastguard Worker 	typename T12>
11137*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11138*61046927SAndroid Build Coastguard Worker <	T0,
11139*61046927SAndroid Build Coastguard Worker 	T1,
11140*61046927SAndroid Build Coastguard Worker 	T2,
11141*61046927SAndroid Build Coastguard Worker 	T3,
11142*61046927SAndroid Build Coastguard Worker 	T4,
11143*61046927SAndroid Build Coastguard Worker 	T5,
11144*61046927SAndroid Build Coastguard Worker 	T6,
11145*61046927SAndroid Build Coastguard Worker 	T7,
11146*61046927SAndroid Build Coastguard Worker 	T8,
11147*61046927SAndroid Build Coastguard Worker 	T9,
11148*61046927SAndroid Build Coastguard Worker 	T10,
11149*61046927SAndroid Build Coastguard Worker 	T11,
11150*61046927SAndroid Build Coastguard Worker 	T12,
11151*61046927SAndroid Build Coastguard Worker 	NullType,
11152*61046927SAndroid Build Coastguard Worker 	NullType,
11153*61046927SAndroid Build Coastguard Worker 	NullType,
11154*61046927SAndroid Build Coastguard Worker 	NullType,
11155*61046927SAndroid Build Coastguard Worker 	NullType,
11156*61046927SAndroid Build Coastguard Worker 	NullType,
11157*61046927SAndroid Build Coastguard Worker 	NullType,
11158*61046927SAndroid Build Coastguard Worker 	NullType,
11159*61046927SAndroid Build Coastguard Worker 	NullType,
11160*61046927SAndroid Build Coastguard Worker 	NullType,
11161*61046927SAndroid Build Coastguard Worker 	NullType,
11162*61046927SAndroid Build Coastguard Worker 	NullType,
11163*61046927SAndroid Build Coastguard Worker 	NullType,
11164*61046927SAndroid Build Coastguard Worker 	NullType,
11165*61046927SAndroid Build Coastguard Worker 	NullType,
11166*61046927SAndroid Build Coastguard Worker 	NullType,
11167*61046927SAndroid Build Coastguard Worker 	NullType,
11168*61046927SAndroid Build Coastguard Worker 	NullType,
11169*61046927SAndroid Build Coastguard Worker 	NullType>
11170*61046927SAndroid Build Coastguard Worker {
11171*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11172*61046927SAndroid Build Coastguard Worker 		T0,
11173*61046927SAndroid Build Coastguard Worker 		T1,
11174*61046927SAndroid Build Coastguard Worker 		T2,
11175*61046927SAndroid Build Coastguard Worker 		T3,
11176*61046927SAndroid Build Coastguard Worker 		T4,
11177*61046927SAndroid Build Coastguard Worker 		T5,
11178*61046927SAndroid Build Coastguard Worker 		T6,
11179*61046927SAndroid Build Coastguard Worker 		T7,
11180*61046927SAndroid Build Coastguard Worker 		T8,
11181*61046927SAndroid Build Coastguard Worker 		T9,
11182*61046927SAndroid Build Coastguard Worker 		T10,
11183*61046927SAndroid Build Coastguard Worker 		T11,
11184*61046927SAndroid Build Coastguard Worker 		T12,
11185*61046927SAndroid Build Coastguard Worker 		NullType,
11186*61046927SAndroid Build Coastguard Worker 		NullType,
11187*61046927SAndroid Build Coastguard Worker 		NullType,
11188*61046927SAndroid Build Coastguard Worker 		NullType,
11189*61046927SAndroid Build Coastguard Worker 		NullType,
11190*61046927SAndroid Build Coastguard Worker 		NullType,
11191*61046927SAndroid Build Coastguard Worker 		NullType,
11192*61046927SAndroid Build Coastguard Worker 		NullType,
11193*61046927SAndroid Build Coastguard Worker 		NullType,
11194*61046927SAndroid Build Coastguard Worker 		NullType,
11195*61046927SAndroid Build Coastguard Worker 		NullType,
11196*61046927SAndroid Build Coastguard Worker 		NullType,
11197*61046927SAndroid Build Coastguard Worker 		NullType,
11198*61046927SAndroid Build Coastguard Worker 		NullType,
11199*61046927SAndroid Build Coastguard Worker 		NullType,
11200*61046927SAndroid Build Coastguard Worker 		NullType,
11201*61046927SAndroid Build Coastguard Worker 		NullType,
11202*61046927SAndroid Build Coastguard Worker 		NullType,
11203*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11204*61046927SAndroid Build Coastguard Worker 
11205*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11206*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11207*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11208*61046927SAndroid Build Coastguard Worker         functor_(functor)
11209*61046927SAndroid Build Coastguard Worker     {
11210*61046927SAndroid Build Coastguard Worker 
11211*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13))
11212*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11213*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11214*61046927SAndroid Build Coastguard Worker         #endif
11215*61046927SAndroid Build Coastguard Worker 
11216*61046927SAndroid Build Coastguard Worker     }
11217*61046927SAndroid Build Coastguard Worker 
11218*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11219*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11220*61046927SAndroid Build Coastguard Worker 
11221*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11222*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11223*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11224*61046927SAndroid Build Coastguard Worker 		T0,
11225*61046927SAndroid Build Coastguard Worker 		T1,
11226*61046927SAndroid Build Coastguard Worker 		T2,
11227*61046927SAndroid Build Coastguard Worker 		T3,
11228*61046927SAndroid Build Coastguard Worker 		T4,
11229*61046927SAndroid Build Coastguard Worker 		T5,
11230*61046927SAndroid Build Coastguard Worker 		T6,
11231*61046927SAndroid Build Coastguard Worker 		T7,
11232*61046927SAndroid Build Coastguard Worker 		T8,
11233*61046927SAndroid Build Coastguard Worker 		T9,
11234*61046927SAndroid Build Coastguard Worker 		T10,
11235*61046927SAndroid Build Coastguard Worker 		T11,
11236*61046927SAndroid Build Coastguard Worker 		T12);
11237*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11238*61046927SAndroid Build Coastguard Worker 	Event operator()(
11239*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11240*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11241*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11242*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11243*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11244*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11245*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11246*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11247*61046927SAndroid Build Coastguard Worker 		T7 arg7,
11248*61046927SAndroid Build Coastguard Worker 		T8 arg8,
11249*61046927SAndroid Build Coastguard Worker 		T9 arg9,
11250*61046927SAndroid Build Coastguard Worker 		T10 arg10,
11251*61046927SAndroid Build Coastguard Worker 		T11 arg11,
11252*61046927SAndroid Build Coastguard Worker 		T12 arg12)
11253*61046927SAndroid Build Coastguard Worker 	{
11254*61046927SAndroid Build Coastguard Worker 		return functor_(
11255*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11256*61046927SAndroid Build Coastguard Worker 			arg0,
11257*61046927SAndroid Build Coastguard Worker 			arg1,
11258*61046927SAndroid Build Coastguard Worker 			arg2,
11259*61046927SAndroid Build Coastguard Worker 			arg3,
11260*61046927SAndroid Build Coastguard Worker 			arg4,
11261*61046927SAndroid Build Coastguard Worker 			arg5,
11262*61046927SAndroid Build Coastguard Worker 			arg6,
11263*61046927SAndroid Build Coastguard Worker 			arg7,
11264*61046927SAndroid Build Coastguard Worker 			arg8,
11265*61046927SAndroid Build Coastguard Worker 			arg9,
11266*61046927SAndroid Build Coastguard Worker 			arg10,
11267*61046927SAndroid Build Coastguard Worker 			arg11,
11268*61046927SAndroid Build Coastguard Worker 			arg12);
11269*61046927SAndroid Build Coastguard Worker 	}
11270*61046927SAndroid Build Coastguard Worker 
11271*61046927SAndroid Build Coastguard Worker 
11272*61046927SAndroid Build Coastguard Worker };
11273*61046927SAndroid Build Coastguard Worker 
11274*61046927SAndroid Build Coastguard Worker template<
11275*61046927SAndroid Build Coastguard Worker 	typename T0,
11276*61046927SAndroid Build Coastguard Worker 	typename T1,
11277*61046927SAndroid Build Coastguard Worker 	typename T2,
11278*61046927SAndroid Build Coastguard Worker 	typename T3,
11279*61046927SAndroid Build Coastguard Worker 	typename T4,
11280*61046927SAndroid Build Coastguard Worker 	typename T5,
11281*61046927SAndroid Build Coastguard Worker 	typename T6,
11282*61046927SAndroid Build Coastguard Worker 	typename T7,
11283*61046927SAndroid Build Coastguard Worker 	typename T8,
11284*61046927SAndroid Build Coastguard Worker 	typename T9,
11285*61046927SAndroid Build Coastguard Worker 	typename T10,
11286*61046927SAndroid Build Coastguard Worker 	typename T11>
11287*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11288*61046927SAndroid Build Coastguard Worker <	T0,
11289*61046927SAndroid Build Coastguard Worker 	T1,
11290*61046927SAndroid Build Coastguard Worker 	T2,
11291*61046927SAndroid Build Coastguard Worker 	T3,
11292*61046927SAndroid Build Coastguard Worker 	T4,
11293*61046927SAndroid Build Coastguard Worker 	T5,
11294*61046927SAndroid Build Coastguard Worker 	T6,
11295*61046927SAndroid Build Coastguard Worker 	T7,
11296*61046927SAndroid Build Coastguard Worker 	T8,
11297*61046927SAndroid Build Coastguard Worker 	T9,
11298*61046927SAndroid Build Coastguard Worker 	T10,
11299*61046927SAndroid Build Coastguard Worker 	T11,
11300*61046927SAndroid Build Coastguard Worker 	NullType,
11301*61046927SAndroid Build Coastguard Worker 	NullType,
11302*61046927SAndroid Build Coastguard Worker 	NullType,
11303*61046927SAndroid Build Coastguard Worker 	NullType,
11304*61046927SAndroid Build Coastguard Worker 	NullType,
11305*61046927SAndroid Build Coastguard Worker 	NullType,
11306*61046927SAndroid Build Coastguard Worker 	NullType,
11307*61046927SAndroid Build Coastguard Worker 	NullType,
11308*61046927SAndroid Build Coastguard Worker 	NullType,
11309*61046927SAndroid Build Coastguard Worker 	NullType,
11310*61046927SAndroid Build Coastguard Worker 	NullType,
11311*61046927SAndroid Build Coastguard Worker 	NullType,
11312*61046927SAndroid Build Coastguard Worker 	NullType,
11313*61046927SAndroid Build Coastguard Worker 	NullType,
11314*61046927SAndroid Build Coastguard Worker 	NullType,
11315*61046927SAndroid Build Coastguard Worker 	NullType,
11316*61046927SAndroid Build Coastguard Worker 	NullType,
11317*61046927SAndroid Build Coastguard Worker 	NullType,
11318*61046927SAndroid Build Coastguard Worker 	NullType,
11319*61046927SAndroid Build Coastguard Worker 	NullType>
11320*61046927SAndroid Build Coastguard Worker {
11321*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11322*61046927SAndroid Build Coastguard Worker 		T0,
11323*61046927SAndroid Build Coastguard Worker 		T1,
11324*61046927SAndroid Build Coastguard Worker 		T2,
11325*61046927SAndroid Build Coastguard Worker 		T3,
11326*61046927SAndroid Build Coastguard Worker 		T4,
11327*61046927SAndroid Build Coastguard Worker 		T5,
11328*61046927SAndroid Build Coastguard Worker 		T6,
11329*61046927SAndroid Build Coastguard Worker 		T7,
11330*61046927SAndroid Build Coastguard Worker 		T8,
11331*61046927SAndroid Build Coastguard Worker 		T9,
11332*61046927SAndroid Build Coastguard Worker 		T10,
11333*61046927SAndroid Build Coastguard Worker 		T11,
11334*61046927SAndroid Build Coastguard Worker 		NullType,
11335*61046927SAndroid Build Coastguard Worker 		NullType,
11336*61046927SAndroid Build Coastguard Worker 		NullType,
11337*61046927SAndroid Build Coastguard Worker 		NullType,
11338*61046927SAndroid Build Coastguard Worker 		NullType,
11339*61046927SAndroid Build Coastguard Worker 		NullType,
11340*61046927SAndroid Build Coastguard Worker 		NullType,
11341*61046927SAndroid Build Coastguard Worker 		NullType,
11342*61046927SAndroid Build Coastguard Worker 		NullType,
11343*61046927SAndroid Build Coastguard Worker 		NullType,
11344*61046927SAndroid Build Coastguard Worker 		NullType,
11345*61046927SAndroid Build Coastguard Worker 		NullType,
11346*61046927SAndroid Build Coastguard Worker 		NullType,
11347*61046927SAndroid Build Coastguard Worker 		NullType,
11348*61046927SAndroid Build Coastguard Worker 		NullType,
11349*61046927SAndroid Build Coastguard Worker 		NullType,
11350*61046927SAndroid Build Coastguard Worker 		NullType,
11351*61046927SAndroid Build Coastguard Worker 		NullType,
11352*61046927SAndroid Build Coastguard Worker 		NullType,
11353*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11354*61046927SAndroid Build Coastguard Worker 
11355*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11356*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11357*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11358*61046927SAndroid Build Coastguard Worker         functor_(functor)
11359*61046927SAndroid Build Coastguard Worker     {
11360*61046927SAndroid Build Coastguard Worker 
11361*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12))
11362*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11363*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11364*61046927SAndroid Build Coastguard Worker         #endif
11365*61046927SAndroid Build Coastguard Worker 
11366*61046927SAndroid Build Coastguard Worker     }
11367*61046927SAndroid Build Coastguard Worker 
11368*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11369*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11370*61046927SAndroid Build Coastguard Worker 
11371*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11372*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11373*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11374*61046927SAndroid Build Coastguard Worker 		T0,
11375*61046927SAndroid Build Coastguard Worker 		T1,
11376*61046927SAndroid Build Coastguard Worker 		T2,
11377*61046927SAndroid Build Coastguard Worker 		T3,
11378*61046927SAndroid Build Coastguard Worker 		T4,
11379*61046927SAndroid Build Coastguard Worker 		T5,
11380*61046927SAndroid Build Coastguard Worker 		T6,
11381*61046927SAndroid Build Coastguard Worker 		T7,
11382*61046927SAndroid Build Coastguard Worker 		T8,
11383*61046927SAndroid Build Coastguard Worker 		T9,
11384*61046927SAndroid Build Coastguard Worker 		T10,
11385*61046927SAndroid Build Coastguard Worker 		T11);
11386*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11387*61046927SAndroid Build Coastguard Worker 	Event operator()(
11388*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11389*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11390*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11391*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11392*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11393*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11394*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11395*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11396*61046927SAndroid Build Coastguard Worker 		T7 arg7,
11397*61046927SAndroid Build Coastguard Worker 		T8 arg8,
11398*61046927SAndroid Build Coastguard Worker 		T9 arg9,
11399*61046927SAndroid Build Coastguard Worker 		T10 arg10,
11400*61046927SAndroid Build Coastguard Worker 		T11 arg11)
11401*61046927SAndroid Build Coastguard Worker 	{
11402*61046927SAndroid Build Coastguard Worker 		return functor_(
11403*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11404*61046927SAndroid Build Coastguard Worker 			arg0,
11405*61046927SAndroid Build Coastguard Worker 			arg1,
11406*61046927SAndroid Build Coastguard Worker 			arg2,
11407*61046927SAndroid Build Coastguard Worker 			arg3,
11408*61046927SAndroid Build Coastguard Worker 			arg4,
11409*61046927SAndroid Build Coastguard Worker 			arg5,
11410*61046927SAndroid Build Coastguard Worker 			arg6,
11411*61046927SAndroid Build Coastguard Worker 			arg7,
11412*61046927SAndroid Build Coastguard Worker 			arg8,
11413*61046927SAndroid Build Coastguard Worker 			arg9,
11414*61046927SAndroid Build Coastguard Worker 			arg10,
11415*61046927SAndroid Build Coastguard Worker 			arg11);
11416*61046927SAndroid Build Coastguard Worker 	}
11417*61046927SAndroid Build Coastguard Worker 
11418*61046927SAndroid Build Coastguard Worker 
11419*61046927SAndroid Build Coastguard Worker };
11420*61046927SAndroid Build Coastguard Worker 
11421*61046927SAndroid Build Coastguard Worker template<
11422*61046927SAndroid Build Coastguard Worker 	typename T0,
11423*61046927SAndroid Build Coastguard Worker 	typename T1,
11424*61046927SAndroid Build Coastguard Worker 	typename T2,
11425*61046927SAndroid Build Coastguard Worker 	typename T3,
11426*61046927SAndroid Build Coastguard Worker 	typename T4,
11427*61046927SAndroid Build Coastguard Worker 	typename T5,
11428*61046927SAndroid Build Coastguard Worker 	typename T6,
11429*61046927SAndroid Build Coastguard Worker 	typename T7,
11430*61046927SAndroid Build Coastguard Worker 	typename T8,
11431*61046927SAndroid Build Coastguard Worker 	typename T9,
11432*61046927SAndroid Build Coastguard Worker 	typename T10>
11433*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11434*61046927SAndroid Build Coastguard Worker <	T0,
11435*61046927SAndroid Build Coastguard Worker 	T1,
11436*61046927SAndroid Build Coastguard Worker 	T2,
11437*61046927SAndroid Build Coastguard Worker 	T3,
11438*61046927SAndroid Build Coastguard Worker 	T4,
11439*61046927SAndroid Build Coastguard Worker 	T5,
11440*61046927SAndroid Build Coastguard Worker 	T6,
11441*61046927SAndroid Build Coastguard Worker 	T7,
11442*61046927SAndroid Build Coastguard Worker 	T8,
11443*61046927SAndroid Build Coastguard Worker 	T9,
11444*61046927SAndroid Build Coastguard Worker 	T10,
11445*61046927SAndroid Build Coastguard Worker 	NullType,
11446*61046927SAndroid Build Coastguard Worker 	NullType,
11447*61046927SAndroid Build Coastguard Worker 	NullType,
11448*61046927SAndroid Build Coastguard Worker 	NullType,
11449*61046927SAndroid Build Coastguard Worker 	NullType,
11450*61046927SAndroid Build Coastguard Worker 	NullType,
11451*61046927SAndroid Build Coastguard Worker 	NullType,
11452*61046927SAndroid Build Coastguard Worker 	NullType,
11453*61046927SAndroid Build Coastguard Worker 	NullType,
11454*61046927SAndroid Build Coastguard Worker 	NullType,
11455*61046927SAndroid Build Coastguard Worker 	NullType,
11456*61046927SAndroid Build Coastguard Worker 	NullType,
11457*61046927SAndroid Build Coastguard Worker 	NullType,
11458*61046927SAndroid Build Coastguard Worker 	NullType,
11459*61046927SAndroid Build Coastguard Worker 	NullType,
11460*61046927SAndroid Build Coastguard Worker 	NullType,
11461*61046927SAndroid Build Coastguard Worker 	NullType,
11462*61046927SAndroid Build Coastguard Worker 	NullType,
11463*61046927SAndroid Build Coastguard Worker 	NullType,
11464*61046927SAndroid Build Coastguard Worker 	NullType,
11465*61046927SAndroid Build Coastguard Worker 	NullType>
11466*61046927SAndroid Build Coastguard Worker {
11467*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11468*61046927SAndroid Build Coastguard Worker 		T0,
11469*61046927SAndroid Build Coastguard Worker 		T1,
11470*61046927SAndroid Build Coastguard Worker 		T2,
11471*61046927SAndroid Build Coastguard Worker 		T3,
11472*61046927SAndroid Build Coastguard Worker 		T4,
11473*61046927SAndroid Build Coastguard Worker 		T5,
11474*61046927SAndroid Build Coastguard Worker 		T6,
11475*61046927SAndroid Build Coastguard Worker 		T7,
11476*61046927SAndroid Build Coastguard Worker 		T8,
11477*61046927SAndroid Build Coastguard Worker 		T9,
11478*61046927SAndroid Build Coastguard Worker 		T10,
11479*61046927SAndroid Build Coastguard Worker 		NullType,
11480*61046927SAndroid Build Coastguard Worker 		NullType,
11481*61046927SAndroid Build Coastguard Worker 		NullType,
11482*61046927SAndroid Build Coastguard Worker 		NullType,
11483*61046927SAndroid Build Coastguard Worker 		NullType,
11484*61046927SAndroid Build Coastguard Worker 		NullType,
11485*61046927SAndroid Build Coastguard Worker 		NullType,
11486*61046927SAndroid Build Coastguard Worker 		NullType,
11487*61046927SAndroid Build Coastguard Worker 		NullType,
11488*61046927SAndroid Build Coastguard Worker 		NullType,
11489*61046927SAndroid Build Coastguard Worker 		NullType,
11490*61046927SAndroid Build Coastguard Worker 		NullType,
11491*61046927SAndroid Build Coastguard Worker 		NullType,
11492*61046927SAndroid Build Coastguard Worker 		NullType,
11493*61046927SAndroid Build Coastguard Worker 		NullType,
11494*61046927SAndroid Build Coastguard Worker 		NullType,
11495*61046927SAndroid Build Coastguard Worker 		NullType,
11496*61046927SAndroid Build Coastguard Worker 		NullType,
11497*61046927SAndroid Build Coastguard Worker 		NullType,
11498*61046927SAndroid Build Coastguard Worker 		NullType,
11499*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11500*61046927SAndroid Build Coastguard Worker 
11501*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11502*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11503*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11504*61046927SAndroid Build Coastguard Worker         functor_(functor)
11505*61046927SAndroid Build Coastguard Worker     {
11506*61046927SAndroid Build Coastguard Worker 
11507*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11))
11508*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11509*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11510*61046927SAndroid Build Coastguard Worker         #endif
11511*61046927SAndroid Build Coastguard Worker 
11512*61046927SAndroid Build Coastguard Worker     }
11513*61046927SAndroid Build Coastguard Worker 
11514*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11515*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11516*61046927SAndroid Build Coastguard Worker 
11517*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11518*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11519*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11520*61046927SAndroid Build Coastguard Worker 		T0,
11521*61046927SAndroid Build Coastguard Worker 		T1,
11522*61046927SAndroid Build Coastguard Worker 		T2,
11523*61046927SAndroid Build Coastguard Worker 		T3,
11524*61046927SAndroid Build Coastguard Worker 		T4,
11525*61046927SAndroid Build Coastguard Worker 		T5,
11526*61046927SAndroid Build Coastguard Worker 		T6,
11527*61046927SAndroid Build Coastguard Worker 		T7,
11528*61046927SAndroid Build Coastguard Worker 		T8,
11529*61046927SAndroid Build Coastguard Worker 		T9,
11530*61046927SAndroid Build Coastguard Worker 		T10);
11531*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11532*61046927SAndroid Build Coastguard Worker 	Event operator()(
11533*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11534*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11535*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11536*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11537*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11538*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11539*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11540*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11541*61046927SAndroid Build Coastguard Worker 		T7 arg7,
11542*61046927SAndroid Build Coastguard Worker 		T8 arg8,
11543*61046927SAndroid Build Coastguard Worker 		T9 arg9,
11544*61046927SAndroid Build Coastguard Worker 		T10 arg10)
11545*61046927SAndroid Build Coastguard Worker 	{
11546*61046927SAndroid Build Coastguard Worker 		return functor_(
11547*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11548*61046927SAndroid Build Coastguard Worker 			arg0,
11549*61046927SAndroid Build Coastguard Worker 			arg1,
11550*61046927SAndroid Build Coastguard Worker 			arg2,
11551*61046927SAndroid Build Coastguard Worker 			arg3,
11552*61046927SAndroid Build Coastguard Worker 			arg4,
11553*61046927SAndroid Build Coastguard Worker 			arg5,
11554*61046927SAndroid Build Coastguard Worker 			arg6,
11555*61046927SAndroid Build Coastguard Worker 			arg7,
11556*61046927SAndroid Build Coastguard Worker 			arg8,
11557*61046927SAndroid Build Coastguard Worker 			arg9,
11558*61046927SAndroid Build Coastguard Worker 			arg10);
11559*61046927SAndroid Build Coastguard Worker 	}
11560*61046927SAndroid Build Coastguard Worker 
11561*61046927SAndroid Build Coastguard Worker 
11562*61046927SAndroid Build Coastguard Worker };
11563*61046927SAndroid Build Coastguard Worker 
11564*61046927SAndroid Build Coastguard Worker template<
11565*61046927SAndroid Build Coastguard Worker 	typename T0,
11566*61046927SAndroid Build Coastguard Worker 	typename T1,
11567*61046927SAndroid Build Coastguard Worker 	typename T2,
11568*61046927SAndroid Build Coastguard Worker 	typename T3,
11569*61046927SAndroid Build Coastguard Worker 	typename T4,
11570*61046927SAndroid Build Coastguard Worker 	typename T5,
11571*61046927SAndroid Build Coastguard Worker 	typename T6,
11572*61046927SAndroid Build Coastguard Worker 	typename T7,
11573*61046927SAndroid Build Coastguard Worker 	typename T8,
11574*61046927SAndroid Build Coastguard Worker 	typename T9>
11575*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11576*61046927SAndroid Build Coastguard Worker <	T0,
11577*61046927SAndroid Build Coastguard Worker 	T1,
11578*61046927SAndroid Build Coastguard Worker 	T2,
11579*61046927SAndroid Build Coastguard Worker 	T3,
11580*61046927SAndroid Build Coastguard Worker 	T4,
11581*61046927SAndroid Build Coastguard Worker 	T5,
11582*61046927SAndroid Build Coastguard Worker 	T6,
11583*61046927SAndroid Build Coastguard Worker 	T7,
11584*61046927SAndroid Build Coastguard Worker 	T8,
11585*61046927SAndroid Build Coastguard Worker 	T9,
11586*61046927SAndroid Build Coastguard Worker 	NullType,
11587*61046927SAndroid Build Coastguard Worker 	NullType,
11588*61046927SAndroid Build Coastguard Worker 	NullType,
11589*61046927SAndroid Build Coastguard Worker 	NullType,
11590*61046927SAndroid Build Coastguard Worker 	NullType,
11591*61046927SAndroid Build Coastguard Worker 	NullType,
11592*61046927SAndroid Build Coastguard Worker 	NullType,
11593*61046927SAndroid Build Coastguard Worker 	NullType,
11594*61046927SAndroid Build Coastguard Worker 	NullType,
11595*61046927SAndroid Build Coastguard Worker 	NullType,
11596*61046927SAndroid Build Coastguard Worker 	NullType,
11597*61046927SAndroid Build Coastguard Worker 	NullType,
11598*61046927SAndroid Build Coastguard Worker 	NullType,
11599*61046927SAndroid Build Coastguard Worker 	NullType,
11600*61046927SAndroid Build Coastguard Worker 	NullType,
11601*61046927SAndroid Build Coastguard Worker 	NullType,
11602*61046927SAndroid Build Coastguard Worker 	NullType,
11603*61046927SAndroid Build Coastguard Worker 	NullType,
11604*61046927SAndroid Build Coastguard Worker 	NullType,
11605*61046927SAndroid Build Coastguard Worker 	NullType,
11606*61046927SAndroid Build Coastguard Worker 	NullType,
11607*61046927SAndroid Build Coastguard Worker 	NullType>
11608*61046927SAndroid Build Coastguard Worker {
11609*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11610*61046927SAndroid Build Coastguard Worker 		T0,
11611*61046927SAndroid Build Coastguard Worker 		T1,
11612*61046927SAndroid Build Coastguard Worker 		T2,
11613*61046927SAndroid Build Coastguard Worker 		T3,
11614*61046927SAndroid Build Coastguard Worker 		T4,
11615*61046927SAndroid Build Coastguard Worker 		T5,
11616*61046927SAndroid Build Coastguard Worker 		T6,
11617*61046927SAndroid Build Coastguard Worker 		T7,
11618*61046927SAndroid Build Coastguard Worker 		T8,
11619*61046927SAndroid Build Coastguard Worker 		T9,
11620*61046927SAndroid Build Coastguard Worker 		NullType,
11621*61046927SAndroid Build Coastguard Worker 		NullType,
11622*61046927SAndroid Build Coastguard Worker 		NullType,
11623*61046927SAndroid Build Coastguard Worker 		NullType,
11624*61046927SAndroid Build Coastguard Worker 		NullType,
11625*61046927SAndroid Build Coastguard Worker 		NullType,
11626*61046927SAndroid Build Coastguard Worker 		NullType,
11627*61046927SAndroid Build Coastguard Worker 		NullType,
11628*61046927SAndroid Build Coastguard Worker 		NullType,
11629*61046927SAndroid Build Coastguard Worker 		NullType,
11630*61046927SAndroid Build Coastguard Worker 		NullType,
11631*61046927SAndroid Build Coastguard Worker 		NullType,
11632*61046927SAndroid Build Coastguard Worker 		NullType,
11633*61046927SAndroid Build Coastguard Worker 		NullType,
11634*61046927SAndroid Build Coastguard Worker 		NullType,
11635*61046927SAndroid Build Coastguard Worker 		NullType,
11636*61046927SAndroid Build Coastguard Worker 		NullType,
11637*61046927SAndroid Build Coastguard Worker 		NullType,
11638*61046927SAndroid Build Coastguard Worker 		NullType,
11639*61046927SAndroid Build Coastguard Worker 		NullType,
11640*61046927SAndroid Build Coastguard Worker 		NullType,
11641*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11642*61046927SAndroid Build Coastguard Worker 
11643*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11644*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11645*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11646*61046927SAndroid Build Coastguard Worker         functor_(functor)
11647*61046927SAndroid Build Coastguard Worker     {
11648*61046927SAndroid Build Coastguard Worker 
11649*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10))
11650*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11651*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11652*61046927SAndroid Build Coastguard Worker         #endif
11653*61046927SAndroid Build Coastguard Worker 
11654*61046927SAndroid Build Coastguard Worker     }
11655*61046927SAndroid Build Coastguard Worker 
11656*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11657*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11658*61046927SAndroid Build Coastguard Worker 
11659*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11660*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11661*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11662*61046927SAndroid Build Coastguard Worker 		T0,
11663*61046927SAndroid Build Coastguard Worker 		T1,
11664*61046927SAndroid Build Coastguard Worker 		T2,
11665*61046927SAndroid Build Coastguard Worker 		T3,
11666*61046927SAndroid Build Coastguard Worker 		T4,
11667*61046927SAndroid Build Coastguard Worker 		T5,
11668*61046927SAndroid Build Coastguard Worker 		T6,
11669*61046927SAndroid Build Coastguard Worker 		T7,
11670*61046927SAndroid Build Coastguard Worker 		T8,
11671*61046927SAndroid Build Coastguard Worker 		T9);
11672*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11673*61046927SAndroid Build Coastguard Worker 	Event operator()(
11674*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11675*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11676*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11677*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11678*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11679*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11680*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11681*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11682*61046927SAndroid Build Coastguard Worker 		T7 arg7,
11683*61046927SAndroid Build Coastguard Worker 		T8 arg8,
11684*61046927SAndroid Build Coastguard Worker 		T9 arg9)
11685*61046927SAndroid Build Coastguard Worker 	{
11686*61046927SAndroid Build Coastguard Worker 		return functor_(
11687*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11688*61046927SAndroid Build Coastguard Worker 			arg0,
11689*61046927SAndroid Build Coastguard Worker 			arg1,
11690*61046927SAndroid Build Coastguard Worker 			arg2,
11691*61046927SAndroid Build Coastguard Worker 			arg3,
11692*61046927SAndroid Build Coastguard Worker 			arg4,
11693*61046927SAndroid Build Coastguard Worker 			arg5,
11694*61046927SAndroid Build Coastguard Worker 			arg6,
11695*61046927SAndroid Build Coastguard Worker 			arg7,
11696*61046927SAndroid Build Coastguard Worker 			arg8,
11697*61046927SAndroid Build Coastguard Worker 			arg9);
11698*61046927SAndroid Build Coastguard Worker 	}
11699*61046927SAndroid Build Coastguard Worker 
11700*61046927SAndroid Build Coastguard Worker 
11701*61046927SAndroid Build Coastguard Worker };
11702*61046927SAndroid Build Coastguard Worker 
11703*61046927SAndroid Build Coastguard Worker template<
11704*61046927SAndroid Build Coastguard Worker 	typename T0,
11705*61046927SAndroid Build Coastguard Worker 	typename T1,
11706*61046927SAndroid Build Coastguard Worker 	typename T2,
11707*61046927SAndroid Build Coastguard Worker 	typename T3,
11708*61046927SAndroid Build Coastguard Worker 	typename T4,
11709*61046927SAndroid Build Coastguard Worker 	typename T5,
11710*61046927SAndroid Build Coastguard Worker 	typename T6,
11711*61046927SAndroid Build Coastguard Worker 	typename T7,
11712*61046927SAndroid Build Coastguard Worker 	typename T8>
11713*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11714*61046927SAndroid Build Coastguard Worker <	T0,
11715*61046927SAndroid Build Coastguard Worker 	T1,
11716*61046927SAndroid Build Coastguard Worker 	T2,
11717*61046927SAndroid Build Coastguard Worker 	T3,
11718*61046927SAndroid Build Coastguard Worker 	T4,
11719*61046927SAndroid Build Coastguard Worker 	T5,
11720*61046927SAndroid Build Coastguard Worker 	T6,
11721*61046927SAndroid Build Coastguard Worker 	T7,
11722*61046927SAndroid Build Coastguard Worker 	T8,
11723*61046927SAndroid Build Coastguard Worker 	NullType,
11724*61046927SAndroid Build Coastguard Worker 	NullType,
11725*61046927SAndroid Build Coastguard Worker 	NullType,
11726*61046927SAndroid Build Coastguard Worker 	NullType,
11727*61046927SAndroid Build Coastguard Worker 	NullType,
11728*61046927SAndroid Build Coastguard Worker 	NullType,
11729*61046927SAndroid Build Coastguard Worker 	NullType,
11730*61046927SAndroid Build Coastguard Worker 	NullType,
11731*61046927SAndroid Build Coastguard Worker 	NullType,
11732*61046927SAndroid Build Coastguard Worker 	NullType,
11733*61046927SAndroid Build Coastguard Worker 	NullType,
11734*61046927SAndroid Build Coastguard Worker 	NullType,
11735*61046927SAndroid Build Coastguard Worker 	NullType,
11736*61046927SAndroid Build Coastguard Worker 	NullType,
11737*61046927SAndroid Build Coastguard Worker 	NullType,
11738*61046927SAndroid Build Coastguard Worker 	NullType,
11739*61046927SAndroid Build Coastguard Worker 	NullType,
11740*61046927SAndroid Build Coastguard Worker 	NullType,
11741*61046927SAndroid Build Coastguard Worker 	NullType,
11742*61046927SAndroid Build Coastguard Worker 	NullType,
11743*61046927SAndroid Build Coastguard Worker 	NullType,
11744*61046927SAndroid Build Coastguard Worker 	NullType,
11745*61046927SAndroid Build Coastguard Worker 	NullType>
11746*61046927SAndroid Build Coastguard Worker {
11747*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11748*61046927SAndroid Build Coastguard Worker 		T0,
11749*61046927SAndroid Build Coastguard Worker 		T1,
11750*61046927SAndroid Build Coastguard Worker 		T2,
11751*61046927SAndroid Build Coastguard Worker 		T3,
11752*61046927SAndroid Build Coastguard Worker 		T4,
11753*61046927SAndroid Build Coastguard Worker 		T5,
11754*61046927SAndroid Build Coastguard Worker 		T6,
11755*61046927SAndroid Build Coastguard Worker 		T7,
11756*61046927SAndroid Build Coastguard Worker 		T8,
11757*61046927SAndroid Build Coastguard Worker 		NullType,
11758*61046927SAndroid Build Coastguard Worker 		NullType,
11759*61046927SAndroid Build Coastguard Worker 		NullType,
11760*61046927SAndroid Build Coastguard Worker 		NullType,
11761*61046927SAndroid Build Coastguard Worker 		NullType,
11762*61046927SAndroid Build Coastguard Worker 		NullType,
11763*61046927SAndroid Build Coastguard Worker 		NullType,
11764*61046927SAndroid Build Coastguard Worker 		NullType,
11765*61046927SAndroid Build Coastguard Worker 		NullType,
11766*61046927SAndroid Build Coastguard Worker 		NullType,
11767*61046927SAndroid Build Coastguard Worker 		NullType,
11768*61046927SAndroid Build Coastguard Worker 		NullType,
11769*61046927SAndroid Build Coastguard Worker 		NullType,
11770*61046927SAndroid Build Coastguard Worker 		NullType,
11771*61046927SAndroid Build Coastguard Worker 		NullType,
11772*61046927SAndroid Build Coastguard Worker 		NullType,
11773*61046927SAndroid Build Coastguard Worker 		NullType,
11774*61046927SAndroid Build Coastguard Worker 		NullType,
11775*61046927SAndroid Build Coastguard Worker 		NullType,
11776*61046927SAndroid Build Coastguard Worker 		NullType,
11777*61046927SAndroid Build Coastguard Worker 		NullType,
11778*61046927SAndroid Build Coastguard Worker 		NullType,
11779*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11780*61046927SAndroid Build Coastguard Worker 
11781*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11782*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11783*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11784*61046927SAndroid Build Coastguard Worker         functor_(functor)
11785*61046927SAndroid Build Coastguard Worker     {
11786*61046927SAndroid Build Coastguard Worker 
11787*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9))
11788*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11789*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11790*61046927SAndroid Build Coastguard Worker         #endif
11791*61046927SAndroid Build Coastguard Worker 
11792*61046927SAndroid Build Coastguard Worker     }
11793*61046927SAndroid Build Coastguard Worker 
11794*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11795*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11796*61046927SAndroid Build Coastguard Worker 
11797*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11798*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11799*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11800*61046927SAndroid Build Coastguard Worker 		T0,
11801*61046927SAndroid Build Coastguard Worker 		T1,
11802*61046927SAndroid Build Coastguard Worker 		T2,
11803*61046927SAndroid Build Coastguard Worker 		T3,
11804*61046927SAndroid Build Coastguard Worker 		T4,
11805*61046927SAndroid Build Coastguard Worker 		T5,
11806*61046927SAndroid Build Coastguard Worker 		T6,
11807*61046927SAndroid Build Coastguard Worker 		T7,
11808*61046927SAndroid Build Coastguard Worker 		T8);
11809*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11810*61046927SAndroid Build Coastguard Worker 	Event operator()(
11811*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11812*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11813*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11814*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11815*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11816*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11817*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11818*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11819*61046927SAndroid Build Coastguard Worker 		T7 arg7,
11820*61046927SAndroid Build Coastguard Worker 		T8 arg8)
11821*61046927SAndroid Build Coastguard Worker 	{
11822*61046927SAndroid Build Coastguard Worker 		return functor_(
11823*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11824*61046927SAndroid Build Coastguard Worker 			arg0,
11825*61046927SAndroid Build Coastguard Worker 			arg1,
11826*61046927SAndroid Build Coastguard Worker 			arg2,
11827*61046927SAndroid Build Coastguard Worker 			arg3,
11828*61046927SAndroid Build Coastguard Worker 			arg4,
11829*61046927SAndroid Build Coastguard Worker 			arg5,
11830*61046927SAndroid Build Coastguard Worker 			arg6,
11831*61046927SAndroid Build Coastguard Worker 			arg7,
11832*61046927SAndroid Build Coastguard Worker 			arg8);
11833*61046927SAndroid Build Coastguard Worker 	}
11834*61046927SAndroid Build Coastguard Worker 
11835*61046927SAndroid Build Coastguard Worker 
11836*61046927SAndroid Build Coastguard Worker };
11837*61046927SAndroid Build Coastguard Worker 
11838*61046927SAndroid Build Coastguard Worker template<
11839*61046927SAndroid Build Coastguard Worker 	typename T0,
11840*61046927SAndroid Build Coastguard Worker 	typename T1,
11841*61046927SAndroid Build Coastguard Worker 	typename T2,
11842*61046927SAndroid Build Coastguard Worker 	typename T3,
11843*61046927SAndroid Build Coastguard Worker 	typename T4,
11844*61046927SAndroid Build Coastguard Worker 	typename T5,
11845*61046927SAndroid Build Coastguard Worker 	typename T6,
11846*61046927SAndroid Build Coastguard Worker 	typename T7>
11847*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11848*61046927SAndroid Build Coastguard Worker <	T0,
11849*61046927SAndroid Build Coastguard Worker 	T1,
11850*61046927SAndroid Build Coastguard Worker 	T2,
11851*61046927SAndroid Build Coastguard Worker 	T3,
11852*61046927SAndroid Build Coastguard Worker 	T4,
11853*61046927SAndroid Build Coastguard Worker 	T5,
11854*61046927SAndroid Build Coastguard Worker 	T6,
11855*61046927SAndroid Build Coastguard Worker 	T7,
11856*61046927SAndroid Build Coastguard Worker 	NullType,
11857*61046927SAndroid Build Coastguard Worker 	NullType,
11858*61046927SAndroid Build Coastguard Worker 	NullType,
11859*61046927SAndroid Build Coastguard Worker 	NullType,
11860*61046927SAndroid Build Coastguard Worker 	NullType,
11861*61046927SAndroid Build Coastguard Worker 	NullType,
11862*61046927SAndroid Build Coastguard Worker 	NullType,
11863*61046927SAndroid Build Coastguard Worker 	NullType,
11864*61046927SAndroid Build Coastguard Worker 	NullType,
11865*61046927SAndroid Build Coastguard Worker 	NullType,
11866*61046927SAndroid Build Coastguard Worker 	NullType,
11867*61046927SAndroid Build Coastguard Worker 	NullType,
11868*61046927SAndroid Build Coastguard Worker 	NullType,
11869*61046927SAndroid Build Coastguard Worker 	NullType,
11870*61046927SAndroid Build Coastguard Worker 	NullType,
11871*61046927SAndroid Build Coastguard Worker 	NullType,
11872*61046927SAndroid Build Coastguard Worker 	NullType,
11873*61046927SAndroid Build Coastguard Worker 	NullType,
11874*61046927SAndroid Build Coastguard Worker 	NullType,
11875*61046927SAndroid Build Coastguard Worker 	NullType,
11876*61046927SAndroid Build Coastguard Worker 	NullType,
11877*61046927SAndroid Build Coastguard Worker 	NullType,
11878*61046927SAndroid Build Coastguard Worker 	NullType,
11879*61046927SAndroid Build Coastguard Worker 	NullType>
11880*61046927SAndroid Build Coastguard Worker {
11881*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
11882*61046927SAndroid Build Coastguard Worker 		T0,
11883*61046927SAndroid Build Coastguard Worker 		T1,
11884*61046927SAndroid Build Coastguard Worker 		T2,
11885*61046927SAndroid Build Coastguard Worker 		T3,
11886*61046927SAndroid Build Coastguard Worker 		T4,
11887*61046927SAndroid Build Coastguard Worker 		T5,
11888*61046927SAndroid Build Coastguard Worker 		T6,
11889*61046927SAndroid Build Coastguard Worker 		T7,
11890*61046927SAndroid Build Coastguard Worker 		NullType,
11891*61046927SAndroid Build Coastguard Worker 		NullType,
11892*61046927SAndroid Build Coastguard Worker 		NullType,
11893*61046927SAndroid Build Coastguard Worker 		NullType,
11894*61046927SAndroid Build Coastguard Worker 		NullType,
11895*61046927SAndroid Build Coastguard Worker 		NullType,
11896*61046927SAndroid Build Coastguard Worker 		NullType,
11897*61046927SAndroid Build Coastguard Worker 		NullType,
11898*61046927SAndroid Build Coastguard Worker 		NullType,
11899*61046927SAndroid Build Coastguard Worker 		NullType,
11900*61046927SAndroid Build Coastguard Worker 		NullType,
11901*61046927SAndroid Build Coastguard Worker 		NullType,
11902*61046927SAndroid Build Coastguard Worker 		NullType,
11903*61046927SAndroid Build Coastguard Worker 		NullType,
11904*61046927SAndroid Build Coastguard Worker 		NullType,
11905*61046927SAndroid Build Coastguard Worker 		NullType,
11906*61046927SAndroid Build Coastguard Worker 		NullType,
11907*61046927SAndroid Build Coastguard Worker 		NullType,
11908*61046927SAndroid Build Coastguard Worker 		NullType,
11909*61046927SAndroid Build Coastguard Worker 		NullType,
11910*61046927SAndroid Build Coastguard Worker 		NullType,
11911*61046927SAndroid Build Coastguard Worker 		NullType,
11912*61046927SAndroid Build Coastguard Worker 		NullType,
11913*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
11914*61046927SAndroid Build Coastguard Worker 
11915*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
11916*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_11917*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
11918*61046927SAndroid Build Coastguard Worker         functor_(functor)
11919*61046927SAndroid Build Coastguard Worker     {
11920*61046927SAndroid Build Coastguard Worker 
11921*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8))
11922*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
11923*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11924*61046927SAndroid Build Coastguard Worker         #endif
11925*61046927SAndroid Build Coastguard Worker 
11926*61046927SAndroid Build Coastguard Worker     }
11927*61046927SAndroid Build Coastguard Worker 
11928*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
11929*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
11930*61046927SAndroid Build Coastguard Worker 
11931*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
11932*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
11933*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
11934*61046927SAndroid Build Coastguard Worker 		T0,
11935*61046927SAndroid Build Coastguard Worker 		T1,
11936*61046927SAndroid Build Coastguard Worker 		T2,
11937*61046927SAndroid Build Coastguard Worker 		T3,
11938*61046927SAndroid Build Coastguard Worker 		T4,
11939*61046927SAndroid Build Coastguard Worker 		T5,
11940*61046927SAndroid Build Coastguard Worker 		T6,
11941*61046927SAndroid Build Coastguard Worker 		T7);
11942*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_11943*61046927SAndroid Build Coastguard Worker 	Event operator()(
11944*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
11945*61046927SAndroid Build Coastguard Worker 		T0 arg0,
11946*61046927SAndroid Build Coastguard Worker 		T1 arg1,
11947*61046927SAndroid Build Coastguard Worker 		T2 arg2,
11948*61046927SAndroid Build Coastguard Worker 		T3 arg3,
11949*61046927SAndroid Build Coastguard Worker 		T4 arg4,
11950*61046927SAndroid Build Coastguard Worker 		T5 arg5,
11951*61046927SAndroid Build Coastguard Worker 		T6 arg6,
11952*61046927SAndroid Build Coastguard Worker 		T7 arg7)
11953*61046927SAndroid Build Coastguard Worker 	{
11954*61046927SAndroid Build Coastguard Worker 		return functor_(
11955*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
11956*61046927SAndroid Build Coastguard Worker 			arg0,
11957*61046927SAndroid Build Coastguard Worker 			arg1,
11958*61046927SAndroid Build Coastguard Worker 			arg2,
11959*61046927SAndroid Build Coastguard Worker 			arg3,
11960*61046927SAndroid Build Coastguard Worker 			arg4,
11961*61046927SAndroid Build Coastguard Worker 			arg5,
11962*61046927SAndroid Build Coastguard Worker 			arg6,
11963*61046927SAndroid Build Coastguard Worker 			arg7);
11964*61046927SAndroid Build Coastguard Worker 	}
11965*61046927SAndroid Build Coastguard Worker 
11966*61046927SAndroid Build Coastguard Worker 
11967*61046927SAndroid Build Coastguard Worker };
11968*61046927SAndroid Build Coastguard Worker 
11969*61046927SAndroid Build Coastguard Worker template<
11970*61046927SAndroid Build Coastguard Worker 	typename T0,
11971*61046927SAndroid Build Coastguard Worker 	typename T1,
11972*61046927SAndroid Build Coastguard Worker 	typename T2,
11973*61046927SAndroid Build Coastguard Worker 	typename T3,
11974*61046927SAndroid Build Coastguard Worker 	typename T4,
11975*61046927SAndroid Build Coastguard Worker 	typename T5,
11976*61046927SAndroid Build Coastguard Worker 	typename T6>
11977*61046927SAndroid Build Coastguard Worker struct functionImplementation_
11978*61046927SAndroid Build Coastguard Worker <	T0,
11979*61046927SAndroid Build Coastguard Worker 	T1,
11980*61046927SAndroid Build Coastguard Worker 	T2,
11981*61046927SAndroid Build Coastguard Worker 	T3,
11982*61046927SAndroid Build Coastguard Worker 	T4,
11983*61046927SAndroid Build Coastguard Worker 	T5,
11984*61046927SAndroid Build Coastguard Worker 	T6,
11985*61046927SAndroid Build Coastguard Worker 	NullType,
11986*61046927SAndroid Build Coastguard Worker 	NullType,
11987*61046927SAndroid Build Coastguard Worker 	NullType,
11988*61046927SAndroid Build Coastguard Worker 	NullType,
11989*61046927SAndroid Build Coastguard Worker 	NullType,
11990*61046927SAndroid Build Coastguard Worker 	NullType,
11991*61046927SAndroid Build Coastguard Worker 	NullType,
11992*61046927SAndroid Build Coastguard Worker 	NullType,
11993*61046927SAndroid Build Coastguard Worker 	NullType,
11994*61046927SAndroid Build Coastguard Worker 	NullType,
11995*61046927SAndroid Build Coastguard Worker 	NullType,
11996*61046927SAndroid Build Coastguard Worker 	NullType,
11997*61046927SAndroid Build Coastguard Worker 	NullType,
11998*61046927SAndroid Build Coastguard Worker 	NullType,
11999*61046927SAndroid Build Coastguard Worker 	NullType,
12000*61046927SAndroid Build Coastguard Worker 	NullType,
12001*61046927SAndroid Build Coastguard Worker 	NullType,
12002*61046927SAndroid Build Coastguard Worker 	NullType,
12003*61046927SAndroid Build Coastguard Worker 	NullType,
12004*61046927SAndroid Build Coastguard Worker 	NullType,
12005*61046927SAndroid Build Coastguard Worker 	NullType,
12006*61046927SAndroid Build Coastguard Worker 	NullType,
12007*61046927SAndroid Build Coastguard Worker 	NullType,
12008*61046927SAndroid Build Coastguard Worker 	NullType,
12009*61046927SAndroid Build Coastguard Worker 	NullType>
12010*61046927SAndroid Build Coastguard Worker {
12011*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12012*61046927SAndroid Build Coastguard Worker 		T0,
12013*61046927SAndroid Build Coastguard Worker 		T1,
12014*61046927SAndroid Build Coastguard Worker 		T2,
12015*61046927SAndroid Build Coastguard Worker 		T3,
12016*61046927SAndroid Build Coastguard Worker 		T4,
12017*61046927SAndroid Build Coastguard Worker 		T5,
12018*61046927SAndroid Build Coastguard Worker 		T6,
12019*61046927SAndroid Build Coastguard Worker 		NullType,
12020*61046927SAndroid Build Coastguard Worker 		NullType,
12021*61046927SAndroid Build Coastguard Worker 		NullType,
12022*61046927SAndroid Build Coastguard Worker 		NullType,
12023*61046927SAndroid Build Coastguard Worker 		NullType,
12024*61046927SAndroid Build Coastguard Worker 		NullType,
12025*61046927SAndroid Build Coastguard Worker 		NullType,
12026*61046927SAndroid Build Coastguard Worker 		NullType,
12027*61046927SAndroid Build Coastguard Worker 		NullType,
12028*61046927SAndroid Build Coastguard Worker 		NullType,
12029*61046927SAndroid Build Coastguard Worker 		NullType,
12030*61046927SAndroid Build Coastguard Worker 		NullType,
12031*61046927SAndroid Build Coastguard Worker 		NullType,
12032*61046927SAndroid Build Coastguard Worker 		NullType,
12033*61046927SAndroid Build Coastguard Worker 		NullType,
12034*61046927SAndroid Build Coastguard Worker 		NullType,
12035*61046927SAndroid Build Coastguard Worker 		NullType,
12036*61046927SAndroid Build Coastguard Worker 		NullType,
12037*61046927SAndroid Build Coastguard Worker 		NullType,
12038*61046927SAndroid Build Coastguard Worker 		NullType,
12039*61046927SAndroid Build Coastguard Worker 		NullType,
12040*61046927SAndroid Build Coastguard Worker 		NullType,
12041*61046927SAndroid Build Coastguard Worker 		NullType,
12042*61046927SAndroid Build Coastguard Worker 		NullType,
12043*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12044*61046927SAndroid Build Coastguard Worker 
12045*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12046*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12047*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12048*61046927SAndroid Build Coastguard Worker         functor_(functor)
12049*61046927SAndroid Build Coastguard Worker     {
12050*61046927SAndroid Build Coastguard Worker 
12051*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7))
12052*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12053*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12054*61046927SAndroid Build Coastguard Worker         #endif
12055*61046927SAndroid Build Coastguard Worker 
12056*61046927SAndroid Build Coastguard Worker     }
12057*61046927SAndroid Build Coastguard Worker 
12058*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12059*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12060*61046927SAndroid Build Coastguard Worker 
12061*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12062*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12063*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12064*61046927SAndroid Build Coastguard Worker 		T0,
12065*61046927SAndroid Build Coastguard Worker 		T1,
12066*61046927SAndroid Build Coastguard Worker 		T2,
12067*61046927SAndroid Build Coastguard Worker 		T3,
12068*61046927SAndroid Build Coastguard Worker 		T4,
12069*61046927SAndroid Build Coastguard Worker 		T5,
12070*61046927SAndroid Build Coastguard Worker 		T6);
12071*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12072*61046927SAndroid Build Coastguard Worker 	Event operator()(
12073*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12074*61046927SAndroid Build Coastguard Worker 		T0 arg0,
12075*61046927SAndroid Build Coastguard Worker 		T1 arg1,
12076*61046927SAndroid Build Coastguard Worker 		T2 arg2,
12077*61046927SAndroid Build Coastguard Worker 		T3 arg3,
12078*61046927SAndroid Build Coastguard Worker 		T4 arg4,
12079*61046927SAndroid Build Coastguard Worker 		T5 arg5,
12080*61046927SAndroid Build Coastguard Worker 		T6 arg6)
12081*61046927SAndroid Build Coastguard Worker 	{
12082*61046927SAndroid Build Coastguard Worker 		return functor_(
12083*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12084*61046927SAndroid Build Coastguard Worker 			arg0,
12085*61046927SAndroid Build Coastguard Worker 			arg1,
12086*61046927SAndroid Build Coastguard Worker 			arg2,
12087*61046927SAndroid Build Coastguard Worker 			arg3,
12088*61046927SAndroid Build Coastguard Worker 			arg4,
12089*61046927SAndroid Build Coastguard Worker 			arg5,
12090*61046927SAndroid Build Coastguard Worker 			arg6);
12091*61046927SAndroid Build Coastguard Worker 	}
12092*61046927SAndroid Build Coastguard Worker 
12093*61046927SAndroid Build Coastguard Worker 
12094*61046927SAndroid Build Coastguard Worker };
12095*61046927SAndroid Build Coastguard Worker 
12096*61046927SAndroid Build Coastguard Worker template<
12097*61046927SAndroid Build Coastguard Worker 	typename T0,
12098*61046927SAndroid Build Coastguard Worker 	typename T1,
12099*61046927SAndroid Build Coastguard Worker 	typename T2,
12100*61046927SAndroid Build Coastguard Worker 	typename T3,
12101*61046927SAndroid Build Coastguard Worker 	typename T4,
12102*61046927SAndroid Build Coastguard Worker 	typename T5>
12103*61046927SAndroid Build Coastguard Worker struct functionImplementation_
12104*61046927SAndroid Build Coastguard Worker <	T0,
12105*61046927SAndroid Build Coastguard Worker 	T1,
12106*61046927SAndroid Build Coastguard Worker 	T2,
12107*61046927SAndroid Build Coastguard Worker 	T3,
12108*61046927SAndroid Build Coastguard Worker 	T4,
12109*61046927SAndroid Build Coastguard Worker 	T5,
12110*61046927SAndroid Build Coastguard Worker 	NullType,
12111*61046927SAndroid Build Coastguard Worker 	NullType,
12112*61046927SAndroid Build Coastguard Worker 	NullType,
12113*61046927SAndroid Build Coastguard Worker 	NullType,
12114*61046927SAndroid Build Coastguard Worker 	NullType,
12115*61046927SAndroid Build Coastguard Worker 	NullType,
12116*61046927SAndroid Build Coastguard Worker 	NullType,
12117*61046927SAndroid Build Coastguard Worker 	NullType,
12118*61046927SAndroid Build Coastguard Worker 	NullType,
12119*61046927SAndroid Build Coastguard Worker 	NullType,
12120*61046927SAndroid Build Coastguard Worker 	NullType,
12121*61046927SAndroid Build Coastguard Worker 	NullType,
12122*61046927SAndroid Build Coastguard Worker 	NullType,
12123*61046927SAndroid Build Coastguard Worker 	NullType,
12124*61046927SAndroid Build Coastguard Worker 	NullType,
12125*61046927SAndroid Build Coastguard Worker 	NullType,
12126*61046927SAndroid Build Coastguard Worker 	NullType,
12127*61046927SAndroid Build Coastguard Worker 	NullType,
12128*61046927SAndroid Build Coastguard Worker 	NullType,
12129*61046927SAndroid Build Coastguard Worker 	NullType,
12130*61046927SAndroid Build Coastguard Worker 	NullType,
12131*61046927SAndroid Build Coastguard Worker 	NullType,
12132*61046927SAndroid Build Coastguard Worker 	NullType,
12133*61046927SAndroid Build Coastguard Worker 	NullType,
12134*61046927SAndroid Build Coastguard Worker 	NullType,
12135*61046927SAndroid Build Coastguard Worker 	NullType>
12136*61046927SAndroid Build Coastguard Worker {
12137*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12138*61046927SAndroid Build Coastguard Worker 		T0,
12139*61046927SAndroid Build Coastguard Worker 		T1,
12140*61046927SAndroid Build Coastguard Worker 		T2,
12141*61046927SAndroid Build Coastguard Worker 		T3,
12142*61046927SAndroid Build Coastguard Worker 		T4,
12143*61046927SAndroid Build Coastguard Worker 		T5,
12144*61046927SAndroid Build Coastguard Worker 		NullType,
12145*61046927SAndroid Build Coastguard Worker 		NullType,
12146*61046927SAndroid Build Coastguard Worker 		NullType,
12147*61046927SAndroid Build Coastguard Worker 		NullType,
12148*61046927SAndroid Build Coastguard Worker 		NullType,
12149*61046927SAndroid Build Coastguard Worker 		NullType,
12150*61046927SAndroid Build Coastguard Worker 		NullType,
12151*61046927SAndroid Build Coastguard Worker 		NullType,
12152*61046927SAndroid Build Coastguard Worker 		NullType,
12153*61046927SAndroid Build Coastguard Worker 		NullType,
12154*61046927SAndroid Build Coastguard Worker 		NullType,
12155*61046927SAndroid Build Coastguard Worker 		NullType,
12156*61046927SAndroid Build Coastguard Worker 		NullType,
12157*61046927SAndroid Build Coastguard Worker 		NullType,
12158*61046927SAndroid Build Coastguard Worker 		NullType,
12159*61046927SAndroid Build Coastguard Worker 		NullType,
12160*61046927SAndroid Build Coastguard Worker 		NullType,
12161*61046927SAndroid Build Coastguard Worker 		NullType,
12162*61046927SAndroid Build Coastguard Worker 		NullType,
12163*61046927SAndroid Build Coastguard Worker 		NullType,
12164*61046927SAndroid Build Coastguard Worker 		NullType,
12165*61046927SAndroid Build Coastguard Worker 		NullType,
12166*61046927SAndroid Build Coastguard Worker 		NullType,
12167*61046927SAndroid Build Coastguard Worker 		NullType,
12168*61046927SAndroid Build Coastguard Worker 		NullType,
12169*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12170*61046927SAndroid Build Coastguard Worker 
12171*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12172*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12173*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12174*61046927SAndroid Build Coastguard Worker         functor_(functor)
12175*61046927SAndroid Build Coastguard Worker     {
12176*61046927SAndroid Build Coastguard Worker 
12177*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6))
12178*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12179*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12180*61046927SAndroid Build Coastguard Worker         #endif
12181*61046927SAndroid Build Coastguard Worker 
12182*61046927SAndroid Build Coastguard Worker     }
12183*61046927SAndroid Build Coastguard Worker 
12184*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12185*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12186*61046927SAndroid Build Coastguard Worker 
12187*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12188*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12189*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12190*61046927SAndroid Build Coastguard Worker 		T0,
12191*61046927SAndroid Build Coastguard Worker 		T1,
12192*61046927SAndroid Build Coastguard Worker 		T2,
12193*61046927SAndroid Build Coastguard Worker 		T3,
12194*61046927SAndroid Build Coastguard Worker 		T4,
12195*61046927SAndroid Build Coastguard Worker 		T5);
12196*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12197*61046927SAndroid Build Coastguard Worker 	Event operator()(
12198*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12199*61046927SAndroid Build Coastguard Worker 		T0 arg0,
12200*61046927SAndroid Build Coastguard Worker 		T1 arg1,
12201*61046927SAndroid Build Coastguard Worker 		T2 arg2,
12202*61046927SAndroid Build Coastguard Worker 		T3 arg3,
12203*61046927SAndroid Build Coastguard Worker 		T4 arg4,
12204*61046927SAndroid Build Coastguard Worker 		T5 arg5)
12205*61046927SAndroid Build Coastguard Worker 	{
12206*61046927SAndroid Build Coastguard Worker 		return functor_(
12207*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12208*61046927SAndroid Build Coastguard Worker 			arg0,
12209*61046927SAndroid Build Coastguard Worker 			arg1,
12210*61046927SAndroid Build Coastguard Worker 			arg2,
12211*61046927SAndroid Build Coastguard Worker 			arg3,
12212*61046927SAndroid Build Coastguard Worker 			arg4,
12213*61046927SAndroid Build Coastguard Worker 			arg5);
12214*61046927SAndroid Build Coastguard Worker 	}
12215*61046927SAndroid Build Coastguard Worker 
12216*61046927SAndroid Build Coastguard Worker 
12217*61046927SAndroid Build Coastguard Worker };
12218*61046927SAndroid Build Coastguard Worker 
12219*61046927SAndroid Build Coastguard Worker template<
12220*61046927SAndroid Build Coastguard Worker 	typename T0,
12221*61046927SAndroid Build Coastguard Worker 	typename T1,
12222*61046927SAndroid Build Coastguard Worker 	typename T2,
12223*61046927SAndroid Build Coastguard Worker 	typename T3,
12224*61046927SAndroid Build Coastguard Worker 	typename T4>
12225*61046927SAndroid Build Coastguard Worker struct functionImplementation_
12226*61046927SAndroid Build Coastguard Worker <	T0,
12227*61046927SAndroid Build Coastguard Worker 	T1,
12228*61046927SAndroid Build Coastguard Worker 	T2,
12229*61046927SAndroid Build Coastguard Worker 	T3,
12230*61046927SAndroid Build Coastguard Worker 	T4,
12231*61046927SAndroid Build Coastguard Worker 	NullType,
12232*61046927SAndroid Build Coastguard Worker 	NullType,
12233*61046927SAndroid Build Coastguard Worker 	NullType,
12234*61046927SAndroid Build Coastguard Worker 	NullType,
12235*61046927SAndroid Build Coastguard Worker 	NullType,
12236*61046927SAndroid Build Coastguard Worker 	NullType,
12237*61046927SAndroid Build Coastguard Worker 	NullType,
12238*61046927SAndroid Build Coastguard Worker 	NullType,
12239*61046927SAndroid Build Coastguard Worker 	NullType,
12240*61046927SAndroid Build Coastguard Worker 	NullType,
12241*61046927SAndroid Build Coastguard Worker 	NullType,
12242*61046927SAndroid Build Coastguard Worker 	NullType,
12243*61046927SAndroid Build Coastguard Worker 	NullType,
12244*61046927SAndroid Build Coastguard Worker 	NullType,
12245*61046927SAndroid Build Coastguard Worker 	NullType,
12246*61046927SAndroid Build Coastguard Worker 	NullType,
12247*61046927SAndroid Build Coastguard Worker 	NullType,
12248*61046927SAndroid Build Coastguard Worker 	NullType,
12249*61046927SAndroid Build Coastguard Worker 	NullType,
12250*61046927SAndroid Build Coastguard Worker 	NullType,
12251*61046927SAndroid Build Coastguard Worker 	NullType,
12252*61046927SAndroid Build Coastguard Worker 	NullType,
12253*61046927SAndroid Build Coastguard Worker 	NullType,
12254*61046927SAndroid Build Coastguard Worker 	NullType,
12255*61046927SAndroid Build Coastguard Worker 	NullType,
12256*61046927SAndroid Build Coastguard Worker 	NullType,
12257*61046927SAndroid Build Coastguard Worker 	NullType>
12258*61046927SAndroid Build Coastguard Worker {
12259*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12260*61046927SAndroid Build Coastguard Worker 		T0,
12261*61046927SAndroid Build Coastguard Worker 		T1,
12262*61046927SAndroid Build Coastguard Worker 		T2,
12263*61046927SAndroid Build Coastguard Worker 		T3,
12264*61046927SAndroid Build Coastguard Worker 		T4,
12265*61046927SAndroid Build Coastguard Worker 		NullType,
12266*61046927SAndroid Build Coastguard Worker 		NullType,
12267*61046927SAndroid Build Coastguard Worker 		NullType,
12268*61046927SAndroid Build Coastguard Worker 		NullType,
12269*61046927SAndroid Build Coastguard Worker 		NullType,
12270*61046927SAndroid Build Coastguard Worker 		NullType,
12271*61046927SAndroid Build Coastguard Worker 		NullType,
12272*61046927SAndroid Build Coastguard Worker 		NullType,
12273*61046927SAndroid Build Coastguard Worker 		NullType,
12274*61046927SAndroid Build Coastguard Worker 		NullType,
12275*61046927SAndroid Build Coastguard Worker 		NullType,
12276*61046927SAndroid Build Coastguard Worker 		NullType,
12277*61046927SAndroid Build Coastguard Worker 		NullType,
12278*61046927SAndroid Build Coastguard Worker 		NullType,
12279*61046927SAndroid Build Coastguard Worker 		NullType,
12280*61046927SAndroid Build Coastguard Worker 		NullType,
12281*61046927SAndroid Build Coastguard Worker 		NullType,
12282*61046927SAndroid Build Coastguard Worker 		NullType,
12283*61046927SAndroid Build Coastguard Worker 		NullType,
12284*61046927SAndroid Build Coastguard Worker 		NullType,
12285*61046927SAndroid Build Coastguard Worker 		NullType,
12286*61046927SAndroid Build Coastguard Worker 		NullType,
12287*61046927SAndroid Build Coastguard Worker 		NullType,
12288*61046927SAndroid Build Coastguard Worker 		NullType,
12289*61046927SAndroid Build Coastguard Worker 		NullType,
12290*61046927SAndroid Build Coastguard Worker 		NullType,
12291*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12292*61046927SAndroid Build Coastguard Worker 
12293*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12294*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12295*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12296*61046927SAndroid Build Coastguard Worker         functor_(functor)
12297*61046927SAndroid Build Coastguard Worker     {
12298*61046927SAndroid Build Coastguard Worker 
12299*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5))
12300*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12301*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12302*61046927SAndroid Build Coastguard Worker         #endif
12303*61046927SAndroid Build Coastguard Worker 
12304*61046927SAndroid Build Coastguard Worker     }
12305*61046927SAndroid Build Coastguard Worker 
12306*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12307*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12308*61046927SAndroid Build Coastguard Worker 
12309*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12310*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12311*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12312*61046927SAndroid Build Coastguard Worker 		T0,
12313*61046927SAndroid Build Coastguard Worker 		T1,
12314*61046927SAndroid Build Coastguard Worker 		T2,
12315*61046927SAndroid Build Coastguard Worker 		T3,
12316*61046927SAndroid Build Coastguard Worker 		T4);
12317*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12318*61046927SAndroid Build Coastguard Worker 	Event operator()(
12319*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12320*61046927SAndroid Build Coastguard Worker 		T0 arg0,
12321*61046927SAndroid Build Coastguard Worker 		T1 arg1,
12322*61046927SAndroid Build Coastguard Worker 		T2 arg2,
12323*61046927SAndroid Build Coastguard Worker 		T3 arg3,
12324*61046927SAndroid Build Coastguard Worker 		T4 arg4)
12325*61046927SAndroid Build Coastguard Worker 	{
12326*61046927SAndroid Build Coastguard Worker 		return functor_(
12327*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12328*61046927SAndroid Build Coastguard Worker 			arg0,
12329*61046927SAndroid Build Coastguard Worker 			arg1,
12330*61046927SAndroid Build Coastguard Worker 			arg2,
12331*61046927SAndroid Build Coastguard Worker 			arg3,
12332*61046927SAndroid Build Coastguard Worker 			arg4);
12333*61046927SAndroid Build Coastguard Worker 	}
12334*61046927SAndroid Build Coastguard Worker 
12335*61046927SAndroid Build Coastguard Worker 
12336*61046927SAndroid Build Coastguard Worker };
12337*61046927SAndroid Build Coastguard Worker 
12338*61046927SAndroid Build Coastguard Worker template<
12339*61046927SAndroid Build Coastguard Worker 	typename T0,
12340*61046927SAndroid Build Coastguard Worker 	typename T1,
12341*61046927SAndroid Build Coastguard Worker 	typename T2,
12342*61046927SAndroid Build Coastguard Worker 	typename T3>
12343*61046927SAndroid Build Coastguard Worker struct functionImplementation_
12344*61046927SAndroid Build Coastguard Worker <	T0,
12345*61046927SAndroid Build Coastguard Worker 	T1,
12346*61046927SAndroid Build Coastguard Worker 	T2,
12347*61046927SAndroid Build Coastguard Worker 	T3,
12348*61046927SAndroid Build Coastguard Worker 	NullType,
12349*61046927SAndroid Build Coastguard Worker 	NullType,
12350*61046927SAndroid Build Coastguard Worker 	NullType,
12351*61046927SAndroid Build Coastguard Worker 	NullType,
12352*61046927SAndroid Build Coastguard Worker 	NullType,
12353*61046927SAndroid Build Coastguard Worker 	NullType,
12354*61046927SAndroid Build Coastguard Worker 	NullType,
12355*61046927SAndroid Build Coastguard Worker 	NullType,
12356*61046927SAndroid Build Coastguard Worker 	NullType,
12357*61046927SAndroid Build Coastguard Worker 	NullType,
12358*61046927SAndroid Build Coastguard Worker 	NullType,
12359*61046927SAndroid Build Coastguard Worker 	NullType,
12360*61046927SAndroid Build Coastguard Worker 	NullType,
12361*61046927SAndroid Build Coastguard Worker 	NullType,
12362*61046927SAndroid Build Coastguard Worker 	NullType,
12363*61046927SAndroid Build Coastguard Worker 	NullType,
12364*61046927SAndroid Build Coastguard Worker 	NullType,
12365*61046927SAndroid Build Coastguard Worker 	NullType,
12366*61046927SAndroid Build Coastguard Worker 	NullType,
12367*61046927SAndroid Build Coastguard Worker 	NullType,
12368*61046927SAndroid Build Coastguard Worker 	NullType,
12369*61046927SAndroid Build Coastguard Worker 	NullType,
12370*61046927SAndroid Build Coastguard Worker 	NullType,
12371*61046927SAndroid Build Coastguard Worker 	NullType,
12372*61046927SAndroid Build Coastguard Worker 	NullType,
12373*61046927SAndroid Build Coastguard Worker 	NullType,
12374*61046927SAndroid Build Coastguard Worker 	NullType,
12375*61046927SAndroid Build Coastguard Worker 	NullType>
12376*61046927SAndroid Build Coastguard Worker {
12377*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12378*61046927SAndroid Build Coastguard Worker 		T0,
12379*61046927SAndroid Build Coastguard Worker 		T1,
12380*61046927SAndroid Build Coastguard Worker 		T2,
12381*61046927SAndroid Build Coastguard Worker 		T3,
12382*61046927SAndroid Build Coastguard Worker 		NullType,
12383*61046927SAndroid Build Coastguard Worker 		NullType,
12384*61046927SAndroid Build Coastguard Worker 		NullType,
12385*61046927SAndroid Build Coastguard Worker 		NullType,
12386*61046927SAndroid Build Coastguard Worker 		NullType,
12387*61046927SAndroid Build Coastguard Worker 		NullType,
12388*61046927SAndroid Build Coastguard Worker 		NullType,
12389*61046927SAndroid Build Coastguard Worker 		NullType,
12390*61046927SAndroid Build Coastguard Worker 		NullType,
12391*61046927SAndroid Build Coastguard Worker 		NullType,
12392*61046927SAndroid Build Coastguard Worker 		NullType,
12393*61046927SAndroid Build Coastguard Worker 		NullType,
12394*61046927SAndroid Build Coastguard Worker 		NullType,
12395*61046927SAndroid Build Coastguard Worker 		NullType,
12396*61046927SAndroid Build Coastguard Worker 		NullType,
12397*61046927SAndroid Build Coastguard Worker 		NullType,
12398*61046927SAndroid Build Coastguard Worker 		NullType,
12399*61046927SAndroid Build Coastguard Worker 		NullType,
12400*61046927SAndroid Build Coastguard Worker 		NullType,
12401*61046927SAndroid Build Coastguard Worker 		NullType,
12402*61046927SAndroid Build Coastguard Worker 		NullType,
12403*61046927SAndroid Build Coastguard Worker 		NullType,
12404*61046927SAndroid Build Coastguard Worker 		NullType,
12405*61046927SAndroid Build Coastguard Worker 		NullType,
12406*61046927SAndroid Build Coastguard Worker 		NullType,
12407*61046927SAndroid Build Coastguard Worker 		NullType,
12408*61046927SAndroid Build Coastguard Worker 		NullType,
12409*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12410*61046927SAndroid Build Coastguard Worker 
12411*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12412*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12413*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12414*61046927SAndroid Build Coastguard Worker         functor_(functor)
12415*61046927SAndroid Build Coastguard Worker     {
12416*61046927SAndroid Build Coastguard Worker 
12417*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4))
12418*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12419*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12420*61046927SAndroid Build Coastguard Worker         #endif
12421*61046927SAndroid Build Coastguard Worker 
12422*61046927SAndroid Build Coastguard Worker     }
12423*61046927SAndroid Build Coastguard Worker 
12424*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12425*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12426*61046927SAndroid Build Coastguard Worker 
12427*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12428*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12429*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12430*61046927SAndroid Build Coastguard Worker 		T0,
12431*61046927SAndroid Build Coastguard Worker 		T1,
12432*61046927SAndroid Build Coastguard Worker 		T2,
12433*61046927SAndroid Build Coastguard Worker 		T3);
12434*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12435*61046927SAndroid Build Coastguard Worker 	Event operator()(
12436*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12437*61046927SAndroid Build Coastguard Worker 		T0 arg0,
12438*61046927SAndroid Build Coastguard Worker 		T1 arg1,
12439*61046927SAndroid Build Coastguard Worker 		T2 arg2,
12440*61046927SAndroid Build Coastguard Worker 		T3 arg3)
12441*61046927SAndroid Build Coastguard Worker 	{
12442*61046927SAndroid Build Coastguard Worker 		return functor_(
12443*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12444*61046927SAndroid Build Coastguard Worker 			arg0,
12445*61046927SAndroid Build Coastguard Worker 			arg1,
12446*61046927SAndroid Build Coastguard Worker 			arg2,
12447*61046927SAndroid Build Coastguard Worker 			arg3);
12448*61046927SAndroid Build Coastguard Worker 	}
12449*61046927SAndroid Build Coastguard Worker 
12450*61046927SAndroid Build Coastguard Worker 
12451*61046927SAndroid Build Coastguard Worker };
12452*61046927SAndroid Build Coastguard Worker 
12453*61046927SAndroid Build Coastguard Worker template<
12454*61046927SAndroid Build Coastguard Worker 	typename T0,
12455*61046927SAndroid Build Coastguard Worker 	typename T1,
12456*61046927SAndroid Build Coastguard Worker 	typename T2>
12457*61046927SAndroid Build Coastguard Worker struct functionImplementation_
12458*61046927SAndroid Build Coastguard Worker <	T0,
12459*61046927SAndroid Build Coastguard Worker 	T1,
12460*61046927SAndroid Build Coastguard Worker 	T2,
12461*61046927SAndroid Build Coastguard Worker 	NullType,
12462*61046927SAndroid Build Coastguard Worker 	NullType,
12463*61046927SAndroid Build Coastguard Worker 	NullType,
12464*61046927SAndroid Build Coastguard Worker 	NullType,
12465*61046927SAndroid Build Coastguard Worker 	NullType,
12466*61046927SAndroid Build Coastguard Worker 	NullType,
12467*61046927SAndroid Build Coastguard Worker 	NullType,
12468*61046927SAndroid Build Coastguard Worker 	NullType,
12469*61046927SAndroid Build Coastguard Worker 	NullType,
12470*61046927SAndroid Build Coastguard Worker 	NullType,
12471*61046927SAndroid Build Coastguard Worker 	NullType,
12472*61046927SAndroid Build Coastguard Worker 	NullType,
12473*61046927SAndroid Build Coastguard Worker 	NullType,
12474*61046927SAndroid Build Coastguard Worker 	NullType,
12475*61046927SAndroid Build Coastguard Worker 	NullType,
12476*61046927SAndroid Build Coastguard Worker 	NullType,
12477*61046927SAndroid Build Coastguard Worker 	NullType,
12478*61046927SAndroid Build Coastguard Worker 	NullType,
12479*61046927SAndroid Build Coastguard Worker 	NullType,
12480*61046927SAndroid Build Coastguard Worker 	NullType,
12481*61046927SAndroid Build Coastguard Worker 	NullType,
12482*61046927SAndroid Build Coastguard Worker 	NullType,
12483*61046927SAndroid Build Coastguard Worker 	NullType,
12484*61046927SAndroid Build Coastguard Worker 	NullType,
12485*61046927SAndroid Build Coastguard Worker 	NullType,
12486*61046927SAndroid Build Coastguard Worker 	NullType,
12487*61046927SAndroid Build Coastguard Worker 	NullType,
12488*61046927SAndroid Build Coastguard Worker 	NullType,
12489*61046927SAndroid Build Coastguard Worker 	NullType>
12490*61046927SAndroid Build Coastguard Worker {
12491*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12492*61046927SAndroid Build Coastguard Worker 		T0,
12493*61046927SAndroid Build Coastguard Worker 		T1,
12494*61046927SAndroid Build Coastguard Worker 		T2,
12495*61046927SAndroid Build Coastguard Worker 		NullType,
12496*61046927SAndroid Build Coastguard Worker 		NullType,
12497*61046927SAndroid Build Coastguard Worker 		NullType,
12498*61046927SAndroid Build Coastguard Worker 		NullType,
12499*61046927SAndroid Build Coastguard Worker 		NullType,
12500*61046927SAndroid Build Coastguard Worker 		NullType,
12501*61046927SAndroid Build Coastguard Worker 		NullType,
12502*61046927SAndroid Build Coastguard Worker 		NullType,
12503*61046927SAndroid Build Coastguard Worker 		NullType,
12504*61046927SAndroid Build Coastguard Worker 		NullType,
12505*61046927SAndroid Build Coastguard Worker 		NullType,
12506*61046927SAndroid Build Coastguard Worker 		NullType,
12507*61046927SAndroid Build Coastguard Worker 		NullType,
12508*61046927SAndroid Build Coastguard Worker 		NullType,
12509*61046927SAndroid Build Coastguard Worker 		NullType,
12510*61046927SAndroid Build Coastguard Worker 		NullType,
12511*61046927SAndroid Build Coastguard Worker 		NullType,
12512*61046927SAndroid Build Coastguard Worker 		NullType,
12513*61046927SAndroid Build Coastguard Worker 		NullType,
12514*61046927SAndroid Build Coastguard Worker 		NullType,
12515*61046927SAndroid Build Coastguard Worker 		NullType,
12516*61046927SAndroid Build Coastguard Worker 		NullType,
12517*61046927SAndroid Build Coastguard Worker 		NullType,
12518*61046927SAndroid Build Coastguard Worker 		NullType,
12519*61046927SAndroid Build Coastguard Worker 		NullType,
12520*61046927SAndroid Build Coastguard Worker 		NullType,
12521*61046927SAndroid Build Coastguard Worker 		NullType,
12522*61046927SAndroid Build Coastguard Worker 		NullType,
12523*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12524*61046927SAndroid Build Coastguard Worker 
12525*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12526*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12527*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12528*61046927SAndroid Build Coastguard Worker         functor_(functor)
12529*61046927SAndroid Build Coastguard Worker     {
12530*61046927SAndroid Build Coastguard Worker 
12531*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3))
12532*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12533*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12534*61046927SAndroid Build Coastguard Worker         #endif
12535*61046927SAndroid Build Coastguard Worker 
12536*61046927SAndroid Build Coastguard Worker     }
12537*61046927SAndroid Build Coastguard Worker 
12538*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12539*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12540*61046927SAndroid Build Coastguard Worker 
12541*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12542*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12543*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12544*61046927SAndroid Build Coastguard Worker 		T0,
12545*61046927SAndroid Build Coastguard Worker 		T1,
12546*61046927SAndroid Build Coastguard Worker 		T2);
12547*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12548*61046927SAndroid Build Coastguard Worker 	Event operator()(
12549*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12550*61046927SAndroid Build Coastguard Worker 		T0 arg0,
12551*61046927SAndroid Build Coastguard Worker 		T1 arg1,
12552*61046927SAndroid Build Coastguard Worker 		T2 arg2)
12553*61046927SAndroid Build Coastguard Worker 	{
12554*61046927SAndroid Build Coastguard Worker 		return functor_(
12555*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12556*61046927SAndroid Build Coastguard Worker 			arg0,
12557*61046927SAndroid Build Coastguard Worker 			arg1,
12558*61046927SAndroid Build Coastguard Worker 			arg2);
12559*61046927SAndroid Build Coastguard Worker 	}
12560*61046927SAndroid Build Coastguard Worker 
12561*61046927SAndroid Build Coastguard Worker 
12562*61046927SAndroid Build Coastguard Worker };
12563*61046927SAndroid Build Coastguard Worker 
12564*61046927SAndroid Build Coastguard Worker template<
12565*61046927SAndroid Build Coastguard Worker 	typename T0,
12566*61046927SAndroid Build Coastguard Worker 	typename T1>
12567*61046927SAndroid Build Coastguard Worker struct functionImplementation_
12568*61046927SAndroid Build Coastguard Worker <	T0,
12569*61046927SAndroid Build Coastguard Worker 	T1,
12570*61046927SAndroid Build Coastguard Worker 	NullType,
12571*61046927SAndroid Build Coastguard Worker 	NullType,
12572*61046927SAndroid Build Coastguard Worker 	NullType,
12573*61046927SAndroid Build Coastguard Worker 	NullType,
12574*61046927SAndroid Build Coastguard Worker 	NullType,
12575*61046927SAndroid Build Coastguard Worker 	NullType,
12576*61046927SAndroid Build Coastguard Worker 	NullType,
12577*61046927SAndroid Build Coastguard Worker 	NullType,
12578*61046927SAndroid Build Coastguard Worker 	NullType,
12579*61046927SAndroid Build Coastguard Worker 	NullType,
12580*61046927SAndroid Build Coastguard Worker 	NullType,
12581*61046927SAndroid Build Coastguard Worker 	NullType,
12582*61046927SAndroid Build Coastguard Worker 	NullType,
12583*61046927SAndroid Build Coastguard Worker 	NullType,
12584*61046927SAndroid Build Coastguard Worker 	NullType,
12585*61046927SAndroid Build Coastguard Worker 	NullType,
12586*61046927SAndroid Build Coastguard Worker 	NullType,
12587*61046927SAndroid Build Coastguard Worker 	NullType,
12588*61046927SAndroid Build Coastguard Worker 	NullType,
12589*61046927SAndroid Build Coastguard Worker 	NullType,
12590*61046927SAndroid Build Coastguard Worker 	NullType,
12591*61046927SAndroid Build Coastguard Worker 	NullType,
12592*61046927SAndroid Build Coastguard Worker 	NullType,
12593*61046927SAndroid Build Coastguard Worker 	NullType,
12594*61046927SAndroid Build Coastguard Worker 	NullType,
12595*61046927SAndroid Build Coastguard Worker 	NullType,
12596*61046927SAndroid Build Coastguard Worker 	NullType,
12597*61046927SAndroid Build Coastguard Worker 	NullType,
12598*61046927SAndroid Build Coastguard Worker 	NullType,
12599*61046927SAndroid Build Coastguard Worker 	NullType>
12600*61046927SAndroid Build Coastguard Worker {
12601*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12602*61046927SAndroid Build Coastguard Worker 		T0,
12603*61046927SAndroid Build Coastguard Worker 		T1,
12604*61046927SAndroid Build Coastguard Worker 		NullType,
12605*61046927SAndroid Build Coastguard Worker 		NullType,
12606*61046927SAndroid Build Coastguard Worker 		NullType,
12607*61046927SAndroid Build Coastguard Worker 		NullType,
12608*61046927SAndroid Build Coastguard Worker 		NullType,
12609*61046927SAndroid Build Coastguard Worker 		NullType,
12610*61046927SAndroid Build Coastguard Worker 		NullType,
12611*61046927SAndroid Build Coastguard Worker 		NullType,
12612*61046927SAndroid Build Coastguard Worker 		NullType,
12613*61046927SAndroid Build Coastguard Worker 		NullType,
12614*61046927SAndroid Build Coastguard Worker 		NullType,
12615*61046927SAndroid Build Coastguard Worker 		NullType,
12616*61046927SAndroid Build Coastguard Worker 		NullType,
12617*61046927SAndroid Build Coastguard Worker 		NullType,
12618*61046927SAndroid Build Coastguard Worker 		NullType,
12619*61046927SAndroid Build Coastguard Worker 		NullType,
12620*61046927SAndroid Build Coastguard Worker 		NullType,
12621*61046927SAndroid Build Coastguard Worker 		NullType,
12622*61046927SAndroid Build Coastguard Worker 		NullType,
12623*61046927SAndroid Build Coastguard Worker 		NullType,
12624*61046927SAndroid Build Coastguard Worker 		NullType,
12625*61046927SAndroid Build Coastguard Worker 		NullType,
12626*61046927SAndroid Build Coastguard Worker 		NullType,
12627*61046927SAndroid Build Coastguard Worker 		NullType,
12628*61046927SAndroid Build Coastguard Worker 		NullType,
12629*61046927SAndroid Build Coastguard Worker 		NullType,
12630*61046927SAndroid Build Coastguard Worker 		NullType,
12631*61046927SAndroid Build Coastguard Worker 		NullType,
12632*61046927SAndroid Build Coastguard Worker 		NullType,
12633*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12634*61046927SAndroid Build Coastguard Worker 
12635*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12636*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12637*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12638*61046927SAndroid Build Coastguard Worker         functor_(functor)
12639*61046927SAndroid Build Coastguard Worker     {
12640*61046927SAndroid Build Coastguard Worker 
12641*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2))
12642*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12643*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12644*61046927SAndroid Build Coastguard Worker         #endif
12645*61046927SAndroid Build Coastguard Worker 
12646*61046927SAndroid Build Coastguard Worker     }
12647*61046927SAndroid Build Coastguard Worker 
12648*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12649*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12650*61046927SAndroid Build Coastguard Worker 
12651*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12652*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12653*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12654*61046927SAndroid Build Coastguard Worker 		T0,
12655*61046927SAndroid Build Coastguard Worker 		T1);
12656*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12657*61046927SAndroid Build Coastguard Worker 	Event operator()(
12658*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12659*61046927SAndroid Build Coastguard Worker 		T0 arg0,
12660*61046927SAndroid Build Coastguard Worker 		T1 arg1)
12661*61046927SAndroid Build Coastguard Worker 	{
12662*61046927SAndroid Build Coastguard Worker 		return functor_(
12663*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12664*61046927SAndroid Build Coastguard Worker 			arg0,
12665*61046927SAndroid Build Coastguard Worker 			arg1);
12666*61046927SAndroid Build Coastguard Worker 	}
12667*61046927SAndroid Build Coastguard Worker 
12668*61046927SAndroid Build Coastguard Worker 
12669*61046927SAndroid Build Coastguard Worker };
12670*61046927SAndroid Build Coastguard Worker 
12671*61046927SAndroid Build Coastguard Worker template<
12672*61046927SAndroid Build Coastguard Worker 	typename T0>
12673*61046927SAndroid Build Coastguard Worker struct functionImplementation_
12674*61046927SAndroid Build Coastguard Worker <	T0,
12675*61046927SAndroid Build Coastguard Worker 	NullType,
12676*61046927SAndroid Build Coastguard Worker 	NullType,
12677*61046927SAndroid Build Coastguard Worker 	NullType,
12678*61046927SAndroid Build Coastguard Worker 	NullType,
12679*61046927SAndroid Build Coastguard Worker 	NullType,
12680*61046927SAndroid Build Coastguard Worker 	NullType,
12681*61046927SAndroid Build Coastguard Worker 	NullType,
12682*61046927SAndroid Build Coastguard Worker 	NullType,
12683*61046927SAndroid Build Coastguard Worker 	NullType,
12684*61046927SAndroid Build Coastguard Worker 	NullType,
12685*61046927SAndroid Build Coastguard Worker 	NullType,
12686*61046927SAndroid Build Coastguard Worker 	NullType,
12687*61046927SAndroid Build Coastguard Worker 	NullType,
12688*61046927SAndroid Build Coastguard Worker 	NullType,
12689*61046927SAndroid Build Coastguard Worker 	NullType,
12690*61046927SAndroid Build Coastguard Worker 	NullType,
12691*61046927SAndroid Build Coastguard Worker 	NullType,
12692*61046927SAndroid Build Coastguard Worker 	NullType,
12693*61046927SAndroid Build Coastguard Worker 	NullType,
12694*61046927SAndroid Build Coastguard Worker 	NullType,
12695*61046927SAndroid Build Coastguard Worker 	NullType,
12696*61046927SAndroid Build Coastguard Worker 	NullType,
12697*61046927SAndroid Build Coastguard Worker 	NullType,
12698*61046927SAndroid Build Coastguard Worker 	NullType,
12699*61046927SAndroid Build Coastguard Worker 	NullType,
12700*61046927SAndroid Build Coastguard Worker 	NullType,
12701*61046927SAndroid Build Coastguard Worker 	NullType,
12702*61046927SAndroid Build Coastguard Worker 	NullType,
12703*61046927SAndroid Build Coastguard Worker 	NullType,
12704*61046927SAndroid Build Coastguard Worker 	NullType,
12705*61046927SAndroid Build Coastguard Worker 	NullType>
12706*61046927SAndroid Build Coastguard Worker {
12707*61046927SAndroid Build Coastguard Worker 	typedef detail::KernelFunctorGlobal<
12708*61046927SAndroid Build Coastguard Worker 		T0,
12709*61046927SAndroid Build Coastguard Worker 		NullType,
12710*61046927SAndroid Build Coastguard Worker 		NullType,
12711*61046927SAndroid Build Coastguard Worker 		NullType,
12712*61046927SAndroid Build Coastguard Worker 		NullType,
12713*61046927SAndroid Build Coastguard Worker 		NullType,
12714*61046927SAndroid Build Coastguard Worker 		NullType,
12715*61046927SAndroid Build Coastguard Worker 		NullType,
12716*61046927SAndroid Build Coastguard Worker 		NullType,
12717*61046927SAndroid Build Coastguard Worker 		NullType,
12718*61046927SAndroid Build Coastguard Worker 		NullType,
12719*61046927SAndroid Build Coastguard Worker 		NullType,
12720*61046927SAndroid Build Coastguard Worker 		NullType,
12721*61046927SAndroid Build Coastguard Worker 		NullType,
12722*61046927SAndroid Build Coastguard Worker 		NullType,
12723*61046927SAndroid Build Coastguard Worker 		NullType,
12724*61046927SAndroid Build Coastguard Worker 		NullType,
12725*61046927SAndroid Build Coastguard Worker 		NullType,
12726*61046927SAndroid Build Coastguard Worker 		NullType,
12727*61046927SAndroid Build Coastguard Worker 		NullType,
12728*61046927SAndroid Build Coastguard Worker 		NullType,
12729*61046927SAndroid Build Coastguard Worker 		NullType,
12730*61046927SAndroid Build Coastguard Worker 		NullType,
12731*61046927SAndroid Build Coastguard Worker 		NullType,
12732*61046927SAndroid Build Coastguard Worker 		NullType,
12733*61046927SAndroid Build Coastguard Worker 		NullType,
12734*61046927SAndroid Build Coastguard Worker 		NullType,
12735*61046927SAndroid Build Coastguard Worker 		NullType,
12736*61046927SAndroid Build Coastguard Worker 		NullType,
12737*61046927SAndroid Build Coastguard Worker 		NullType,
12738*61046927SAndroid Build Coastguard Worker 		NullType,
12739*61046927SAndroid Build Coastguard Worker 		NullType> FunctorType;
12740*61046927SAndroid Build Coastguard Worker 
12741*61046927SAndroid Build Coastguard Worker     FunctorType functor_;
12742*61046927SAndroid Build Coastguard Worker 
functionImplementation_cl::detail::functionImplementation_12743*61046927SAndroid Build Coastguard Worker     functionImplementation_(const FunctorType &functor) :
12744*61046927SAndroid Build Coastguard Worker         functor_(functor)
12745*61046927SAndroid Build Coastguard Worker     {
12746*61046927SAndroid Build Coastguard Worker 
12747*61046927SAndroid Build Coastguard Worker         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1))
12748*61046927SAndroid Build Coastguard Worker         // Fail variadic expansion for dev11
12749*61046927SAndroid Build Coastguard Worker         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12750*61046927SAndroid Build Coastguard Worker         #endif
12751*61046927SAndroid Build Coastguard Worker 
12752*61046927SAndroid Build Coastguard Worker     }
12753*61046927SAndroid Build Coastguard Worker 
12754*61046927SAndroid Build Coastguard Worker 	//! \brief Return type of the functor
12755*61046927SAndroid Build Coastguard Worker 	typedef Event result_type;
12756*61046927SAndroid Build Coastguard Worker 
12757*61046927SAndroid Build Coastguard Worker 	//! \brief Function signature of kernel functor with no event dependency.
12758*61046927SAndroid Build Coastguard Worker 	typedef Event type_(
12759*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs&,
12760*61046927SAndroid Build Coastguard Worker 		T0);
12761*61046927SAndroid Build Coastguard Worker 
operator ()cl::detail::functionImplementation_12762*61046927SAndroid Build Coastguard Worker 	Event operator()(
12763*61046927SAndroid Build Coastguard Worker 		const EnqueueArgs& enqueueArgs,
12764*61046927SAndroid Build Coastguard Worker 		T0 arg0)
12765*61046927SAndroid Build Coastguard Worker 	{
12766*61046927SAndroid Build Coastguard Worker 		return functor_(
12767*61046927SAndroid Build Coastguard Worker 			enqueueArgs,
12768*61046927SAndroid Build Coastguard Worker 			arg0);
12769*61046927SAndroid Build Coastguard Worker 	}
12770*61046927SAndroid Build Coastguard Worker 
12771*61046927SAndroid Build Coastguard Worker 
12772*61046927SAndroid Build Coastguard Worker };
12773*61046927SAndroid Build Coastguard Worker 
12774*61046927SAndroid Build Coastguard Worker 
12775*61046927SAndroid Build Coastguard Worker 
12776*61046927SAndroid Build Coastguard Worker 
12777*61046927SAndroid Build Coastguard Worker 
12778*61046927SAndroid Build Coastguard Worker } // namespace detail
12779*61046927SAndroid Build Coastguard Worker 
12780*61046927SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------
12781*61046927SAndroid Build Coastguard Worker 
12782*61046927SAndroid Build Coastguard Worker template <
12783*61046927SAndroid Build Coastguard Worker    typename T0,   typename T1 = detail::NullType,   typename T2 = detail::NullType,
12784*61046927SAndroid Build Coastguard Worker    typename T3 = detail::NullType,   typename T4 = detail::NullType,
12785*61046927SAndroid Build Coastguard Worker    typename T5 = detail::NullType,   typename T6 = detail::NullType,
12786*61046927SAndroid Build Coastguard Worker    typename T7 = detail::NullType,   typename T8 = detail::NullType,
12787*61046927SAndroid Build Coastguard Worker    typename T9 = detail::NullType,   typename T10 = detail::NullType,
12788*61046927SAndroid Build Coastguard Worker    typename T11 = detail::NullType,   typename T12 = detail::NullType,
12789*61046927SAndroid Build Coastguard Worker    typename T13 = detail::NullType,   typename T14 = detail::NullType,
12790*61046927SAndroid Build Coastguard Worker    typename T15 = detail::NullType,   typename T16 = detail::NullType,
12791*61046927SAndroid Build Coastguard Worker    typename T17 = detail::NullType,   typename T18 = detail::NullType,
12792*61046927SAndroid Build Coastguard Worker    typename T19 = detail::NullType,   typename T20 = detail::NullType,
12793*61046927SAndroid Build Coastguard Worker    typename T21 = detail::NullType,   typename T22 = detail::NullType,
12794*61046927SAndroid Build Coastguard Worker    typename T23 = detail::NullType,   typename T24 = detail::NullType,
12795*61046927SAndroid Build Coastguard Worker    typename T25 = detail::NullType,   typename T26 = detail::NullType,
12796*61046927SAndroid Build Coastguard Worker    typename T27 = detail::NullType,   typename T28 = detail::NullType,
12797*61046927SAndroid Build Coastguard Worker    typename T29 = detail::NullType,   typename T30 = detail::NullType,
12798*61046927SAndroid Build Coastguard Worker    typename T31 = detail::NullType
12799*61046927SAndroid Build Coastguard Worker >
12800*61046927SAndroid Build Coastguard Worker struct make_kernel :
12801*61046927SAndroid Build Coastguard Worker     public detail::functionImplementation_<
12802*61046927SAndroid Build Coastguard Worker                T0,   T1,   T2,   T3,
12803*61046927SAndroid Build Coastguard Worker                T4,   T5,   T6,   T7,
12804*61046927SAndroid Build Coastguard Worker                T8,   T9,   T10,   T11,
12805*61046927SAndroid Build Coastguard Worker                T12,   T13,   T14,   T15,
12806*61046927SAndroid Build Coastguard Worker                T16,   T17,   T18,   T19,
12807*61046927SAndroid Build Coastguard Worker                T20,   T21,   T22,   T23,
12808*61046927SAndroid Build Coastguard Worker                T24,   T25,   T26,   T27,
12809*61046927SAndroid Build Coastguard Worker                T28,   T29,   T30,   T31
12810*61046927SAndroid Build Coastguard Worker     >
12811*61046927SAndroid Build Coastguard Worker {
12812*61046927SAndroid Build Coastguard Worker public:
12813*61046927SAndroid Build Coastguard Worker     typedef detail::KernelFunctorGlobal<
12814*61046927SAndroid Build Coastguard Worker                T0,   T1,   T2,   T3,
12815*61046927SAndroid Build Coastguard Worker                T4,   T5,   T6,   T7,
12816*61046927SAndroid Build Coastguard Worker                T8,   T9,   T10,   T11,
12817*61046927SAndroid Build Coastguard Worker                T12,   T13,   T14,   T15,
12818*61046927SAndroid Build Coastguard Worker                T16,   T17,   T18,   T19,
12819*61046927SAndroid Build Coastguard Worker                T20,   T21,   T22,   T23,
12820*61046927SAndroid Build Coastguard Worker                T24,   T25,   T26,   T27,
12821*61046927SAndroid Build Coastguard Worker                T28,   T29,   T30,   T31
12822*61046927SAndroid Build Coastguard Worker     > FunctorType;
12823*61046927SAndroid Build Coastguard Worker 
make_kernelcl::make_kernel12824*61046927SAndroid Build Coastguard Worker     make_kernel(
12825*61046927SAndroid Build Coastguard Worker         const Program& program,
12826*61046927SAndroid Build Coastguard Worker         const STRING_CLASS name,
12827*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL) :
12828*61046927SAndroid Build Coastguard Worker            detail::functionImplementation_<
12829*61046927SAndroid Build Coastguard Worker                     T0,   T1,   T2,   T3,
12830*61046927SAndroid Build Coastguard Worker                        T4,   T5,   T6,   T7,
12831*61046927SAndroid Build Coastguard Worker                        T8,   T9,   T10,   T11,
12832*61046927SAndroid Build Coastguard Worker                        T12,   T13,   T14,   T15,
12833*61046927SAndroid Build Coastguard Worker                        T16,   T17,   T18,   T19,
12834*61046927SAndroid Build Coastguard Worker                        T20,   T21,   T22,   T23,
12835*61046927SAndroid Build Coastguard Worker                        T24,   T25,   T26,   T27,
12836*61046927SAndroid Build Coastguard Worker                        T28,   T29,   T30,   T31
12837*61046927SAndroid Build Coastguard Worker            >(
12838*61046927SAndroid Build Coastguard Worker             FunctorType(program, name, err))
12839*61046927SAndroid Build Coastguard Worker     {}
12840*61046927SAndroid Build Coastguard Worker 
make_kernelcl::make_kernel12841*61046927SAndroid Build Coastguard Worker     make_kernel(
12842*61046927SAndroid Build Coastguard Worker         const Kernel kernel) :
12843*61046927SAndroid Build Coastguard Worker            detail::functionImplementation_<
12844*61046927SAndroid Build Coastguard Worker                     T0,   T1,   T2,   T3,
12845*61046927SAndroid Build Coastguard Worker                        T4,   T5,   T6,   T7,
12846*61046927SAndroid Build Coastguard Worker                        T8,   T9,   T10,   T11,
12847*61046927SAndroid Build Coastguard Worker                        T12,   T13,   T14,   T15,
12848*61046927SAndroid Build Coastguard Worker                        T16,   T17,   T18,   T19,
12849*61046927SAndroid Build Coastguard Worker                        T20,   T21,   T22,   T23,
12850*61046927SAndroid Build Coastguard Worker                        T24,   T25,   T26,   T27,
12851*61046927SAndroid Build Coastguard Worker                        T28,   T29,   T30,   T31
12852*61046927SAndroid Build Coastguard Worker            >(
12853*61046927SAndroid Build Coastguard Worker             FunctorType(kernel))
12854*61046927SAndroid Build Coastguard Worker     {}
12855*61046927SAndroid Build Coastguard Worker };
12856*61046927SAndroid Build Coastguard Worker 
12857*61046927SAndroid Build Coastguard Worker 
12858*61046927SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
12859*61046927SAndroid Build Coastguard Worker 
12860*61046927SAndroid Build Coastguard Worker #undef __ERR_STR
12861*61046927SAndroid Build Coastguard Worker #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
12862*61046927SAndroid Build Coastguard Worker #undef __GET_DEVICE_INFO_ERR
12863*61046927SAndroid Build Coastguard Worker #undef __GET_PLATFORM_INFO_ERR
12864*61046927SAndroid Build Coastguard Worker #undef __GET_DEVICE_IDS_ERR
12865*61046927SAndroid Build Coastguard Worker #undef __GET_CONTEXT_INFO_ERR
12866*61046927SAndroid Build Coastguard Worker #undef __GET_EVENT_INFO_ERR
12867*61046927SAndroid Build Coastguard Worker #undef __GET_EVENT_PROFILE_INFO_ERR
12868*61046927SAndroid Build Coastguard Worker #undef __GET_MEM_OBJECT_INFO_ERR
12869*61046927SAndroid Build Coastguard Worker #undef __GET_IMAGE_INFO_ERR
12870*61046927SAndroid Build Coastguard Worker #undef __GET_SAMPLER_INFO_ERR
12871*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_INFO_ERR
12872*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_ARG_INFO_ERR
12873*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_WORK_GROUP_INFO_ERR
12874*61046927SAndroid Build Coastguard Worker #undef __GET_PROGRAM_INFO_ERR
12875*61046927SAndroid Build Coastguard Worker #undef __GET_PROGRAM_BUILD_INFO_ERR
12876*61046927SAndroid Build Coastguard Worker #undef __GET_COMMAND_QUEUE_INFO_ERR
12877*61046927SAndroid Build Coastguard Worker 
12878*61046927SAndroid Build Coastguard Worker #undef __CREATE_CONTEXT_ERR
12879*61046927SAndroid Build Coastguard Worker #undef __CREATE_CONTEXT_FROM_TYPE_ERR
12880*61046927SAndroid Build Coastguard Worker #undef __GET_SUPPORTED_IMAGE_FORMATS_ERR
12881*61046927SAndroid Build Coastguard Worker 
12882*61046927SAndroid Build Coastguard Worker #undef __CREATE_BUFFER_ERR
12883*61046927SAndroid Build Coastguard Worker #undef __CREATE_SUBBUFFER_ERR
12884*61046927SAndroid Build Coastguard Worker #undef __CREATE_IMAGE2D_ERR
12885*61046927SAndroid Build Coastguard Worker #undef __CREATE_IMAGE3D_ERR
12886*61046927SAndroid Build Coastguard Worker #undef __CREATE_SAMPLER_ERR
12887*61046927SAndroid Build Coastguard Worker #undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR
12888*61046927SAndroid Build Coastguard Worker 
12889*61046927SAndroid Build Coastguard Worker #undef __CREATE_USER_EVENT_ERR
12890*61046927SAndroid Build Coastguard Worker #undef __SET_USER_EVENT_STATUS_ERR
12891*61046927SAndroid Build Coastguard Worker #undef __SET_EVENT_CALLBACK_ERR
12892*61046927SAndroid Build Coastguard Worker #undef __SET_PRINTF_CALLBACK_ERR
12893*61046927SAndroid Build Coastguard Worker 
12894*61046927SAndroid Build Coastguard Worker #undef __WAIT_FOR_EVENTS_ERR
12895*61046927SAndroid Build Coastguard Worker 
12896*61046927SAndroid Build Coastguard Worker #undef __CREATE_KERNEL_ERR
12897*61046927SAndroid Build Coastguard Worker #undef __SET_KERNEL_ARGS_ERR
12898*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_SOURCE_ERR
12899*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_BINARY_ERR
12900*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR
12901*61046927SAndroid Build Coastguard Worker #undef __BUILD_PROGRAM_ERR
12902*61046927SAndroid Build Coastguard Worker #undef __CREATE_KERNELS_IN_PROGRAM_ERR
12903*61046927SAndroid Build Coastguard Worker 
12904*61046927SAndroid Build Coastguard Worker #undef __CREATE_COMMAND_QUEUE_ERR
12905*61046927SAndroid Build Coastguard Worker #undef __SET_COMMAND_QUEUE_PROPERTY_ERR
12906*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_READ_BUFFER_ERR
12907*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WRITE_BUFFER_ERR
12908*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_READ_BUFFER_RECT_ERR
12909*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WRITE_BUFFER_RECT_ERR
12910*61046927SAndroid Build Coastguard Worker #undef __ENQEUE_COPY_BUFFER_ERR
12911*61046927SAndroid Build Coastguard Worker #undef __ENQEUE_COPY_BUFFER_RECT_ERR
12912*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_READ_IMAGE_ERR
12913*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WRITE_IMAGE_ERR
12914*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_COPY_IMAGE_ERR
12915*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR
12916*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR
12917*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MAP_BUFFER_ERR
12918*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MAP_IMAGE_ERR
12919*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR
12920*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_NDRANGE_KERNEL_ERR
12921*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_TASK_ERR
12922*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_NATIVE_KERNEL
12923*61046927SAndroid Build Coastguard Worker 
12924*61046927SAndroid Build Coastguard Worker #undef __CL_EXPLICIT_CONSTRUCTORS
12925*61046927SAndroid Build Coastguard Worker 
12926*61046927SAndroid Build Coastguard Worker #undef __UNLOAD_COMPILER_ERR
12927*61046927SAndroid Build Coastguard Worker #endif //__CL_USER_OVERRIDE_ERROR_STRINGS
12928*61046927SAndroid Build Coastguard Worker 
12929*61046927SAndroid Build Coastguard Worker #undef __CL_FUNCTION_TYPE
12930*61046927SAndroid Build Coastguard Worker 
12931*61046927SAndroid Build Coastguard Worker // Extensions
12932*61046927SAndroid Build Coastguard Worker /**
12933*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
12934*61046927SAndroid Build Coastguard Worker  */
12935*61046927SAndroid Build Coastguard Worker #if defined(CL_VERSION_1_1)
12936*61046927SAndroid Build Coastguard Worker #undef __INIT_CL_EXT_FCN_PTR
12937*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_VERSION_1_1)
12938*61046927SAndroid Build Coastguard Worker #undef __CREATE_SUB_DEVICES
12939*61046927SAndroid Build Coastguard Worker 
12940*61046927SAndroid Build Coastguard Worker #if defined(USE_CL_DEVICE_FISSION)
12941*61046927SAndroid Build Coastguard Worker #undef __PARAM_NAME_DEVICE_FISSION
12942*61046927SAndroid Build Coastguard Worker #endif // USE_CL_DEVICE_FISSION
12943*61046927SAndroid Build Coastguard Worker 
12944*61046927SAndroid Build Coastguard Worker #undef __DEFAULT_NOT_INITIALIZED
12945*61046927SAndroid Build Coastguard Worker #undef __DEFAULT_BEING_INITIALIZED
12946*61046927SAndroid Build Coastguard Worker #undef __DEFAULT_INITIALIZED
12947*61046927SAndroid Build Coastguard Worker 
12948*61046927SAndroid Build Coastguard Worker #undef CL_HPP_RVALUE_REFERENCES_SUPPORTED
12949*61046927SAndroid Build Coastguard Worker #undef CL_HPP_NOEXCEPT
12950*61046927SAndroid Build Coastguard Worker 
12951*61046927SAndroid Build Coastguard Worker } // namespace cl
12952*61046927SAndroid Build Coastguard Worker 
12953*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_
12954