xref: /aosp_15_r20/external/mesa3d/include/CL/opencl.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, OpenCL 1.1, OpenCL 1.2,
20*61046927SAndroid Build Coastguard Worker  *       OpenCL 2.0, OpenCL 2.1, OpenCL 2.2, and OpenCL 3.0.
21*61046927SAndroid Build Coastguard Worker  *   \author Lee Howes and Bruce Merry
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  *   Derived from the OpenCL 1.x C++ bindings written by
24*61046927SAndroid Build Coastguard Worker  *   Benedict R. Gaster, Laurent Morichetti and Lee Howes
25*61046927SAndroid Build Coastguard Worker  *   With additions and fixes from:
26*61046927SAndroid Build Coastguard Worker  *       Brian Cole, March 3rd 2010 and April 2012
27*61046927SAndroid Build Coastguard Worker  *       Matt Gruenke, April 2012.
28*61046927SAndroid Build Coastguard Worker  *       Bruce Merry, February 2013.
29*61046927SAndroid Build Coastguard Worker  *       Tom Deakin and Simon McIntosh-Smith, July 2013
30*61046927SAndroid Build Coastguard Worker  *       James Price, 2015-
31*61046927SAndroid Build Coastguard Worker  *   \version 2.2.0
32*61046927SAndroid Build Coastguard Worker  *   \date 2019-09-18
33*61046927SAndroid Build Coastguard Worker  *
34*61046927SAndroid Build Coastguard Worker  *   Optional extension support
35*61046927SAndroid Build Coastguard Worker  *
36*61046927SAndroid Build Coastguard Worker  *         cl_ext_device_fission
37*61046927SAndroid Build Coastguard Worker  *         #define CL_HPP_USE_CL_DEVICE_FISSION
38*61046927SAndroid Build Coastguard Worker  *         cl_khr_d3d10_sharing
39*61046927SAndroid Build Coastguard Worker  *         #define CL_HPP_USE_DX_INTEROP
40*61046927SAndroid Build Coastguard Worker  *         cl_khr_sub_groups
41*61046927SAndroid Build Coastguard Worker  *         #define CL_HPP_USE_CL_SUB_GROUPS_KHR
42*61046927SAndroid Build Coastguard Worker  *         cl_khr_image2d_from_buffer
43*61046927SAndroid Build Coastguard Worker  *         #define CL_HPP_USE_CL_IMAGE2D_FROM_BUFFER_KHR
44*61046927SAndroid Build Coastguard Worker  *
45*61046927SAndroid Build Coastguard Worker  *   Doxygen documentation for this header is available here:
46*61046927SAndroid Build Coastguard Worker  *
47*61046927SAndroid Build Coastguard Worker  *       http://khronosgroup.github.io/OpenCL-CLHPP/
48*61046927SAndroid Build Coastguard Worker  *
49*61046927SAndroid Build Coastguard Worker  *   The latest version of this header can be found on the GitHub releases page:
50*61046927SAndroid Build Coastguard Worker  *
51*61046927SAndroid Build Coastguard Worker  *       https://github.com/KhronosGroup/OpenCL-CLHPP/releases
52*61046927SAndroid Build Coastguard Worker  *
53*61046927SAndroid Build Coastguard Worker  *   Bugs and patches can be submitted to the GitHub repository:
54*61046927SAndroid Build Coastguard Worker  *
55*61046927SAndroid Build Coastguard Worker  *       https://github.com/KhronosGroup/OpenCL-CLHPP
56*61046927SAndroid Build Coastguard Worker  */
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker /*! \mainpage
59*61046927SAndroid Build Coastguard Worker  * \section intro Introduction
60*61046927SAndroid Build Coastguard Worker  * For many large applications C++ is the language of choice and so it seems
61*61046927SAndroid Build Coastguard Worker  * reasonable to define C++ bindings for OpenCL.
62*61046927SAndroid Build Coastguard Worker  *
63*61046927SAndroid Build Coastguard Worker  * The interface is contained with a single C++ header file \em opencl.hpp and all
64*61046927SAndroid Build Coastguard Worker  * definitions are contained within the namespace \em cl. There is no additional
65*61046927SAndroid Build Coastguard Worker  * requirement to include \em cl.h and to use either the C++ or original C
66*61046927SAndroid Build Coastguard Worker  * bindings; it is enough to simply include \em opencl.hpp.
67*61046927SAndroid Build Coastguard Worker  *
68*61046927SAndroid Build Coastguard Worker  * The bindings themselves are lightweight and correspond closely to the
69*61046927SAndroid Build Coastguard Worker  * underlying C API. Using the C++ bindings introduces no additional execution
70*61046927SAndroid Build Coastguard Worker  * overhead.
71*61046927SAndroid Build Coastguard Worker  *
72*61046927SAndroid Build Coastguard Worker  * There are numerous compatibility, portability and memory management
73*61046927SAndroid Build Coastguard Worker  * fixes in the new header as well as additional OpenCL 2.0 features.
74*61046927SAndroid Build Coastguard Worker  * As a result the header is not directly backward compatible and for this
75*61046927SAndroid Build Coastguard Worker  * reason we release it as opencl.hpp rather than a new version of cl.hpp.
76*61046927SAndroid Build Coastguard Worker  *
77*61046927SAndroid Build Coastguard Worker  *
78*61046927SAndroid Build Coastguard Worker  * \section compatibility Compatibility
79*61046927SAndroid Build Coastguard Worker  * Due to the evolution of the underlying OpenCL API the 2.0 C++ bindings
80*61046927SAndroid Build Coastguard Worker  * include an updated approach to defining supported feature versions
81*61046927SAndroid Build Coastguard Worker  * and the range of valid underlying OpenCL runtime versions supported.
82*61046927SAndroid Build Coastguard Worker  *
83*61046927SAndroid Build Coastguard Worker  * The combination of preprocessor macros CL_HPP_TARGET_OPENCL_VERSION and
84*61046927SAndroid Build Coastguard Worker  * CL_HPP_MINIMUM_OPENCL_VERSION control this range. These are three digit
85*61046927SAndroid Build Coastguard Worker  * decimal values representing OpenCL runime versions. The default for
86*61046927SAndroid Build Coastguard Worker  * the target is 200, representing OpenCL 2.0 and the minimum is also
87*61046927SAndroid Build Coastguard Worker  * defined as 200. These settings would use 2.0 API calls only.
88*61046927SAndroid Build Coastguard Worker  * If backward compatibility with a 1.2 runtime is required, the minimum
89*61046927SAndroid Build Coastguard Worker  * version may be set to 120.
90*61046927SAndroid Build Coastguard Worker  *
91*61046927SAndroid Build Coastguard Worker  * Note that this is a compile-time setting, and so affects linking against
92*61046927SAndroid Build Coastguard Worker  * a particular SDK version rather than the versioning of the loaded runtime.
93*61046927SAndroid Build Coastguard Worker  *
94*61046927SAndroid Build Coastguard Worker  * The earlier versions of the header included basic vector and string
95*61046927SAndroid Build Coastguard Worker  * classes based loosely on STL versions. These were difficult to
96*61046927SAndroid Build Coastguard Worker  * maintain and very rarely used. For the 2.0 header we now assume
97*61046927SAndroid Build Coastguard Worker  * the presence of the standard library unless requested otherwise.
98*61046927SAndroid Build Coastguard Worker  * We use std::array, std::vector, std::shared_ptr and std::string
99*61046927SAndroid Build Coastguard Worker  * throughout to safely manage memory and reduce the chance of a
100*61046927SAndroid Build Coastguard Worker  * recurrance of earlier memory management bugs.
101*61046927SAndroid Build Coastguard Worker  *
102*61046927SAndroid Build Coastguard Worker  * These classes are used through typedefs in the cl namespace:
103*61046927SAndroid Build Coastguard Worker  * cl::array, cl::vector, cl::pointer and cl::string.
104*61046927SAndroid Build Coastguard Worker  * In addition cl::allocate_pointer forwards to std::allocate_shared
105*61046927SAndroid Build Coastguard Worker  * by default.
106*61046927SAndroid Build Coastguard Worker  * In all cases these standard library classes can be replaced with
107*61046927SAndroid Build Coastguard Worker  * custom interface-compatible versions using the CL_HPP_NO_STD_ARRAY,
108*61046927SAndroid Build Coastguard Worker  * CL_HPP_NO_STD_VECTOR, CL_HPP_NO_STD_UNIQUE_PTR and
109*61046927SAndroid Build Coastguard Worker  * CL_HPP_NO_STD_STRING macros.
110*61046927SAndroid Build Coastguard Worker  *
111*61046927SAndroid Build Coastguard Worker  * The OpenCL 1.x versions of the C++ bindings included a size_t wrapper
112*61046927SAndroid Build Coastguard Worker  * class to interface with kernel enqueue. This caused unpleasant interactions
113*61046927SAndroid Build Coastguard Worker  * with the standard size_t declaration and led to namespacing bugs.
114*61046927SAndroid Build Coastguard Worker  * In the 2.0 version we have replaced this with a std::array-based interface.
115*61046927SAndroid Build Coastguard Worker  * However, the old behaviour can be regained for backward compatibility
116*61046927SAndroid Build Coastguard Worker  * using the CL_HPP_ENABLE_SIZE_T_COMPATIBILITY macro.
117*61046927SAndroid Build Coastguard Worker  *
118*61046927SAndroid Build Coastguard Worker  * Finally, the program construction interface used a clumsy vector-of-pairs
119*61046927SAndroid Build Coastguard Worker  * design in the earlier versions. We have replaced that with a cleaner
120*61046927SAndroid Build Coastguard Worker  * vector-of-vectors and vector-of-strings design. However, for backward
121*61046927SAndroid Build Coastguard Worker  * compatibility old behaviour can be regained with the
122*61046927SAndroid Build Coastguard Worker  * CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY macro.
123*61046927SAndroid Build Coastguard Worker  *
124*61046927SAndroid Build Coastguard Worker  * In OpenCL 2.0 OpenCL C is not entirely backward compatibility with
125*61046927SAndroid Build Coastguard Worker  * earlier versions. As a result a flag must be passed to the OpenCL C
126*61046927SAndroid Build Coastguard Worker  * compiled to request OpenCL 2.0 compilation of kernels with 1.2 as
127*61046927SAndroid Build Coastguard Worker  * the default in the absence of the flag.
128*61046927SAndroid Build Coastguard Worker  * In some cases the C++ bindings automatically compile code for ease.
129*61046927SAndroid Build Coastguard Worker  * For those cases the compilation defaults to OpenCL C 2.0.
130*61046927SAndroid Build Coastguard Worker  * If this is not wanted, the CL_HPP_CL_1_2_DEFAULT_BUILD macro may
131*61046927SAndroid Build Coastguard Worker  * be specified to assume 1.2 compilation.
132*61046927SAndroid Build Coastguard Worker  * If more fine-grained decisions on a per-kernel bases are required
133*61046927SAndroid Build Coastguard Worker  * then explicit build operations that take the flag should be used.
134*61046927SAndroid Build Coastguard Worker  *
135*61046927SAndroid Build Coastguard Worker  *
136*61046927SAndroid Build Coastguard Worker  * \section parameterization Parameters
137*61046927SAndroid Build Coastguard Worker  * This header may be parameterized by a set of preprocessor macros.
138*61046927SAndroid Build Coastguard Worker  *
139*61046927SAndroid Build Coastguard Worker  * - CL_HPP_TARGET_OPENCL_VERSION
140*61046927SAndroid Build Coastguard Worker  *
141*61046927SAndroid Build Coastguard Worker  *   Defines the target OpenCL runtime version to build the header
142*61046927SAndroid Build Coastguard Worker  *   against. Defaults to 200, representing OpenCL 2.0.
143*61046927SAndroid Build Coastguard Worker  *
144*61046927SAndroid Build Coastguard Worker  * - CL_HPP_NO_STD_STRING
145*61046927SAndroid Build Coastguard Worker  *
146*61046927SAndroid Build Coastguard Worker  *   Do not use the standard library string class. cl::string is not
147*61046927SAndroid Build Coastguard Worker  *   defined and may be defined by the user before opencl.hpp is
148*61046927SAndroid Build Coastguard Worker  *   included.
149*61046927SAndroid Build Coastguard Worker  *
150*61046927SAndroid Build Coastguard Worker  * - CL_HPP_NO_STD_VECTOR
151*61046927SAndroid Build Coastguard Worker  *
152*61046927SAndroid Build Coastguard Worker  *   Do not use the standard library vector class. cl::vector is not
153*61046927SAndroid Build Coastguard Worker  *   defined and may be defined by the user before opencl.hpp is
154*61046927SAndroid Build Coastguard Worker  *   included.
155*61046927SAndroid Build Coastguard Worker  *
156*61046927SAndroid Build Coastguard Worker  * - CL_HPP_NO_STD_ARRAY
157*61046927SAndroid Build Coastguard Worker  *
158*61046927SAndroid Build Coastguard Worker  *   Do not use the standard library array class. cl::array is not
159*61046927SAndroid Build Coastguard Worker  *   defined and may be defined by the user before opencl.hpp is
160*61046927SAndroid Build Coastguard Worker  *   included.
161*61046927SAndroid Build Coastguard Worker  *
162*61046927SAndroid Build Coastguard Worker  * - CL_HPP_NO_STD_UNIQUE_PTR
163*61046927SAndroid Build Coastguard Worker  *
164*61046927SAndroid Build Coastguard Worker  *   Do not use the standard library unique_ptr class. cl::pointer and
165*61046927SAndroid Build Coastguard Worker  *   the cl::allocate_pointer functions are not defined and may be
166*61046927SAndroid Build Coastguard Worker  *   defined by the user before opencl.hpp is included.
167*61046927SAndroid Build Coastguard Worker  *
168*61046927SAndroid Build Coastguard Worker  * - CL_HPP_ENABLE_EXCEPTIONS
169*61046927SAndroid Build Coastguard Worker  *
170*61046927SAndroid Build Coastguard Worker  *   Enable exceptions for use in the C++ bindings header. This is the
171*61046927SAndroid Build Coastguard Worker  *   preferred error handling mechanism but is not required.
172*61046927SAndroid Build Coastguard Worker  *
173*61046927SAndroid Build Coastguard Worker  * - CL_HPP_ENABLE_SIZE_T_COMPATIBILITY
174*61046927SAndroid Build Coastguard Worker  *
175*61046927SAndroid Build Coastguard Worker  *   Backward compatibility option to support cl.hpp-style size_t
176*61046927SAndroid Build Coastguard Worker  *   class.  Replaces the updated std::array derived version and
177*61046927SAndroid Build Coastguard Worker  *   removal of size_t from the namespace. Note that in this case the
178*61046927SAndroid Build Coastguard Worker  *   new size_t class is placed in the cl::compatibility namespace and
179*61046927SAndroid Build Coastguard Worker  *   thus requires an additional using declaration for direct backward
180*61046927SAndroid Build Coastguard Worker  *   compatibility.
181*61046927SAndroid Build Coastguard Worker  *
182*61046927SAndroid Build Coastguard Worker  * - CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY
183*61046927SAndroid Build Coastguard Worker  *
184*61046927SAndroid Build Coastguard Worker  *   Enable older vector of pairs interface for construction of
185*61046927SAndroid Build Coastguard Worker  *   programs.
186*61046927SAndroid Build Coastguard Worker  *
187*61046927SAndroid Build Coastguard Worker  * - CL_HPP_CL_1_2_DEFAULT_BUILD
188*61046927SAndroid Build Coastguard Worker  *
189*61046927SAndroid Build Coastguard Worker  *   Default to OpenCL C 1.2 compilation rather than OpenCL C 2.0
190*61046927SAndroid Build Coastguard Worker  *   applies to use of cl::Program construction and other program
191*61046927SAndroid Build Coastguard Worker  *   build variants.
192*61046927SAndroid Build Coastguard Worker  *
193*61046927SAndroid Build Coastguard Worker  * - CL_HPP_USE_CL_DEVICE_FISSION
194*61046927SAndroid Build Coastguard Worker  *
195*61046927SAndroid Build Coastguard Worker  *   Enable the cl_ext_device_fission extension.
196*61046927SAndroid Build Coastguard Worker  *
197*61046927SAndroid Build Coastguard Worker  * - CL_HPP_USE_CL_IMAGE2D_FROM_BUFFER_KHR
198*61046927SAndroid Build Coastguard Worker  *
199*61046927SAndroid Build Coastguard Worker  *   Enable the cl_khr_image2d_from_buffer extension.
200*61046927SAndroid Build Coastguard Worker  *
201*61046927SAndroid Build Coastguard Worker  * - CL_HPP_USE_CL_SUB_GROUPS_KHR
202*61046927SAndroid Build Coastguard Worker  *
203*61046927SAndroid Build Coastguard Worker  *   Enable the cl_khr_subgroups extension.
204*61046927SAndroid Build Coastguard Worker  *
205*61046927SAndroid Build Coastguard Worker  * - CL_HPP_USE_DX_INTEROP
206*61046927SAndroid Build Coastguard Worker  *
207*61046927SAndroid Build Coastguard Worker  *   Enable the cl_khr_d3d10_sharing extension.
208*61046927SAndroid Build Coastguard Worker  *
209*61046927SAndroid Build Coastguard Worker  * - CL_HPP_USE_IL_KHR
210*61046927SAndroid Build Coastguard Worker  *
211*61046927SAndroid Build Coastguard Worker  *   Enable the cl_khr_il_program extension.
212*61046927SAndroid Build Coastguard Worker  *
213*61046927SAndroid Build Coastguard Worker  *
214*61046927SAndroid Build Coastguard Worker  * \section example Example
215*61046927SAndroid Build Coastguard Worker  *
216*61046927SAndroid Build Coastguard Worker  * The following example shows a general use case for the C++
217*61046927SAndroid Build Coastguard Worker  * bindings, including support for the optional exception feature and
218*61046927SAndroid Build Coastguard Worker  * also the supplied vector and string classes, see following sections for
219*61046927SAndroid Build Coastguard Worker  * decriptions of these features.
220*61046927SAndroid Build Coastguard Worker  *
221*61046927SAndroid Build Coastguard Worker  * Note: the C++ bindings use std::call_once and therefore may need to be
222*61046927SAndroid Build Coastguard Worker  * compiled using special command-line options (such as "-pthread") on some
223*61046927SAndroid Build Coastguard Worker  * platforms!
224*61046927SAndroid Build Coastguard Worker  *
225*61046927SAndroid Build Coastguard Worker  * \code
226*61046927SAndroid Build Coastguard Worker     #define CL_HPP_ENABLE_EXCEPTIONS
227*61046927SAndroid Build Coastguard Worker     #define CL_HPP_TARGET_OPENCL_VERSION 200
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker     #include <CL/opencl.hpp>
230*61046927SAndroid Build Coastguard Worker     #include <iostream>
231*61046927SAndroid Build Coastguard Worker     #include <vector>
232*61046927SAndroid Build Coastguard Worker     #include <memory>
233*61046927SAndroid Build Coastguard Worker     #include <algorithm>
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker     const int numElements = 32;
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker     int main(void)
238*61046927SAndroid Build Coastguard Worker     {
239*61046927SAndroid Build Coastguard Worker         // Filter for a 2.0 or newer platform and set it as the default
240*61046927SAndroid Build Coastguard Worker         std::vector<cl::Platform> platforms;
241*61046927SAndroid Build Coastguard Worker         cl::Platform::get(&platforms);
242*61046927SAndroid Build Coastguard Worker         cl::Platform plat;
243*61046927SAndroid Build Coastguard Worker         for (auto &p : platforms) {
244*61046927SAndroid Build Coastguard Worker             std::string platver = p.getInfo<CL_PLATFORM_VERSION>();
245*61046927SAndroid Build Coastguard Worker             if (platver.find("OpenCL 2.") != std::string::npos ||
246*61046927SAndroid Build Coastguard Worker                 platver.find("OpenCL 3.") != std::string::npos) {
247*61046927SAndroid Build Coastguard Worker                 // Note: an OpenCL 3.x platform may not support all required features!
248*61046927SAndroid Build Coastguard Worker                 plat = p;
249*61046927SAndroid Build Coastguard Worker             }
250*61046927SAndroid Build Coastguard Worker         }
251*61046927SAndroid Build Coastguard Worker         if (plat() == 0) {
252*61046927SAndroid Build Coastguard Worker             std::cout << "No OpenCL 2.0 or newer platform found.\n";
253*61046927SAndroid Build Coastguard Worker             return -1;
254*61046927SAndroid Build Coastguard Worker         }
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker         cl::Platform newP = cl::Platform::setDefault(plat);
257*61046927SAndroid Build Coastguard Worker         if (newP != plat) {
258*61046927SAndroid Build Coastguard Worker             std::cout << "Error setting default platform.\n";
259*61046927SAndroid Build Coastguard Worker             return -1;
260*61046927SAndroid Build Coastguard Worker         }
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker         // C++11 raw string literal for the first kernel
263*61046927SAndroid Build Coastguard Worker         std::string kernel1{R"CLC(
264*61046927SAndroid Build Coastguard Worker             global int globalA;
265*61046927SAndroid Build Coastguard Worker             kernel void updateGlobal()
266*61046927SAndroid Build Coastguard Worker             {
267*61046927SAndroid Build Coastguard Worker               globalA = 75;
268*61046927SAndroid Build Coastguard Worker             }
269*61046927SAndroid Build Coastguard Worker         )CLC"};
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker         // Raw string literal for the second kernel
272*61046927SAndroid Build Coastguard Worker         std::string kernel2{R"CLC(
273*61046927SAndroid Build Coastguard Worker             typedef struct { global int *bar; } Foo;
274*61046927SAndroid Build Coastguard Worker             kernel void vectorAdd(global const Foo* aNum, global const int *inputA, global const int *inputB,
275*61046927SAndroid Build Coastguard Worker                                   global int *output, int val, write_only pipe int outPipe, queue_t childQueue)
276*61046927SAndroid Build Coastguard Worker             {
277*61046927SAndroid Build Coastguard Worker               output[get_global_id(0)] = inputA[get_global_id(0)] + inputB[get_global_id(0)] + val + *(aNum->bar);
278*61046927SAndroid Build Coastguard Worker               write_pipe(outPipe, &val);
279*61046927SAndroid Build Coastguard Worker               queue_t default_queue = get_default_queue();
280*61046927SAndroid Build Coastguard Worker               ndrange_t ndrange = ndrange_1D(get_global_size(0)/2, get_global_size(0)/2);
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker               // Have a child kernel write into third quarter of output
283*61046927SAndroid Build Coastguard Worker               enqueue_kernel(default_queue, CLK_ENQUEUE_FLAGS_WAIT_KERNEL, ndrange,
284*61046927SAndroid Build Coastguard Worker                 ^{
285*61046927SAndroid Build Coastguard Worker                     output[get_global_size(0)*2 + get_global_id(0)] =
286*61046927SAndroid Build Coastguard Worker                       inputA[get_global_size(0)*2 + get_global_id(0)] + inputB[get_global_size(0)*2 + get_global_id(0)] + globalA;
287*61046927SAndroid Build Coastguard Worker                 });
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker               // Have a child kernel write into last quarter of output
290*61046927SAndroid Build Coastguard Worker               enqueue_kernel(childQueue, CLK_ENQUEUE_FLAGS_WAIT_KERNEL, ndrange,
291*61046927SAndroid Build Coastguard Worker                 ^{
292*61046927SAndroid Build Coastguard Worker                     output[get_global_size(0)*3 + get_global_id(0)] =
293*61046927SAndroid Build Coastguard Worker                       inputA[get_global_size(0)*3 + get_global_id(0)] + inputB[get_global_size(0)*3 + get_global_id(0)] + globalA + 2;
294*61046927SAndroid Build Coastguard Worker                 });
295*61046927SAndroid Build Coastguard Worker             }
296*61046927SAndroid Build Coastguard Worker         )CLC"};
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker         std::vector<std::string> programStrings;
299*61046927SAndroid Build Coastguard Worker         programStrings.push_back(kernel1);
300*61046927SAndroid Build Coastguard Worker         programStrings.push_back(kernel2);
301*61046927SAndroid Build Coastguard Worker 
302*61046927SAndroid Build Coastguard Worker         cl::Program vectorAddProgram(programStrings);
303*61046927SAndroid Build Coastguard Worker         try {
304*61046927SAndroid Build Coastguard Worker             vectorAddProgram.build("-cl-std=CL2.0");
305*61046927SAndroid Build Coastguard Worker         }
306*61046927SAndroid Build Coastguard Worker         catch (...) {
307*61046927SAndroid Build Coastguard Worker             // Print build info for all devices
308*61046927SAndroid Build Coastguard Worker             cl_int buildErr = CL_SUCCESS;
309*61046927SAndroid Build Coastguard Worker             auto buildInfo = vectorAddProgram.getBuildInfo<CL_PROGRAM_BUILD_LOG>(&buildErr);
310*61046927SAndroid Build Coastguard Worker             for (auto &pair : buildInfo) {
311*61046927SAndroid Build Coastguard Worker                 std::cerr << pair.second << std::endl << std::endl;
312*61046927SAndroid Build Coastguard Worker             }
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker             return 1;
315*61046927SAndroid Build Coastguard Worker         }
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker         typedef struct { int *bar; } Foo;
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker         // Get and run kernel that initializes the program-scope global
320*61046927SAndroid Build Coastguard Worker         // A test for kernels that take no arguments
321*61046927SAndroid Build Coastguard Worker         auto program2Kernel =
322*61046927SAndroid Build Coastguard Worker             cl::KernelFunctor<>(vectorAddProgram, "updateGlobal");
323*61046927SAndroid Build Coastguard Worker         program2Kernel(
324*61046927SAndroid Build Coastguard Worker             cl::EnqueueArgs(
325*61046927SAndroid Build Coastguard Worker             cl::NDRange(1)));
326*61046927SAndroid Build Coastguard Worker 
327*61046927SAndroid Build Coastguard Worker         //////////////////
328*61046927SAndroid Build Coastguard Worker         // SVM allocations
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker         auto anSVMInt = cl::allocate_svm<int, cl::SVMTraitCoarse<>>();
331*61046927SAndroid Build Coastguard Worker         *anSVMInt = 5;
332*61046927SAndroid Build Coastguard Worker         cl::SVMAllocator<Foo, cl::SVMTraitCoarse<cl::SVMTraitReadOnly<>>> svmAllocReadOnly;
333*61046927SAndroid Build Coastguard Worker         auto fooPointer = cl::allocate_pointer<Foo>(svmAllocReadOnly);
334*61046927SAndroid Build Coastguard Worker         fooPointer->bar = anSVMInt.get();
335*61046927SAndroid Build Coastguard Worker         cl::SVMAllocator<int, cl::SVMTraitCoarse<>> svmAlloc;
336*61046927SAndroid Build Coastguard Worker         std::vector<int, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>> inputA(numElements, 1, svmAlloc);
337*61046927SAndroid Build Coastguard Worker         cl::coarse_svm_vector<int> inputB(numElements, 2, svmAlloc);
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker         //////////////
340*61046927SAndroid Build Coastguard Worker         // Traditional cl_mem allocations
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker         std::vector<int> output(numElements, 0xdeadbeef);
343*61046927SAndroid Build Coastguard Worker         cl::Buffer outputBuffer(begin(output), end(output), false);
344*61046927SAndroid Build Coastguard Worker         cl::Pipe aPipe(sizeof(cl_int), numElements / 2);
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker         // Default command queue, also passed in as a parameter
347*61046927SAndroid Build Coastguard Worker         cl::DeviceCommandQueue defaultDeviceQueue = cl::DeviceCommandQueue::makeDefault(
348*61046927SAndroid Build Coastguard Worker             cl::Context::getDefault(), cl::Device::getDefault());
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker         auto vectorAddKernel =
351*61046927SAndroid Build Coastguard Worker             cl::KernelFunctor<
352*61046927SAndroid Build Coastguard Worker                 decltype(fooPointer)&,
353*61046927SAndroid Build Coastguard Worker                 int*,
354*61046927SAndroid Build Coastguard Worker                 cl::coarse_svm_vector<int>&,
355*61046927SAndroid Build Coastguard Worker                 cl::Buffer,
356*61046927SAndroid Build Coastguard Worker                 int,
357*61046927SAndroid Build Coastguard Worker                 cl::Pipe&,
358*61046927SAndroid Build Coastguard Worker                 cl::DeviceCommandQueue
359*61046927SAndroid Build Coastguard Worker                 >(vectorAddProgram, "vectorAdd");
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker         // Ensure that the additional SVM pointer is available to the kernel
362*61046927SAndroid Build Coastguard Worker         // This one was not passed as a parameter
363*61046927SAndroid Build Coastguard Worker         vectorAddKernel.setSVMPointers(anSVMInt);
364*61046927SAndroid Build Coastguard Worker 
365*61046927SAndroid Build Coastguard Worker         cl_int error;
366*61046927SAndroid Build Coastguard Worker         vectorAddKernel(
367*61046927SAndroid Build Coastguard Worker             cl::EnqueueArgs(
368*61046927SAndroid Build Coastguard Worker                 cl::NDRange(numElements/2),
369*61046927SAndroid Build Coastguard Worker                 cl::NDRange(numElements/2)),
370*61046927SAndroid Build Coastguard Worker             fooPointer,
371*61046927SAndroid Build Coastguard Worker             inputA.data(),
372*61046927SAndroid Build Coastguard Worker             inputB,
373*61046927SAndroid Build Coastguard Worker             outputBuffer,
374*61046927SAndroid Build Coastguard Worker             3,
375*61046927SAndroid Build Coastguard Worker             aPipe,
376*61046927SAndroid Build Coastguard Worker             defaultDeviceQueue,
377*61046927SAndroid Build Coastguard Worker             error
378*61046927SAndroid Build Coastguard Worker             );
379*61046927SAndroid Build Coastguard Worker 
380*61046927SAndroid Build Coastguard Worker         cl::copy(outputBuffer, begin(output), end(output));
381*61046927SAndroid Build Coastguard Worker 
382*61046927SAndroid Build Coastguard Worker         cl::Device d = cl::Device::getDefault();
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker         std::cout << "Output:\n";
385*61046927SAndroid Build Coastguard Worker         for (int i = 1; i < numElements; ++i) {
386*61046927SAndroid Build Coastguard Worker             std::cout << "\t" << output[i] << "\n";
387*61046927SAndroid Build Coastguard Worker         }
388*61046927SAndroid Build Coastguard Worker         std::cout << "\n\n";
389*61046927SAndroid Build Coastguard Worker 
390*61046927SAndroid Build Coastguard Worker         return 0;
391*61046927SAndroid Build Coastguard Worker     }
392*61046927SAndroid Build Coastguard Worker  *
393*61046927SAndroid Build Coastguard Worker  * \endcode
394*61046927SAndroid Build Coastguard Worker  *
395*61046927SAndroid Build Coastguard Worker  */
396*61046927SAndroid Build Coastguard Worker #ifndef CL_HPP_
397*61046927SAndroid Build Coastguard Worker #define CL_HPP_
398*61046927SAndroid Build Coastguard Worker 
399*61046927SAndroid Build Coastguard Worker /* Handle deprecated preprocessor definitions. In each case, we only check for
400*61046927SAndroid Build Coastguard Worker  * the old name if the new name is not defined, so that user code can define
401*61046927SAndroid Build Coastguard Worker  * both and hence work with either version of the bindings.
402*61046927SAndroid Build Coastguard Worker  */
403*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_USE_DX_INTEROP) && defined(USE_DX_INTEROP)
404*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: USE_DX_INTEROP is deprecated. Define CL_HPP_USE_DX_INTEROP instead")
405*61046927SAndroid Build Coastguard Worker # define CL_HPP_USE_DX_INTEROP
406*61046927SAndroid Build Coastguard Worker #endif
407*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_USE_CL_DEVICE_FISSION) && defined(USE_CL_DEVICE_FISSION)
408*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: USE_CL_DEVICE_FISSION is deprecated. Define CL_HPP_USE_CL_DEVICE_FISSION instead")
409*61046927SAndroid Build Coastguard Worker # define CL_HPP_USE_CL_DEVICE_FISSION
410*61046927SAndroid Build Coastguard Worker #endif
411*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_ENABLE_EXCEPTIONS) && defined(__CL_ENABLE_EXCEPTIONS)
412*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: __CL_ENABLE_EXCEPTIONS is deprecated. Define CL_HPP_ENABLE_EXCEPTIONS instead")
413*61046927SAndroid Build Coastguard Worker # define CL_HPP_ENABLE_EXCEPTIONS
414*61046927SAndroid Build Coastguard Worker #endif
415*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_VECTOR) && defined(__NO_STD_VECTOR)
416*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: __NO_STD_VECTOR is deprecated. Define CL_HPP_NO_STD_VECTOR instead")
417*61046927SAndroid Build Coastguard Worker # define CL_HPP_NO_STD_VECTOR
418*61046927SAndroid Build Coastguard Worker #endif
419*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_STRING) && defined(__NO_STD_STRING)
420*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: __NO_STD_STRING is deprecated. Define CL_HPP_NO_STD_STRING instead")
421*61046927SAndroid Build Coastguard Worker # define CL_HPP_NO_STD_STRING
422*61046927SAndroid Build Coastguard Worker #endif
423*61046927SAndroid Build Coastguard Worker #if defined(VECTOR_CLASS)
424*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: VECTOR_CLASS is deprecated. Alias cl::vector instead")
425*61046927SAndroid Build Coastguard Worker #endif
426*61046927SAndroid Build Coastguard Worker #if defined(STRING_CLASS)
427*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: STRING_CLASS is deprecated. Alias cl::string instead.")
428*61046927SAndroid Build Coastguard Worker #endif
429*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_USER_OVERRIDE_ERROR_STRINGS) && defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
430*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: __CL_USER_OVERRIDE_ERROR_STRINGS is deprecated. Define CL_HPP_USER_OVERRIDE_ERROR_STRINGS instead")
431*61046927SAndroid Build Coastguard Worker # define CL_HPP_USER_OVERRIDE_ERROR_STRINGS
432*61046927SAndroid Build Coastguard Worker #endif
433*61046927SAndroid Build Coastguard Worker 
434*61046927SAndroid Build Coastguard Worker /* Warn about features that are no longer supported
435*61046927SAndroid Build Coastguard Worker  */
436*61046927SAndroid Build Coastguard Worker #if defined(__USE_DEV_VECTOR)
437*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: __USE_DEV_VECTOR is no longer supported. Expect compilation errors")
438*61046927SAndroid Build Coastguard Worker #endif
439*61046927SAndroid Build Coastguard Worker #if defined(__USE_DEV_STRING)
440*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: __USE_DEV_STRING is no longer supported. Expect compilation errors")
441*61046927SAndroid Build Coastguard Worker #endif
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker /* Detect which version to target */
444*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_TARGET_OPENCL_VERSION)
445*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: CL_HPP_TARGET_OPENCL_VERSION is not defined. It will default to 300 (OpenCL 3.0)")
446*61046927SAndroid Build Coastguard Worker # define CL_HPP_TARGET_OPENCL_VERSION 300
447*61046927SAndroid Build Coastguard Worker #endif
448*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION != 100 && \
449*61046927SAndroid Build Coastguard Worker     CL_HPP_TARGET_OPENCL_VERSION != 110 && \
450*61046927SAndroid Build Coastguard Worker     CL_HPP_TARGET_OPENCL_VERSION != 120 && \
451*61046927SAndroid Build Coastguard Worker     CL_HPP_TARGET_OPENCL_VERSION != 200 && \
452*61046927SAndroid Build Coastguard Worker     CL_HPP_TARGET_OPENCL_VERSION != 210 && \
453*61046927SAndroid Build Coastguard Worker     CL_HPP_TARGET_OPENCL_VERSION != 220 && \
454*61046927SAndroid Build Coastguard Worker     CL_HPP_TARGET_OPENCL_VERSION != 300
455*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: CL_HPP_TARGET_OPENCL_VERSION is not a valid value (100, 110, 120, 200, 210, 220 or 300). It will be set to 300 (OpenCL 3.0).")
456*61046927SAndroid Build Coastguard Worker # undef CL_HPP_TARGET_OPENCL_VERSION
457*61046927SAndroid Build Coastguard Worker # define CL_HPP_TARGET_OPENCL_VERSION 300
458*61046927SAndroid Build Coastguard Worker #endif
459*61046927SAndroid Build Coastguard Worker 
460*61046927SAndroid Build Coastguard Worker /* Forward target OpenCL version to C headers if necessary */
461*61046927SAndroid Build Coastguard Worker #if defined(CL_TARGET_OPENCL_VERSION)
462*61046927SAndroid Build Coastguard Worker /* Warn if prior definition of CL_TARGET_OPENCL_VERSION is lower than
463*61046927SAndroid Build Coastguard Worker  * requested C++ bindings version */
464*61046927SAndroid Build Coastguard Worker #if CL_TARGET_OPENCL_VERSION < CL_HPP_TARGET_OPENCL_VERSION
465*61046927SAndroid Build Coastguard Worker # pragma message("CL_TARGET_OPENCL_VERSION is already defined as is lower than CL_HPP_TARGET_OPENCL_VERSION")
466*61046927SAndroid Build Coastguard Worker #endif
467*61046927SAndroid Build Coastguard Worker #else
468*61046927SAndroid Build Coastguard Worker # define CL_TARGET_OPENCL_VERSION CL_HPP_TARGET_OPENCL_VERSION
469*61046927SAndroid Build Coastguard Worker #endif
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_MINIMUM_OPENCL_VERSION)
472*61046927SAndroid Build Coastguard Worker # define CL_HPP_MINIMUM_OPENCL_VERSION 200
473*61046927SAndroid Build Coastguard Worker #endif
474*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION != 100 && \
475*61046927SAndroid Build Coastguard Worker     CL_HPP_MINIMUM_OPENCL_VERSION != 110 && \
476*61046927SAndroid Build Coastguard Worker     CL_HPP_MINIMUM_OPENCL_VERSION != 120 && \
477*61046927SAndroid Build Coastguard Worker     CL_HPP_MINIMUM_OPENCL_VERSION != 200 && \
478*61046927SAndroid Build Coastguard Worker     CL_HPP_MINIMUM_OPENCL_VERSION != 210 && \
479*61046927SAndroid Build Coastguard Worker     CL_HPP_MINIMUM_OPENCL_VERSION != 220 && \
480*61046927SAndroid Build Coastguard Worker     CL_HPP_MINIMUM_OPENCL_VERSION != 300
481*61046927SAndroid Build Coastguard Worker # pragma message("opencl.hpp: CL_HPP_MINIMUM_OPENCL_VERSION is not a valid value (100, 110, 120, 200, 210, 220 or 300). It will be set to 100")
482*61046927SAndroid Build Coastguard Worker # undef CL_HPP_MINIMUM_OPENCL_VERSION
483*61046927SAndroid Build Coastguard Worker # define CL_HPP_MINIMUM_OPENCL_VERSION 100
484*61046927SAndroid Build Coastguard Worker #endif
485*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION > CL_HPP_TARGET_OPENCL_VERSION
486*61046927SAndroid Build Coastguard Worker # error "CL_HPP_MINIMUM_OPENCL_VERSION must not be greater than CL_HPP_TARGET_OPENCL_VERSION"
487*61046927SAndroid Build Coastguard Worker #endif
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION <= 100 && !defined(CL_USE_DEPRECATED_OPENCL_1_0_APIS)
490*61046927SAndroid Build Coastguard Worker # define CL_USE_DEPRECATED_OPENCL_1_0_APIS
491*61046927SAndroid Build Coastguard Worker #endif
492*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION <= 110 && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
493*61046927SAndroid Build Coastguard Worker # define CL_USE_DEPRECATED_OPENCL_1_1_APIS
494*61046927SAndroid Build Coastguard Worker #endif
495*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION <= 120 && !defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
496*61046927SAndroid Build Coastguard Worker # define CL_USE_DEPRECATED_OPENCL_1_2_APIS
497*61046927SAndroid Build Coastguard Worker #endif
498*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION <= 200 && !defined(CL_USE_DEPRECATED_OPENCL_2_0_APIS)
499*61046927SAndroid Build Coastguard Worker # define CL_USE_DEPRECATED_OPENCL_2_0_APIS
500*61046927SAndroid Build Coastguard Worker #endif
501*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION <= 210 && !defined(CL_USE_DEPRECATED_OPENCL_2_1_APIS)
502*61046927SAndroid Build Coastguard Worker # define CL_USE_DEPRECATED_OPENCL_2_1_APIS
503*61046927SAndroid Build Coastguard Worker #endif
504*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION <= 220 && !defined(CL_USE_DEPRECATED_OPENCL_2_2_APIS)
505*61046927SAndroid Build Coastguard Worker # define CL_USE_DEPRECATED_OPENCL_2_2_APIS
506*61046927SAndroid Build Coastguard Worker #endif
507*61046927SAndroid Build Coastguard Worker 
508*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
509*61046927SAndroid Build Coastguard Worker 
510*61046927SAndroid Build Coastguard Worker #include <malloc.h>
511*61046927SAndroid Build Coastguard Worker 
512*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_DX_INTEROP)
513*61046927SAndroid Build Coastguard Worker #include <CL/cl_d3d10.h>
514*61046927SAndroid Build Coastguard Worker #include <CL/cl_dx9_media_sharing.h>
515*61046927SAndroid Build Coastguard Worker #endif
516*61046927SAndroid Build Coastguard Worker #endif // _WIN32
517*61046927SAndroid Build Coastguard Worker 
518*61046927SAndroid Build Coastguard Worker #if defined(_MSC_VER)
519*61046927SAndroid Build Coastguard Worker #include <intrin.h>
520*61046927SAndroid Build Coastguard Worker #endif // _MSC_VER
521*61046927SAndroid Build Coastguard Worker 
522*61046927SAndroid Build Coastguard Worker  // Check for a valid C++ version
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker // Need to do both tests here because for some reason __cplusplus is not
525*61046927SAndroid Build Coastguard Worker // updated in visual studio
526*61046927SAndroid Build Coastguard Worker #if (!defined(_MSC_VER) && __cplusplus < 201103L) || (defined(_MSC_VER) && _MSC_VER < 1700)
527*61046927SAndroid Build Coastguard Worker #error Visual studio 2013 or another C++11-supporting compiler required
528*61046927SAndroid Build Coastguard Worker #endif
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker //
531*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_CL_DEVICE_FISSION) || defined(CL_HPP_USE_CL_SUB_GROUPS_KHR)
532*61046927SAndroid Build Coastguard Worker #include <CL/cl_ext.h>
533*61046927SAndroid Build Coastguard Worker #endif
534*61046927SAndroid Build Coastguard Worker 
535*61046927SAndroid Build Coastguard Worker #if defined(__APPLE__) || defined(__MACOSX)
536*61046927SAndroid Build Coastguard Worker #include <OpenCL/opencl.h>
537*61046927SAndroid Build Coastguard Worker #else
538*61046927SAndroid Build Coastguard Worker #include <CL/opencl.h>
539*61046927SAndroid Build Coastguard Worker #endif // !__APPLE__
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker #if (__cplusplus >= 201103L || _MSVC_LANG >= 201103L )
542*61046927SAndroid Build Coastguard Worker #define CL_HPP_NOEXCEPT_ noexcept
543*61046927SAndroid Build Coastguard Worker #else
544*61046927SAndroid Build Coastguard Worker #define CL_HPP_NOEXCEPT_
545*61046927SAndroid Build Coastguard Worker #endif
546*61046927SAndroid Build Coastguard Worker 
547*61046927SAndroid Build Coastguard Worker #if __cplusplus >= 201703L
548*61046927SAndroid Build Coastguard Worker # define CL_HPP_DEFINE_STATIC_MEMBER_ inline
549*61046927SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
550*61046927SAndroid Build Coastguard Worker # define CL_HPP_DEFINE_STATIC_MEMBER_ __declspec(selectany)
551*61046927SAndroid Build Coastguard Worker #elif defined(__MINGW32__)
552*61046927SAndroid Build Coastguard Worker # define CL_HPP_DEFINE_STATIC_MEMBER_ __attribute__((selectany))
553*61046927SAndroid Build Coastguard Worker #else
554*61046927SAndroid Build Coastguard Worker # define CL_HPP_DEFINE_STATIC_MEMBER_ __attribute__((weak))
555*61046927SAndroid Build Coastguard Worker #endif // !_MSC_VER
556*61046927SAndroid Build Coastguard Worker 
557*61046927SAndroid Build Coastguard Worker // Define deprecated prefixes and suffixes to ensure compilation
558*61046927SAndroid Build Coastguard Worker // in case they are not pre-defined
559*61046927SAndroid Build Coastguard Worker #if !defined(CL_API_PREFIX__VERSION_1_1_DEPRECATED)
560*61046927SAndroid Build Coastguard Worker #define CL_API_PREFIX__VERSION_1_1_DEPRECATED
561*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_API_PREFIX__VERSION_1_1_DEPRECATED)
562*61046927SAndroid Build Coastguard Worker #if !defined(CL_API_SUFFIX__VERSION_1_1_DEPRECATED)
563*61046927SAndroid Build Coastguard Worker #define CL_API_SUFFIX__VERSION_1_1_DEPRECATED
564*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_API_SUFFIX__VERSION_1_1_DEPRECATED)
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker #if !defined(CL_API_PREFIX__VERSION_1_2_DEPRECATED)
567*61046927SAndroid Build Coastguard Worker #define CL_API_PREFIX__VERSION_1_2_DEPRECATED
568*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_API_PREFIX__VERSION_1_2_DEPRECATED)
569*61046927SAndroid Build Coastguard Worker #if !defined(CL_API_SUFFIX__VERSION_1_2_DEPRECATED)
570*61046927SAndroid Build Coastguard Worker #define CL_API_SUFFIX__VERSION_1_2_DEPRECATED
571*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_API_SUFFIX__VERSION_1_2_DEPRECATED)
572*61046927SAndroid Build Coastguard Worker 
573*61046927SAndroid Build Coastguard Worker #if !defined(CL_API_PREFIX__VERSION_2_2_DEPRECATED)
574*61046927SAndroid Build Coastguard Worker #define CL_API_PREFIX__VERSION_2_2_DEPRECATED
575*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_API_PREFIX__VERSION_2_2_DEPRECATED)
576*61046927SAndroid Build Coastguard Worker #if !defined(CL_API_SUFFIX__VERSION_2_2_DEPRECATED)
577*61046927SAndroid Build Coastguard Worker #define CL_API_SUFFIX__VERSION_2_2_DEPRECATED
578*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_API_SUFFIX__VERSION_2_2_DEPRECATED)
579*61046927SAndroid Build Coastguard Worker 
580*61046927SAndroid Build Coastguard Worker #if !defined(CL_CALLBACK)
581*61046927SAndroid Build Coastguard Worker #define CL_CALLBACK
582*61046927SAndroid Build Coastguard Worker #endif //CL_CALLBACK
583*61046927SAndroid Build Coastguard Worker 
584*61046927SAndroid Build Coastguard Worker #include <utility>
585*61046927SAndroid Build Coastguard Worker #include <limits>
586*61046927SAndroid Build Coastguard Worker #include <iterator>
587*61046927SAndroid Build Coastguard Worker #include <mutex>
588*61046927SAndroid Build Coastguard Worker #include <cstring>
589*61046927SAndroid Build Coastguard Worker #include <functional>
590*61046927SAndroid Build Coastguard Worker 
591*61046927SAndroid Build Coastguard Worker 
592*61046927SAndroid Build Coastguard Worker // Define a size_type to represent a correctly resolved size_t
593*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_SIZE_T_COMPATIBILITY)
594*61046927SAndroid Build Coastguard Worker namespace cl {
595*61046927SAndroid Build Coastguard Worker     using size_type = ::size_t;
596*61046927SAndroid Build Coastguard Worker } // namespace cl
597*61046927SAndroid Build Coastguard Worker #else // #if defined(CL_HPP_ENABLE_SIZE_T_COMPATIBILITY)
598*61046927SAndroid Build Coastguard Worker namespace cl {
599*61046927SAndroid Build Coastguard Worker     using size_type = size_t;
600*61046927SAndroid Build Coastguard Worker } // namespace cl
601*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_ENABLE_SIZE_T_COMPATIBILITY)
602*61046927SAndroid Build Coastguard Worker 
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
605*61046927SAndroid Build Coastguard Worker #include <exception>
606*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_ENABLE_EXCEPTIONS)
607*61046927SAndroid Build Coastguard Worker 
608*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_VECTOR)
609*61046927SAndroid Build Coastguard Worker #include <vector>
610*61046927SAndroid Build Coastguard Worker namespace cl {
611*61046927SAndroid Build Coastguard Worker     template < class T, class Alloc = std::allocator<T> >
612*61046927SAndroid Build Coastguard Worker     using vector = std::vector<T, Alloc>;
613*61046927SAndroid Build Coastguard Worker } // namespace cl
614*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_NO_STD_VECTOR)
615*61046927SAndroid Build Coastguard Worker 
616*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_STRING)
617*61046927SAndroid Build Coastguard Worker #include <string>
618*61046927SAndroid Build Coastguard Worker namespace cl {
619*61046927SAndroid Build Coastguard Worker     using string = std::string;
620*61046927SAndroid Build Coastguard Worker } // namespace cl
621*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_NO_STD_STRING)
622*61046927SAndroid Build Coastguard Worker 
623*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
624*61046927SAndroid Build Coastguard Worker 
625*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_UNIQUE_PTR)
626*61046927SAndroid Build Coastguard Worker #include <memory>
627*61046927SAndroid Build Coastguard Worker namespace cl {
628*61046927SAndroid Build Coastguard Worker     // Replace unique_ptr and allocate_pointer for internal use
629*61046927SAndroid Build Coastguard Worker     // to allow user to replace them
630*61046927SAndroid Build Coastguard Worker     template<class T, class D>
631*61046927SAndroid Build Coastguard Worker     using pointer = std::unique_ptr<T, D>;
632*61046927SAndroid Build Coastguard Worker } // namespace cl
633*61046927SAndroid Build Coastguard Worker #endif
634*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
635*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_ARRAY)
636*61046927SAndroid Build Coastguard Worker #include <array>
637*61046927SAndroid Build Coastguard Worker namespace cl {
638*61046927SAndroid Build Coastguard Worker     template < class T, size_type N >
639*61046927SAndroid Build Coastguard Worker     using array = std::array<T, N>;
640*61046927SAndroid Build Coastguard Worker } // namespace cl
641*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_NO_STD_ARRAY)
642*61046927SAndroid Build Coastguard Worker 
643*61046927SAndroid Build Coastguard Worker // Define size_type appropriately to allow backward-compatibility
644*61046927SAndroid Build Coastguard Worker // use of the old size_t interface class
645*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_SIZE_T_COMPATIBILITY)
646*61046927SAndroid Build Coastguard Worker namespace cl {
647*61046927SAndroid Build Coastguard Worker     namespace compatibility {
648*61046927SAndroid Build Coastguard Worker         /*! \brief class used to interface between C++ and
649*61046927SAndroid Build Coastguard Worker         *  OpenCL C calls that require arrays of size_t values, whose
650*61046927SAndroid Build Coastguard Worker         *  size is known statically.
651*61046927SAndroid Build Coastguard Worker         */
652*61046927SAndroid Build Coastguard Worker         template <int N>
653*61046927SAndroid Build Coastguard Worker         class size_t
654*61046927SAndroid Build Coastguard Worker         {
655*61046927SAndroid Build Coastguard Worker         private:
656*61046927SAndroid Build Coastguard Worker             size_type data_[N];
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker         public:
659*61046927SAndroid Build Coastguard Worker             //! \brief Initialize size_t to all 0s
size_t()660*61046927SAndroid Build Coastguard Worker             size_t()
661*61046927SAndroid Build Coastguard Worker             {
662*61046927SAndroid Build Coastguard Worker                 for (int i = 0; i < N; ++i) {
663*61046927SAndroid Build Coastguard Worker                     data_[i] = 0;
664*61046927SAndroid Build Coastguard Worker                 }
665*61046927SAndroid Build Coastguard Worker             }
666*61046927SAndroid Build Coastguard Worker 
size_t(const array<size_type,N> & rhs)667*61046927SAndroid Build Coastguard Worker             size_t(const array<size_type, N> &rhs)
668*61046927SAndroid Build Coastguard Worker             {
669*61046927SAndroid Build Coastguard Worker                 for (int i = 0; i < N; ++i) {
670*61046927SAndroid Build Coastguard Worker                     data_[i] = rhs[i];
671*61046927SAndroid Build Coastguard Worker                 }
672*61046927SAndroid Build Coastguard Worker             }
673*61046927SAndroid Build Coastguard Worker 
operator [](int index)674*61046927SAndroid Build Coastguard Worker             size_type& operator[](int index)
675*61046927SAndroid Build Coastguard Worker             {
676*61046927SAndroid Build Coastguard Worker                 return data_[index];
677*61046927SAndroid Build Coastguard Worker             }
678*61046927SAndroid Build Coastguard Worker 
operator [](int index) const679*61046927SAndroid Build Coastguard Worker             const size_type& operator[](int index) const
680*61046927SAndroid Build Coastguard Worker             {
681*61046927SAndroid Build Coastguard Worker                 return data_[index];
682*61046927SAndroid Build Coastguard Worker             }
683*61046927SAndroid Build Coastguard Worker 
684*61046927SAndroid Build Coastguard Worker             //! \brief Conversion operator to T*.
operator size_type*()685*61046927SAndroid Build Coastguard Worker             operator size_type* ()             { return data_; }
686*61046927SAndroid Build Coastguard Worker 
687*61046927SAndroid Build Coastguard Worker             //! \brief Conversion operator to const T*.
operator const size_type*() const688*61046927SAndroid Build Coastguard Worker             operator const size_type* () const { return data_; }
689*61046927SAndroid Build Coastguard Worker 
operator array<size_type,N>() const690*61046927SAndroid Build Coastguard Worker             operator array<size_type, N>() const
691*61046927SAndroid Build Coastguard Worker             {
692*61046927SAndroid Build Coastguard Worker                 array<size_type, N> ret;
693*61046927SAndroid Build Coastguard Worker 
694*61046927SAndroid Build Coastguard Worker                 for (int i = 0; i < N; ++i) {
695*61046927SAndroid Build Coastguard Worker                     ret[i] = data_[i];
696*61046927SAndroid Build Coastguard Worker                 }
697*61046927SAndroid Build Coastguard Worker                 return ret;
698*61046927SAndroid Build Coastguard Worker             }
699*61046927SAndroid Build Coastguard Worker         };
700*61046927SAndroid Build Coastguard Worker     } // namespace compatibility
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker     template<int N>
703*61046927SAndroid Build Coastguard Worker     using size_t = compatibility::size_t<N>;
704*61046927SAndroid Build Coastguard Worker } // namespace cl
705*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_ENABLE_SIZE_T_COMPATIBILITY)
706*61046927SAndroid Build Coastguard Worker 
707*61046927SAndroid Build Coastguard Worker // Helper alias to avoid confusing the macros
708*61046927SAndroid Build Coastguard Worker namespace cl {
709*61046927SAndroid Build Coastguard Worker     namespace detail {
710*61046927SAndroid Build Coastguard Worker         using size_t_array = array<size_type, 3>;
711*61046927SAndroid Build Coastguard Worker     } // namespace detail
712*61046927SAndroid Build Coastguard Worker } // namespace cl
713*61046927SAndroid Build Coastguard Worker 
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker /*! \namespace cl
716*61046927SAndroid Build Coastguard Worker  *
717*61046927SAndroid Build Coastguard Worker  * \brief The OpenCL C++ bindings are defined within this namespace.
718*61046927SAndroid Build Coastguard Worker  *
719*61046927SAndroid Build Coastguard Worker  */
720*61046927SAndroid Build Coastguard Worker namespace cl {
721*61046927SAndroid Build Coastguard Worker     class Memory;
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker #define CL_HPP_INIT_CL_EXT_FCN_PTR_(name) \
724*61046927SAndroid Build Coastguard Worker     if (!pfn_##name) {    \
725*61046927SAndroid Build Coastguard Worker     pfn_##name = (PFN_##name) \
726*61046927SAndroid Build Coastguard Worker     clGetExtensionFunctionAddress(#name); \
727*61046927SAndroid Build Coastguard Worker     if (!pfn_##name) {    \
728*61046927SAndroid Build Coastguard Worker     } \
729*61046927SAndroid Build Coastguard Worker     }
730*61046927SAndroid Build Coastguard Worker 
731*61046927SAndroid Build Coastguard Worker #define CL_HPP_INIT_CL_EXT_FCN_PTR_PLATFORM_(platform, name) \
732*61046927SAndroid Build Coastguard Worker     if (!pfn_##name) {    \
733*61046927SAndroid Build Coastguard Worker     pfn_##name = (PFN_##name) \
734*61046927SAndroid Build Coastguard Worker     clGetExtensionFunctionAddressForPlatform(platform, #name); \
735*61046927SAndroid Build Coastguard Worker     if (!pfn_##name) {    \
736*61046927SAndroid Build Coastguard Worker     } \
737*61046927SAndroid Build Coastguard Worker     }
738*61046927SAndroid Build Coastguard Worker 
739*61046927SAndroid Build Coastguard Worker     class Program;
740*61046927SAndroid Build Coastguard Worker     class Device;
741*61046927SAndroid Build Coastguard Worker     class Context;
742*61046927SAndroid Build Coastguard Worker     class CommandQueue;
743*61046927SAndroid Build Coastguard Worker     class DeviceCommandQueue;
744*61046927SAndroid Build Coastguard Worker     class Memory;
745*61046927SAndroid Build Coastguard Worker     class Buffer;
746*61046927SAndroid Build Coastguard Worker     class Pipe;
747*61046927SAndroid Build Coastguard Worker 
748*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
749*61046927SAndroid Build Coastguard Worker     /*! \brief Exception class
750*61046927SAndroid Build Coastguard Worker      *
751*61046927SAndroid Build Coastguard Worker      *  This may be thrown by API functions when CL_HPP_ENABLE_EXCEPTIONS is defined.
752*61046927SAndroid Build Coastguard Worker      */
753*61046927SAndroid Build Coastguard Worker     class Error : public std::exception
754*61046927SAndroid Build Coastguard Worker     {
755*61046927SAndroid Build Coastguard Worker     private:
756*61046927SAndroid Build Coastguard Worker         cl_int err_;
757*61046927SAndroid Build Coastguard Worker         const char * errStr_;
758*61046927SAndroid Build Coastguard Worker     public:
759*61046927SAndroid Build Coastguard Worker         /*! \brief Create a new CL error exception for a given error code
760*61046927SAndroid Build Coastguard Worker          *  and corresponding message.
761*61046927SAndroid Build Coastguard Worker          *
762*61046927SAndroid Build Coastguard Worker          *  \param err error code value.
763*61046927SAndroid Build Coastguard Worker          *
764*61046927SAndroid Build Coastguard Worker          *  \param errStr a descriptive string that must remain in scope until
765*61046927SAndroid Build Coastguard Worker          *                handling of the exception has concluded.  If set, it
766*61046927SAndroid Build Coastguard Worker          *                will be returned by what().
767*61046927SAndroid Build Coastguard Worker          */
Error(cl_int err,const char * errStr=NULL)768*61046927SAndroid Build Coastguard Worker         Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr)
769*61046927SAndroid Build Coastguard Worker         {}
770*61046927SAndroid Build Coastguard Worker 
~Error()771*61046927SAndroid Build Coastguard Worker         ~Error() throw() {}
772*61046927SAndroid Build Coastguard Worker 
773*61046927SAndroid Build Coastguard Worker         /*! \brief Get error string associated with exception
774*61046927SAndroid Build Coastguard Worker          *
775*61046927SAndroid Build Coastguard Worker          * \return A memory pointer to the error message string.
776*61046927SAndroid Build Coastguard Worker          */
what() const777*61046927SAndroid Build Coastguard Worker         virtual const char * what() const throw ()
778*61046927SAndroid Build Coastguard Worker         {
779*61046927SAndroid Build Coastguard Worker             if (errStr_ == NULL) {
780*61046927SAndroid Build Coastguard Worker                 return "empty";
781*61046927SAndroid Build Coastguard Worker             }
782*61046927SAndroid Build Coastguard Worker             else {
783*61046927SAndroid Build Coastguard Worker                 return errStr_;
784*61046927SAndroid Build Coastguard Worker             }
785*61046927SAndroid Build Coastguard Worker         }
786*61046927SAndroid Build Coastguard Worker 
787*61046927SAndroid Build Coastguard Worker         /*! \brief Get error code associated with exception
788*61046927SAndroid Build Coastguard Worker          *
789*61046927SAndroid Build Coastguard Worker          *  \return The error code.
790*61046927SAndroid Build Coastguard Worker          */
err(void) const791*61046927SAndroid Build Coastguard Worker         cl_int err(void) const { return err_; }
792*61046927SAndroid Build Coastguard Worker     };
793*61046927SAndroid Build Coastguard Worker #define CL_HPP_ERR_STR_(x) #x
794*61046927SAndroid Build Coastguard Worker #else
795*61046927SAndroid Build Coastguard Worker #define CL_HPP_ERR_STR_(x) NULL
796*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_ENABLE_EXCEPTIONS
797*61046927SAndroid Build Coastguard Worker 
798*61046927SAndroid Build Coastguard Worker 
799*61046927SAndroid Build Coastguard Worker namespace detail
800*61046927SAndroid Build Coastguard Worker {
801*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
errHandler(cl_int err,const char * errStr=NULL)802*61046927SAndroid Build Coastguard Worker static inline cl_int errHandler (
803*61046927SAndroid Build Coastguard Worker     cl_int err,
804*61046927SAndroid Build Coastguard Worker     const char * errStr = NULL)
805*61046927SAndroid Build Coastguard Worker {
806*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
807*61046927SAndroid Build Coastguard Worker         throw Error(err, errStr);
808*61046927SAndroid Build Coastguard Worker     }
809*61046927SAndroid Build Coastguard Worker     return err;
810*61046927SAndroid Build Coastguard Worker }
811*61046927SAndroid Build Coastguard Worker #else
812*61046927SAndroid Build Coastguard Worker static inline cl_int errHandler (cl_int err, const char * errStr = NULL)
813*61046927SAndroid Build Coastguard Worker {
814*61046927SAndroid Build Coastguard Worker     (void) errStr; // suppress unused variable warning
815*61046927SAndroid Build Coastguard Worker     return err;
816*61046927SAndroid Build Coastguard Worker }
817*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_ENABLE_EXCEPTIONS
818*61046927SAndroid Build Coastguard Worker }
819*61046927SAndroid Build Coastguard Worker 
820*61046927SAndroid Build Coastguard Worker 
821*61046927SAndroid Build Coastguard Worker 
822*61046927SAndroid Build Coastguard Worker //! \cond DOXYGEN_DETAIL
823*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_USER_OVERRIDE_ERROR_STRINGS)
824*61046927SAndroid Build Coastguard Worker #define __GET_DEVICE_INFO_ERR               CL_HPP_ERR_STR_(clGetDeviceInfo)
825*61046927SAndroid Build Coastguard Worker #define __GET_PLATFORM_INFO_ERR             CL_HPP_ERR_STR_(clGetPlatformInfo)
826*61046927SAndroid Build Coastguard Worker #define __GET_DEVICE_IDS_ERR                CL_HPP_ERR_STR_(clGetDeviceIDs)
827*61046927SAndroid Build Coastguard Worker #define __GET_PLATFORM_IDS_ERR              CL_HPP_ERR_STR_(clGetPlatformIDs)
828*61046927SAndroid Build Coastguard Worker #define __GET_CONTEXT_INFO_ERR              CL_HPP_ERR_STR_(clGetContextInfo)
829*61046927SAndroid Build Coastguard Worker #define __GET_EVENT_INFO_ERR                CL_HPP_ERR_STR_(clGetEventInfo)
830*61046927SAndroid Build Coastguard Worker #define __GET_EVENT_PROFILE_INFO_ERR        CL_HPP_ERR_STR_(clGetEventProfileInfo)
831*61046927SAndroid Build Coastguard Worker #define __GET_MEM_OBJECT_INFO_ERR           CL_HPP_ERR_STR_(clGetMemObjectInfo)
832*61046927SAndroid Build Coastguard Worker #define __GET_IMAGE_INFO_ERR                CL_HPP_ERR_STR_(clGetImageInfo)
833*61046927SAndroid Build Coastguard Worker #define __GET_SAMPLER_INFO_ERR              CL_HPP_ERR_STR_(clGetSamplerInfo)
834*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_INFO_ERR               CL_HPP_ERR_STR_(clGetKernelInfo)
835*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
836*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_ARG_INFO_ERR           CL_HPP_ERR_STR_(clGetKernelArgInfo)
837*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
838*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
839*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_SUB_GROUP_INFO_ERR     CL_HPP_ERR_STR_(clGetKernelSubGroupInfo)
840*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
841*61046927SAndroid Build Coastguard Worker #define __GET_KERNEL_WORK_GROUP_INFO_ERR    CL_HPP_ERR_STR_(clGetKernelWorkGroupInfo)
842*61046927SAndroid Build Coastguard Worker #define __GET_PROGRAM_INFO_ERR              CL_HPP_ERR_STR_(clGetProgramInfo)
843*61046927SAndroid Build Coastguard Worker #define __GET_PROGRAM_BUILD_INFO_ERR        CL_HPP_ERR_STR_(clGetProgramBuildInfo)
844*61046927SAndroid Build Coastguard Worker #define __GET_COMMAND_QUEUE_INFO_ERR        CL_HPP_ERR_STR_(clGetCommandQueueInfo)
845*61046927SAndroid Build Coastguard Worker 
846*61046927SAndroid Build Coastguard Worker #define __CREATE_CONTEXT_ERR                CL_HPP_ERR_STR_(clCreateContext)
847*61046927SAndroid Build Coastguard Worker #define __CREATE_CONTEXT_FROM_TYPE_ERR      CL_HPP_ERR_STR_(clCreateContextFromType)
848*61046927SAndroid Build Coastguard Worker #define __GET_SUPPORTED_IMAGE_FORMATS_ERR   CL_HPP_ERR_STR_(clGetSupportedImageFormats)
849*61046927SAndroid Build Coastguard Worker 
850*61046927SAndroid Build Coastguard Worker #define __CREATE_BUFFER_ERR                 CL_HPP_ERR_STR_(clCreateBuffer)
851*61046927SAndroid Build Coastguard Worker #define __COPY_ERR                          CL_HPP_ERR_STR_(cl::copy)
852*61046927SAndroid Build Coastguard Worker #define __CREATE_SUBBUFFER_ERR              CL_HPP_ERR_STR_(clCreateSubBuffer)
853*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_BUFFER_ERR              CL_HPP_ERR_STR_(clCreateFromGLBuffer)
854*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_RENDER_BUFFER_ERR       CL_HPP_ERR_STR_(clCreateFromGLBuffer)
855*61046927SAndroid Build Coastguard Worker #define __GET_GL_OBJECT_INFO_ERR            CL_HPP_ERR_STR_(clGetGLObjectInfo)
856*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
857*61046927SAndroid Build Coastguard Worker #define __CREATE_IMAGE_ERR                  CL_HPP_ERR_STR_(clCreateImage)
858*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_TEXTURE_ERR             CL_HPP_ERR_STR_(clCreateFromGLTexture)
859*61046927SAndroid Build Coastguard Worker #define __IMAGE_DIMENSION_ERR               CL_HPP_ERR_STR_(Incorrect image dimensions)
860*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
861*61046927SAndroid Build Coastguard Worker #define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR CL_HPP_ERR_STR_(clSetMemObjectDestructorCallback)
862*61046927SAndroid Build Coastguard Worker 
863*61046927SAndroid Build Coastguard Worker #define __CREATE_USER_EVENT_ERR             CL_HPP_ERR_STR_(clCreateUserEvent)
864*61046927SAndroid Build Coastguard Worker #define __SET_USER_EVENT_STATUS_ERR         CL_HPP_ERR_STR_(clSetUserEventStatus)
865*61046927SAndroid Build Coastguard Worker #define __SET_EVENT_CALLBACK_ERR            CL_HPP_ERR_STR_(clSetEventCallback)
866*61046927SAndroid Build Coastguard Worker #define __WAIT_FOR_EVENTS_ERR               CL_HPP_ERR_STR_(clWaitForEvents)
867*61046927SAndroid Build Coastguard Worker 
868*61046927SAndroid Build Coastguard Worker #define __CREATE_KERNEL_ERR                 CL_HPP_ERR_STR_(clCreateKernel)
869*61046927SAndroid Build Coastguard Worker #define __SET_KERNEL_ARGS_ERR               CL_HPP_ERR_STR_(clSetKernelArg)
870*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_SOURCE_ERR    CL_HPP_ERR_STR_(clCreateProgramWithSource)
871*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
872*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_IL_ERR        CL_HPP_ERR_STR_(clCreateProgramWithIL)
873*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
874*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_BINARY_ERR    CL_HPP_ERR_STR_(clCreateProgramWithBinary)
875*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
876*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_IL_ERR        CL_HPP_ERR_STR_(clCreateProgramWithIL)
877*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 210
878*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
879*61046927SAndroid Build Coastguard Worker #define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR    CL_HPP_ERR_STR_(clCreateProgramWithBuiltInKernels)
880*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
881*61046927SAndroid Build Coastguard Worker #define __BUILD_PROGRAM_ERR                 CL_HPP_ERR_STR_(clBuildProgram)
882*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
883*61046927SAndroid Build Coastguard Worker #define __COMPILE_PROGRAM_ERR               CL_HPP_ERR_STR_(clCompileProgram)
884*61046927SAndroid Build Coastguard Worker #define __LINK_PROGRAM_ERR                  CL_HPP_ERR_STR_(clLinkProgram)
885*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
886*61046927SAndroid Build Coastguard Worker #define __CREATE_KERNELS_IN_PROGRAM_ERR     CL_HPP_ERR_STR_(clCreateKernelsInProgram)
887*61046927SAndroid Build Coastguard Worker 
888*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
889*61046927SAndroid Build Coastguard Worker #define __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR          CL_HPP_ERR_STR_(clCreateCommandQueueWithProperties)
890*61046927SAndroid Build Coastguard Worker #define __CREATE_SAMPLER_WITH_PROPERTIES_ERR                CL_HPP_ERR_STR_(clCreateSamplerWithProperties)
891*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
892*61046927SAndroid Build Coastguard Worker #define __SET_COMMAND_QUEUE_PROPERTY_ERR    CL_HPP_ERR_STR_(clSetCommandQueueProperty)
893*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_READ_BUFFER_ERR           CL_HPP_ERR_STR_(clEnqueueReadBuffer)
894*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_READ_BUFFER_RECT_ERR      CL_HPP_ERR_STR_(clEnqueueReadBufferRect)
895*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WRITE_BUFFER_ERR          CL_HPP_ERR_STR_(clEnqueueWriteBuffer)
896*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WRITE_BUFFER_RECT_ERR     CL_HPP_ERR_STR_(clEnqueueWriteBufferRect)
897*61046927SAndroid Build Coastguard Worker #define __ENQEUE_COPY_BUFFER_ERR            CL_HPP_ERR_STR_(clEnqueueCopyBuffer)
898*61046927SAndroid Build Coastguard Worker #define __ENQEUE_COPY_BUFFER_RECT_ERR       CL_HPP_ERR_STR_(clEnqueueCopyBufferRect)
899*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_FILL_BUFFER_ERR           CL_HPP_ERR_STR_(clEnqueueFillBuffer)
900*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_READ_IMAGE_ERR            CL_HPP_ERR_STR_(clEnqueueReadImage)
901*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WRITE_IMAGE_ERR           CL_HPP_ERR_STR_(clEnqueueWriteImage)
902*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_COPY_IMAGE_ERR            CL_HPP_ERR_STR_(clEnqueueCopyImage)
903*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_FILL_IMAGE_ERR            CL_HPP_ERR_STR_(clEnqueueFillImage)
904*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR  CL_HPP_ERR_STR_(clEnqueueCopyImageToBuffer)
905*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR  CL_HPP_ERR_STR_(clEnqueueCopyBufferToImage)
906*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MAP_BUFFER_ERR            CL_HPP_ERR_STR_(clEnqueueMapBuffer)
907*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MAP_IMAGE_ERR             CL_HPP_ERR_STR_(clEnqueueMapImage)
908*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_UNMAP_MEM_OBJECT_ERR      CL_HPP_ERR_STR_(clEnqueueUnMapMemObject)
909*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_NDRANGE_KERNEL_ERR        CL_HPP_ERR_STR_(clEnqueueNDRangeKernel)
910*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_NATIVE_KERNEL             CL_HPP_ERR_STR_(clEnqueueNativeKernel)
911*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
912*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR   CL_HPP_ERR_STR_(clEnqueueMigrateMemObjects)
913*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
914*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
915*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MIGRATE_SVM_ERR   CL_HPP_ERR_STR_(clEnqueueSVMMigrateMem)
916*61046927SAndroid Build Coastguard Worker #define __SET_DEFAULT_DEVICE_COMMAND_QUEUE_ERR   CL_HPP_ERR_STR_(clSetDefaultDeviceCommandQueue)
917*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 210
918*61046927SAndroid Build Coastguard Worker 
919*61046927SAndroid Build Coastguard Worker 
920*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_ACQUIRE_GL_ERR            CL_HPP_ERR_STR_(clEnqueueAcquireGLObjects)
921*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_RELEASE_GL_ERR            CL_HPP_ERR_STR_(clEnqueueReleaseGLObjects)
922*61046927SAndroid Build Coastguard Worker 
923*61046927SAndroid Build Coastguard Worker #define __CREATE_PIPE_ERR             CL_HPP_ERR_STR_(clCreatePipe)
924*61046927SAndroid Build Coastguard Worker #define __GET_PIPE_INFO_ERR           CL_HPP_ERR_STR_(clGetPipeInfo)
925*61046927SAndroid Build Coastguard Worker 
926*61046927SAndroid Build Coastguard Worker 
927*61046927SAndroid Build Coastguard Worker #define __RETAIN_ERR                        CL_HPP_ERR_STR_(Retain Object)
928*61046927SAndroid Build Coastguard Worker #define __RELEASE_ERR                       CL_HPP_ERR_STR_(Release Object)
929*61046927SAndroid Build Coastguard Worker #define __FLUSH_ERR                         CL_HPP_ERR_STR_(clFlush)
930*61046927SAndroid Build Coastguard Worker #define __FINISH_ERR                        CL_HPP_ERR_STR_(clFinish)
931*61046927SAndroid Build Coastguard Worker #define __VECTOR_CAPACITY_ERR               CL_HPP_ERR_STR_(Vector capacity error)
932*61046927SAndroid Build Coastguard Worker 
933*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
934*61046927SAndroid Build Coastguard Worker #define __GET_HOST_TIMER_ERR           CL_HPP_ERR_STR_(clGetHostTimer)
935*61046927SAndroid Build Coastguard Worker #define __GET_DEVICE_AND_HOST_TIMER_ERR           CL_HPP_ERR_STR_(clGetDeviceAndHostTimer)
936*61046927SAndroid Build Coastguard Worker #endif
937*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 220
938*61046927SAndroid Build Coastguard Worker #define __SET_PROGRAM_RELEASE_CALLBACK_ERR          CL_HPP_ERR_STR_(clSetProgramReleaseCallback)
939*61046927SAndroid Build Coastguard Worker #define __SET_PROGRAM_SPECIALIZATION_CONSTANT_ERR   CL_HPP_ERR_STR_(clSetProgramSpecializationConstant)
940*61046927SAndroid Build Coastguard Worker #endif
941*61046927SAndroid Build Coastguard Worker 
942*61046927SAndroid Build Coastguard Worker 
943*61046927SAndroid Build Coastguard Worker /**
944*61046927SAndroid Build Coastguard Worker  * CL 1.2 version that uses device fission.
945*61046927SAndroid Build Coastguard Worker  */
946*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
947*61046927SAndroid Build Coastguard Worker #define __CREATE_SUB_DEVICES_ERR            CL_HPP_ERR_STR_(clCreateSubDevices)
948*61046927SAndroid Build Coastguard Worker #else
949*61046927SAndroid Build Coastguard Worker #define __CREATE_SUB_DEVICES_ERR            CL_HPP_ERR_STR_(clCreateSubDevicesEXT)
950*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
951*61046927SAndroid Build Coastguard Worker 
952*61046927SAndroid Build Coastguard Worker /**
953*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
954*61046927SAndroid Build Coastguard Worker  */
955*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
956*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MARKER_ERR                CL_HPP_ERR_STR_(clEnqueueMarker)
957*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_WAIT_FOR_EVENTS_ERR       CL_HPP_ERR_STR_(clEnqueueWaitForEvents)
958*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_BARRIER_ERR               CL_HPP_ERR_STR_(clEnqueueBarrier)
959*61046927SAndroid Build Coastguard Worker #define __UNLOAD_COMPILER_ERR               CL_HPP_ERR_STR_(clUnloadCompiler)
960*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_TEXTURE_2D_ERR          CL_HPP_ERR_STR_(clCreateFromGLTexture2D)
961*61046927SAndroid Build Coastguard Worker #define __CREATE_GL_TEXTURE_3D_ERR          CL_HPP_ERR_STR_(clCreateFromGLTexture3D)
962*61046927SAndroid Build Coastguard Worker #define __CREATE_IMAGE2D_ERR                CL_HPP_ERR_STR_(clCreateImage2D)
963*61046927SAndroid Build Coastguard Worker #define __CREATE_IMAGE3D_ERR                CL_HPP_ERR_STR_(clCreateImage3D)
964*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
965*61046927SAndroid Build Coastguard Worker 
966*61046927SAndroid Build Coastguard Worker /**
967*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 2.0
968*61046927SAndroid Build Coastguard Worker  */
969*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
970*61046927SAndroid Build Coastguard Worker #define __CREATE_COMMAND_QUEUE_ERR          CL_HPP_ERR_STR_(clCreateCommandQueue)
971*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_TASK_ERR                  CL_HPP_ERR_STR_(clEnqueueTask)
972*61046927SAndroid Build Coastguard Worker #define __CREATE_SAMPLER_ERR                CL_HPP_ERR_STR_(clCreateSampler)
973*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
974*61046927SAndroid Build Coastguard Worker 
975*61046927SAndroid Build Coastguard Worker /**
976*61046927SAndroid Build Coastguard Worker  * CL 1.2 marker and barrier commands
977*61046927SAndroid Build Coastguard Worker  */
978*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
979*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_MARKER_WAIT_LIST_ERR                CL_HPP_ERR_STR_(clEnqueueMarkerWithWaitList)
980*61046927SAndroid Build Coastguard Worker #define __ENQUEUE_BARRIER_WAIT_LIST_ERR               CL_HPP_ERR_STR_(clEnqueueBarrierWithWaitList)
981*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
982*61046927SAndroid Build Coastguard Worker 
983*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
984*61046927SAndroid Build Coastguard Worker #define __CLONE_KERNEL_ERR     CL_HPP_ERR_STR_(clCloneKernel)
985*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 210
986*61046927SAndroid Build Coastguard Worker 
987*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_USER_OVERRIDE_ERROR_STRINGS
988*61046927SAndroid Build Coastguard Worker //! \endcond
989*61046927SAndroid Build Coastguard Worker 
990*61046927SAndroid Build Coastguard Worker 
991*61046927SAndroid Build Coastguard Worker namespace detail {
992*61046927SAndroid Build Coastguard Worker 
993*61046927SAndroid Build Coastguard Worker // Generic getInfoHelper. The final parameter is used to guide overload
994*61046927SAndroid Build Coastguard Worker // resolution: the actual parameter passed is an int, which makes this
995*61046927SAndroid Build Coastguard Worker // a worse conversion sequence than a specialization that declares the
996*61046927SAndroid Build Coastguard Worker // parameter as an int.
997*61046927SAndroid Build Coastguard Worker template<typename Functor, typename T>
getInfoHelper(Functor f,cl_uint name,T * param,long)998*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)
999*61046927SAndroid Build Coastguard Worker {
1000*61046927SAndroid Build Coastguard Worker     return f(name, sizeof(T), param, NULL);
1001*61046927SAndroid Build Coastguard Worker }
1002*61046927SAndroid Build Coastguard Worker 
1003*61046927SAndroid Build Coastguard Worker // Specialized for getInfo<CL_PROGRAM_BINARIES>
1004*61046927SAndroid Build Coastguard Worker // Assumes that the output vector was correctly resized on the way in
1005*61046927SAndroid Build Coastguard Worker template <typename Func>
getInfoHelper(Func f,cl_uint name,vector<vector<unsigned char>> * param,int)1006*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, vector<vector<unsigned char>>* param, int)
1007*61046927SAndroid Build Coastguard Worker {
1008*61046927SAndroid Build Coastguard Worker     if (name != CL_PROGRAM_BINARIES) {
1009*61046927SAndroid Build Coastguard Worker         return CL_INVALID_VALUE;
1010*61046927SAndroid Build Coastguard Worker     }
1011*61046927SAndroid Build Coastguard Worker     if (param) {
1012*61046927SAndroid Build Coastguard Worker         // Create array of pointers, calculate total size and pass pointer array in
1013*61046927SAndroid Build Coastguard Worker         size_type numBinaries = param->size();
1014*61046927SAndroid Build Coastguard Worker         vector<unsigned char*> binariesPointers(numBinaries);
1015*61046927SAndroid Build Coastguard Worker 
1016*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < numBinaries; ++i)
1017*61046927SAndroid Build Coastguard Worker         {
1018*61046927SAndroid Build Coastguard Worker             binariesPointers[i] = (*param)[i].data();
1019*61046927SAndroid Build Coastguard Worker         }
1020*61046927SAndroid Build Coastguard Worker 
1021*61046927SAndroid Build Coastguard Worker         cl_int err = f(name, numBinaries * sizeof(unsigned char*), binariesPointers.data(), NULL);
1022*61046927SAndroid Build Coastguard Worker 
1023*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
1024*61046927SAndroid Build Coastguard Worker             return err;
1025*61046927SAndroid Build Coastguard Worker         }
1026*61046927SAndroid Build Coastguard Worker     }
1027*61046927SAndroid Build Coastguard Worker 
1028*61046927SAndroid Build Coastguard Worker 
1029*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1030*61046927SAndroid Build Coastguard Worker }
1031*61046927SAndroid Build Coastguard Worker 
1032*61046927SAndroid Build Coastguard Worker // Specialized getInfoHelper for vector params
1033*61046927SAndroid Build Coastguard Worker template <typename Func, typename T>
getInfoHelper(Func f,cl_uint name,vector<T> * param,long)1034*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, vector<T>* param, long)
1035*61046927SAndroid Build Coastguard Worker {
1036*61046927SAndroid Build Coastguard Worker     size_type required;
1037*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1038*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1039*61046927SAndroid Build Coastguard Worker         return err;
1040*61046927SAndroid Build Coastguard Worker     }
1041*61046927SAndroid Build Coastguard Worker     const size_type elements = required / sizeof(T);
1042*61046927SAndroid Build Coastguard Worker 
1043*61046927SAndroid Build Coastguard Worker     // Temporary to avoid changing param on an error
1044*61046927SAndroid Build Coastguard Worker     vector<T> localData(elements);
1045*61046927SAndroid Build Coastguard Worker     err = f(name, required, localData.data(), NULL);
1046*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1047*61046927SAndroid Build Coastguard Worker         return err;
1048*61046927SAndroid Build Coastguard Worker     }
1049*61046927SAndroid Build Coastguard Worker     if (param) {
1050*61046927SAndroid Build Coastguard Worker         *param = std::move(localData);
1051*61046927SAndroid Build Coastguard Worker     }
1052*61046927SAndroid Build Coastguard Worker 
1053*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1054*61046927SAndroid Build Coastguard Worker }
1055*61046927SAndroid Build Coastguard Worker 
1056*61046927SAndroid Build Coastguard Worker /* Specialization for reference-counted types. This depends on the
1057*61046927SAndroid Build Coastguard Worker  * existence of Wrapper<T>::cl_type, and none of the other types having the
1058*61046927SAndroid Build Coastguard Worker  * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1059*61046927SAndroid Build Coastguard Worker  * does not work, because when using a derived type (e.g. Context) the generic
1060*61046927SAndroid Build Coastguard Worker  * template will provide a better match.
1061*61046927SAndroid Build Coastguard Worker  */
1062*61046927SAndroid Build Coastguard Worker template <typename Func, typename T>
getInfoHelper(Func f,cl_uint name,vector<T> * param,int,typename T::cl_type=0)1063*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(
1064*61046927SAndroid Build Coastguard Worker     Func f, cl_uint name, vector<T>* param, int, typename T::cl_type = 0)
1065*61046927SAndroid Build Coastguard Worker {
1066*61046927SAndroid Build Coastguard Worker     size_type required;
1067*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1068*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1069*61046927SAndroid Build Coastguard Worker         return err;
1070*61046927SAndroid Build Coastguard Worker     }
1071*61046927SAndroid Build Coastguard Worker 
1072*61046927SAndroid Build Coastguard Worker     const size_type elements = required / sizeof(typename T::cl_type);
1073*61046927SAndroid Build Coastguard Worker 
1074*61046927SAndroid Build Coastguard Worker     vector<typename T::cl_type> value(elements);
1075*61046927SAndroid Build Coastguard Worker     err = f(name, required, value.data(), NULL);
1076*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1077*61046927SAndroid Build Coastguard Worker         return err;
1078*61046927SAndroid Build Coastguard Worker     }
1079*61046927SAndroid Build Coastguard Worker 
1080*61046927SAndroid Build Coastguard Worker     if (param) {
1081*61046927SAndroid Build Coastguard Worker         // Assign to convert CL type to T for each element
1082*61046927SAndroid Build Coastguard Worker         param->resize(elements);
1083*61046927SAndroid Build Coastguard Worker 
1084*61046927SAndroid Build Coastguard Worker         // Assign to param, constructing with retain behaviour
1085*61046927SAndroid Build Coastguard Worker         // to correctly capture each underlying CL object
1086*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < elements; i++) {
1087*61046927SAndroid Build Coastguard Worker             (*param)[i] = T(value[i], true);
1088*61046927SAndroid Build Coastguard Worker         }
1089*61046927SAndroid Build Coastguard Worker     }
1090*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1091*61046927SAndroid Build Coastguard Worker }
1092*61046927SAndroid Build Coastguard Worker 
1093*61046927SAndroid Build Coastguard Worker // Specialized GetInfoHelper for string params
1094*61046927SAndroid Build Coastguard Worker template <typename Func>
getInfoHelper(Func f,cl_uint name,string * param,long)1095*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, string* param, long)
1096*61046927SAndroid Build Coastguard Worker {
1097*61046927SAndroid Build Coastguard Worker     size_type required;
1098*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1099*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1100*61046927SAndroid Build Coastguard Worker         return err;
1101*61046927SAndroid Build Coastguard Worker     }
1102*61046927SAndroid Build Coastguard Worker 
1103*61046927SAndroid Build Coastguard Worker     // std::string has a constant data member
1104*61046927SAndroid Build Coastguard Worker     // a char vector does not
1105*61046927SAndroid Build Coastguard Worker     if (required > 0) {
1106*61046927SAndroid Build Coastguard Worker         vector<char> value(required);
1107*61046927SAndroid Build Coastguard Worker         err = f(name, required, value.data(), NULL);
1108*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
1109*61046927SAndroid Build Coastguard Worker             return err;
1110*61046927SAndroid Build Coastguard Worker         }
1111*61046927SAndroid Build Coastguard Worker         if (param) {
1112*61046927SAndroid Build Coastguard Worker             param->assign(begin(value), prev(end(value)));
1113*61046927SAndroid Build Coastguard Worker         }
1114*61046927SAndroid Build Coastguard Worker     }
1115*61046927SAndroid Build Coastguard Worker     else if (param) {
1116*61046927SAndroid Build Coastguard Worker         param->assign("");
1117*61046927SAndroid Build Coastguard Worker     }
1118*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1119*61046927SAndroid Build Coastguard Worker }
1120*61046927SAndroid Build Coastguard Worker 
1121*61046927SAndroid Build Coastguard Worker // Specialized GetInfoHelper for clsize_t params
1122*61046927SAndroid Build Coastguard Worker template <typename Func, size_type N>
getInfoHelper(Func f,cl_uint name,array<size_type,N> * param,long)1123*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, array<size_type, N>* param, long)
1124*61046927SAndroid Build Coastguard Worker {
1125*61046927SAndroid Build Coastguard Worker     size_type required;
1126*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, 0, NULL, &required);
1127*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1128*61046927SAndroid Build Coastguard Worker         return err;
1129*61046927SAndroid Build Coastguard Worker     }
1130*61046927SAndroid Build Coastguard Worker 
1131*61046927SAndroid Build Coastguard Worker     size_type elements = required / sizeof(size_type);
1132*61046927SAndroid Build Coastguard Worker     vector<size_type> value(elements, 0);
1133*61046927SAndroid Build Coastguard Worker 
1134*61046927SAndroid Build Coastguard Worker     err = f(name, required, value.data(), NULL);
1135*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1136*61046927SAndroid Build Coastguard Worker         return err;
1137*61046927SAndroid Build Coastguard Worker     }
1138*61046927SAndroid Build Coastguard Worker 
1139*61046927SAndroid Build Coastguard Worker     // Bound the copy with N to prevent overruns
1140*61046927SAndroid Build Coastguard Worker     // if passed N > than the amount copied
1141*61046927SAndroid Build Coastguard Worker     if (elements > N) {
1142*61046927SAndroid Build Coastguard Worker         elements = N;
1143*61046927SAndroid Build Coastguard Worker     }
1144*61046927SAndroid Build Coastguard Worker     for (size_type i = 0; i < elements; ++i) {
1145*61046927SAndroid Build Coastguard Worker         (*param)[i] = value[i];
1146*61046927SAndroid Build Coastguard Worker     }
1147*61046927SAndroid Build Coastguard Worker 
1148*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1149*61046927SAndroid Build Coastguard Worker }
1150*61046927SAndroid Build Coastguard Worker 
1151*61046927SAndroid Build Coastguard Worker template<typename T> struct ReferenceHandler;
1152*61046927SAndroid Build Coastguard Worker 
1153*61046927SAndroid Build Coastguard Worker /* Specialization for reference-counted types. This depends on the
1154*61046927SAndroid Build Coastguard Worker  * existence of Wrapper<T>::cl_type, and none of the other types having the
1155*61046927SAndroid Build Coastguard Worker  * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1156*61046927SAndroid Build Coastguard Worker  * does not work, because when using a derived type (e.g. Context) the generic
1157*61046927SAndroid Build Coastguard Worker  * template will provide a better match.
1158*61046927SAndroid Build Coastguard Worker  */
1159*61046927SAndroid Build Coastguard Worker template<typename Func, typename T>
getInfoHelper(Func f,cl_uint name,T * param,int,typename T::cl_type=0)1160*61046927SAndroid Build Coastguard Worker inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)
1161*61046927SAndroid Build Coastguard Worker {
1162*61046927SAndroid Build Coastguard Worker     typename T::cl_type value;
1163*61046927SAndroid Build Coastguard Worker     cl_int err = f(name, sizeof(value), &value, NULL);
1164*61046927SAndroid Build Coastguard Worker     if (err != CL_SUCCESS) {
1165*61046927SAndroid Build Coastguard Worker         return err;
1166*61046927SAndroid Build Coastguard Worker     }
1167*61046927SAndroid Build Coastguard Worker     *param = value;
1168*61046927SAndroid Build Coastguard Worker     if (value != NULL)
1169*61046927SAndroid Build Coastguard Worker     {
1170*61046927SAndroid Build Coastguard Worker         err = param->retain();
1171*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
1172*61046927SAndroid Build Coastguard Worker             return err;
1173*61046927SAndroid Build Coastguard Worker         }
1174*61046927SAndroid Build Coastguard Worker     }
1175*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
1176*61046927SAndroid Build Coastguard Worker }
1177*61046927SAndroid Build Coastguard Worker 
1178*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_1_0_(F) \
1179*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_PROFILE, string) \
1180*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_VERSION, string) \
1181*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_NAME, string) \
1182*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_VENDOR, string) \
1183*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_EXTENSIONS, string) \
1184*61046927SAndroid Build Coastguard Worker     \
1185*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \
1186*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \
1187*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \
1188*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \
1189*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, size_type) \
1190*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, cl::vector<size_type>) \
1191*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \
1192*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \
1193*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \
1194*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \
1195*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \
1196*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \
1197*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \
1198*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \
1199*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \
1200*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \
1201*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \
1202*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, size_type) \
1203*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, size_type) \
1204*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, size_type) \
1205*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, size_type) \
1206*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, size_type) \
1207*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \
1208*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, size_type) \
1209*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \
1210*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \
1211*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \
1212*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \
1213*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \
1214*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \
1215*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \
1216*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\
1217*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \
1218*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \
1219*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \
1220*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \
1221*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \
1222*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \
1223*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \
1224*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, size_type) \
1225*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \
1226*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \
1227*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \
1228*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \
1229*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \
1230*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NAME, string) \
1231*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_VENDOR, string) \
1232*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DRIVER_VERSION, string) \
1233*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PROFILE, string) \
1234*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_VERSION, string) \
1235*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_EXTENSIONS, string) \
1236*61046927SAndroid Build Coastguard Worker     \
1237*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \
1238*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_DEVICES, cl::vector<Device>) \
1239*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_PROPERTIES, cl::vector<cl_context_properties>) \
1240*61046927SAndroid Build Coastguard Worker     \
1241*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \
1242*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \
1243*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \
1244*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_int) \
1245*61046927SAndroid Build Coastguard Worker     \
1246*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \
1247*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \
1248*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \
1249*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \
1250*61046927SAndroid Build Coastguard Worker     \
1251*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \
1252*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \
1253*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_SIZE, size_type) \
1254*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_HOST_PTR, void*) \
1255*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \
1256*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \
1257*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \
1258*61046927SAndroid Build Coastguard Worker     \
1259*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \
1260*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, size_type) \
1261*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_ROW_PITCH, size_type) \
1262*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_SLICE_PITCH, size_type) \
1263*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_WIDTH, size_type) \
1264*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_HEIGHT, size_type) \
1265*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_DEPTH, size_type) \
1266*61046927SAndroid Build Coastguard Worker     \
1267*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \
1268*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \
1269*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_bool) \
1270*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_addressing_mode) \
1271*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_filter_mode) \
1272*61046927SAndroid Build Coastguard Worker     \
1273*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \
1274*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \
1275*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \
1276*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_DEVICES, cl::vector<Device>) \
1277*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_SOURCE, string) \
1278*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_BINARY_SIZES, cl::vector<size_type>) \
1279*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_BINARIES, cl::vector<cl::vector<unsigned char>>) \
1280*61046927SAndroid Build Coastguard Worker     \
1281*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \
1282*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, string) \
1283*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, string) \
1284*61046927SAndroid Build Coastguard Worker     \
1285*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, string) \
1286*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \
1287*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \
1288*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \
1289*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \
1290*61046927SAndroid Build Coastguard Worker     \
1291*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, size_type) \
1292*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::detail::size_t_array) \
1293*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \
1294*61046927SAndroid Build Coastguard Worker     \
1295*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \
1296*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \
1297*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \
1298*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties)
1299*61046927SAndroid Build Coastguard Worker 
1300*61046927SAndroid Build Coastguard Worker 
1301*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_1_1_(F) \
1302*61046927SAndroid Build Coastguard Worker     F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\
1303*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \
1304*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \
1305*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \
1306*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \
1307*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \
1308*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \
1309*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \
1310*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \
1311*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, string) \
1312*61046927SAndroid Build Coastguard Worker     \
1313*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \
1314*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_OFFSET, size_type) \
1315*61046927SAndroid Build Coastguard Worker     \
1316*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, size_type) \
1317*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \
1318*61046927SAndroid Build Coastguard Worker     \
1319*61046927SAndroid Build Coastguard Worker     F(cl_event_info, CL_EVENT_CONTEXT, cl::Context)
1320*61046927SAndroid Build Coastguard Worker 
1321*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_1_2_(F) \
1322*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_NUM_KERNELS, size_type) \
1323*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, string) \
1324*61046927SAndroid Build Coastguard Worker     \
1325*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \
1326*61046927SAndroid Build Coastguard Worker     \
1327*61046927SAndroid Build Coastguard Worker     F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, string) \
1328*61046927SAndroid Build Coastguard Worker     \
1329*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \
1330*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \
1331*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, string) \
1332*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, string) \
1333*61046927SAndroid Build Coastguard Worker     F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_QUALIFIER, cl_kernel_arg_type_qualifier) \
1334*61046927SAndroid Build Coastguard Worker     \
1335*61046927SAndroid Build Coastguard Worker     F(cl_kernel_work_group_info, CL_KERNEL_GLOBAL_WORK_SIZE, cl::detail::size_t_array) \
1336*61046927SAndroid Build Coastguard Worker     \
1337*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LINKER_AVAILABLE, cl_bool) \
1338*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_MAX_BUFFER_SIZE, size_type) \
1339*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_MAX_ARRAY_SIZE, size_type) \
1340*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl::Device) \
1341*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_MAX_SUB_DEVICES, cl_uint) \
1342*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, cl::vector<cl_device_partition_property>) \
1343*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_TYPE, cl::vector<cl_device_partition_property>)  \
1344*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint) \
1345*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, cl_bool) \
1346*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \
1347*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, string) \
1348*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PRINTF_BUFFER_SIZE, size_type) \
1349*61046927SAndroid Build Coastguard Worker     \
1350*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_ARRAY_SIZE, size_type) \
1351*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_NUM_MIP_LEVELS, cl_uint) \
1352*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_NUM_SAMPLES, cl_uint)
1353*61046927SAndroid Build Coastguard Worker 
1354*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_2_0_(F) \
1355*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_QUEUE_ON_HOST_PROPERTIES, cl_command_queue_properties) \
1356*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES, cl_command_queue_properties) \
1357*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE, cl_uint) \
1358*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE, cl_uint) \
1359*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_ON_DEVICE_QUEUES, cl_uint) \
1360*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_ON_DEVICE_EVENTS, cl_uint) \
1361*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_PIPE_ARGS, cl_uint) \
1362*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS, cl_uint) \
1363*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PIPE_MAX_PACKET_SIZE, cl_uint) \
1364*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_SVM_CAPABILITIES, cl_device_svm_capabilities) \
1365*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT, cl_uint) \
1366*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT, cl_uint) \
1367*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT, cl_uint) \
1368*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_PITCH_ALIGNMENT, cl_uint) \
1369*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT, cl_uint) \
1370*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS, cl_uint ) \
1371*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE, size_type ) \
1372*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE, size_type ) \
1373*61046927SAndroid Build Coastguard Worker     F(cl_profiling_info, CL_PROFILING_COMMAND_COMPLETE, cl_ulong) \
1374*61046927SAndroid Build Coastguard Worker     F(cl_kernel_exec_info, CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM, cl_bool) \
1375*61046927SAndroid Build Coastguard Worker     F(cl_kernel_exec_info, CL_KERNEL_EXEC_INFO_SVM_PTRS, void**) \
1376*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_SIZE, cl_uint) \
1377*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_USES_SVM_POINTER, cl_bool) \
1378*61046927SAndroid Build Coastguard Worker     F(cl_program_build_info, CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE, size_type) \
1379*61046927SAndroid Build Coastguard Worker     F(cl_pipe_info, CL_PIPE_PACKET_SIZE, cl_uint) \
1380*61046927SAndroid Build Coastguard Worker     F(cl_pipe_info, CL_PIPE_MAX_PACKETS, cl_uint)
1381*61046927SAndroid Build Coastguard Worker 
1382*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_SUBGROUP_KHR_(F) \
1383*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE_KHR, size_type) \
1384*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE_KHR, size_type)
1385*61046927SAndroid Build Coastguard Worker 
1386*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_IL_KHR_(F) \
1387*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IL_VERSION_KHR, string) \
1388*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_IL_KHR, cl::vector<unsigned char>)
1389*61046927SAndroid Build Coastguard Worker 
1390*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_2_1_(F) \
1391*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_HOST_TIMER_RESOLUTION, cl_ulong) \
1392*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_IL, cl::vector<unsigned char>) \
1393*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_MAX_NUM_SUB_GROUPS, cl_uint) \
1394*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_IL_VERSION, string) \
1395*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS, cl_bool) \
1396*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_DEVICE_DEFAULT, cl::DeviceCommandQueue) \
1397*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE, size_type) \
1398*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE, size_type) \
1399*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_LOCAL_SIZE_FOR_SUB_GROUP_COUNT, cl::detail::size_t_array) \
1400*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_MAX_NUM_SUB_GROUPS, size_type) \
1401*61046927SAndroid Build Coastguard Worker     F(cl_kernel_sub_group_info, CL_KERNEL_COMPILE_NUM_SUB_GROUPS, size_type)
1402*61046927SAndroid Build Coastguard Worker 
1403*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_2_2_(F) \
1404*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_SCOPE_GLOBAL_CTORS_PRESENT, cl_bool) \
1405*61046927SAndroid Build Coastguard Worker     F(cl_program_info, CL_PROGRAM_SCOPE_GLOBAL_DTORS_PRESENT, cl_bool)
1406*61046927SAndroid Build Coastguard Worker 
1407*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_DEVICE_FISSION_(F) \
1408*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \
1409*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, cl::vector<cl_device_partition_property_ext>) \
1410*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, cl::vector<cl_device_partition_property_ext>) \
1411*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \
1412*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, cl::vector<cl_device_partition_property_ext>)
1413*61046927SAndroid Build Coastguard Worker 
1414*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_CL_KHR_EXTENDED_VERSIONING_CL3_SHARED_(F) \
1415*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_NUMERIC_VERSION_KHR, cl_version_khr) \
1416*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_EXTENSIONS_WITH_VERSION_KHR, cl::vector<cl_name_version_khr>) \
1417*61046927SAndroid Build Coastguard Worker     \
1418*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NUMERIC_VERSION_KHR, cl_version_khr) \
1419*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_EXTENSIONS_WITH_VERSION_KHR, cl::vector<cl_name_version_khr>) \
1420*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ILS_WITH_VERSION_KHR, cl::vector<cl_name_version_khr>) \
1421*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION_KHR, cl::vector<cl_name_version_khr>)
1422*61046927SAndroid Build Coastguard Worker 
1423*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_CL_KHR_EXTENDED_VERSIONING_KHRONLY_(F) \
1424*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_OPENCL_C_NUMERIC_VERSION_KHR, cl_version_khr)
1425*61046927SAndroid Build Coastguard Worker 
1426*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_3_0_(F) \
1427*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_NUMERIC_VERSION, cl_version) \
1428*61046927SAndroid Build Coastguard Worker     F(cl_platform_info, CL_PLATFORM_EXTENSIONS_WITH_VERSION, cl::vector<cl_name_version>) \
1429*61046927SAndroid Build Coastguard Worker     \
1430*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NUMERIC_VERSION, cl_version) \
1431*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_EXTENSIONS_WITH_VERSION, cl::vector<cl_name_version>) \
1432*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ILS_WITH_VERSION, cl::vector<cl_name_version>) \
1433*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION, cl::vector<cl_name_version>) \
1434*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES, cl_device_atomic_capabilities) \
1435*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_ATOMIC_FENCE_CAPABILITIES, cl_device_atomic_capabilities) \
1436*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT, cl_bool) \
1437*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_OPENCL_C_ALL_VERSIONS, cl::vector<cl_name_version>) \
1438*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, size_type) \
1439*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT, cl_bool) \
1440*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT, cl_bool) \
1441*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_OPENCL_C_FEATURES, cl::vector<cl_name_version>) \
1442*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES, cl_device_device_enqueue_capabilities) \
1443*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_PIPE_SUPPORT, cl_bool) \
1444*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED, string) \
1445*61046927SAndroid Build Coastguard Worker     \
1446*61046927SAndroid Build Coastguard Worker     F(cl_command_queue_info, CL_QUEUE_PROPERTIES_ARRAY, cl::vector<cl_queue_properties>) \
1447*61046927SAndroid Build Coastguard Worker     F(cl_mem_info, CL_MEM_PROPERTIES, cl::vector<cl_mem_properties>) \
1448*61046927SAndroid Build Coastguard Worker     F(cl_pipe_info, CL_PIPE_PROPERTIES, cl::vector<cl_pipe_properties>) \
1449*61046927SAndroid Build Coastguard Worker     F(cl_sampler_info, CL_SAMPLER_PROPERTIES, cl::vector<cl_sampler_properties>)
1450*61046927SAndroid Build Coastguard Worker 
1451*61046927SAndroid Build Coastguard Worker template <typename enum_type, cl_int Name>
1452*61046927SAndroid Build Coastguard Worker struct param_traits {};
1453*61046927SAndroid Build Coastguard Worker 
1454*61046927SAndroid Build Coastguard Worker #define CL_HPP_DECLARE_PARAM_TRAITS_(token, param_name, T) \
1455*61046927SAndroid Build Coastguard Worker struct token;                                        \
1456*61046927SAndroid Build Coastguard Worker template<>                                           \
1457*61046927SAndroid Build Coastguard Worker struct param_traits<detail:: token,param_name>       \
1458*61046927SAndroid Build Coastguard Worker {                                                    \
1459*61046927SAndroid Build Coastguard Worker     enum { value = param_name };                     \
1460*61046927SAndroid Build Coastguard Worker     typedef T param_type;                            \
1461*61046927SAndroid Build Coastguard Worker };
1462*61046927SAndroid Build Coastguard Worker 
1463*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_1_0_(CL_HPP_DECLARE_PARAM_TRAITS_)
1464*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
1465*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_1_1_(CL_HPP_DECLARE_PARAM_TRAITS_)
1466*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
1467*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
1468*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_1_2_(CL_HPP_DECLARE_PARAM_TRAITS_)
1469*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
1470*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
1471*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_2_0_(CL_HPP_DECLARE_PARAM_TRAITS_)
1472*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
1473*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
1474*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_2_1_(CL_HPP_DECLARE_PARAM_TRAITS_)
1475*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 210
1476*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 220
1477*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_2_2_(CL_HPP_DECLARE_PARAM_TRAITS_)
1478*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 220
1479*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 300
1480*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_3_0_(CL_HPP_DECLARE_PARAM_TRAITS_)
1481*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 300
1482*61046927SAndroid Build Coastguard Worker 
1483*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_CL_SUB_GROUPS_KHR) && CL_HPP_TARGET_OPENCL_VERSION < 210
1484*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_SUBGROUP_KHR_(CL_HPP_DECLARE_PARAM_TRAITS_)
1485*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_USE_CL_SUB_GROUPS_KHR) && CL_HPP_TARGET_OPENCL_VERSION < 210
1486*61046927SAndroid Build Coastguard Worker 
1487*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_IL_KHR) && CL_HPP_TARGET_OPENCL_VERSION < 210
1488*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_IL_KHR_(CL_HPP_DECLARE_PARAM_TRAITS_)
1489*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_USE_IL_KHR)
1490*61046927SAndroid Build Coastguard Worker 
1491*61046927SAndroid Build Coastguard Worker 
1492*61046927SAndroid Build Coastguard Worker // Flags deprecated in OpenCL 2.0
1493*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_1_0_DEPRECATED_IN_2_0_(F) \
1494*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties)
1495*61046927SAndroid Build Coastguard Worker 
1496*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_1_1_DEPRECATED_IN_2_0_(F) \
1497*61046927SAndroid Build Coastguard Worker     F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool)
1498*61046927SAndroid Build Coastguard Worker 
1499*61046927SAndroid Build Coastguard Worker #define CL_HPP_PARAM_NAME_INFO_1_2_DEPRECATED_IN_2_0_(F) \
1500*61046927SAndroid Build Coastguard Worker     F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer)
1501*61046927SAndroid Build Coastguard Worker 
1502*61046927SAndroid Build Coastguard Worker // Include deprecated query flags based on versions
1503*61046927SAndroid Build Coastguard Worker // Only include deprecated 1.0 flags if 2.0 not active as there is an enum clash
1504*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION > 100 && CL_HPP_MINIMUM_OPENCL_VERSION < 200 && CL_HPP_TARGET_OPENCL_VERSION < 200
1505*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_1_0_DEPRECATED_IN_2_0_(CL_HPP_DECLARE_PARAM_TRAITS_)
1506*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 110
1507*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION > 110 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
1508*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_1_1_DEPRECATED_IN_2_0_(CL_HPP_DECLARE_PARAM_TRAITS_)
1509*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 120
1510*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION > 120 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
1511*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_INFO_1_2_DEPRECATED_IN_2_0_(CL_HPP_DECLARE_PARAM_TRAITS_)
1512*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
1513*61046927SAndroid Build Coastguard Worker 
1514*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_CL_DEVICE_FISSION)
1515*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_DEVICE_FISSION_(CL_HPP_DECLARE_PARAM_TRAITS_);
1516*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_USE_CL_DEVICE_FISSION
1517*61046927SAndroid Build Coastguard Worker 
1518*61046927SAndroid Build Coastguard Worker #if defined(cl_khr_extended_versioning)
1519*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION < 300
1520*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_CL_KHR_EXTENDED_VERSIONING_CL3_SHARED_(CL_HPP_DECLARE_PARAM_TRAITS_)
1521*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION < 300
1522*61046927SAndroid Build Coastguard Worker CL_HPP_PARAM_NAME_CL_KHR_EXTENDED_VERSIONING_KHRONLY_(CL_HPP_DECLARE_PARAM_TRAITS_)
1523*61046927SAndroid Build Coastguard Worker #endif // cl_khr_extended_versioning
1524*61046927SAndroid Build Coastguard Worker 
1525*61046927SAndroid Build Coastguard Worker #if defined(cl_khr_device_uuid)
1526*61046927SAndroid Build Coastguard Worker using uuid_array = array<cl_uchar, CL_UUID_SIZE_KHR>;
1527*61046927SAndroid Build Coastguard Worker using luid_array = array<cl_uchar, CL_LUID_SIZE_KHR>;
CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info,CL_DEVICE_UUID_KHR,uuid_array)1528*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_UUID_KHR, uuid_array)
1529*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DRIVER_UUID_KHR, uuid_array)
1530*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_LUID_VALID_KHR, cl_bool)
1531*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_LUID_KHR, luid_array)
1532*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_NODE_MASK_KHR, cl_uint)
1533*61046927SAndroid Build Coastguard Worker #endif
1534*61046927SAndroid Build Coastguard Worker 
1535*61046927SAndroid Build Coastguard Worker #if defined(cl_khr_pci_bus_info)
1536*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_PCI_BUS_INFO_KHR, cl_device_pci_bus_info_khr)
1537*61046927SAndroid Build Coastguard Worker #endif
1538*61046927SAndroid Build Coastguard Worker 
1539*61046927SAndroid Build Coastguard Worker #if defined(cl_khr_integer_dot_product)
1540*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_INTEGER_DOT_PRODUCT_CAPABILITIES_KHR, cl_device_integer_dot_product_capabilities_khr)
1541*61046927SAndroid Build Coastguard Worker #if defined(CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR)
1542*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR, cl_device_integer_dot_product_acceleration_properties_khr)
1543*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_4x8BIT_PACKED_KHR, cl_device_integer_dot_product_acceleration_properties_khr)
1544*61046927SAndroid Build Coastguard Worker #endif // defined(CL_DEVICE_INTEGER_DOT_PRODUCT_ACCELERATION_PROPERTIES_8BIT_KHR)
1545*61046927SAndroid Build Coastguard Worker #endif // defined(cl_khr_integer_dot_product)
1546*61046927SAndroid Build Coastguard Worker 
1547*61046927SAndroid Build Coastguard Worker #ifdef CL_PLATFORM_ICD_SUFFIX_KHR
1548*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, string)
1549*61046927SAndroid Build Coastguard Worker #endif
1550*61046927SAndroid Build Coastguard Worker 
1551*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
1552*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong)
1553*61046927SAndroid Build Coastguard Worker #endif
1554*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
1555*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, vector<size_type>)
1556*61046927SAndroid Build Coastguard Worker #endif
1557*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
1558*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint)
1559*61046927SAndroid Build Coastguard Worker #endif
1560*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SIMD_WIDTH_AMD
1561*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint)
1562*61046927SAndroid Build Coastguard Worker #endif
1563*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
1564*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint)
1565*61046927SAndroid Build Coastguard Worker #endif
1566*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
1567*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint)
1568*61046927SAndroid Build Coastguard Worker #endif
1569*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
1570*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint)
1571*61046927SAndroid Build Coastguard Worker #endif
1572*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
1573*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint)
1574*61046927SAndroid Build Coastguard Worker #endif
1575*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
1576*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint)
1577*61046927SAndroid Build Coastguard Worker #endif
1578*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
1579*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint)
1580*61046927SAndroid Build Coastguard Worker #endif
1581*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
1582*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint)
1583*61046927SAndroid Build Coastguard Worker #endif
1584*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_BOARD_NAME_AMD
1585*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_BOARD_NAME_AMD, string)
1586*61046927SAndroid Build Coastguard Worker #endif
1587*61046927SAndroid Build Coastguard Worker 
1588*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_COMPUTE_UNITS_BITFIELD_ARM
1589*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_COMPUTE_UNITS_BITFIELD_ARM, cl_ulong)
1590*61046927SAndroid Build Coastguard Worker #endif
1591*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_JOB_SLOTS_ARM
1592*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_JOB_SLOTS_ARM, cl_uint)
1593*61046927SAndroid Build Coastguard Worker #endif
1594*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SCHEDULING_CONTROLS_CAPABILITIES_ARM
1595*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_SCHEDULING_CONTROLS_CAPABILITIES_ARM, cl_bitfield)
1596*61046927SAndroid Build Coastguard Worker #endif
1597*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_SUPPORTED_REGISTER_ALLOCATIONS_ARM
1598*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_SUPPORTED_REGISTER_ALLOCATIONS_ARM, vector<cl_uint>)
1599*61046927SAndroid Build Coastguard Worker #endif
1600*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_MAX_WARP_COUNT_ARM
1601*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_MAX_WARP_COUNT_ARM, cl_uint)
1602*61046927SAndroid Build Coastguard Worker #endif
1603*61046927SAndroid Build Coastguard Worker #ifdef CL_KERNEL_MAX_WARP_COUNT_ARM
1604*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_kernel_info, CL_KERNEL_MAX_WARP_COUNT_ARM, cl_uint)
1605*61046927SAndroid Build Coastguard Worker #endif
1606*61046927SAndroid Build Coastguard Worker #ifdef CL_KERNEL_EXEC_INFO_WORKGROUP_BATCH_SIZE_ARM
1607*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_kernel_exec_info, CL_KERNEL_EXEC_INFO_WORKGROUP_BATCH_SIZE_ARM, cl_uint)
1608*61046927SAndroid Build Coastguard Worker #endif
1609*61046927SAndroid Build Coastguard Worker #ifdef CL_KERNEL_EXEC_INFO_WORKGROUP_BATCH_SIZE_MODIFIER_ARM
1610*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_kernel_exec_info, CL_KERNEL_EXEC_INFO_WORKGROUP_BATCH_SIZE_MODIFIER_ARM, cl_int)
1611*61046927SAndroid Build Coastguard Worker #endif
1612*61046927SAndroid Build Coastguard Worker #ifdef CL_KERNEL_EXEC_INFO_WARP_COUNT_LIMIT_ARM
1613*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_kernel_exec_info, CL_KERNEL_EXEC_INFO_WARP_COUNT_LIMIT_ARM, cl_uint)
1614*61046927SAndroid Build Coastguard Worker #endif
1615*61046927SAndroid Build Coastguard Worker #ifdef CL_KERNEL_EXEC_INFO_COMPUTE_UNIT_MAX_QUEUED_BATCHES_ARM
1616*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_kernel_exec_info, CL_KERNEL_EXEC_INFO_COMPUTE_UNIT_MAX_QUEUED_BATCHES_ARM, cl_uint)
1617*61046927SAndroid Build Coastguard Worker #endif
1618*61046927SAndroid Build Coastguard Worker 
1619*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
1620*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint)
1621*61046927SAndroid Build Coastguard Worker #endif
1622*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV
1623*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint)
1624*61046927SAndroid Build Coastguard Worker #endif
1625*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV
1626*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint)
1627*61046927SAndroid Build Coastguard Worker #endif
1628*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_WARP_SIZE_NV
1629*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint)
1630*61046927SAndroid Build Coastguard Worker #endif
1631*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_GPU_OVERLAP_NV
1632*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool)
1633*61046927SAndroid Build Coastguard Worker #endif
1634*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV
1635*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool)
1636*61046927SAndroid Build Coastguard Worker #endif
1637*61046927SAndroid Build Coastguard Worker #ifdef CL_DEVICE_INTEGRATED_MEMORY_NV
1638*61046927SAndroid Build Coastguard Worker CL_HPP_DECLARE_PARAM_TRAITS_(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool)
1639*61046927SAndroid Build Coastguard Worker #endif
1640*61046927SAndroid Build Coastguard Worker 
1641*61046927SAndroid Build Coastguard Worker // Convenience functions
1642*61046927SAndroid Build Coastguard Worker 
1643*61046927SAndroid Build Coastguard Worker template <typename Func, typename T>
1644*61046927SAndroid Build Coastguard Worker inline cl_int
1645*61046927SAndroid Build Coastguard Worker getInfo(Func f, cl_uint name, T* param)
1646*61046927SAndroid Build Coastguard Worker {
1647*61046927SAndroid Build Coastguard Worker     return getInfoHelper(f, name, param, 0);
1648*61046927SAndroid Build Coastguard Worker }
1649*61046927SAndroid Build Coastguard Worker 
1650*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0>
1651*61046927SAndroid Build Coastguard Worker struct GetInfoFunctor0
1652*61046927SAndroid Build Coastguard Worker {
1653*61046927SAndroid Build Coastguard Worker     Func f_; const Arg0& arg0_;
operator ()cl::detail::GetInfoFunctor01654*61046927SAndroid Build Coastguard Worker     cl_int operator ()(
1655*61046927SAndroid Build Coastguard Worker         cl_uint param, size_type size, void* value, size_type* size_ret)
1656*61046927SAndroid Build Coastguard Worker     { return f_(arg0_, param, size, value, size_ret); }
1657*61046927SAndroid Build Coastguard Worker };
1658*61046927SAndroid Build Coastguard Worker 
1659*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0, typename Arg1>
1660*61046927SAndroid Build Coastguard Worker struct GetInfoFunctor1
1661*61046927SAndroid Build Coastguard Worker {
1662*61046927SAndroid Build Coastguard Worker     Func f_; const Arg0& arg0_; const Arg1& arg1_;
operator ()cl::detail::GetInfoFunctor11663*61046927SAndroid Build Coastguard Worker     cl_int operator ()(
1664*61046927SAndroid Build Coastguard Worker         cl_uint param, size_type size, void* value, size_type* size_ret)
1665*61046927SAndroid Build Coastguard Worker     { return f_(arg0_, arg1_, param, size, value, size_ret); }
1666*61046927SAndroid Build Coastguard Worker };
1667*61046927SAndroid Build Coastguard Worker 
1668*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0, typename T>
1669*61046927SAndroid Build Coastguard Worker inline cl_int
getInfo(Func f,const Arg0 & arg0,cl_uint name,T * param)1670*61046927SAndroid Build Coastguard Worker getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)
1671*61046927SAndroid Build Coastguard Worker {
1672*61046927SAndroid Build Coastguard Worker     GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };
1673*61046927SAndroid Build Coastguard Worker     return getInfoHelper(f0, name, param, 0);
1674*61046927SAndroid Build Coastguard Worker }
1675*61046927SAndroid Build Coastguard Worker 
1676*61046927SAndroid Build Coastguard Worker template <typename Func, typename Arg0, typename Arg1, typename T>
1677*61046927SAndroid Build Coastguard Worker inline cl_int
getInfo(Func f,const Arg0 & arg0,const Arg1 & arg1,cl_uint name,T * param)1678*61046927SAndroid Build Coastguard Worker getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)
1679*61046927SAndroid Build Coastguard Worker {
1680*61046927SAndroid Build Coastguard Worker     GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };
1681*61046927SAndroid Build Coastguard Worker     return getInfoHelper(f0, name, param, 0);
1682*61046927SAndroid Build Coastguard Worker }
1683*61046927SAndroid Build Coastguard Worker 
1684*61046927SAndroid Build Coastguard Worker 
1685*61046927SAndroid Build Coastguard Worker template<typename T>
1686*61046927SAndroid Build Coastguard Worker struct ReferenceHandler
1687*61046927SAndroid Build Coastguard Worker { };
1688*61046927SAndroid Build Coastguard Worker 
1689*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
1690*61046927SAndroid Build Coastguard Worker /**
1691*61046927SAndroid Build Coastguard Worker  * OpenCL 1.2 devices do have retain/release.
1692*61046927SAndroid Build Coastguard Worker  */
1693*61046927SAndroid Build Coastguard Worker template <>
1694*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_device_id>
1695*61046927SAndroid Build Coastguard Worker {
1696*61046927SAndroid Build Coastguard Worker     /**
1697*61046927SAndroid Build Coastguard Worker      * Retain the device.
1698*61046927SAndroid Build Coastguard Worker      * \param device A valid device created using createSubDevices
1699*61046927SAndroid Build Coastguard Worker      * \return
1700*61046927SAndroid Build Coastguard Worker      *   CL_SUCCESS if the function executed successfully.
1701*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_DEVICE if device was not a valid subdevice
1702*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_RESOURCES
1703*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_HOST_MEMORY
1704*61046927SAndroid Build Coastguard Worker      */
retaincl::detail::ReferenceHandler1705*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_device_id device)
1706*61046927SAndroid Build Coastguard Worker     { return ::clRetainDevice(device); }
1707*61046927SAndroid Build Coastguard Worker     /**
1708*61046927SAndroid Build Coastguard Worker      * Retain the device.
1709*61046927SAndroid Build Coastguard Worker      * \param device A valid device created using createSubDevices
1710*61046927SAndroid Build Coastguard Worker      * \return
1711*61046927SAndroid Build Coastguard Worker      *   CL_SUCCESS if the function executed successfully.
1712*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_DEVICE if device was not a valid subdevice
1713*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_RESOURCES
1714*61046927SAndroid Build Coastguard Worker      *   CL_OUT_OF_HOST_MEMORY
1715*61046927SAndroid Build Coastguard Worker      */
releasecl::detail::ReferenceHandler1716*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_device_id device)
1717*61046927SAndroid Build Coastguard Worker     { return ::clReleaseDevice(device); }
1718*61046927SAndroid Build Coastguard Worker };
1719*61046927SAndroid Build Coastguard Worker #else // CL_HPP_TARGET_OPENCL_VERSION >= 120
1720*61046927SAndroid Build Coastguard Worker /**
1721*61046927SAndroid Build Coastguard Worker  * OpenCL 1.1 devices do not have retain/release.
1722*61046927SAndroid Build Coastguard Worker  */
1723*61046927SAndroid Build Coastguard Worker template <>
1724*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_device_id>
1725*61046927SAndroid Build Coastguard Worker {
1726*61046927SAndroid Build Coastguard Worker     // cl_device_id does not have retain().
retaincl::detail::ReferenceHandler1727*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_device_id)
1728*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1729*61046927SAndroid Build Coastguard Worker     // cl_device_id does not have release().
releasecl::detail::ReferenceHandler1730*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_device_id)
1731*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1732*61046927SAndroid Build Coastguard Worker };
1733*61046927SAndroid Build Coastguard Worker #endif // ! (CL_HPP_TARGET_OPENCL_VERSION >= 120)
1734*61046927SAndroid Build Coastguard Worker 
1735*61046927SAndroid Build Coastguard Worker template <>
1736*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_platform_id>
1737*61046927SAndroid Build Coastguard Worker {
1738*61046927SAndroid Build Coastguard Worker     // cl_platform_id does not have retain().
retaincl::detail::ReferenceHandler1739*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_platform_id)
1740*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1741*61046927SAndroid Build Coastguard Worker     // cl_platform_id does not have release().
releasecl::detail::ReferenceHandler1742*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_platform_id)
1743*61046927SAndroid Build Coastguard Worker     { return CL_SUCCESS; }
1744*61046927SAndroid Build Coastguard Worker };
1745*61046927SAndroid Build Coastguard Worker 
1746*61046927SAndroid Build Coastguard Worker template <>
1747*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_context>
1748*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1749*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_context context)
1750*61046927SAndroid Build Coastguard Worker     { return ::clRetainContext(context); }
releasecl::detail::ReferenceHandler1751*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_context context)
1752*61046927SAndroid Build Coastguard Worker     { return ::clReleaseContext(context); }
1753*61046927SAndroid Build Coastguard Worker };
1754*61046927SAndroid Build Coastguard Worker 
1755*61046927SAndroid Build Coastguard Worker template <>
1756*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_command_queue>
1757*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1758*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_command_queue queue)
1759*61046927SAndroid Build Coastguard Worker     { return ::clRetainCommandQueue(queue); }
releasecl::detail::ReferenceHandler1760*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_command_queue queue)
1761*61046927SAndroid Build Coastguard Worker     { return ::clReleaseCommandQueue(queue); }
1762*61046927SAndroid Build Coastguard Worker };
1763*61046927SAndroid Build Coastguard Worker 
1764*61046927SAndroid Build Coastguard Worker template <>
1765*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_mem>
1766*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1767*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_mem memory)
1768*61046927SAndroid Build Coastguard Worker     { return ::clRetainMemObject(memory); }
releasecl::detail::ReferenceHandler1769*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_mem memory)
1770*61046927SAndroid Build Coastguard Worker     { return ::clReleaseMemObject(memory); }
1771*61046927SAndroid Build Coastguard Worker };
1772*61046927SAndroid Build Coastguard Worker 
1773*61046927SAndroid Build Coastguard Worker template <>
1774*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_sampler>
1775*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1776*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_sampler sampler)
1777*61046927SAndroid Build Coastguard Worker     { return ::clRetainSampler(sampler); }
releasecl::detail::ReferenceHandler1778*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_sampler sampler)
1779*61046927SAndroid Build Coastguard Worker     { return ::clReleaseSampler(sampler); }
1780*61046927SAndroid Build Coastguard Worker };
1781*61046927SAndroid Build Coastguard Worker 
1782*61046927SAndroid Build Coastguard Worker template <>
1783*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_program>
1784*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1785*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_program program)
1786*61046927SAndroid Build Coastguard Worker     { return ::clRetainProgram(program); }
releasecl::detail::ReferenceHandler1787*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_program program)
1788*61046927SAndroid Build Coastguard Worker     { return ::clReleaseProgram(program); }
1789*61046927SAndroid Build Coastguard Worker };
1790*61046927SAndroid Build Coastguard Worker 
1791*61046927SAndroid Build Coastguard Worker template <>
1792*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_kernel>
1793*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1794*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_kernel kernel)
1795*61046927SAndroid Build Coastguard Worker     { return ::clRetainKernel(kernel); }
releasecl::detail::ReferenceHandler1796*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_kernel kernel)
1797*61046927SAndroid Build Coastguard Worker     { return ::clReleaseKernel(kernel); }
1798*61046927SAndroid Build Coastguard Worker };
1799*61046927SAndroid Build Coastguard Worker 
1800*61046927SAndroid Build Coastguard Worker template <>
1801*61046927SAndroid Build Coastguard Worker struct ReferenceHandler<cl_event>
1802*61046927SAndroid Build Coastguard Worker {
retaincl::detail::ReferenceHandler1803*61046927SAndroid Build Coastguard Worker     static cl_int retain(cl_event event)
1804*61046927SAndroid Build Coastguard Worker     { return ::clRetainEvent(event); }
releasecl::detail::ReferenceHandler1805*61046927SAndroid Build Coastguard Worker     static cl_int release(cl_event event)
1806*61046927SAndroid Build Coastguard Worker     { return ::clReleaseEvent(event); }
1807*61046927SAndroid Build Coastguard Worker };
1808*61046927SAndroid Build Coastguard Worker 
1809*61046927SAndroid Build Coastguard Worker 
1810*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120 && CL_HPP_MINIMUM_OPENCL_VERSION < 120
1811*61046927SAndroid Build Coastguard Worker // Extracts version number with major in the upper 16 bits, minor in the lower 16
getVersion(const vector<char> & versionInfo)1812*61046927SAndroid Build Coastguard Worker static cl_uint getVersion(const vector<char> &versionInfo)
1813*61046927SAndroid Build Coastguard Worker {
1814*61046927SAndroid Build Coastguard Worker     int highVersion = 0;
1815*61046927SAndroid Build Coastguard Worker     int lowVersion = 0;
1816*61046927SAndroid Build Coastguard Worker     int index = 7;
1817*61046927SAndroid Build Coastguard Worker     while(versionInfo[index] != '.' ) {
1818*61046927SAndroid Build Coastguard Worker         highVersion *= 10;
1819*61046927SAndroid Build Coastguard Worker         highVersion += versionInfo[index]-'0';
1820*61046927SAndroid Build Coastguard Worker         ++index;
1821*61046927SAndroid Build Coastguard Worker     }
1822*61046927SAndroid Build Coastguard Worker     ++index;
1823*61046927SAndroid Build Coastguard Worker     while(versionInfo[index] != ' ' &&  versionInfo[index] != '\0') {
1824*61046927SAndroid Build Coastguard Worker         lowVersion *= 10;
1825*61046927SAndroid Build Coastguard Worker         lowVersion += versionInfo[index]-'0';
1826*61046927SAndroid Build Coastguard Worker         ++index;
1827*61046927SAndroid Build Coastguard Worker     }
1828*61046927SAndroid Build Coastguard Worker     return (highVersion << 16) | lowVersion;
1829*61046927SAndroid Build Coastguard Worker }
1830*61046927SAndroid Build Coastguard Worker 
getPlatformVersion(cl_platform_id platform)1831*61046927SAndroid Build Coastguard Worker static cl_uint getPlatformVersion(cl_platform_id platform)
1832*61046927SAndroid Build Coastguard Worker {
1833*61046927SAndroid Build Coastguard Worker     size_type size = 0;
1834*61046927SAndroid Build Coastguard Worker     clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);
1835*61046927SAndroid Build Coastguard Worker 
1836*61046927SAndroid Build Coastguard Worker     vector<char> versionInfo(size);
1837*61046927SAndroid Build Coastguard Worker     clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, versionInfo.data(), &size);
1838*61046927SAndroid Build Coastguard Worker     return getVersion(versionInfo);
1839*61046927SAndroid Build Coastguard Worker }
1840*61046927SAndroid Build Coastguard Worker 
getDevicePlatformVersion(cl_device_id device)1841*61046927SAndroid Build Coastguard Worker static cl_uint getDevicePlatformVersion(cl_device_id device)
1842*61046927SAndroid Build Coastguard Worker {
1843*61046927SAndroid Build Coastguard Worker     cl_platform_id platform;
1844*61046927SAndroid Build Coastguard Worker     clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);
1845*61046927SAndroid Build Coastguard Worker     return getPlatformVersion(platform);
1846*61046927SAndroid Build Coastguard Worker }
1847*61046927SAndroid Build Coastguard Worker 
getContextPlatformVersion(cl_context context)1848*61046927SAndroid Build Coastguard Worker static cl_uint getContextPlatformVersion(cl_context context)
1849*61046927SAndroid Build Coastguard Worker {
1850*61046927SAndroid Build Coastguard Worker     // The platform cannot be queried directly, so we first have to grab a
1851*61046927SAndroid Build Coastguard Worker     // device and obtain its context
1852*61046927SAndroid Build Coastguard Worker     size_type size = 0;
1853*61046927SAndroid Build Coastguard Worker     clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);
1854*61046927SAndroid Build Coastguard Worker     if (size == 0)
1855*61046927SAndroid Build Coastguard Worker         return 0;
1856*61046927SAndroid Build Coastguard Worker     vector<cl_device_id> devices(size/sizeof(cl_device_id));
1857*61046927SAndroid Build Coastguard Worker     clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices.data(), NULL);
1858*61046927SAndroid Build Coastguard Worker     return getDevicePlatformVersion(devices[0]);
1859*61046927SAndroid Build Coastguard Worker }
1860*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120 && CL_HPP_MINIMUM_OPENCL_VERSION < 120
1861*61046927SAndroid Build Coastguard Worker 
1862*61046927SAndroid Build Coastguard Worker template <typename T>
1863*61046927SAndroid Build Coastguard Worker class Wrapper
1864*61046927SAndroid Build Coastguard Worker {
1865*61046927SAndroid Build Coastguard Worker public:
1866*61046927SAndroid Build Coastguard Worker     typedef T cl_type;
1867*61046927SAndroid Build Coastguard Worker 
1868*61046927SAndroid Build Coastguard Worker protected:
1869*61046927SAndroid Build Coastguard Worker     cl_type object_;
1870*61046927SAndroid Build Coastguard Worker 
1871*61046927SAndroid Build Coastguard Worker public:
Wrapper()1872*61046927SAndroid Build Coastguard Worker     Wrapper() : object_(NULL) { }
1873*61046927SAndroid Build Coastguard Worker 
Wrapper(const cl_type & obj,bool retainObject)1874*61046927SAndroid Build Coastguard Worker     Wrapper(const cl_type &obj, bool retainObject) : object_(obj)
1875*61046927SAndroid Build Coastguard Worker     {
1876*61046927SAndroid Build Coastguard Worker         if (retainObject) {
1877*61046927SAndroid Build Coastguard Worker             detail::errHandler(retain(), __RETAIN_ERR);
1878*61046927SAndroid Build Coastguard Worker         }
1879*61046927SAndroid Build Coastguard Worker     }
1880*61046927SAndroid Build Coastguard Worker 
~Wrapper()1881*61046927SAndroid Build Coastguard Worker     ~Wrapper()
1882*61046927SAndroid Build Coastguard Worker     {
1883*61046927SAndroid Build Coastguard Worker         if (object_ != NULL) { release(); }
1884*61046927SAndroid Build Coastguard Worker     }
1885*61046927SAndroid Build Coastguard Worker 
Wrapper(const Wrapper<cl_type> & rhs)1886*61046927SAndroid Build Coastguard Worker     Wrapper(const Wrapper<cl_type>& rhs)
1887*61046927SAndroid Build Coastguard Worker     {
1888*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
1889*61046927SAndroid Build Coastguard Worker         detail::errHandler(retain(), __RETAIN_ERR);
1890*61046927SAndroid Build Coastguard Worker     }
1891*61046927SAndroid Build Coastguard Worker 
Wrapper(Wrapper<cl_type> && rhs)1892*61046927SAndroid Build Coastguard Worker     Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT_
1893*61046927SAndroid Build Coastguard Worker     {
1894*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
1895*61046927SAndroid Build Coastguard Worker         rhs.object_ = NULL;
1896*61046927SAndroid Build Coastguard Worker     }
1897*61046927SAndroid Build Coastguard Worker 
operator =(const Wrapper<cl_type> & rhs)1898*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1899*61046927SAndroid Build Coastguard Worker     {
1900*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
1901*61046927SAndroid Build Coastguard Worker             detail::errHandler(release(), __RELEASE_ERR);
1902*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
1903*61046927SAndroid Build Coastguard Worker             detail::errHandler(retain(), __RETAIN_ERR);
1904*61046927SAndroid Build Coastguard Worker         }
1905*61046927SAndroid Build Coastguard Worker         return *this;
1906*61046927SAndroid Build Coastguard Worker     }
1907*61046927SAndroid Build Coastguard Worker 
operator =(Wrapper<cl_type> && rhs)1908*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
1909*61046927SAndroid Build Coastguard Worker     {
1910*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
1911*61046927SAndroid Build Coastguard Worker             detail::errHandler(release(), __RELEASE_ERR);
1912*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
1913*61046927SAndroid Build Coastguard Worker             rhs.object_ = NULL;
1914*61046927SAndroid Build Coastguard Worker         }
1915*61046927SAndroid Build Coastguard Worker         return *this;
1916*61046927SAndroid Build Coastguard Worker     }
1917*61046927SAndroid Build Coastguard Worker 
operator =(const cl_type & rhs)1918*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const cl_type &rhs)
1919*61046927SAndroid Build Coastguard Worker     {
1920*61046927SAndroid Build Coastguard Worker         detail::errHandler(release(), __RELEASE_ERR);
1921*61046927SAndroid Build Coastguard Worker         object_ = rhs;
1922*61046927SAndroid Build Coastguard Worker         return *this;
1923*61046927SAndroid Build Coastguard Worker     }
1924*61046927SAndroid Build Coastguard Worker 
operator ()() const1925*61046927SAndroid Build Coastguard Worker     const cl_type& operator ()() const { return object_; }
1926*61046927SAndroid Build Coastguard Worker 
operator ()()1927*61046927SAndroid Build Coastguard Worker     cl_type& operator ()() { return object_; }
1928*61046927SAndroid Build Coastguard Worker 
get() const1929*61046927SAndroid Build Coastguard Worker     cl_type get() const { return object_; }
1930*61046927SAndroid Build Coastguard Worker 
1931*61046927SAndroid Build Coastguard Worker protected:
1932*61046927SAndroid Build Coastguard Worker     template<typename Func, typename U>
1933*61046927SAndroid Build Coastguard Worker     friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1934*61046927SAndroid Build Coastguard Worker 
retain() const1935*61046927SAndroid Build Coastguard Worker     cl_int retain() const
1936*61046927SAndroid Build Coastguard Worker     {
1937*61046927SAndroid Build Coastguard Worker         if (object_ != nullptr) {
1938*61046927SAndroid Build Coastguard Worker             return ReferenceHandler<cl_type>::retain(object_);
1939*61046927SAndroid Build Coastguard Worker         }
1940*61046927SAndroid Build Coastguard Worker         else {
1941*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
1942*61046927SAndroid Build Coastguard Worker         }
1943*61046927SAndroid Build Coastguard Worker     }
1944*61046927SAndroid Build Coastguard Worker 
release() const1945*61046927SAndroid Build Coastguard Worker     cl_int release() const
1946*61046927SAndroid Build Coastguard Worker     {
1947*61046927SAndroid Build Coastguard Worker         if (object_ != nullptr) {
1948*61046927SAndroid Build Coastguard Worker             return ReferenceHandler<cl_type>::release(object_);
1949*61046927SAndroid Build Coastguard Worker         }
1950*61046927SAndroid Build Coastguard Worker         else {
1951*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
1952*61046927SAndroid Build Coastguard Worker         }
1953*61046927SAndroid Build Coastguard Worker     }
1954*61046927SAndroid Build Coastguard Worker };
1955*61046927SAndroid Build Coastguard Worker 
1956*61046927SAndroid Build Coastguard Worker template <>
1957*61046927SAndroid Build Coastguard Worker class Wrapper<cl_device_id>
1958*61046927SAndroid Build Coastguard Worker {
1959*61046927SAndroid Build Coastguard Worker public:
1960*61046927SAndroid Build Coastguard Worker     typedef cl_device_id cl_type;
1961*61046927SAndroid Build Coastguard Worker 
1962*61046927SAndroid Build Coastguard Worker protected:
1963*61046927SAndroid Build Coastguard Worker     cl_type object_;
1964*61046927SAndroid Build Coastguard Worker     bool referenceCountable_;
1965*61046927SAndroid Build Coastguard Worker 
isReferenceCountable(cl_device_id device)1966*61046927SAndroid Build Coastguard Worker     static bool isReferenceCountable(cl_device_id device)
1967*61046927SAndroid Build Coastguard Worker     {
1968*61046927SAndroid Build Coastguard Worker         bool retVal = false;
1969*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
1970*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 120
1971*61046927SAndroid Build Coastguard Worker         if (device != NULL) {
1972*61046927SAndroid Build Coastguard Worker             int version = getDevicePlatformVersion(device);
1973*61046927SAndroid Build Coastguard Worker             if(version > ((1 << 16) + 1)) {
1974*61046927SAndroid Build Coastguard Worker                 retVal = true;
1975*61046927SAndroid Build Coastguard Worker             }
1976*61046927SAndroid Build Coastguard Worker         }
1977*61046927SAndroid Build Coastguard Worker #else // CL_HPP_MINIMUM_OPENCL_VERSION < 120
1978*61046927SAndroid Build Coastguard Worker         retVal = true;
1979*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 120
1980*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
1981*61046927SAndroid Build Coastguard Worker         (void)device;
1982*61046927SAndroid Build Coastguard Worker         return retVal;
1983*61046927SAndroid Build Coastguard Worker     }
1984*61046927SAndroid Build Coastguard Worker 
1985*61046927SAndroid Build Coastguard Worker public:
Wrapper()1986*61046927SAndroid Build Coastguard Worker     Wrapper() : object_(NULL), referenceCountable_(false)
1987*61046927SAndroid Build Coastguard Worker     {
1988*61046927SAndroid Build Coastguard Worker     }
1989*61046927SAndroid Build Coastguard Worker 
Wrapper(const cl_type & obj,bool retainObject)1990*61046927SAndroid Build Coastguard Worker     Wrapper(const cl_type &obj, bool retainObject) :
1991*61046927SAndroid Build Coastguard Worker         object_(obj),
1992*61046927SAndroid Build Coastguard Worker         referenceCountable_(false)
1993*61046927SAndroid Build Coastguard Worker     {
1994*61046927SAndroid Build Coastguard Worker         referenceCountable_ = isReferenceCountable(obj);
1995*61046927SAndroid Build Coastguard Worker 
1996*61046927SAndroid Build Coastguard Worker         if (retainObject) {
1997*61046927SAndroid Build Coastguard Worker             detail::errHandler(retain(), __RETAIN_ERR);
1998*61046927SAndroid Build Coastguard Worker         }
1999*61046927SAndroid Build Coastguard Worker     }
2000*61046927SAndroid Build Coastguard Worker 
~Wrapper()2001*61046927SAndroid Build Coastguard Worker     ~Wrapper()
2002*61046927SAndroid Build Coastguard Worker     {
2003*61046927SAndroid Build Coastguard Worker         release();
2004*61046927SAndroid Build Coastguard Worker     }
2005*61046927SAndroid Build Coastguard Worker 
Wrapper(const Wrapper<cl_type> & rhs)2006*61046927SAndroid Build Coastguard Worker     Wrapper(const Wrapper<cl_type>& rhs)
2007*61046927SAndroid Build Coastguard Worker     {
2008*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
2009*61046927SAndroid Build Coastguard Worker         referenceCountable_ = isReferenceCountable(object_);
2010*61046927SAndroid Build Coastguard Worker         detail::errHandler(retain(), __RETAIN_ERR);
2011*61046927SAndroid Build Coastguard Worker     }
2012*61046927SAndroid Build Coastguard Worker 
Wrapper(Wrapper<cl_type> && rhs)2013*61046927SAndroid Build Coastguard Worker     Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT_
2014*61046927SAndroid Build Coastguard Worker     {
2015*61046927SAndroid Build Coastguard Worker         object_ = rhs.object_;
2016*61046927SAndroid Build Coastguard Worker         referenceCountable_ = rhs.referenceCountable_;
2017*61046927SAndroid Build Coastguard Worker         rhs.object_ = NULL;
2018*61046927SAndroid Build Coastguard Worker         rhs.referenceCountable_ = false;
2019*61046927SAndroid Build Coastguard Worker     }
2020*61046927SAndroid Build Coastguard Worker 
operator =(const Wrapper<cl_type> & rhs)2021*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
2022*61046927SAndroid Build Coastguard Worker     {
2023*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
2024*61046927SAndroid Build Coastguard Worker             detail::errHandler(release(), __RELEASE_ERR);
2025*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
2026*61046927SAndroid Build Coastguard Worker             referenceCountable_ = rhs.referenceCountable_;
2027*61046927SAndroid Build Coastguard Worker             detail::errHandler(retain(), __RETAIN_ERR);
2028*61046927SAndroid Build Coastguard Worker         }
2029*61046927SAndroid Build Coastguard Worker         return *this;
2030*61046927SAndroid Build Coastguard Worker     }
2031*61046927SAndroid Build Coastguard Worker 
operator =(Wrapper<cl_type> && rhs)2032*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
2033*61046927SAndroid Build Coastguard Worker     {
2034*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
2035*61046927SAndroid Build Coastguard Worker             detail::errHandler(release(), __RELEASE_ERR);
2036*61046927SAndroid Build Coastguard Worker             object_ = rhs.object_;
2037*61046927SAndroid Build Coastguard Worker             referenceCountable_ = rhs.referenceCountable_;
2038*61046927SAndroid Build Coastguard Worker             rhs.object_ = NULL;
2039*61046927SAndroid Build Coastguard Worker             rhs.referenceCountable_ = false;
2040*61046927SAndroid Build Coastguard Worker         }
2041*61046927SAndroid Build Coastguard Worker         return *this;
2042*61046927SAndroid Build Coastguard Worker     }
2043*61046927SAndroid Build Coastguard Worker 
operator =(const cl_type & rhs)2044*61046927SAndroid Build Coastguard Worker     Wrapper<cl_type>& operator = (const cl_type &rhs)
2045*61046927SAndroid Build Coastguard Worker     {
2046*61046927SAndroid Build Coastguard Worker         detail::errHandler(release(), __RELEASE_ERR);
2047*61046927SAndroid Build Coastguard Worker         object_ = rhs;
2048*61046927SAndroid Build Coastguard Worker         referenceCountable_ = isReferenceCountable(object_);
2049*61046927SAndroid Build Coastguard Worker         return *this;
2050*61046927SAndroid Build Coastguard Worker     }
2051*61046927SAndroid Build Coastguard Worker 
operator ()() const2052*61046927SAndroid Build Coastguard Worker     const cl_type& operator ()() const { return object_; }
2053*61046927SAndroid Build Coastguard Worker 
operator ()()2054*61046927SAndroid Build Coastguard Worker     cl_type& operator ()() { return object_; }
2055*61046927SAndroid Build Coastguard Worker 
get() const2056*61046927SAndroid Build Coastguard Worker     cl_type get() const { return object_; }
2057*61046927SAndroid Build Coastguard Worker 
2058*61046927SAndroid Build Coastguard Worker protected:
2059*61046927SAndroid Build Coastguard Worker     template<typename Func, typename U>
2060*61046927SAndroid Build Coastguard Worker     friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
2061*61046927SAndroid Build Coastguard Worker 
2062*61046927SAndroid Build Coastguard Worker     template<typename Func, typename U>
2063*61046927SAndroid Build Coastguard Worker     friend inline cl_int getInfoHelper(Func, cl_uint, vector<U>*, int, typename U::cl_type);
2064*61046927SAndroid Build Coastguard Worker 
retain() const2065*61046927SAndroid Build Coastguard Worker     cl_int retain() const
2066*61046927SAndroid Build Coastguard Worker     {
2067*61046927SAndroid Build Coastguard Worker         if( object_ != nullptr && referenceCountable_ ) {
2068*61046927SAndroid Build Coastguard Worker             return ReferenceHandler<cl_type>::retain(object_);
2069*61046927SAndroid Build Coastguard Worker         }
2070*61046927SAndroid Build Coastguard Worker         else {
2071*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
2072*61046927SAndroid Build Coastguard Worker         }
2073*61046927SAndroid Build Coastguard Worker     }
2074*61046927SAndroid Build Coastguard Worker 
release() const2075*61046927SAndroid Build Coastguard Worker     cl_int release() const
2076*61046927SAndroid Build Coastguard Worker     {
2077*61046927SAndroid Build Coastguard Worker         if (object_ != nullptr && referenceCountable_) {
2078*61046927SAndroid Build Coastguard Worker             return ReferenceHandler<cl_type>::release(object_);
2079*61046927SAndroid Build Coastguard Worker         }
2080*61046927SAndroid Build Coastguard Worker         else {
2081*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
2082*61046927SAndroid Build Coastguard Worker         }
2083*61046927SAndroid Build Coastguard Worker     }
2084*61046927SAndroid Build Coastguard Worker };
2085*61046927SAndroid Build Coastguard Worker 
2086*61046927SAndroid Build Coastguard Worker template <typename T>
operator ==(const Wrapper<T> & lhs,const Wrapper<T> & rhs)2087*61046927SAndroid Build Coastguard Worker inline bool operator==(const Wrapper<T> &lhs, const Wrapper<T> &rhs)
2088*61046927SAndroid Build Coastguard Worker {
2089*61046927SAndroid Build Coastguard Worker     return lhs() == rhs();
2090*61046927SAndroid Build Coastguard Worker }
2091*61046927SAndroid Build Coastguard Worker 
2092*61046927SAndroid Build Coastguard Worker template <typename T>
operator !=(const Wrapper<T> & lhs,const Wrapper<T> & rhs)2093*61046927SAndroid Build Coastguard Worker inline bool operator!=(const Wrapper<T> &lhs, const Wrapper<T> &rhs)
2094*61046927SAndroid Build Coastguard Worker {
2095*61046927SAndroid Build Coastguard Worker     return !operator==(lhs, rhs);
2096*61046927SAndroid Build Coastguard Worker }
2097*61046927SAndroid Build Coastguard Worker 
2098*61046927SAndroid Build Coastguard Worker } // namespace detail
2099*61046927SAndroid Build Coastguard Worker //! \endcond
2100*61046927SAndroid Build Coastguard Worker 
2101*61046927SAndroid Build Coastguard Worker 
2102*61046927SAndroid Build Coastguard Worker 
2103*61046927SAndroid Build Coastguard Worker 
2104*61046927SAndroid Build Coastguard Worker 
2105*61046927SAndroid Build Coastguard Worker /*! \stuct ImageFormat
2106*61046927SAndroid Build Coastguard Worker  *  \brief Adds constructors and member functions for cl_image_format.
2107*61046927SAndroid Build Coastguard Worker  *
2108*61046927SAndroid Build Coastguard Worker  *  \see cl_image_format
2109*61046927SAndroid Build Coastguard Worker  */
2110*61046927SAndroid Build Coastguard Worker struct ImageFormat : public cl_image_format
2111*61046927SAndroid Build Coastguard Worker {
2112*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - performs no initialization.
ImageFormatcl::ImageFormat2113*61046927SAndroid Build Coastguard Worker     ImageFormat(){}
2114*61046927SAndroid Build Coastguard Worker 
2115*61046927SAndroid Build Coastguard Worker     //! \brief Initializing constructor.
ImageFormatcl::ImageFormat2116*61046927SAndroid Build Coastguard Worker     ImageFormat(cl_channel_order order, cl_channel_type type)
2117*61046927SAndroid Build Coastguard Worker     {
2118*61046927SAndroid Build Coastguard Worker         image_channel_order = order;
2119*61046927SAndroid Build Coastguard Worker         image_channel_data_type = type;
2120*61046927SAndroid Build Coastguard Worker     }
2121*61046927SAndroid Build Coastguard Worker 
2122*61046927SAndroid Build Coastguard Worker     //! \brief Copy constructor.
ImageFormatcl::ImageFormat2123*61046927SAndroid Build Coastguard Worker     ImageFormat(const ImageFormat &other) { *this = other; }
2124*61046927SAndroid Build Coastguard Worker 
2125*61046927SAndroid Build Coastguard Worker     //! \brief Assignment operator.
operator =cl::ImageFormat2126*61046927SAndroid Build Coastguard Worker     ImageFormat& operator = (const ImageFormat& rhs)
2127*61046927SAndroid Build Coastguard Worker     {
2128*61046927SAndroid Build Coastguard Worker         if (this != &rhs) {
2129*61046927SAndroid Build Coastguard Worker             this->image_channel_data_type = rhs.image_channel_data_type;
2130*61046927SAndroid Build Coastguard Worker             this->image_channel_order     = rhs.image_channel_order;
2131*61046927SAndroid Build Coastguard Worker         }
2132*61046927SAndroid Build Coastguard Worker         return *this;
2133*61046927SAndroid Build Coastguard Worker     }
2134*61046927SAndroid Build Coastguard Worker };
2135*61046927SAndroid Build Coastguard Worker 
2136*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_device_id.
2137*61046927SAndroid Build Coastguard Worker  *
2138*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are inexpensive, since they don't 'own'
2139*61046927SAndroid Build Coastguard Worker  *        any underlying resources or data structures.
2140*61046927SAndroid Build Coastguard Worker  *
2141*61046927SAndroid Build Coastguard Worker  *  \see cl_device_id
2142*61046927SAndroid Build Coastguard Worker  */
2143*61046927SAndroid Build Coastguard Worker class Device : public detail::Wrapper<cl_device_id>
2144*61046927SAndroid Build Coastguard Worker {
2145*61046927SAndroid Build Coastguard Worker private:
2146*61046927SAndroid Build Coastguard Worker     static std::once_flag default_initialized_;
2147*61046927SAndroid Build Coastguard Worker     static Device default_;
2148*61046927SAndroid Build Coastguard Worker     static cl_int default_error_;
2149*61046927SAndroid Build Coastguard Worker 
2150*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default context.
2151*61046927SAndroid Build Coastguard Worker     *
2152*61046927SAndroid Build Coastguard Worker     * This sets @c default_ and @c default_error_. It does not throw
2153*61046927SAndroid Build Coastguard Worker     * @c cl::Error.
2154*61046927SAndroid Build Coastguard Worker     */
2155*61046927SAndroid Build Coastguard Worker     static void makeDefault();
2156*61046927SAndroid Build Coastguard Worker 
2157*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default platform from a provided platform.
2158*61046927SAndroid Build Coastguard Worker     *
2159*61046927SAndroid Build Coastguard Worker     * This sets @c default_. It does not throw
2160*61046927SAndroid Build Coastguard Worker     * @c cl::Error.
2161*61046927SAndroid Build Coastguard Worker     */
makeDefaultProvided(const Device & p)2162*61046927SAndroid Build Coastguard Worker     static void makeDefaultProvided(const Device &p) {
2163*61046927SAndroid Build Coastguard Worker         default_ = p;
2164*61046927SAndroid Build Coastguard Worker     }
2165*61046927SAndroid Build Coastguard Worker 
2166*61046927SAndroid Build Coastguard Worker public:
2167*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_UNIT_TEST_ENABLE
2168*61046927SAndroid Build Coastguard Worker     /*! \brief Reset the default.
2169*61046927SAndroid Build Coastguard Worker     *
2170*61046927SAndroid Build Coastguard Worker     * This sets @c default_ to an empty value to support cleanup in
2171*61046927SAndroid Build Coastguard Worker     * the unit test framework.
2172*61046927SAndroid Build Coastguard Worker     * This function is not thread safe.
2173*61046927SAndroid Build Coastguard Worker     */
unitTestClearDefault()2174*61046927SAndroid Build Coastguard Worker     static void unitTestClearDefault() {
2175*61046927SAndroid Build Coastguard Worker         default_ = Device();
2176*61046927SAndroid Build Coastguard Worker     }
2177*61046927SAndroid Build Coastguard Worker #endif // #ifdef CL_HPP_UNIT_TEST_ENABLE
2178*61046927SAndroid Build Coastguard Worker 
2179*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Device()2180*61046927SAndroid Build Coastguard Worker     Device() : detail::Wrapper<cl_type>() { }
2181*61046927SAndroid Build Coastguard Worker 
2182*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_device_id.
2183*61046927SAndroid Build Coastguard Worker      *
2184*61046927SAndroid Build Coastguard Worker      *  This simply copies the device ID value, which is an inexpensive operation.
2185*61046927SAndroid Build Coastguard Worker      */
Device(const cl_device_id & device,bool retainObject=false)2186*61046927SAndroid Build Coastguard Worker     explicit Device(const cl_device_id &device, bool retainObject = false) :
2187*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(device, retainObject) { }
2188*61046927SAndroid Build Coastguard Worker 
2189*61046927SAndroid Build Coastguard Worker     /*! \brief Returns the first device on the default context.
2190*61046927SAndroid Build Coastguard Worker      *
2191*61046927SAndroid Build Coastguard Worker      *  \see Context::getDefault()
2192*61046927SAndroid Build Coastguard Worker      */
getDefault(cl_int * errResult=NULL)2193*61046927SAndroid Build Coastguard Worker     static Device getDefault(
2194*61046927SAndroid Build Coastguard Worker         cl_int *errResult = NULL)
2195*61046927SAndroid Build Coastguard Worker     {
2196*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefault);
2197*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
2198*61046927SAndroid Build Coastguard Worker         if (errResult != NULL) {
2199*61046927SAndroid Build Coastguard Worker             *errResult = default_error_;
2200*61046927SAndroid Build Coastguard Worker         }
2201*61046927SAndroid Build Coastguard Worker         return default_;
2202*61046927SAndroid Build Coastguard Worker     }
2203*61046927SAndroid Build Coastguard Worker 
2204*61046927SAndroid Build Coastguard Worker     /**
2205*61046927SAndroid Build Coastguard Worker     * Modify the default device to be used by
2206*61046927SAndroid Build Coastguard Worker     * subsequent operations.
2207*61046927SAndroid Build Coastguard Worker     * Will only set the default if no default was previously created.
2208*61046927SAndroid Build Coastguard Worker     * @return updated default device.
2209*61046927SAndroid Build Coastguard Worker     *         Should be compared to the passed value to ensure that it was updated.
2210*61046927SAndroid Build Coastguard Worker     */
setDefault(const Device & default_device)2211*61046927SAndroid Build Coastguard Worker     static Device setDefault(const Device &default_device)
2212*61046927SAndroid Build Coastguard Worker     {
2213*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefaultProvided, std::cref(default_device));
2214*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
2215*61046927SAndroid Build Coastguard Worker         return default_;
2216*61046927SAndroid Build Coastguard Worker     }
2217*61046927SAndroid Build Coastguard Worker 
2218*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_device_id.
2219*61046927SAndroid Build Coastguard Worker      *
2220*61046927SAndroid Build Coastguard Worker      *  This simply copies the device ID value, which is an inexpensive operation.
2221*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_device_id & rhs)2222*61046927SAndroid Build Coastguard Worker     Device& operator = (const cl_device_id& rhs)
2223*61046927SAndroid Build Coastguard Worker     {
2224*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
2225*61046927SAndroid Build Coastguard Worker         return *this;
2226*61046927SAndroid Build Coastguard Worker     }
2227*61046927SAndroid Build Coastguard Worker 
2228*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
2229*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
2230*61046927SAndroid Build Coastguard Worker     */
Device(const Device & dev)2231*61046927SAndroid Build Coastguard Worker     Device(const Device& dev) : detail::Wrapper<cl_type>(dev) {}
2232*61046927SAndroid Build Coastguard Worker 
2233*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
2234*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
2235*61046927SAndroid Build Coastguard Worker     */
operator =(const Device & dev)2236*61046927SAndroid Build Coastguard Worker     Device& operator = (const Device &dev)
2237*61046927SAndroid Build Coastguard Worker     {
2238*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(dev);
2239*61046927SAndroid Build Coastguard Worker         return *this;
2240*61046927SAndroid Build Coastguard Worker     }
2241*61046927SAndroid Build Coastguard Worker 
2242*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
2243*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
2244*61046927SAndroid Build Coastguard Worker     */
Device(Device && dev)2245*61046927SAndroid Build Coastguard Worker     Device(Device&& dev) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(dev)) {}
2246*61046927SAndroid Build Coastguard Worker 
2247*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
2248*61046927SAndroid Build Coastguard Worker     * Required for MSVC.
2249*61046927SAndroid Build Coastguard Worker     */
operator =(Device && dev)2250*61046927SAndroid Build Coastguard Worker     Device& operator = (Device &&dev)
2251*61046927SAndroid Build Coastguard Worker     {
2252*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(dev));
2253*61046927SAndroid Build Coastguard Worker         return *this;
2254*61046927SAndroid Build Coastguard Worker     }
2255*61046927SAndroid Build Coastguard Worker 
2256*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetDeviceInfo().
2257*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_device_info name,T * param) const2258*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_device_info name, T* param) const
2259*61046927SAndroid Build Coastguard Worker     {
2260*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2261*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetDeviceInfo, object_, name, param),
2262*61046927SAndroid Build Coastguard Worker             __GET_DEVICE_INFO_ERR);
2263*61046927SAndroid Build Coastguard Worker     }
2264*61046927SAndroid Build Coastguard Worker 
2265*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetDeviceInfo() that returns by value.
2266*61046927SAndroid Build Coastguard Worker     template <cl_device_info name> typename
2267*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_device_info, name>::param_type
getInfo(cl_int * err=NULL) const2268*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
2269*61046927SAndroid Build Coastguard Worker     {
2270*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2271*61046927SAndroid Build Coastguard Worker             detail::cl_device_info, name>::param_type param;
2272*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
2273*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2274*61046927SAndroid Build Coastguard Worker             *err = result;
2275*61046927SAndroid Build Coastguard Worker         }
2276*61046927SAndroid Build Coastguard Worker         return param;
2277*61046927SAndroid Build Coastguard Worker     }
2278*61046927SAndroid Build Coastguard Worker 
2279*61046927SAndroid Build Coastguard Worker 
2280*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
2281*61046927SAndroid Build Coastguard Worker     /**
2282*61046927SAndroid Build Coastguard Worker      * Return the current value of the host clock as seen by the device.
2283*61046927SAndroid Build Coastguard Worker      * The resolution of the device timer may be queried with the
2284*61046927SAndroid Build Coastguard Worker      * CL_DEVICE_PROFILING_TIMER_RESOLUTION query.
2285*61046927SAndroid Build Coastguard Worker      * @return The host timer value.
2286*61046927SAndroid Build Coastguard Worker      */
getHostTimer(cl_int * error=nullptr)2287*61046927SAndroid Build Coastguard Worker     cl_ulong getHostTimer(cl_int *error = nullptr)
2288*61046927SAndroid Build Coastguard Worker     {
2289*61046927SAndroid Build Coastguard Worker         cl_ulong retVal = 0;
2290*61046927SAndroid Build Coastguard Worker         cl_int err =
2291*61046927SAndroid Build Coastguard Worker             clGetHostTimer(this->get(), &retVal);
2292*61046927SAndroid Build Coastguard Worker         detail::errHandler(
2293*61046927SAndroid Build Coastguard Worker             err,
2294*61046927SAndroid Build Coastguard Worker             __GET_HOST_TIMER_ERR);
2295*61046927SAndroid Build Coastguard Worker         if (error) {
2296*61046927SAndroid Build Coastguard Worker             *error = err;
2297*61046927SAndroid Build Coastguard Worker         }
2298*61046927SAndroid Build Coastguard Worker         return retVal;
2299*61046927SAndroid Build Coastguard Worker     }
2300*61046927SAndroid Build Coastguard Worker 
2301*61046927SAndroid Build Coastguard Worker     /**
2302*61046927SAndroid Build Coastguard Worker      * Return a synchronized pair of host and device timestamps as seen by device.
2303*61046927SAndroid Build Coastguard Worker      * Use to correlate the clocks and get the host timer only using getHostTimer
2304*61046927SAndroid Build Coastguard Worker      * as a lower cost mechanism in between calls.
2305*61046927SAndroid Build Coastguard Worker      * The resolution of the host timer may be queried with the
2306*61046927SAndroid Build Coastguard Worker      * CL_PLATFORM_HOST_TIMER_RESOLUTION query.
2307*61046927SAndroid Build Coastguard Worker      * The resolution of the device timer may be queried with the
2308*61046927SAndroid Build Coastguard Worker      * CL_DEVICE_PROFILING_TIMER_RESOLUTION query.
2309*61046927SAndroid Build Coastguard Worker      * @return A pair of (device timer, host timer) timer values.
2310*61046927SAndroid Build Coastguard Worker      */
getDeviceAndHostTimer(cl_int * error=nullptr)2311*61046927SAndroid Build Coastguard Worker     std::pair<cl_ulong, cl_ulong> getDeviceAndHostTimer(cl_int *error = nullptr)
2312*61046927SAndroid Build Coastguard Worker     {
2313*61046927SAndroid Build Coastguard Worker         std::pair<cl_ulong, cl_ulong> retVal;
2314*61046927SAndroid Build Coastguard Worker         cl_int err =
2315*61046927SAndroid Build Coastguard Worker             clGetDeviceAndHostTimer(this->get(), &(retVal.first), &(retVal.second));
2316*61046927SAndroid Build Coastguard Worker         detail::errHandler(
2317*61046927SAndroid Build Coastguard Worker             err,
2318*61046927SAndroid Build Coastguard Worker             __GET_DEVICE_AND_HOST_TIMER_ERR);
2319*61046927SAndroid Build Coastguard Worker         if (error) {
2320*61046927SAndroid Build Coastguard Worker             *error = err;
2321*61046927SAndroid Build Coastguard Worker         }
2322*61046927SAndroid Build Coastguard Worker         return retVal;
2323*61046927SAndroid Build Coastguard Worker     }
2324*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
2325*61046927SAndroid Build Coastguard Worker 
2326*61046927SAndroid Build Coastguard Worker     /**
2327*61046927SAndroid Build Coastguard Worker      * CL 1.2 version
2328*61046927SAndroid Build Coastguard Worker      */
2329*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
2330*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clCreateSubDevices().
createSubDevices(const cl_device_partition_property * properties,vector<Device> * devices)2331*61046927SAndroid Build Coastguard Worker     cl_int createSubDevices(
2332*61046927SAndroid Build Coastguard Worker         const cl_device_partition_property * properties,
2333*61046927SAndroid Build Coastguard Worker         vector<Device>* devices)
2334*61046927SAndroid Build Coastguard Worker     {
2335*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2336*61046927SAndroid Build Coastguard Worker         cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n);
2337*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2338*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES_ERR);
2339*61046927SAndroid Build Coastguard Worker         }
2340*61046927SAndroid Build Coastguard Worker 
2341*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> ids(n);
2342*61046927SAndroid Build Coastguard Worker         err = clCreateSubDevices(object_, properties, n, ids.data(), NULL);
2343*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2344*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES_ERR);
2345*61046927SAndroid Build Coastguard Worker         }
2346*61046927SAndroid Build Coastguard Worker 
2347*61046927SAndroid Build Coastguard Worker         // Cannot trivially assign because we need to capture intermediates
2348*61046927SAndroid Build Coastguard Worker         // with safe construction
2349*61046927SAndroid Build Coastguard Worker         if (devices) {
2350*61046927SAndroid Build Coastguard Worker             devices->resize(ids.size());
2351*61046927SAndroid Build Coastguard Worker 
2352*61046927SAndroid Build Coastguard Worker             // Assign to param, constructing with retain behaviour
2353*61046927SAndroid Build Coastguard Worker             // to correctly capture each underlying CL object
2354*61046927SAndroid Build Coastguard Worker             for (size_type i = 0; i < ids.size(); i++) {
2355*61046927SAndroid Build Coastguard Worker                 // We do not need to retain because this device is being created
2356*61046927SAndroid Build Coastguard Worker                 // by the runtime
2357*61046927SAndroid Build Coastguard Worker                 (*devices)[i] = Device(ids[i], false);
2358*61046927SAndroid Build Coastguard Worker             }
2359*61046927SAndroid Build Coastguard Worker         }
2360*61046927SAndroid Build Coastguard Worker 
2361*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2362*61046927SAndroid Build Coastguard Worker     }
2363*61046927SAndroid Build Coastguard Worker #elif defined(CL_HPP_USE_CL_DEVICE_FISSION)
2364*61046927SAndroid Build Coastguard Worker 
2365*61046927SAndroid Build Coastguard Worker /**
2366*61046927SAndroid Build Coastguard Worker  * CL 1.1 version that uses device fission extension.
2367*61046927SAndroid Build Coastguard Worker  */
createSubDevices(const cl_device_partition_property_ext * properties,vector<Device> * devices)2368*61046927SAndroid Build Coastguard Worker     cl_int createSubDevices(
2369*61046927SAndroid Build Coastguard Worker         const cl_device_partition_property_ext * properties,
2370*61046927SAndroid Build Coastguard Worker         vector<Device>* devices)
2371*61046927SAndroid Build Coastguard Worker     {
2372*61046927SAndroid Build Coastguard Worker         typedef CL_API_ENTRY cl_int
2373*61046927SAndroid Build Coastguard Worker             ( CL_API_CALL * PFN_clCreateSubDevicesEXT)(
2374*61046927SAndroid Build Coastguard Worker                 cl_device_id /*in_device*/,
2375*61046927SAndroid Build Coastguard Worker                 const cl_device_partition_property_ext * /* properties */,
2376*61046927SAndroid Build Coastguard Worker                 cl_uint /*num_entries*/,
2377*61046927SAndroid Build Coastguard Worker                 cl_device_id * /*out_devices*/,
2378*61046927SAndroid Build Coastguard Worker                 cl_uint * /*num_devices*/ ) CL_API_SUFFIX__VERSION_1_1;
2379*61046927SAndroid Build Coastguard Worker 
2380*61046927SAndroid Build Coastguard Worker         static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL;
2381*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clCreateSubDevicesEXT);
2382*61046927SAndroid Build Coastguard Worker 
2383*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2384*61046927SAndroid Build Coastguard Worker         cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n);
2385*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2386*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES_ERR);
2387*61046927SAndroid Build Coastguard Worker         }
2388*61046927SAndroid Build Coastguard Worker 
2389*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> ids(n);
2390*61046927SAndroid Build Coastguard Worker         err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids.data(), NULL);
2391*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2392*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_SUB_DEVICES_ERR);
2393*61046927SAndroid Build Coastguard Worker         }
2394*61046927SAndroid Build Coastguard Worker         // Cannot trivially assign because we need to capture intermediates
2395*61046927SAndroid Build Coastguard Worker         // with safe construction
2396*61046927SAndroid Build Coastguard Worker         if (devices) {
2397*61046927SAndroid Build Coastguard Worker             devices->resize(ids.size());
2398*61046927SAndroid Build Coastguard Worker 
2399*61046927SAndroid Build Coastguard Worker             // Assign to param, constructing with retain behaviour
2400*61046927SAndroid Build Coastguard Worker             // to correctly capture each underlying CL object
2401*61046927SAndroid Build Coastguard Worker             for (size_type i = 0; i < ids.size(); i++) {
2402*61046927SAndroid Build Coastguard Worker                 // We do not need to retain because this device is being created
2403*61046927SAndroid Build Coastguard Worker                 // by the runtime
2404*61046927SAndroid Build Coastguard Worker                 (*devices)[i] = Device(ids[i], false);
2405*61046927SAndroid Build Coastguard Worker             }
2406*61046927SAndroid Build Coastguard Worker         }
2407*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2408*61046927SAndroid Build Coastguard Worker     }
2409*61046927SAndroid Build Coastguard Worker #endif // defined(CL_HPP_USE_CL_DEVICE_FISSION)
2410*61046927SAndroid Build Coastguard Worker };
2411*61046927SAndroid Build Coastguard Worker 
2412*61046927SAndroid Build Coastguard Worker using BuildLogType = vector<std::pair<cl::Device, typename detail::param_traits<detail::cl_program_build_info, CL_PROGRAM_BUILD_LOG>::param_type>>;
2413*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
2414*61046927SAndroid Build Coastguard Worker /**
2415*61046927SAndroid Build Coastguard Worker * Exception class for build errors to carry build info
2416*61046927SAndroid Build Coastguard Worker */
2417*61046927SAndroid Build Coastguard Worker class BuildError : public Error
2418*61046927SAndroid Build Coastguard Worker {
2419*61046927SAndroid Build Coastguard Worker private:
2420*61046927SAndroid Build Coastguard Worker     BuildLogType buildLogs;
2421*61046927SAndroid Build Coastguard Worker public:
BuildError(cl_int err,const char * errStr,const BuildLogType & vec)2422*61046927SAndroid Build Coastguard Worker     BuildError(cl_int err, const char * errStr, const BuildLogType &vec) : Error(err, errStr), buildLogs(vec)
2423*61046927SAndroid Build Coastguard Worker     {
2424*61046927SAndroid Build Coastguard Worker     }
2425*61046927SAndroid Build Coastguard Worker 
getBuildLog() const2426*61046927SAndroid Build Coastguard Worker     BuildLogType getBuildLog() const
2427*61046927SAndroid Build Coastguard Worker     {
2428*61046927SAndroid Build Coastguard Worker         return buildLogs;
2429*61046927SAndroid Build Coastguard Worker     }
2430*61046927SAndroid Build Coastguard Worker };
2431*61046927SAndroid Build Coastguard Worker namespace detail {
buildErrHandler(cl_int err,const char * errStr,const BuildLogType & buildLogs)2432*61046927SAndroid Build Coastguard Worker     static inline cl_int buildErrHandler(
2433*61046927SAndroid Build Coastguard Worker         cl_int err,
2434*61046927SAndroid Build Coastguard Worker         const char * errStr,
2435*61046927SAndroid Build Coastguard Worker         const BuildLogType &buildLogs)
2436*61046927SAndroid Build Coastguard Worker     {
2437*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2438*61046927SAndroid Build Coastguard Worker             throw BuildError(err, errStr, buildLogs);
2439*61046927SAndroid Build Coastguard Worker         }
2440*61046927SAndroid Build Coastguard Worker         return err;
2441*61046927SAndroid Build Coastguard Worker     }
2442*61046927SAndroid Build Coastguard Worker } // namespace detail
2443*61046927SAndroid Build Coastguard Worker 
2444*61046927SAndroid Build Coastguard Worker #else
2445*61046927SAndroid Build Coastguard Worker namespace detail {
buildErrHandler(cl_int err,const char * errStr,const BuildLogType & buildLogs)2446*61046927SAndroid Build Coastguard Worker     static inline cl_int buildErrHandler(
2447*61046927SAndroid Build Coastguard Worker         cl_int err,
2448*61046927SAndroid Build Coastguard Worker         const char * errStr,
2449*61046927SAndroid Build Coastguard Worker         const BuildLogType &buildLogs)
2450*61046927SAndroid Build Coastguard Worker     {
2451*61046927SAndroid Build Coastguard Worker         (void)buildLogs; // suppress unused variable warning
2452*61046927SAndroid Build Coastguard Worker         (void)errStr;
2453*61046927SAndroid Build Coastguard Worker         return err;
2454*61046927SAndroid Build Coastguard Worker     }
2455*61046927SAndroid Build Coastguard Worker } // namespace detail
2456*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_ENABLE_EXCEPTIONS)
2457*61046927SAndroid Build Coastguard Worker 
2458*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ std::once_flag Device::default_initialized_;
2459*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ Device Device::default_;
2460*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ cl_int Device::default_error_ = CL_SUCCESS;
2461*61046927SAndroid Build Coastguard Worker 
2462*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_platform_id.
2463*61046927SAndroid Build Coastguard Worker  *
2464*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are inexpensive, since they don't 'own'
2465*61046927SAndroid Build Coastguard Worker  *        any underlying resources or data structures.
2466*61046927SAndroid Build Coastguard Worker  *
2467*61046927SAndroid Build Coastguard Worker  *  \see cl_platform_id
2468*61046927SAndroid Build Coastguard Worker  */
2469*61046927SAndroid Build Coastguard Worker class Platform : public detail::Wrapper<cl_platform_id>
2470*61046927SAndroid Build Coastguard Worker {
2471*61046927SAndroid Build Coastguard Worker private:
2472*61046927SAndroid Build Coastguard Worker     static std::once_flag default_initialized_;
2473*61046927SAndroid Build Coastguard Worker     static Platform default_;
2474*61046927SAndroid Build Coastguard Worker     static cl_int default_error_;
2475*61046927SAndroid Build Coastguard Worker 
2476*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default context.
2477*61046927SAndroid Build Coastguard Worker     *
2478*61046927SAndroid Build Coastguard Worker     * This sets @c default_ and @c default_error_. It does not throw
2479*61046927SAndroid Build Coastguard Worker     * @c cl::Error.
2480*61046927SAndroid Build Coastguard Worker     */
makeDefault()2481*61046927SAndroid Build Coastguard Worker     static void makeDefault() {
2482*61046927SAndroid Build Coastguard Worker         /* Throwing an exception from a call_once invocation does not do
2483*61046927SAndroid Build Coastguard Worker         * what we wish, so we catch it and save the error.
2484*61046927SAndroid Build Coastguard Worker         */
2485*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
2486*61046927SAndroid Build Coastguard Worker         try
2487*61046927SAndroid Build Coastguard Worker #endif
2488*61046927SAndroid Build Coastguard Worker         {
2489*61046927SAndroid Build Coastguard Worker             // If default wasn't passed ,generate one
2490*61046927SAndroid Build Coastguard Worker             // Otherwise set it
2491*61046927SAndroid Build Coastguard Worker             cl_uint n = 0;
2492*61046927SAndroid Build Coastguard Worker 
2493*61046927SAndroid Build Coastguard Worker             cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2494*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
2495*61046927SAndroid Build Coastguard Worker                 default_error_ = err;
2496*61046927SAndroid Build Coastguard Worker                 return;
2497*61046927SAndroid Build Coastguard Worker             }
2498*61046927SAndroid Build Coastguard Worker             if (n == 0) {
2499*61046927SAndroid Build Coastguard Worker                 default_error_ = CL_INVALID_PLATFORM;
2500*61046927SAndroid Build Coastguard Worker                 return;
2501*61046927SAndroid Build Coastguard Worker             }
2502*61046927SAndroid Build Coastguard Worker 
2503*61046927SAndroid Build Coastguard Worker             vector<cl_platform_id> ids(n);
2504*61046927SAndroid Build Coastguard Worker             err = ::clGetPlatformIDs(n, ids.data(), NULL);
2505*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
2506*61046927SAndroid Build Coastguard Worker                 default_error_ = err;
2507*61046927SAndroid Build Coastguard Worker                 return;
2508*61046927SAndroid Build Coastguard Worker             }
2509*61046927SAndroid Build Coastguard Worker 
2510*61046927SAndroid Build Coastguard Worker             default_ = Platform(ids[0]);
2511*61046927SAndroid Build Coastguard Worker         }
2512*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
2513*61046927SAndroid Build Coastguard Worker         catch (cl::Error &e) {
2514*61046927SAndroid Build Coastguard Worker             default_error_ = e.err();
2515*61046927SAndroid Build Coastguard Worker         }
2516*61046927SAndroid Build Coastguard Worker #endif
2517*61046927SAndroid Build Coastguard Worker     }
2518*61046927SAndroid Build Coastguard Worker 
2519*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default platform from a provided platform.
2520*61046927SAndroid Build Coastguard Worker      *
2521*61046927SAndroid Build Coastguard Worker      * This sets @c default_. It does not throw
2522*61046927SAndroid Build Coastguard Worker      * @c cl::Error.
2523*61046927SAndroid Build Coastguard Worker      */
makeDefaultProvided(const Platform & p)2524*61046927SAndroid Build Coastguard Worker     static void makeDefaultProvided(const Platform &p) {
2525*61046927SAndroid Build Coastguard Worker        default_ = p;
2526*61046927SAndroid Build Coastguard Worker     }
2527*61046927SAndroid Build Coastguard Worker 
2528*61046927SAndroid Build Coastguard Worker public:
2529*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_UNIT_TEST_ENABLE
2530*61046927SAndroid Build Coastguard Worker     /*! \brief Reset the default.
2531*61046927SAndroid Build Coastguard Worker     *
2532*61046927SAndroid Build Coastguard Worker     * This sets @c default_ to an empty value to support cleanup in
2533*61046927SAndroid Build Coastguard Worker     * the unit test framework.
2534*61046927SAndroid Build Coastguard Worker     * This function is not thread safe.
2535*61046927SAndroid Build Coastguard Worker     */
unitTestClearDefault()2536*61046927SAndroid Build Coastguard Worker     static void unitTestClearDefault() {
2537*61046927SAndroid Build Coastguard Worker         default_ = Platform();
2538*61046927SAndroid Build Coastguard Worker     }
2539*61046927SAndroid Build Coastguard Worker #endif // #ifdef CL_HPP_UNIT_TEST_ENABLE
2540*61046927SAndroid Build Coastguard Worker 
2541*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Platform()2542*61046927SAndroid Build Coastguard Worker     Platform() : detail::Wrapper<cl_type>()  { }
2543*61046927SAndroid Build Coastguard Worker 
2544*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_platform_id.
2545*61046927SAndroid Build Coastguard Worker      *
2546*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
2547*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
2548*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
2549*61046927SAndroid Build Coastguard Worker      *  This simply copies the platform ID value, which is an inexpensive operation.
2550*61046927SAndroid Build Coastguard Worker      */
Platform(const cl_platform_id & platform,bool retainObject=false)2551*61046927SAndroid Build Coastguard Worker     explicit Platform(const cl_platform_id &platform, bool retainObject = false) :
2552*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(platform, retainObject) { }
2553*61046927SAndroid Build Coastguard Worker 
2554*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_platform_id.
2555*61046927SAndroid Build Coastguard Worker      *
2556*61046927SAndroid Build Coastguard Worker      *  This simply copies the platform ID value, which is an inexpensive operation.
2557*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_platform_id & rhs)2558*61046927SAndroid Build Coastguard Worker     Platform& operator = (const cl_platform_id& rhs)
2559*61046927SAndroid Build Coastguard Worker     {
2560*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
2561*61046927SAndroid Build Coastguard Worker         return *this;
2562*61046927SAndroid Build Coastguard Worker     }
2563*61046927SAndroid Build Coastguard Worker 
getDefault(cl_int * errResult=NULL)2564*61046927SAndroid Build Coastguard Worker     static Platform getDefault(
2565*61046927SAndroid Build Coastguard Worker         cl_int *errResult = NULL)
2566*61046927SAndroid Build Coastguard Worker     {
2567*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefault);
2568*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
2569*61046927SAndroid Build Coastguard Worker         if (errResult != NULL) {
2570*61046927SAndroid Build Coastguard Worker             *errResult = default_error_;
2571*61046927SAndroid Build Coastguard Worker         }
2572*61046927SAndroid Build Coastguard Worker         return default_;
2573*61046927SAndroid Build Coastguard Worker     }
2574*61046927SAndroid Build Coastguard Worker 
2575*61046927SAndroid Build Coastguard Worker     /**
2576*61046927SAndroid Build Coastguard Worker      * Modify the default platform to be used by
2577*61046927SAndroid Build Coastguard Worker      * subsequent operations.
2578*61046927SAndroid Build Coastguard Worker      * Will only set the default if no default was previously created.
2579*61046927SAndroid Build Coastguard Worker      * @return updated default platform.
2580*61046927SAndroid Build Coastguard Worker      *         Should be compared to the passed value to ensure that it was updated.
2581*61046927SAndroid Build Coastguard Worker      */
setDefault(const Platform & default_platform)2582*61046927SAndroid Build Coastguard Worker     static Platform setDefault(const Platform &default_platform)
2583*61046927SAndroid Build Coastguard Worker     {
2584*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefaultProvided, std::cref(default_platform));
2585*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
2586*61046927SAndroid Build Coastguard Worker         return default_;
2587*61046927SAndroid Build Coastguard Worker     }
2588*61046927SAndroid Build Coastguard Worker 
2589*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetPlatformInfo().
2590*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_platform_info name,T * param) const2591*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_platform_info name, T* param) const
2592*61046927SAndroid Build Coastguard Worker     {
2593*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
2594*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetPlatformInfo, object_, name, param),
2595*61046927SAndroid Build Coastguard Worker             __GET_PLATFORM_INFO_ERR);
2596*61046927SAndroid Build Coastguard Worker     }
2597*61046927SAndroid Build Coastguard Worker 
2598*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetPlatformInfo() that returns by value.
2599*61046927SAndroid Build Coastguard Worker     template <cl_platform_info name> typename
2600*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_platform_info, name>::param_type
getInfo(cl_int * err=NULL) const2601*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
2602*61046927SAndroid Build Coastguard Worker     {
2603*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
2604*61046927SAndroid Build Coastguard Worker             detail::cl_platform_info, name>::param_type param;
2605*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
2606*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2607*61046927SAndroid Build Coastguard Worker             *err = result;
2608*61046927SAndroid Build Coastguard Worker         }
2609*61046927SAndroid Build Coastguard Worker         return param;
2610*61046927SAndroid Build Coastguard Worker     }
2611*61046927SAndroid Build Coastguard Worker 
2612*61046927SAndroid Build Coastguard Worker     /*! \brief Gets a list of devices for this platform.
2613*61046927SAndroid Build Coastguard Worker      *
2614*61046927SAndroid Build Coastguard Worker      *  Wraps clGetDeviceIDs().
2615*61046927SAndroid Build Coastguard Worker      */
getDevices(cl_device_type type,vector<Device> * devices) const2616*61046927SAndroid Build Coastguard Worker     cl_int getDevices(
2617*61046927SAndroid Build Coastguard Worker         cl_device_type type,
2618*61046927SAndroid Build Coastguard Worker         vector<Device>* devices) const
2619*61046927SAndroid Build Coastguard Worker     {
2620*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2621*61046927SAndroid Build Coastguard Worker         if( devices == NULL ) {
2622*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2623*61046927SAndroid Build Coastguard Worker         }
2624*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n);
2625*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS  && err != CL_DEVICE_NOT_FOUND) {
2626*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2627*61046927SAndroid Build Coastguard Worker         }
2628*61046927SAndroid Build Coastguard Worker 
2629*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> ids(n);
2630*61046927SAndroid Build Coastguard Worker         if (n>0) {
2631*61046927SAndroid Build Coastguard Worker             err = ::clGetDeviceIDs(object_, type, n, ids.data(), NULL);
2632*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
2633*61046927SAndroid Build Coastguard Worker                 return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2634*61046927SAndroid Build Coastguard Worker             }
2635*61046927SAndroid Build Coastguard Worker         }
2636*61046927SAndroid Build Coastguard Worker 
2637*61046927SAndroid Build Coastguard Worker         // Cannot trivially assign because we need to capture intermediates
2638*61046927SAndroid Build Coastguard Worker         // with safe construction
2639*61046927SAndroid Build Coastguard Worker         // We must retain things we obtain from the API to avoid releasing
2640*61046927SAndroid Build Coastguard Worker         // API-owned objects.
2641*61046927SAndroid Build Coastguard Worker         if (devices) {
2642*61046927SAndroid Build Coastguard Worker             devices->resize(ids.size());
2643*61046927SAndroid Build Coastguard Worker 
2644*61046927SAndroid Build Coastguard Worker             // Assign to param, constructing with retain behaviour
2645*61046927SAndroid Build Coastguard Worker             // to correctly capture each underlying CL object
2646*61046927SAndroid Build Coastguard Worker             for (size_type i = 0; i < ids.size(); i++) {
2647*61046927SAndroid Build Coastguard Worker                 (*devices)[i] = Device(ids[i], true);
2648*61046927SAndroid Build Coastguard Worker             }
2649*61046927SAndroid Build Coastguard Worker         }
2650*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2651*61046927SAndroid Build Coastguard Worker     }
2652*61046927SAndroid Build Coastguard Worker 
2653*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_DX_INTEROP)
2654*61046927SAndroid Build Coastguard Worker    /*! \brief Get the list of available D3D10 devices.
2655*61046927SAndroid Build Coastguard Worker      *
2656*61046927SAndroid Build Coastguard Worker      *  \param d3d_device_source.
2657*61046927SAndroid Build Coastguard Worker      *
2658*61046927SAndroid Build Coastguard Worker      *  \param d3d_object.
2659*61046927SAndroid Build Coastguard Worker      *
2660*61046927SAndroid Build Coastguard Worker      *  \param d3d_device_set.
2661*61046927SAndroid Build Coastguard Worker      *
2662*61046927SAndroid Build Coastguard Worker      *  \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device
2663*61046927SAndroid Build Coastguard Worker      *  values returned in devices can be used to identify a specific OpenCL
2664*61046927SAndroid Build Coastguard Worker      *  device. If \a devices argument is NULL, this argument is ignored.
2665*61046927SAndroid Build Coastguard Worker      *
2666*61046927SAndroid Build Coastguard Worker      *  \return One of the following values:
2667*61046927SAndroid Build Coastguard Worker      *    - CL_SUCCESS if the function is executed successfully.
2668*61046927SAndroid Build Coastguard Worker      *
2669*61046927SAndroid Build Coastguard Worker      *  The application can query specific capabilities of the OpenCL device(s)
2670*61046927SAndroid Build Coastguard Worker      *  returned by cl::getDevices. This can be used by the application to
2671*61046927SAndroid Build Coastguard Worker      *  determine which device(s) to use.
2672*61046927SAndroid Build Coastguard Worker      *
2673*61046927SAndroid Build Coastguard Worker      * \note In the case that exceptions are enabled and a return value
2674*61046927SAndroid Build Coastguard Worker      * other than CL_SUCCESS is generated, then cl::Error exception is
2675*61046927SAndroid Build Coastguard Worker      * generated.
2676*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<Device> * devices) const2677*61046927SAndroid Build Coastguard Worker     cl_int getDevices(
2678*61046927SAndroid Build Coastguard Worker         cl_d3d10_device_source_khr d3d_device_source,
2679*61046927SAndroid Build Coastguard Worker         void *                     d3d_object,
2680*61046927SAndroid Build Coastguard Worker         cl_d3d10_device_set_khr    d3d_device_set,
2681*61046927SAndroid Build Coastguard Worker         vector<Device>* devices) const
2682*61046927SAndroid Build Coastguard Worker     {
2683*61046927SAndroid Build Coastguard Worker         typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)(
2684*61046927SAndroid Build Coastguard Worker             cl_platform_id platform,
2685*61046927SAndroid Build Coastguard Worker             cl_d3d10_device_source_khr d3d_device_source,
2686*61046927SAndroid Build Coastguard Worker             void * d3d_object,
2687*61046927SAndroid Build Coastguard Worker             cl_d3d10_device_set_khr d3d_device_set,
2688*61046927SAndroid Build Coastguard Worker             cl_uint num_entries,
2689*61046927SAndroid Build Coastguard Worker             cl_device_id * devices,
2690*61046927SAndroid Build Coastguard Worker             cl_uint* num_devices);
2691*61046927SAndroid Build Coastguard Worker 
2692*61046927SAndroid Build Coastguard Worker         if( devices == NULL ) {
2693*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2694*61046927SAndroid Build Coastguard Worker         }
2695*61046927SAndroid Build Coastguard Worker 
2696*61046927SAndroid Build Coastguard Worker         static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL;
2697*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_PLATFORM_(object_, clGetDeviceIDsFromD3D10KHR);
2698*61046927SAndroid Build Coastguard Worker 
2699*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2700*61046927SAndroid Build Coastguard Worker         cl_int err = pfn_clGetDeviceIDsFromD3D10KHR(
2701*61046927SAndroid Build Coastguard Worker             object_,
2702*61046927SAndroid Build Coastguard Worker             d3d_device_source,
2703*61046927SAndroid Build Coastguard Worker             d3d_object,
2704*61046927SAndroid Build Coastguard Worker             d3d_device_set,
2705*61046927SAndroid Build Coastguard Worker             0,
2706*61046927SAndroid Build Coastguard Worker             NULL,
2707*61046927SAndroid Build Coastguard Worker             &n);
2708*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2709*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2710*61046927SAndroid Build Coastguard Worker         }
2711*61046927SAndroid Build Coastguard Worker 
2712*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> ids(n);
2713*61046927SAndroid Build Coastguard Worker         err = pfn_clGetDeviceIDsFromD3D10KHR(
2714*61046927SAndroid Build Coastguard Worker             object_,
2715*61046927SAndroid Build Coastguard Worker             d3d_device_source,
2716*61046927SAndroid Build Coastguard Worker             d3d_object,
2717*61046927SAndroid Build Coastguard Worker             d3d_device_set,
2718*61046927SAndroid Build Coastguard Worker             n,
2719*61046927SAndroid Build Coastguard Worker             ids.data(),
2720*61046927SAndroid Build Coastguard Worker             NULL);
2721*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2722*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2723*61046927SAndroid Build Coastguard Worker         }
2724*61046927SAndroid Build Coastguard Worker 
2725*61046927SAndroid Build Coastguard Worker         // Cannot trivially assign because we need to capture intermediates
2726*61046927SAndroid Build Coastguard Worker         // with safe construction
2727*61046927SAndroid Build Coastguard Worker         // We must retain things we obtain from the API to avoid releasing
2728*61046927SAndroid Build Coastguard Worker         // API-owned objects.
2729*61046927SAndroid Build Coastguard Worker         if (devices) {
2730*61046927SAndroid Build Coastguard Worker             devices->resize(ids.size());
2731*61046927SAndroid Build Coastguard Worker 
2732*61046927SAndroid Build Coastguard Worker             // Assign to param, constructing with retain behaviour
2733*61046927SAndroid Build Coastguard Worker             // to correctly capture each underlying CL object
2734*61046927SAndroid Build Coastguard Worker             for (size_type i = 0; i < ids.size(); i++) {
2735*61046927SAndroid Build Coastguard Worker                 (*devices)[i] = Device(ids[i], true);
2736*61046927SAndroid Build Coastguard Worker             }
2737*61046927SAndroid Build Coastguard Worker         }
2738*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2739*61046927SAndroid Build Coastguard Worker     }
2740*61046927SAndroid Build Coastguard Worker #endif
2741*61046927SAndroid Build Coastguard Worker 
2742*61046927SAndroid Build Coastguard Worker     /*! \brief Gets a list of available platforms.
2743*61046927SAndroid Build Coastguard Worker      *
2744*61046927SAndroid Build Coastguard Worker      *  Wraps clGetPlatformIDs().
2745*61046927SAndroid Build Coastguard Worker      */
get(vector<Platform> * platforms)2746*61046927SAndroid Build Coastguard Worker     static cl_int get(
2747*61046927SAndroid Build Coastguard Worker         vector<Platform>* platforms)
2748*61046927SAndroid Build Coastguard Worker     {
2749*61046927SAndroid Build Coastguard Worker         cl_uint n = 0;
2750*61046927SAndroid Build Coastguard Worker 
2751*61046927SAndroid Build Coastguard Worker         if( platforms == NULL ) {
2752*61046927SAndroid Build Coastguard Worker             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2753*61046927SAndroid Build Coastguard Worker         }
2754*61046927SAndroid Build Coastguard Worker 
2755*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2756*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2757*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2758*61046927SAndroid Build Coastguard Worker         }
2759*61046927SAndroid Build Coastguard Worker 
2760*61046927SAndroid Build Coastguard Worker         vector<cl_platform_id> ids(n);
2761*61046927SAndroid Build Coastguard Worker         err = ::clGetPlatformIDs(n, ids.data(), NULL);
2762*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
2763*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2764*61046927SAndroid Build Coastguard Worker         }
2765*61046927SAndroid Build Coastguard Worker 
2766*61046927SAndroid Build Coastguard Worker         if (platforms) {
2767*61046927SAndroid Build Coastguard Worker             platforms->resize(ids.size());
2768*61046927SAndroid Build Coastguard Worker 
2769*61046927SAndroid Build Coastguard Worker             // Platforms don't reference count
2770*61046927SAndroid Build Coastguard Worker             for (size_type i = 0; i < ids.size(); i++) {
2771*61046927SAndroid Build Coastguard Worker                 (*platforms)[i] = Platform(ids[i]);
2772*61046927SAndroid Build Coastguard Worker             }
2773*61046927SAndroid Build Coastguard Worker         }
2774*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
2775*61046927SAndroid Build Coastguard Worker     }
2776*61046927SAndroid Build Coastguard Worker 
2777*61046927SAndroid Build Coastguard Worker     /*! \brief Gets the first available platform.
2778*61046927SAndroid Build Coastguard Worker      *
2779*61046927SAndroid Build Coastguard Worker      *  Wraps clGetPlatformIDs(), returning the first result.
2780*61046927SAndroid Build Coastguard Worker      */
get(Platform * platform)2781*61046927SAndroid Build Coastguard Worker     static cl_int get(
2782*61046927SAndroid Build Coastguard Worker         Platform * platform)
2783*61046927SAndroid Build Coastguard Worker     {
2784*61046927SAndroid Build Coastguard Worker         cl_int err;
2785*61046927SAndroid Build Coastguard Worker         Platform default_platform = Platform::getDefault(&err);
2786*61046927SAndroid Build Coastguard Worker         if (platform) {
2787*61046927SAndroid Build Coastguard Worker             *platform = default_platform;
2788*61046927SAndroid Build Coastguard Worker         }
2789*61046927SAndroid Build Coastguard Worker         return err;
2790*61046927SAndroid Build Coastguard Worker     }
2791*61046927SAndroid Build Coastguard Worker 
2792*61046927SAndroid Build Coastguard Worker     /*! \brief Gets the first available platform, returning it by value.
2793*61046927SAndroid Build Coastguard Worker      *
2794*61046927SAndroid Build Coastguard Worker      * \return Returns a valid platform if one is available.
2795*61046927SAndroid Build Coastguard Worker      *         If no platform is available will return a null platform.
2796*61046927SAndroid Build Coastguard Worker      * Throws an exception if no platforms are available
2797*61046927SAndroid Build Coastguard Worker      * or an error condition occurs.
2798*61046927SAndroid Build Coastguard Worker      * Wraps clGetPlatformIDs(), returning the first result.
2799*61046927SAndroid Build Coastguard Worker      */
get(cl_int * errResult=NULL)2800*61046927SAndroid Build Coastguard Worker     static Platform get(
2801*61046927SAndroid Build Coastguard Worker         cl_int * errResult = NULL)
2802*61046927SAndroid Build Coastguard Worker     {
2803*61046927SAndroid Build Coastguard Worker         cl_int err;
2804*61046927SAndroid Build Coastguard Worker         Platform default_platform = Platform::getDefault(&err);
2805*61046927SAndroid Build Coastguard Worker         if (errResult) {
2806*61046927SAndroid Build Coastguard Worker             *errResult = err;
2807*61046927SAndroid Build Coastguard Worker         }
2808*61046927SAndroid Build Coastguard Worker         return default_platform;
2809*61046927SAndroid Build Coastguard Worker     }
2810*61046927SAndroid Build Coastguard Worker 
2811*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
2812*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clUnloadCompiler().
2813*61046927SAndroid Build Coastguard Worker     cl_int
unloadCompiler()2814*61046927SAndroid Build Coastguard Worker     unloadCompiler()
2815*61046927SAndroid Build Coastguard Worker     {
2816*61046927SAndroid Build Coastguard Worker         return ::clUnloadPlatformCompiler(object_);
2817*61046927SAndroid Build Coastguard Worker     }
2818*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
2819*61046927SAndroid Build Coastguard Worker }; // class Platform
2820*61046927SAndroid Build Coastguard Worker 
2821*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ std::once_flag Platform::default_initialized_;
2822*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ Platform Platform::default_;
2823*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ cl_int Platform::default_error_ = CL_SUCCESS;
2824*61046927SAndroid Build Coastguard Worker 
2825*61046927SAndroid Build Coastguard Worker 
2826*61046927SAndroid Build Coastguard Worker /**
2827*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
2828*61046927SAndroid Build Coastguard Worker  */
2829*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
2830*61046927SAndroid Build Coastguard Worker /**
2831*61046927SAndroid Build Coastguard Worker  * Unload the OpenCL compiler.
2832*61046927SAndroid Build Coastguard Worker  * \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead.
2833*61046927SAndroid Build Coastguard Worker  */
2834*61046927SAndroid Build Coastguard Worker inline CL_API_PREFIX__VERSION_1_1_DEPRECATED cl_int
2835*61046927SAndroid Build Coastguard Worker UnloadCompiler() CL_API_SUFFIX__VERSION_1_1_DEPRECATED;
2836*61046927SAndroid Build Coastguard Worker inline cl_int
UnloadCompiler()2837*61046927SAndroid Build Coastguard Worker UnloadCompiler()
2838*61046927SAndroid Build Coastguard Worker {
2839*61046927SAndroid Build Coastguard Worker     return ::clUnloadCompiler();
2840*61046927SAndroid Build Coastguard Worker }
2841*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
2842*61046927SAndroid Build Coastguard Worker 
2843*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_context.
2844*61046927SAndroid Build Coastguard Worker  *
2845*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
2846*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_context as the original.  For details, see
2847*61046927SAndroid Build Coastguard Worker  *        clRetainContext() and clReleaseContext().
2848*61046927SAndroid Build Coastguard Worker  *
2849*61046927SAndroid Build Coastguard Worker  *  \see cl_context
2850*61046927SAndroid Build Coastguard Worker  */
2851*61046927SAndroid Build Coastguard Worker class Context
2852*61046927SAndroid Build Coastguard Worker     : public detail::Wrapper<cl_context>
2853*61046927SAndroid Build Coastguard Worker {
2854*61046927SAndroid Build Coastguard Worker private:
2855*61046927SAndroid Build Coastguard Worker     static std::once_flag default_initialized_;
2856*61046927SAndroid Build Coastguard Worker     static Context default_;
2857*61046927SAndroid Build Coastguard Worker     static cl_int default_error_;
2858*61046927SAndroid Build Coastguard Worker 
2859*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default context from the default device type in the default platform.
2860*61046927SAndroid Build Coastguard Worker      *
2861*61046927SAndroid Build Coastguard Worker      * This sets @c default_ and @c default_error_. It does not throw
2862*61046927SAndroid Build Coastguard Worker      * @c cl::Error.
2863*61046927SAndroid Build Coastguard Worker      */
makeDefault()2864*61046927SAndroid Build Coastguard Worker     static void makeDefault() {
2865*61046927SAndroid Build Coastguard Worker         /* Throwing an exception from a call_once invocation does not do
2866*61046927SAndroid Build Coastguard Worker          * what we wish, so we catch it and save the error.
2867*61046927SAndroid Build Coastguard Worker          */
2868*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
2869*61046927SAndroid Build Coastguard Worker         try
2870*61046927SAndroid Build Coastguard Worker #endif
2871*61046927SAndroid Build Coastguard Worker         {
2872*61046927SAndroid Build Coastguard Worker #if !defined(__APPLE__) && !defined(__MACOS)
2873*61046927SAndroid Build Coastguard Worker             const Platform &p = Platform::getDefault();
2874*61046927SAndroid Build Coastguard Worker             cl_platform_id defaultPlatform = p();
2875*61046927SAndroid Build Coastguard Worker             cl_context_properties properties[3] = {
2876*61046927SAndroid Build Coastguard Worker                 CL_CONTEXT_PLATFORM, (cl_context_properties)defaultPlatform, 0
2877*61046927SAndroid Build Coastguard Worker             };
2878*61046927SAndroid Build Coastguard Worker #else // #if !defined(__APPLE__) && !defined(__MACOS)
2879*61046927SAndroid Build Coastguard Worker             cl_context_properties *properties = nullptr;
2880*61046927SAndroid Build Coastguard Worker #endif // #if !defined(__APPLE__) && !defined(__MACOS)
2881*61046927SAndroid Build Coastguard Worker 
2882*61046927SAndroid Build Coastguard Worker             default_ = Context(
2883*61046927SAndroid Build Coastguard Worker                 CL_DEVICE_TYPE_DEFAULT,
2884*61046927SAndroid Build Coastguard Worker                 properties,
2885*61046927SAndroid Build Coastguard Worker                 NULL,
2886*61046927SAndroid Build Coastguard Worker                 NULL,
2887*61046927SAndroid Build Coastguard Worker                 &default_error_);
2888*61046927SAndroid Build Coastguard Worker         }
2889*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
2890*61046927SAndroid Build Coastguard Worker         catch (cl::Error &e) {
2891*61046927SAndroid Build Coastguard Worker             default_error_ = e.err();
2892*61046927SAndroid Build Coastguard Worker         }
2893*61046927SAndroid Build Coastguard Worker #endif
2894*61046927SAndroid Build Coastguard Worker     }
2895*61046927SAndroid Build Coastguard Worker 
2896*61046927SAndroid Build Coastguard Worker 
2897*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default context from a provided Context.
2898*61046927SAndroid Build Coastguard Worker      *
2899*61046927SAndroid Build Coastguard Worker      * This sets @c default_. It does not throw
2900*61046927SAndroid Build Coastguard Worker      * @c cl::Error.
2901*61046927SAndroid Build Coastguard Worker      */
makeDefaultProvided(const Context & c)2902*61046927SAndroid Build Coastguard Worker     static void makeDefaultProvided(const Context &c) {
2903*61046927SAndroid Build Coastguard Worker         default_ = c;
2904*61046927SAndroid Build Coastguard Worker     }
2905*61046927SAndroid Build Coastguard Worker 
2906*61046927SAndroid Build Coastguard Worker public:
2907*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_UNIT_TEST_ENABLE
2908*61046927SAndroid Build Coastguard Worker     /*! \brief Reset the default.
2909*61046927SAndroid Build Coastguard Worker     *
2910*61046927SAndroid Build Coastguard Worker     * This sets @c default_ to an empty value to support cleanup in
2911*61046927SAndroid Build Coastguard Worker     * the unit test framework.
2912*61046927SAndroid Build Coastguard Worker     * This function is not thread safe.
2913*61046927SAndroid Build Coastguard Worker     */
unitTestClearDefault()2914*61046927SAndroid Build Coastguard Worker     static void unitTestClearDefault() {
2915*61046927SAndroid Build Coastguard Worker         default_ = Context();
2916*61046927SAndroid Build Coastguard Worker     }
2917*61046927SAndroid Build Coastguard Worker #endif // #ifdef CL_HPP_UNIT_TEST_ENABLE
2918*61046927SAndroid Build Coastguard Worker 
2919*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a context including a list of specified devices.
2920*61046927SAndroid Build Coastguard Worker      *
2921*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateContext().
2922*61046927SAndroid Build Coastguard Worker      */
Context(const vector<Device> & devices,const cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,size_type,void *)=NULL,void * data=NULL,cl_int * err=NULL)2923*61046927SAndroid Build Coastguard Worker     Context(
2924*61046927SAndroid Build Coastguard Worker         const vector<Device>& devices,
2925*61046927SAndroid Build Coastguard Worker         const cl_context_properties* properties = NULL,
2926*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(
2927*61046927SAndroid Build Coastguard Worker             const char *,
2928*61046927SAndroid Build Coastguard Worker             const void *,
2929*61046927SAndroid Build Coastguard Worker             size_type,
2930*61046927SAndroid Build Coastguard Worker             void *) = NULL,
2931*61046927SAndroid Build Coastguard Worker         void* data = NULL,
2932*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
2933*61046927SAndroid Build Coastguard Worker     {
2934*61046927SAndroid Build Coastguard Worker         cl_int error;
2935*61046927SAndroid Build Coastguard Worker 
2936*61046927SAndroid Build Coastguard Worker         size_type numDevices = devices.size();
2937*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> deviceIDs(numDevices);
2938*61046927SAndroid Build Coastguard Worker 
2939*61046927SAndroid Build Coastguard Worker         for( size_type deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
2940*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
2941*61046927SAndroid Build Coastguard Worker         }
2942*61046927SAndroid Build Coastguard Worker 
2943*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateContext(
2944*61046927SAndroid Build Coastguard Worker             properties, (cl_uint) numDevices,
2945*61046927SAndroid Build Coastguard Worker             deviceIDs.data(),
2946*61046927SAndroid Build Coastguard Worker             notifyFptr, data, &error);
2947*61046927SAndroid Build Coastguard Worker 
2948*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
2949*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2950*61046927SAndroid Build Coastguard Worker             *err = error;
2951*61046927SAndroid Build Coastguard Worker         }
2952*61046927SAndroid Build Coastguard Worker     }
2953*61046927SAndroid Build Coastguard Worker 
2954*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a context including a specific device.
2955*61046927SAndroid Build Coastguard Worker      *
2956*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateContext().
2957*61046927SAndroid Build Coastguard Worker      */
Context(const Device & device,const cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,size_type,void *)=NULL,void * data=NULL,cl_int * err=NULL)2958*61046927SAndroid Build Coastguard Worker     Context(
2959*61046927SAndroid Build Coastguard Worker         const Device& device,
2960*61046927SAndroid Build Coastguard Worker         const cl_context_properties* properties = NULL,
2961*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(
2962*61046927SAndroid Build Coastguard Worker             const char *,
2963*61046927SAndroid Build Coastguard Worker             const void *,
2964*61046927SAndroid Build Coastguard Worker             size_type,
2965*61046927SAndroid Build Coastguard Worker             void *) = NULL,
2966*61046927SAndroid Build Coastguard Worker         void* data = NULL,
2967*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
2968*61046927SAndroid Build Coastguard Worker     {
2969*61046927SAndroid Build Coastguard Worker         cl_int error;
2970*61046927SAndroid Build Coastguard Worker 
2971*61046927SAndroid Build Coastguard Worker         cl_device_id deviceID = device();
2972*61046927SAndroid Build Coastguard Worker 
2973*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateContext(
2974*61046927SAndroid Build Coastguard Worker             properties, 1,
2975*61046927SAndroid Build Coastguard Worker             &deviceID,
2976*61046927SAndroid Build Coastguard Worker             notifyFptr, data, &error);
2977*61046927SAndroid Build Coastguard Worker 
2978*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
2979*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
2980*61046927SAndroid Build Coastguard Worker             *err = error;
2981*61046927SAndroid Build Coastguard Worker         }
2982*61046927SAndroid Build Coastguard Worker     }
2983*61046927SAndroid Build Coastguard Worker 
2984*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a context including all or a subset of devices of a specified type.
2985*61046927SAndroid Build Coastguard Worker      *
2986*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateContextFromType().
2987*61046927SAndroid Build Coastguard Worker      */
Context(cl_device_type type,const cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,size_type,void *)=NULL,void * data=NULL,cl_int * err=NULL)2988*61046927SAndroid Build Coastguard Worker     Context(
2989*61046927SAndroid Build Coastguard Worker         cl_device_type type,
2990*61046927SAndroid Build Coastguard Worker         const cl_context_properties* properties = NULL,
2991*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(
2992*61046927SAndroid Build Coastguard Worker             const char *,
2993*61046927SAndroid Build Coastguard Worker             const void *,
2994*61046927SAndroid Build Coastguard Worker             size_type,
2995*61046927SAndroid Build Coastguard Worker             void *) = NULL,
2996*61046927SAndroid Build Coastguard Worker         void* data = NULL,
2997*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
2998*61046927SAndroid Build Coastguard Worker     {
2999*61046927SAndroid Build Coastguard Worker         cl_int error;
3000*61046927SAndroid Build Coastguard Worker 
3001*61046927SAndroid Build Coastguard Worker #if !defined(__APPLE__) && !defined(__MACOS)
3002*61046927SAndroid Build Coastguard Worker         cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };
3003*61046927SAndroid Build Coastguard Worker 
3004*61046927SAndroid Build Coastguard Worker         if (properties == NULL) {
3005*61046927SAndroid Build Coastguard Worker             // Get a valid platform ID as we cannot send in a blank one
3006*61046927SAndroid Build Coastguard Worker             vector<Platform> platforms;
3007*61046927SAndroid Build Coastguard Worker             error = Platform::get(&platforms);
3008*61046927SAndroid Build Coastguard Worker             if (error != CL_SUCCESS) {
3009*61046927SAndroid Build Coastguard Worker                 detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
3010*61046927SAndroid Build Coastguard Worker                 if (err != NULL) {
3011*61046927SAndroid Build Coastguard Worker                     *err = error;
3012*61046927SAndroid Build Coastguard Worker                 }
3013*61046927SAndroid Build Coastguard Worker                 return;
3014*61046927SAndroid Build Coastguard Worker             }
3015*61046927SAndroid Build Coastguard Worker 
3016*61046927SAndroid Build Coastguard Worker             // Check the platforms we found for a device of our specified type
3017*61046927SAndroid Build Coastguard Worker             cl_context_properties platform_id = 0;
3018*61046927SAndroid Build Coastguard Worker             for (unsigned int i = 0; i < platforms.size(); i++) {
3019*61046927SAndroid Build Coastguard Worker 
3020*61046927SAndroid Build Coastguard Worker                 vector<Device> devices;
3021*61046927SAndroid Build Coastguard Worker 
3022*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
3023*61046927SAndroid Build Coastguard Worker                 try {
3024*61046927SAndroid Build Coastguard Worker #endif
3025*61046927SAndroid Build Coastguard Worker 
3026*61046927SAndroid Build Coastguard Worker                     error = platforms[i].getDevices(type, &devices);
3027*61046927SAndroid Build Coastguard Worker 
3028*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
3029*61046927SAndroid Build Coastguard Worker                 } catch (cl::Error& e) {
3030*61046927SAndroid Build Coastguard Worker                     error = e.err();
3031*61046927SAndroid Build Coastguard Worker                 }
3032*61046927SAndroid Build Coastguard Worker     // Catch if exceptions are enabled as we don't want to exit if first platform has no devices of type
3033*61046927SAndroid Build Coastguard Worker     // We do error checking next anyway, and can throw there if needed
3034*61046927SAndroid Build Coastguard Worker #endif
3035*61046927SAndroid Build Coastguard Worker 
3036*61046927SAndroid Build Coastguard Worker                 // Only squash CL_SUCCESS and CL_DEVICE_NOT_FOUND
3037*61046927SAndroid Build Coastguard Worker                 if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND) {
3038*61046927SAndroid Build Coastguard Worker                     detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
3039*61046927SAndroid Build Coastguard Worker                     if (err != NULL) {
3040*61046927SAndroid Build Coastguard Worker                         *err = error;
3041*61046927SAndroid Build Coastguard Worker                     }
3042*61046927SAndroid Build Coastguard Worker                 }
3043*61046927SAndroid Build Coastguard Worker 
3044*61046927SAndroid Build Coastguard Worker                 if (devices.size() > 0) {
3045*61046927SAndroid Build Coastguard Worker                     platform_id = (cl_context_properties)platforms[i]();
3046*61046927SAndroid Build Coastguard Worker                     break;
3047*61046927SAndroid Build Coastguard Worker                 }
3048*61046927SAndroid Build Coastguard Worker             }
3049*61046927SAndroid Build Coastguard Worker 
3050*61046927SAndroid Build Coastguard Worker             if (platform_id == 0) {
3051*61046927SAndroid Build Coastguard Worker                 detail::errHandler(CL_DEVICE_NOT_FOUND, __CREATE_CONTEXT_FROM_TYPE_ERR);
3052*61046927SAndroid Build Coastguard Worker                 if (err != NULL) {
3053*61046927SAndroid Build Coastguard Worker                     *err = CL_DEVICE_NOT_FOUND;
3054*61046927SAndroid Build Coastguard Worker                 }
3055*61046927SAndroid Build Coastguard Worker                 return;
3056*61046927SAndroid Build Coastguard Worker             }
3057*61046927SAndroid Build Coastguard Worker 
3058*61046927SAndroid Build Coastguard Worker             prop[1] = platform_id;
3059*61046927SAndroid Build Coastguard Worker             properties = &prop[0];
3060*61046927SAndroid Build Coastguard Worker         }
3061*61046927SAndroid Build Coastguard Worker #endif
3062*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateContextFromType(
3063*61046927SAndroid Build Coastguard Worker             properties, type, notifyFptr, data, &error);
3064*61046927SAndroid Build Coastguard Worker 
3065*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
3066*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3067*61046927SAndroid Build Coastguard Worker             *err = error;
3068*61046927SAndroid Build Coastguard Worker         }
3069*61046927SAndroid Build Coastguard Worker     }
3070*61046927SAndroid Build Coastguard Worker 
3071*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3072*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3073*61046927SAndroid Build Coastguard Worker      */
Context(const Context & ctx)3074*61046927SAndroid Build Coastguard Worker     Context(const Context& ctx) : detail::Wrapper<cl_type>(ctx) {}
3075*61046927SAndroid Build Coastguard Worker 
3076*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3077*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3078*61046927SAndroid Build Coastguard Worker      */
operator =(const Context & ctx)3079*61046927SAndroid Build Coastguard Worker     Context& operator = (const Context &ctx)
3080*61046927SAndroid Build Coastguard Worker     {
3081*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(ctx);
3082*61046927SAndroid Build Coastguard Worker         return *this;
3083*61046927SAndroid Build Coastguard Worker     }
3084*61046927SAndroid Build Coastguard Worker 
3085*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3086*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3087*61046927SAndroid Build Coastguard Worker      */
Context(Context && ctx)3088*61046927SAndroid Build Coastguard Worker     Context(Context&& ctx) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(ctx)) {}
3089*61046927SAndroid Build Coastguard Worker 
3090*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3091*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3092*61046927SAndroid Build Coastguard Worker      */
operator =(Context && ctx)3093*61046927SAndroid Build Coastguard Worker     Context& operator = (Context &&ctx)
3094*61046927SAndroid Build Coastguard Worker     {
3095*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(ctx));
3096*61046927SAndroid Build Coastguard Worker         return *this;
3097*61046927SAndroid Build Coastguard Worker     }
3098*61046927SAndroid Build Coastguard Worker 
3099*61046927SAndroid Build Coastguard Worker 
3100*61046927SAndroid Build Coastguard Worker     /*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.
3101*61046927SAndroid Build Coastguard Worker      *
3102*61046927SAndroid Build Coastguard Worker      *  \note All calls to this function return the same cl_context as the first.
3103*61046927SAndroid Build Coastguard Worker      */
getDefault(cl_int * err=NULL)3104*61046927SAndroid Build Coastguard Worker     static Context getDefault(cl_int * err = NULL)
3105*61046927SAndroid Build Coastguard Worker     {
3106*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefault);
3107*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
3108*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3109*61046927SAndroid Build Coastguard Worker             *err = default_error_;
3110*61046927SAndroid Build Coastguard Worker         }
3111*61046927SAndroid Build Coastguard Worker         return default_;
3112*61046927SAndroid Build Coastguard Worker     }
3113*61046927SAndroid Build Coastguard Worker 
3114*61046927SAndroid Build Coastguard Worker     /**
3115*61046927SAndroid Build Coastguard Worker      * Modify the default context to be used by
3116*61046927SAndroid Build Coastguard Worker      * subsequent operations.
3117*61046927SAndroid Build Coastguard Worker      * Will only set the default if no default was previously created.
3118*61046927SAndroid Build Coastguard Worker      * @return updated default context.
3119*61046927SAndroid Build Coastguard Worker      *         Should be compared to the passed value to ensure that it was updated.
3120*61046927SAndroid Build Coastguard Worker      */
setDefault(const Context & default_context)3121*61046927SAndroid Build Coastguard Worker     static Context setDefault(const Context &default_context)
3122*61046927SAndroid Build Coastguard Worker     {
3123*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefaultProvided, std::cref(default_context));
3124*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
3125*61046927SAndroid Build Coastguard Worker         return default_;
3126*61046927SAndroid Build Coastguard Worker     }
3127*61046927SAndroid Build Coastguard Worker 
3128*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Context()3129*61046927SAndroid Build Coastguard Worker     Context() : detail::Wrapper<cl_type>() { }
3130*61046927SAndroid Build Coastguard Worker 
3131*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_context - takes ownership.
3132*61046927SAndroid Build Coastguard Worker      *
3133*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_context
3134*61046927SAndroid Build Coastguard Worker      *  into the new Context object.
3135*61046927SAndroid Build Coastguard Worker      */
Context(const cl_context & context,bool retainObject=false)3136*61046927SAndroid Build Coastguard Worker     explicit Context(const cl_context& context, bool retainObject = false) :
3137*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(context, retainObject) { }
3138*61046927SAndroid Build Coastguard Worker 
3139*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_context - takes ownership.
3140*61046927SAndroid Build Coastguard Worker      *
3141*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
3142*61046927SAndroid Build Coastguard Worker      *  clReleaseContext() on the value previously held by this instance.
3143*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_context & rhs)3144*61046927SAndroid Build Coastguard Worker     Context& operator = (const cl_context& rhs)
3145*61046927SAndroid Build Coastguard Worker     {
3146*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
3147*61046927SAndroid Build Coastguard Worker         return *this;
3148*61046927SAndroid Build Coastguard Worker     }
3149*61046927SAndroid Build Coastguard Worker 
3150*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetContextInfo().
3151*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_context_info name,T * param) const3152*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_context_info name, T* param) const
3153*61046927SAndroid Build Coastguard Worker     {
3154*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3155*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetContextInfo, object_, name, param),
3156*61046927SAndroid Build Coastguard Worker             __GET_CONTEXT_INFO_ERR);
3157*61046927SAndroid Build Coastguard Worker     }
3158*61046927SAndroid Build Coastguard Worker 
3159*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetContextInfo() that returns by value.
3160*61046927SAndroid Build Coastguard Worker     template <cl_context_info name> typename
3161*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_context_info, name>::param_type
getInfo(cl_int * err=NULL) const3162*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
3163*61046927SAndroid Build Coastguard Worker     {
3164*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
3165*61046927SAndroid Build Coastguard Worker             detail::cl_context_info, name>::param_type param;
3166*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
3167*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3168*61046927SAndroid Build Coastguard Worker             *err = result;
3169*61046927SAndroid Build Coastguard Worker         }
3170*61046927SAndroid Build Coastguard Worker         return param;
3171*61046927SAndroid Build Coastguard Worker     }
3172*61046927SAndroid Build Coastguard Worker 
3173*61046927SAndroid Build Coastguard Worker     /*! \brief Gets a list of supported image formats.
3174*61046927SAndroid Build Coastguard Worker      *
3175*61046927SAndroid Build Coastguard Worker      *  Wraps clGetSupportedImageFormats().
3176*61046927SAndroid Build Coastguard Worker      */
getSupportedImageFormats(cl_mem_flags flags,cl_mem_object_type type,vector<ImageFormat> * formats) const3177*61046927SAndroid Build Coastguard Worker     cl_int getSupportedImageFormats(
3178*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3179*61046927SAndroid Build Coastguard Worker         cl_mem_object_type type,
3180*61046927SAndroid Build Coastguard Worker         vector<ImageFormat>* formats) const
3181*61046927SAndroid Build Coastguard Worker     {
3182*61046927SAndroid Build Coastguard Worker         cl_uint numEntries;
3183*61046927SAndroid Build Coastguard Worker 
3184*61046927SAndroid Build Coastguard Worker         if (!formats) {
3185*61046927SAndroid Build Coastguard Worker             return CL_SUCCESS;
3186*61046927SAndroid Build Coastguard Worker         }
3187*61046927SAndroid Build Coastguard Worker 
3188*61046927SAndroid Build Coastguard Worker         cl_int err = ::clGetSupportedImageFormats(
3189*61046927SAndroid Build Coastguard Worker            object_,
3190*61046927SAndroid Build Coastguard Worker            flags,
3191*61046927SAndroid Build Coastguard Worker            type,
3192*61046927SAndroid Build Coastguard Worker            0,
3193*61046927SAndroid Build Coastguard Worker            NULL,
3194*61046927SAndroid Build Coastguard Worker            &numEntries);
3195*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
3196*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
3197*61046927SAndroid Build Coastguard Worker         }
3198*61046927SAndroid Build Coastguard Worker 
3199*61046927SAndroid Build Coastguard Worker         if (numEntries > 0) {
3200*61046927SAndroid Build Coastguard Worker             vector<ImageFormat> value(numEntries);
3201*61046927SAndroid Build Coastguard Worker             err = ::clGetSupportedImageFormats(
3202*61046927SAndroid Build Coastguard Worker                 object_,
3203*61046927SAndroid Build Coastguard Worker                 flags,
3204*61046927SAndroid Build Coastguard Worker                 type,
3205*61046927SAndroid Build Coastguard Worker                 numEntries,
3206*61046927SAndroid Build Coastguard Worker                 (cl_image_format*)value.data(),
3207*61046927SAndroid Build Coastguard Worker                 NULL);
3208*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
3209*61046927SAndroid Build Coastguard Worker                 return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
3210*61046927SAndroid Build Coastguard Worker             }
3211*61046927SAndroid Build Coastguard Worker 
3212*61046927SAndroid Build Coastguard Worker             formats->assign(begin(value), end(value));
3213*61046927SAndroid Build Coastguard Worker         }
3214*61046927SAndroid Build Coastguard Worker         else {
3215*61046927SAndroid Build Coastguard Worker             // If no values are being returned, ensure an empty vector comes back
3216*61046927SAndroid Build Coastguard Worker             formats->clear();
3217*61046927SAndroid Build Coastguard Worker         }
3218*61046927SAndroid Build Coastguard Worker 
3219*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
3220*61046927SAndroid Build Coastguard Worker     }
3221*61046927SAndroid Build Coastguard Worker };
3222*61046927SAndroid Build Coastguard Worker 
makeDefault()3223*61046927SAndroid Build Coastguard Worker inline void Device::makeDefault()
3224*61046927SAndroid Build Coastguard Worker {
3225*61046927SAndroid Build Coastguard Worker     /* Throwing an exception from a call_once invocation does not do
3226*61046927SAndroid Build Coastguard Worker     * what we wish, so we catch it and save the error.
3227*61046927SAndroid Build Coastguard Worker     */
3228*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
3229*61046927SAndroid Build Coastguard Worker     try
3230*61046927SAndroid Build Coastguard Worker #endif
3231*61046927SAndroid Build Coastguard Worker     {
3232*61046927SAndroid Build Coastguard Worker         cl_int error = 0;
3233*61046927SAndroid Build Coastguard Worker 
3234*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(&error);
3235*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
3236*61046927SAndroid Build Coastguard Worker 
3237*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS) {
3238*61046927SAndroid Build Coastguard Worker             default_error_ = error;
3239*61046927SAndroid Build Coastguard Worker         }
3240*61046927SAndroid Build Coastguard Worker         else {
3241*61046927SAndroid Build Coastguard Worker             default_ = context.getInfo<CL_CONTEXT_DEVICES>()[0];
3242*61046927SAndroid Build Coastguard Worker             default_error_ = CL_SUCCESS;
3243*61046927SAndroid Build Coastguard Worker         }
3244*61046927SAndroid Build Coastguard Worker     }
3245*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
3246*61046927SAndroid Build Coastguard Worker     catch (cl::Error &e) {
3247*61046927SAndroid Build Coastguard Worker         default_error_ = e.err();
3248*61046927SAndroid Build Coastguard Worker     }
3249*61046927SAndroid Build Coastguard Worker #endif
3250*61046927SAndroid Build Coastguard Worker }
3251*61046927SAndroid Build Coastguard Worker 
3252*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ std::once_flag Context::default_initialized_;
3253*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ Context Context::default_;
3254*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ cl_int Context::default_error_ = CL_SUCCESS;
3255*61046927SAndroid Build Coastguard Worker 
3256*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_event.
3257*61046927SAndroid Build Coastguard Worker  *
3258*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
3259*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_event as the original.  For details, see
3260*61046927SAndroid Build Coastguard Worker  *        clRetainEvent() and clReleaseEvent().
3261*61046927SAndroid Build Coastguard Worker  *
3262*61046927SAndroid Build Coastguard Worker  *  \see cl_event
3263*61046927SAndroid Build Coastguard Worker  */
3264*61046927SAndroid Build Coastguard Worker class Event : public detail::Wrapper<cl_event>
3265*61046927SAndroid Build Coastguard Worker {
3266*61046927SAndroid Build Coastguard Worker public:
3267*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Event()3268*61046927SAndroid Build Coastguard Worker     Event() : detail::Wrapper<cl_type>() { }
3269*61046927SAndroid Build Coastguard Worker 
3270*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_event - takes ownership.
3271*61046927SAndroid Build Coastguard Worker      *
3272*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
3273*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
3274*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
3275*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_event
3276*61046927SAndroid Build Coastguard Worker      *  into the new Event object.
3277*61046927SAndroid Build Coastguard Worker      */
Event(const cl_event & event,bool retainObject=false)3278*61046927SAndroid Build Coastguard Worker     explicit Event(const cl_event& event, bool retainObject = false) :
3279*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(event, retainObject) { }
3280*61046927SAndroid Build Coastguard Worker 
3281*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_event - takes ownership.
3282*61046927SAndroid Build Coastguard Worker      *
3283*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
3284*61046927SAndroid Build Coastguard Worker      *  clReleaseEvent() on the value previously held by this instance.
3285*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_event & rhs)3286*61046927SAndroid Build Coastguard Worker     Event& operator = (const cl_event& rhs)
3287*61046927SAndroid Build Coastguard Worker     {
3288*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
3289*61046927SAndroid Build Coastguard Worker         return *this;
3290*61046927SAndroid Build Coastguard Worker     }
3291*61046927SAndroid Build Coastguard Worker 
3292*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventInfo().
3293*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_event_info name,T * param) const3294*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_event_info name, T* param) const
3295*61046927SAndroid Build Coastguard Worker     {
3296*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3297*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetEventInfo, object_, name, param),
3298*61046927SAndroid Build Coastguard Worker             __GET_EVENT_INFO_ERR);
3299*61046927SAndroid Build Coastguard Worker     }
3300*61046927SAndroid Build Coastguard Worker 
3301*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventInfo() that returns by value.
3302*61046927SAndroid Build Coastguard Worker     template <cl_event_info name> typename
3303*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_event_info, name>::param_type
getInfo(cl_int * err=NULL) const3304*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
3305*61046927SAndroid Build Coastguard Worker     {
3306*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
3307*61046927SAndroid Build Coastguard Worker             detail::cl_event_info, name>::param_type param;
3308*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
3309*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3310*61046927SAndroid Build Coastguard Worker             *err = result;
3311*61046927SAndroid Build Coastguard Worker         }
3312*61046927SAndroid Build Coastguard Worker         return param;
3313*61046927SAndroid Build Coastguard Worker     }
3314*61046927SAndroid Build Coastguard Worker 
3315*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventProfilingInfo().
3316*61046927SAndroid Build Coastguard Worker     template <typename T>
getProfilingInfo(cl_profiling_info name,T * param) const3317*61046927SAndroid Build Coastguard Worker     cl_int getProfilingInfo(cl_profiling_info name, T* param) const
3318*61046927SAndroid Build Coastguard Worker     {
3319*61046927SAndroid Build Coastguard Worker         return detail::errHandler(detail::getInfo(
3320*61046927SAndroid Build Coastguard Worker             &::clGetEventProfilingInfo, object_, name, param),
3321*61046927SAndroid Build Coastguard Worker             __GET_EVENT_PROFILE_INFO_ERR);
3322*61046927SAndroid Build Coastguard Worker     }
3323*61046927SAndroid Build Coastguard Worker 
3324*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetEventProfilingInfo() that returns by value.
3325*61046927SAndroid Build Coastguard Worker     template <cl_profiling_info name> typename
3326*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_profiling_info, name>::param_type
getProfilingInfo(cl_int * err=NULL) const3327*61046927SAndroid Build Coastguard Worker     getProfilingInfo(cl_int* err = NULL) const
3328*61046927SAndroid Build Coastguard Worker     {
3329*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
3330*61046927SAndroid Build Coastguard Worker             detail::cl_profiling_info, name>::param_type param;
3331*61046927SAndroid Build Coastguard Worker         cl_int result = getProfilingInfo(name, &param);
3332*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3333*61046927SAndroid Build Coastguard Worker             *err = result;
3334*61046927SAndroid Build Coastguard Worker         }
3335*61046927SAndroid Build Coastguard Worker         return param;
3336*61046927SAndroid Build Coastguard Worker     }
3337*61046927SAndroid Build Coastguard Worker 
3338*61046927SAndroid Build Coastguard Worker     /*! \brief Blocks the calling thread until this event completes.
3339*61046927SAndroid Build Coastguard Worker      *
3340*61046927SAndroid Build Coastguard Worker      *  Wraps clWaitForEvents().
3341*61046927SAndroid Build Coastguard Worker      */
wait() const3342*61046927SAndroid Build Coastguard Worker     cl_int wait() const
3343*61046927SAndroid Build Coastguard Worker     {
3344*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3345*61046927SAndroid Build Coastguard Worker             ::clWaitForEvents(1, &object_),
3346*61046927SAndroid Build Coastguard Worker             __WAIT_FOR_EVENTS_ERR);
3347*61046927SAndroid Build Coastguard Worker     }
3348*61046927SAndroid Build Coastguard Worker 
3349*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
3350*61046927SAndroid Build Coastguard Worker     /*! \brief Registers a user callback function for a specific command execution status.
3351*61046927SAndroid Build Coastguard Worker      *
3352*61046927SAndroid Build Coastguard Worker      *  Wraps clSetEventCallback().
3353*61046927SAndroid Build Coastguard Worker      */
setCallback(cl_int type,void (CL_CALLBACK * pfn_notify)(cl_event,cl_int,void *),void * user_data=NULL)3354*61046927SAndroid Build Coastguard Worker     cl_int setCallback(
3355*61046927SAndroid Build Coastguard Worker         cl_int type,
3356*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *),
3357*61046927SAndroid Build Coastguard Worker         void * user_data = NULL)
3358*61046927SAndroid Build Coastguard Worker     {
3359*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3360*61046927SAndroid Build Coastguard Worker             ::clSetEventCallback(
3361*61046927SAndroid Build Coastguard Worker                 object_,
3362*61046927SAndroid Build Coastguard Worker                 type,
3363*61046927SAndroid Build Coastguard Worker                 pfn_notify,
3364*61046927SAndroid Build Coastguard Worker                 user_data),
3365*61046927SAndroid Build Coastguard Worker             __SET_EVENT_CALLBACK_ERR);
3366*61046927SAndroid Build Coastguard Worker     }
3367*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
3368*61046927SAndroid Build Coastguard Worker 
3369*61046927SAndroid Build Coastguard Worker     /*! \brief Blocks the calling thread until every event specified is complete.
3370*61046927SAndroid Build Coastguard Worker      *
3371*61046927SAndroid Build Coastguard Worker      *  Wraps clWaitForEvents().
3372*61046927SAndroid Build Coastguard Worker      */
3373*61046927SAndroid Build Coastguard Worker     static cl_int
waitForEvents(const vector<Event> & events)3374*61046927SAndroid Build Coastguard Worker     waitForEvents(const vector<Event>& events)
3375*61046927SAndroid Build Coastguard Worker     {
3376*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3377*61046927SAndroid Build Coastguard Worker             ::clWaitForEvents(
3378*61046927SAndroid Build Coastguard Worker                 (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
3379*61046927SAndroid Build Coastguard Worker             __WAIT_FOR_EVENTS_ERR);
3380*61046927SAndroid Build Coastguard Worker     }
3381*61046927SAndroid Build Coastguard Worker };
3382*61046927SAndroid Build Coastguard Worker 
3383*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
3384*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for user events (a subset of cl_event's).
3385*61046927SAndroid Build Coastguard Worker  *
3386*61046927SAndroid Build Coastguard Worker  *  See Event for details about copy semantics, etc.
3387*61046927SAndroid Build Coastguard Worker  */
3388*61046927SAndroid Build Coastguard Worker class UserEvent : public Event
3389*61046927SAndroid Build Coastguard Worker {
3390*61046927SAndroid Build Coastguard Worker public:
3391*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a user event on a given context.
3392*61046927SAndroid Build Coastguard Worker      *
3393*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateUserEvent().
3394*61046927SAndroid Build Coastguard Worker      */
UserEvent(const Context & context,cl_int * err=NULL)3395*61046927SAndroid Build Coastguard Worker     UserEvent(
3396*61046927SAndroid Build Coastguard Worker         const Context& context,
3397*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
3398*61046927SAndroid Build Coastguard Worker     {
3399*61046927SAndroid Build Coastguard Worker         cl_int error;
3400*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateUserEvent(
3401*61046927SAndroid Build Coastguard Worker             context(),
3402*61046927SAndroid Build Coastguard Worker             &error);
3403*61046927SAndroid Build Coastguard Worker 
3404*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_USER_EVENT_ERR);
3405*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3406*61046927SAndroid Build Coastguard Worker             *err = error;
3407*61046927SAndroid Build Coastguard Worker         }
3408*61046927SAndroid Build Coastguard Worker     }
3409*61046927SAndroid Build Coastguard Worker 
3410*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
UserEvent()3411*61046927SAndroid Build Coastguard Worker     UserEvent() : Event() { }
3412*61046927SAndroid Build Coastguard Worker 
3413*61046927SAndroid Build Coastguard Worker     /*! \brief Sets the execution status of a user event object.
3414*61046927SAndroid Build Coastguard Worker      *
3415*61046927SAndroid Build Coastguard Worker      *  Wraps clSetUserEventStatus().
3416*61046927SAndroid Build Coastguard Worker      */
setStatus(cl_int status)3417*61046927SAndroid Build Coastguard Worker     cl_int setStatus(cl_int status)
3418*61046927SAndroid Build Coastguard Worker     {
3419*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3420*61046927SAndroid Build Coastguard Worker             ::clSetUserEventStatus(object_,status),
3421*61046927SAndroid Build Coastguard Worker             __SET_USER_EVENT_STATUS_ERR);
3422*61046927SAndroid Build Coastguard Worker     }
3423*61046927SAndroid Build Coastguard Worker };
3424*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
3425*61046927SAndroid Build Coastguard Worker 
3426*61046927SAndroid Build Coastguard Worker /*! \brief Blocks the calling thread until every event specified is complete.
3427*61046927SAndroid Build Coastguard Worker  *
3428*61046927SAndroid Build Coastguard Worker  *  Wraps clWaitForEvents().
3429*61046927SAndroid Build Coastguard Worker  */
3430*61046927SAndroid Build Coastguard Worker inline static cl_int
WaitForEvents(const vector<Event> & events)3431*61046927SAndroid Build Coastguard Worker WaitForEvents(const vector<Event>& events)
3432*61046927SAndroid Build Coastguard Worker {
3433*61046927SAndroid Build Coastguard Worker     return detail::errHandler(
3434*61046927SAndroid Build Coastguard Worker         ::clWaitForEvents(
3435*61046927SAndroid Build Coastguard Worker             (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
3436*61046927SAndroid Build Coastguard Worker         __WAIT_FOR_EVENTS_ERR);
3437*61046927SAndroid Build Coastguard Worker }
3438*61046927SAndroid Build Coastguard Worker 
3439*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_mem.
3440*61046927SAndroid Build Coastguard Worker  *
3441*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
3442*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_mem as the original.  For details, see
3443*61046927SAndroid Build Coastguard Worker  *        clRetainMemObject() and clReleaseMemObject().
3444*61046927SAndroid Build Coastguard Worker  *
3445*61046927SAndroid Build Coastguard Worker  *  \see cl_mem
3446*61046927SAndroid Build Coastguard Worker  */
3447*61046927SAndroid Build Coastguard Worker class Memory : public detail::Wrapper<cl_mem>
3448*61046927SAndroid Build Coastguard Worker {
3449*61046927SAndroid Build Coastguard Worker public:
3450*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Memory()3451*61046927SAndroid Build Coastguard Worker     Memory() : detail::Wrapper<cl_type>() { }
3452*61046927SAndroid Build Coastguard Worker 
3453*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
3454*61046927SAndroid Build Coastguard Worker      *
3455*61046927SAndroid Build Coastguard Worker      *  Optionally transfer ownership of a refcount on the cl_mem
3456*61046927SAndroid Build Coastguard Worker      *  into the new Memory object.
3457*61046927SAndroid Build Coastguard Worker      *
3458*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
3459*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
3460*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
3461*61046927SAndroid Build Coastguard Worker      *
3462*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
3463*61046927SAndroid Build Coastguard Worker      */
Memory(const cl_mem & memory,bool retainObject)3464*61046927SAndroid Build Coastguard Worker     explicit Memory(const cl_mem& memory, bool retainObject) :
3465*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(memory, retainObject) { }
3466*61046927SAndroid Build Coastguard Worker 
3467*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_mem - takes ownership.
3468*61046927SAndroid Build Coastguard Worker      *
3469*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
3470*61046927SAndroid Build Coastguard Worker      *  clReleaseMemObject() on the value previously held by this instance.
3471*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)3472*61046927SAndroid Build Coastguard Worker     Memory& operator = (const cl_mem& rhs)
3473*61046927SAndroid Build Coastguard Worker     {
3474*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
3475*61046927SAndroid Build Coastguard Worker         return *this;
3476*61046927SAndroid Build Coastguard Worker     }
3477*61046927SAndroid Build Coastguard Worker 
3478*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
3479*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3480*61046927SAndroid Build Coastguard Worker      */
Memory(const Memory & mem)3481*61046927SAndroid Build Coastguard Worker     Memory(const Memory& mem) : detail::Wrapper<cl_type>(mem) {}
3482*61046927SAndroid Build Coastguard Worker 
3483*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
3484*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3485*61046927SAndroid Build Coastguard Worker      */
operator =(const Memory & mem)3486*61046927SAndroid Build Coastguard Worker     Memory& operator = (const Memory &mem)
3487*61046927SAndroid Build Coastguard Worker     {
3488*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(mem);
3489*61046927SAndroid Build Coastguard Worker         return *this;
3490*61046927SAndroid Build Coastguard Worker     }
3491*61046927SAndroid Build Coastguard Worker 
3492*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
3493*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3494*61046927SAndroid Build Coastguard Worker      */
Memory(Memory && mem)3495*61046927SAndroid Build Coastguard Worker     Memory(Memory&& mem) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(mem)) {}
3496*61046927SAndroid Build Coastguard Worker 
3497*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
3498*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
3499*61046927SAndroid Build Coastguard Worker      */
operator =(Memory && mem)3500*61046927SAndroid Build Coastguard Worker     Memory& operator = (Memory &&mem)
3501*61046927SAndroid Build Coastguard Worker     {
3502*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(mem));
3503*61046927SAndroid Build Coastguard Worker         return *this;
3504*61046927SAndroid Build Coastguard Worker     }
3505*61046927SAndroid Build Coastguard Worker 
3506*61046927SAndroid Build Coastguard Worker 
3507*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetMemObjectInfo().
3508*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_mem_info name,T * param) const3509*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_mem_info name, T* param) const
3510*61046927SAndroid Build Coastguard Worker     {
3511*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3512*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetMemObjectInfo, object_, name, param),
3513*61046927SAndroid Build Coastguard Worker             __GET_MEM_OBJECT_INFO_ERR);
3514*61046927SAndroid Build Coastguard Worker     }
3515*61046927SAndroid Build Coastguard Worker 
3516*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetMemObjectInfo() that returns by value.
3517*61046927SAndroid Build Coastguard Worker     template <cl_mem_info name> typename
3518*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_mem_info, name>::param_type
getInfo(cl_int * err=NULL) const3519*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
3520*61046927SAndroid Build Coastguard Worker     {
3521*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
3522*61046927SAndroid Build Coastguard Worker             detail::cl_mem_info, name>::param_type param;
3523*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
3524*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3525*61046927SAndroid Build Coastguard Worker             *err = result;
3526*61046927SAndroid Build Coastguard Worker         }
3527*61046927SAndroid Build Coastguard Worker         return param;
3528*61046927SAndroid Build Coastguard Worker     }
3529*61046927SAndroid Build Coastguard Worker 
3530*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
3531*61046927SAndroid Build Coastguard Worker     /*! \brief Registers a callback function to be called when the memory object
3532*61046927SAndroid Build Coastguard Worker      *         is no longer needed.
3533*61046927SAndroid Build Coastguard Worker      *
3534*61046927SAndroid Build Coastguard Worker      *  Wraps clSetMemObjectDestructorCallback().
3535*61046927SAndroid Build Coastguard Worker      *
3536*61046927SAndroid Build Coastguard Worker      *  Repeated calls to this function, for a given cl_mem value, will append
3537*61046927SAndroid Build Coastguard Worker      *  to the list of functions called (in reverse order) when memory object's
3538*61046927SAndroid Build Coastguard Worker      *  resources are freed and the memory object is deleted.
3539*61046927SAndroid Build Coastguard Worker      *
3540*61046927SAndroid Build Coastguard Worker      *  \note
3541*61046927SAndroid Build Coastguard Worker      *  The registered callbacks are associated with the underlying cl_mem
3542*61046927SAndroid Build Coastguard Worker      *  value - not the Memory class instance.
3543*61046927SAndroid Build Coastguard Worker      */
setDestructorCallback(void (CL_CALLBACK * pfn_notify)(cl_mem,void *),void * user_data=NULL)3544*61046927SAndroid Build Coastguard Worker     cl_int setDestructorCallback(
3545*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * pfn_notify)(cl_mem, void *),
3546*61046927SAndroid Build Coastguard Worker         void * user_data = NULL)
3547*61046927SAndroid Build Coastguard Worker     {
3548*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
3549*61046927SAndroid Build Coastguard Worker             ::clSetMemObjectDestructorCallback(
3550*61046927SAndroid Build Coastguard Worker                 object_,
3551*61046927SAndroid Build Coastguard Worker                 pfn_notify,
3552*61046927SAndroid Build Coastguard Worker                 user_data),
3553*61046927SAndroid Build Coastguard Worker             __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR);
3554*61046927SAndroid Build Coastguard Worker     }
3555*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
3556*61046927SAndroid Build Coastguard Worker 
3557*61046927SAndroid Build Coastguard Worker };
3558*61046927SAndroid Build Coastguard Worker 
3559*61046927SAndroid Build Coastguard Worker // Pre-declare copy functions
3560*61046927SAndroid Build Coastguard Worker class Buffer;
3561*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3562*61046927SAndroid Build Coastguard Worker cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
3563*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3564*61046927SAndroid Build Coastguard Worker cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
3565*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3566*61046927SAndroid Build Coastguard Worker cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
3567*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
3568*61046927SAndroid Build Coastguard Worker cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
3569*61046927SAndroid Build Coastguard Worker 
3570*61046927SAndroid Build Coastguard Worker 
3571*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
3572*61046927SAndroid Build Coastguard Worker namespace detail
3573*61046927SAndroid Build Coastguard Worker {
3574*61046927SAndroid Build Coastguard Worker     class SVMTraitNull
3575*61046927SAndroid Build Coastguard Worker     {
3576*61046927SAndroid Build Coastguard Worker     public:
getSVMMemFlags()3577*61046927SAndroid Build Coastguard Worker         static cl_svm_mem_flags getSVMMemFlags()
3578*61046927SAndroid Build Coastguard Worker         {
3579*61046927SAndroid Build Coastguard Worker             return 0;
3580*61046927SAndroid Build Coastguard Worker         }
3581*61046927SAndroid Build Coastguard Worker     };
3582*61046927SAndroid Build Coastguard Worker } // namespace detail
3583*61046927SAndroid Build Coastguard Worker 
3584*61046927SAndroid Build Coastguard Worker template<class Trait = detail::SVMTraitNull>
3585*61046927SAndroid Build Coastguard Worker class SVMTraitReadWrite
3586*61046927SAndroid Build Coastguard Worker {
3587*61046927SAndroid Build Coastguard Worker public:
getSVMMemFlags()3588*61046927SAndroid Build Coastguard Worker     static cl_svm_mem_flags getSVMMemFlags()
3589*61046927SAndroid Build Coastguard Worker     {
3590*61046927SAndroid Build Coastguard Worker         return CL_MEM_READ_WRITE |
3591*61046927SAndroid Build Coastguard Worker             Trait::getSVMMemFlags();
3592*61046927SAndroid Build Coastguard Worker     }
3593*61046927SAndroid Build Coastguard Worker };
3594*61046927SAndroid Build Coastguard Worker 
3595*61046927SAndroid Build Coastguard Worker template<class Trait = detail::SVMTraitNull>
3596*61046927SAndroid Build Coastguard Worker class SVMTraitReadOnly
3597*61046927SAndroid Build Coastguard Worker {
3598*61046927SAndroid Build Coastguard Worker public:
getSVMMemFlags()3599*61046927SAndroid Build Coastguard Worker     static cl_svm_mem_flags getSVMMemFlags()
3600*61046927SAndroid Build Coastguard Worker     {
3601*61046927SAndroid Build Coastguard Worker         return CL_MEM_READ_ONLY |
3602*61046927SAndroid Build Coastguard Worker             Trait::getSVMMemFlags();
3603*61046927SAndroid Build Coastguard Worker     }
3604*61046927SAndroid Build Coastguard Worker };
3605*61046927SAndroid Build Coastguard Worker 
3606*61046927SAndroid Build Coastguard Worker template<class Trait = detail::SVMTraitNull>
3607*61046927SAndroid Build Coastguard Worker class SVMTraitWriteOnly
3608*61046927SAndroid Build Coastguard Worker {
3609*61046927SAndroid Build Coastguard Worker public:
getSVMMemFlags()3610*61046927SAndroid Build Coastguard Worker     static cl_svm_mem_flags getSVMMemFlags()
3611*61046927SAndroid Build Coastguard Worker     {
3612*61046927SAndroid Build Coastguard Worker         return CL_MEM_WRITE_ONLY |
3613*61046927SAndroid Build Coastguard Worker             Trait::getSVMMemFlags();
3614*61046927SAndroid Build Coastguard Worker     }
3615*61046927SAndroid Build Coastguard Worker };
3616*61046927SAndroid Build Coastguard Worker 
3617*61046927SAndroid Build Coastguard Worker template<class Trait = SVMTraitReadWrite<>>
3618*61046927SAndroid Build Coastguard Worker class SVMTraitCoarse
3619*61046927SAndroid Build Coastguard Worker {
3620*61046927SAndroid Build Coastguard Worker public:
getSVMMemFlags()3621*61046927SAndroid Build Coastguard Worker     static cl_svm_mem_flags getSVMMemFlags()
3622*61046927SAndroid Build Coastguard Worker     {
3623*61046927SAndroid Build Coastguard Worker         return Trait::getSVMMemFlags();
3624*61046927SAndroid Build Coastguard Worker     }
3625*61046927SAndroid Build Coastguard Worker };
3626*61046927SAndroid Build Coastguard Worker 
3627*61046927SAndroid Build Coastguard Worker template<class Trait = SVMTraitReadWrite<>>
3628*61046927SAndroid Build Coastguard Worker class SVMTraitFine
3629*61046927SAndroid Build Coastguard Worker {
3630*61046927SAndroid Build Coastguard Worker public:
getSVMMemFlags()3631*61046927SAndroid Build Coastguard Worker     static cl_svm_mem_flags getSVMMemFlags()
3632*61046927SAndroid Build Coastguard Worker     {
3633*61046927SAndroid Build Coastguard Worker         return CL_MEM_SVM_FINE_GRAIN_BUFFER |
3634*61046927SAndroid Build Coastguard Worker             Trait::getSVMMemFlags();
3635*61046927SAndroid Build Coastguard Worker     }
3636*61046927SAndroid Build Coastguard Worker };
3637*61046927SAndroid Build Coastguard Worker 
3638*61046927SAndroid Build Coastguard Worker template<class Trait = SVMTraitReadWrite<>>
3639*61046927SAndroid Build Coastguard Worker class SVMTraitAtomic
3640*61046927SAndroid Build Coastguard Worker {
3641*61046927SAndroid Build Coastguard Worker public:
getSVMMemFlags()3642*61046927SAndroid Build Coastguard Worker     static cl_svm_mem_flags getSVMMemFlags()
3643*61046927SAndroid Build Coastguard Worker     {
3644*61046927SAndroid Build Coastguard Worker         return
3645*61046927SAndroid Build Coastguard Worker             CL_MEM_SVM_FINE_GRAIN_BUFFER |
3646*61046927SAndroid Build Coastguard Worker             CL_MEM_SVM_ATOMICS |
3647*61046927SAndroid Build Coastguard Worker             Trait::getSVMMemFlags();
3648*61046927SAndroid Build Coastguard Worker     }
3649*61046927SAndroid Build Coastguard Worker };
3650*61046927SAndroid Build Coastguard Worker 
3651*61046927SAndroid Build Coastguard Worker // Pre-declare SVM map function
3652*61046927SAndroid Build Coastguard Worker template<typename T>
3653*61046927SAndroid Build Coastguard Worker inline cl_int enqueueMapSVM(
3654*61046927SAndroid Build Coastguard Worker     T* ptr,
3655*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
3656*61046927SAndroid Build Coastguard Worker     cl_map_flags flags,
3657*61046927SAndroid Build Coastguard Worker     size_type size,
3658*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
3659*61046927SAndroid Build Coastguard Worker     Event* event = NULL);
3660*61046927SAndroid Build Coastguard Worker 
3661*61046927SAndroid Build Coastguard Worker /**
3662*61046927SAndroid Build Coastguard Worker  * STL-like allocator class for managing SVM objects provided for convenience.
3663*61046927SAndroid Build Coastguard Worker  *
3664*61046927SAndroid Build Coastguard Worker  * Note that while this behaves like an allocator for the purposes of constructing vectors and similar objects,
3665*61046927SAndroid Build Coastguard Worker  * care must be taken when using with smart pointers.
3666*61046927SAndroid Build Coastguard Worker  * The allocator should not be used to construct a unique_ptr if we are using coarse-grained SVM mode because
3667*61046927SAndroid Build Coastguard Worker  * the coarse-grained management behaviour would behave incorrectly with respect to reference counting.
3668*61046927SAndroid Build Coastguard Worker  *
3669*61046927SAndroid Build Coastguard Worker  * Instead the allocator embeds a Deleter which may be used with unique_ptr and is used
3670*61046927SAndroid Build Coastguard Worker  * with the allocate_shared and allocate_ptr supplied operations.
3671*61046927SAndroid Build Coastguard Worker  */
3672*61046927SAndroid Build Coastguard Worker template<typename T, class SVMTrait>
3673*61046927SAndroid Build Coastguard Worker class SVMAllocator {
3674*61046927SAndroid Build Coastguard Worker private:
3675*61046927SAndroid Build Coastguard Worker     Context context_;
3676*61046927SAndroid Build Coastguard Worker 
3677*61046927SAndroid Build Coastguard Worker public:
3678*61046927SAndroid Build Coastguard Worker     typedef T value_type;
3679*61046927SAndroid Build Coastguard Worker     typedef value_type* pointer;
3680*61046927SAndroid Build Coastguard Worker     typedef const value_type* const_pointer;
3681*61046927SAndroid Build Coastguard Worker     typedef value_type& reference;
3682*61046927SAndroid Build Coastguard Worker     typedef const value_type& const_reference;
3683*61046927SAndroid Build Coastguard Worker     typedef std::size_t size_type;
3684*61046927SAndroid Build Coastguard Worker     typedef std::ptrdiff_t difference_type;
3685*61046927SAndroid Build Coastguard Worker 
3686*61046927SAndroid Build Coastguard Worker     template<typename U>
3687*61046927SAndroid Build Coastguard Worker     struct rebind
3688*61046927SAndroid Build Coastguard Worker     {
3689*61046927SAndroid Build Coastguard Worker         typedef SVMAllocator<U, SVMTrait> other;
3690*61046927SAndroid Build Coastguard Worker     };
3691*61046927SAndroid Build Coastguard Worker 
3692*61046927SAndroid Build Coastguard Worker     template<typename U, typename V>
3693*61046927SAndroid Build Coastguard Worker     friend class SVMAllocator;
3694*61046927SAndroid Build Coastguard Worker 
SVMAllocator()3695*61046927SAndroid Build Coastguard Worker     SVMAllocator() :
3696*61046927SAndroid Build Coastguard Worker         context_(Context::getDefault())
3697*61046927SAndroid Build Coastguard Worker     {
3698*61046927SAndroid Build Coastguard Worker     }
3699*61046927SAndroid Build Coastguard Worker 
SVMAllocator(cl::Context context)3700*61046927SAndroid Build Coastguard Worker     explicit SVMAllocator(cl::Context context) :
3701*61046927SAndroid Build Coastguard Worker         context_(context)
3702*61046927SAndroid Build Coastguard Worker     {
3703*61046927SAndroid Build Coastguard Worker     }
3704*61046927SAndroid Build Coastguard Worker 
3705*61046927SAndroid Build Coastguard Worker 
SVMAllocator(const SVMAllocator & other)3706*61046927SAndroid Build Coastguard Worker     SVMAllocator(const SVMAllocator &other) :
3707*61046927SAndroid Build Coastguard Worker         context_(other.context_)
3708*61046927SAndroid Build Coastguard Worker     {
3709*61046927SAndroid Build Coastguard Worker     }
3710*61046927SAndroid Build Coastguard Worker 
3711*61046927SAndroid Build Coastguard Worker     template<typename U>
SVMAllocator(const SVMAllocator<U,SVMTrait> & other)3712*61046927SAndroid Build Coastguard Worker     SVMAllocator(const SVMAllocator<U, SVMTrait> &other) :
3713*61046927SAndroid Build Coastguard Worker         context_(other.context_)
3714*61046927SAndroid Build Coastguard Worker     {
3715*61046927SAndroid Build Coastguard Worker     }
3716*61046927SAndroid Build Coastguard Worker 
~SVMAllocator()3717*61046927SAndroid Build Coastguard Worker     ~SVMAllocator()
3718*61046927SAndroid Build Coastguard Worker     {
3719*61046927SAndroid Build Coastguard Worker     }
3720*61046927SAndroid Build Coastguard Worker 
address(reference r)3721*61046927SAndroid Build Coastguard Worker     pointer address(reference r) CL_HPP_NOEXCEPT_
3722*61046927SAndroid Build Coastguard Worker     {
3723*61046927SAndroid Build Coastguard Worker         return std::addressof(r);
3724*61046927SAndroid Build Coastguard Worker     }
3725*61046927SAndroid Build Coastguard Worker 
address(const_reference r)3726*61046927SAndroid Build Coastguard Worker     const_pointer address(const_reference r) CL_HPP_NOEXCEPT_
3727*61046927SAndroid Build Coastguard Worker     {
3728*61046927SAndroid Build Coastguard Worker         return std::addressof(r);
3729*61046927SAndroid Build Coastguard Worker     }
3730*61046927SAndroid Build Coastguard Worker 
3731*61046927SAndroid Build Coastguard Worker     /**
3732*61046927SAndroid Build Coastguard Worker      * Allocate an SVM pointer.
3733*61046927SAndroid Build Coastguard Worker      *
3734*61046927SAndroid Build Coastguard Worker      * If the allocator is coarse-grained, this will take ownership to allow
3735*61046927SAndroid Build Coastguard Worker      * containers to correctly construct data in place.
3736*61046927SAndroid Build Coastguard Worker      */
allocate(size_type size,typename cl::SVMAllocator<void,SVMTrait>::const_pointer=0)3737*61046927SAndroid Build Coastguard Worker     pointer allocate(
3738*61046927SAndroid Build Coastguard Worker         size_type size,
3739*61046927SAndroid Build Coastguard Worker         typename cl::SVMAllocator<void, SVMTrait>::const_pointer = 0)
3740*61046927SAndroid Build Coastguard Worker     {
3741*61046927SAndroid Build Coastguard Worker         // Allocate memory with default alignment matching the size of the type
3742*61046927SAndroid Build Coastguard Worker         void* voidPointer =
3743*61046927SAndroid Build Coastguard Worker             clSVMAlloc(
3744*61046927SAndroid Build Coastguard Worker             context_(),
3745*61046927SAndroid Build Coastguard Worker             SVMTrait::getSVMMemFlags(),
3746*61046927SAndroid Build Coastguard Worker             size*sizeof(T),
3747*61046927SAndroid Build Coastguard Worker             0);
3748*61046927SAndroid Build Coastguard Worker         pointer retValue = reinterpret_cast<pointer>(
3749*61046927SAndroid Build Coastguard Worker             voidPointer);
3750*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
3751*61046927SAndroid Build Coastguard Worker         if (!retValue) {
3752*61046927SAndroid Build Coastguard Worker             std::bad_alloc excep;
3753*61046927SAndroid Build Coastguard Worker             throw excep;
3754*61046927SAndroid Build Coastguard Worker         }
3755*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_HPP_ENABLE_EXCEPTIONS)
3756*61046927SAndroid Build Coastguard Worker 
3757*61046927SAndroid Build Coastguard Worker         // If allocation was coarse-grained then map it
3758*61046927SAndroid Build Coastguard Worker         if (!(SVMTrait::getSVMMemFlags() & CL_MEM_SVM_FINE_GRAIN_BUFFER)) {
3759*61046927SAndroid Build Coastguard Worker             cl_int err = enqueueMapSVM(retValue, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE, size*sizeof(T));
3760*61046927SAndroid Build Coastguard Worker             if (err != CL_SUCCESS) {
3761*61046927SAndroid Build Coastguard Worker                 std::bad_alloc excep;
3762*61046927SAndroid Build Coastguard Worker                 throw excep;
3763*61046927SAndroid Build Coastguard Worker             }
3764*61046927SAndroid Build Coastguard Worker         }
3765*61046927SAndroid Build Coastguard Worker 
3766*61046927SAndroid Build Coastguard Worker         // If exceptions disabled, return null pointer from allocator
3767*61046927SAndroid Build Coastguard Worker         return retValue;
3768*61046927SAndroid Build Coastguard Worker     }
3769*61046927SAndroid Build Coastguard Worker 
deallocate(pointer p,size_type)3770*61046927SAndroid Build Coastguard Worker     void deallocate(pointer p, size_type)
3771*61046927SAndroid Build Coastguard Worker     {
3772*61046927SAndroid Build Coastguard Worker         clSVMFree(context_(), p);
3773*61046927SAndroid Build Coastguard Worker     }
3774*61046927SAndroid Build Coastguard Worker 
3775*61046927SAndroid Build Coastguard Worker     /**
3776*61046927SAndroid Build Coastguard Worker      * Return the maximum possible allocation size.
3777*61046927SAndroid Build Coastguard Worker      * This is the minimum of the maximum sizes of all devices in the context.
3778*61046927SAndroid Build Coastguard Worker      */
max_size() const3779*61046927SAndroid Build Coastguard Worker     size_type max_size() const CL_HPP_NOEXCEPT_
3780*61046927SAndroid Build Coastguard Worker     {
3781*61046927SAndroid Build Coastguard Worker         size_type maxSize = std::numeric_limits<size_type>::max() / sizeof(T);
3782*61046927SAndroid Build Coastguard Worker 
3783*61046927SAndroid Build Coastguard Worker         for (const Device &d : context_.getInfo<CL_CONTEXT_DEVICES>()) {
3784*61046927SAndroid Build Coastguard Worker             maxSize = std::min(
3785*61046927SAndroid Build Coastguard Worker                 maxSize,
3786*61046927SAndroid Build Coastguard Worker                 static_cast<size_type>(d.getInfo<CL_DEVICE_MAX_MEM_ALLOC_SIZE>()));
3787*61046927SAndroid Build Coastguard Worker         }
3788*61046927SAndroid Build Coastguard Worker 
3789*61046927SAndroid Build Coastguard Worker         return maxSize;
3790*61046927SAndroid Build Coastguard Worker     }
3791*61046927SAndroid Build Coastguard Worker 
3792*61046927SAndroid Build Coastguard Worker     template< class U, class... Args >
construct(U * p,Args &&...args)3793*61046927SAndroid Build Coastguard Worker     void construct(U* p, Args&&... args)
3794*61046927SAndroid Build Coastguard Worker     {
3795*61046927SAndroid Build Coastguard Worker         new(p)T(args...);
3796*61046927SAndroid Build Coastguard Worker     }
3797*61046927SAndroid Build Coastguard Worker 
3798*61046927SAndroid Build Coastguard Worker     template< class U >
destroy(U * p)3799*61046927SAndroid Build Coastguard Worker     void destroy(U* p)
3800*61046927SAndroid Build Coastguard Worker     {
3801*61046927SAndroid Build Coastguard Worker         p->~U();
3802*61046927SAndroid Build Coastguard Worker     }
3803*61046927SAndroid Build Coastguard Worker 
3804*61046927SAndroid Build Coastguard Worker     /**
3805*61046927SAndroid Build Coastguard Worker      * Returns true if the contexts match.
3806*61046927SAndroid Build Coastguard Worker      */
operator ==(SVMAllocator const & rhs)3807*61046927SAndroid Build Coastguard Worker     inline bool operator==(SVMAllocator const& rhs)
3808*61046927SAndroid Build Coastguard Worker     {
3809*61046927SAndroid Build Coastguard Worker         return (context_==rhs.context_);
3810*61046927SAndroid Build Coastguard Worker     }
3811*61046927SAndroid Build Coastguard Worker 
operator !=(SVMAllocator const & a)3812*61046927SAndroid Build Coastguard Worker     inline bool operator!=(SVMAllocator const& a)
3813*61046927SAndroid Build Coastguard Worker     {
3814*61046927SAndroid Build Coastguard Worker         return !operator==(a);
3815*61046927SAndroid Build Coastguard Worker     }
3816*61046927SAndroid Build Coastguard Worker }; // class SVMAllocator        return cl::pointer<T>(tmp, detail::Deleter<T, Alloc>{alloc, copies});
3817*61046927SAndroid Build Coastguard Worker 
3818*61046927SAndroid Build Coastguard Worker 
3819*61046927SAndroid Build Coastguard Worker template<class SVMTrait>
3820*61046927SAndroid Build Coastguard Worker class SVMAllocator<void, SVMTrait> {
3821*61046927SAndroid Build Coastguard Worker public:
3822*61046927SAndroid Build Coastguard Worker     typedef void value_type;
3823*61046927SAndroid Build Coastguard Worker     typedef value_type* pointer;
3824*61046927SAndroid Build Coastguard Worker     typedef const value_type* const_pointer;
3825*61046927SAndroid Build Coastguard Worker 
3826*61046927SAndroid Build Coastguard Worker     template<typename U>
3827*61046927SAndroid Build Coastguard Worker     struct rebind
3828*61046927SAndroid Build Coastguard Worker     {
3829*61046927SAndroid Build Coastguard Worker         typedef SVMAllocator<U, SVMTrait> other;
3830*61046927SAndroid Build Coastguard Worker     };
3831*61046927SAndroid Build Coastguard Worker 
3832*61046927SAndroid Build Coastguard Worker     template<typename U, typename V>
3833*61046927SAndroid Build Coastguard Worker     friend class SVMAllocator;
3834*61046927SAndroid Build Coastguard Worker };
3835*61046927SAndroid Build Coastguard Worker 
3836*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_NO_STD_UNIQUE_PTR)
3837*61046927SAndroid Build Coastguard Worker namespace detail
3838*61046927SAndroid Build Coastguard Worker {
3839*61046927SAndroid Build Coastguard Worker     template<class Alloc>
3840*61046927SAndroid Build Coastguard Worker     class Deleter {
3841*61046927SAndroid Build Coastguard Worker     private:
3842*61046927SAndroid Build Coastguard Worker         Alloc alloc_;
3843*61046927SAndroid Build Coastguard Worker         size_type copies_;
3844*61046927SAndroid Build Coastguard Worker 
3845*61046927SAndroid Build Coastguard Worker     public:
3846*61046927SAndroid Build Coastguard Worker         typedef typename std::allocator_traits<Alloc>::pointer pointer;
3847*61046927SAndroid Build Coastguard Worker 
Deleter(const Alloc & alloc,size_type copies)3848*61046927SAndroid Build Coastguard Worker         Deleter(const Alloc &alloc, size_type copies) : alloc_{ alloc }, copies_{ copies }
3849*61046927SAndroid Build Coastguard Worker         {
3850*61046927SAndroid Build Coastguard Worker         }
3851*61046927SAndroid Build Coastguard Worker 
operator ()(pointer ptr) const3852*61046927SAndroid Build Coastguard Worker         void operator()(pointer ptr) const {
3853*61046927SAndroid Build Coastguard Worker             Alloc tmpAlloc{ alloc_ };
3854*61046927SAndroid Build Coastguard Worker             std::allocator_traits<Alloc>::destroy(tmpAlloc, std::addressof(*ptr));
3855*61046927SAndroid Build Coastguard Worker             std::allocator_traits<Alloc>::deallocate(tmpAlloc, ptr, copies_);
3856*61046927SAndroid Build Coastguard Worker         }
3857*61046927SAndroid Build Coastguard Worker     };
3858*61046927SAndroid Build Coastguard Worker } // namespace detail
3859*61046927SAndroid Build Coastguard Worker 
3860*61046927SAndroid Build Coastguard Worker /**
3861*61046927SAndroid Build Coastguard Worker  * Allocation operation compatible with std::allocate_ptr.
3862*61046927SAndroid Build Coastguard Worker  * Creates a unique_ptr<T> by default.
3863*61046927SAndroid Build Coastguard Worker  * This requirement is to ensure that the control block is not
3864*61046927SAndroid Build Coastguard Worker  * allocated in memory inaccessible to the host.
3865*61046927SAndroid Build Coastguard Worker  */
3866*61046927SAndroid Build Coastguard Worker template <class T, class Alloc, class... Args>
allocate_pointer(const Alloc & alloc_,Args &&...args)3867*61046927SAndroid Build Coastguard Worker cl::pointer<T, detail::Deleter<Alloc>> allocate_pointer(const Alloc &alloc_, Args&&... args)
3868*61046927SAndroid Build Coastguard Worker {
3869*61046927SAndroid Build Coastguard Worker     Alloc alloc(alloc_);
3870*61046927SAndroid Build Coastguard Worker     static const size_type copies = 1;
3871*61046927SAndroid Build Coastguard Worker 
3872*61046927SAndroid Build Coastguard Worker     // Ensure that creation of the management block and the
3873*61046927SAndroid Build Coastguard Worker     // object are dealt with separately such that we only provide a deleter
3874*61046927SAndroid Build Coastguard Worker 
3875*61046927SAndroid Build Coastguard Worker     T* tmp = std::allocator_traits<Alloc>::allocate(alloc, copies);
3876*61046927SAndroid Build Coastguard Worker     if (!tmp) {
3877*61046927SAndroid Build Coastguard Worker         std::bad_alloc excep;
3878*61046927SAndroid Build Coastguard Worker         throw excep;
3879*61046927SAndroid Build Coastguard Worker     }
3880*61046927SAndroid Build Coastguard Worker     try {
3881*61046927SAndroid Build Coastguard Worker         std::allocator_traits<Alloc>::construct(
3882*61046927SAndroid Build Coastguard Worker             alloc,
3883*61046927SAndroid Build Coastguard Worker             std::addressof(*tmp),
3884*61046927SAndroid Build Coastguard Worker             std::forward<Args>(args)...);
3885*61046927SAndroid Build Coastguard Worker 
3886*61046927SAndroid Build Coastguard Worker         return cl::pointer<T, detail::Deleter<Alloc>>(tmp, detail::Deleter<Alloc>{alloc, copies});
3887*61046927SAndroid Build Coastguard Worker     }
3888*61046927SAndroid Build Coastguard Worker     catch (std::bad_alloc&)
3889*61046927SAndroid Build Coastguard Worker     {
3890*61046927SAndroid Build Coastguard Worker         std::allocator_traits<Alloc>::deallocate(alloc, tmp, copies);
3891*61046927SAndroid Build Coastguard Worker         throw;
3892*61046927SAndroid Build Coastguard Worker     }
3893*61046927SAndroid Build Coastguard Worker }
3894*61046927SAndroid Build Coastguard Worker 
3895*61046927SAndroid Build Coastguard Worker template< class T, class SVMTrait, class... Args >
allocate_svm(Args...args)3896*61046927SAndroid Build Coastguard Worker cl::pointer<T, detail::Deleter<SVMAllocator<T, SVMTrait>>> allocate_svm(Args... args)
3897*61046927SAndroid Build Coastguard Worker {
3898*61046927SAndroid Build Coastguard Worker     SVMAllocator<T, SVMTrait> alloc;
3899*61046927SAndroid Build Coastguard Worker     return cl::allocate_pointer<T>(alloc, args...);
3900*61046927SAndroid Build Coastguard Worker }
3901*61046927SAndroid Build Coastguard Worker 
3902*61046927SAndroid Build Coastguard Worker template< class T, class SVMTrait, class... Args >
allocate_svm(const cl::Context & c,Args...args)3903*61046927SAndroid Build Coastguard Worker cl::pointer<T, detail::Deleter<SVMAllocator<T, SVMTrait>>> allocate_svm(const cl::Context &c, Args... args)
3904*61046927SAndroid Build Coastguard Worker {
3905*61046927SAndroid Build Coastguard Worker     SVMAllocator<T, SVMTrait> alloc(c);
3906*61046927SAndroid Build Coastguard Worker     return cl::allocate_pointer<T>(alloc, args...);
3907*61046927SAndroid Build Coastguard Worker }
3908*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_NO_STD_UNIQUE_PTR)
3909*61046927SAndroid Build Coastguard Worker 
3910*61046927SAndroid Build Coastguard Worker /*! \brief Vector alias to simplify contruction of coarse-grained SVM containers.
3911*61046927SAndroid Build Coastguard Worker  *
3912*61046927SAndroid Build Coastguard Worker  */
3913*61046927SAndroid Build Coastguard Worker template < class T >
3914*61046927SAndroid Build Coastguard Worker using coarse_svm_vector = vector<T, cl::SVMAllocator<int, cl::SVMTraitCoarse<>>>;
3915*61046927SAndroid Build Coastguard Worker 
3916*61046927SAndroid Build Coastguard Worker /*! \brief Vector alias to simplify contruction of fine-grained SVM containers.
3917*61046927SAndroid Build Coastguard Worker *
3918*61046927SAndroid Build Coastguard Worker */
3919*61046927SAndroid Build Coastguard Worker template < class T >
3920*61046927SAndroid Build Coastguard Worker using fine_svm_vector = vector<T, cl::SVMAllocator<int, cl::SVMTraitFine<>>>;
3921*61046927SAndroid Build Coastguard Worker 
3922*61046927SAndroid Build Coastguard Worker /*! \brief Vector alias to simplify contruction of fine-grained SVM containers that support platform atomics.
3923*61046927SAndroid Build Coastguard Worker *
3924*61046927SAndroid Build Coastguard Worker */
3925*61046927SAndroid Build Coastguard Worker template < class T >
3926*61046927SAndroid Build Coastguard Worker using atomic_svm_vector = vector<T, cl::SVMAllocator<int, cl::SVMTraitAtomic<>>>;
3927*61046927SAndroid Build Coastguard Worker 
3928*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
3929*61046927SAndroid Build Coastguard Worker 
3930*61046927SAndroid Build Coastguard Worker 
3931*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for Buffer Memory Objects.
3932*61046927SAndroid Build Coastguard Worker  *
3933*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
3934*61046927SAndroid Build Coastguard Worker  *
3935*61046927SAndroid Build Coastguard Worker  *  \see Memory
3936*61046927SAndroid Build Coastguard Worker  */
3937*61046927SAndroid Build Coastguard Worker class Buffer : public Memory
3938*61046927SAndroid Build Coastguard Worker {
3939*61046927SAndroid Build Coastguard Worker public:
3940*61046927SAndroid Build Coastguard Worker 
3941*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Buffer in a specified context.
3942*61046927SAndroid Build Coastguard Worker      *
3943*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateBuffer().
3944*61046927SAndroid Build Coastguard Worker      *
3945*61046927SAndroid Build Coastguard Worker      *  \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3946*61046927SAndroid Build Coastguard Worker      *                  specified.  Note alignment & exclusivity requirements.
3947*61046927SAndroid Build Coastguard Worker      */
Buffer(const Context & context,cl_mem_flags flags,size_type size,void * host_ptr=NULL,cl_int * err=NULL)3948*61046927SAndroid Build Coastguard Worker     Buffer(
3949*61046927SAndroid Build Coastguard Worker         const Context& context,
3950*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
3951*61046927SAndroid Build Coastguard Worker         size_type size,
3952*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3953*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3954*61046927SAndroid Build Coastguard Worker     {
3955*61046927SAndroid Build Coastguard Worker         cl_int error;
3956*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3957*61046927SAndroid Build Coastguard Worker 
3958*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
3959*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3960*61046927SAndroid Build Coastguard Worker             *err = error;
3961*61046927SAndroid Build Coastguard Worker         }
3962*61046927SAndroid Build Coastguard Worker     }
3963*61046927SAndroid Build Coastguard Worker 
3964*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Buffer in the default context.
3965*61046927SAndroid Build Coastguard Worker      *
3966*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateBuffer().
3967*61046927SAndroid Build Coastguard Worker      *
3968*61046927SAndroid Build Coastguard Worker      *  \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3969*61046927SAndroid Build Coastguard Worker      *                  specified.  Note alignment & exclusivity requirements.
3970*61046927SAndroid Build Coastguard Worker      *
3971*61046927SAndroid Build Coastguard Worker      *  \see Context::getDefault()
3972*61046927SAndroid Build Coastguard Worker      */
Buffer(cl_mem_flags flags,size_type size,void * host_ptr=NULL,cl_int * err=NULL)3973*61046927SAndroid Build Coastguard Worker     Buffer(
3974*61046927SAndroid Build Coastguard Worker          cl_mem_flags flags,
3975*61046927SAndroid Build Coastguard Worker         size_type size,
3976*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
3977*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
3978*61046927SAndroid Build Coastguard Worker     {
3979*61046927SAndroid Build Coastguard Worker         cl_int error;
3980*61046927SAndroid Build Coastguard Worker 
3981*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
3982*61046927SAndroid Build Coastguard Worker 
3983*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3984*61046927SAndroid Build Coastguard Worker 
3985*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
3986*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
3987*61046927SAndroid Build Coastguard Worker             *err = error;
3988*61046927SAndroid Build Coastguard Worker         }
3989*61046927SAndroid Build Coastguard Worker     }
3990*61046927SAndroid Build Coastguard Worker 
3991*61046927SAndroid Build Coastguard Worker     /*!
3992*61046927SAndroid Build Coastguard Worker      * \brief Construct a Buffer from a host container via iterators.
3993*61046927SAndroid Build Coastguard Worker      * IteratorType must be random access.
3994*61046927SAndroid Build Coastguard Worker      * If useHostPtr is specified iterators must represent contiguous data.
3995*61046927SAndroid Build Coastguard Worker      */
3996*61046927SAndroid Build Coastguard Worker     template< typename IteratorType >
Buffer(IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr=false,cl_int * err=NULL)3997*61046927SAndroid Build Coastguard Worker     Buffer(
3998*61046927SAndroid Build Coastguard Worker         IteratorType startIterator,
3999*61046927SAndroid Build Coastguard Worker         IteratorType endIterator,
4000*61046927SAndroid Build Coastguard Worker         bool readOnly,
4001*61046927SAndroid Build Coastguard Worker         bool useHostPtr = false,
4002*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4003*61046927SAndroid Build Coastguard Worker     {
4004*61046927SAndroid Build Coastguard Worker         typedef typename std::iterator_traits<IteratorType>::value_type DataType;
4005*61046927SAndroid Build Coastguard Worker         cl_int error;
4006*61046927SAndroid Build Coastguard Worker 
4007*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags = 0;
4008*61046927SAndroid Build Coastguard Worker         if( readOnly ) {
4009*61046927SAndroid Build Coastguard Worker             flags |= CL_MEM_READ_ONLY;
4010*61046927SAndroid Build Coastguard Worker         }
4011*61046927SAndroid Build Coastguard Worker         else {
4012*61046927SAndroid Build Coastguard Worker             flags |= CL_MEM_READ_WRITE;
4013*61046927SAndroid Build Coastguard Worker         }
4014*61046927SAndroid Build Coastguard Worker         if( useHostPtr ) {
4015*61046927SAndroid Build Coastguard Worker             flags |= CL_MEM_USE_HOST_PTR;
4016*61046927SAndroid Build Coastguard Worker         }
4017*61046927SAndroid Build Coastguard Worker 
4018*61046927SAndroid Build Coastguard Worker         size_type size = sizeof(DataType)*(endIterator - startIterator);
4019*61046927SAndroid Build Coastguard Worker 
4020*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
4021*61046927SAndroid Build Coastguard Worker 
4022*61046927SAndroid Build Coastguard Worker         if( useHostPtr ) {
4023*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateBuffer(context(), flags, size, const_cast<DataType*>(&*startIterator), &error);
4024*61046927SAndroid Build Coastguard Worker         } else {
4025*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
4026*61046927SAndroid Build Coastguard Worker         }
4027*61046927SAndroid Build Coastguard Worker 
4028*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
4029*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4030*61046927SAndroid Build Coastguard Worker             *err = error;
4031*61046927SAndroid Build Coastguard Worker         }
4032*61046927SAndroid Build Coastguard Worker 
4033*61046927SAndroid Build Coastguard Worker         if( !useHostPtr ) {
4034*61046927SAndroid Build Coastguard Worker             error = cl::copy(startIterator, endIterator, *this);
4035*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_BUFFER_ERR);
4036*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
4037*61046927SAndroid Build Coastguard Worker                 *err = error;
4038*61046927SAndroid Build Coastguard Worker             }
4039*61046927SAndroid Build Coastguard Worker         }
4040*61046927SAndroid Build Coastguard Worker     }
4041*61046927SAndroid Build Coastguard Worker 
4042*61046927SAndroid Build Coastguard Worker     /*!
4043*61046927SAndroid Build Coastguard Worker      * \brief Construct a Buffer from a host container via iterators using a specified context.
4044*61046927SAndroid Build Coastguard Worker      * IteratorType must be random access.
4045*61046927SAndroid Build Coastguard Worker      * If useHostPtr is specified iterators must represent contiguous data.
4046*61046927SAndroid Build Coastguard Worker      */
4047*61046927SAndroid Build Coastguard Worker     template< typename IteratorType >
4048*61046927SAndroid Build Coastguard Worker     Buffer(const Context &context, IteratorType startIterator, IteratorType endIterator,
4049*61046927SAndroid Build Coastguard Worker         bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
4050*61046927SAndroid Build Coastguard Worker 
4051*61046927SAndroid Build Coastguard Worker     /*!
4052*61046927SAndroid Build Coastguard Worker     * \brief Construct a Buffer from a host container via iterators using a specified queue.
4053*61046927SAndroid Build Coastguard Worker     * If useHostPtr is specified iterators must be random access.
4054*61046927SAndroid Build Coastguard Worker     */
4055*61046927SAndroid Build Coastguard Worker     template< typename IteratorType >
4056*61046927SAndroid Build Coastguard Worker     Buffer(const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator,
4057*61046927SAndroid Build Coastguard Worker         bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
4058*61046927SAndroid Build Coastguard Worker 
4059*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Buffer()4060*61046927SAndroid Build Coastguard Worker     Buffer() : Memory() { }
4061*61046927SAndroid Build Coastguard Worker 
4062*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4063*61046927SAndroid Build Coastguard Worker      *
4064*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4065*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with earlier versions.
4066*61046927SAndroid Build Coastguard Worker      *
4067*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4068*61046927SAndroid Build Coastguard Worker      */
Buffer(const cl_mem & buffer,bool retainObject=false)4069*61046927SAndroid Build Coastguard Worker     explicit Buffer(const cl_mem& buffer, bool retainObject = false) :
4070*61046927SAndroid Build Coastguard Worker         Memory(buffer, retainObject) { }
4071*61046927SAndroid Build Coastguard Worker 
4072*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4073*61046927SAndroid Build Coastguard Worker     *
4074*61046927SAndroid Build Coastguard Worker     *  See Memory for further details.
4075*61046927SAndroid Build Coastguard Worker     */
operator =(const cl_mem & rhs)4076*61046927SAndroid Build Coastguard Worker     Buffer& operator = (const cl_mem& rhs)
4077*61046927SAndroid Build Coastguard Worker     {
4078*61046927SAndroid Build Coastguard Worker         Memory::operator=(rhs);
4079*61046927SAndroid Build Coastguard Worker         return *this;
4080*61046927SAndroid Build Coastguard Worker     }
4081*61046927SAndroid Build Coastguard Worker 
4082*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4083*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4084*61046927SAndroid Build Coastguard Worker      */
Buffer(const Buffer & buf)4085*61046927SAndroid Build Coastguard Worker     Buffer(const Buffer& buf) : Memory(buf) {}
4086*61046927SAndroid Build Coastguard Worker 
4087*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4088*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4089*61046927SAndroid Build Coastguard Worker      */
operator =(const Buffer & buf)4090*61046927SAndroid Build Coastguard Worker     Buffer& operator = (const Buffer &buf)
4091*61046927SAndroid Build Coastguard Worker     {
4092*61046927SAndroid Build Coastguard Worker         Memory::operator=(buf);
4093*61046927SAndroid Build Coastguard Worker         return *this;
4094*61046927SAndroid Build Coastguard Worker     }
4095*61046927SAndroid Build Coastguard Worker 
4096*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4097*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4098*61046927SAndroid Build Coastguard Worker      */
Buffer(Buffer && buf)4099*61046927SAndroid Build Coastguard Worker     Buffer(Buffer&& buf) CL_HPP_NOEXCEPT_ : Memory(std::move(buf)) {}
4100*61046927SAndroid Build Coastguard Worker 
4101*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4102*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4103*61046927SAndroid Build Coastguard Worker      */
operator =(Buffer && buf)4104*61046927SAndroid Build Coastguard Worker     Buffer& operator = (Buffer &&buf)
4105*61046927SAndroid Build Coastguard Worker     {
4106*61046927SAndroid Build Coastguard Worker         Memory::operator=(std::move(buf));
4107*61046927SAndroid Build Coastguard Worker         return *this;
4108*61046927SAndroid Build Coastguard Worker     }
4109*61046927SAndroid Build Coastguard Worker 
4110*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
4111*61046927SAndroid Build Coastguard Worker     /*! \brief Creates a new buffer object from this.
4112*61046927SAndroid Build Coastguard Worker      *
4113*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateSubBuffer().
4114*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)4115*61046927SAndroid Build Coastguard Worker     Buffer createSubBuffer(
4116*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4117*61046927SAndroid Build Coastguard Worker         cl_buffer_create_type buffer_create_type,
4118*61046927SAndroid Build Coastguard Worker         const void * buffer_create_info,
4119*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4120*61046927SAndroid Build Coastguard Worker     {
4121*61046927SAndroid Build Coastguard Worker         Buffer result;
4122*61046927SAndroid Build Coastguard Worker         cl_int error;
4123*61046927SAndroid Build Coastguard Worker         result.object_ = ::clCreateSubBuffer(
4124*61046927SAndroid Build Coastguard Worker             object_,
4125*61046927SAndroid Build Coastguard Worker             flags,
4126*61046927SAndroid Build Coastguard Worker             buffer_create_type,
4127*61046927SAndroid Build Coastguard Worker             buffer_create_info,
4128*61046927SAndroid Build Coastguard Worker             &error);
4129*61046927SAndroid Build Coastguard Worker 
4130*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_SUBBUFFER_ERR);
4131*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4132*61046927SAndroid Build Coastguard Worker             *err = error;
4133*61046927SAndroid Build Coastguard Worker         }
4134*61046927SAndroid Build Coastguard Worker 
4135*61046927SAndroid Build Coastguard Worker         return result;
4136*61046927SAndroid Build Coastguard Worker     }
4137*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
4138*61046927SAndroid Build Coastguard Worker };
4139*61046927SAndroid Build Coastguard Worker 
4140*61046927SAndroid Build Coastguard Worker #if defined (CL_HPP_USE_DX_INTEROP)
4141*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.
4142*61046927SAndroid Build Coastguard Worker  *
4143*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with Direct3D.
4144*61046927SAndroid Build Coastguard Worker  *
4145*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4146*61046927SAndroid Build Coastguard Worker  *
4147*61046927SAndroid Build Coastguard Worker  *  \see Memory
4148*61046927SAndroid Build Coastguard Worker  */
4149*61046927SAndroid Build Coastguard Worker class BufferD3D10 : public Buffer
4150*61046927SAndroid Build Coastguard Worker {
4151*61046927SAndroid Build Coastguard Worker public:
4152*61046927SAndroid Build Coastguard Worker 
4153*61046927SAndroid Build Coastguard Worker 
4154*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a BufferD3D10, in a specified context, from a
4155*61046927SAndroid Build Coastguard Worker      *         given ID3D10Buffer.
4156*61046927SAndroid Build Coastguard Worker      *
4157*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromD3D10BufferKHR().
4158*61046927SAndroid Build Coastguard Worker      */
BufferD3D10(const Context & context,cl_mem_flags flags,ID3D10Buffer * bufobj,cl_int * err=NULL)4159*61046927SAndroid Build Coastguard Worker     BufferD3D10(
4160*61046927SAndroid Build Coastguard Worker         const Context& context,
4161*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4162*61046927SAndroid Build Coastguard Worker         ID3D10Buffer* bufobj,
4163*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL) : pfn_clCreateFromD3D10BufferKHR(nullptr)
4164*61046927SAndroid Build Coastguard Worker     {
4165*61046927SAndroid Build Coastguard Worker         typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)(
4166*61046927SAndroid Build Coastguard Worker             cl_context context, cl_mem_flags flags, ID3D10Buffer*  buffer,
4167*61046927SAndroid Build Coastguard Worker             cl_int* errcode_ret);
4168*61046927SAndroid Build Coastguard Worker         PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR;
4169*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
4170*61046927SAndroid Build Coastguard Worker         vector<cl_context_properties> props = context.getInfo<CL_CONTEXT_PROPERTIES>();
4171*61046927SAndroid Build Coastguard Worker         cl_platform platform = -1;
4172*61046927SAndroid Build Coastguard Worker         for( int i = 0; i < props.size(); ++i ) {
4173*61046927SAndroid Build Coastguard Worker             if( props[i] == CL_CONTEXT_PLATFORM ) {
4174*61046927SAndroid Build Coastguard Worker                 platform = props[i+1];
4175*61046927SAndroid Build Coastguard Worker             }
4176*61046927SAndroid Build Coastguard Worker         }
4177*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_PLATFORM_(platform, clCreateFromD3D10BufferKHR);
4178*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 110
4179*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clCreateFromD3D10BufferKHR);
4180*61046927SAndroid Build Coastguard Worker #endif
4181*61046927SAndroid Build Coastguard Worker 
4182*61046927SAndroid Build Coastguard Worker         cl_int error;
4183*61046927SAndroid Build Coastguard Worker         object_ = pfn_clCreateFromD3D10BufferKHR(
4184*61046927SAndroid Build Coastguard Worker             context(),
4185*61046927SAndroid Build Coastguard Worker             flags,
4186*61046927SAndroid Build Coastguard Worker             bufobj,
4187*61046927SAndroid Build Coastguard Worker             &error);
4188*61046927SAndroid Build Coastguard Worker 
4189*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
4190*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4191*61046927SAndroid Build Coastguard Worker             *err = error;
4192*61046927SAndroid Build Coastguard Worker         }
4193*61046927SAndroid Build Coastguard Worker     }
4194*61046927SAndroid Build Coastguard Worker 
4195*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
BufferD3D10()4196*61046927SAndroid Build Coastguard Worker     BufferD3D10() : Buffer() { }
4197*61046927SAndroid Build Coastguard Worker 
4198*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4199*61046927SAndroid Build Coastguard Worker      *
4200*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4201*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4202*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4203*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4204*61046927SAndroid Build Coastguard Worker      */
BufferD3D10(const cl_mem & buffer,bool retainObject=false)4205*61046927SAndroid Build Coastguard Worker     explicit BufferD3D10(const cl_mem& buffer, bool retainObject = false) :
4206*61046927SAndroid Build Coastguard Worker         Buffer(buffer, retainObject) { }
4207*61046927SAndroid Build Coastguard Worker 
4208*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4209*61046927SAndroid Build Coastguard Worker      *
4210*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4211*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4212*61046927SAndroid Build Coastguard Worker     BufferD3D10& operator = (const cl_mem& rhs)
4213*61046927SAndroid Build Coastguard Worker     {
4214*61046927SAndroid Build Coastguard Worker         Buffer::operator=(rhs);
4215*61046927SAndroid Build Coastguard Worker         return *this;
4216*61046927SAndroid Build Coastguard Worker     }
4217*61046927SAndroid Build Coastguard Worker 
4218*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4219*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4220*61046927SAndroid Build Coastguard Worker      */
BufferD3D10(const BufferD3D10 & buf)4221*61046927SAndroid Build Coastguard Worker     BufferD3D10(const BufferD3D10& buf) :
4222*61046927SAndroid Build Coastguard Worker         Buffer(buf) {}
4223*61046927SAndroid Build Coastguard Worker 
4224*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4225*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4226*61046927SAndroid Build Coastguard Worker      */
operator =(const BufferD3D10 & buf)4227*61046927SAndroid Build Coastguard Worker     BufferD3D10& operator = (const BufferD3D10 &buf)
4228*61046927SAndroid Build Coastguard Worker     {
4229*61046927SAndroid Build Coastguard Worker         Buffer::operator=(buf);
4230*61046927SAndroid Build Coastguard Worker         return *this;
4231*61046927SAndroid Build Coastguard Worker     }
4232*61046927SAndroid Build Coastguard Worker 
4233*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4234*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4235*61046927SAndroid Build Coastguard Worker      */
BufferD3D10(BufferD3D10 && buf)4236*61046927SAndroid Build Coastguard Worker     BufferD3D10(BufferD3D10&& buf) CL_HPP_NOEXCEPT_ : Buffer(std::move(buf)) {}
4237*61046927SAndroid Build Coastguard Worker 
4238*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4239*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4240*61046927SAndroid Build Coastguard Worker      */
operator =(BufferD3D10 && buf)4241*61046927SAndroid Build Coastguard Worker     BufferD3D10& operator = (BufferD3D10 &&buf)
4242*61046927SAndroid Build Coastguard Worker     {
4243*61046927SAndroid Build Coastguard Worker         Buffer::operator=(std::move(buf));
4244*61046927SAndroid Build Coastguard Worker         return *this;
4245*61046927SAndroid Build Coastguard Worker     }
4246*61046927SAndroid Build Coastguard Worker };
4247*61046927SAndroid Build Coastguard Worker #endif
4248*61046927SAndroid Build Coastguard Worker 
4249*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL Buffer Memory Objects.
4250*61046927SAndroid Build Coastguard Worker  *
4251*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
4252*61046927SAndroid Build Coastguard Worker  *
4253*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4254*61046927SAndroid Build Coastguard Worker  *
4255*61046927SAndroid Build Coastguard Worker  *  \see Memory
4256*61046927SAndroid Build Coastguard Worker  */
4257*61046927SAndroid Build Coastguard Worker class BufferGL : public Buffer
4258*61046927SAndroid Build Coastguard Worker {
4259*61046927SAndroid Build Coastguard Worker public:
4260*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a BufferGL in a specified context, from a given
4261*61046927SAndroid Build Coastguard Worker      *         GL buffer.
4262*61046927SAndroid Build Coastguard Worker      *
4263*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLBuffer().
4264*61046927SAndroid Build Coastguard Worker      */
BufferGL(const Context & context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * err=NULL)4265*61046927SAndroid Build Coastguard Worker     BufferGL(
4266*61046927SAndroid Build Coastguard Worker         const Context& context,
4267*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4268*61046927SAndroid Build Coastguard Worker         cl_GLuint bufobj,
4269*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4270*61046927SAndroid Build Coastguard Worker     {
4271*61046927SAndroid Build Coastguard Worker         cl_int error;
4272*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLBuffer(
4273*61046927SAndroid Build Coastguard Worker             context(),
4274*61046927SAndroid Build Coastguard Worker             flags,
4275*61046927SAndroid Build Coastguard Worker             bufobj,
4276*61046927SAndroid Build Coastguard Worker             &error);
4277*61046927SAndroid Build Coastguard Worker 
4278*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
4279*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4280*61046927SAndroid Build Coastguard Worker             *err = error;
4281*61046927SAndroid Build Coastguard Worker         }
4282*61046927SAndroid Build Coastguard Worker     }
4283*61046927SAndroid Build Coastguard Worker 
4284*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
BufferGL()4285*61046927SAndroid Build Coastguard Worker     BufferGL() : Buffer() { }
4286*61046927SAndroid Build Coastguard Worker 
4287*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4288*61046927SAndroid Build Coastguard Worker      *
4289*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4290*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4291*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4292*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4293*61046927SAndroid Build Coastguard Worker      */
BufferGL(const cl_mem & buffer,bool retainObject=false)4294*61046927SAndroid Build Coastguard Worker     explicit BufferGL(const cl_mem& buffer, bool retainObject = false) :
4295*61046927SAndroid Build Coastguard Worker         Buffer(buffer, retainObject) { }
4296*61046927SAndroid Build Coastguard Worker 
4297*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4298*61046927SAndroid Build Coastguard Worker      *
4299*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4300*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4301*61046927SAndroid Build Coastguard Worker     BufferGL& operator = (const cl_mem& rhs)
4302*61046927SAndroid Build Coastguard Worker     {
4303*61046927SAndroid Build Coastguard Worker         Buffer::operator=(rhs);
4304*61046927SAndroid Build Coastguard Worker         return *this;
4305*61046927SAndroid Build Coastguard Worker     }
4306*61046927SAndroid Build Coastguard Worker 
4307*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4308*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4309*61046927SAndroid Build Coastguard Worker      */
BufferGL(const BufferGL & buf)4310*61046927SAndroid Build Coastguard Worker     BufferGL(const BufferGL& buf) : Buffer(buf) {}
4311*61046927SAndroid Build Coastguard Worker 
4312*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4313*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4314*61046927SAndroid Build Coastguard Worker      */
operator =(const BufferGL & buf)4315*61046927SAndroid Build Coastguard Worker     BufferGL& operator = (const BufferGL &buf)
4316*61046927SAndroid Build Coastguard Worker     {
4317*61046927SAndroid Build Coastguard Worker         Buffer::operator=(buf);
4318*61046927SAndroid Build Coastguard Worker         return *this;
4319*61046927SAndroid Build Coastguard Worker     }
4320*61046927SAndroid Build Coastguard Worker 
4321*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4322*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4323*61046927SAndroid Build Coastguard Worker      */
BufferGL(BufferGL && buf)4324*61046927SAndroid Build Coastguard Worker     BufferGL(BufferGL&& buf) CL_HPP_NOEXCEPT_ : Buffer(std::move(buf)) {}
4325*61046927SAndroid Build Coastguard Worker 
4326*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4327*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4328*61046927SAndroid Build Coastguard Worker      */
operator =(BufferGL && buf)4329*61046927SAndroid Build Coastguard Worker     BufferGL& operator = (BufferGL &&buf)
4330*61046927SAndroid Build Coastguard Worker     {
4331*61046927SAndroid Build Coastguard Worker         Buffer::operator=(std::move(buf));
4332*61046927SAndroid Build Coastguard Worker         return *this;
4333*61046927SAndroid Build Coastguard Worker     }
4334*61046927SAndroid Build Coastguard Worker 
4335*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetGLObjectInfo().
getObjectInfo(cl_gl_object_type * type,cl_GLuint * gl_object_name)4336*61046927SAndroid Build Coastguard Worker     cl_int getObjectInfo(
4337*61046927SAndroid Build Coastguard Worker         cl_gl_object_type *type,
4338*61046927SAndroid Build Coastguard Worker         cl_GLuint * gl_object_name)
4339*61046927SAndroid Build Coastguard Worker     {
4340*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4341*61046927SAndroid Build Coastguard Worker             ::clGetGLObjectInfo(object_,type,gl_object_name),
4342*61046927SAndroid Build Coastguard Worker             __GET_GL_OBJECT_INFO_ERR);
4343*61046927SAndroid Build Coastguard Worker     }
4344*61046927SAndroid Build Coastguard Worker };
4345*61046927SAndroid Build Coastguard Worker 
4346*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL Render Buffer Memory Objects.
4347*61046927SAndroid Build Coastguard Worker  *
4348*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
4349*61046927SAndroid Build Coastguard Worker  *
4350*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4351*61046927SAndroid Build Coastguard Worker  *
4352*61046927SAndroid Build Coastguard Worker  *  \see Memory
4353*61046927SAndroid Build Coastguard Worker  */
4354*61046927SAndroid Build Coastguard Worker class BufferRenderGL : public Buffer
4355*61046927SAndroid Build Coastguard Worker {
4356*61046927SAndroid Build Coastguard Worker public:
4357*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a BufferRenderGL in a specified context, from a given
4358*61046927SAndroid Build Coastguard Worker      *         GL Renderbuffer.
4359*61046927SAndroid Build Coastguard Worker      *
4360*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLRenderbuffer().
4361*61046927SAndroid Build Coastguard Worker      */
BufferRenderGL(const Context & context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * err=NULL)4362*61046927SAndroid Build Coastguard Worker     BufferRenderGL(
4363*61046927SAndroid Build Coastguard Worker         const Context& context,
4364*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4365*61046927SAndroid Build Coastguard Worker         cl_GLuint bufobj,
4366*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
4367*61046927SAndroid Build Coastguard Worker     {
4368*61046927SAndroid Build Coastguard Worker         cl_int error;
4369*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLRenderbuffer(
4370*61046927SAndroid Build Coastguard Worker             context(),
4371*61046927SAndroid Build Coastguard Worker             flags,
4372*61046927SAndroid Build Coastguard Worker             bufobj,
4373*61046927SAndroid Build Coastguard Worker             &error);
4374*61046927SAndroid Build Coastguard Worker 
4375*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
4376*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4377*61046927SAndroid Build Coastguard Worker             *err = error;
4378*61046927SAndroid Build Coastguard Worker         }
4379*61046927SAndroid Build Coastguard Worker     }
4380*61046927SAndroid Build Coastguard Worker 
4381*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
BufferRenderGL()4382*61046927SAndroid Build Coastguard Worker     BufferRenderGL() : Buffer() { }
4383*61046927SAndroid Build Coastguard Worker 
4384*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4385*61046927SAndroid Build Coastguard Worker      *
4386*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4387*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4388*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4389*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4390*61046927SAndroid Build Coastguard Worker      */
BufferRenderGL(const cl_mem & buffer,bool retainObject=false)4391*61046927SAndroid Build Coastguard Worker     explicit BufferRenderGL(const cl_mem& buffer, bool retainObject = false) :
4392*61046927SAndroid Build Coastguard Worker         Buffer(buffer, retainObject) { }
4393*61046927SAndroid Build Coastguard Worker 
4394*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4395*61046927SAndroid Build Coastguard Worker      *
4396*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4397*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4398*61046927SAndroid Build Coastguard Worker     BufferRenderGL& operator = (const cl_mem& rhs)
4399*61046927SAndroid Build Coastguard Worker     {
4400*61046927SAndroid Build Coastguard Worker         Buffer::operator=(rhs);
4401*61046927SAndroid Build Coastguard Worker         return *this;
4402*61046927SAndroid Build Coastguard Worker     }
4403*61046927SAndroid Build Coastguard Worker 
4404*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4405*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4406*61046927SAndroid Build Coastguard Worker      */
BufferRenderGL(const BufferRenderGL & buf)4407*61046927SAndroid Build Coastguard Worker     BufferRenderGL(const BufferRenderGL& buf) : Buffer(buf) {}
4408*61046927SAndroid Build Coastguard Worker 
4409*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4410*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4411*61046927SAndroid Build Coastguard Worker      */
operator =(const BufferRenderGL & buf)4412*61046927SAndroid Build Coastguard Worker     BufferRenderGL& operator = (const BufferRenderGL &buf)
4413*61046927SAndroid Build Coastguard Worker     {
4414*61046927SAndroid Build Coastguard Worker         Buffer::operator=(buf);
4415*61046927SAndroid Build Coastguard Worker         return *this;
4416*61046927SAndroid Build Coastguard Worker     }
4417*61046927SAndroid Build Coastguard Worker 
4418*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4419*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4420*61046927SAndroid Build Coastguard Worker      */
BufferRenderGL(BufferRenderGL && buf)4421*61046927SAndroid Build Coastguard Worker     BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT_ : Buffer(std::move(buf)) {}
4422*61046927SAndroid Build Coastguard Worker 
4423*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4424*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4425*61046927SAndroid Build Coastguard Worker      */
operator =(BufferRenderGL && buf)4426*61046927SAndroid Build Coastguard Worker     BufferRenderGL& operator = (BufferRenderGL &&buf)
4427*61046927SAndroid Build Coastguard Worker     {
4428*61046927SAndroid Build Coastguard Worker         Buffer::operator=(std::move(buf));
4429*61046927SAndroid Build Coastguard Worker         return *this;
4430*61046927SAndroid Build Coastguard Worker     }
4431*61046927SAndroid Build Coastguard Worker 
4432*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetGLObjectInfo().
getObjectInfo(cl_gl_object_type * type,cl_GLuint * gl_object_name)4433*61046927SAndroid Build Coastguard Worker     cl_int getObjectInfo(
4434*61046927SAndroid Build Coastguard Worker         cl_gl_object_type *type,
4435*61046927SAndroid Build Coastguard Worker         cl_GLuint * gl_object_name)
4436*61046927SAndroid Build Coastguard Worker     {
4437*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4438*61046927SAndroid Build Coastguard Worker             ::clGetGLObjectInfo(object_,type,gl_object_name),
4439*61046927SAndroid Build Coastguard Worker             __GET_GL_OBJECT_INFO_ERR);
4440*61046927SAndroid Build Coastguard Worker     }
4441*61046927SAndroid Build Coastguard Worker };
4442*61046927SAndroid Build Coastguard Worker 
4443*61046927SAndroid Build Coastguard Worker /*! \brief C++ base class for Image Memory objects.
4444*61046927SAndroid Build Coastguard Worker  *
4445*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4446*61046927SAndroid Build Coastguard Worker  *
4447*61046927SAndroid Build Coastguard Worker  *  \see Memory
4448*61046927SAndroid Build Coastguard Worker  */
4449*61046927SAndroid Build Coastguard Worker class Image : public Memory
4450*61046927SAndroid Build Coastguard Worker {
4451*61046927SAndroid Build Coastguard Worker protected:
4452*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image()4453*61046927SAndroid Build Coastguard Worker     Image() : Memory() { }
4454*61046927SAndroid Build Coastguard Worker 
4455*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4456*61046927SAndroid Build Coastguard Worker      *
4457*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4458*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4459*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4460*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4461*61046927SAndroid Build Coastguard Worker      */
Image(const cl_mem & image,bool retainObject=false)4462*61046927SAndroid Build Coastguard Worker     explicit Image(const cl_mem& image, bool retainObject = false) :
4463*61046927SAndroid Build Coastguard Worker         Memory(image, retainObject) { }
4464*61046927SAndroid Build Coastguard Worker 
4465*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4466*61046927SAndroid Build Coastguard Worker      *
4467*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4468*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4469*61046927SAndroid Build Coastguard Worker     Image& operator = (const cl_mem& rhs)
4470*61046927SAndroid Build Coastguard Worker     {
4471*61046927SAndroid Build Coastguard Worker         Memory::operator=(rhs);
4472*61046927SAndroid Build Coastguard Worker         return *this;
4473*61046927SAndroid Build Coastguard Worker     }
4474*61046927SAndroid Build Coastguard Worker 
4475*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4476*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4477*61046927SAndroid Build Coastguard Worker      */
Image(const Image & img)4478*61046927SAndroid Build Coastguard Worker     Image(const Image& img) : Memory(img) {}
4479*61046927SAndroid Build Coastguard Worker 
4480*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4481*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4482*61046927SAndroid Build Coastguard Worker      */
operator =(const Image & img)4483*61046927SAndroid Build Coastguard Worker     Image& operator = (const Image &img)
4484*61046927SAndroid Build Coastguard Worker     {
4485*61046927SAndroid Build Coastguard Worker         Memory::operator=(img);
4486*61046927SAndroid Build Coastguard Worker         return *this;
4487*61046927SAndroid Build Coastguard Worker     }
4488*61046927SAndroid Build Coastguard Worker 
4489*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4490*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4491*61046927SAndroid Build Coastguard Worker      */
Image(Image && img)4492*61046927SAndroid Build Coastguard Worker     Image(Image&& img) CL_HPP_NOEXCEPT_ : Memory(std::move(img)) {}
4493*61046927SAndroid Build Coastguard Worker 
4494*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4495*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4496*61046927SAndroid Build Coastguard Worker      */
operator =(Image && img)4497*61046927SAndroid Build Coastguard Worker     Image& operator = (Image &&img)
4498*61046927SAndroid Build Coastguard Worker     {
4499*61046927SAndroid Build Coastguard Worker         Memory::operator=(std::move(img));
4500*61046927SAndroid Build Coastguard Worker         return *this;
4501*61046927SAndroid Build Coastguard Worker     }
4502*61046927SAndroid Build Coastguard Worker 
4503*61046927SAndroid Build Coastguard Worker 
4504*61046927SAndroid Build Coastguard Worker public:
4505*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetImageInfo().
4506*61046927SAndroid Build Coastguard Worker     template <typename T>
getImageInfo(cl_image_info name,T * param) const4507*61046927SAndroid Build Coastguard Worker     cl_int getImageInfo(cl_image_info name, T* param) const
4508*61046927SAndroid Build Coastguard Worker     {
4509*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
4510*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetImageInfo, object_, name, param),
4511*61046927SAndroid Build Coastguard Worker             __GET_IMAGE_INFO_ERR);
4512*61046927SAndroid Build Coastguard Worker     }
4513*61046927SAndroid Build Coastguard Worker 
4514*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetImageInfo() that returns by value.
4515*61046927SAndroid Build Coastguard Worker     template <cl_image_info name> typename
4516*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_image_info, name>::param_type
getImageInfo(cl_int * err=NULL) const4517*61046927SAndroid Build Coastguard Worker     getImageInfo(cl_int* err = NULL) const
4518*61046927SAndroid Build Coastguard Worker     {
4519*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
4520*61046927SAndroid Build Coastguard Worker             detail::cl_image_info, name>::param_type param;
4521*61046927SAndroid Build Coastguard Worker         cl_int result = getImageInfo(name, &param);
4522*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4523*61046927SAndroid Build Coastguard Worker             *err = result;
4524*61046927SAndroid Build Coastguard Worker         }
4525*61046927SAndroid Build Coastguard Worker         return param;
4526*61046927SAndroid Build Coastguard Worker     }
4527*61046927SAndroid Build Coastguard Worker };
4528*61046927SAndroid Build Coastguard Worker 
4529*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
4530*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for 1D Image Memory objects.
4531*61046927SAndroid Build Coastguard Worker  *
4532*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4533*61046927SAndroid Build Coastguard Worker  *
4534*61046927SAndroid Build Coastguard Worker  *  \see Memory
4535*61046927SAndroid Build Coastguard Worker  */
4536*61046927SAndroid Build Coastguard Worker class Image1D : public Image
4537*61046927SAndroid Build Coastguard Worker {
4538*61046927SAndroid Build Coastguard Worker public:
4539*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 1D Image in a specified context.
4540*61046927SAndroid Build Coastguard Worker      *
4541*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateImage().
4542*61046927SAndroid Build Coastguard Worker      */
Image1D(const Context & context,cl_mem_flags flags,ImageFormat format,size_type width,void * host_ptr=NULL,cl_int * err=NULL)4543*61046927SAndroid Build Coastguard Worker     Image1D(
4544*61046927SAndroid Build Coastguard Worker         const Context& context,
4545*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4546*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4547*61046927SAndroid Build Coastguard Worker         size_type width,
4548*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
4549*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4550*61046927SAndroid Build Coastguard Worker     {
4551*61046927SAndroid Build Coastguard Worker         cl_int error;
4552*61046927SAndroid Build Coastguard Worker 
4553*61046927SAndroid Build Coastguard Worker         cl_image_desc desc = {0};
4554*61046927SAndroid Build Coastguard Worker         desc.image_type = CL_MEM_OBJECT_IMAGE1D;
4555*61046927SAndroid Build Coastguard Worker         desc.image_width = width;
4556*61046927SAndroid Build Coastguard Worker 
4557*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
4558*61046927SAndroid Build Coastguard Worker             context(),
4559*61046927SAndroid Build Coastguard Worker             flags,
4560*61046927SAndroid Build Coastguard Worker             &format,
4561*61046927SAndroid Build Coastguard Worker             &desc,
4562*61046927SAndroid Build Coastguard Worker             host_ptr,
4563*61046927SAndroid Build Coastguard Worker             &error);
4564*61046927SAndroid Build Coastguard Worker 
4565*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
4566*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4567*61046927SAndroid Build Coastguard Worker             *err = error;
4568*61046927SAndroid Build Coastguard Worker         }
4569*61046927SAndroid Build Coastguard Worker     }
4570*61046927SAndroid Build Coastguard Worker 
4571*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image1D()4572*61046927SAndroid Build Coastguard Worker     Image1D() { }
4573*61046927SAndroid Build Coastguard Worker 
4574*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4575*61046927SAndroid Build Coastguard Worker      *
4576*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4577*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4578*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4579*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4580*61046927SAndroid Build Coastguard Worker      */
Image1D(const cl_mem & image1D,bool retainObject=false)4581*61046927SAndroid Build Coastguard Worker     explicit Image1D(const cl_mem& image1D, bool retainObject = false) :
4582*61046927SAndroid Build Coastguard Worker         Image(image1D, retainObject) { }
4583*61046927SAndroid Build Coastguard Worker 
4584*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4585*61046927SAndroid Build Coastguard Worker      *
4586*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4587*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4588*61046927SAndroid Build Coastguard Worker     Image1D& operator = (const cl_mem& rhs)
4589*61046927SAndroid Build Coastguard Worker     {
4590*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4591*61046927SAndroid Build Coastguard Worker         return *this;
4592*61046927SAndroid Build Coastguard Worker     }
4593*61046927SAndroid Build Coastguard Worker 
4594*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4595*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4596*61046927SAndroid Build Coastguard Worker      */
Image1D(const Image1D & img)4597*61046927SAndroid Build Coastguard Worker     Image1D(const Image1D& img) : Image(img) {}
4598*61046927SAndroid Build Coastguard Worker 
4599*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4600*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4601*61046927SAndroid Build Coastguard Worker      */
operator =(const Image1D & img)4602*61046927SAndroid Build Coastguard Worker     Image1D& operator = (const Image1D &img)
4603*61046927SAndroid Build Coastguard Worker     {
4604*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4605*61046927SAndroid Build Coastguard Worker         return *this;
4606*61046927SAndroid Build Coastguard Worker     }
4607*61046927SAndroid Build Coastguard Worker 
4608*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4609*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4610*61046927SAndroid Build Coastguard Worker      */
Image1D(Image1D && img)4611*61046927SAndroid Build Coastguard Worker     Image1D(Image1D&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
4612*61046927SAndroid Build Coastguard Worker 
4613*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4614*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4615*61046927SAndroid Build Coastguard Worker      */
operator =(Image1D && img)4616*61046927SAndroid Build Coastguard Worker     Image1D& operator = (Image1D &&img)
4617*61046927SAndroid Build Coastguard Worker     {
4618*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4619*61046927SAndroid Build Coastguard Worker         return *this;
4620*61046927SAndroid Build Coastguard Worker     }
4621*61046927SAndroid Build Coastguard Worker 
4622*61046927SAndroid Build Coastguard Worker };
4623*61046927SAndroid Build Coastguard Worker 
4624*61046927SAndroid Build Coastguard Worker /*! \class Image1DBuffer
4625*61046927SAndroid Build Coastguard Worker  * \brief Image interface for 1D buffer images.
4626*61046927SAndroid Build Coastguard Worker  */
4627*61046927SAndroid Build Coastguard Worker class Image1DBuffer : public Image
4628*61046927SAndroid Build Coastguard Worker {
4629*61046927SAndroid Build Coastguard Worker public:
Image1DBuffer(const Context & context,cl_mem_flags flags,ImageFormat format,size_type width,const Buffer & buffer,cl_int * err=NULL)4630*61046927SAndroid Build Coastguard Worker     Image1DBuffer(
4631*61046927SAndroid Build Coastguard Worker         const Context& context,
4632*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4633*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4634*61046927SAndroid Build Coastguard Worker         size_type width,
4635*61046927SAndroid Build Coastguard Worker         const Buffer &buffer,
4636*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4637*61046927SAndroid Build Coastguard Worker     {
4638*61046927SAndroid Build Coastguard Worker         cl_int error;
4639*61046927SAndroid Build Coastguard Worker 
4640*61046927SAndroid Build Coastguard Worker         cl_image_desc desc = {0};
4641*61046927SAndroid Build Coastguard Worker         desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
4642*61046927SAndroid Build Coastguard Worker         desc.image_width = width;
4643*61046927SAndroid Build Coastguard Worker         desc.buffer = buffer();
4644*61046927SAndroid Build Coastguard Worker 
4645*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
4646*61046927SAndroid Build Coastguard Worker             context(),
4647*61046927SAndroid Build Coastguard Worker             flags,
4648*61046927SAndroid Build Coastguard Worker             &format,
4649*61046927SAndroid Build Coastguard Worker             &desc,
4650*61046927SAndroid Build Coastguard Worker             NULL,
4651*61046927SAndroid Build Coastguard Worker             &error);
4652*61046927SAndroid Build Coastguard Worker 
4653*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
4654*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4655*61046927SAndroid Build Coastguard Worker             *err = error;
4656*61046927SAndroid Build Coastguard Worker         }
4657*61046927SAndroid Build Coastguard Worker     }
4658*61046927SAndroid Build Coastguard Worker 
Image1DBuffer()4659*61046927SAndroid Build Coastguard Worker     Image1DBuffer() { }
4660*61046927SAndroid Build Coastguard Worker 
4661*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4662*61046927SAndroid Build Coastguard Worker      *
4663*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4664*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4665*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4666*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4667*61046927SAndroid Build Coastguard Worker      */
Image1DBuffer(const cl_mem & image1D,bool retainObject=false)4668*61046927SAndroid Build Coastguard Worker     explicit Image1DBuffer(const cl_mem& image1D, bool retainObject = false) :
4669*61046927SAndroid Build Coastguard Worker         Image(image1D, retainObject) { }
4670*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)4671*61046927SAndroid Build Coastguard Worker     Image1DBuffer& operator = (const cl_mem& rhs)
4672*61046927SAndroid Build Coastguard Worker     {
4673*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4674*61046927SAndroid Build Coastguard Worker         return *this;
4675*61046927SAndroid Build Coastguard Worker     }
4676*61046927SAndroid Build Coastguard Worker 
4677*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4678*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4679*61046927SAndroid Build Coastguard Worker      */
Image1DBuffer(const Image1DBuffer & img)4680*61046927SAndroid Build Coastguard Worker     Image1DBuffer(const Image1DBuffer& img) : Image(img) {}
4681*61046927SAndroid Build Coastguard Worker 
4682*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4683*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4684*61046927SAndroid Build Coastguard Worker      */
operator =(const Image1DBuffer & img)4685*61046927SAndroid Build Coastguard Worker     Image1DBuffer& operator = (const Image1DBuffer &img)
4686*61046927SAndroid Build Coastguard Worker     {
4687*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4688*61046927SAndroid Build Coastguard Worker         return *this;
4689*61046927SAndroid Build Coastguard Worker     }
4690*61046927SAndroid Build Coastguard Worker 
4691*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4692*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4693*61046927SAndroid Build Coastguard Worker      */
Image1DBuffer(Image1DBuffer && img)4694*61046927SAndroid Build Coastguard Worker     Image1DBuffer(Image1DBuffer&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
4695*61046927SAndroid Build Coastguard Worker 
4696*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4697*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4698*61046927SAndroid Build Coastguard Worker      */
operator =(Image1DBuffer && img)4699*61046927SAndroid Build Coastguard Worker     Image1DBuffer& operator = (Image1DBuffer &&img)
4700*61046927SAndroid Build Coastguard Worker     {
4701*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4702*61046927SAndroid Build Coastguard Worker         return *this;
4703*61046927SAndroid Build Coastguard Worker     }
4704*61046927SAndroid Build Coastguard Worker 
4705*61046927SAndroid Build Coastguard Worker };
4706*61046927SAndroid Build Coastguard Worker 
4707*61046927SAndroid Build Coastguard Worker /*! \class Image1DArray
4708*61046927SAndroid Build Coastguard Worker  * \brief Image interface for arrays of 1D images.
4709*61046927SAndroid Build Coastguard Worker  */
4710*61046927SAndroid Build Coastguard Worker class Image1DArray : public Image
4711*61046927SAndroid Build Coastguard Worker {
4712*61046927SAndroid Build Coastguard Worker public:
Image1DArray(const Context & context,cl_mem_flags flags,ImageFormat format,size_type arraySize,size_type width,size_type rowPitch,void * host_ptr=NULL,cl_int * err=NULL)4713*61046927SAndroid Build Coastguard Worker     Image1DArray(
4714*61046927SAndroid Build Coastguard Worker         const Context& context,
4715*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4716*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4717*61046927SAndroid Build Coastguard Worker         size_type arraySize,
4718*61046927SAndroid Build Coastguard Worker         size_type width,
4719*61046927SAndroid Build Coastguard Worker         size_type rowPitch,
4720*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
4721*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4722*61046927SAndroid Build Coastguard Worker     {
4723*61046927SAndroid Build Coastguard Worker         cl_int error;
4724*61046927SAndroid Build Coastguard Worker 
4725*61046927SAndroid Build Coastguard Worker         cl_image_desc desc = {0};
4726*61046927SAndroid Build Coastguard Worker         desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY;
4727*61046927SAndroid Build Coastguard Worker         desc.image_width = width;
4728*61046927SAndroid Build Coastguard Worker         desc.image_array_size = arraySize;
4729*61046927SAndroid Build Coastguard Worker         desc.image_row_pitch = rowPitch;
4730*61046927SAndroid Build Coastguard Worker 
4731*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
4732*61046927SAndroid Build Coastguard Worker             context(),
4733*61046927SAndroid Build Coastguard Worker             flags,
4734*61046927SAndroid Build Coastguard Worker             &format,
4735*61046927SAndroid Build Coastguard Worker             &desc,
4736*61046927SAndroid Build Coastguard Worker             host_ptr,
4737*61046927SAndroid Build Coastguard Worker             &error);
4738*61046927SAndroid Build Coastguard Worker 
4739*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
4740*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
4741*61046927SAndroid Build Coastguard Worker             *err = error;
4742*61046927SAndroid Build Coastguard Worker         }
4743*61046927SAndroid Build Coastguard Worker     }
4744*61046927SAndroid Build Coastguard Worker 
Image1DArray()4745*61046927SAndroid Build Coastguard Worker     Image1DArray() { }
4746*61046927SAndroid Build Coastguard Worker 
4747*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4748*61046927SAndroid Build Coastguard Worker      *
4749*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4750*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4751*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4752*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4753*61046927SAndroid Build Coastguard Worker      */
Image1DArray(const cl_mem & imageArray,bool retainObject=false)4754*61046927SAndroid Build Coastguard Worker     explicit Image1DArray(const cl_mem& imageArray, bool retainObject = false) :
4755*61046927SAndroid Build Coastguard Worker         Image(imageArray, retainObject) { }
4756*61046927SAndroid Build Coastguard Worker 
4757*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)4758*61046927SAndroid Build Coastguard Worker     Image1DArray& operator = (const cl_mem& rhs)
4759*61046927SAndroid Build Coastguard Worker     {
4760*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4761*61046927SAndroid Build Coastguard Worker         return *this;
4762*61046927SAndroid Build Coastguard Worker     }
4763*61046927SAndroid Build Coastguard Worker 
4764*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4765*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4766*61046927SAndroid Build Coastguard Worker      */
Image1DArray(const Image1DArray & img)4767*61046927SAndroid Build Coastguard Worker     Image1DArray(const Image1DArray& img) : Image(img) {}
4768*61046927SAndroid Build Coastguard Worker 
4769*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
4770*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4771*61046927SAndroid Build Coastguard Worker      */
operator =(const Image1DArray & img)4772*61046927SAndroid Build Coastguard Worker     Image1DArray& operator = (const Image1DArray &img)
4773*61046927SAndroid Build Coastguard Worker     {
4774*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
4775*61046927SAndroid Build Coastguard Worker         return *this;
4776*61046927SAndroid Build Coastguard Worker     }
4777*61046927SAndroid Build Coastguard Worker 
4778*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
4779*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4780*61046927SAndroid Build Coastguard Worker      */
Image1DArray(Image1DArray && img)4781*61046927SAndroid Build Coastguard Worker     Image1DArray(Image1DArray&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
4782*61046927SAndroid Build Coastguard Worker 
4783*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
4784*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4785*61046927SAndroid Build Coastguard Worker      */
operator =(Image1DArray && img)4786*61046927SAndroid Build Coastguard Worker     Image1DArray& operator = (Image1DArray &&img)
4787*61046927SAndroid Build Coastguard Worker     {
4788*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
4789*61046927SAndroid Build Coastguard Worker         return *this;
4790*61046927SAndroid Build Coastguard Worker     }
4791*61046927SAndroid Build Coastguard Worker 
4792*61046927SAndroid Build Coastguard Worker };
4793*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 120
4794*61046927SAndroid Build Coastguard Worker 
4795*61046927SAndroid Build Coastguard Worker 
4796*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for 2D Image Memory objects.
4797*61046927SAndroid Build Coastguard Worker  *
4798*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
4799*61046927SAndroid Build Coastguard Worker  *
4800*61046927SAndroid Build Coastguard Worker  *  \see Memory
4801*61046927SAndroid Build Coastguard Worker  */
4802*61046927SAndroid Build Coastguard Worker class Image2D : public Image
4803*61046927SAndroid Build Coastguard Worker {
4804*61046927SAndroid Build Coastguard Worker public:
4805*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 2D Image in a specified context.
4806*61046927SAndroid Build Coastguard Worker      *
4807*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateImage().
4808*61046927SAndroid Build Coastguard Worker      */
Image2D(const Context & context,cl_mem_flags flags,ImageFormat format,size_type width,size_type height,size_type row_pitch=0,void * host_ptr=NULL,cl_int * err=NULL)4809*61046927SAndroid Build Coastguard Worker     Image2D(
4810*61046927SAndroid Build Coastguard Worker         const Context& context,
4811*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
4812*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4813*61046927SAndroid Build Coastguard Worker         size_type width,
4814*61046927SAndroid Build Coastguard Worker         size_type height,
4815*61046927SAndroid Build Coastguard Worker         size_type row_pitch = 0,
4816*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
4817*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
4818*61046927SAndroid Build Coastguard Worker     {
4819*61046927SAndroid Build Coastguard Worker         cl_int error;
4820*61046927SAndroid Build Coastguard Worker         bool useCreateImage;
4821*61046927SAndroid Build Coastguard Worker 
4822*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120 && CL_HPP_MINIMUM_OPENCL_VERSION < 120
4823*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
4824*61046927SAndroid Build Coastguard Worker         {
4825*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
4826*61046927SAndroid Build Coastguard Worker             useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
4827*61046927SAndroid Build Coastguard Worker         }
4828*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 120
4829*61046927SAndroid Build Coastguard Worker         useCreateImage = true;
4830*61046927SAndroid Build Coastguard Worker #else
4831*61046927SAndroid Build Coastguard Worker         useCreateImage = false;
4832*61046927SAndroid Build Coastguard Worker #endif
4833*61046927SAndroid Build Coastguard Worker 
4834*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
4835*61046927SAndroid Build Coastguard Worker         if (useCreateImage)
4836*61046927SAndroid Build Coastguard Worker         {
4837*61046927SAndroid Build Coastguard Worker             cl_image_desc desc = {0};
4838*61046927SAndroid Build Coastguard Worker             desc.image_type = CL_MEM_OBJECT_IMAGE2D;
4839*61046927SAndroid Build Coastguard Worker             desc.image_width = width;
4840*61046927SAndroid Build Coastguard Worker             desc.image_height = height;
4841*61046927SAndroid Build Coastguard Worker             desc.image_row_pitch = row_pitch;
4842*61046927SAndroid Build Coastguard Worker 
4843*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage(
4844*61046927SAndroid Build Coastguard Worker                 context(),
4845*61046927SAndroid Build Coastguard Worker                 flags,
4846*61046927SAndroid Build Coastguard Worker                 &format,
4847*61046927SAndroid Build Coastguard Worker                 &desc,
4848*61046927SAndroid Build Coastguard Worker                 host_ptr,
4849*61046927SAndroid Build Coastguard Worker                 &error);
4850*61046927SAndroid Build Coastguard Worker 
4851*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE_ERR);
4852*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
4853*61046927SAndroid Build Coastguard Worker                 *err = error;
4854*61046927SAndroid Build Coastguard Worker             }
4855*61046927SAndroid Build Coastguard Worker         }
4856*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
4857*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 120
4858*61046927SAndroid Build Coastguard Worker         if (!useCreateImage)
4859*61046927SAndroid Build Coastguard Worker         {
4860*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage2D(
4861*61046927SAndroid Build Coastguard Worker                 context(), flags,&format, width, height, row_pitch, host_ptr, &error);
4862*61046927SAndroid Build Coastguard Worker 
4863*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE2D_ERR);
4864*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
4865*61046927SAndroid Build Coastguard Worker                 *err = error;
4866*61046927SAndroid Build Coastguard Worker             }
4867*61046927SAndroid Build Coastguard Worker         }
4868*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 120
4869*61046927SAndroid Build Coastguard Worker     }
4870*61046927SAndroid Build Coastguard Worker 
4871*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 || defined(CL_HPP_USE_CL_IMAGE2D_FROM_BUFFER_KHR)
4872*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 2D Image from a buffer.
4873*61046927SAndroid Build Coastguard Worker     * \note This will share storage with the underlying buffer.
4874*61046927SAndroid Build Coastguard Worker     *
4875*61046927SAndroid Build Coastguard Worker     *  Wraps clCreateImage().
4876*61046927SAndroid Build Coastguard Worker     */
Image2D(const Context & context,ImageFormat format,const Buffer & sourceBuffer,size_type width,size_type height,size_type row_pitch=0,cl_int * err=nullptr)4877*61046927SAndroid Build Coastguard Worker     Image2D(
4878*61046927SAndroid Build Coastguard Worker         const Context& context,
4879*61046927SAndroid Build Coastguard Worker         ImageFormat format,
4880*61046927SAndroid Build Coastguard Worker         const Buffer &sourceBuffer,
4881*61046927SAndroid Build Coastguard Worker         size_type width,
4882*61046927SAndroid Build Coastguard Worker         size_type height,
4883*61046927SAndroid Build Coastguard Worker         size_type row_pitch = 0,
4884*61046927SAndroid Build Coastguard Worker         cl_int* err = nullptr)
4885*61046927SAndroid Build Coastguard Worker     {
4886*61046927SAndroid Build Coastguard Worker         cl_int error;
4887*61046927SAndroid Build Coastguard Worker 
4888*61046927SAndroid Build Coastguard Worker         cl_image_desc desc = {0};
4889*61046927SAndroid Build Coastguard Worker         desc.image_type = CL_MEM_OBJECT_IMAGE2D;
4890*61046927SAndroid Build Coastguard Worker         desc.image_width = width;
4891*61046927SAndroid Build Coastguard Worker         desc.image_height = height;
4892*61046927SAndroid Build Coastguard Worker         desc.image_row_pitch = row_pitch;
4893*61046927SAndroid Build Coastguard Worker         desc.buffer = sourceBuffer();
4894*61046927SAndroid Build Coastguard Worker 
4895*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
4896*61046927SAndroid Build Coastguard Worker             context(),
4897*61046927SAndroid Build Coastguard Worker             0, // flags inherited from buffer
4898*61046927SAndroid Build Coastguard Worker             &format,
4899*61046927SAndroid Build Coastguard Worker             &desc,
4900*61046927SAndroid Build Coastguard Worker             nullptr,
4901*61046927SAndroid Build Coastguard Worker             &error);
4902*61046927SAndroid Build Coastguard Worker 
4903*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
4904*61046927SAndroid Build Coastguard Worker         if (err != nullptr) {
4905*61046927SAndroid Build Coastguard Worker             *err = error;
4906*61046927SAndroid Build Coastguard Worker         }
4907*61046927SAndroid Build Coastguard Worker     }
4908*61046927SAndroid Build Coastguard Worker #endif //#if CL_HPP_TARGET_OPENCL_VERSION >= 200 || defined(CL_HPP_USE_CL_IMAGE2D_FROM_BUFFER_KHR)
4909*61046927SAndroid Build Coastguard Worker 
4910*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
4911*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 2D Image from an image.
4912*61046927SAndroid Build Coastguard Worker     * \note This will share storage with the underlying image but may
4913*61046927SAndroid Build Coastguard Worker     *       reinterpret the channel order and type.
4914*61046927SAndroid Build Coastguard Worker     *
4915*61046927SAndroid Build Coastguard Worker     * The image will be created matching with a descriptor matching the source.
4916*61046927SAndroid Build Coastguard Worker     *
4917*61046927SAndroid Build Coastguard Worker     * \param order is the channel order to reinterpret the image data as.
4918*61046927SAndroid Build Coastguard Worker     *              The channel order may differ as described in the OpenCL
4919*61046927SAndroid Build Coastguard Worker     *              2.0 API specification.
4920*61046927SAndroid Build Coastguard Worker     *
4921*61046927SAndroid Build Coastguard Worker     * Wraps clCreateImage().
4922*61046927SAndroid Build Coastguard Worker     */
Image2D(const Context & context,cl_channel_order order,const Image & sourceImage,cl_int * err=nullptr)4923*61046927SAndroid Build Coastguard Worker     Image2D(
4924*61046927SAndroid Build Coastguard Worker         const Context& context,
4925*61046927SAndroid Build Coastguard Worker         cl_channel_order order,
4926*61046927SAndroid Build Coastguard Worker         const Image &sourceImage,
4927*61046927SAndroid Build Coastguard Worker         cl_int* err = nullptr)
4928*61046927SAndroid Build Coastguard Worker     {
4929*61046927SAndroid Build Coastguard Worker         cl_int error;
4930*61046927SAndroid Build Coastguard Worker 
4931*61046927SAndroid Build Coastguard Worker         // Descriptor fields have to match source image
4932*61046927SAndroid Build Coastguard Worker         size_type sourceWidth =
4933*61046927SAndroid Build Coastguard Worker             sourceImage.getImageInfo<CL_IMAGE_WIDTH>();
4934*61046927SAndroid Build Coastguard Worker         size_type sourceHeight =
4935*61046927SAndroid Build Coastguard Worker             sourceImage.getImageInfo<CL_IMAGE_HEIGHT>();
4936*61046927SAndroid Build Coastguard Worker         size_type sourceRowPitch =
4937*61046927SAndroid Build Coastguard Worker             sourceImage.getImageInfo<CL_IMAGE_ROW_PITCH>();
4938*61046927SAndroid Build Coastguard Worker         cl_uint sourceNumMIPLevels =
4939*61046927SAndroid Build Coastguard Worker             sourceImage.getImageInfo<CL_IMAGE_NUM_MIP_LEVELS>();
4940*61046927SAndroid Build Coastguard Worker         cl_uint sourceNumSamples =
4941*61046927SAndroid Build Coastguard Worker             sourceImage.getImageInfo<CL_IMAGE_NUM_SAMPLES>();
4942*61046927SAndroid Build Coastguard Worker         cl_image_format sourceFormat =
4943*61046927SAndroid Build Coastguard Worker             sourceImage.getImageInfo<CL_IMAGE_FORMAT>();
4944*61046927SAndroid Build Coastguard Worker 
4945*61046927SAndroid Build Coastguard Worker         // Update only the channel order.
4946*61046927SAndroid Build Coastguard Worker         // Channel format inherited from source.
4947*61046927SAndroid Build Coastguard Worker         sourceFormat.image_channel_order = order;
4948*61046927SAndroid Build Coastguard Worker 
4949*61046927SAndroid Build Coastguard Worker         cl_image_desc desc = {0};
4950*61046927SAndroid Build Coastguard Worker         desc.image_type = CL_MEM_OBJECT_IMAGE2D;
4951*61046927SAndroid Build Coastguard Worker         desc.image_width = sourceWidth;
4952*61046927SAndroid Build Coastguard Worker         desc.image_height = sourceHeight;
4953*61046927SAndroid Build Coastguard Worker         desc.image_row_pitch = sourceRowPitch;
4954*61046927SAndroid Build Coastguard Worker         desc.num_mip_levels = sourceNumMIPLevels;
4955*61046927SAndroid Build Coastguard Worker         desc.num_samples = sourceNumSamples;
4956*61046927SAndroid Build Coastguard Worker         desc.buffer = sourceImage();
4957*61046927SAndroid Build Coastguard Worker 
4958*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
4959*61046927SAndroid Build Coastguard Worker             context(),
4960*61046927SAndroid Build Coastguard Worker             0, // flags should be inherited from mem_object
4961*61046927SAndroid Build Coastguard Worker             &sourceFormat,
4962*61046927SAndroid Build Coastguard Worker             &desc,
4963*61046927SAndroid Build Coastguard Worker             nullptr,
4964*61046927SAndroid Build Coastguard Worker             &error);
4965*61046927SAndroid Build Coastguard Worker 
4966*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
4967*61046927SAndroid Build Coastguard Worker         if (err != nullptr) {
4968*61046927SAndroid Build Coastguard Worker             *err = error;
4969*61046927SAndroid Build Coastguard Worker         }
4970*61046927SAndroid Build Coastguard Worker     }
4971*61046927SAndroid Build Coastguard Worker #endif //#if CL_HPP_TARGET_OPENCL_VERSION >= 200
4972*61046927SAndroid Build Coastguard Worker 
4973*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image2D()4974*61046927SAndroid Build Coastguard Worker     Image2D() { }
4975*61046927SAndroid Build Coastguard Worker 
4976*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
4977*61046927SAndroid Build Coastguard Worker      *
4978*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
4979*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
4980*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
4981*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4982*61046927SAndroid Build Coastguard Worker      */
Image2D(const cl_mem & image2D,bool retainObject=false)4983*61046927SAndroid Build Coastguard Worker     explicit Image2D(const cl_mem& image2D, bool retainObject = false) :
4984*61046927SAndroid Build Coastguard Worker         Image(image2D, retainObject) { }
4985*61046927SAndroid Build Coastguard Worker 
4986*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
4987*61046927SAndroid Build Coastguard Worker      *
4988*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
4989*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)4990*61046927SAndroid Build Coastguard Worker     Image2D& operator = (const cl_mem& rhs)
4991*61046927SAndroid Build Coastguard Worker     {
4992*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
4993*61046927SAndroid Build Coastguard Worker         return *this;
4994*61046927SAndroid Build Coastguard Worker     }
4995*61046927SAndroid Build Coastguard Worker 
4996*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
4997*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
4998*61046927SAndroid Build Coastguard Worker      */
Image2D(const Image2D & img)4999*61046927SAndroid Build Coastguard Worker     Image2D(const Image2D& img) : Image(img) {}
5000*61046927SAndroid Build Coastguard Worker 
5001*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5002*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5003*61046927SAndroid Build Coastguard Worker      */
operator =(const Image2D & img)5004*61046927SAndroid Build Coastguard Worker     Image2D& operator = (const Image2D &img)
5005*61046927SAndroid Build Coastguard Worker     {
5006*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
5007*61046927SAndroid Build Coastguard Worker         return *this;
5008*61046927SAndroid Build Coastguard Worker     }
5009*61046927SAndroid Build Coastguard Worker 
5010*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5011*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5012*61046927SAndroid Build Coastguard Worker      */
Image2D(Image2D && img)5013*61046927SAndroid Build Coastguard Worker     Image2D(Image2D&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
5014*61046927SAndroid Build Coastguard Worker 
5015*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5016*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5017*61046927SAndroid Build Coastguard Worker      */
operator =(Image2D && img)5018*61046927SAndroid Build Coastguard Worker     Image2D& operator = (Image2D &&img)
5019*61046927SAndroid Build Coastguard Worker     {
5020*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
5021*61046927SAndroid Build Coastguard Worker         return *this;
5022*61046927SAndroid Build Coastguard Worker     }
5023*61046927SAndroid Build Coastguard Worker 
5024*61046927SAndroid Build Coastguard Worker };
5025*61046927SAndroid Build Coastguard Worker 
5026*61046927SAndroid Build Coastguard Worker 
5027*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
5028*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL 2D Image Memory objects.
5029*61046927SAndroid Build Coastguard Worker  *
5030*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
5031*61046927SAndroid Build Coastguard Worker  *
5032*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
5033*61046927SAndroid Build Coastguard Worker  *
5034*61046927SAndroid Build Coastguard Worker  *  \see Memory
5035*61046927SAndroid Build Coastguard Worker  *  \note Deprecated for OpenCL 1.2. Please use ImageGL instead.
5036*61046927SAndroid Build Coastguard Worker  */
5037*61046927SAndroid Build Coastguard Worker class CL_API_PREFIX__VERSION_1_1_DEPRECATED Image2DGL : public Image2D
5038*61046927SAndroid Build Coastguard Worker {
5039*61046927SAndroid Build Coastguard Worker public:
5040*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs an Image2DGL in a specified context, from a given
5041*61046927SAndroid Build Coastguard Worker      *         GL Texture.
5042*61046927SAndroid Build Coastguard Worker      *
5043*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLTexture2D().
5044*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)5045*61046927SAndroid Build Coastguard Worker     Image2DGL(
5046*61046927SAndroid Build Coastguard Worker         const Context& context,
5047*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
5048*61046927SAndroid Build Coastguard Worker         cl_GLenum target,
5049*61046927SAndroid Build Coastguard Worker         cl_GLint  miplevel,
5050*61046927SAndroid Build Coastguard Worker         cl_GLuint texobj,
5051*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
5052*61046927SAndroid Build Coastguard Worker     {
5053*61046927SAndroid Build Coastguard Worker         cl_int error;
5054*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLTexture2D(
5055*61046927SAndroid Build Coastguard Worker             context(),
5056*61046927SAndroid Build Coastguard Worker             flags,
5057*61046927SAndroid Build Coastguard Worker             target,
5058*61046927SAndroid Build Coastguard Worker             miplevel,
5059*61046927SAndroid Build Coastguard Worker             texobj,
5060*61046927SAndroid Build Coastguard Worker             &error);
5061*61046927SAndroid Build Coastguard Worker 
5062*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR);
5063*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5064*61046927SAndroid Build Coastguard Worker             *err = error;
5065*61046927SAndroid Build Coastguard Worker         }
5066*61046927SAndroid Build Coastguard Worker 
5067*61046927SAndroid Build Coastguard Worker     }
5068*61046927SAndroid Build Coastguard Worker 
5069*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image2DGL()5070*61046927SAndroid Build Coastguard Worker     Image2DGL() : Image2D() { }
5071*61046927SAndroid Build Coastguard Worker 
5072*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
5073*61046927SAndroid Build Coastguard Worker      *
5074*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5075*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5076*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5077*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5078*61046927SAndroid Build Coastguard Worker      */
Image2DGL(const cl_mem & image,bool retainObject=false)5079*61046927SAndroid Build Coastguard Worker     explicit Image2DGL(const cl_mem& image, bool retainObject = false) :
5080*61046927SAndroid Build Coastguard Worker         Image2D(image, retainObject) { }
5081*61046927SAndroid Build Coastguard Worker 
5082*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
5083*61046927SAndroid Build Coastguard Worker      *c
5084*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5085*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)5086*61046927SAndroid Build Coastguard Worker     Image2DGL& operator = (const cl_mem& rhs)
5087*61046927SAndroid Build Coastguard Worker     {
5088*61046927SAndroid Build Coastguard Worker         Image2D::operator=(rhs);
5089*61046927SAndroid Build Coastguard Worker         return *this;
5090*61046927SAndroid Build Coastguard Worker     }
5091*61046927SAndroid Build Coastguard Worker 
5092*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5093*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5094*61046927SAndroid Build Coastguard Worker      */
Image2DGL(const Image2DGL & img)5095*61046927SAndroid Build Coastguard Worker     Image2DGL(const Image2DGL& img) : Image2D(img) {}
5096*61046927SAndroid Build Coastguard Worker 
5097*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5098*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5099*61046927SAndroid Build Coastguard Worker      */
operator =(const Image2DGL & img)5100*61046927SAndroid Build Coastguard Worker     Image2DGL& operator = (const Image2DGL &img)
5101*61046927SAndroid Build Coastguard Worker     {
5102*61046927SAndroid Build Coastguard Worker         Image2D::operator=(img);
5103*61046927SAndroid Build Coastguard Worker         return *this;
5104*61046927SAndroid Build Coastguard Worker     }
5105*61046927SAndroid Build Coastguard Worker 
5106*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5107*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5108*61046927SAndroid Build Coastguard Worker      */
Image2DGL(Image2DGL && img)5109*61046927SAndroid Build Coastguard Worker     Image2DGL(Image2DGL&& img) CL_HPP_NOEXCEPT_ : Image2D(std::move(img)) {}
5110*61046927SAndroid Build Coastguard Worker 
5111*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5112*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5113*61046927SAndroid Build Coastguard Worker      */
operator =(Image2DGL && img)5114*61046927SAndroid Build Coastguard Worker     Image2DGL& operator = (Image2DGL &&img)
5115*61046927SAndroid Build Coastguard Worker     {
5116*61046927SAndroid Build Coastguard Worker         Image2D::operator=(std::move(img));
5117*61046927SAndroid Build Coastguard Worker         return *this;
5118*61046927SAndroid Build Coastguard Worker     }
5119*61046927SAndroid Build Coastguard Worker 
5120*61046927SAndroid Build Coastguard Worker } CL_API_SUFFIX__VERSION_1_1_DEPRECATED;
5121*61046927SAndroid Build Coastguard Worker #endif // CL_USE_DEPRECATED_OPENCL_1_1_APIS
5122*61046927SAndroid Build Coastguard Worker 
5123*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
5124*61046927SAndroid Build Coastguard Worker /*! \class Image2DArray
5125*61046927SAndroid Build Coastguard Worker  * \brief Image interface for arrays of 2D images.
5126*61046927SAndroid Build Coastguard Worker  */
5127*61046927SAndroid Build Coastguard Worker class Image2DArray : public Image
5128*61046927SAndroid Build Coastguard Worker {
5129*61046927SAndroid Build Coastguard Worker public:
Image2DArray(const Context & context,cl_mem_flags flags,ImageFormat format,size_type arraySize,size_type width,size_type height,size_type rowPitch,size_type slicePitch,void * host_ptr=NULL,cl_int * err=NULL)5130*61046927SAndroid Build Coastguard Worker     Image2DArray(
5131*61046927SAndroid Build Coastguard Worker         const Context& context,
5132*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
5133*61046927SAndroid Build Coastguard Worker         ImageFormat format,
5134*61046927SAndroid Build Coastguard Worker         size_type arraySize,
5135*61046927SAndroid Build Coastguard Worker         size_type width,
5136*61046927SAndroid Build Coastguard Worker         size_type height,
5137*61046927SAndroid Build Coastguard Worker         size_type rowPitch,
5138*61046927SAndroid Build Coastguard Worker         size_type slicePitch,
5139*61046927SAndroid Build Coastguard Worker         void* host_ptr = 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         cl_image_desc desc = {0};
5145*61046927SAndroid Build Coastguard Worker         desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY;
5146*61046927SAndroid Build Coastguard Worker         desc.image_width = width;
5147*61046927SAndroid Build Coastguard Worker         desc.image_height = height;
5148*61046927SAndroid Build Coastguard Worker         desc.image_array_size = arraySize;
5149*61046927SAndroid Build Coastguard Worker         desc.image_row_pitch = rowPitch;
5150*61046927SAndroid Build Coastguard Worker         desc.image_slice_pitch = slicePitch;
5151*61046927SAndroid Build Coastguard Worker 
5152*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateImage(
5153*61046927SAndroid Build Coastguard Worker             context(),
5154*61046927SAndroid Build Coastguard Worker             flags,
5155*61046927SAndroid Build Coastguard Worker             &format,
5156*61046927SAndroid Build Coastguard Worker             &desc,
5157*61046927SAndroid Build Coastguard Worker             host_ptr,
5158*61046927SAndroid Build Coastguard Worker             &error);
5159*61046927SAndroid Build Coastguard Worker 
5160*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_IMAGE_ERR);
5161*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5162*61046927SAndroid Build Coastguard Worker             *err = error;
5163*61046927SAndroid Build Coastguard Worker         }
5164*61046927SAndroid Build Coastguard Worker     }
5165*61046927SAndroid Build Coastguard Worker 
Image2DArray()5166*61046927SAndroid Build Coastguard Worker     Image2DArray() { }
5167*61046927SAndroid Build Coastguard Worker 
5168*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
5169*61046927SAndroid Build Coastguard Worker      *
5170*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5171*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5172*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5173*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5174*61046927SAndroid Build Coastguard Worker      */
Image2DArray(const cl_mem & imageArray,bool retainObject=false)5175*61046927SAndroid Build Coastguard Worker     explicit Image2DArray(const cl_mem& imageArray, bool retainObject = false) : Image(imageArray, retainObject) { }
5176*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)5177*61046927SAndroid Build Coastguard Worker     Image2DArray& operator = (const cl_mem& rhs)
5178*61046927SAndroid Build Coastguard Worker     {
5179*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
5180*61046927SAndroid Build Coastguard Worker         return *this;
5181*61046927SAndroid Build Coastguard Worker     }
5182*61046927SAndroid Build Coastguard Worker 
5183*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5184*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5185*61046927SAndroid Build Coastguard Worker      */
Image2DArray(const Image2DArray & img)5186*61046927SAndroid Build Coastguard Worker     Image2DArray(const Image2DArray& img) : Image(img) {}
5187*61046927SAndroid Build Coastguard Worker 
5188*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5189*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5190*61046927SAndroid Build Coastguard Worker      */
operator =(const Image2DArray & img)5191*61046927SAndroid Build Coastguard Worker     Image2DArray& operator = (const Image2DArray &img)
5192*61046927SAndroid Build Coastguard Worker     {
5193*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
5194*61046927SAndroid Build Coastguard Worker         return *this;
5195*61046927SAndroid Build Coastguard Worker     }
5196*61046927SAndroid Build Coastguard Worker 
5197*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5198*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5199*61046927SAndroid Build Coastguard Worker      */
Image2DArray(Image2DArray && img)5200*61046927SAndroid Build Coastguard Worker     Image2DArray(Image2DArray&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
5201*61046927SAndroid Build Coastguard Worker 
5202*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5203*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5204*61046927SAndroid Build Coastguard Worker      */
operator =(Image2DArray && img)5205*61046927SAndroid Build Coastguard Worker     Image2DArray& operator = (Image2DArray &&img)
5206*61046927SAndroid Build Coastguard Worker     {
5207*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
5208*61046927SAndroid Build Coastguard Worker         return *this;
5209*61046927SAndroid Build Coastguard Worker     }
5210*61046927SAndroid Build Coastguard Worker };
5211*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 120
5212*61046927SAndroid Build Coastguard Worker 
5213*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for 3D Image Memory objects.
5214*61046927SAndroid Build Coastguard Worker  *
5215*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
5216*61046927SAndroid Build Coastguard Worker  *
5217*61046927SAndroid Build Coastguard Worker  *  \see Memory
5218*61046927SAndroid Build Coastguard Worker  */
5219*61046927SAndroid Build Coastguard Worker class Image3D : public Image
5220*61046927SAndroid Build Coastguard Worker {
5221*61046927SAndroid Build Coastguard Worker public:
5222*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a 3D Image in a specified context.
5223*61046927SAndroid Build Coastguard Worker      *
5224*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateImage().
5225*61046927SAndroid Build Coastguard Worker      */
Image3D(const Context & context,cl_mem_flags flags,ImageFormat format,size_type width,size_type height,size_type depth,size_type row_pitch=0,size_type slice_pitch=0,void * host_ptr=NULL,cl_int * err=NULL)5226*61046927SAndroid Build Coastguard Worker     Image3D(
5227*61046927SAndroid Build Coastguard Worker         const Context& context,
5228*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
5229*61046927SAndroid Build Coastguard Worker         ImageFormat format,
5230*61046927SAndroid Build Coastguard Worker         size_type width,
5231*61046927SAndroid Build Coastguard Worker         size_type height,
5232*61046927SAndroid Build Coastguard Worker         size_type depth,
5233*61046927SAndroid Build Coastguard Worker         size_type row_pitch = 0,
5234*61046927SAndroid Build Coastguard Worker         size_type slice_pitch = 0,
5235*61046927SAndroid Build Coastguard Worker         void* host_ptr = NULL,
5236*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5237*61046927SAndroid Build Coastguard Worker     {
5238*61046927SAndroid Build Coastguard Worker         cl_int error;
5239*61046927SAndroid Build Coastguard Worker         bool useCreateImage;
5240*61046927SAndroid Build Coastguard Worker 
5241*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120 && CL_HPP_MINIMUM_OPENCL_VERSION < 120
5242*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
5243*61046927SAndroid Build Coastguard Worker         {
5244*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
5245*61046927SAndroid Build Coastguard Worker             useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
5246*61046927SAndroid Build Coastguard Worker         }
5247*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 120
5248*61046927SAndroid Build Coastguard Worker         useCreateImage = true;
5249*61046927SAndroid Build Coastguard Worker #else
5250*61046927SAndroid Build Coastguard Worker         useCreateImage = false;
5251*61046927SAndroid Build Coastguard Worker #endif
5252*61046927SAndroid Build Coastguard Worker 
5253*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
5254*61046927SAndroid Build Coastguard Worker         if (useCreateImage)
5255*61046927SAndroid Build Coastguard Worker         {
5256*61046927SAndroid Build Coastguard Worker             cl_image_desc desc = {0};
5257*61046927SAndroid Build Coastguard Worker             desc.image_type = CL_MEM_OBJECT_IMAGE3D;
5258*61046927SAndroid Build Coastguard Worker             desc.image_width = width;
5259*61046927SAndroid Build Coastguard Worker             desc.image_height = height;
5260*61046927SAndroid Build Coastguard Worker             desc.image_depth = depth;
5261*61046927SAndroid Build Coastguard Worker             desc.image_row_pitch = row_pitch;
5262*61046927SAndroid Build Coastguard Worker             desc.image_slice_pitch = slice_pitch;
5263*61046927SAndroid Build Coastguard Worker 
5264*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage(
5265*61046927SAndroid Build Coastguard Worker                 context(),
5266*61046927SAndroid Build Coastguard Worker                 flags,
5267*61046927SAndroid Build Coastguard Worker                 &format,
5268*61046927SAndroid Build Coastguard Worker                 &desc,
5269*61046927SAndroid Build Coastguard Worker                 host_ptr,
5270*61046927SAndroid Build Coastguard Worker                 &error);
5271*61046927SAndroid Build Coastguard Worker 
5272*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE_ERR);
5273*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5274*61046927SAndroid Build Coastguard Worker                 *err = error;
5275*61046927SAndroid Build Coastguard Worker             }
5276*61046927SAndroid Build Coastguard Worker         }
5277*61046927SAndroid Build Coastguard Worker #endif  // CL_HPP_TARGET_OPENCL_VERSION >= 120
5278*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 120
5279*61046927SAndroid Build Coastguard Worker         if (!useCreateImage)
5280*61046927SAndroid Build Coastguard Worker         {
5281*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateImage3D(
5282*61046927SAndroid Build Coastguard Worker                 context(), flags, &format, width, height, depth, row_pitch,
5283*61046927SAndroid Build Coastguard Worker                 slice_pitch, host_ptr, &error);
5284*61046927SAndroid Build Coastguard Worker 
5285*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_IMAGE3D_ERR);
5286*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
5287*61046927SAndroid Build Coastguard Worker                 *err = error;
5288*61046927SAndroid Build Coastguard Worker             }
5289*61046927SAndroid Build Coastguard Worker         }
5290*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 120
5291*61046927SAndroid Build Coastguard Worker     }
5292*61046927SAndroid Build Coastguard Worker 
5293*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image3D()5294*61046927SAndroid Build Coastguard Worker     Image3D() : Image() { }
5295*61046927SAndroid Build Coastguard Worker 
5296*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
5297*61046927SAndroid Build Coastguard Worker      *
5298*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5299*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5300*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5301*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5302*61046927SAndroid Build Coastguard Worker      */
Image3D(const cl_mem & image3D,bool retainObject=false)5303*61046927SAndroid Build Coastguard Worker     explicit Image3D(const cl_mem& image3D, bool retainObject = false) :
5304*61046927SAndroid Build Coastguard Worker         Image(image3D, retainObject) { }
5305*61046927SAndroid Build Coastguard Worker 
5306*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
5307*61046927SAndroid Build Coastguard Worker      *
5308*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5309*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)5310*61046927SAndroid Build Coastguard Worker     Image3D& operator = (const cl_mem& rhs)
5311*61046927SAndroid Build Coastguard Worker     {
5312*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
5313*61046927SAndroid Build Coastguard Worker         return *this;
5314*61046927SAndroid Build Coastguard Worker     }
5315*61046927SAndroid Build Coastguard Worker 
5316*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5317*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5318*61046927SAndroid Build Coastguard Worker      */
Image3D(const Image3D & img)5319*61046927SAndroid Build Coastguard Worker     Image3D(const Image3D& img) : Image(img) {}
5320*61046927SAndroid Build Coastguard Worker 
5321*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5322*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5323*61046927SAndroid Build Coastguard Worker      */
operator =(const Image3D & img)5324*61046927SAndroid Build Coastguard Worker     Image3D& operator = (const Image3D &img)
5325*61046927SAndroid Build Coastguard Worker     {
5326*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
5327*61046927SAndroid Build Coastguard Worker         return *this;
5328*61046927SAndroid Build Coastguard Worker     }
5329*61046927SAndroid Build Coastguard Worker 
5330*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5331*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5332*61046927SAndroid Build Coastguard Worker      */
Image3D(Image3D && img)5333*61046927SAndroid Build Coastguard Worker     Image3D(Image3D&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
5334*61046927SAndroid Build Coastguard Worker 
5335*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5336*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5337*61046927SAndroid Build Coastguard Worker      */
operator =(Image3D && img)5338*61046927SAndroid Build Coastguard Worker     Image3D& operator = (Image3D &&img)
5339*61046927SAndroid Build Coastguard Worker     {
5340*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
5341*61046927SAndroid Build Coastguard Worker         return *this;
5342*61046927SAndroid Build Coastguard Worker     }
5343*61046927SAndroid Build Coastguard Worker };
5344*61046927SAndroid Build Coastguard Worker 
5345*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
5346*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for GL 3D Image Memory objects.
5347*61046927SAndroid Build Coastguard Worker  *
5348*61046927SAndroid Build Coastguard Worker  *  This is provided to facilitate interoperability with OpenGL.
5349*61046927SAndroid Build Coastguard Worker  *
5350*61046927SAndroid Build Coastguard Worker  *  See Memory for details about copy semantics, etc.
5351*61046927SAndroid Build Coastguard Worker  *
5352*61046927SAndroid Build Coastguard Worker  *  \see Memory
5353*61046927SAndroid Build Coastguard Worker  */
5354*61046927SAndroid Build Coastguard Worker class Image3DGL : public Image3D
5355*61046927SAndroid Build Coastguard Worker {
5356*61046927SAndroid Build Coastguard Worker public:
5357*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs an Image3DGL in a specified context, from a given
5358*61046927SAndroid Build Coastguard Worker      *         GL Texture.
5359*61046927SAndroid Build Coastguard Worker      *
5360*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateFromGLTexture3D().
5361*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)5362*61046927SAndroid Build Coastguard Worker     Image3DGL(
5363*61046927SAndroid Build Coastguard Worker         const Context& context,
5364*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
5365*61046927SAndroid Build Coastguard Worker         cl_GLenum target,
5366*61046927SAndroid Build Coastguard Worker         cl_GLint  miplevel,
5367*61046927SAndroid Build Coastguard Worker         cl_GLuint texobj,
5368*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
5369*61046927SAndroid Build Coastguard Worker     {
5370*61046927SAndroid Build Coastguard Worker         cl_int error;
5371*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLTexture3D(
5372*61046927SAndroid Build Coastguard Worker             context(),
5373*61046927SAndroid Build Coastguard Worker             flags,
5374*61046927SAndroid Build Coastguard Worker             target,
5375*61046927SAndroid Build Coastguard Worker             miplevel,
5376*61046927SAndroid Build Coastguard Worker             texobj,
5377*61046927SAndroid Build Coastguard Worker             &error);
5378*61046927SAndroid Build Coastguard Worker 
5379*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR);
5380*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5381*61046927SAndroid Build Coastguard Worker             *err = error;
5382*61046927SAndroid Build Coastguard Worker         }
5383*61046927SAndroid Build Coastguard Worker     }
5384*61046927SAndroid Build Coastguard Worker 
5385*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Image3DGL()5386*61046927SAndroid Build Coastguard Worker     Image3DGL() : Image3D() { }
5387*61046927SAndroid Build Coastguard Worker 
5388*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
5389*61046927SAndroid Build Coastguard Worker      *
5390*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5391*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5392*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5393*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5394*61046927SAndroid Build Coastguard Worker      */
Image3DGL(const cl_mem & image,bool retainObject=false)5395*61046927SAndroid Build Coastguard Worker     explicit Image3DGL(const cl_mem& image, bool retainObject = false) :
5396*61046927SAndroid Build Coastguard Worker         Image3D(image, retainObject) { }
5397*61046927SAndroid Build Coastguard Worker 
5398*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
5399*61046927SAndroid Build Coastguard Worker      *
5400*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5401*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)5402*61046927SAndroid Build Coastguard Worker     Image3DGL& operator = (const cl_mem& rhs)
5403*61046927SAndroid Build Coastguard Worker     {
5404*61046927SAndroid Build Coastguard Worker         Image3D::operator=(rhs);
5405*61046927SAndroid Build Coastguard Worker         return *this;
5406*61046927SAndroid Build Coastguard Worker     }
5407*61046927SAndroid Build Coastguard Worker 
5408*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5409*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5410*61046927SAndroid Build Coastguard Worker      */
Image3DGL(const Image3DGL & img)5411*61046927SAndroid Build Coastguard Worker     Image3DGL(const Image3DGL& img) : Image3D(img) {}
5412*61046927SAndroid Build Coastguard Worker 
5413*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5414*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5415*61046927SAndroid Build Coastguard Worker      */
operator =(const Image3DGL & img)5416*61046927SAndroid Build Coastguard Worker     Image3DGL& operator = (const Image3DGL &img)
5417*61046927SAndroid Build Coastguard Worker     {
5418*61046927SAndroid Build Coastguard Worker         Image3D::operator=(img);
5419*61046927SAndroid Build Coastguard Worker         return *this;
5420*61046927SAndroid Build Coastguard Worker     }
5421*61046927SAndroid Build Coastguard Worker 
5422*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5423*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5424*61046927SAndroid Build Coastguard Worker      */
Image3DGL(Image3DGL && img)5425*61046927SAndroid Build Coastguard Worker     Image3DGL(Image3DGL&& img) CL_HPP_NOEXCEPT_ : Image3D(std::move(img)) {}
5426*61046927SAndroid Build Coastguard Worker 
5427*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5428*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5429*61046927SAndroid Build Coastguard Worker      */
operator =(Image3DGL && img)5430*61046927SAndroid Build Coastguard Worker     Image3DGL& operator = (Image3DGL &&img)
5431*61046927SAndroid Build Coastguard Worker     {
5432*61046927SAndroid Build Coastguard Worker         Image3D::operator=(std::move(img));
5433*61046927SAndroid Build Coastguard Worker         return *this;
5434*61046927SAndroid Build Coastguard Worker     }
5435*61046927SAndroid Build Coastguard Worker };
5436*61046927SAndroid Build Coastguard Worker #endif // CL_USE_DEPRECATED_OPENCL_1_1_APIS
5437*61046927SAndroid Build Coastguard Worker 
5438*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
5439*61046927SAndroid Build Coastguard Worker /*! \class ImageGL
5440*61046927SAndroid Build Coastguard Worker  * \brief general image interface for GL interop.
5441*61046927SAndroid Build Coastguard Worker  * We abstract the 2D and 3D GL images into a single instance here
5442*61046927SAndroid Build Coastguard Worker  * that wraps all GL sourced images on the grounds that setup information
5443*61046927SAndroid Build Coastguard Worker  * was performed by OpenCL anyway.
5444*61046927SAndroid Build Coastguard Worker  */
5445*61046927SAndroid Build Coastguard Worker class ImageGL : public Image
5446*61046927SAndroid Build Coastguard Worker {
5447*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)5448*61046927SAndroid Build Coastguard Worker     ImageGL(
5449*61046927SAndroid Build Coastguard Worker         const Context& context,
5450*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags,
5451*61046927SAndroid Build Coastguard Worker         cl_GLenum target,
5452*61046927SAndroid Build Coastguard Worker         cl_GLint  miplevel,
5453*61046927SAndroid Build Coastguard Worker         cl_GLuint texobj,
5454*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL)
5455*61046927SAndroid Build Coastguard Worker     {
5456*61046927SAndroid Build Coastguard Worker         cl_int error;
5457*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateFromGLTexture(
5458*61046927SAndroid Build Coastguard Worker             context(),
5459*61046927SAndroid Build Coastguard Worker             flags,
5460*61046927SAndroid Build Coastguard Worker             target,
5461*61046927SAndroid Build Coastguard Worker             miplevel,
5462*61046927SAndroid Build Coastguard Worker             texobj,
5463*61046927SAndroid Build Coastguard Worker             &error);
5464*61046927SAndroid Build Coastguard Worker 
5465*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_GL_TEXTURE_ERR);
5466*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5467*61046927SAndroid Build Coastguard Worker             *err = error;
5468*61046927SAndroid Build Coastguard Worker         }
5469*61046927SAndroid Build Coastguard Worker     }
5470*61046927SAndroid Build Coastguard Worker 
ImageGL()5471*61046927SAndroid Build Coastguard Worker     ImageGL() : Image() { }
5472*61046927SAndroid Build Coastguard Worker 
5473*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
5474*61046927SAndroid Build Coastguard Worker      *
5475*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5476*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5477*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5478*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5479*61046927SAndroid Build Coastguard Worker      */
ImageGL(const cl_mem & image,bool retainObject=false)5480*61046927SAndroid Build Coastguard Worker     explicit ImageGL(const cl_mem& image, bool retainObject = false) :
5481*61046927SAndroid Build Coastguard Worker         Image(image, retainObject) { }
5482*61046927SAndroid Build Coastguard Worker 
operator =(const cl_mem & rhs)5483*61046927SAndroid Build Coastguard Worker     ImageGL& operator = (const cl_mem& rhs)
5484*61046927SAndroid Build Coastguard Worker     {
5485*61046927SAndroid Build Coastguard Worker         Image::operator=(rhs);
5486*61046927SAndroid Build Coastguard Worker         return *this;
5487*61046927SAndroid Build Coastguard Worker     }
5488*61046927SAndroid Build Coastguard Worker 
5489*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5490*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5491*61046927SAndroid Build Coastguard Worker      */
ImageGL(const ImageGL & img)5492*61046927SAndroid Build Coastguard Worker     ImageGL(const ImageGL& img) : Image(img) {}
5493*61046927SAndroid Build Coastguard Worker 
5494*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5495*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5496*61046927SAndroid Build Coastguard Worker      */
operator =(const ImageGL & img)5497*61046927SAndroid Build Coastguard Worker     ImageGL& operator = (const ImageGL &img)
5498*61046927SAndroid Build Coastguard Worker     {
5499*61046927SAndroid Build Coastguard Worker         Image::operator=(img);
5500*61046927SAndroid Build Coastguard Worker         return *this;
5501*61046927SAndroid Build Coastguard Worker     }
5502*61046927SAndroid Build Coastguard Worker 
5503*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5504*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5505*61046927SAndroid Build Coastguard Worker      */
ImageGL(ImageGL && img)5506*61046927SAndroid Build Coastguard Worker     ImageGL(ImageGL&& img) CL_HPP_NOEXCEPT_ : Image(std::move(img)) {}
5507*61046927SAndroid Build Coastguard Worker 
5508*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5509*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5510*61046927SAndroid Build Coastguard Worker      */
operator =(ImageGL && img)5511*61046927SAndroid Build Coastguard Worker     ImageGL& operator = (ImageGL &&img)
5512*61046927SAndroid Build Coastguard Worker     {
5513*61046927SAndroid Build Coastguard Worker         Image::operator=(std::move(img));
5514*61046927SAndroid Build Coastguard Worker         return *this;
5515*61046927SAndroid Build Coastguard Worker     }
5516*61046927SAndroid Build Coastguard Worker };
5517*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
5518*61046927SAndroid Build Coastguard Worker 
5519*61046927SAndroid Build Coastguard Worker 
5520*61046927SAndroid Build Coastguard Worker 
5521*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
5522*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for Pipe Memory Objects.
5523*61046927SAndroid Build Coastguard Worker *
5524*61046927SAndroid Build Coastguard Worker *  See Memory for details about copy semantics, etc.
5525*61046927SAndroid Build Coastguard Worker *
5526*61046927SAndroid Build Coastguard Worker *  \see Memory
5527*61046927SAndroid Build Coastguard Worker */
5528*61046927SAndroid Build Coastguard Worker class Pipe : public Memory
5529*61046927SAndroid Build Coastguard Worker {
5530*61046927SAndroid Build Coastguard Worker public:
5531*61046927SAndroid Build Coastguard Worker 
5532*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Pipe in a specified context.
5533*61046927SAndroid Build Coastguard Worker      *
5534*61046927SAndroid Build Coastguard Worker      * Wraps clCreatePipe().
5535*61046927SAndroid Build Coastguard Worker      * @param context Context in which to create the pipe.
5536*61046927SAndroid Build Coastguard Worker      * @param flags Bitfield. Only CL_MEM_READ_WRITE and CL_MEM_HOST_NO_ACCESS are valid.
5537*61046927SAndroid Build Coastguard Worker      * @param packet_size Size in bytes of a single packet of the pipe.
5538*61046927SAndroid Build Coastguard Worker      * @param max_packets Number of packets that may be stored in the pipe.
5539*61046927SAndroid Build Coastguard Worker      *
5540*61046927SAndroid Build Coastguard Worker      */
Pipe(const Context & context,cl_uint packet_size,cl_uint max_packets,cl_int * err=NULL)5541*61046927SAndroid Build Coastguard Worker     Pipe(
5542*61046927SAndroid Build Coastguard Worker         const Context& context,
5543*61046927SAndroid Build Coastguard Worker         cl_uint packet_size,
5544*61046927SAndroid Build Coastguard Worker         cl_uint max_packets,
5545*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5546*61046927SAndroid Build Coastguard Worker     {
5547*61046927SAndroid Build Coastguard Worker         cl_int error;
5548*61046927SAndroid Build Coastguard Worker 
5549*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags = CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS;
5550*61046927SAndroid Build Coastguard Worker         object_ = ::clCreatePipe(context(), flags, packet_size, max_packets, nullptr, &error);
5551*61046927SAndroid Build Coastguard Worker 
5552*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PIPE_ERR);
5553*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5554*61046927SAndroid Build Coastguard Worker             *err = error;
5555*61046927SAndroid Build Coastguard Worker         }
5556*61046927SAndroid Build Coastguard Worker     }
5557*61046927SAndroid Build Coastguard Worker 
5558*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Pipe in a the default context.
5559*61046927SAndroid Build Coastguard Worker      *
5560*61046927SAndroid Build Coastguard Worker      * Wraps clCreatePipe().
5561*61046927SAndroid Build Coastguard Worker      * @param flags Bitfield. Only CL_MEM_READ_WRITE and CL_MEM_HOST_NO_ACCESS are valid.
5562*61046927SAndroid Build Coastguard Worker      * @param packet_size Size in bytes of a single packet of the pipe.
5563*61046927SAndroid Build Coastguard Worker      * @param max_packets Number of packets that may be stored in the pipe.
5564*61046927SAndroid Build Coastguard Worker      *
5565*61046927SAndroid Build Coastguard Worker      */
Pipe(cl_uint packet_size,cl_uint max_packets,cl_int * err=NULL)5566*61046927SAndroid Build Coastguard Worker     Pipe(
5567*61046927SAndroid Build Coastguard Worker         cl_uint packet_size,
5568*61046927SAndroid Build Coastguard Worker         cl_uint max_packets,
5569*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5570*61046927SAndroid Build Coastguard Worker     {
5571*61046927SAndroid Build Coastguard Worker         cl_int error;
5572*61046927SAndroid Build Coastguard Worker 
5573*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
5574*61046927SAndroid Build Coastguard Worker 
5575*61046927SAndroid Build Coastguard Worker         cl_mem_flags flags = CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS;
5576*61046927SAndroid Build Coastguard Worker         object_ = ::clCreatePipe(context(), flags, packet_size, max_packets, nullptr, &error);
5577*61046927SAndroid Build Coastguard Worker 
5578*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PIPE_ERR);
5579*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5580*61046927SAndroid Build Coastguard Worker             *err = error;
5581*61046927SAndroid Build Coastguard Worker         }
5582*61046927SAndroid Build Coastguard Worker     }
5583*61046927SAndroid Build Coastguard Worker 
5584*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Pipe()5585*61046927SAndroid Build Coastguard Worker     Pipe() : Memory() { }
5586*61046927SAndroid Build Coastguard Worker 
5587*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_mem - takes ownership.
5588*61046927SAndroid Build Coastguard Worker      *
5589*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5590*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with earlier versions.
5591*61046927SAndroid Build Coastguard Worker      *
5592*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5593*61046927SAndroid Build Coastguard Worker      */
Pipe(const cl_mem & pipe,bool retainObject=false)5594*61046927SAndroid Build Coastguard Worker     explicit Pipe(const cl_mem& pipe, bool retainObject = false) :
5595*61046927SAndroid Build Coastguard Worker         Memory(pipe, retainObject) { }
5596*61046927SAndroid Build Coastguard Worker 
5597*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment from cl_mem - performs shallow copy.
5598*61046927SAndroid Build Coastguard Worker      *
5599*61046927SAndroid Build Coastguard Worker      *  See Memory for further details.
5600*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_mem & rhs)5601*61046927SAndroid Build Coastguard Worker     Pipe& operator = (const cl_mem& rhs)
5602*61046927SAndroid Build Coastguard Worker     {
5603*61046927SAndroid Build Coastguard Worker         Memory::operator=(rhs);
5604*61046927SAndroid Build Coastguard Worker         return *this;
5605*61046927SAndroid Build Coastguard Worker     }
5606*61046927SAndroid Build Coastguard Worker 
5607*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5608*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5609*61046927SAndroid Build Coastguard Worker      */
Pipe(const Pipe & pipe)5610*61046927SAndroid Build Coastguard Worker     Pipe(const Pipe& pipe) : Memory(pipe) {}
5611*61046927SAndroid Build Coastguard Worker 
5612*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5613*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5614*61046927SAndroid Build Coastguard Worker      */
operator =(const Pipe & pipe)5615*61046927SAndroid Build Coastguard Worker     Pipe& operator = (const Pipe &pipe)
5616*61046927SAndroid Build Coastguard Worker     {
5617*61046927SAndroid Build Coastguard Worker         Memory::operator=(pipe);
5618*61046927SAndroid Build Coastguard Worker         return *this;
5619*61046927SAndroid Build Coastguard Worker     }
5620*61046927SAndroid Build Coastguard Worker 
5621*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5622*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5623*61046927SAndroid Build Coastguard Worker      */
Pipe(Pipe && pipe)5624*61046927SAndroid Build Coastguard Worker     Pipe(Pipe&& pipe) CL_HPP_NOEXCEPT_ : Memory(std::move(pipe)) {}
5625*61046927SAndroid Build Coastguard Worker 
5626*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5627*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5628*61046927SAndroid Build Coastguard Worker      */
operator =(Pipe && pipe)5629*61046927SAndroid Build Coastguard Worker     Pipe& operator = (Pipe &&pipe)
5630*61046927SAndroid Build Coastguard Worker     {
5631*61046927SAndroid Build Coastguard Worker         Memory::operator=(std::move(pipe));
5632*61046927SAndroid Build Coastguard Worker         return *this;
5633*61046927SAndroid Build Coastguard Worker     }
5634*61046927SAndroid Build Coastguard Worker 
5635*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetMemObjectInfo().
5636*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_pipe_info name,T * param) const5637*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_pipe_info name, T* param) const
5638*61046927SAndroid Build Coastguard Worker     {
5639*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5640*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetPipeInfo, object_, name, param),
5641*61046927SAndroid Build Coastguard Worker             __GET_PIPE_INFO_ERR);
5642*61046927SAndroid Build Coastguard Worker     }
5643*61046927SAndroid Build Coastguard Worker 
5644*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetMemObjectInfo() that returns by value.
5645*61046927SAndroid Build Coastguard Worker     template <cl_pipe_info name> typename
5646*61046927SAndroid Build Coastguard Worker         detail::param_traits<detail::cl_pipe_info, name>::param_type
getInfo(cl_int * err=NULL) const5647*61046927SAndroid Build Coastguard Worker         getInfo(cl_int* err = NULL) const
5648*61046927SAndroid Build Coastguard Worker     {
5649*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
5650*61046927SAndroid Build Coastguard Worker             detail::cl_pipe_info, name>::param_type param;
5651*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
5652*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5653*61046927SAndroid Build Coastguard Worker             *err = result;
5654*61046927SAndroid Build Coastguard Worker         }
5655*61046927SAndroid Build Coastguard Worker         return param;
5656*61046927SAndroid Build Coastguard Worker     }
5657*61046927SAndroid Build Coastguard Worker }; // class Pipe
5658*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
5659*61046927SAndroid Build Coastguard Worker 
5660*61046927SAndroid Build Coastguard Worker 
5661*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_sampler.
5662*61046927SAndroid Build Coastguard Worker  *
5663*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
5664*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_sampler as the original.  For details, see
5665*61046927SAndroid Build Coastguard Worker  *        clRetainSampler() and clReleaseSampler().
5666*61046927SAndroid Build Coastguard Worker  *
5667*61046927SAndroid Build Coastguard Worker  *  \see cl_sampler
5668*61046927SAndroid Build Coastguard Worker  */
5669*61046927SAndroid Build Coastguard Worker class Sampler : public detail::Wrapper<cl_sampler>
5670*61046927SAndroid Build Coastguard Worker {
5671*61046927SAndroid Build Coastguard Worker public:
5672*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Sampler()5673*61046927SAndroid Build Coastguard Worker     Sampler() { }
5674*61046927SAndroid Build Coastguard Worker 
5675*61046927SAndroid Build Coastguard Worker     /*! \brief Constructs a Sampler in a specified context.
5676*61046927SAndroid Build Coastguard Worker      *
5677*61046927SAndroid Build Coastguard Worker      *  Wraps clCreateSampler().
5678*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)5679*61046927SAndroid Build Coastguard Worker     Sampler(
5680*61046927SAndroid Build Coastguard Worker         const Context& context,
5681*61046927SAndroid Build Coastguard Worker         cl_bool normalized_coords,
5682*61046927SAndroid Build Coastguard Worker         cl_addressing_mode addressing_mode,
5683*61046927SAndroid Build Coastguard Worker         cl_filter_mode filter_mode,
5684*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
5685*61046927SAndroid Build Coastguard Worker     {
5686*61046927SAndroid Build Coastguard Worker         cl_int error;
5687*61046927SAndroid Build Coastguard Worker 
5688*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
5689*61046927SAndroid Build Coastguard Worker         cl_sampler_properties sampler_properties[] = {
5690*61046927SAndroid Build Coastguard Worker             CL_SAMPLER_NORMALIZED_COORDS, normalized_coords,
5691*61046927SAndroid Build Coastguard Worker             CL_SAMPLER_ADDRESSING_MODE, addressing_mode,
5692*61046927SAndroid Build Coastguard Worker             CL_SAMPLER_FILTER_MODE, filter_mode,
5693*61046927SAndroid Build Coastguard Worker             0 };
5694*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateSamplerWithProperties(
5695*61046927SAndroid Build Coastguard Worker             context(),
5696*61046927SAndroid Build Coastguard Worker             sampler_properties,
5697*61046927SAndroid Build Coastguard Worker             &error);
5698*61046927SAndroid Build Coastguard Worker 
5699*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_SAMPLER_WITH_PROPERTIES_ERR);
5700*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5701*61046927SAndroid Build Coastguard Worker             *err = error;
5702*61046927SAndroid Build Coastguard Worker         }
5703*61046927SAndroid Build Coastguard Worker #else
5704*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateSampler(
5705*61046927SAndroid Build Coastguard Worker             context(),
5706*61046927SAndroid Build Coastguard Worker             normalized_coords,
5707*61046927SAndroid Build Coastguard Worker             addressing_mode,
5708*61046927SAndroid Build Coastguard Worker             filter_mode,
5709*61046927SAndroid Build Coastguard Worker             &error);
5710*61046927SAndroid Build Coastguard Worker 
5711*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_SAMPLER_ERR);
5712*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5713*61046927SAndroid Build Coastguard Worker             *err = error;
5714*61046927SAndroid Build Coastguard Worker         }
5715*61046927SAndroid Build Coastguard Worker #endif
5716*61046927SAndroid Build Coastguard Worker     }
5717*61046927SAndroid Build Coastguard Worker 
5718*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_sampler - takes ownership.
5719*61046927SAndroid Build Coastguard Worker      *
5720*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5721*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5722*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5723*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_sampler
5724*61046927SAndroid Build Coastguard Worker      *  into the new Sampler object.
5725*61046927SAndroid Build Coastguard Worker      */
Sampler(const cl_sampler & sampler,bool retainObject=false)5726*61046927SAndroid Build Coastguard Worker     explicit Sampler(const cl_sampler& sampler, bool retainObject = false) :
5727*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(sampler, retainObject) { }
5728*61046927SAndroid Build Coastguard Worker 
5729*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_sampler - takes ownership.
5730*61046927SAndroid Build Coastguard Worker      *
5731*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
5732*61046927SAndroid Build Coastguard Worker      *  clReleaseSampler() on the value previously held by this instance.
5733*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_sampler & rhs)5734*61046927SAndroid Build Coastguard Worker     Sampler& operator = (const cl_sampler& rhs)
5735*61046927SAndroid Build Coastguard Worker     {
5736*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
5737*61046927SAndroid Build Coastguard Worker         return *this;
5738*61046927SAndroid Build Coastguard Worker     }
5739*61046927SAndroid Build Coastguard Worker 
5740*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5741*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5742*61046927SAndroid Build Coastguard Worker      */
Sampler(const Sampler & sam)5743*61046927SAndroid Build Coastguard Worker     Sampler(const Sampler& sam) : detail::Wrapper<cl_type>(sam) {}
5744*61046927SAndroid Build Coastguard Worker 
5745*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5746*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5747*61046927SAndroid Build Coastguard Worker      */
operator =(const Sampler & sam)5748*61046927SAndroid Build Coastguard Worker     Sampler& operator = (const Sampler &sam)
5749*61046927SAndroid Build Coastguard Worker     {
5750*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(sam);
5751*61046927SAndroid Build Coastguard Worker         return *this;
5752*61046927SAndroid Build Coastguard Worker     }
5753*61046927SAndroid Build Coastguard Worker 
5754*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5755*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5756*61046927SAndroid Build Coastguard Worker      */
Sampler(Sampler && sam)5757*61046927SAndroid Build Coastguard Worker     Sampler(Sampler&& sam) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(sam)) {}
5758*61046927SAndroid Build Coastguard Worker 
5759*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5760*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5761*61046927SAndroid Build Coastguard Worker      */
operator =(Sampler && sam)5762*61046927SAndroid Build Coastguard Worker     Sampler& operator = (Sampler &&sam)
5763*61046927SAndroid Build Coastguard Worker     {
5764*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(sam));
5765*61046927SAndroid Build Coastguard Worker         return *this;
5766*61046927SAndroid Build Coastguard Worker     }
5767*61046927SAndroid Build Coastguard Worker 
5768*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetSamplerInfo().
5769*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_sampler_info name,T * param) const5770*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_sampler_info name, T* param) const
5771*61046927SAndroid Build Coastguard Worker     {
5772*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5773*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetSamplerInfo, object_, name, param),
5774*61046927SAndroid Build Coastguard Worker             __GET_SAMPLER_INFO_ERR);
5775*61046927SAndroid Build Coastguard Worker     }
5776*61046927SAndroid Build Coastguard Worker 
5777*61046927SAndroid Build Coastguard Worker     //! \brief Wrapper for clGetSamplerInfo() that returns by value.
5778*61046927SAndroid Build Coastguard Worker     template <cl_sampler_info name> typename
5779*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_sampler_info, name>::param_type
getInfo(cl_int * err=NULL) const5780*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
5781*61046927SAndroid Build Coastguard Worker     {
5782*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
5783*61046927SAndroid Build Coastguard Worker             detail::cl_sampler_info, name>::param_type param;
5784*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
5785*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
5786*61046927SAndroid Build Coastguard Worker             *err = result;
5787*61046927SAndroid Build Coastguard Worker         }
5788*61046927SAndroid Build Coastguard Worker         return param;
5789*61046927SAndroid Build Coastguard Worker     }
5790*61046927SAndroid Build Coastguard Worker };
5791*61046927SAndroid Build Coastguard Worker 
5792*61046927SAndroid Build Coastguard Worker class Program;
5793*61046927SAndroid Build Coastguard Worker class CommandQueue;
5794*61046927SAndroid Build Coastguard Worker class DeviceCommandQueue;
5795*61046927SAndroid Build Coastguard Worker class Kernel;
5796*61046927SAndroid Build Coastguard Worker 
5797*61046927SAndroid Build Coastguard Worker //! \brief Class interface for specifying NDRange values.
5798*61046927SAndroid Build Coastguard Worker class NDRange
5799*61046927SAndroid Build Coastguard Worker {
5800*61046927SAndroid Build Coastguard Worker private:
5801*61046927SAndroid Build Coastguard Worker     size_type sizes_[3];
5802*61046927SAndroid Build Coastguard Worker     cl_uint dimensions_;
5803*61046927SAndroid Build Coastguard Worker 
5804*61046927SAndroid Build Coastguard Worker public:
5805*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - resulting range has zero dimensions.
NDRange()5806*61046927SAndroid Build Coastguard Worker     NDRange()
5807*61046927SAndroid Build Coastguard Worker         : dimensions_(0)
5808*61046927SAndroid Build Coastguard Worker     {
5809*61046927SAndroid Build Coastguard Worker         sizes_[0] = 0;
5810*61046927SAndroid Build Coastguard Worker         sizes_[1] = 0;
5811*61046927SAndroid Build Coastguard Worker         sizes_[2] = 0;
5812*61046927SAndroid Build Coastguard Worker     }
5813*61046927SAndroid Build Coastguard Worker 
5814*61046927SAndroid Build Coastguard Worker     //! \brief Constructs one-dimensional range.
NDRange(size_type size0)5815*61046927SAndroid Build Coastguard Worker     NDRange(size_type size0)
5816*61046927SAndroid Build Coastguard Worker         : dimensions_(1)
5817*61046927SAndroid Build Coastguard Worker     {
5818*61046927SAndroid Build Coastguard Worker         sizes_[0] = size0;
5819*61046927SAndroid Build Coastguard Worker         sizes_[1] = 1;
5820*61046927SAndroid Build Coastguard Worker         sizes_[2] = 1;
5821*61046927SAndroid Build Coastguard Worker     }
5822*61046927SAndroid Build Coastguard Worker 
5823*61046927SAndroid Build Coastguard Worker     //! \brief Constructs two-dimensional range.
NDRange(size_type size0,size_type size1)5824*61046927SAndroid Build Coastguard Worker     NDRange(size_type size0, size_type size1)
5825*61046927SAndroid Build Coastguard Worker         : dimensions_(2)
5826*61046927SAndroid Build Coastguard Worker     {
5827*61046927SAndroid Build Coastguard Worker         sizes_[0] = size0;
5828*61046927SAndroid Build Coastguard Worker         sizes_[1] = size1;
5829*61046927SAndroid Build Coastguard Worker         sizes_[2] = 1;
5830*61046927SAndroid Build Coastguard Worker     }
5831*61046927SAndroid Build Coastguard Worker 
5832*61046927SAndroid Build Coastguard Worker     //! \brief Constructs three-dimensional range.
NDRange(size_type size0,size_type size1,size_type size2)5833*61046927SAndroid Build Coastguard Worker     NDRange(size_type size0, size_type size1, size_type size2)
5834*61046927SAndroid Build Coastguard Worker         : dimensions_(3)
5835*61046927SAndroid Build Coastguard Worker     {
5836*61046927SAndroid Build Coastguard Worker         sizes_[0] = size0;
5837*61046927SAndroid Build Coastguard Worker         sizes_[1] = size1;
5838*61046927SAndroid Build Coastguard Worker         sizes_[2] = size2;
5839*61046927SAndroid Build Coastguard Worker     }
5840*61046927SAndroid Build Coastguard Worker 
5841*61046927SAndroid Build Coastguard Worker     /*! \brief Conversion operator to const size_type *.
5842*61046927SAndroid Build Coastguard Worker      *
5843*61046927SAndroid Build Coastguard Worker      *  \returns a pointer to the size of the first dimension.
5844*61046927SAndroid Build Coastguard Worker      */
operator const size_type*() const5845*61046927SAndroid Build Coastguard Worker     operator const size_type*() const {
5846*61046927SAndroid Build Coastguard Worker         return sizes_;
5847*61046927SAndroid Build Coastguard Worker     }
5848*61046927SAndroid Build Coastguard Worker 
5849*61046927SAndroid Build Coastguard Worker     //! \brief Queries the number of dimensions in the range.
dimensions() const5850*61046927SAndroid Build Coastguard Worker     size_type dimensions() const
5851*61046927SAndroid Build Coastguard Worker     {
5852*61046927SAndroid Build Coastguard Worker         return dimensions_;
5853*61046927SAndroid Build Coastguard Worker     }
5854*61046927SAndroid Build Coastguard Worker 
5855*61046927SAndroid Build Coastguard Worker     //! \brief Returns the size of the object in bytes based on the
5856*61046927SAndroid Build Coastguard Worker     // runtime number of dimensions
size() const5857*61046927SAndroid Build Coastguard Worker     size_type size() const
5858*61046927SAndroid Build Coastguard Worker     {
5859*61046927SAndroid Build Coastguard Worker         return dimensions_*sizeof(size_type);
5860*61046927SAndroid Build Coastguard Worker     }
5861*61046927SAndroid Build Coastguard Worker 
get()5862*61046927SAndroid Build Coastguard Worker     size_type* get()
5863*61046927SAndroid Build Coastguard Worker     {
5864*61046927SAndroid Build Coastguard Worker         return sizes_;
5865*61046927SAndroid Build Coastguard Worker     }
5866*61046927SAndroid Build Coastguard Worker 
get() const5867*61046927SAndroid Build Coastguard Worker     const size_type* get() const
5868*61046927SAndroid Build Coastguard Worker     {
5869*61046927SAndroid Build Coastguard Worker         return sizes_;
5870*61046927SAndroid Build Coastguard Worker     }
5871*61046927SAndroid Build Coastguard Worker };
5872*61046927SAndroid Build Coastguard Worker 
5873*61046927SAndroid Build Coastguard Worker //! \brief A zero-dimensional range.
5874*61046927SAndroid Build Coastguard Worker static const NDRange NullRange;
5875*61046927SAndroid Build Coastguard Worker 
5876*61046927SAndroid Build Coastguard Worker //! \brief Local address wrapper for use with Kernel::setArg
5877*61046927SAndroid Build Coastguard Worker struct LocalSpaceArg
5878*61046927SAndroid Build Coastguard Worker {
5879*61046927SAndroid Build Coastguard Worker     size_type size_;
5880*61046927SAndroid Build Coastguard Worker };
5881*61046927SAndroid Build Coastguard Worker 
5882*61046927SAndroid Build Coastguard Worker namespace detail {
5883*61046927SAndroid Build Coastguard Worker 
5884*61046927SAndroid Build Coastguard Worker template <typename T, class Enable = void>
5885*61046927SAndroid Build Coastguard Worker struct KernelArgumentHandler;
5886*61046927SAndroid Build Coastguard Worker 
5887*61046927SAndroid Build Coastguard Worker // Enable for objects that are not subclasses of memory
5888*61046927SAndroid Build Coastguard Worker // Pointers, constants etc
5889*61046927SAndroid Build Coastguard Worker template <typename T>
5890*61046927SAndroid Build Coastguard Worker struct KernelArgumentHandler<T, typename std::enable_if<!std::is_base_of<cl::Memory, T>::value>::type>
5891*61046927SAndroid Build Coastguard Worker {
sizecl::detail::KernelArgumentHandler5892*61046927SAndroid Build Coastguard Worker     static size_type size(const T&) { return sizeof(T); }
ptrcl::detail::KernelArgumentHandler5893*61046927SAndroid Build Coastguard Worker     static const T* ptr(const T& value) { return &value; }
5894*61046927SAndroid Build Coastguard Worker };
5895*61046927SAndroid Build Coastguard Worker 
5896*61046927SAndroid Build Coastguard Worker // Enable for subclasses of memory where we want to get a reference to the cl_mem out
5897*61046927SAndroid Build Coastguard Worker // and pass that in for safety
5898*61046927SAndroid Build Coastguard Worker template <typename T>
5899*61046927SAndroid Build Coastguard Worker struct KernelArgumentHandler<T, typename std::enable_if<std::is_base_of<cl::Memory, T>::value>::type>
5900*61046927SAndroid Build Coastguard Worker {
sizecl::detail::KernelArgumentHandler5901*61046927SAndroid Build Coastguard Worker     static size_type size(const T&) { return sizeof(cl_mem); }
ptrcl::detail::KernelArgumentHandler5902*61046927SAndroid Build Coastguard Worker     static const cl_mem* ptr(const T& value) { return &(value()); }
5903*61046927SAndroid Build Coastguard Worker };
5904*61046927SAndroid Build Coastguard Worker 
5905*61046927SAndroid Build Coastguard Worker // Specialization for DeviceCommandQueue defined later
5906*61046927SAndroid Build Coastguard Worker 
5907*61046927SAndroid Build Coastguard Worker template <>
5908*61046927SAndroid Build Coastguard Worker struct KernelArgumentHandler<LocalSpaceArg, void>
5909*61046927SAndroid Build Coastguard Worker {
sizecl::detail::KernelArgumentHandler5910*61046927SAndroid Build Coastguard Worker     static size_type size(const LocalSpaceArg& value) { return value.size_; }
ptrcl::detail::KernelArgumentHandler5911*61046927SAndroid Build Coastguard Worker     static const void* ptr(const LocalSpaceArg&) { return NULL; }
5912*61046927SAndroid Build Coastguard Worker };
5913*61046927SAndroid Build Coastguard Worker 
5914*61046927SAndroid Build Coastguard Worker }
5915*61046927SAndroid Build Coastguard Worker //! \endcond
5916*61046927SAndroid Build Coastguard Worker 
5917*61046927SAndroid Build Coastguard Worker /*! Local
5918*61046927SAndroid Build Coastguard Worker  * \brief Helper function for generating LocalSpaceArg objects.
5919*61046927SAndroid Build Coastguard Worker  */
5920*61046927SAndroid Build Coastguard Worker inline LocalSpaceArg
Local(size_type size)5921*61046927SAndroid Build Coastguard Worker Local(size_type size)
5922*61046927SAndroid Build Coastguard Worker {
5923*61046927SAndroid Build Coastguard Worker     LocalSpaceArg ret = { size };
5924*61046927SAndroid Build Coastguard Worker     return ret;
5925*61046927SAndroid Build Coastguard Worker }
5926*61046927SAndroid Build Coastguard Worker 
5927*61046927SAndroid Build Coastguard Worker /*! \brief Class interface for cl_kernel.
5928*61046927SAndroid Build Coastguard Worker  *
5929*61046927SAndroid Build Coastguard Worker  *  \note Copies of these objects are shallow, meaning that the copy will refer
5930*61046927SAndroid Build Coastguard Worker  *        to the same underlying cl_kernel as the original.  For details, see
5931*61046927SAndroid Build Coastguard Worker  *        clRetainKernel() and clReleaseKernel().
5932*61046927SAndroid Build Coastguard Worker  *
5933*61046927SAndroid Build Coastguard Worker  *  \see cl_kernel
5934*61046927SAndroid Build Coastguard Worker  */
5935*61046927SAndroid Build Coastguard Worker class Kernel : public detail::Wrapper<cl_kernel>
5936*61046927SAndroid Build Coastguard Worker {
5937*61046927SAndroid Build Coastguard Worker public:
5938*61046927SAndroid Build Coastguard Worker     inline Kernel(const Program& program, const char* name, cl_int* err = NULL);
5939*61046927SAndroid Build Coastguard Worker 
5940*61046927SAndroid Build Coastguard Worker     //! \brief Default constructor - initializes to NULL.
Kernel()5941*61046927SAndroid Build Coastguard Worker     Kernel() { }
5942*61046927SAndroid Build Coastguard Worker 
5943*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_kernel - takes ownership.
5944*61046927SAndroid Build Coastguard Worker      *
5945*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
5946*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
5947*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
5948*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the cl_kernel
5949*61046927SAndroid Build Coastguard Worker      *  into the new Kernel object.
5950*61046927SAndroid Build Coastguard Worker      */
Kernel(const cl_kernel & kernel,bool retainObject=false)5951*61046927SAndroid Build Coastguard Worker     explicit Kernel(const cl_kernel& kernel, bool retainObject = false) :
5952*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(kernel, retainObject) { }
5953*61046927SAndroid Build Coastguard Worker 
5954*61046927SAndroid Build Coastguard Worker     /*! \brief Assignment operator from cl_kernel - takes ownership.
5955*61046927SAndroid Build Coastguard Worker      *
5956*61046927SAndroid Build Coastguard Worker      *  This effectively transfers ownership of a refcount on the rhs and calls
5957*61046927SAndroid Build Coastguard Worker      *  clReleaseKernel() on the value previously held by this instance.
5958*61046927SAndroid Build Coastguard Worker      */
operator =(const cl_kernel & rhs)5959*61046927SAndroid Build Coastguard Worker     Kernel& operator = (const cl_kernel& rhs)
5960*61046927SAndroid Build Coastguard Worker     {
5961*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
5962*61046927SAndroid Build Coastguard Worker         return *this;
5963*61046927SAndroid Build Coastguard Worker     }
5964*61046927SAndroid Build Coastguard Worker 
5965*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
5966*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5967*61046927SAndroid Build Coastguard Worker      */
Kernel(const Kernel & kernel)5968*61046927SAndroid Build Coastguard Worker     Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) {}
5969*61046927SAndroid Build Coastguard Worker 
5970*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
5971*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5972*61046927SAndroid Build Coastguard Worker      */
operator =(const Kernel & kernel)5973*61046927SAndroid Build Coastguard Worker     Kernel& operator = (const Kernel &kernel)
5974*61046927SAndroid Build Coastguard Worker     {
5975*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(kernel);
5976*61046927SAndroid Build Coastguard Worker         return *this;
5977*61046927SAndroid Build Coastguard Worker     }
5978*61046927SAndroid Build Coastguard Worker 
5979*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
5980*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5981*61046927SAndroid Build Coastguard Worker      */
Kernel(Kernel && kernel)5982*61046927SAndroid Build Coastguard Worker     Kernel(Kernel&& kernel) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(kernel)) {}
5983*61046927SAndroid Build Coastguard Worker 
5984*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
5985*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
5986*61046927SAndroid Build Coastguard Worker      */
operator =(Kernel && kernel)5987*61046927SAndroid Build Coastguard Worker     Kernel& operator = (Kernel &&kernel)
5988*61046927SAndroid Build Coastguard Worker     {
5989*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(kernel));
5990*61046927SAndroid Build Coastguard Worker         return *this;
5991*61046927SAndroid Build Coastguard Worker     }
5992*61046927SAndroid Build Coastguard Worker 
5993*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_kernel_info name,T * param) const5994*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_kernel_info name, T* param) const
5995*61046927SAndroid Build Coastguard Worker     {
5996*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
5997*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetKernelInfo, object_, name, param),
5998*61046927SAndroid Build Coastguard Worker             __GET_KERNEL_INFO_ERR);
5999*61046927SAndroid Build Coastguard Worker     }
6000*61046927SAndroid Build Coastguard Worker 
6001*61046927SAndroid Build Coastguard Worker     template <cl_kernel_info name> typename
6002*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_kernel_info, name>::param_type
getInfo(cl_int * err=NULL) const6003*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
6004*61046927SAndroid Build Coastguard Worker     {
6005*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
6006*61046927SAndroid Build Coastguard Worker             detail::cl_kernel_info, name>::param_type param;
6007*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
6008*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6009*61046927SAndroid Build Coastguard Worker             *err = result;
6010*61046927SAndroid Build Coastguard Worker         }
6011*61046927SAndroid Build Coastguard Worker         return param;
6012*61046927SAndroid Build Coastguard Worker     }
6013*61046927SAndroid Build Coastguard Worker 
6014*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
6015*61046927SAndroid Build Coastguard Worker     template <typename T>
getArgInfo(cl_uint argIndex,cl_kernel_arg_info name,T * param) const6016*61046927SAndroid Build Coastguard Worker     cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const
6017*61046927SAndroid Build Coastguard Worker     {
6018*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6019*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param),
6020*61046927SAndroid Build Coastguard Worker             __GET_KERNEL_ARG_INFO_ERR);
6021*61046927SAndroid Build Coastguard Worker     }
6022*61046927SAndroid Build Coastguard Worker 
6023*61046927SAndroid Build Coastguard Worker     template <cl_kernel_arg_info name> typename
6024*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_kernel_arg_info, name>::param_type
getArgInfo(cl_uint argIndex,cl_int * err=NULL) const6025*61046927SAndroid Build Coastguard Worker     getArgInfo(cl_uint argIndex, cl_int* err = NULL) const
6026*61046927SAndroid Build Coastguard Worker     {
6027*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
6028*61046927SAndroid Build Coastguard Worker             detail::cl_kernel_arg_info, name>::param_type param;
6029*61046927SAndroid Build Coastguard Worker         cl_int result = getArgInfo(argIndex, name, &param);
6030*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6031*61046927SAndroid Build Coastguard Worker             *err = result;
6032*61046927SAndroid Build Coastguard Worker         }
6033*61046927SAndroid Build Coastguard Worker         return param;
6034*61046927SAndroid Build Coastguard Worker     }
6035*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
6036*61046927SAndroid Build Coastguard Worker 
6037*61046927SAndroid Build Coastguard Worker     template <typename T>
getWorkGroupInfo(const Device & device,cl_kernel_work_group_info name,T * param) const6038*61046927SAndroid Build Coastguard Worker     cl_int getWorkGroupInfo(
6039*61046927SAndroid Build Coastguard Worker         const Device& device, cl_kernel_work_group_info name, T* param) const
6040*61046927SAndroid Build Coastguard Worker     {
6041*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6042*61046927SAndroid Build Coastguard Worker             detail::getInfo(
6043*61046927SAndroid Build Coastguard Worker                 &::clGetKernelWorkGroupInfo, object_, device(), name, param),
6044*61046927SAndroid Build Coastguard Worker                 __GET_KERNEL_WORK_GROUP_INFO_ERR);
6045*61046927SAndroid Build Coastguard Worker     }
6046*61046927SAndroid Build Coastguard Worker 
6047*61046927SAndroid Build Coastguard Worker     template <cl_kernel_work_group_info name> typename
6048*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type
getWorkGroupInfo(const Device & device,cl_int * err=NULL) const6049*61046927SAndroid Build Coastguard Worker         getWorkGroupInfo(const Device& device, cl_int* err = NULL) const
6050*61046927SAndroid Build Coastguard Worker     {
6051*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
6052*61046927SAndroid Build Coastguard Worker         detail::cl_kernel_work_group_info, name>::param_type param;
6053*61046927SAndroid Build Coastguard Worker         cl_int result = getWorkGroupInfo(device, name, &param);
6054*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6055*61046927SAndroid Build Coastguard Worker             *err = result;
6056*61046927SAndroid Build Coastguard Worker         }
6057*61046927SAndroid Build Coastguard Worker         return param;
6058*61046927SAndroid Build Coastguard Worker     }
6059*61046927SAndroid Build Coastguard Worker 
6060*61046927SAndroid Build Coastguard Worker #if (CL_HPP_TARGET_OPENCL_VERSION >= 200 && defined(CL_HPP_USE_CL_SUB_GROUPS_KHR)) || CL_HPP_TARGET_OPENCL_VERSION >= 210
getSubGroupInfo(const cl::Device & dev,cl_kernel_sub_group_info name,const cl::NDRange & range,size_type * param) const6061*61046927SAndroid Build Coastguard Worker     cl_int getSubGroupInfo(const cl::Device &dev, cl_kernel_sub_group_info name, const cl::NDRange &range, size_type* param) const
6062*61046927SAndroid Build Coastguard Worker     {
6063*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6064*61046927SAndroid Build Coastguard Worker 
6065*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6066*61046927SAndroid Build Coastguard Worker             clGetKernelSubGroupInfo(object_, dev(), name, range.size(), range.get(), sizeof(size_type), param, nullptr),
6067*61046927SAndroid Build Coastguard Worker             __GET_KERNEL_SUB_GROUP_INFO_ERR);
6068*61046927SAndroid Build Coastguard Worker 
6069*61046927SAndroid Build Coastguard Worker #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6070*61046927SAndroid Build Coastguard Worker 
6071*61046927SAndroid Build Coastguard Worker         typedef clGetKernelSubGroupInfoKHR_fn PFN_clGetKernelSubGroupInfoKHR;
6072*61046927SAndroid Build Coastguard Worker         static PFN_clGetKernelSubGroupInfoKHR pfn_clGetKernelSubGroupInfoKHR = NULL;
6073*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clGetKernelSubGroupInfoKHR);
6074*61046927SAndroid Build Coastguard Worker 
6075*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6076*61046927SAndroid Build Coastguard Worker             pfn_clGetKernelSubGroupInfoKHR(object_, dev(), name, range.size(), range.get(), sizeof(size_type), param, nullptr),
6077*61046927SAndroid Build Coastguard Worker             __GET_KERNEL_SUB_GROUP_INFO_ERR);
6078*61046927SAndroid Build Coastguard Worker 
6079*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6080*61046927SAndroid Build Coastguard Worker     }
6081*61046927SAndroid Build Coastguard Worker 
6082*61046927SAndroid Build Coastguard Worker     template <cl_kernel_sub_group_info name>
getSubGroupInfo(const cl::Device & dev,const cl::NDRange & range,cl_int * err=NULL) const6083*61046927SAndroid Build Coastguard Worker         size_type getSubGroupInfo(const cl::Device &dev, const cl::NDRange &range, cl_int* err = NULL) const
6084*61046927SAndroid Build Coastguard Worker     {
6085*61046927SAndroid Build Coastguard Worker         size_type param;
6086*61046927SAndroid Build Coastguard Worker         cl_int result = getSubGroupInfo(dev, name, range, &param);
6087*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6088*61046927SAndroid Build Coastguard Worker             *err = result;
6089*61046927SAndroid Build Coastguard Worker         }
6090*61046927SAndroid Build Coastguard Worker         return param;
6091*61046927SAndroid Build Coastguard Worker     }
6092*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
6093*61046927SAndroid Build Coastguard Worker 
6094*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
6095*61046927SAndroid Build Coastguard Worker     /*! \brief setArg overload taking a shared_ptr type
6096*61046927SAndroid Build Coastguard Worker      */
6097*61046927SAndroid Build Coastguard Worker     template<typename T, class D>
setArg(cl_uint index,const cl::pointer<T,D> & argPtr)6098*61046927SAndroid Build Coastguard Worker     cl_int setArg(cl_uint index, const cl::pointer<T, D> &argPtr)
6099*61046927SAndroid Build Coastguard Worker     {
6100*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6101*61046927SAndroid Build Coastguard Worker             ::clSetKernelArgSVMPointer(object_, index, argPtr.get()),
6102*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
6103*61046927SAndroid Build Coastguard Worker     }
6104*61046927SAndroid Build Coastguard Worker 
6105*61046927SAndroid Build Coastguard Worker     /*! \brief setArg overload taking a vector type.
6106*61046927SAndroid Build Coastguard Worker      */
6107*61046927SAndroid Build Coastguard Worker     template<typename T, class Alloc>
setArg(cl_uint index,const cl::vector<T,Alloc> & argPtr)6108*61046927SAndroid Build Coastguard Worker     cl_int setArg(cl_uint index, const cl::vector<T, Alloc> &argPtr)
6109*61046927SAndroid Build Coastguard Worker     {
6110*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6111*61046927SAndroid Build Coastguard Worker             ::clSetKernelArgSVMPointer(object_, index, argPtr.data()),
6112*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
6113*61046927SAndroid Build Coastguard Worker     }
6114*61046927SAndroid Build Coastguard Worker 
6115*61046927SAndroid Build Coastguard Worker     /*! \brief setArg overload taking a pointer type
6116*61046927SAndroid Build Coastguard Worker      */
6117*61046927SAndroid Build Coastguard Worker     template<typename T>
6118*61046927SAndroid Build Coastguard Worker     typename std::enable_if<std::is_pointer<T>::value, cl_int>::type
setArg(cl_uint index,const T argPtr)6119*61046927SAndroid Build Coastguard Worker         setArg(cl_uint index, const T argPtr)
6120*61046927SAndroid Build Coastguard Worker     {
6121*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6122*61046927SAndroid Build Coastguard Worker             ::clSetKernelArgSVMPointer(object_, index, argPtr),
6123*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
6124*61046927SAndroid Build Coastguard Worker     }
6125*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
6126*61046927SAndroid Build Coastguard Worker 
6127*61046927SAndroid Build Coastguard Worker     /*! \brief setArg overload taking a POD type
6128*61046927SAndroid Build Coastguard Worker      */
6129*61046927SAndroid Build Coastguard Worker     template <typename T>
6130*61046927SAndroid Build Coastguard Worker     typename std::enable_if<!std::is_pointer<T>::value, cl_int>::type
setArg(cl_uint index,const T & value)6131*61046927SAndroid Build Coastguard Worker         setArg(cl_uint index, const T &value)
6132*61046927SAndroid Build Coastguard Worker     {
6133*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6134*61046927SAndroid Build Coastguard Worker             ::clSetKernelArg(
6135*61046927SAndroid Build Coastguard Worker                 object_,
6136*61046927SAndroid Build Coastguard Worker                 index,
6137*61046927SAndroid Build Coastguard Worker                 detail::KernelArgumentHandler<T>::size(value),
6138*61046927SAndroid Build Coastguard Worker                 detail::KernelArgumentHandler<T>::ptr(value)),
6139*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
6140*61046927SAndroid Build Coastguard Worker     }
6141*61046927SAndroid Build Coastguard Worker 
setArg(cl_uint index,size_type size,const void * argPtr)6142*61046927SAndroid Build Coastguard Worker     cl_int setArg(cl_uint index, size_type size, const void* argPtr)
6143*61046927SAndroid Build Coastguard Worker     {
6144*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6145*61046927SAndroid Build Coastguard Worker             ::clSetKernelArg(object_, index, size, argPtr),
6146*61046927SAndroid Build Coastguard Worker             __SET_KERNEL_ARGS_ERR);
6147*61046927SAndroid Build Coastguard Worker     }
6148*61046927SAndroid Build Coastguard Worker 
6149*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
6150*61046927SAndroid Build Coastguard Worker     /*!
6151*61046927SAndroid Build Coastguard Worker      * Specify a vector of SVM pointers that the kernel may access in
6152*61046927SAndroid Build Coastguard Worker      * addition to its arguments.
6153*61046927SAndroid Build Coastguard Worker      */
setSVMPointers(const vector<void * > & pointerList)6154*61046927SAndroid Build Coastguard Worker     cl_int setSVMPointers(const vector<void*> &pointerList)
6155*61046927SAndroid Build Coastguard Worker     {
6156*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6157*61046927SAndroid Build Coastguard Worker             ::clSetKernelExecInfo(
6158*61046927SAndroid Build Coastguard Worker                 object_,
6159*61046927SAndroid Build Coastguard Worker                 CL_KERNEL_EXEC_INFO_SVM_PTRS,
6160*61046927SAndroid Build Coastguard Worker                 sizeof(void*)*pointerList.size(),
6161*61046927SAndroid Build Coastguard Worker                 pointerList.data()));
6162*61046927SAndroid Build Coastguard Worker     }
6163*61046927SAndroid Build Coastguard Worker 
6164*61046927SAndroid Build Coastguard Worker     /*!
6165*61046927SAndroid Build Coastguard Worker      * Specify a std::array of SVM pointers that the kernel may access in
6166*61046927SAndroid Build Coastguard Worker      * addition to its arguments.
6167*61046927SAndroid Build Coastguard Worker      */
6168*61046927SAndroid Build Coastguard Worker     template<int ArrayLength>
setSVMPointers(const std::array<void *,ArrayLength> & pointerList)6169*61046927SAndroid Build Coastguard Worker     cl_int setSVMPointers(const std::array<void*, ArrayLength> &pointerList)
6170*61046927SAndroid Build Coastguard Worker     {
6171*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6172*61046927SAndroid Build Coastguard Worker             ::clSetKernelExecInfo(
6173*61046927SAndroid Build Coastguard Worker                 object_,
6174*61046927SAndroid Build Coastguard Worker                 CL_KERNEL_EXEC_INFO_SVM_PTRS,
6175*61046927SAndroid Build Coastguard Worker                 sizeof(void*)*pointerList.size(),
6176*61046927SAndroid Build Coastguard Worker                 pointerList.data()));
6177*61046927SAndroid Build Coastguard Worker     }
6178*61046927SAndroid Build Coastguard Worker 
6179*61046927SAndroid Build Coastguard Worker     /*! \brief Enable fine-grained system SVM.
6180*61046927SAndroid Build Coastguard Worker      *
6181*61046927SAndroid Build Coastguard Worker      * \note It is only possible to enable fine-grained system SVM if all devices
6182*61046927SAndroid Build Coastguard Worker      *       in the context associated with kernel support it.
6183*61046927SAndroid Build Coastguard Worker      *
6184*61046927SAndroid Build Coastguard Worker      * \param svmEnabled True if fine-grained system SVM is requested. False otherwise.
6185*61046927SAndroid Build Coastguard Worker      * \return CL_SUCCESS if the function was executed succesfully. CL_INVALID_OPERATION
6186*61046927SAndroid Build Coastguard Worker      *         if no devices in the context support fine-grained system SVM.
6187*61046927SAndroid Build Coastguard Worker      *
6188*61046927SAndroid Build Coastguard Worker      * \see clSetKernelExecInfo
6189*61046927SAndroid Build Coastguard Worker      */
enableFineGrainedSystemSVM(bool svmEnabled)6190*61046927SAndroid Build Coastguard Worker     cl_int enableFineGrainedSystemSVM(bool svmEnabled)
6191*61046927SAndroid Build Coastguard Worker     {
6192*61046927SAndroid Build Coastguard Worker         cl_bool svmEnabled_ = svmEnabled ? CL_TRUE : CL_FALSE;
6193*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6194*61046927SAndroid Build Coastguard Worker             ::clSetKernelExecInfo(
6195*61046927SAndroid Build Coastguard Worker                 object_,
6196*61046927SAndroid Build Coastguard Worker                 CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM,
6197*61046927SAndroid Build Coastguard Worker                 sizeof(cl_bool),
6198*61046927SAndroid Build Coastguard Worker                 &svmEnabled_
6199*61046927SAndroid Build Coastguard Worker                 )
6200*61046927SAndroid Build Coastguard Worker             );
6201*61046927SAndroid Build Coastguard Worker     }
6202*61046927SAndroid Build Coastguard Worker 
6203*61046927SAndroid Build Coastguard Worker     template<int index, int ArrayLength, class D, typename T0, typename T1, typename... Ts>
setSVMPointersHelper(std::array<void *,ArrayLength> & pointerList,const pointer<T0,D> & t0,const pointer<T1,D> & t1,Ts &...ts)6204*61046927SAndroid Build Coastguard Worker     void setSVMPointersHelper(std::array<void*, ArrayLength> &pointerList, const pointer<T0, D> &t0, const pointer<T1, D> &t1, Ts & ... ts)
6205*61046927SAndroid Build Coastguard Worker     {
6206*61046927SAndroid Build Coastguard Worker         pointerList[index] = static_cast<void*>(t0.get());
6207*61046927SAndroid Build Coastguard Worker         setSVMPointersHelper<index + 1, ArrayLength>(pointerList, t1, ts...);
6208*61046927SAndroid Build Coastguard Worker     }
6209*61046927SAndroid Build Coastguard Worker 
6210*61046927SAndroid Build Coastguard Worker     template<int index, int ArrayLength, typename T0, typename T1, typename... Ts>
6211*61046927SAndroid Build Coastguard Worker     typename std::enable_if<std::is_pointer<T0>::value, void>::type
setSVMPointersHelper(std::array<void *,ArrayLength> & pointerList,T0 t0,T1 t1,Ts...ts)6212*61046927SAndroid Build Coastguard Worker     setSVMPointersHelper(std::array<void*, ArrayLength> &pointerList, T0 t0, T1 t1, Ts... ts)
6213*61046927SAndroid Build Coastguard Worker     {
6214*61046927SAndroid Build Coastguard Worker         pointerList[index] = static_cast<void*>(t0);
6215*61046927SAndroid Build Coastguard Worker         setSVMPointersHelper<index + 1, ArrayLength>(pointerList, t1, ts...);
6216*61046927SAndroid Build Coastguard Worker     }
6217*61046927SAndroid Build Coastguard Worker 
6218*61046927SAndroid Build Coastguard Worker     template<int index, int ArrayLength, typename T0, class D>
setSVMPointersHelper(std::array<void *,ArrayLength> & pointerList,const pointer<T0,D> & t0)6219*61046927SAndroid Build Coastguard Worker     void setSVMPointersHelper(std::array<void*, ArrayLength> &pointerList, const pointer<T0, D> &t0)
6220*61046927SAndroid Build Coastguard Worker     {
6221*61046927SAndroid Build Coastguard Worker         pointerList[index] = static_cast<void*>(t0.get());
6222*61046927SAndroid Build Coastguard Worker     }
6223*61046927SAndroid Build Coastguard Worker 
6224*61046927SAndroid Build Coastguard Worker 
6225*61046927SAndroid Build Coastguard Worker     template<int index, int ArrayLength, typename T0>
6226*61046927SAndroid Build Coastguard Worker     typename std::enable_if<std::is_pointer<T0>::value, void>::type
setSVMPointersHelper(std::array<void *,ArrayLength> & pointerList,T0 t0)6227*61046927SAndroid Build Coastguard Worker     setSVMPointersHelper(std::array<void*, ArrayLength> &pointerList, T0 t0)
6228*61046927SAndroid Build Coastguard Worker     {
6229*61046927SAndroid Build Coastguard Worker         pointerList[index] = static_cast<void*>(t0);
6230*61046927SAndroid Build Coastguard Worker     }
6231*61046927SAndroid Build Coastguard Worker 
6232*61046927SAndroid Build Coastguard Worker     template<typename T0, typename... Ts>
setSVMPointers(const T0 & t0,Ts &...ts)6233*61046927SAndroid Build Coastguard Worker     cl_int setSVMPointers(const T0 &t0, Ts & ... ts)
6234*61046927SAndroid Build Coastguard Worker     {
6235*61046927SAndroid Build Coastguard Worker         std::array<void*, 1 + sizeof...(Ts)> pointerList;
6236*61046927SAndroid Build Coastguard Worker 
6237*61046927SAndroid Build Coastguard Worker         setSVMPointersHelper<0, 1 + sizeof...(Ts)>(pointerList, t0, ts...);
6238*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6239*61046927SAndroid Build Coastguard Worker             ::clSetKernelExecInfo(
6240*61046927SAndroid Build Coastguard Worker             object_,
6241*61046927SAndroid Build Coastguard Worker             CL_KERNEL_EXEC_INFO_SVM_PTRS,
6242*61046927SAndroid Build Coastguard Worker             sizeof(void*)*(1 + sizeof...(Ts)),
6243*61046927SAndroid Build Coastguard Worker             pointerList.data()));
6244*61046927SAndroid Build Coastguard Worker     }
6245*61046927SAndroid Build Coastguard Worker 
6246*61046927SAndroid Build Coastguard Worker     template<typename T>
setExecInfo(cl_kernel_exec_info param_name,const T & val)6247*61046927SAndroid Build Coastguard Worker     cl_int setExecInfo(cl_kernel_exec_info param_name, const T& val)
6248*61046927SAndroid Build Coastguard Worker     {
6249*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6250*61046927SAndroid Build Coastguard Worker             ::clSetKernelExecInfo(
6251*61046927SAndroid Build Coastguard Worker             object_,
6252*61046927SAndroid Build Coastguard Worker             param_name,
6253*61046927SAndroid Build Coastguard Worker             sizeof(T),
6254*61046927SAndroid Build Coastguard Worker             &val));
6255*61046927SAndroid Build Coastguard Worker     }
6256*61046927SAndroid Build Coastguard Worker 
6257*61046927SAndroid Build Coastguard Worker     template<cl_kernel_exec_info name>
setExecInfo(typename detail::param_traits<detail::cl_kernel_exec_info,name>::param_type & val)6258*61046927SAndroid Build Coastguard Worker     cl_int setExecInfo(typename detail::param_traits<detail::cl_kernel_exec_info, name>::param_type& val)
6259*61046927SAndroid Build Coastguard Worker     {
6260*61046927SAndroid Build Coastguard Worker         return setExecInfo(name, val);
6261*61046927SAndroid Build Coastguard Worker     }
6262*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
6263*61046927SAndroid Build Coastguard Worker 
6264*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6265*61046927SAndroid Build Coastguard Worker     /**
6266*61046927SAndroid Build Coastguard Worker      * Make a deep copy of the kernel object including its arguments.
6267*61046927SAndroid Build Coastguard Worker      * @return A new kernel object with internal state entirely separate from that
6268*61046927SAndroid Build Coastguard Worker      *         of the original but with any arguments set on the original intact.
6269*61046927SAndroid Build Coastguard Worker      */
clone()6270*61046927SAndroid Build Coastguard Worker     Kernel clone()
6271*61046927SAndroid Build Coastguard Worker     {
6272*61046927SAndroid Build Coastguard Worker         cl_int error;
6273*61046927SAndroid Build Coastguard Worker         Kernel retValue(clCloneKernel(this->get(), &error));
6274*61046927SAndroid Build Coastguard Worker 
6275*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CLONE_KERNEL_ERR);
6276*61046927SAndroid Build Coastguard Worker         return retValue;
6277*61046927SAndroid Build Coastguard Worker     }
6278*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6279*61046927SAndroid Build Coastguard Worker };
6280*61046927SAndroid Build Coastguard Worker 
6281*61046927SAndroid Build Coastguard Worker /*! \class Program
6282*61046927SAndroid Build Coastguard Worker  * \brief Program interface that implements cl_program.
6283*61046927SAndroid Build Coastguard Worker  */
6284*61046927SAndroid Build Coastguard Worker class Program : public detail::Wrapper<cl_program>
6285*61046927SAndroid Build Coastguard Worker {
6286*61046927SAndroid Build Coastguard Worker public:
6287*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6288*61046927SAndroid Build Coastguard Worker     typedef vector<vector<unsigned char>> Binaries;
6289*61046927SAndroid Build Coastguard Worker     typedef vector<string> Sources;
6290*61046927SAndroid Build Coastguard Worker #else // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6291*61046927SAndroid Build Coastguard Worker     typedef vector<std::pair<const void*, size_type> > Binaries;
6292*61046927SAndroid Build Coastguard Worker     typedef vector<std::pair<const char*, size_type> > Sources;
6293*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6294*61046927SAndroid Build Coastguard Worker 
Program(const string & source,bool build=false,cl_int * err=NULL)6295*61046927SAndroid Build Coastguard Worker     Program(
6296*61046927SAndroid Build Coastguard Worker         const string& source,
6297*61046927SAndroid Build Coastguard Worker         bool build = false,
6298*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6299*61046927SAndroid Build Coastguard Worker     {
6300*61046927SAndroid Build Coastguard Worker         cl_int error;
6301*61046927SAndroid Build Coastguard Worker 
6302*61046927SAndroid Build Coastguard Worker         const char * strings = source.c_str();
6303*61046927SAndroid Build Coastguard Worker         const size_type length  = source.size();
6304*61046927SAndroid Build Coastguard Worker 
6305*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
6306*61046927SAndroid Build Coastguard Worker 
6307*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
6308*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)1, &strings, &length, &error);
6309*61046927SAndroid Build Coastguard Worker 
6310*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
6311*61046927SAndroid Build Coastguard Worker 
6312*61046927SAndroid Build Coastguard Worker         if (error == CL_SUCCESS && build) {
6313*61046927SAndroid Build Coastguard Worker 
6314*61046927SAndroid Build Coastguard Worker             error = ::clBuildProgram(
6315*61046927SAndroid Build Coastguard Worker                 object_,
6316*61046927SAndroid Build Coastguard Worker                 0,
6317*61046927SAndroid Build Coastguard Worker                 NULL,
6318*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6319*61046927SAndroid Build Coastguard Worker                 "-cl-std=CL2.0",
6320*61046927SAndroid Build Coastguard Worker #else
6321*61046927SAndroid Build Coastguard Worker                 "",
6322*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6323*61046927SAndroid Build Coastguard Worker                 NULL,
6324*61046927SAndroid Build Coastguard Worker                 NULL);
6325*61046927SAndroid Build Coastguard Worker 
6326*61046927SAndroid Build Coastguard Worker             detail::buildErrHandler(error, __BUILD_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6327*61046927SAndroid Build Coastguard Worker         }
6328*61046927SAndroid Build Coastguard Worker 
6329*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6330*61046927SAndroid Build Coastguard Worker             *err = error;
6331*61046927SAndroid Build Coastguard Worker         }
6332*61046927SAndroid Build Coastguard Worker     }
6333*61046927SAndroid Build Coastguard Worker 
Program(const Context & context,const string & source,bool build=false,cl_int * err=NULL)6334*61046927SAndroid Build Coastguard Worker     Program(
6335*61046927SAndroid Build Coastguard Worker         const Context& context,
6336*61046927SAndroid Build Coastguard Worker         const string& source,
6337*61046927SAndroid Build Coastguard Worker         bool build = false,
6338*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6339*61046927SAndroid Build Coastguard Worker     {
6340*61046927SAndroid Build Coastguard Worker         cl_int error;
6341*61046927SAndroid Build Coastguard Worker 
6342*61046927SAndroid Build Coastguard Worker         const char * strings = source.c_str();
6343*61046927SAndroid Build Coastguard Worker         const size_type length  = source.size();
6344*61046927SAndroid Build Coastguard Worker 
6345*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
6346*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)1, &strings, &length, &error);
6347*61046927SAndroid Build Coastguard Worker 
6348*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
6349*61046927SAndroid Build Coastguard Worker 
6350*61046927SAndroid Build Coastguard Worker         if (error == CL_SUCCESS && build) {
6351*61046927SAndroid Build Coastguard Worker             error = ::clBuildProgram(
6352*61046927SAndroid Build Coastguard Worker                 object_,
6353*61046927SAndroid Build Coastguard Worker                 0,
6354*61046927SAndroid Build Coastguard Worker                 NULL,
6355*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6356*61046927SAndroid Build Coastguard Worker                 "-cl-std=CL2.0",
6357*61046927SAndroid Build Coastguard Worker #else
6358*61046927SAndroid Build Coastguard Worker                 "",
6359*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6360*61046927SAndroid Build Coastguard Worker                 NULL,
6361*61046927SAndroid Build Coastguard Worker                 NULL);
6362*61046927SAndroid Build Coastguard Worker 
6363*61046927SAndroid Build Coastguard Worker             detail::buildErrHandler(error, __BUILD_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6364*61046927SAndroid Build Coastguard Worker         }
6365*61046927SAndroid Build Coastguard Worker 
6366*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6367*61046927SAndroid Build Coastguard Worker             *err = error;
6368*61046927SAndroid Build Coastguard Worker         }
6369*61046927SAndroid Build Coastguard Worker     }
6370*61046927SAndroid Build Coastguard Worker 
6371*61046927SAndroid Build Coastguard Worker     /**
6372*61046927SAndroid Build Coastguard Worker      * Create a program from a vector of source strings and the default context.
6373*61046927SAndroid Build Coastguard Worker      * Does not compile or link the program.
6374*61046927SAndroid Build Coastguard Worker      */
Program(const Sources & sources,cl_int * err=NULL)6375*61046927SAndroid Build Coastguard Worker     Program(
6376*61046927SAndroid Build Coastguard Worker         const Sources& sources,
6377*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6378*61046927SAndroid Build Coastguard Worker     {
6379*61046927SAndroid Build Coastguard Worker         cl_int error;
6380*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
6381*61046927SAndroid Build Coastguard Worker 
6382*61046927SAndroid Build Coastguard Worker         const size_type n = (size_type)sources.size();
6383*61046927SAndroid Build Coastguard Worker 
6384*61046927SAndroid Build Coastguard Worker         vector<size_type> lengths(n);
6385*61046927SAndroid Build Coastguard Worker         vector<const char*> strings(n);
6386*61046927SAndroid Build Coastguard Worker 
6387*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < n; ++i) {
6388*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6389*61046927SAndroid Build Coastguard Worker             strings[i] = sources[(int)i].data();
6390*61046927SAndroid Build Coastguard Worker             lengths[i] = sources[(int)i].length();
6391*61046927SAndroid Build Coastguard Worker #else // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6392*61046927SAndroid Build Coastguard Worker             strings[i] = sources[(int)i].first;
6393*61046927SAndroid Build Coastguard Worker             lengths[i] = sources[(int)i].second;
6394*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6395*61046927SAndroid Build Coastguard Worker         }
6396*61046927SAndroid Build Coastguard Worker 
6397*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
6398*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)n, strings.data(), lengths.data(), &error);
6399*61046927SAndroid Build Coastguard Worker 
6400*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
6401*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6402*61046927SAndroid Build Coastguard Worker             *err = error;
6403*61046927SAndroid Build Coastguard Worker         }
6404*61046927SAndroid Build Coastguard Worker     }
6405*61046927SAndroid Build Coastguard Worker 
6406*61046927SAndroid Build Coastguard Worker     /**
6407*61046927SAndroid Build Coastguard Worker      * Create a program from a vector of source strings and a provided context.
6408*61046927SAndroid Build Coastguard Worker      * Does not compile or link the program.
6409*61046927SAndroid Build Coastguard Worker      */
Program(const Context & context,const Sources & sources,cl_int * err=NULL)6410*61046927SAndroid Build Coastguard Worker     Program(
6411*61046927SAndroid Build Coastguard Worker         const Context& context,
6412*61046927SAndroid Build Coastguard Worker         const Sources& sources,
6413*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6414*61046927SAndroid Build Coastguard Worker     {
6415*61046927SAndroid Build Coastguard Worker         cl_int error;
6416*61046927SAndroid Build Coastguard Worker 
6417*61046927SAndroid Build Coastguard Worker         const size_type n = (size_type)sources.size();
6418*61046927SAndroid Build Coastguard Worker 
6419*61046927SAndroid Build Coastguard Worker         vector<size_type> lengths(n);
6420*61046927SAndroid Build Coastguard Worker         vector<const char*> strings(n);
6421*61046927SAndroid Build Coastguard Worker 
6422*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < n; ++i) {
6423*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6424*61046927SAndroid Build Coastguard Worker             strings[i] = sources[(int)i].data();
6425*61046927SAndroid Build Coastguard Worker             lengths[i] = sources[(int)i].length();
6426*61046927SAndroid Build Coastguard Worker #else // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6427*61046927SAndroid Build Coastguard Worker             strings[i] = sources[(int)i].first;
6428*61046927SAndroid Build Coastguard Worker             lengths[i] = sources[(int)i].second;
6429*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6430*61046927SAndroid Build Coastguard Worker         }
6431*61046927SAndroid Build Coastguard Worker 
6432*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithSource(
6433*61046927SAndroid Build Coastguard Worker             context(), (cl_uint)n, strings.data(), lengths.data(), &error);
6434*61046927SAndroid Build Coastguard Worker 
6435*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
6436*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6437*61046927SAndroid Build Coastguard Worker             *err = error;
6438*61046927SAndroid Build Coastguard Worker         }
6439*61046927SAndroid Build Coastguard Worker     }
6440*61046927SAndroid Build Coastguard Worker 
6441*61046927SAndroid Build Coastguard Worker 
6442*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210 || (CL_HPP_TARGET_OPENCL_VERSION==200 && defined(CL_HPP_USE_IL_KHR))
6443*61046927SAndroid Build Coastguard Worker     /**
6444*61046927SAndroid Build Coastguard Worker      * Program constructor to allow construction of program from SPIR-V or another IL.
6445*61046927SAndroid Build Coastguard Worker      * Valid for either OpenCL >= 2.1 or when CL_HPP_USE_IL_KHR is defined.
6446*61046927SAndroid Build Coastguard Worker      */
Program(const vector<char> & IL,bool build=false,cl_int * err=NULL)6447*61046927SAndroid Build Coastguard Worker     Program(
6448*61046927SAndroid Build Coastguard Worker         const vector<char>& IL,
6449*61046927SAndroid Build Coastguard Worker         bool build = false,
6450*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6451*61046927SAndroid Build Coastguard Worker     {
6452*61046927SAndroid Build Coastguard Worker         cl_int error;
6453*61046927SAndroid Build Coastguard Worker 
6454*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(err);
6455*61046927SAndroid Build Coastguard Worker 
6456*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6457*61046927SAndroid Build Coastguard Worker 
6458*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithIL(
6459*61046927SAndroid Build Coastguard Worker             context(), static_cast<const void*>(IL.data()), IL.size(), &error);
6460*61046927SAndroid Build Coastguard Worker 
6461*61046927SAndroid Build Coastguard Worker #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6462*61046927SAndroid Build Coastguard Worker 
6463*61046927SAndroid Build Coastguard Worker         typedef clCreateProgramWithILKHR_fn PFN_clCreateProgramWithILKHR;
6464*61046927SAndroid Build Coastguard Worker         static PFN_clCreateProgramWithILKHR pfn_clCreateProgramWithILKHR = NULL;
6465*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clCreateProgramWithILKHR);
6466*61046927SAndroid Build Coastguard Worker 
6467*61046927SAndroid Build Coastguard Worker         object_ = pfn_clCreateProgramWithILKHR(
6468*61046927SAndroid Build Coastguard Worker                 context(), static_cast<const void*>(IL.data()), IL.size(), &error);
6469*61046927SAndroid Build Coastguard Worker 
6470*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6471*61046927SAndroid Build Coastguard Worker 
6472*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_IL_ERR);
6473*61046927SAndroid Build Coastguard Worker 
6474*61046927SAndroid Build Coastguard Worker         if (error == CL_SUCCESS && build) {
6475*61046927SAndroid Build Coastguard Worker 
6476*61046927SAndroid Build Coastguard Worker             error = ::clBuildProgram(
6477*61046927SAndroid Build Coastguard Worker                 object_,
6478*61046927SAndroid Build Coastguard Worker                 0,
6479*61046927SAndroid Build Coastguard Worker                 NULL,
6480*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6481*61046927SAndroid Build Coastguard Worker                 "-cl-std=CL2.0",
6482*61046927SAndroid Build Coastguard Worker #else
6483*61046927SAndroid Build Coastguard Worker                 "",
6484*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6485*61046927SAndroid Build Coastguard Worker                 NULL,
6486*61046927SAndroid Build Coastguard Worker                 NULL);
6487*61046927SAndroid Build Coastguard Worker 
6488*61046927SAndroid Build Coastguard Worker             detail::buildErrHandler(error, __BUILD_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6489*61046927SAndroid Build Coastguard Worker         }
6490*61046927SAndroid Build Coastguard Worker 
6491*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6492*61046927SAndroid Build Coastguard Worker             *err = error;
6493*61046927SAndroid Build Coastguard Worker         }
6494*61046927SAndroid Build Coastguard Worker     }
6495*61046927SAndroid Build Coastguard Worker 
6496*61046927SAndroid Build Coastguard Worker     /**
6497*61046927SAndroid Build Coastguard Worker      * Program constructor to allow construction of program from SPIR-V or another IL
6498*61046927SAndroid Build Coastguard Worker      * for a specific context.
6499*61046927SAndroid Build Coastguard Worker      * Valid for either OpenCL >= 2.1 or when CL_HPP_USE_IL_KHR is defined.
6500*61046927SAndroid Build Coastguard Worker      */
Program(const Context & context,const vector<char> & IL,bool build=false,cl_int * err=NULL)6501*61046927SAndroid Build Coastguard Worker     Program(
6502*61046927SAndroid Build Coastguard Worker         const Context& context,
6503*61046927SAndroid Build Coastguard Worker         const vector<char>& IL,
6504*61046927SAndroid Build Coastguard Worker         bool build = false,
6505*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6506*61046927SAndroid Build Coastguard Worker     {
6507*61046927SAndroid Build Coastguard Worker         cl_int error;
6508*61046927SAndroid Build Coastguard Worker 
6509*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6510*61046927SAndroid Build Coastguard Worker 
6511*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithIL(
6512*61046927SAndroid Build Coastguard Worker             context(), static_cast<const void*>(IL.data()), IL.size(), &error);
6513*61046927SAndroid Build Coastguard Worker 
6514*61046927SAndroid Build Coastguard Worker #else // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6515*61046927SAndroid Build Coastguard Worker 
6516*61046927SAndroid Build Coastguard Worker         typedef clCreateProgramWithILKHR_fn PFN_clCreateProgramWithILKHR;
6517*61046927SAndroid Build Coastguard Worker         static PFN_clCreateProgramWithILKHR pfn_clCreateProgramWithILKHR = NULL;
6518*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clCreateProgramWithILKHR);
6519*61046927SAndroid Build Coastguard Worker 
6520*61046927SAndroid Build Coastguard Worker         object_ = pfn_clCreateProgramWithILKHR(
6521*61046927SAndroid Build Coastguard Worker             context(), static_cast<const void*>(IL.data()), IL.size(), &error);
6522*61046927SAndroid Build Coastguard Worker 
6523*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6524*61046927SAndroid Build Coastguard Worker 
6525*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_IL_ERR);
6526*61046927SAndroid Build Coastguard Worker 
6527*61046927SAndroid Build Coastguard Worker         if (error == CL_SUCCESS && build) {
6528*61046927SAndroid Build Coastguard Worker             error = ::clBuildProgram(
6529*61046927SAndroid Build Coastguard Worker                 object_,
6530*61046927SAndroid Build Coastguard Worker                 0,
6531*61046927SAndroid Build Coastguard Worker                 NULL,
6532*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6533*61046927SAndroid Build Coastguard Worker                 "-cl-std=CL2.0",
6534*61046927SAndroid Build Coastguard Worker #else
6535*61046927SAndroid Build Coastguard Worker                 "",
6536*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_CL_1_2_DEFAULT_BUILD)
6537*61046927SAndroid Build Coastguard Worker                 NULL,
6538*61046927SAndroid Build Coastguard Worker                 NULL);
6539*61046927SAndroid Build Coastguard Worker 
6540*61046927SAndroid Build Coastguard Worker             detail::buildErrHandler(error, __BUILD_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6541*61046927SAndroid Build Coastguard Worker         }
6542*61046927SAndroid Build Coastguard Worker 
6543*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6544*61046927SAndroid Build Coastguard Worker             *err = error;
6545*61046927SAndroid Build Coastguard Worker         }
6546*61046927SAndroid Build Coastguard Worker     }
6547*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
6548*61046927SAndroid Build Coastguard Worker 
6549*61046927SAndroid Build Coastguard Worker     /**
6550*61046927SAndroid Build Coastguard Worker      * Construct a program object from a list of devices and a per-device list of binaries.
6551*61046927SAndroid Build Coastguard Worker      * \param context A valid OpenCL context in which to construct the program.
6552*61046927SAndroid Build Coastguard Worker      * \param devices A vector of OpenCL device objects for which the program will be created.
6553*61046927SAndroid Build Coastguard Worker      * \param binaries A vector of pairs of a pointer to a binary object and its length.
6554*61046927SAndroid Build Coastguard Worker      * \param binaryStatus An optional vector that on completion will be resized to
6555*61046927SAndroid Build Coastguard Worker      *   match the size of binaries and filled with values to specify if each binary
6556*61046927SAndroid Build Coastguard Worker      *   was successfully loaded.
6557*61046927SAndroid Build Coastguard Worker      *   Set to CL_SUCCESS if the binary was successfully loaded.
6558*61046927SAndroid Build Coastguard Worker      *   Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.
6559*61046927SAndroid Build Coastguard Worker      *   Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.
6560*61046927SAndroid Build Coastguard Worker      * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:
6561*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_CONTEXT if context is not a valid context.
6562*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;
6563*61046927SAndroid Build Coastguard Worker      *     or if any entry in binaries is NULL or has length 0.
6564*61046927SAndroid Build Coastguard Worker      *   CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.
6565*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.
6566*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.
6567*61046927SAndroid Build Coastguard Worker      */
Program(const Context & context,const vector<Device> & devices,const Binaries & binaries,vector<cl_int> * binaryStatus=NULL,cl_int * err=NULL)6568*61046927SAndroid Build Coastguard Worker     Program(
6569*61046927SAndroid Build Coastguard Worker         const Context& context,
6570*61046927SAndroid Build Coastguard Worker         const vector<Device>& devices,
6571*61046927SAndroid Build Coastguard Worker         const Binaries& binaries,
6572*61046927SAndroid Build Coastguard Worker         vector<cl_int>* binaryStatus = NULL,
6573*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6574*61046927SAndroid Build Coastguard Worker     {
6575*61046927SAndroid Build Coastguard Worker         cl_int error;
6576*61046927SAndroid Build Coastguard Worker 
6577*61046927SAndroid Build Coastguard Worker         const size_type numDevices = devices.size();
6578*61046927SAndroid Build Coastguard Worker 
6579*61046927SAndroid Build Coastguard Worker         // Catch size mismatch early and return
6580*61046927SAndroid Build Coastguard Worker         if(binaries.size() != numDevices) {
6581*61046927SAndroid Build Coastguard Worker             error = CL_INVALID_VALUE;
6582*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
6583*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
6584*61046927SAndroid Build Coastguard Worker                 *err = error;
6585*61046927SAndroid Build Coastguard Worker             }
6586*61046927SAndroid Build Coastguard Worker             return;
6587*61046927SAndroid Build Coastguard Worker         }
6588*61046927SAndroid Build Coastguard Worker 
6589*61046927SAndroid Build Coastguard Worker 
6590*61046927SAndroid Build Coastguard Worker         vector<size_type> lengths(numDevices);
6591*61046927SAndroid Build Coastguard Worker         vector<const unsigned char*> images(numDevices);
6592*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6593*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < numDevices; ++i) {
6594*61046927SAndroid Build Coastguard Worker             images[i] = binaries[i].data();
6595*61046927SAndroid Build Coastguard Worker             lengths[i] = binaries[(int)i].size();
6596*61046927SAndroid Build Coastguard Worker         }
6597*61046927SAndroid Build Coastguard Worker #else // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6598*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < numDevices; ++i) {
6599*61046927SAndroid Build Coastguard Worker             images[i] = (const unsigned char*)binaries[i].first;
6600*61046927SAndroid Build Coastguard Worker             lengths[i] = binaries[(int)i].second;
6601*61046927SAndroid Build Coastguard Worker         }
6602*61046927SAndroid Build Coastguard Worker #endif // #if !defined(CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY)
6603*61046927SAndroid Build Coastguard Worker 
6604*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> deviceIDs(numDevices);
6605*61046927SAndroid Build Coastguard Worker         for( size_type deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
6606*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
6607*61046927SAndroid Build Coastguard Worker         }
6608*61046927SAndroid Build Coastguard Worker 
6609*61046927SAndroid Build Coastguard Worker         if(binaryStatus) {
6610*61046927SAndroid Build Coastguard Worker             binaryStatus->resize(numDevices);
6611*61046927SAndroid Build Coastguard Worker         }
6612*61046927SAndroid Build Coastguard Worker 
6613*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithBinary(
6614*61046927SAndroid Build Coastguard Worker             context(), (cl_uint) devices.size(),
6615*61046927SAndroid Build Coastguard Worker             deviceIDs.data(),
6616*61046927SAndroid Build Coastguard Worker             lengths.data(), images.data(), (binaryStatus != NULL && numDevices > 0)
6617*61046927SAndroid Build Coastguard Worker                ? &binaryStatus->front()
6618*61046927SAndroid Build Coastguard Worker                : NULL, &error);
6619*61046927SAndroid Build Coastguard Worker 
6620*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
6621*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6622*61046927SAndroid Build Coastguard Worker             *err = error;
6623*61046927SAndroid Build Coastguard Worker         }
6624*61046927SAndroid Build Coastguard Worker     }
6625*61046927SAndroid Build Coastguard Worker 
6626*61046927SAndroid Build Coastguard Worker 
6627*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
6628*61046927SAndroid Build Coastguard Worker     /**
6629*61046927SAndroid Build Coastguard Worker      * Create program using builtin kernels.
6630*61046927SAndroid Build Coastguard Worker      * \param kernelNames Semi-colon separated list of builtin kernel names
6631*61046927SAndroid Build Coastguard Worker      */
Program(const Context & context,const vector<Device> & devices,const string & kernelNames,cl_int * err=NULL)6632*61046927SAndroid Build Coastguard Worker     Program(
6633*61046927SAndroid Build Coastguard Worker         const Context& context,
6634*61046927SAndroid Build Coastguard Worker         const vector<Device>& devices,
6635*61046927SAndroid Build Coastguard Worker         const string& kernelNames,
6636*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
6637*61046927SAndroid Build Coastguard Worker     {
6638*61046927SAndroid Build Coastguard Worker         cl_int error;
6639*61046927SAndroid Build Coastguard Worker 
6640*61046927SAndroid Build Coastguard Worker 
6641*61046927SAndroid Build Coastguard Worker         size_type numDevices = devices.size();
6642*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> deviceIDs(numDevices);
6643*61046927SAndroid Build Coastguard Worker         for( size_type deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
6644*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
6645*61046927SAndroid Build Coastguard Worker         }
6646*61046927SAndroid Build Coastguard Worker 
6647*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateProgramWithBuiltInKernels(
6648*61046927SAndroid Build Coastguard Worker             context(),
6649*61046927SAndroid Build Coastguard Worker             (cl_uint) devices.size(),
6650*61046927SAndroid Build Coastguard Worker             deviceIDs.data(),
6651*61046927SAndroid Build Coastguard Worker             kernelNames.c_str(),
6652*61046927SAndroid Build Coastguard Worker             &error);
6653*61046927SAndroid Build Coastguard Worker 
6654*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR);
6655*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6656*61046927SAndroid Build Coastguard Worker             *err = error;
6657*61046927SAndroid Build Coastguard Worker         }
6658*61046927SAndroid Build Coastguard Worker     }
6659*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
6660*61046927SAndroid Build Coastguard Worker 
Program()6661*61046927SAndroid Build Coastguard Worker     Program() { }
6662*61046927SAndroid Build Coastguard Worker 
6663*61046927SAndroid Build Coastguard Worker 
6664*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_program - takes ownership.
6665*61046927SAndroid Build Coastguard Worker      *
6666*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
6667*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
6668*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
6669*61046927SAndroid Build Coastguard Worker      */
Program(const cl_program & program,bool retainObject=false)6670*61046927SAndroid Build Coastguard Worker     explicit Program(const cl_program& program, bool retainObject = false) :
6671*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(program, retainObject) { }
6672*61046927SAndroid Build Coastguard Worker 
operator =(const cl_program & rhs)6673*61046927SAndroid Build Coastguard Worker     Program& operator = (const cl_program& rhs)
6674*61046927SAndroid Build Coastguard Worker     {
6675*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
6676*61046927SAndroid Build Coastguard Worker         return *this;
6677*61046927SAndroid Build Coastguard Worker     }
6678*61046927SAndroid Build Coastguard Worker 
6679*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
6680*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
6681*61046927SAndroid Build Coastguard Worker      */
Program(const Program & program)6682*61046927SAndroid Build Coastguard Worker     Program(const Program& program) : detail::Wrapper<cl_type>(program) {}
6683*61046927SAndroid Build Coastguard Worker 
6684*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
6685*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
6686*61046927SAndroid Build Coastguard Worker      */
operator =(const Program & program)6687*61046927SAndroid Build Coastguard Worker     Program& operator = (const Program &program)
6688*61046927SAndroid Build Coastguard Worker     {
6689*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(program);
6690*61046927SAndroid Build Coastguard Worker         return *this;
6691*61046927SAndroid Build Coastguard Worker     }
6692*61046927SAndroid Build Coastguard Worker 
6693*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
6694*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
6695*61046927SAndroid Build Coastguard Worker      */
Program(Program && program)6696*61046927SAndroid Build Coastguard Worker     Program(Program&& program) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(program)) {}
6697*61046927SAndroid Build Coastguard Worker 
6698*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
6699*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
6700*61046927SAndroid Build Coastguard Worker      */
operator =(Program && program)6701*61046927SAndroid Build Coastguard Worker     Program& operator = (Program &&program)
6702*61046927SAndroid Build Coastguard Worker     {
6703*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(program));
6704*61046927SAndroid Build Coastguard Worker         return *this;
6705*61046927SAndroid Build Coastguard Worker     }
6706*61046927SAndroid Build Coastguard Worker 
build(const vector<Device> & devices,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const6707*61046927SAndroid Build Coastguard Worker     cl_int build(
6708*61046927SAndroid Build Coastguard Worker         const vector<Device>& devices,
6709*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
6710*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
6711*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
6712*61046927SAndroid Build Coastguard Worker     {
6713*61046927SAndroid Build Coastguard Worker         size_type numDevices = devices.size();
6714*61046927SAndroid Build Coastguard Worker         vector<cl_device_id> deviceIDs(numDevices);
6715*61046927SAndroid Build Coastguard Worker 
6716*61046927SAndroid Build Coastguard Worker         for( size_type deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
6717*61046927SAndroid Build Coastguard Worker             deviceIDs[deviceIndex] = (devices[deviceIndex])();
6718*61046927SAndroid Build Coastguard Worker         }
6719*61046927SAndroid Build Coastguard Worker 
6720*61046927SAndroid Build Coastguard Worker         cl_int buildError = ::clBuildProgram(
6721*61046927SAndroid Build Coastguard Worker             object_,
6722*61046927SAndroid Build Coastguard Worker             (cl_uint)
6723*61046927SAndroid Build Coastguard Worker             devices.size(),
6724*61046927SAndroid Build Coastguard Worker             deviceIDs.data(),
6725*61046927SAndroid Build Coastguard Worker             options,
6726*61046927SAndroid Build Coastguard Worker             notifyFptr,
6727*61046927SAndroid Build Coastguard Worker             data);
6728*61046927SAndroid Build Coastguard Worker 
6729*61046927SAndroid Build Coastguard Worker         return detail::buildErrHandler(buildError, __BUILD_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6730*61046927SAndroid Build Coastguard Worker     }
6731*61046927SAndroid Build Coastguard Worker 
build(const Device & device,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const6732*61046927SAndroid Build Coastguard Worker     cl_int build(
6733*61046927SAndroid Build Coastguard Worker         const Device& device,
6734*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
6735*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
6736*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
6737*61046927SAndroid Build Coastguard Worker     {
6738*61046927SAndroid Build Coastguard Worker         cl_device_id deviceID = device();
6739*61046927SAndroid Build Coastguard Worker 
6740*61046927SAndroid Build Coastguard Worker         cl_int buildError = ::clBuildProgram(
6741*61046927SAndroid Build Coastguard Worker             object_,
6742*61046927SAndroid Build Coastguard Worker             1,
6743*61046927SAndroid Build Coastguard Worker             &deviceID,
6744*61046927SAndroid Build Coastguard Worker             options,
6745*61046927SAndroid Build Coastguard Worker             notifyFptr,
6746*61046927SAndroid Build Coastguard Worker             data);
6747*61046927SAndroid Build Coastguard Worker 
6748*61046927SAndroid Build Coastguard Worker         BuildLogType buildLog(0);
6749*61046927SAndroid Build Coastguard Worker         buildLog.push_back(std::make_pair(device, getBuildInfo<CL_PROGRAM_BUILD_LOG>(device)));
6750*61046927SAndroid Build Coastguard Worker         return detail::buildErrHandler(buildError, __BUILD_PROGRAM_ERR, buildLog);
6751*61046927SAndroid Build Coastguard Worker     }
6752*61046927SAndroid Build Coastguard Worker 
build(const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const6753*61046927SAndroid Build Coastguard Worker     cl_int build(
6754*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
6755*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
6756*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
6757*61046927SAndroid Build Coastguard Worker     {
6758*61046927SAndroid Build Coastguard Worker         cl_int buildError = ::clBuildProgram(
6759*61046927SAndroid Build Coastguard Worker             object_,
6760*61046927SAndroid Build Coastguard Worker             0,
6761*61046927SAndroid Build Coastguard Worker             NULL,
6762*61046927SAndroid Build Coastguard Worker             options,
6763*61046927SAndroid Build Coastguard Worker             notifyFptr,
6764*61046927SAndroid Build Coastguard Worker             data);
6765*61046927SAndroid Build Coastguard Worker 
6766*61046927SAndroid Build Coastguard Worker         return detail::buildErrHandler(buildError, __BUILD_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6767*61046927SAndroid Build Coastguard Worker     }
6768*61046927SAndroid Build Coastguard Worker 
6769*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
compile(const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const6770*61046927SAndroid Build Coastguard Worker     cl_int compile(
6771*61046927SAndroid Build Coastguard Worker         const char* options = NULL,
6772*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
6773*61046927SAndroid Build Coastguard Worker         void* data = NULL) const
6774*61046927SAndroid Build Coastguard Worker     {
6775*61046927SAndroid Build Coastguard Worker         cl_int error = ::clCompileProgram(
6776*61046927SAndroid Build Coastguard Worker             object_,
6777*61046927SAndroid Build Coastguard Worker             0,
6778*61046927SAndroid Build Coastguard Worker             NULL,
6779*61046927SAndroid Build Coastguard Worker             options,
6780*61046927SAndroid Build Coastguard Worker             0,
6781*61046927SAndroid Build Coastguard Worker             NULL,
6782*61046927SAndroid Build Coastguard Worker             NULL,
6783*61046927SAndroid Build Coastguard Worker             notifyFptr,
6784*61046927SAndroid Build Coastguard Worker             data);
6785*61046927SAndroid Build Coastguard Worker         return detail::buildErrHandler(error, __COMPILE_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
6786*61046927SAndroid Build Coastguard Worker     }
6787*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
6788*61046927SAndroid Build Coastguard Worker 
6789*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_program_info name,T * param) const6790*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_program_info name, T* param) const
6791*61046927SAndroid Build Coastguard Worker     {
6792*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6793*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetProgramInfo, object_, name, param),
6794*61046927SAndroid Build Coastguard Worker             __GET_PROGRAM_INFO_ERR);
6795*61046927SAndroid Build Coastguard Worker     }
6796*61046927SAndroid Build Coastguard Worker 
6797*61046927SAndroid Build Coastguard Worker     template <cl_program_info name> typename
6798*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_program_info, name>::param_type
getInfo(cl_int * err=NULL) const6799*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
6800*61046927SAndroid Build Coastguard Worker     {
6801*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
6802*61046927SAndroid Build Coastguard Worker             detail::cl_program_info, name>::param_type param;
6803*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
6804*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6805*61046927SAndroid Build Coastguard Worker             *err = result;
6806*61046927SAndroid Build Coastguard Worker         }
6807*61046927SAndroid Build Coastguard Worker         return param;
6808*61046927SAndroid Build Coastguard Worker     }
6809*61046927SAndroid Build Coastguard Worker 
6810*61046927SAndroid Build Coastguard Worker     template <typename T>
getBuildInfo(const Device & device,cl_program_build_info name,T * param) const6811*61046927SAndroid Build Coastguard Worker     cl_int getBuildInfo(
6812*61046927SAndroid Build Coastguard Worker         const Device& device, cl_program_build_info name, T* param) const
6813*61046927SAndroid Build Coastguard Worker     {
6814*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6815*61046927SAndroid Build Coastguard Worker             detail::getInfo(
6816*61046927SAndroid Build Coastguard Worker                 &::clGetProgramBuildInfo, object_, device(), name, param),
6817*61046927SAndroid Build Coastguard Worker                 __GET_PROGRAM_BUILD_INFO_ERR);
6818*61046927SAndroid Build Coastguard Worker     }
6819*61046927SAndroid Build Coastguard Worker 
6820*61046927SAndroid Build Coastguard Worker     template <cl_program_build_info name> typename
6821*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_program_build_info, name>::param_type
getBuildInfo(const Device & device,cl_int * err=NULL) const6822*61046927SAndroid Build Coastguard Worker     getBuildInfo(const Device& device, cl_int* err = NULL) const
6823*61046927SAndroid Build Coastguard Worker     {
6824*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
6825*61046927SAndroid Build Coastguard Worker             detail::cl_program_build_info, name>::param_type param;
6826*61046927SAndroid Build Coastguard Worker         cl_int result = getBuildInfo(device, name, &param);
6827*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6828*61046927SAndroid Build Coastguard Worker             *err = result;
6829*61046927SAndroid Build Coastguard Worker         }
6830*61046927SAndroid Build Coastguard Worker         return param;
6831*61046927SAndroid Build Coastguard Worker     }
6832*61046927SAndroid Build Coastguard Worker 
6833*61046927SAndroid Build Coastguard Worker     /**
6834*61046927SAndroid Build Coastguard Worker      * Build info function that returns a vector of device/info pairs for the specified
6835*61046927SAndroid Build Coastguard Worker      * info type and for all devices in the program.
6836*61046927SAndroid Build Coastguard Worker      * On an error reading the info for any device, an empty vector of info will be returned.
6837*61046927SAndroid Build Coastguard Worker      */
6838*61046927SAndroid Build Coastguard Worker     template <cl_program_build_info name>
6839*61046927SAndroid Build Coastguard Worker     vector<std::pair<cl::Device, typename detail::param_traits<detail::cl_program_build_info, name>::param_type>>
getBuildInfo(cl_int * err=NULL) const6840*61046927SAndroid Build Coastguard Worker         getBuildInfo(cl_int *err = NULL) const
6841*61046927SAndroid Build Coastguard Worker     {
6842*61046927SAndroid Build Coastguard Worker         cl_int result = CL_SUCCESS;
6843*61046927SAndroid Build Coastguard Worker 
6844*61046927SAndroid Build Coastguard Worker         auto devs = getInfo<CL_PROGRAM_DEVICES>(&result);
6845*61046927SAndroid Build Coastguard Worker         vector<std::pair<cl::Device, typename detail::param_traits<detail::cl_program_build_info, name>::param_type>>
6846*61046927SAndroid Build Coastguard Worker             devInfo;
6847*61046927SAndroid Build Coastguard Worker 
6848*61046927SAndroid Build Coastguard Worker         // If there was an initial error from getInfo return the error
6849*61046927SAndroid Build Coastguard Worker         if (result != CL_SUCCESS) {
6850*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
6851*61046927SAndroid Build Coastguard Worker                 *err = result;
6852*61046927SAndroid Build Coastguard Worker             }
6853*61046927SAndroid Build Coastguard Worker             return devInfo;
6854*61046927SAndroid Build Coastguard Worker         }
6855*61046927SAndroid Build Coastguard Worker 
6856*61046927SAndroid Build Coastguard Worker         for (const cl::Device &d : devs) {
6857*61046927SAndroid Build Coastguard Worker             typename detail::param_traits<
6858*61046927SAndroid Build Coastguard Worker                 detail::cl_program_build_info, name>::param_type param;
6859*61046927SAndroid Build Coastguard Worker             result = getBuildInfo(d, name, &param);
6860*61046927SAndroid Build Coastguard Worker             devInfo.push_back(
6861*61046927SAndroid Build Coastguard Worker                 std::pair<cl::Device, typename detail::param_traits<detail::cl_program_build_info, name>::param_type>
6862*61046927SAndroid Build Coastguard Worker                 (d, param));
6863*61046927SAndroid Build Coastguard Worker             if (result != CL_SUCCESS) {
6864*61046927SAndroid Build Coastguard Worker                 // On error, leave the loop and return the error code
6865*61046927SAndroid Build Coastguard Worker                 break;
6866*61046927SAndroid Build Coastguard Worker             }
6867*61046927SAndroid Build Coastguard Worker         }
6868*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
6869*61046927SAndroid Build Coastguard Worker             *err = result;
6870*61046927SAndroid Build Coastguard Worker         }
6871*61046927SAndroid Build Coastguard Worker         if (result != CL_SUCCESS) {
6872*61046927SAndroid Build Coastguard Worker             devInfo.clear();
6873*61046927SAndroid Build Coastguard Worker         }
6874*61046927SAndroid Build Coastguard Worker         return devInfo;
6875*61046927SAndroid Build Coastguard Worker     }
6876*61046927SAndroid Build Coastguard Worker 
createKernels(vector<Kernel> * kernels)6877*61046927SAndroid Build Coastguard Worker     cl_int createKernels(vector<Kernel>* kernels)
6878*61046927SAndroid Build Coastguard Worker     {
6879*61046927SAndroid Build Coastguard Worker         cl_uint numKernels;
6880*61046927SAndroid Build Coastguard Worker         cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels);
6881*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
6882*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
6883*61046927SAndroid Build Coastguard Worker         }
6884*61046927SAndroid Build Coastguard Worker 
6885*61046927SAndroid Build Coastguard Worker         vector<cl_kernel> value(numKernels);
6886*61046927SAndroid Build Coastguard Worker 
6887*61046927SAndroid Build Coastguard Worker         err = ::clCreateKernelsInProgram(
6888*61046927SAndroid Build Coastguard Worker             object_, numKernels, value.data(), NULL);
6889*61046927SAndroid Build Coastguard Worker         if (err != CL_SUCCESS) {
6890*61046927SAndroid Build Coastguard Worker             return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
6891*61046927SAndroid Build Coastguard Worker         }
6892*61046927SAndroid Build Coastguard Worker 
6893*61046927SAndroid Build Coastguard Worker         if (kernels) {
6894*61046927SAndroid Build Coastguard Worker             kernels->resize(value.size());
6895*61046927SAndroid Build Coastguard Worker 
6896*61046927SAndroid Build Coastguard Worker             // Assign to param, constructing with retain behaviour
6897*61046927SAndroid Build Coastguard Worker             // to correctly capture each underlying CL object
6898*61046927SAndroid Build Coastguard Worker             for (size_type i = 0; i < value.size(); i++) {
6899*61046927SAndroid Build Coastguard Worker                 // We do not need to retain because this kernel is being created
6900*61046927SAndroid Build Coastguard Worker                 // by the runtime
6901*61046927SAndroid Build Coastguard Worker                 (*kernels)[i] = Kernel(value[i], false);
6902*61046927SAndroid Build Coastguard Worker             }
6903*61046927SAndroid Build Coastguard Worker         }
6904*61046927SAndroid Build Coastguard Worker         return CL_SUCCESS;
6905*61046927SAndroid Build Coastguard Worker     }
6906*61046927SAndroid Build Coastguard Worker 
6907*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 220
6908*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_2_2_APIS)
6909*61046927SAndroid Build Coastguard Worker     /*! \brief Registers a callback function to be called when destructors for
6910*61046927SAndroid Build Coastguard Worker      *         program scope global variables are complete and before the
6911*61046927SAndroid Build Coastguard Worker      *         program is released.
6912*61046927SAndroid Build Coastguard Worker      *
6913*61046927SAndroid Build Coastguard Worker      *  Wraps clSetProgramReleaseCallback().
6914*61046927SAndroid Build Coastguard Worker      *
6915*61046927SAndroid Build Coastguard Worker      *  Each call to this function registers the specified user callback function
6916*61046927SAndroid Build Coastguard Worker      *  on a callback stack associated with program. The registered user callback
6917*61046927SAndroid Build Coastguard Worker      *  functions are called in the reverse order in which they were registered.
6918*61046927SAndroid Build Coastguard Worker      */
setReleaseCallback(void (CL_CALLBACK * pfn_notify)(cl_program program,void * user_data),void * user_data=NULL)6919*61046927SAndroid Build Coastguard Worker     CL_API_PREFIX__VERSION_2_2_DEPRECATED cl_int setReleaseCallback(
6920*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK * pfn_notify)(cl_program program, void * user_data),
6921*61046927SAndroid Build Coastguard Worker         void * user_data = NULL) CL_API_SUFFIX__VERSION_2_2_DEPRECATED
6922*61046927SAndroid Build Coastguard Worker     {
6923*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6924*61046927SAndroid Build Coastguard Worker             ::clSetProgramReleaseCallback(
6925*61046927SAndroid Build Coastguard Worker                 object_,
6926*61046927SAndroid Build Coastguard Worker                 pfn_notify,
6927*61046927SAndroid Build Coastguard Worker                 user_data),
6928*61046927SAndroid Build Coastguard Worker             __SET_PROGRAM_RELEASE_CALLBACK_ERR);
6929*61046927SAndroid Build Coastguard Worker     }
6930*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_USE_DEPRECATED_OPENCL_2_2_APIS)
6931*61046927SAndroid Build Coastguard Worker 
6932*61046927SAndroid Build Coastguard Worker     /*! \brief Sets a SPIR-V specialization constant.
6933*61046927SAndroid Build Coastguard Worker      *
6934*61046927SAndroid Build Coastguard Worker      *  Wraps clSetProgramSpecializationConstant().
6935*61046927SAndroid Build Coastguard Worker      */
6936*61046927SAndroid Build Coastguard Worker     template <typename T>
6937*61046927SAndroid Build Coastguard Worker     typename std::enable_if<!std::is_pointer<T>::value, cl_int>::type
setSpecializationConstant(cl_uint index,const T & value)6938*61046927SAndroid Build Coastguard Worker         setSpecializationConstant(cl_uint index, const T &value)
6939*61046927SAndroid Build Coastguard Worker     {
6940*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6941*61046927SAndroid Build Coastguard Worker             ::clSetProgramSpecializationConstant(
6942*61046927SAndroid Build Coastguard Worker                 object_,
6943*61046927SAndroid Build Coastguard Worker                 index,
6944*61046927SAndroid Build Coastguard Worker                 sizeof(value),
6945*61046927SAndroid Build Coastguard Worker                 &value),
6946*61046927SAndroid Build Coastguard Worker             __SET_PROGRAM_SPECIALIZATION_CONSTANT_ERR);
6947*61046927SAndroid Build Coastguard Worker     }
6948*61046927SAndroid Build Coastguard Worker 
6949*61046927SAndroid Build Coastguard Worker     /*! \brief Sets a SPIR-V specialization constant.
6950*61046927SAndroid Build Coastguard Worker      *
6951*61046927SAndroid Build Coastguard Worker      *  Wraps clSetProgramSpecializationConstant().
6952*61046927SAndroid Build Coastguard Worker      */
setSpecializationConstant(cl_uint index,size_type size,const void * value)6953*61046927SAndroid Build Coastguard Worker     cl_int setSpecializationConstant(cl_uint index, size_type size, const void* value)
6954*61046927SAndroid Build Coastguard Worker     {
6955*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
6956*61046927SAndroid Build Coastguard Worker             ::clSetProgramSpecializationConstant(
6957*61046927SAndroid Build Coastguard Worker                 object_,
6958*61046927SAndroid Build Coastguard Worker                 index,
6959*61046927SAndroid Build Coastguard Worker                 size,
6960*61046927SAndroid Build Coastguard Worker                 value),
6961*61046927SAndroid Build Coastguard Worker             __SET_PROGRAM_SPECIALIZATION_CONSTANT_ERR);
6962*61046927SAndroid Build Coastguard Worker     }
6963*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 220
6964*61046927SAndroid Build Coastguard Worker };
6965*61046927SAndroid Build Coastguard Worker 
6966*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
linkProgram(Program input1,Program input2,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL,cl_int * err=NULL)6967*61046927SAndroid Build Coastguard Worker inline Program linkProgram(
6968*61046927SAndroid Build Coastguard Worker     Program input1,
6969*61046927SAndroid Build Coastguard Worker     Program input2,
6970*61046927SAndroid Build Coastguard Worker     const char* options = NULL,
6971*61046927SAndroid Build Coastguard Worker     void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
6972*61046927SAndroid Build Coastguard Worker     void* data = NULL,
6973*61046927SAndroid Build Coastguard Worker     cl_int* err = NULL)
6974*61046927SAndroid Build Coastguard Worker {
6975*61046927SAndroid Build Coastguard Worker     cl_int error_local = CL_SUCCESS;
6976*61046927SAndroid Build Coastguard Worker 
6977*61046927SAndroid Build Coastguard Worker     cl_program programs[2] = { input1(), input2() };
6978*61046927SAndroid Build Coastguard Worker 
6979*61046927SAndroid Build Coastguard Worker     Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>(&error_local);
6980*61046927SAndroid Build Coastguard Worker     if(error_local!=CL_SUCCESS) {
6981*61046927SAndroid Build Coastguard Worker         detail::errHandler(error_local, __LINK_PROGRAM_ERR);
6982*61046927SAndroid Build Coastguard Worker     }
6983*61046927SAndroid Build Coastguard Worker 
6984*61046927SAndroid Build Coastguard Worker     cl_program prog = ::clLinkProgram(
6985*61046927SAndroid Build Coastguard Worker         ctx(),
6986*61046927SAndroid Build Coastguard Worker         0,
6987*61046927SAndroid Build Coastguard Worker         NULL,
6988*61046927SAndroid Build Coastguard Worker         options,
6989*61046927SAndroid Build Coastguard Worker         2,
6990*61046927SAndroid Build Coastguard Worker         programs,
6991*61046927SAndroid Build Coastguard Worker         notifyFptr,
6992*61046927SAndroid Build Coastguard Worker         data,
6993*61046927SAndroid Build Coastguard Worker         &error_local);
6994*61046927SAndroid Build Coastguard Worker 
6995*61046927SAndroid Build Coastguard Worker     detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
6996*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
6997*61046927SAndroid Build Coastguard Worker         *err = error_local;
6998*61046927SAndroid Build Coastguard Worker     }
6999*61046927SAndroid Build Coastguard Worker 
7000*61046927SAndroid Build Coastguard Worker     return Program(prog);
7001*61046927SAndroid Build Coastguard Worker }
7002*61046927SAndroid Build Coastguard Worker 
linkProgram(vector<Program> inputPrograms,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL,cl_int * err=NULL)7003*61046927SAndroid Build Coastguard Worker inline Program linkProgram(
7004*61046927SAndroid Build Coastguard Worker     vector<Program> inputPrograms,
7005*61046927SAndroid Build Coastguard Worker     const char* options = NULL,
7006*61046927SAndroid Build Coastguard Worker     void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
7007*61046927SAndroid Build Coastguard Worker     void* data = NULL,
7008*61046927SAndroid Build Coastguard Worker     cl_int* err = NULL)
7009*61046927SAndroid Build Coastguard Worker {
7010*61046927SAndroid Build Coastguard Worker     cl_int error_local = CL_SUCCESS;
7011*61046927SAndroid Build Coastguard Worker 
7012*61046927SAndroid Build Coastguard Worker     vector<cl_program> programs(inputPrograms.size());
7013*61046927SAndroid Build Coastguard Worker 
7014*61046927SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < inputPrograms.size(); i++) {
7015*61046927SAndroid Build Coastguard Worker         programs[i] = inputPrograms[i]();
7016*61046927SAndroid Build Coastguard Worker     }
7017*61046927SAndroid Build Coastguard Worker 
7018*61046927SAndroid Build Coastguard Worker     Context ctx;
7019*61046927SAndroid Build Coastguard Worker     if(inputPrograms.size() > 0) {
7020*61046927SAndroid Build Coastguard Worker         ctx = inputPrograms[0].getInfo<CL_PROGRAM_CONTEXT>(&error_local);
7021*61046927SAndroid Build Coastguard Worker         if(error_local!=CL_SUCCESS) {
7022*61046927SAndroid Build Coastguard Worker             detail::errHandler(error_local, __LINK_PROGRAM_ERR);
7023*61046927SAndroid Build Coastguard Worker         }
7024*61046927SAndroid Build Coastguard Worker     }
7025*61046927SAndroid Build Coastguard Worker     cl_program prog = ::clLinkProgram(
7026*61046927SAndroid Build Coastguard Worker         ctx(),
7027*61046927SAndroid Build Coastguard Worker         0,
7028*61046927SAndroid Build Coastguard Worker         NULL,
7029*61046927SAndroid Build Coastguard Worker         options,
7030*61046927SAndroid Build Coastguard Worker         (cl_uint)inputPrograms.size(),
7031*61046927SAndroid Build Coastguard Worker         programs.data(),
7032*61046927SAndroid Build Coastguard Worker         notifyFptr,
7033*61046927SAndroid Build Coastguard Worker         data,
7034*61046927SAndroid Build Coastguard Worker         &error_local);
7035*61046927SAndroid Build Coastguard Worker 
7036*61046927SAndroid Build Coastguard Worker     detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
7037*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
7038*61046927SAndroid Build Coastguard Worker         *err = error_local;
7039*61046927SAndroid Build Coastguard Worker     }
7040*61046927SAndroid Build Coastguard Worker 
7041*61046927SAndroid Build Coastguard Worker     return Program(prog, false);
7042*61046927SAndroid Build Coastguard Worker }
7043*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
7044*61046927SAndroid Build Coastguard Worker 
7045*61046927SAndroid Build Coastguard Worker // Template specialization for CL_PROGRAM_BINARIES
7046*61046927SAndroid Build Coastguard Worker template <>
getInfo(cl_program_info name,vector<vector<unsigned char>> * param) const7047*61046927SAndroid Build Coastguard Worker inline cl_int cl::Program::getInfo(cl_program_info name, vector<vector<unsigned char>>* param) const
7048*61046927SAndroid Build Coastguard Worker {
7049*61046927SAndroid Build Coastguard Worker     if (name != CL_PROGRAM_BINARIES) {
7050*61046927SAndroid Build Coastguard Worker         return CL_INVALID_VALUE;
7051*61046927SAndroid Build Coastguard Worker     }
7052*61046927SAndroid Build Coastguard Worker     if (param) {
7053*61046927SAndroid Build Coastguard Worker         // Resize the parameter array appropriately for each allocation
7054*61046927SAndroid Build Coastguard Worker         // and pass down to the helper
7055*61046927SAndroid Build Coastguard Worker 
7056*61046927SAndroid Build Coastguard Worker         vector<size_type> sizes = getInfo<CL_PROGRAM_BINARY_SIZES>();
7057*61046927SAndroid Build Coastguard Worker         size_type numBinaries = sizes.size();
7058*61046927SAndroid Build Coastguard Worker 
7059*61046927SAndroid Build Coastguard Worker         // Resize the parameter array and constituent arrays
7060*61046927SAndroid Build Coastguard Worker         param->resize(numBinaries);
7061*61046927SAndroid Build Coastguard Worker         for (size_type i = 0; i < numBinaries; ++i) {
7062*61046927SAndroid Build Coastguard Worker             (*param)[i].resize(sizes[i]);
7063*61046927SAndroid Build Coastguard Worker         }
7064*61046927SAndroid Build Coastguard Worker 
7065*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
7066*61046927SAndroid Build Coastguard Worker             detail::getInfo(&::clGetProgramInfo, object_, name, param),
7067*61046927SAndroid Build Coastguard Worker             __GET_PROGRAM_INFO_ERR);
7068*61046927SAndroid Build Coastguard Worker     }
7069*61046927SAndroid Build Coastguard Worker 
7070*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
7071*61046927SAndroid Build Coastguard Worker }
7072*61046927SAndroid Build Coastguard Worker 
7073*61046927SAndroid Build Coastguard Worker template<>
getInfo(cl_int * err) const7074*61046927SAndroid Build Coastguard Worker inline vector<vector<unsigned char>> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* err) const
7075*61046927SAndroid Build Coastguard Worker {
7076*61046927SAndroid Build Coastguard Worker     vector<vector<unsigned char>> binariesVectors;
7077*61046927SAndroid Build Coastguard Worker 
7078*61046927SAndroid Build Coastguard Worker     cl_int result = getInfo(CL_PROGRAM_BINARIES, &binariesVectors);
7079*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
7080*61046927SAndroid Build Coastguard Worker         *err = result;
7081*61046927SAndroid Build Coastguard Worker     }
7082*61046927SAndroid Build Coastguard Worker     return binariesVectors;
7083*61046927SAndroid Build Coastguard Worker }
7084*61046927SAndroid Build Coastguard Worker 
7085*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 220
7086*61046927SAndroid Build Coastguard Worker // Template specialization for clSetProgramSpecializationConstant
7087*61046927SAndroid Build Coastguard Worker template <>
setSpecializationConstant(cl_uint index,const bool & value)7088*61046927SAndroid Build Coastguard Worker inline cl_int cl::Program::setSpecializationConstant(cl_uint index, const bool &value)
7089*61046927SAndroid Build Coastguard Worker {
7090*61046927SAndroid Build Coastguard Worker     cl_uchar ucValue = value ? CL_UCHAR_MAX : 0;
7091*61046927SAndroid Build Coastguard Worker     return detail::errHandler(
7092*61046927SAndroid Build Coastguard Worker         ::clSetProgramSpecializationConstant(
7093*61046927SAndroid Build Coastguard Worker             object_,
7094*61046927SAndroid Build Coastguard Worker             index,
7095*61046927SAndroid Build Coastguard Worker             sizeof(ucValue),
7096*61046927SAndroid Build Coastguard Worker             &ucValue),
7097*61046927SAndroid Build Coastguard Worker         __SET_PROGRAM_SPECIALIZATION_CONSTANT_ERR);
7098*61046927SAndroid Build Coastguard Worker }
7099*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 220
7100*61046927SAndroid Build Coastguard Worker 
Kernel(const Program & program,const char * name,cl_int * err)7101*61046927SAndroid Build Coastguard Worker inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
7102*61046927SAndroid Build Coastguard Worker {
7103*61046927SAndroid Build Coastguard Worker     cl_int error;
7104*61046927SAndroid Build Coastguard Worker 
7105*61046927SAndroid Build Coastguard Worker     object_ = ::clCreateKernel(program(), name, &error);
7106*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_KERNEL_ERR);
7107*61046927SAndroid Build Coastguard Worker 
7108*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
7109*61046927SAndroid Build Coastguard Worker         *err = error;
7110*61046927SAndroid Build Coastguard Worker     }
7111*61046927SAndroid Build Coastguard Worker 
7112*61046927SAndroid Build Coastguard Worker }
7113*61046927SAndroid Build Coastguard Worker 
7114*61046927SAndroid Build Coastguard Worker enum class QueueProperties : cl_command_queue_properties
7115*61046927SAndroid Build Coastguard Worker {
7116*61046927SAndroid Build Coastguard Worker     None = 0,
7117*61046927SAndroid Build Coastguard Worker     Profiling = CL_QUEUE_PROFILING_ENABLE,
7118*61046927SAndroid Build Coastguard Worker     OutOfOrder = CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE,
7119*61046927SAndroid Build Coastguard Worker };
7120*61046927SAndroid Build Coastguard Worker 
operator |(QueueProperties lhs,QueueProperties rhs)7121*61046927SAndroid Build Coastguard Worker inline QueueProperties operator|(QueueProperties lhs, QueueProperties rhs)
7122*61046927SAndroid Build Coastguard Worker {
7123*61046927SAndroid Build Coastguard Worker     return static_cast<QueueProperties>(static_cast<cl_command_queue_properties>(lhs) | static_cast<cl_command_queue_properties>(rhs));
7124*61046927SAndroid Build Coastguard Worker }
7125*61046927SAndroid Build Coastguard Worker 
operator &(QueueProperties lhs,QueueProperties rhs)7126*61046927SAndroid Build Coastguard Worker inline QueueProperties operator&(QueueProperties lhs, QueueProperties rhs)
7127*61046927SAndroid Build Coastguard Worker {
7128*61046927SAndroid Build Coastguard Worker     return static_cast<QueueProperties>(static_cast<cl_command_queue_properties>(lhs) & static_cast<cl_command_queue_properties>(rhs));
7129*61046927SAndroid Build Coastguard Worker }
7130*61046927SAndroid Build Coastguard Worker 
7131*61046927SAndroid Build Coastguard Worker /*! \class CommandQueue
7132*61046927SAndroid Build Coastguard Worker  * \brief CommandQueue interface for cl_command_queue.
7133*61046927SAndroid Build Coastguard Worker  */
7134*61046927SAndroid Build Coastguard Worker class CommandQueue : public detail::Wrapper<cl_command_queue>
7135*61046927SAndroid Build Coastguard Worker {
7136*61046927SAndroid Build Coastguard Worker private:
7137*61046927SAndroid Build Coastguard Worker     static std::once_flag default_initialized_;
7138*61046927SAndroid Build Coastguard Worker     static CommandQueue default_;
7139*61046927SAndroid Build Coastguard Worker     static cl_int default_error_;
7140*61046927SAndroid Build Coastguard Worker 
7141*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default command queue returned by @ref getDefault.
7142*61046927SAndroid Build Coastguard Worker      *
7143*61046927SAndroid Build Coastguard Worker      * It sets default_error_ to indicate success or failure. It does not throw
7144*61046927SAndroid Build Coastguard Worker      * @c cl::Error.
7145*61046927SAndroid Build Coastguard Worker      */
makeDefault()7146*61046927SAndroid Build Coastguard Worker     static void makeDefault()
7147*61046927SAndroid Build Coastguard Worker     {
7148*61046927SAndroid Build Coastguard Worker         /* We don't want to throw an error from this function, so we have to
7149*61046927SAndroid Build Coastguard Worker          * catch and set the error flag.
7150*61046927SAndroid Build Coastguard Worker          */
7151*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
7152*61046927SAndroid Build Coastguard Worker         try
7153*61046927SAndroid Build Coastguard Worker #endif
7154*61046927SAndroid Build Coastguard Worker         {
7155*61046927SAndroid Build Coastguard Worker             int error;
7156*61046927SAndroid Build Coastguard Worker             Context context = Context::getDefault(&error);
7157*61046927SAndroid Build Coastguard Worker 
7158*61046927SAndroid Build Coastguard Worker             if (error != CL_SUCCESS) {
7159*61046927SAndroid Build Coastguard Worker                 default_error_ = error;
7160*61046927SAndroid Build Coastguard Worker             }
7161*61046927SAndroid Build Coastguard Worker             else {
7162*61046927SAndroid Build Coastguard Worker                 Device device = Device::getDefault();
7163*61046927SAndroid Build Coastguard Worker                 default_ = CommandQueue(context, device, 0, &default_error_);
7164*61046927SAndroid Build Coastguard Worker             }
7165*61046927SAndroid Build Coastguard Worker         }
7166*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_ENABLE_EXCEPTIONS)
7167*61046927SAndroid Build Coastguard Worker         catch (cl::Error &e) {
7168*61046927SAndroid Build Coastguard Worker             default_error_ = e.err();
7169*61046927SAndroid Build Coastguard Worker         }
7170*61046927SAndroid Build Coastguard Worker #endif
7171*61046927SAndroid Build Coastguard Worker     }
7172*61046927SAndroid Build Coastguard Worker 
7173*61046927SAndroid Build Coastguard Worker     /*! \brief Create the default command queue.
7174*61046927SAndroid Build Coastguard Worker      *
7175*61046927SAndroid Build Coastguard Worker      * This sets @c default_. It does not throw
7176*61046927SAndroid Build Coastguard Worker      * @c cl::Error.
7177*61046927SAndroid Build Coastguard Worker      */
makeDefaultProvided(const CommandQueue & c)7178*61046927SAndroid Build Coastguard Worker     static void makeDefaultProvided(const CommandQueue &c) {
7179*61046927SAndroid Build Coastguard Worker         default_ = c;
7180*61046927SAndroid Build Coastguard Worker     }
7181*61046927SAndroid Build Coastguard Worker 
7182*61046927SAndroid Build Coastguard Worker public:
7183*61046927SAndroid Build Coastguard Worker #ifdef CL_HPP_UNIT_TEST_ENABLE
7184*61046927SAndroid Build Coastguard Worker     /*! \brief Reset the default.
7185*61046927SAndroid Build Coastguard Worker     *
7186*61046927SAndroid Build Coastguard Worker     * This sets @c default_ to an empty value to support cleanup in
7187*61046927SAndroid Build Coastguard Worker     * the unit test framework.
7188*61046927SAndroid Build Coastguard Worker     * This function is not thread safe.
7189*61046927SAndroid Build Coastguard Worker     */
unitTestClearDefault()7190*61046927SAndroid Build Coastguard Worker     static void unitTestClearDefault() {
7191*61046927SAndroid Build Coastguard Worker         default_ = CommandQueue();
7192*61046927SAndroid Build Coastguard Worker     }
7193*61046927SAndroid Build Coastguard Worker #endif // #ifdef CL_HPP_UNIT_TEST_ENABLE
7194*61046927SAndroid Build Coastguard Worker 
7195*61046927SAndroid Build Coastguard Worker 
7196*61046927SAndroid Build Coastguard Worker     /*!
7197*61046927SAndroid Build Coastguard Worker      * \brief Constructs a CommandQueue based on passed properties.
7198*61046927SAndroid Build Coastguard Worker      * Will return an CL_INVALID_QUEUE_PROPERTIES error if CL_QUEUE_ON_DEVICE is specified.
7199*61046927SAndroid Build Coastguard Worker      */
CommandQueue(cl_command_queue_properties properties,cl_int * err=NULL)7200*61046927SAndroid Build Coastguard Worker    CommandQueue(
7201*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties,
7202*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
7203*61046927SAndroid Build Coastguard Worker     {
7204*61046927SAndroid Build Coastguard Worker         cl_int error;
7205*61046927SAndroid Build Coastguard Worker 
7206*61046927SAndroid Build Coastguard Worker         Context context = Context::getDefault(&error);
7207*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
7208*61046927SAndroid Build Coastguard Worker 
7209*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS) {
7210*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7211*61046927SAndroid Build Coastguard Worker                 *err = error;
7212*61046927SAndroid Build Coastguard Worker             }
7213*61046927SAndroid Build Coastguard Worker         }
7214*61046927SAndroid Build Coastguard Worker         else {
7215*61046927SAndroid Build Coastguard Worker             Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
7216*61046927SAndroid Build Coastguard Worker             bool useWithProperties;
7217*61046927SAndroid Build Coastguard Worker 
7218*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
7219*61046927SAndroid Build Coastguard Worker             // Run-time decision based on the actual platform
7220*61046927SAndroid Build Coastguard Worker             {
7221*61046927SAndroid Build Coastguard Worker                 cl_uint version = detail::getContextPlatformVersion(context());
7222*61046927SAndroid Build Coastguard Worker                 useWithProperties = (version >= 0x20000); // OpenCL 2.0 or above
7223*61046927SAndroid Build Coastguard Worker             }
7224*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 200
7225*61046927SAndroid Build Coastguard Worker             useWithProperties = true;
7226*61046927SAndroid Build Coastguard Worker #else
7227*61046927SAndroid Build Coastguard Worker             useWithProperties = false;
7228*61046927SAndroid Build Coastguard Worker #endif
7229*61046927SAndroid Build Coastguard Worker 
7230*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7231*61046927SAndroid Build Coastguard Worker             if (useWithProperties) {
7232*61046927SAndroid Build Coastguard Worker                 cl_queue_properties queue_properties[] = {
7233*61046927SAndroid Build Coastguard Worker                     CL_QUEUE_PROPERTIES, properties, 0 };
7234*61046927SAndroid Build Coastguard Worker                 if ((properties & CL_QUEUE_ON_DEVICE) == 0) {
7235*61046927SAndroid Build Coastguard Worker                     object_ = ::clCreateCommandQueueWithProperties(
7236*61046927SAndroid Build Coastguard Worker                         context(), device(), queue_properties, &error);
7237*61046927SAndroid Build Coastguard Worker                 }
7238*61046927SAndroid Build Coastguard Worker                 else {
7239*61046927SAndroid Build Coastguard Worker                     error = CL_INVALID_QUEUE_PROPERTIES;
7240*61046927SAndroid Build Coastguard Worker                 }
7241*61046927SAndroid Build Coastguard Worker 
7242*61046927SAndroid Build Coastguard Worker                 detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7243*61046927SAndroid Build Coastguard Worker                 if (err != NULL) {
7244*61046927SAndroid Build Coastguard Worker                     *err = error;
7245*61046927SAndroid Build Coastguard Worker                 }
7246*61046927SAndroid Build Coastguard Worker             }
7247*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7248*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 200
7249*61046927SAndroid Build Coastguard Worker             if (!useWithProperties) {
7250*61046927SAndroid Build Coastguard Worker                 object_ = ::clCreateCommandQueue(
7251*61046927SAndroid Build Coastguard Worker                     context(), device(), properties, &error);
7252*61046927SAndroid Build Coastguard Worker 
7253*61046927SAndroid Build Coastguard Worker                 detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
7254*61046927SAndroid Build Coastguard Worker                 if (err != NULL) {
7255*61046927SAndroid Build Coastguard Worker                     *err = error;
7256*61046927SAndroid Build Coastguard Worker                 }
7257*61046927SAndroid Build Coastguard Worker             }
7258*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
7259*61046927SAndroid Build Coastguard Worker         }
7260*61046927SAndroid Build Coastguard Worker     }
7261*61046927SAndroid Build Coastguard Worker 
7262*61046927SAndroid Build Coastguard Worker    /*!
7263*61046927SAndroid Build Coastguard Worker     * \brief Constructs a CommandQueue based on passed properties.
7264*61046927SAndroid Build Coastguard Worker     * Will return an CL_INVALID_QUEUE_PROPERTIES error if CL_QUEUE_ON_DEVICE is specified.
7265*61046927SAndroid Build Coastguard Worker     */
CommandQueue(QueueProperties properties,cl_int * err=NULL)7266*61046927SAndroid Build Coastguard Worker    CommandQueue(
7267*61046927SAndroid Build Coastguard Worker        QueueProperties properties,
7268*61046927SAndroid Build Coastguard Worker        cl_int* err = NULL)
7269*61046927SAndroid Build Coastguard Worker    {
7270*61046927SAndroid Build Coastguard Worker        cl_int error;
7271*61046927SAndroid Build Coastguard Worker 
7272*61046927SAndroid Build Coastguard Worker        Context context = Context::getDefault(&error);
7273*61046927SAndroid Build Coastguard Worker        detail::errHandler(error, __CREATE_CONTEXT_ERR);
7274*61046927SAndroid Build Coastguard Worker 
7275*61046927SAndroid Build Coastguard Worker        if (error != CL_SUCCESS) {
7276*61046927SAndroid Build Coastguard Worker            if (err != NULL) {
7277*61046927SAndroid Build Coastguard Worker                *err = error;
7278*61046927SAndroid Build Coastguard Worker            }
7279*61046927SAndroid Build Coastguard Worker        }
7280*61046927SAndroid Build Coastguard Worker        else {
7281*61046927SAndroid Build Coastguard Worker            Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
7282*61046927SAndroid Build Coastguard Worker            bool useWithProperties;
7283*61046927SAndroid Build Coastguard Worker 
7284*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
7285*61046927SAndroid Build Coastguard Worker            // Run-time decision based on the actual platform
7286*61046927SAndroid Build Coastguard Worker            {
7287*61046927SAndroid Build Coastguard Worker                cl_uint version = detail::getContextPlatformVersion(context());
7288*61046927SAndroid Build Coastguard Worker                useWithProperties = (version >= 0x20000); // OpenCL 2.0 or above
7289*61046927SAndroid Build Coastguard Worker            }
7290*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 200
7291*61046927SAndroid Build Coastguard Worker            useWithProperties = true;
7292*61046927SAndroid Build Coastguard Worker #else
7293*61046927SAndroid Build Coastguard Worker            useWithProperties = false;
7294*61046927SAndroid Build Coastguard Worker #endif
7295*61046927SAndroid Build Coastguard Worker 
7296*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7297*61046927SAndroid Build Coastguard Worker            if (useWithProperties) {
7298*61046927SAndroid Build Coastguard Worker                cl_queue_properties queue_properties[] = {
7299*61046927SAndroid Build Coastguard Worker                    CL_QUEUE_PROPERTIES, static_cast<cl_queue_properties>(properties), 0 };
7300*61046927SAndroid Build Coastguard Worker 
7301*61046927SAndroid Build Coastguard Worker                object_ = ::clCreateCommandQueueWithProperties(
7302*61046927SAndroid Build Coastguard Worker                    context(), device(), queue_properties, &error);
7303*61046927SAndroid Build Coastguard Worker 
7304*61046927SAndroid Build Coastguard Worker                detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7305*61046927SAndroid Build Coastguard Worker                if (err != NULL) {
7306*61046927SAndroid Build Coastguard Worker                    *err = error;
7307*61046927SAndroid Build Coastguard Worker                }
7308*61046927SAndroid Build Coastguard Worker            }
7309*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7310*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 200
7311*61046927SAndroid Build Coastguard Worker            if (!useWithProperties) {
7312*61046927SAndroid Build Coastguard Worker                object_ = ::clCreateCommandQueue(
7313*61046927SAndroid Build Coastguard Worker                    context(), device(), static_cast<cl_command_queue_properties>(properties), &error);
7314*61046927SAndroid Build Coastguard Worker 
7315*61046927SAndroid Build Coastguard Worker                detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
7316*61046927SAndroid Build Coastguard Worker                if (err != NULL) {
7317*61046927SAndroid Build Coastguard Worker                    *err = error;
7318*61046927SAndroid Build Coastguard Worker                }
7319*61046927SAndroid Build Coastguard Worker            }
7320*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
7321*61046927SAndroid Build Coastguard Worker 
7322*61046927SAndroid Build Coastguard Worker        }
7323*61046927SAndroid Build Coastguard Worker    }
7324*61046927SAndroid Build Coastguard Worker 
7325*61046927SAndroid Build Coastguard Worker     /*!
7326*61046927SAndroid Build Coastguard Worker      * \brief Constructs a CommandQueue for an implementation defined device in the given context
7327*61046927SAndroid Build Coastguard Worker      * Will return an CL_INVALID_QUEUE_PROPERTIES error if CL_QUEUE_ON_DEVICE is specified.
7328*61046927SAndroid Build Coastguard Worker      */
CommandQueue(const Context & context,cl_command_queue_properties properties=0,cl_int * err=NULL)7329*61046927SAndroid Build Coastguard Worker     explicit CommandQueue(
7330*61046927SAndroid Build Coastguard Worker         const Context& context,
7331*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties = 0,
7332*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
7333*61046927SAndroid Build Coastguard Worker     {
7334*61046927SAndroid Build Coastguard Worker         cl_int error;
7335*61046927SAndroid Build Coastguard Worker         bool useWithProperties;
7336*61046927SAndroid Build Coastguard Worker         vector<cl::Device> devices;
7337*61046927SAndroid Build Coastguard Worker         error = context.getInfo(CL_CONTEXT_DEVICES, &devices);
7338*61046927SAndroid Build Coastguard Worker 
7339*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
7340*61046927SAndroid Build Coastguard Worker 
7341*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS)
7342*61046927SAndroid Build Coastguard Worker         {
7343*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7344*61046927SAndroid Build Coastguard Worker                 *err = error;
7345*61046927SAndroid Build Coastguard Worker             }
7346*61046927SAndroid Build Coastguard Worker             return;
7347*61046927SAndroid Build Coastguard Worker         }
7348*61046927SAndroid Build Coastguard Worker 
7349*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
7350*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
7351*61046927SAndroid Build Coastguard Worker         {
7352*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
7353*61046927SAndroid Build Coastguard Worker             useWithProperties = (version >= 0x20000); // OpenCL 2.0 or above
7354*61046927SAndroid Build Coastguard Worker         }
7355*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 200
7356*61046927SAndroid Build Coastguard Worker         useWithProperties = true;
7357*61046927SAndroid Build Coastguard Worker #else
7358*61046927SAndroid Build Coastguard Worker         useWithProperties = false;
7359*61046927SAndroid Build Coastguard Worker #endif
7360*61046927SAndroid Build Coastguard Worker 
7361*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7362*61046927SAndroid Build Coastguard Worker         if (useWithProperties) {
7363*61046927SAndroid Build Coastguard Worker             cl_queue_properties queue_properties[] = {
7364*61046927SAndroid Build Coastguard Worker                 CL_QUEUE_PROPERTIES, properties, 0 };
7365*61046927SAndroid Build Coastguard Worker             if ((properties & CL_QUEUE_ON_DEVICE) == 0) {
7366*61046927SAndroid Build Coastguard Worker                 object_ = ::clCreateCommandQueueWithProperties(
7367*61046927SAndroid Build Coastguard Worker                     context(), devices[0](), queue_properties, &error);
7368*61046927SAndroid Build Coastguard Worker             }
7369*61046927SAndroid Build Coastguard Worker             else {
7370*61046927SAndroid Build Coastguard Worker                 error = CL_INVALID_QUEUE_PROPERTIES;
7371*61046927SAndroid Build Coastguard Worker             }
7372*61046927SAndroid Build Coastguard Worker 
7373*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7374*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7375*61046927SAndroid Build Coastguard Worker                 *err = error;
7376*61046927SAndroid Build Coastguard Worker             }
7377*61046927SAndroid Build Coastguard Worker         }
7378*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7379*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 200
7380*61046927SAndroid Build Coastguard Worker         if (!useWithProperties) {
7381*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueue(
7382*61046927SAndroid Build Coastguard Worker                 context(), devices[0](), properties, &error);
7383*61046927SAndroid Build Coastguard Worker 
7384*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
7385*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7386*61046927SAndroid Build Coastguard Worker                 *err = error;
7387*61046927SAndroid Build Coastguard Worker             }
7388*61046927SAndroid Build Coastguard Worker         }
7389*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
7390*61046927SAndroid Build Coastguard Worker     }
7391*61046927SAndroid Build Coastguard Worker 
7392*61046927SAndroid Build Coastguard Worker     /*!
7393*61046927SAndroid Build Coastguard Worker     * \brief Constructs a CommandQueue for an implementation defined device in the given context
7394*61046927SAndroid Build Coastguard Worker     * Will return an CL_INVALID_QUEUE_PROPERTIES error if CL_QUEUE_ON_DEVICE is specified.
7395*61046927SAndroid Build Coastguard Worker     */
CommandQueue(const Context & context,QueueProperties properties,cl_int * err=NULL)7396*61046927SAndroid Build Coastguard Worker     explicit CommandQueue(
7397*61046927SAndroid Build Coastguard Worker         const Context& context,
7398*61046927SAndroid Build Coastguard Worker         QueueProperties properties,
7399*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
7400*61046927SAndroid Build Coastguard Worker     {
7401*61046927SAndroid Build Coastguard Worker         cl_int error;
7402*61046927SAndroid Build Coastguard Worker         bool useWithProperties;
7403*61046927SAndroid Build Coastguard Worker         vector<cl::Device> devices;
7404*61046927SAndroid Build Coastguard Worker         error = context.getInfo(CL_CONTEXT_DEVICES, &devices);
7405*61046927SAndroid Build Coastguard Worker 
7406*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_CONTEXT_ERR);
7407*61046927SAndroid Build Coastguard Worker 
7408*61046927SAndroid Build Coastguard Worker         if (error != CL_SUCCESS)
7409*61046927SAndroid Build Coastguard Worker         {
7410*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7411*61046927SAndroid Build Coastguard Worker                 *err = error;
7412*61046927SAndroid Build Coastguard Worker             }
7413*61046927SAndroid Build Coastguard Worker             return;
7414*61046927SAndroid Build Coastguard Worker         }
7415*61046927SAndroid Build Coastguard Worker 
7416*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
7417*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
7418*61046927SAndroid Build Coastguard Worker         {
7419*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
7420*61046927SAndroid Build Coastguard Worker             useWithProperties = (version >= 0x20000); // OpenCL 2.0 or above
7421*61046927SAndroid Build Coastguard Worker         }
7422*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 200
7423*61046927SAndroid Build Coastguard Worker         useWithProperties = true;
7424*61046927SAndroid Build Coastguard Worker #else
7425*61046927SAndroid Build Coastguard Worker         useWithProperties = false;
7426*61046927SAndroid Build Coastguard Worker #endif
7427*61046927SAndroid Build Coastguard Worker 
7428*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7429*61046927SAndroid Build Coastguard Worker         if (useWithProperties) {
7430*61046927SAndroid Build Coastguard Worker             cl_queue_properties queue_properties[] = {
7431*61046927SAndroid Build Coastguard Worker                 CL_QUEUE_PROPERTIES, static_cast<cl_queue_properties>(properties), 0 };
7432*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueueWithProperties(
7433*61046927SAndroid Build Coastguard Worker                 context(), devices[0](), queue_properties, &error);
7434*61046927SAndroid Build Coastguard Worker 
7435*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7436*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7437*61046927SAndroid Build Coastguard Worker                 *err = error;
7438*61046927SAndroid Build Coastguard Worker             }
7439*61046927SAndroid Build Coastguard Worker         }
7440*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7441*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 200
7442*61046927SAndroid Build Coastguard Worker         if (!useWithProperties) {
7443*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueue(
7444*61046927SAndroid Build Coastguard Worker                 context(), devices[0](), static_cast<cl_command_queue_properties>(properties), &error);
7445*61046927SAndroid Build Coastguard Worker 
7446*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
7447*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7448*61046927SAndroid Build Coastguard Worker                 *err = error;
7449*61046927SAndroid Build Coastguard Worker             }
7450*61046927SAndroid Build Coastguard Worker         }
7451*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
7452*61046927SAndroid Build Coastguard Worker     }
7453*61046927SAndroid Build Coastguard Worker 
7454*61046927SAndroid Build Coastguard Worker     /*!
7455*61046927SAndroid Build Coastguard Worker      * \brief Constructs a CommandQueue for a passed device and context
7456*61046927SAndroid Build Coastguard Worker      * Will return an CL_INVALID_QUEUE_PROPERTIES error if CL_QUEUE_ON_DEVICE is specified.
7457*61046927SAndroid Build Coastguard Worker      */
CommandQueue(const Context & context,const Device & device,cl_command_queue_properties properties=0,cl_int * err=NULL)7458*61046927SAndroid Build Coastguard Worker     CommandQueue(
7459*61046927SAndroid Build Coastguard Worker         const Context& context,
7460*61046927SAndroid Build Coastguard Worker         const Device& device,
7461*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties = 0,
7462*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
7463*61046927SAndroid Build Coastguard Worker     {
7464*61046927SAndroid Build Coastguard Worker         cl_int error;
7465*61046927SAndroid Build Coastguard Worker         bool useWithProperties;
7466*61046927SAndroid Build Coastguard Worker 
7467*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
7468*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
7469*61046927SAndroid Build Coastguard Worker         {
7470*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
7471*61046927SAndroid Build Coastguard Worker             useWithProperties = (version >= 0x20000); // OpenCL 2.0 or above
7472*61046927SAndroid Build Coastguard Worker         }
7473*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 200
7474*61046927SAndroid Build Coastguard Worker         useWithProperties = true;
7475*61046927SAndroid Build Coastguard Worker #else
7476*61046927SAndroid Build Coastguard Worker         useWithProperties = false;
7477*61046927SAndroid Build Coastguard Worker #endif
7478*61046927SAndroid Build Coastguard Worker 
7479*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7480*61046927SAndroid Build Coastguard Worker         if (useWithProperties) {
7481*61046927SAndroid Build Coastguard Worker             cl_queue_properties queue_properties[] = {
7482*61046927SAndroid Build Coastguard Worker                 CL_QUEUE_PROPERTIES, properties, 0 };
7483*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueueWithProperties(
7484*61046927SAndroid Build Coastguard Worker                 context(), device(), queue_properties, &error);
7485*61046927SAndroid Build Coastguard Worker 
7486*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7487*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7488*61046927SAndroid Build Coastguard Worker                 *err = error;
7489*61046927SAndroid Build Coastguard Worker             }
7490*61046927SAndroid Build Coastguard Worker         }
7491*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7492*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 200
7493*61046927SAndroid Build Coastguard Worker         if (!useWithProperties) {
7494*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueue(
7495*61046927SAndroid Build Coastguard Worker                 context(), device(), properties, &error);
7496*61046927SAndroid Build Coastguard Worker 
7497*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
7498*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7499*61046927SAndroid Build Coastguard Worker                 *err = error;
7500*61046927SAndroid Build Coastguard Worker             }
7501*61046927SAndroid Build Coastguard Worker         }
7502*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
7503*61046927SAndroid Build Coastguard Worker     }
7504*61046927SAndroid Build Coastguard Worker 
7505*61046927SAndroid Build Coastguard Worker     /*!
7506*61046927SAndroid Build Coastguard Worker      * \brief Constructs a CommandQueue for a passed device and context
7507*61046927SAndroid Build Coastguard Worker      * Will return an CL_INVALID_QUEUE_PROPERTIES error if CL_QUEUE_ON_DEVICE is specified.
7508*61046927SAndroid Build Coastguard Worker      */
CommandQueue(const Context & context,const Device & device,QueueProperties properties,cl_int * err=NULL)7509*61046927SAndroid Build Coastguard Worker     CommandQueue(
7510*61046927SAndroid Build Coastguard Worker         const Context& context,
7511*61046927SAndroid Build Coastguard Worker         const Device& device,
7512*61046927SAndroid Build Coastguard Worker         QueueProperties properties,
7513*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
7514*61046927SAndroid Build Coastguard Worker     {
7515*61046927SAndroid Build Coastguard Worker         cl_int error;
7516*61046927SAndroid Build Coastguard Worker         bool useWithProperties;
7517*61046927SAndroid Build Coastguard Worker 
7518*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200 && CL_HPP_MINIMUM_OPENCL_VERSION < 200
7519*61046927SAndroid Build Coastguard Worker         // Run-time decision based on the actual platform
7520*61046927SAndroid Build Coastguard Worker         {
7521*61046927SAndroid Build Coastguard Worker             cl_uint version = detail::getContextPlatformVersion(context());
7522*61046927SAndroid Build Coastguard Worker             useWithProperties = (version >= 0x20000); // OpenCL 2.0 or above
7523*61046927SAndroid Build Coastguard Worker         }
7524*61046927SAndroid Build Coastguard Worker #elif CL_HPP_TARGET_OPENCL_VERSION >= 200
7525*61046927SAndroid Build Coastguard Worker         useWithProperties = true;
7526*61046927SAndroid Build Coastguard Worker #else
7527*61046927SAndroid Build Coastguard Worker         useWithProperties = false;
7528*61046927SAndroid Build Coastguard Worker #endif
7529*61046927SAndroid Build Coastguard Worker 
7530*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7531*61046927SAndroid Build Coastguard Worker         if (useWithProperties) {
7532*61046927SAndroid Build Coastguard Worker             cl_queue_properties queue_properties[] = {
7533*61046927SAndroid Build Coastguard Worker                 CL_QUEUE_PROPERTIES, static_cast<cl_queue_properties>(properties), 0 };
7534*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueueWithProperties(
7535*61046927SAndroid Build Coastguard Worker                 context(), device(), queue_properties, &error);
7536*61046927SAndroid Build Coastguard Worker 
7537*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7538*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7539*61046927SAndroid Build Coastguard Worker                 *err = error;
7540*61046927SAndroid Build Coastguard Worker             }
7541*61046927SAndroid Build Coastguard Worker         }
7542*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7543*61046927SAndroid Build Coastguard Worker #if CL_HPP_MINIMUM_OPENCL_VERSION < 200
7544*61046927SAndroid Build Coastguard Worker         if (!useWithProperties) {
7545*61046927SAndroid Build Coastguard Worker             object_ = ::clCreateCommandQueue(
7546*61046927SAndroid Build Coastguard Worker                 context(), device(), static_cast<cl_command_queue_properties>(properties), &error);
7547*61046927SAndroid Build Coastguard Worker 
7548*61046927SAndroid Build Coastguard Worker             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
7549*61046927SAndroid Build Coastguard Worker             if (err != NULL) {
7550*61046927SAndroid Build Coastguard Worker                 *err = error;
7551*61046927SAndroid Build Coastguard Worker             }
7552*61046927SAndroid Build Coastguard Worker         }
7553*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_MINIMUM_OPENCL_VERSION < 200
7554*61046927SAndroid Build Coastguard Worker     }
7555*61046927SAndroid Build Coastguard Worker 
getDefault(cl_int * err=NULL)7556*61046927SAndroid Build Coastguard Worker     static CommandQueue getDefault(cl_int * err = NULL)
7557*61046927SAndroid Build Coastguard Worker     {
7558*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefault);
7559*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
7560*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
7561*61046927SAndroid Build Coastguard Worker #else // CL_HPP_TARGET_OPENCL_VERSION >= 200
7562*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_, __CREATE_COMMAND_QUEUE_ERR);
7563*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 200
7564*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
7565*61046927SAndroid Build Coastguard Worker             *err = default_error_;
7566*61046927SAndroid Build Coastguard Worker         }
7567*61046927SAndroid Build Coastguard Worker         return default_;
7568*61046927SAndroid Build Coastguard Worker     }
7569*61046927SAndroid Build Coastguard Worker 
7570*61046927SAndroid Build Coastguard Worker     /**
7571*61046927SAndroid Build Coastguard Worker      * Modify the default command queue to be used by
7572*61046927SAndroid Build Coastguard Worker      * subsequent operations.
7573*61046927SAndroid Build Coastguard Worker      * Will only set the default if no default was previously created.
7574*61046927SAndroid Build Coastguard Worker      * @return updated default command queue.
7575*61046927SAndroid Build Coastguard Worker      *         Should be compared to the passed value to ensure that it was updated.
7576*61046927SAndroid Build Coastguard Worker      */
setDefault(const CommandQueue & default_queue)7577*61046927SAndroid Build Coastguard Worker     static CommandQueue setDefault(const CommandQueue &default_queue)
7578*61046927SAndroid Build Coastguard Worker     {
7579*61046927SAndroid Build Coastguard Worker         std::call_once(default_initialized_, makeDefaultProvided, std::cref(default_queue));
7580*61046927SAndroid Build Coastguard Worker         detail::errHandler(default_error_);
7581*61046927SAndroid Build Coastguard Worker         return default_;
7582*61046927SAndroid Build Coastguard Worker     }
7583*61046927SAndroid Build Coastguard Worker 
CommandQueue()7584*61046927SAndroid Build Coastguard Worker     CommandQueue() { }
7585*61046927SAndroid Build Coastguard Worker 
7586*61046927SAndroid Build Coastguard Worker 
7587*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_command_queue - takes ownership.
7588*61046927SAndroid Build Coastguard Worker      *
7589*61046927SAndroid Build Coastguard Worker      * \param retainObject will cause the constructor to retain its cl object.
7590*61046927SAndroid Build Coastguard Worker      *                     Defaults to false to maintain compatibility with
7591*61046927SAndroid Build Coastguard Worker      *                     earlier versions.
7592*61046927SAndroid Build Coastguard Worker      */
CommandQueue(const cl_command_queue & commandQueue,bool retainObject=false)7593*61046927SAndroid Build Coastguard Worker     explicit CommandQueue(const cl_command_queue& commandQueue, bool retainObject = false) :
7594*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(commandQueue, retainObject) { }
7595*61046927SAndroid Build Coastguard Worker 
operator =(const cl_command_queue & rhs)7596*61046927SAndroid Build Coastguard Worker     CommandQueue& operator = (const cl_command_queue& rhs)
7597*61046927SAndroid Build Coastguard Worker     {
7598*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
7599*61046927SAndroid Build Coastguard Worker         return *this;
7600*61046927SAndroid Build Coastguard Worker     }
7601*61046927SAndroid Build Coastguard Worker 
7602*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
7603*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
7604*61046927SAndroid Build Coastguard Worker      */
CommandQueue(const CommandQueue & queue)7605*61046927SAndroid Build Coastguard Worker     CommandQueue(const CommandQueue& queue) : detail::Wrapper<cl_type>(queue) {}
7606*61046927SAndroid Build Coastguard Worker 
7607*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
7608*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
7609*61046927SAndroid Build Coastguard Worker      */
operator =(const CommandQueue & queue)7610*61046927SAndroid Build Coastguard Worker     CommandQueue& operator = (const CommandQueue &queue)
7611*61046927SAndroid Build Coastguard Worker     {
7612*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(queue);
7613*61046927SAndroid Build Coastguard Worker         return *this;
7614*61046927SAndroid Build Coastguard Worker     }
7615*61046927SAndroid Build Coastguard Worker 
7616*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
7617*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
7618*61046927SAndroid Build Coastguard Worker      */
CommandQueue(CommandQueue && queue)7619*61046927SAndroid Build Coastguard Worker     CommandQueue(CommandQueue&& queue) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(queue)) {}
7620*61046927SAndroid Build Coastguard Worker 
7621*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
7622*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
7623*61046927SAndroid Build Coastguard Worker      */
operator =(CommandQueue && queue)7624*61046927SAndroid Build Coastguard Worker     CommandQueue& operator = (CommandQueue &&queue)
7625*61046927SAndroid Build Coastguard Worker     {
7626*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(queue));
7627*61046927SAndroid Build Coastguard Worker         return *this;
7628*61046927SAndroid Build Coastguard Worker     }
7629*61046927SAndroid Build Coastguard Worker 
7630*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_command_queue_info name,T * param) const7631*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_command_queue_info name, T* param) const
7632*61046927SAndroid Build Coastguard Worker     {
7633*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
7634*61046927SAndroid Build Coastguard Worker             detail::getInfo(
7635*61046927SAndroid Build Coastguard Worker                 &::clGetCommandQueueInfo, object_, name, param),
7636*61046927SAndroid Build Coastguard Worker                 __GET_COMMAND_QUEUE_INFO_ERR);
7637*61046927SAndroid Build Coastguard Worker     }
7638*61046927SAndroid Build Coastguard Worker 
7639*61046927SAndroid Build Coastguard Worker     template <cl_command_queue_info name> typename
7640*61046927SAndroid Build Coastguard Worker     detail::param_traits<detail::cl_command_queue_info, name>::param_type
getInfo(cl_int * err=NULL) const7641*61046927SAndroid Build Coastguard Worker     getInfo(cl_int* err = NULL) const
7642*61046927SAndroid Build Coastguard Worker     {
7643*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
7644*61046927SAndroid Build Coastguard Worker             detail::cl_command_queue_info, name>::param_type param;
7645*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
7646*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
7647*61046927SAndroid Build Coastguard Worker             *err = result;
7648*61046927SAndroid Build Coastguard Worker         }
7649*61046927SAndroid Build Coastguard Worker         return param;
7650*61046927SAndroid Build Coastguard Worker     }
7651*61046927SAndroid Build Coastguard Worker 
enqueueReadBuffer(const Buffer & buffer,cl_bool blocking,size_type offset,size_type size,void * ptr,const vector<Event> * events=NULL,Event * event=NULL) const7652*61046927SAndroid Build Coastguard Worker     cl_int enqueueReadBuffer(
7653*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
7654*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
7655*61046927SAndroid Build Coastguard Worker         size_type offset,
7656*61046927SAndroid Build Coastguard Worker         size_type size,
7657*61046927SAndroid Build Coastguard Worker         void* ptr,
7658*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7659*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7660*61046927SAndroid Build Coastguard Worker     {
7661*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7662*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7663*61046927SAndroid Build Coastguard Worker             ::clEnqueueReadBuffer(
7664*61046927SAndroid Build Coastguard Worker                 object_, buffer(), blocking, offset, size,
7665*61046927SAndroid Build Coastguard Worker                 ptr,
7666*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7667*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7668*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7669*61046927SAndroid Build Coastguard Worker             __ENQUEUE_READ_BUFFER_ERR);
7670*61046927SAndroid Build Coastguard Worker 
7671*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7672*61046927SAndroid Build Coastguard Worker             *event = tmp;
7673*61046927SAndroid Build Coastguard Worker 
7674*61046927SAndroid Build Coastguard Worker         return err;
7675*61046927SAndroid Build Coastguard Worker     }
7676*61046927SAndroid Build Coastguard Worker 
enqueueWriteBuffer(const Buffer & buffer,cl_bool blocking,size_type offset,size_type size,const void * ptr,const vector<Event> * events=NULL,Event * event=NULL) const7677*61046927SAndroid Build Coastguard Worker     cl_int enqueueWriteBuffer(
7678*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
7679*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
7680*61046927SAndroid Build Coastguard Worker         size_type offset,
7681*61046927SAndroid Build Coastguard Worker         size_type size,
7682*61046927SAndroid Build Coastguard Worker         const void* ptr,
7683*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7684*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7685*61046927SAndroid Build Coastguard Worker     {
7686*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7687*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7688*61046927SAndroid Build Coastguard Worker             ::clEnqueueWriteBuffer(
7689*61046927SAndroid Build Coastguard Worker                 object_, buffer(), blocking, offset, size,
7690*61046927SAndroid Build Coastguard Worker                 ptr,
7691*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7692*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7693*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7694*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_WRITE_BUFFER_ERR);
7695*61046927SAndroid Build Coastguard Worker 
7696*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7697*61046927SAndroid Build Coastguard Worker             *event = tmp;
7698*61046927SAndroid Build Coastguard Worker 
7699*61046927SAndroid Build Coastguard Worker         return err;
7700*61046927SAndroid Build Coastguard Worker     }
7701*61046927SAndroid Build Coastguard Worker 
enqueueCopyBuffer(const Buffer & src,const Buffer & dst,size_type src_offset,size_type dst_offset,size_type size,const vector<Event> * events=NULL,Event * event=NULL) const7702*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyBuffer(
7703*61046927SAndroid Build Coastguard Worker         const Buffer& src,
7704*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
7705*61046927SAndroid Build Coastguard Worker         size_type src_offset,
7706*61046927SAndroid Build Coastguard Worker         size_type dst_offset,
7707*61046927SAndroid Build Coastguard Worker         size_type size,
7708*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7709*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7710*61046927SAndroid Build Coastguard Worker     {
7711*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7712*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7713*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyBuffer(
7714*61046927SAndroid Build Coastguard Worker                 object_, src(), dst(), src_offset, dst_offset, size,
7715*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7716*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7717*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7718*61046927SAndroid Build Coastguard Worker             __ENQEUE_COPY_BUFFER_ERR);
7719*61046927SAndroid Build Coastguard Worker 
7720*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7721*61046927SAndroid Build Coastguard Worker             *event = tmp;
7722*61046927SAndroid Build Coastguard Worker 
7723*61046927SAndroid Build Coastguard Worker         return err;
7724*61046927SAndroid Build Coastguard Worker     }
7725*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
enqueueReadBufferRect(const Buffer & buffer,cl_bool blocking,const array<size_type,3> & buffer_offset,const array<size_type,3> & host_offset,const array<size_type,3> & region,size_type buffer_row_pitch,size_type buffer_slice_pitch,size_type host_row_pitch,size_type host_slice_pitch,void * ptr,const vector<Event> * events=NULL,Event * event=NULL) const7726*61046927SAndroid Build Coastguard Worker     cl_int enqueueReadBufferRect(
7727*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
7728*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
7729*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& buffer_offset,
7730*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& host_offset,
7731*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7732*61046927SAndroid Build Coastguard Worker         size_type buffer_row_pitch,
7733*61046927SAndroid Build Coastguard Worker         size_type buffer_slice_pitch,
7734*61046927SAndroid Build Coastguard Worker         size_type host_row_pitch,
7735*61046927SAndroid Build Coastguard Worker         size_type host_slice_pitch,
7736*61046927SAndroid Build Coastguard Worker         void *ptr,
7737*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7738*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7739*61046927SAndroid Build Coastguard Worker     {
7740*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7741*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7742*61046927SAndroid Build Coastguard Worker             ::clEnqueueReadBufferRect(
7743*61046927SAndroid Build Coastguard Worker                 object_,
7744*61046927SAndroid Build Coastguard Worker                 buffer(),
7745*61046927SAndroid Build Coastguard Worker                 blocking,
7746*61046927SAndroid Build Coastguard Worker                 buffer_offset.data(),
7747*61046927SAndroid Build Coastguard Worker                 host_offset.data(),
7748*61046927SAndroid Build Coastguard Worker                 region.data(),
7749*61046927SAndroid Build Coastguard Worker                 buffer_row_pitch,
7750*61046927SAndroid Build Coastguard Worker                 buffer_slice_pitch,
7751*61046927SAndroid Build Coastguard Worker                 host_row_pitch,
7752*61046927SAndroid Build Coastguard Worker                 host_slice_pitch,
7753*61046927SAndroid Build Coastguard Worker                 ptr,
7754*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7755*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7756*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7757*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_READ_BUFFER_RECT_ERR);
7758*61046927SAndroid Build Coastguard Worker 
7759*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7760*61046927SAndroid Build Coastguard Worker             *event = tmp;
7761*61046927SAndroid Build Coastguard Worker 
7762*61046927SAndroid Build Coastguard Worker         return err;
7763*61046927SAndroid Build Coastguard Worker     }
7764*61046927SAndroid Build Coastguard Worker 
enqueueWriteBufferRect(const Buffer & buffer,cl_bool blocking,const array<size_type,3> & buffer_offset,const array<size_type,3> & host_offset,const array<size_type,3> & region,size_type buffer_row_pitch,size_type buffer_slice_pitch,size_type host_row_pitch,size_type host_slice_pitch,const void * ptr,const vector<Event> * events=NULL,Event * event=NULL) const7765*61046927SAndroid Build Coastguard Worker     cl_int enqueueWriteBufferRect(
7766*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
7767*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
7768*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& buffer_offset,
7769*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& host_offset,
7770*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7771*61046927SAndroid Build Coastguard Worker         size_type buffer_row_pitch,
7772*61046927SAndroid Build Coastguard Worker         size_type buffer_slice_pitch,
7773*61046927SAndroid Build Coastguard Worker         size_type host_row_pitch,
7774*61046927SAndroid Build Coastguard Worker         size_type host_slice_pitch,
7775*61046927SAndroid Build Coastguard Worker         const void *ptr,
7776*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7777*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7778*61046927SAndroid Build Coastguard Worker     {
7779*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7780*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7781*61046927SAndroid Build Coastguard Worker             ::clEnqueueWriteBufferRect(
7782*61046927SAndroid Build Coastguard Worker                 object_,
7783*61046927SAndroid Build Coastguard Worker                 buffer(),
7784*61046927SAndroid Build Coastguard Worker                 blocking,
7785*61046927SAndroid Build Coastguard Worker                 buffer_offset.data(),
7786*61046927SAndroid Build Coastguard Worker                 host_offset.data(),
7787*61046927SAndroid Build Coastguard Worker                 region.data(),
7788*61046927SAndroid Build Coastguard Worker                 buffer_row_pitch,
7789*61046927SAndroid Build Coastguard Worker                 buffer_slice_pitch,
7790*61046927SAndroid Build Coastguard Worker                 host_row_pitch,
7791*61046927SAndroid Build Coastguard Worker                 host_slice_pitch,
7792*61046927SAndroid Build Coastguard Worker                 ptr,
7793*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7794*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7795*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7796*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_WRITE_BUFFER_RECT_ERR);
7797*61046927SAndroid Build Coastguard Worker 
7798*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7799*61046927SAndroid Build Coastguard Worker             *event = tmp;
7800*61046927SAndroid Build Coastguard Worker 
7801*61046927SAndroid Build Coastguard Worker         return err;
7802*61046927SAndroid Build Coastguard Worker     }
7803*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferRect(const Buffer & src,const Buffer & dst,const array<size_type,3> & src_origin,const array<size_type,3> & dst_origin,const array<size_type,3> & region,size_type src_row_pitch,size_type src_slice_pitch,size_type dst_row_pitch,size_type dst_slice_pitch,const vector<Event> * events=NULL,Event * event=NULL) const7804*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyBufferRect(
7805*61046927SAndroid Build Coastguard Worker         const Buffer& src,
7806*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
7807*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& src_origin,
7808*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& dst_origin,
7809*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7810*61046927SAndroid Build Coastguard Worker         size_type src_row_pitch,
7811*61046927SAndroid Build Coastguard Worker         size_type src_slice_pitch,
7812*61046927SAndroid Build Coastguard Worker         size_type dst_row_pitch,
7813*61046927SAndroid Build Coastguard Worker         size_type dst_slice_pitch,
7814*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7815*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7816*61046927SAndroid Build Coastguard Worker     {
7817*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7818*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7819*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyBufferRect(
7820*61046927SAndroid Build Coastguard Worker                 object_,
7821*61046927SAndroid Build Coastguard Worker                 src(),
7822*61046927SAndroid Build Coastguard Worker                 dst(),
7823*61046927SAndroid Build Coastguard Worker                 src_origin.data(),
7824*61046927SAndroid Build Coastguard Worker                 dst_origin.data(),
7825*61046927SAndroid Build Coastguard Worker                 region.data(),
7826*61046927SAndroid Build Coastguard Worker                 src_row_pitch,
7827*61046927SAndroid Build Coastguard Worker                 src_slice_pitch,
7828*61046927SAndroid Build Coastguard Worker                 dst_row_pitch,
7829*61046927SAndroid Build Coastguard Worker                 dst_slice_pitch,
7830*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7831*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7832*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7833*61046927SAndroid Build Coastguard Worker             __ENQEUE_COPY_BUFFER_RECT_ERR);
7834*61046927SAndroid Build Coastguard Worker 
7835*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7836*61046927SAndroid Build Coastguard Worker             *event = tmp;
7837*61046927SAndroid Build Coastguard Worker 
7838*61046927SAndroid Build Coastguard Worker         return err;
7839*61046927SAndroid Build Coastguard Worker     }
7840*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
7841*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
7842*61046927SAndroid Build Coastguard Worker     /**
7843*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill a buffer object with a pattern
7844*61046927SAndroid Build Coastguard Worker      * of a given size. The pattern is specified as a vector type.
7845*61046927SAndroid Build Coastguard Worker      * \tparam PatternType The datatype of the pattern field.
7846*61046927SAndroid Build Coastguard Worker      *     The pattern type must be an accepted OpenCL data type.
7847*61046927SAndroid Build Coastguard Worker      * \tparam offset Is the offset in bytes into the buffer at
7848*61046927SAndroid Build Coastguard Worker      *     which to start filling. This must be a multiple of
7849*61046927SAndroid Build Coastguard Worker      *     the pattern size.
7850*61046927SAndroid Build Coastguard Worker      * \tparam size Is the size in bytes of the region to fill.
7851*61046927SAndroid Build Coastguard Worker      *     This must be a multiple of the pattern size.
7852*61046927SAndroid Build Coastguard Worker      */
7853*61046927SAndroid Build Coastguard Worker     template<typename PatternType>
enqueueFillBuffer(const Buffer & buffer,PatternType pattern,size_type offset,size_type size,const vector<Event> * events=NULL,Event * event=NULL) const7854*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillBuffer(
7855*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
7856*61046927SAndroid Build Coastguard Worker         PatternType pattern,
7857*61046927SAndroid Build Coastguard Worker         size_type offset,
7858*61046927SAndroid Build Coastguard Worker         size_type size,
7859*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7860*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7861*61046927SAndroid Build Coastguard Worker     {
7862*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7863*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7864*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillBuffer(
7865*61046927SAndroid Build Coastguard Worker                 object_,
7866*61046927SAndroid Build Coastguard Worker                 buffer(),
7867*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&pattern),
7868*61046927SAndroid Build Coastguard Worker                 sizeof(PatternType),
7869*61046927SAndroid Build Coastguard Worker                 offset,
7870*61046927SAndroid Build Coastguard Worker                 size,
7871*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7872*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7873*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7874*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_BUFFER_ERR);
7875*61046927SAndroid Build Coastguard Worker 
7876*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7877*61046927SAndroid Build Coastguard Worker             *event = tmp;
7878*61046927SAndroid Build Coastguard Worker 
7879*61046927SAndroid Build Coastguard Worker         return err;
7880*61046927SAndroid Build Coastguard Worker     }
7881*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
7882*61046927SAndroid Build Coastguard Worker 
enqueueReadImage(const Image & image,cl_bool blocking,const array<size_type,3> & origin,const array<size_type,3> & region,size_type row_pitch,size_type slice_pitch,void * ptr,const vector<Event> * events=NULL,Event * event=NULL) const7883*61046927SAndroid Build Coastguard Worker     cl_int enqueueReadImage(
7884*61046927SAndroid Build Coastguard Worker         const Image& image,
7885*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
7886*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& origin,
7887*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7888*61046927SAndroid Build Coastguard Worker         size_type row_pitch,
7889*61046927SAndroid Build Coastguard Worker         size_type slice_pitch,
7890*61046927SAndroid Build Coastguard Worker         void* ptr,
7891*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7892*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7893*61046927SAndroid Build Coastguard Worker     {
7894*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7895*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7896*61046927SAndroid Build Coastguard Worker             ::clEnqueueReadImage(
7897*61046927SAndroid Build Coastguard Worker                 object_,
7898*61046927SAndroid Build Coastguard Worker                 image(),
7899*61046927SAndroid Build Coastguard Worker                 blocking,
7900*61046927SAndroid Build Coastguard Worker                 origin.data(),
7901*61046927SAndroid Build Coastguard Worker                 region.data(),
7902*61046927SAndroid Build Coastguard Worker                 row_pitch,
7903*61046927SAndroid Build Coastguard Worker                 slice_pitch,
7904*61046927SAndroid Build Coastguard Worker                 ptr,
7905*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7906*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7907*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7908*61046927SAndroid Build Coastguard Worker             __ENQUEUE_READ_IMAGE_ERR);
7909*61046927SAndroid Build Coastguard Worker 
7910*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7911*61046927SAndroid Build Coastguard Worker             *event = tmp;
7912*61046927SAndroid Build Coastguard Worker 
7913*61046927SAndroid Build Coastguard Worker         return err;
7914*61046927SAndroid Build Coastguard Worker     }
7915*61046927SAndroid Build Coastguard Worker 
enqueueWriteImage(const Image & image,cl_bool blocking,const array<size_type,3> & origin,const array<size_type,3> & region,size_type row_pitch,size_type slice_pitch,const void * ptr,const vector<Event> * events=NULL,Event * event=NULL) const7916*61046927SAndroid Build Coastguard Worker     cl_int enqueueWriteImage(
7917*61046927SAndroid Build Coastguard Worker         const Image& image,
7918*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
7919*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& origin,
7920*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7921*61046927SAndroid Build Coastguard Worker         size_type row_pitch,
7922*61046927SAndroid Build Coastguard Worker         size_type slice_pitch,
7923*61046927SAndroid Build Coastguard Worker         const void* ptr,
7924*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7925*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7926*61046927SAndroid Build Coastguard Worker     {
7927*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7928*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7929*61046927SAndroid Build Coastguard Worker             ::clEnqueueWriteImage(
7930*61046927SAndroid Build Coastguard Worker                 object_,
7931*61046927SAndroid Build Coastguard Worker                 image(),
7932*61046927SAndroid Build Coastguard Worker                 blocking,
7933*61046927SAndroid Build Coastguard Worker                 origin.data(),
7934*61046927SAndroid Build Coastguard Worker                 region.data(),
7935*61046927SAndroid Build Coastguard Worker                 row_pitch,
7936*61046927SAndroid Build Coastguard Worker                 slice_pitch,
7937*61046927SAndroid Build Coastguard Worker                 ptr,
7938*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7939*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7940*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7941*61046927SAndroid Build Coastguard Worker             __ENQUEUE_WRITE_IMAGE_ERR);
7942*61046927SAndroid Build Coastguard Worker 
7943*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7944*61046927SAndroid Build Coastguard Worker             *event = tmp;
7945*61046927SAndroid Build Coastguard Worker 
7946*61046927SAndroid Build Coastguard Worker         return err;
7947*61046927SAndroid Build Coastguard Worker     }
7948*61046927SAndroid Build Coastguard Worker 
enqueueCopyImage(const Image & src,const Image & dst,const array<size_type,3> & src_origin,const array<size_type,3> & dst_origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL) const7949*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyImage(
7950*61046927SAndroid Build Coastguard Worker         const Image& src,
7951*61046927SAndroid Build Coastguard Worker         const Image& dst,
7952*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& src_origin,
7953*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& dst_origin,
7954*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7955*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7956*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7957*61046927SAndroid Build Coastguard Worker     {
7958*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7959*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7960*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyImage(
7961*61046927SAndroid Build Coastguard Worker                 object_,
7962*61046927SAndroid Build Coastguard Worker                 src(),
7963*61046927SAndroid Build Coastguard Worker                 dst(),
7964*61046927SAndroid Build Coastguard Worker                 src_origin.data(),
7965*61046927SAndroid Build Coastguard Worker                 dst_origin.data(),
7966*61046927SAndroid Build Coastguard Worker                 region.data(),
7967*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
7968*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
7969*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
7970*61046927SAndroid Build Coastguard Worker             __ENQUEUE_COPY_IMAGE_ERR);
7971*61046927SAndroid Build Coastguard Worker 
7972*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
7973*61046927SAndroid Build Coastguard Worker             *event = tmp;
7974*61046927SAndroid Build Coastguard Worker 
7975*61046927SAndroid Build Coastguard Worker         return err;
7976*61046927SAndroid Build Coastguard Worker     }
7977*61046927SAndroid Build Coastguard Worker 
7978*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
7979*61046927SAndroid Build Coastguard Worker     /**
7980*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill an image object with a specified color.
7981*61046927SAndroid Build Coastguard Worker      * \param fillColor is the color to use to fill the image.
7982*61046927SAndroid Build Coastguard Worker      *     This is a four component RGBA floating-point color value if
7983*61046927SAndroid Build Coastguard Worker      *     the image channel data type is not an unnormalized signed or
7984*61046927SAndroid Build Coastguard Worker      *     unsigned data type.
7985*61046927SAndroid Build Coastguard Worker      */
enqueueFillImage(const Image & image,cl_float4 fillColor,const array<size_type,3> & origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL) const7986*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillImage(
7987*61046927SAndroid Build Coastguard Worker         const Image& image,
7988*61046927SAndroid Build Coastguard Worker         cl_float4 fillColor,
7989*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& origin,
7990*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
7991*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
7992*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
7993*61046927SAndroid Build Coastguard Worker     {
7994*61046927SAndroid Build Coastguard Worker         cl_event tmp;
7995*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
7996*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillImage(
7997*61046927SAndroid Build Coastguard Worker                 object_,
7998*61046927SAndroid Build Coastguard Worker                 image(),
7999*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&fillColor),
8000*61046927SAndroid Build Coastguard Worker                 origin.data(),
8001*61046927SAndroid Build Coastguard Worker                 region.data(),
8002*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8003*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8004*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8005*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_IMAGE_ERR);
8006*61046927SAndroid Build Coastguard Worker 
8007*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8008*61046927SAndroid Build Coastguard Worker             *event = tmp;
8009*61046927SAndroid Build Coastguard Worker 
8010*61046927SAndroid Build Coastguard Worker         return err;
8011*61046927SAndroid Build Coastguard Worker     }
8012*61046927SAndroid Build Coastguard Worker 
8013*61046927SAndroid Build Coastguard Worker     /**
8014*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill an image object with a specified color.
8015*61046927SAndroid Build Coastguard Worker      * \param fillColor is the color to use to fill the image.
8016*61046927SAndroid Build Coastguard Worker      *     This is a four component RGBA signed integer color value if
8017*61046927SAndroid Build Coastguard Worker      *     the image channel data type is an unnormalized signed integer
8018*61046927SAndroid Build Coastguard Worker      *     type.
8019*61046927SAndroid Build Coastguard Worker      */
enqueueFillImage(const Image & image,cl_int4 fillColor,const array<size_type,3> & origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL) const8020*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillImage(
8021*61046927SAndroid Build Coastguard Worker         const Image& image,
8022*61046927SAndroid Build Coastguard Worker         cl_int4 fillColor,
8023*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& origin,
8024*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
8025*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8026*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8027*61046927SAndroid Build Coastguard Worker     {
8028*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8029*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8030*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillImage(
8031*61046927SAndroid Build Coastguard Worker                 object_,
8032*61046927SAndroid Build Coastguard Worker                 image(),
8033*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&fillColor),
8034*61046927SAndroid Build Coastguard Worker                 origin.data(),
8035*61046927SAndroid Build Coastguard Worker                 region.data(),
8036*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8037*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8038*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8039*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_IMAGE_ERR);
8040*61046927SAndroid Build Coastguard Worker 
8041*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8042*61046927SAndroid Build Coastguard Worker             *event = tmp;
8043*61046927SAndroid Build Coastguard Worker 
8044*61046927SAndroid Build Coastguard Worker         return err;
8045*61046927SAndroid Build Coastguard Worker     }
8046*61046927SAndroid Build Coastguard Worker 
8047*61046927SAndroid Build Coastguard Worker     /**
8048*61046927SAndroid Build Coastguard Worker      * Enqueue a command to fill an image object with a specified color.
8049*61046927SAndroid Build Coastguard Worker      * \param fillColor is the color to use to fill the image.
8050*61046927SAndroid Build Coastguard Worker      *     This is a four component RGBA unsigned integer color value if
8051*61046927SAndroid Build Coastguard Worker      *     the image channel data type is an unnormalized unsigned integer
8052*61046927SAndroid Build Coastguard Worker      *     type.
8053*61046927SAndroid Build Coastguard Worker      */
enqueueFillImage(const Image & image,cl_uint4 fillColor,const array<size_type,3> & origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL) const8054*61046927SAndroid Build Coastguard Worker     cl_int enqueueFillImage(
8055*61046927SAndroid Build Coastguard Worker         const Image& image,
8056*61046927SAndroid Build Coastguard Worker         cl_uint4 fillColor,
8057*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& origin,
8058*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
8059*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8060*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8061*61046927SAndroid Build Coastguard Worker     {
8062*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8063*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8064*61046927SAndroid Build Coastguard Worker             ::clEnqueueFillImage(
8065*61046927SAndroid Build Coastguard Worker                 object_,
8066*61046927SAndroid Build Coastguard Worker                 image(),
8067*61046927SAndroid Build Coastguard Worker                 static_cast<void*>(&fillColor),
8068*61046927SAndroid Build Coastguard Worker                 origin.data(),
8069*61046927SAndroid Build Coastguard Worker                 region.data(),
8070*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8071*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8072*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8073*61046927SAndroid Build Coastguard Worker                 __ENQUEUE_FILL_IMAGE_ERR);
8074*61046927SAndroid Build Coastguard Worker 
8075*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8076*61046927SAndroid Build Coastguard Worker             *event = tmp;
8077*61046927SAndroid Build Coastguard Worker 
8078*61046927SAndroid Build Coastguard Worker         return err;
8079*61046927SAndroid Build Coastguard Worker     }
8080*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
8081*61046927SAndroid Build Coastguard Worker 
enqueueCopyImageToBuffer(const Image & src,const Buffer & dst,const array<size_type,3> & src_origin,const array<size_type,3> & region,size_type dst_offset,const vector<Event> * events=NULL,Event * event=NULL) const8082*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyImageToBuffer(
8083*61046927SAndroid Build Coastguard Worker         const Image& src,
8084*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
8085*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& src_origin,
8086*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
8087*61046927SAndroid Build Coastguard Worker         size_type dst_offset,
8088*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8089*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8090*61046927SAndroid Build Coastguard Worker     {
8091*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8092*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8093*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyImageToBuffer(
8094*61046927SAndroid Build Coastguard Worker                 object_,
8095*61046927SAndroid Build Coastguard Worker                 src(),
8096*61046927SAndroid Build Coastguard Worker                 dst(),
8097*61046927SAndroid Build Coastguard Worker                 src_origin.data(),
8098*61046927SAndroid Build Coastguard Worker                 region.data(),
8099*61046927SAndroid Build Coastguard Worker                 dst_offset,
8100*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8101*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8102*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8103*61046927SAndroid Build Coastguard Worker             __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR);
8104*61046927SAndroid Build Coastguard Worker 
8105*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8106*61046927SAndroid Build Coastguard Worker             *event = tmp;
8107*61046927SAndroid Build Coastguard Worker 
8108*61046927SAndroid Build Coastguard Worker         return err;
8109*61046927SAndroid Build Coastguard Worker     }
8110*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferToImage(const Buffer & src,const Image & dst,size_type src_offset,const array<size_type,3> & dst_origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL) const8111*61046927SAndroid Build Coastguard Worker     cl_int enqueueCopyBufferToImage(
8112*61046927SAndroid Build Coastguard Worker         const Buffer& src,
8113*61046927SAndroid Build Coastguard Worker         const Image& dst,
8114*61046927SAndroid Build Coastguard Worker         size_type src_offset,
8115*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& dst_origin,
8116*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
8117*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8118*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8119*61046927SAndroid Build Coastguard Worker     {
8120*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8121*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8122*61046927SAndroid Build Coastguard Worker             ::clEnqueueCopyBufferToImage(
8123*61046927SAndroid Build Coastguard Worker                 object_,
8124*61046927SAndroid Build Coastguard Worker                 src(),
8125*61046927SAndroid Build Coastguard Worker                 dst(),
8126*61046927SAndroid Build Coastguard Worker                 src_offset,
8127*61046927SAndroid Build Coastguard Worker                 dst_origin.data(),
8128*61046927SAndroid Build Coastguard Worker                 region.data(),
8129*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8130*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8131*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8132*61046927SAndroid Build Coastguard Worker             __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR);
8133*61046927SAndroid Build Coastguard Worker 
8134*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8135*61046927SAndroid Build Coastguard Worker             *event = tmp;
8136*61046927SAndroid Build Coastguard Worker 
8137*61046927SAndroid Build Coastguard Worker         return err;
8138*61046927SAndroid Build Coastguard Worker     }
8139*61046927SAndroid Build Coastguard Worker 
enqueueMapBuffer(const Buffer & buffer,cl_bool blocking,cl_map_flags flags,size_type offset,size_type size,const vector<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL) const8140*61046927SAndroid Build Coastguard Worker     void* enqueueMapBuffer(
8141*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
8142*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
8143*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
8144*61046927SAndroid Build Coastguard Worker         size_type offset,
8145*61046927SAndroid Build Coastguard Worker         size_type size,
8146*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8147*61046927SAndroid Build Coastguard Worker         Event* event = NULL,
8148*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL) const
8149*61046927SAndroid Build Coastguard Worker     {
8150*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8151*61046927SAndroid Build Coastguard Worker         cl_int error;
8152*61046927SAndroid Build Coastguard Worker         void * result = ::clEnqueueMapBuffer(
8153*61046927SAndroid Build Coastguard Worker             object_, buffer(), blocking, flags, offset, size,
8154*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
8155*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8156*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL,
8157*61046927SAndroid Build Coastguard Worker             &error);
8158*61046927SAndroid Build Coastguard Worker 
8159*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
8160*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
8161*61046927SAndroid Build Coastguard Worker             *err = error;
8162*61046927SAndroid Build Coastguard Worker         }
8163*61046927SAndroid Build Coastguard Worker         if (event != NULL && error == CL_SUCCESS)
8164*61046927SAndroid Build Coastguard Worker             *event = tmp;
8165*61046927SAndroid Build Coastguard Worker 
8166*61046927SAndroid Build Coastguard Worker         return result;
8167*61046927SAndroid Build Coastguard Worker     }
8168*61046927SAndroid Build Coastguard Worker 
enqueueMapImage(const Image & buffer,cl_bool blocking,cl_map_flags flags,const array<size_type,3> & origin,const array<size_type,3> & region,size_type * row_pitch,size_type * slice_pitch,const vector<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL) const8169*61046927SAndroid Build Coastguard Worker     void* enqueueMapImage(
8170*61046927SAndroid Build Coastguard Worker         const Image& buffer,
8171*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
8172*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
8173*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& origin,
8174*61046927SAndroid Build Coastguard Worker         const array<size_type, 3>& region,
8175*61046927SAndroid Build Coastguard Worker         size_type * row_pitch,
8176*61046927SAndroid Build Coastguard Worker         size_type * slice_pitch,
8177*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8178*61046927SAndroid Build Coastguard Worker         Event* event = NULL,
8179*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL) const
8180*61046927SAndroid Build Coastguard Worker     {
8181*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8182*61046927SAndroid Build Coastguard Worker         cl_int error;
8183*61046927SAndroid Build Coastguard Worker         void * result = ::clEnqueueMapImage(
8184*61046927SAndroid Build Coastguard Worker             object_, buffer(), blocking, flags,
8185*61046927SAndroid Build Coastguard Worker             origin.data(),
8186*61046927SAndroid Build Coastguard Worker             region.data(),
8187*61046927SAndroid Build Coastguard Worker             row_pitch, slice_pitch,
8188*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
8189*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8190*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL,
8191*61046927SAndroid Build Coastguard Worker             &error);
8192*61046927SAndroid Build Coastguard Worker 
8193*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);
8194*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
8195*61046927SAndroid Build Coastguard Worker               *err = error;
8196*61046927SAndroid Build Coastguard Worker         }
8197*61046927SAndroid Build Coastguard Worker         if (event != NULL && error == CL_SUCCESS)
8198*61046927SAndroid Build Coastguard Worker             *event = tmp;
8199*61046927SAndroid Build Coastguard Worker         return result;
8200*61046927SAndroid Build Coastguard Worker     }
8201*61046927SAndroid Build Coastguard Worker 
8202*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
8203*61046927SAndroid Build Coastguard Worker     /**
8204*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host to update a region of a coarse-grained SVM buffer.
8205*61046927SAndroid Build Coastguard Worker      * This variant takes a raw SVM pointer.
8206*61046927SAndroid Build Coastguard Worker      */
8207*61046927SAndroid Build Coastguard Worker     template<typename T>
enqueueMapSVM(T * ptr,cl_bool blocking,cl_map_flags flags,size_type size,const vector<Event> * events=NULL,Event * event=NULL) const8208*61046927SAndroid Build Coastguard Worker     cl_int enqueueMapSVM(
8209*61046927SAndroid Build Coastguard Worker         T* ptr,
8210*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
8211*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
8212*61046927SAndroid Build Coastguard Worker         size_type size,
8213*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8214*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8215*61046927SAndroid Build Coastguard Worker     {
8216*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8217*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(::clEnqueueSVMMap(
8218*61046927SAndroid Build Coastguard Worker             object_, blocking, flags, static_cast<void*>(ptr), size,
8219*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8220*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8221*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8222*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MAP_BUFFER_ERR);
8223*61046927SAndroid Build Coastguard Worker 
8224*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8225*61046927SAndroid Build Coastguard Worker             *event = tmp;
8226*61046927SAndroid Build Coastguard Worker 
8227*61046927SAndroid Build Coastguard Worker         return err;
8228*61046927SAndroid Build Coastguard Worker     }
8229*61046927SAndroid Build Coastguard Worker 
8230*61046927SAndroid Build Coastguard Worker 
8231*61046927SAndroid Build Coastguard Worker     /**
8232*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host to update a region of a coarse-grained SVM buffer.
8233*61046927SAndroid Build Coastguard Worker      * This variant takes a cl::pointer instance.
8234*61046927SAndroid Build Coastguard Worker      */
8235*61046927SAndroid Build Coastguard Worker     template<typename T, class D>
enqueueMapSVM(cl::pointer<T,D> & ptr,cl_bool blocking,cl_map_flags flags,size_type size,const vector<Event> * events=NULL,Event * event=NULL) const8236*61046927SAndroid Build Coastguard Worker     cl_int enqueueMapSVM(
8237*61046927SAndroid Build Coastguard Worker         cl::pointer<T, D> &ptr,
8238*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
8239*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
8240*61046927SAndroid Build Coastguard Worker         size_type size,
8241*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8242*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8243*61046927SAndroid Build Coastguard Worker     {
8244*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8245*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(::clEnqueueSVMMap(
8246*61046927SAndroid Build Coastguard Worker             object_, blocking, flags, static_cast<void*>(ptr.get()), size,
8247*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8248*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8249*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8250*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MAP_BUFFER_ERR);
8251*61046927SAndroid Build Coastguard Worker 
8252*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8253*61046927SAndroid Build Coastguard Worker             *event = tmp;
8254*61046927SAndroid Build Coastguard Worker 
8255*61046927SAndroid Build Coastguard Worker         return err;
8256*61046927SAndroid Build Coastguard Worker     }
8257*61046927SAndroid Build Coastguard Worker 
8258*61046927SAndroid Build Coastguard Worker     /**
8259*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host to update a region of a coarse-grained SVM buffer.
8260*61046927SAndroid Build Coastguard Worker      * This variant takes a cl::vector instance.
8261*61046927SAndroid Build Coastguard Worker      */
8262*61046927SAndroid Build Coastguard Worker     template<typename T, class Alloc>
enqueueMapSVM(cl::vector<T,Alloc> & container,cl_bool blocking,cl_map_flags flags,const vector<Event> * events=NULL,Event * event=NULL) const8263*61046927SAndroid Build Coastguard Worker     cl_int enqueueMapSVM(
8264*61046927SAndroid Build Coastguard Worker         cl::vector<T, Alloc> &container,
8265*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
8266*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
8267*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8268*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8269*61046927SAndroid Build Coastguard Worker     {
8270*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8271*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(::clEnqueueSVMMap(
8272*61046927SAndroid Build Coastguard Worker             object_, blocking, flags, static_cast<void*>(container.data()), container.size()*sizeof(T),
8273*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8274*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8275*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8276*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MAP_BUFFER_ERR);
8277*61046927SAndroid Build Coastguard Worker 
8278*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8279*61046927SAndroid Build Coastguard Worker             *event = tmp;
8280*61046927SAndroid Build Coastguard Worker 
8281*61046927SAndroid Build Coastguard Worker         return err;
8282*61046927SAndroid Build Coastguard Worker     }
8283*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
8284*61046927SAndroid Build Coastguard Worker 
enqueueUnmapMemObject(const Memory & memory,void * mapped_ptr,const vector<Event> * events=NULL,Event * event=NULL) const8285*61046927SAndroid Build Coastguard Worker     cl_int enqueueUnmapMemObject(
8286*61046927SAndroid Build Coastguard Worker         const Memory& memory,
8287*61046927SAndroid Build Coastguard Worker         void* mapped_ptr,
8288*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8289*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8290*61046927SAndroid Build Coastguard Worker     {
8291*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8292*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8293*61046927SAndroid Build Coastguard Worker             ::clEnqueueUnmapMemObject(
8294*61046927SAndroid Build Coastguard Worker                 object_, memory(), mapped_ptr,
8295*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8296*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8297*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8298*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
8299*61046927SAndroid Build Coastguard Worker 
8300*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8301*61046927SAndroid Build Coastguard Worker             *event = tmp;
8302*61046927SAndroid Build Coastguard Worker 
8303*61046927SAndroid Build Coastguard Worker         return err;
8304*61046927SAndroid Build Coastguard Worker     }
8305*61046927SAndroid Build Coastguard Worker 
8306*61046927SAndroid Build Coastguard Worker 
8307*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
8308*61046927SAndroid Build Coastguard Worker     /**
8309*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will release a coarse-grained SVM buffer back to the OpenCL runtime.
8310*61046927SAndroid Build Coastguard Worker      * This variant takes a raw SVM pointer.
8311*61046927SAndroid Build Coastguard Worker      */
8312*61046927SAndroid Build Coastguard Worker     template<typename T>
enqueueUnmapSVM(T * ptr,const vector<Event> * events=NULL,Event * event=NULL) const8313*61046927SAndroid Build Coastguard Worker     cl_int enqueueUnmapSVM(
8314*61046927SAndroid Build Coastguard Worker         T* ptr,
8315*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8316*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8317*61046927SAndroid Build Coastguard Worker     {
8318*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8319*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8320*61046927SAndroid Build Coastguard Worker             ::clEnqueueSVMUnmap(
8321*61046927SAndroid Build Coastguard Worker             object_, static_cast<void*>(ptr),
8322*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8323*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8324*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8325*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
8326*61046927SAndroid Build Coastguard Worker 
8327*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8328*61046927SAndroid Build Coastguard Worker             *event = tmp;
8329*61046927SAndroid Build Coastguard Worker 
8330*61046927SAndroid Build Coastguard Worker         return err;
8331*61046927SAndroid Build Coastguard Worker     }
8332*61046927SAndroid Build Coastguard Worker 
8333*61046927SAndroid Build Coastguard Worker     /**
8334*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will release a coarse-grained SVM buffer back to the OpenCL runtime.
8335*61046927SAndroid Build Coastguard Worker      * This variant takes a cl::pointer instance.
8336*61046927SAndroid Build Coastguard Worker      */
8337*61046927SAndroid Build Coastguard Worker     template<typename T, class D>
enqueueUnmapSVM(cl::pointer<T,D> & ptr,const vector<Event> * events=NULL,Event * event=NULL) const8338*61046927SAndroid Build Coastguard Worker     cl_int enqueueUnmapSVM(
8339*61046927SAndroid Build Coastguard Worker         cl::pointer<T, D> &ptr,
8340*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8341*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8342*61046927SAndroid Build Coastguard Worker     {
8343*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8344*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8345*61046927SAndroid Build Coastguard Worker             ::clEnqueueSVMUnmap(
8346*61046927SAndroid Build Coastguard Worker             object_, static_cast<void*>(ptr.get()),
8347*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8348*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8349*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8350*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
8351*61046927SAndroid Build Coastguard Worker 
8352*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8353*61046927SAndroid Build Coastguard Worker             *event = tmp;
8354*61046927SAndroid Build Coastguard Worker 
8355*61046927SAndroid Build Coastguard Worker         return err;
8356*61046927SAndroid Build Coastguard Worker     }
8357*61046927SAndroid Build Coastguard Worker 
8358*61046927SAndroid Build Coastguard Worker     /**
8359*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will release a coarse-grained SVM buffer back to the OpenCL runtime.
8360*61046927SAndroid Build Coastguard Worker      * This variant takes a cl::vector instance.
8361*61046927SAndroid Build Coastguard Worker      */
8362*61046927SAndroid Build Coastguard Worker     template<typename T, class Alloc>
enqueueUnmapSVM(cl::vector<T,Alloc> & container,const vector<Event> * events=NULL,Event * event=NULL) const8363*61046927SAndroid Build Coastguard Worker     cl_int enqueueUnmapSVM(
8364*61046927SAndroid Build Coastguard Worker         cl::vector<T, Alloc> &container,
8365*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8366*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8367*61046927SAndroid Build Coastguard Worker     {
8368*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8369*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8370*61046927SAndroid Build Coastguard Worker             ::clEnqueueSVMUnmap(
8371*61046927SAndroid Build Coastguard Worker             object_, static_cast<void*>(container.data()),
8372*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8373*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8374*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8375*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
8376*61046927SAndroid Build Coastguard Worker 
8377*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8378*61046927SAndroid Build Coastguard Worker             *event = tmp;
8379*61046927SAndroid Build Coastguard Worker 
8380*61046927SAndroid Build Coastguard Worker         return err;
8381*61046927SAndroid Build Coastguard Worker     }
8382*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
8383*61046927SAndroid Build Coastguard Worker 
8384*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
8385*61046927SAndroid Build Coastguard Worker     /**
8386*61046927SAndroid Build Coastguard Worker      * Enqueues a marker command which waits for either a list of events to complete,
8387*61046927SAndroid Build Coastguard Worker      * or all previously enqueued commands to complete.
8388*61046927SAndroid Build Coastguard Worker      *
8389*61046927SAndroid Build Coastguard Worker      * Enqueues a marker command which waits for either a list of events to complete,
8390*61046927SAndroid Build Coastguard Worker      * or if the list is empty it waits for all commands previously enqueued in command_queue
8391*61046927SAndroid Build Coastguard Worker      * to complete before it completes. This command returns an event which can be waited on,
8392*61046927SAndroid Build Coastguard Worker      * i.e. this event can be waited on to insure that all events either in the event_wait_list
8393*61046927SAndroid Build Coastguard Worker      * or all previously enqueued commands, queued before this command to command_queue,
8394*61046927SAndroid Build Coastguard Worker      * have completed.
8395*61046927SAndroid Build Coastguard Worker      */
enqueueMarkerWithWaitList(const vector<Event> * events=0,Event * event=0) const8396*61046927SAndroid Build Coastguard Worker     cl_int enqueueMarkerWithWaitList(
8397*61046927SAndroid Build Coastguard Worker         const vector<Event> *events = 0,
8398*61046927SAndroid Build Coastguard Worker         Event *event = 0) const
8399*61046927SAndroid Build Coastguard Worker     {
8400*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8401*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8402*61046927SAndroid Build Coastguard Worker             ::clEnqueueMarkerWithWaitList(
8403*61046927SAndroid Build Coastguard Worker                 object_,
8404*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8405*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8406*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8407*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MARKER_WAIT_LIST_ERR);
8408*61046927SAndroid Build Coastguard Worker 
8409*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8410*61046927SAndroid Build Coastguard Worker             *event = tmp;
8411*61046927SAndroid Build Coastguard Worker 
8412*61046927SAndroid Build Coastguard Worker         return err;
8413*61046927SAndroid Build Coastguard Worker     }
8414*61046927SAndroid Build Coastguard Worker 
8415*61046927SAndroid Build Coastguard Worker     /**
8416*61046927SAndroid Build Coastguard Worker      * A synchronization point that enqueues a barrier operation.
8417*61046927SAndroid Build Coastguard Worker      *
8418*61046927SAndroid Build Coastguard Worker      * Enqueues a barrier command which waits for either a list of events to complete,
8419*61046927SAndroid Build Coastguard Worker      * or if the list is empty it waits for all commands previously enqueued in command_queue
8420*61046927SAndroid Build Coastguard Worker      * to complete before it completes. This command blocks command execution, that is, any
8421*61046927SAndroid Build Coastguard Worker      * following commands enqueued after it do not execute until it completes. This command
8422*61046927SAndroid Build Coastguard Worker      * returns an event which can be waited on, i.e. this event can be waited on to insure that
8423*61046927SAndroid Build Coastguard Worker      * all events either in the event_wait_list or all previously enqueued commands, queued
8424*61046927SAndroid Build Coastguard Worker      * before this command to command_queue, have completed.
8425*61046927SAndroid Build Coastguard Worker      */
enqueueBarrierWithWaitList(const vector<Event> * events=0,Event * event=0) const8426*61046927SAndroid Build Coastguard Worker     cl_int enqueueBarrierWithWaitList(
8427*61046927SAndroid Build Coastguard Worker         const vector<Event> *events = 0,
8428*61046927SAndroid Build Coastguard Worker         Event *event = 0) const
8429*61046927SAndroid Build Coastguard Worker     {
8430*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8431*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8432*61046927SAndroid Build Coastguard Worker             ::clEnqueueBarrierWithWaitList(
8433*61046927SAndroid Build Coastguard Worker                 object_,
8434*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8435*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8436*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8437*61046927SAndroid Build Coastguard Worker             __ENQUEUE_BARRIER_WAIT_LIST_ERR);
8438*61046927SAndroid Build Coastguard Worker 
8439*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8440*61046927SAndroid Build Coastguard Worker             *event = tmp;
8441*61046927SAndroid Build Coastguard Worker 
8442*61046927SAndroid Build Coastguard Worker         return err;
8443*61046927SAndroid Build Coastguard Worker     }
8444*61046927SAndroid Build Coastguard Worker 
8445*61046927SAndroid Build Coastguard Worker     /**
8446*61046927SAndroid Build Coastguard Worker      * Enqueues a command to indicate with which device a set of memory objects
8447*61046927SAndroid Build Coastguard Worker      * should be associated.
8448*61046927SAndroid Build Coastguard Worker      */
enqueueMigrateMemObjects(const vector<Memory> & memObjects,cl_mem_migration_flags flags,const vector<Event> * events=NULL,Event * event=NULL) const8449*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateMemObjects(
8450*61046927SAndroid Build Coastguard Worker         const vector<Memory> &memObjects,
8451*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags,
8452*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8453*61046927SAndroid Build Coastguard Worker         Event* event = NULL
8454*61046927SAndroid Build Coastguard Worker         ) const
8455*61046927SAndroid Build Coastguard Worker     {
8456*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8457*61046927SAndroid Build Coastguard Worker 
8458*61046927SAndroid Build Coastguard Worker         vector<cl_mem> localMemObjects(memObjects.size());
8459*61046927SAndroid Build Coastguard Worker 
8460*61046927SAndroid Build Coastguard Worker         for( int i = 0; i < (int)memObjects.size(); ++i ) {
8461*61046927SAndroid Build Coastguard Worker             localMemObjects[i] = memObjects[i]();
8462*61046927SAndroid Build Coastguard Worker         }
8463*61046927SAndroid Build Coastguard Worker 
8464*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8465*61046927SAndroid Build Coastguard Worker             ::clEnqueueMigrateMemObjects(
8466*61046927SAndroid Build Coastguard Worker                 object_,
8467*61046927SAndroid Build Coastguard Worker                 (cl_uint)memObjects.size(),
8468*61046927SAndroid Build Coastguard Worker                 localMemObjects.data(),
8469*61046927SAndroid Build Coastguard Worker                 flags,
8470*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8471*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8472*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8473*61046927SAndroid Build Coastguard Worker             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
8474*61046927SAndroid Build Coastguard Worker 
8475*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8476*61046927SAndroid Build Coastguard Worker             *event = tmp;
8477*61046927SAndroid Build Coastguard Worker 
8478*61046927SAndroid Build Coastguard Worker         return err;
8479*61046927SAndroid Build Coastguard Worker     }
8480*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
8481*61046927SAndroid Build Coastguard Worker 
8482*61046927SAndroid Build Coastguard Worker 
8483*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
8484*61046927SAndroid Build Coastguard Worker     /**
8485*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host associate ranges within a set of
8486*61046927SAndroid Build Coastguard Worker      * SVM allocations with a device.
8487*61046927SAndroid Build Coastguard Worker      * @param sizes - The length from each pointer to migrate.
8488*61046927SAndroid Build Coastguard Worker      */
8489*61046927SAndroid Build Coastguard Worker     template<typename T>
enqueueMigrateSVM(const cl::vector<T * > & svmRawPointers,const cl::vector<size_type> & sizes,cl_mem_migration_flags flags=0,const vector<Event> * events=NULL,Event * event=NULL) const8490*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateSVM(
8491*61046927SAndroid Build Coastguard Worker         const cl::vector<T*> &svmRawPointers,
8492*61046927SAndroid Build Coastguard Worker         const cl::vector<size_type> &sizes,
8493*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags = 0,
8494*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8495*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8496*61046927SAndroid Build Coastguard Worker     {
8497*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8498*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(::clEnqueueSVMMigrateMem(
8499*61046927SAndroid Build Coastguard Worker             object_,
8500*61046927SAndroid Build Coastguard Worker             svmRawPointers.size(), static_cast<void**>(svmRawPointers.data()),
8501*61046927SAndroid Build Coastguard Worker             sizes.data(), // array of sizes not passed
8502*61046927SAndroid Build Coastguard Worker             flags,
8503*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint)events->size() : 0,
8504*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
8505*61046927SAndroid Build Coastguard Worker             (event != NULL) ? &tmp : NULL),
8506*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MIGRATE_SVM_ERR);
8507*61046927SAndroid Build Coastguard Worker 
8508*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8509*61046927SAndroid Build Coastguard Worker             *event = tmp;
8510*61046927SAndroid Build Coastguard Worker 
8511*61046927SAndroid Build Coastguard Worker         return err;
8512*61046927SAndroid Build Coastguard Worker     }
8513*61046927SAndroid Build Coastguard Worker 
8514*61046927SAndroid Build Coastguard Worker     /**
8515*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host associate a set of SVM allocations with
8516*61046927SAndroid Build Coastguard Worker      * a device.
8517*61046927SAndroid Build Coastguard Worker      */
8518*61046927SAndroid Build Coastguard Worker     template<typename T>
enqueueMigrateSVM(const cl::vector<T * > & svmRawPointers,cl_mem_migration_flags flags=0,const vector<Event> * events=NULL,Event * event=NULL) const8519*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateSVM(
8520*61046927SAndroid Build Coastguard Worker         const cl::vector<T*> &svmRawPointers,
8521*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags = 0,
8522*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8523*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8524*61046927SAndroid Build Coastguard Worker     {
8525*61046927SAndroid Build Coastguard Worker         return enqueueMigrateSVM(svmRawPointers, cl::vector<size_type>(svmRawPointers.size()), flags, events, event);
8526*61046927SAndroid Build Coastguard Worker     }
8527*61046927SAndroid Build Coastguard Worker 
8528*61046927SAndroid Build Coastguard Worker 
8529*61046927SAndroid Build Coastguard Worker     /**
8530*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host associate ranges within a set of
8531*61046927SAndroid Build Coastguard Worker      * SVM allocations with a device.
8532*61046927SAndroid Build Coastguard Worker      * @param sizes - The length from each pointer to migrate.
8533*61046927SAndroid Build Coastguard Worker      */
8534*61046927SAndroid Build Coastguard Worker     template<typename T, class D>
enqueueMigrateSVM(const cl::vector<cl::pointer<T,D>> & svmPointers,const cl::vector<size_type> & sizes,cl_mem_migration_flags flags=0,const vector<Event> * events=NULL,Event * event=NULL) const8535*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateSVM(
8536*61046927SAndroid Build Coastguard Worker         const cl::vector<cl::pointer<T, D>> &svmPointers,
8537*61046927SAndroid Build Coastguard Worker         const cl::vector<size_type> &sizes,
8538*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags = 0,
8539*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8540*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8541*61046927SAndroid Build Coastguard Worker     {
8542*61046927SAndroid Build Coastguard Worker         cl::vector<void*> svmRawPointers;
8543*61046927SAndroid Build Coastguard Worker         svmRawPointers.reserve(svmPointers.size());
8544*61046927SAndroid Build Coastguard Worker         for (auto p : svmPointers) {
8545*61046927SAndroid Build Coastguard Worker             svmRawPointers.push_back(static_cast<void*>(p.get()));
8546*61046927SAndroid Build Coastguard Worker         }
8547*61046927SAndroid Build Coastguard Worker 
8548*61046927SAndroid Build Coastguard Worker         return enqueueMigrateSVM(svmRawPointers, sizes, flags, events, event);
8549*61046927SAndroid Build Coastguard Worker     }
8550*61046927SAndroid Build Coastguard Worker 
8551*61046927SAndroid Build Coastguard Worker 
8552*61046927SAndroid Build Coastguard Worker     /**
8553*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host associate a set of SVM allocations with
8554*61046927SAndroid Build Coastguard Worker      * a device.
8555*61046927SAndroid Build Coastguard Worker      */
8556*61046927SAndroid Build Coastguard Worker     template<typename T, class D>
enqueueMigrateSVM(const cl::vector<cl::pointer<T,D>> & svmPointers,cl_mem_migration_flags flags=0,const vector<Event> * events=NULL,Event * event=NULL) const8557*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateSVM(
8558*61046927SAndroid Build Coastguard Worker         const cl::vector<cl::pointer<T, D>> &svmPointers,
8559*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags = 0,
8560*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8561*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8562*61046927SAndroid Build Coastguard Worker     {
8563*61046927SAndroid Build Coastguard Worker         return enqueueMigrateSVM(svmPointers, cl::vector<size_type>(svmPointers.size()), flags, events, event);
8564*61046927SAndroid Build Coastguard Worker     }
8565*61046927SAndroid Build Coastguard Worker 
8566*61046927SAndroid Build Coastguard Worker     /**
8567*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host associate ranges within a set of
8568*61046927SAndroid Build Coastguard Worker      * SVM allocations with a device.
8569*61046927SAndroid Build Coastguard Worker      * @param sizes - The length from the beginning of each container to migrate.
8570*61046927SAndroid Build Coastguard Worker      */
8571*61046927SAndroid Build Coastguard Worker     template<typename T, class Alloc>
enqueueMigrateSVM(const cl::vector<cl::vector<T,Alloc>> & svmContainers,const cl::vector<size_type> & sizes,cl_mem_migration_flags flags=0,const vector<Event> * events=NULL,Event * event=NULL) const8572*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateSVM(
8573*61046927SAndroid Build Coastguard Worker         const cl::vector<cl::vector<T, Alloc>> &svmContainers,
8574*61046927SAndroid Build Coastguard Worker         const cl::vector<size_type> &sizes,
8575*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags = 0,
8576*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8577*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8578*61046927SAndroid Build Coastguard Worker     {
8579*61046927SAndroid Build Coastguard Worker         cl::vector<void*> svmRawPointers;
8580*61046927SAndroid Build Coastguard Worker         svmRawPointers.reserve(svmContainers.size());
8581*61046927SAndroid Build Coastguard Worker         for (auto p : svmContainers) {
8582*61046927SAndroid Build Coastguard Worker             svmRawPointers.push_back(static_cast<void*>(p.data()));
8583*61046927SAndroid Build Coastguard Worker         }
8584*61046927SAndroid Build Coastguard Worker 
8585*61046927SAndroid Build Coastguard Worker         return enqueueMigrateSVM(svmRawPointers, sizes, flags, events, event);
8586*61046927SAndroid Build Coastguard Worker     }
8587*61046927SAndroid Build Coastguard Worker 
8588*61046927SAndroid Build Coastguard Worker     /**
8589*61046927SAndroid Build Coastguard Worker      * Enqueues a command that will allow the host associate a set of SVM allocations with
8590*61046927SAndroid Build Coastguard Worker      * a device.
8591*61046927SAndroid Build Coastguard Worker      */
8592*61046927SAndroid Build Coastguard Worker     template<typename T, class Alloc>
enqueueMigrateSVM(const cl::vector<cl::vector<T,Alloc>> & svmContainers,cl_mem_migration_flags flags=0,const vector<Event> * events=NULL,Event * event=NULL) const8593*61046927SAndroid Build Coastguard Worker     cl_int enqueueMigrateSVM(
8594*61046927SAndroid Build Coastguard Worker         const cl::vector<cl::vector<T, Alloc>> &svmContainers,
8595*61046927SAndroid Build Coastguard Worker         cl_mem_migration_flags flags = 0,
8596*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8597*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8598*61046927SAndroid Build Coastguard Worker     {
8599*61046927SAndroid Build Coastguard Worker         return enqueueMigrateSVM(svmContainers, cl::vector<size_type>(svmContainers.size()), flags, events, event);
8600*61046927SAndroid Build Coastguard Worker     }
8601*61046927SAndroid Build Coastguard Worker 
8602*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
8603*61046927SAndroid Build Coastguard Worker 
enqueueNDRangeKernel(const Kernel & kernel,const NDRange & offset,const NDRange & global,const NDRange & local=NullRange,const vector<Event> * events=NULL,Event * event=NULL) const8604*61046927SAndroid Build Coastguard Worker     cl_int enqueueNDRangeKernel(
8605*61046927SAndroid Build Coastguard Worker         const Kernel& kernel,
8606*61046927SAndroid Build Coastguard Worker         const NDRange& offset,
8607*61046927SAndroid Build Coastguard Worker         const NDRange& global,
8608*61046927SAndroid Build Coastguard Worker         const NDRange& local = NullRange,
8609*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8610*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8611*61046927SAndroid Build Coastguard Worker     {
8612*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8613*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8614*61046927SAndroid Build Coastguard Worker             ::clEnqueueNDRangeKernel(
8615*61046927SAndroid Build Coastguard Worker                 object_, kernel(), (cl_uint) global.dimensions(),
8616*61046927SAndroid Build Coastguard Worker                 offset.dimensions() != 0 ? (const size_type*) offset : NULL,
8617*61046927SAndroid Build Coastguard Worker                 (const size_type*) global,
8618*61046927SAndroid Build Coastguard Worker                 local.dimensions() != 0 ? (const size_type*) local : NULL,
8619*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8620*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8621*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8622*61046927SAndroid Build Coastguard Worker             __ENQUEUE_NDRANGE_KERNEL_ERR);
8623*61046927SAndroid Build Coastguard Worker 
8624*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8625*61046927SAndroid Build Coastguard Worker             *event = tmp;
8626*61046927SAndroid Build Coastguard Worker 
8627*61046927SAndroid Build Coastguard Worker         return err;
8628*61046927SAndroid Build Coastguard Worker     }
8629*61046927SAndroid Build Coastguard Worker 
8630*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
enqueueTask(const Kernel & kernel,const vector<Event> * events=NULL,Event * event=NULL) const8631*61046927SAndroid Build Coastguard Worker     CL_API_PREFIX__VERSION_1_2_DEPRECATED cl_int enqueueTask(
8632*61046927SAndroid Build Coastguard Worker         const Kernel& kernel,
8633*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8634*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const CL_API_SUFFIX__VERSION_1_2_DEPRECATED
8635*61046927SAndroid Build Coastguard Worker     {
8636*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8637*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8638*61046927SAndroid Build Coastguard Worker             ::clEnqueueTask(
8639*61046927SAndroid Build Coastguard Worker                 object_, kernel(),
8640*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8641*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8642*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8643*61046927SAndroid Build Coastguard Worker             __ENQUEUE_TASK_ERR);
8644*61046927SAndroid Build Coastguard Worker 
8645*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8646*61046927SAndroid Build Coastguard Worker             *event = tmp;
8647*61046927SAndroid Build Coastguard Worker 
8648*61046927SAndroid Build Coastguard Worker         return err;
8649*61046927SAndroid Build Coastguard Worker     }
8650*61046927SAndroid Build Coastguard Worker #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
8651*61046927SAndroid Build Coastguard Worker 
enqueueNativeKernel(void (CL_CALLBACK * userFptr)(void *),std::pair<void *,size_type> args,const vector<Memory> * mem_objects=NULL,const vector<const void * > * mem_locs=NULL,const vector<Event> * events=NULL,Event * event=NULL) const8652*61046927SAndroid Build Coastguard Worker     cl_int enqueueNativeKernel(
8653*61046927SAndroid Build Coastguard Worker         void (CL_CALLBACK *userFptr)(void *),
8654*61046927SAndroid Build Coastguard Worker         std::pair<void*, size_type> args,
8655*61046927SAndroid Build Coastguard Worker         const vector<Memory>* mem_objects = NULL,
8656*61046927SAndroid Build Coastguard Worker         const vector<const void*>* mem_locs = NULL,
8657*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
8658*61046927SAndroid Build Coastguard Worker         Event* event = NULL) const
8659*61046927SAndroid Build Coastguard Worker     {
8660*61046927SAndroid Build Coastguard Worker         size_type elements = 0;
8661*61046927SAndroid Build Coastguard Worker         if (mem_objects != NULL) {
8662*61046927SAndroid Build Coastguard Worker             elements = mem_objects->size();
8663*61046927SAndroid Build Coastguard Worker         }
8664*61046927SAndroid Build Coastguard Worker         vector<cl_mem> mems(elements);
8665*61046927SAndroid Build Coastguard Worker         for (unsigned int i = 0; i < elements; i++) {
8666*61046927SAndroid Build Coastguard Worker             mems[i] = ((*mem_objects)[i])();
8667*61046927SAndroid Build Coastguard Worker         }
8668*61046927SAndroid Build Coastguard Worker 
8669*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8670*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8671*61046927SAndroid Build Coastguard Worker             ::clEnqueueNativeKernel(
8672*61046927SAndroid Build Coastguard Worker                 object_, userFptr, args.first, args.second,
8673*61046927SAndroid Build Coastguard Worker                 (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
8674*61046927SAndroid Build Coastguard Worker                 mems.data(),
8675*61046927SAndroid Build Coastguard Worker                 (mem_locs != NULL && mem_locs->size() > 0) ? (const void **) &mem_locs->front() : NULL,
8676*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8677*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8678*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8679*61046927SAndroid Build Coastguard Worker             __ENQUEUE_NATIVE_KERNEL);
8680*61046927SAndroid Build Coastguard Worker 
8681*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8682*61046927SAndroid Build Coastguard Worker             *event = tmp;
8683*61046927SAndroid Build Coastguard Worker 
8684*61046927SAndroid Build Coastguard Worker         return err;
8685*61046927SAndroid Build Coastguard Worker     }
8686*61046927SAndroid Build Coastguard Worker 
8687*61046927SAndroid Build Coastguard Worker /**
8688*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
8689*61046927SAndroid Build Coastguard Worker  */
8690*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
8691*61046927SAndroid Build Coastguard Worker     CL_API_PREFIX__VERSION_1_1_DEPRECATED
enqueueMarker(Event * event=NULL) const8692*61046927SAndroid Build Coastguard Worker     cl_int enqueueMarker(Event* event = NULL) const CL_API_SUFFIX__VERSION_1_1_DEPRECATED
8693*61046927SAndroid Build Coastguard Worker     {
8694*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8695*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8696*61046927SAndroid Build Coastguard Worker             ::clEnqueueMarker(
8697*61046927SAndroid Build Coastguard Worker                 object_,
8698*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8699*61046927SAndroid Build Coastguard Worker             __ENQUEUE_MARKER_ERR);
8700*61046927SAndroid Build Coastguard Worker 
8701*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8702*61046927SAndroid Build Coastguard Worker             *event = tmp;
8703*61046927SAndroid Build Coastguard Worker 
8704*61046927SAndroid Build Coastguard Worker         return err;
8705*61046927SAndroid Build Coastguard Worker     }
8706*61046927SAndroid Build Coastguard Worker 
8707*61046927SAndroid Build Coastguard Worker     CL_API_PREFIX__VERSION_1_1_DEPRECATED
enqueueWaitForEvents(const vector<Event> & events) const8708*61046927SAndroid Build Coastguard Worker     cl_int enqueueWaitForEvents(const vector<Event>& events) const CL_API_SUFFIX__VERSION_1_1_DEPRECATED
8709*61046927SAndroid Build Coastguard Worker     {
8710*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
8711*61046927SAndroid Build Coastguard Worker             ::clEnqueueWaitForEvents(
8712*61046927SAndroid Build Coastguard Worker                 object_,
8713*61046927SAndroid Build Coastguard Worker                 (cl_uint) events.size(),
8714*61046927SAndroid Build Coastguard Worker                 events.size() > 0 ? (const cl_event*) &events.front() : NULL),
8715*61046927SAndroid Build Coastguard Worker             __ENQUEUE_WAIT_FOR_EVENTS_ERR);
8716*61046927SAndroid Build Coastguard Worker     }
8717*61046927SAndroid Build Coastguard Worker #endif // defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
8718*61046927SAndroid Build Coastguard Worker 
enqueueAcquireGLObjects(const vector<Memory> * mem_objects=NULL,const vector<Event> * events=NULL,Event * event=NULL) const8719*61046927SAndroid Build Coastguard Worker     cl_int enqueueAcquireGLObjects(
8720*61046927SAndroid Build Coastguard Worker          const vector<Memory>* mem_objects = NULL,
8721*61046927SAndroid Build Coastguard Worker          const vector<Event>* events = NULL,
8722*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
8723*61046927SAndroid Build Coastguard Worker      {
8724*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8725*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8726*61046927SAndroid Build Coastguard Worker              ::clEnqueueAcquireGLObjects(
8727*61046927SAndroid Build Coastguard Worker                  object_,
8728*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
8729*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
8730*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_uint) events->size() : 0,
8731*61046927SAndroid Build Coastguard Worker                  (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8732*61046927SAndroid Build Coastguard Worker                  (event != NULL) ? &tmp : NULL),
8733*61046927SAndroid Build Coastguard Worker              __ENQUEUE_ACQUIRE_GL_ERR);
8734*61046927SAndroid Build Coastguard Worker 
8735*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8736*61046927SAndroid Build Coastguard Worker             *event = tmp;
8737*61046927SAndroid Build Coastguard Worker 
8738*61046927SAndroid Build Coastguard Worker         return err;
8739*61046927SAndroid Build Coastguard Worker      }
8740*61046927SAndroid Build Coastguard Worker 
enqueueReleaseGLObjects(const vector<Memory> * mem_objects=NULL,const vector<Event> * events=NULL,Event * event=NULL) const8741*61046927SAndroid Build Coastguard Worker     cl_int enqueueReleaseGLObjects(
8742*61046927SAndroid Build Coastguard Worker          const vector<Memory>* mem_objects = NULL,
8743*61046927SAndroid Build Coastguard Worker          const vector<Event>* events = NULL,
8744*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
8745*61046927SAndroid Build Coastguard Worker      {
8746*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8747*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8748*61046927SAndroid Build Coastguard Worker              ::clEnqueueReleaseGLObjects(
8749*61046927SAndroid Build Coastguard Worker                  object_,
8750*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
8751*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
8752*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_uint) events->size() : 0,
8753*61046927SAndroid Build Coastguard Worker                  (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8754*61046927SAndroid Build Coastguard Worker                  (event != NULL) ? &tmp : NULL),
8755*61046927SAndroid Build Coastguard Worker              __ENQUEUE_RELEASE_GL_ERR);
8756*61046927SAndroid Build Coastguard Worker 
8757*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8758*61046927SAndroid Build Coastguard Worker             *event = tmp;
8759*61046927SAndroid Build Coastguard Worker 
8760*61046927SAndroid Build Coastguard Worker         return err;
8761*61046927SAndroid Build Coastguard Worker      }
8762*61046927SAndroid Build Coastguard Worker 
8763*61046927SAndroid Build Coastguard Worker #if defined (CL_HPP_USE_DX_INTEROP)
8764*61046927SAndroid Build Coastguard Worker typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)(
8765*61046927SAndroid Build Coastguard Worker     cl_command_queue command_queue, cl_uint num_objects,
8766*61046927SAndroid Build Coastguard Worker     const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
8767*61046927SAndroid Build Coastguard Worker     const cl_event* event_wait_list, cl_event* event);
8768*61046927SAndroid Build Coastguard Worker typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
8769*61046927SAndroid Build Coastguard Worker     cl_command_queue command_queue, cl_uint num_objects,
8770*61046927SAndroid Build Coastguard Worker     const cl_mem* mem_objects,  cl_uint num_events_in_wait_list,
8771*61046927SAndroid Build Coastguard Worker     const cl_event* event_wait_list, cl_event* event);
8772*61046927SAndroid Build Coastguard Worker 
enqueueAcquireD3D10Objects(const vector<Memory> * mem_objects=NULL,const vector<Event> * events=NULL,Event * event=NULL) const8773*61046927SAndroid Build Coastguard Worker     cl_int enqueueAcquireD3D10Objects(
8774*61046927SAndroid Build Coastguard Worker          const vector<Memory>* mem_objects = NULL,
8775*61046927SAndroid Build Coastguard Worker          const vector<Event>* events = NULL,
8776*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
8777*61046927SAndroid Build Coastguard Worker     {
8778*61046927SAndroid Build Coastguard Worker         static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL;
8779*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
8780*61046927SAndroid Build Coastguard Worker         cl_context context = getInfo<CL_QUEUE_CONTEXT>();
8781*61046927SAndroid Build Coastguard Worker         cl::Device device(getInfo<CL_QUEUE_DEVICE>());
8782*61046927SAndroid Build Coastguard Worker         cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
8783*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_PLATFORM_(platform, clEnqueueAcquireD3D10ObjectsKHR);
8784*61046927SAndroid Build Coastguard Worker #endif
8785*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
8786*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clEnqueueAcquireD3D10ObjectsKHR);
8787*61046927SAndroid Build Coastguard Worker #endif
8788*61046927SAndroid Build Coastguard Worker 
8789*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8790*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8791*61046927SAndroid Build Coastguard Worker              pfn_clEnqueueAcquireD3D10ObjectsKHR(
8792*61046927SAndroid Build Coastguard Worker                  object_,
8793*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
8794*61046927SAndroid Build Coastguard Worker                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
8795*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_uint) events->size() : 0,
8796*61046927SAndroid Build Coastguard Worker                  (events != NULL) ? (cl_event*) &events->front() : NULL,
8797*61046927SAndroid Build Coastguard Worker                  (event != NULL) ? &tmp : NULL),
8798*61046927SAndroid Build Coastguard Worker              __ENQUEUE_ACQUIRE_GL_ERR);
8799*61046927SAndroid Build Coastguard Worker 
8800*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8801*61046927SAndroid Build Coastguard Worker             *event = tmp;
8802*61046927SAndroid Build Coastguard Worker 
8803*61046927SAndroid Build Coastguard Worker         return err;
8804*61046927SAndroid Build Coastguard Worker      }
8805*61046927SAndroid Build Coastguard Worker 
enqueueReleaseD3D10Objects(const vector<Memory> * mem_objects=NULL,const vector<Event> * events=NULL,Event * event=NULL) const8806*61046927SAndroid Build Coastguard Worker     cl_int enqueueReleaseD3D10Objects(
8807*61046927SAndroid Build Coastguard Worker          const vector<Memory>* mem_objects = NULL,
8808*61046927SAndroid Build Coastguard Worker          const vector<Event>* events = NULL,
8809*61046927SAndroid Build Coastguard Worker          Event* event = NULL) const
8810*61046927SAndroid Build Coastguard Worker     {
8811*61046927SAndroid Build Coastguard Worker         static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL;
8812*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 120
8813*61046927SAndroid Build Coastguard Worker         cl_context context = getInfo<CL_QUEUE_CONTEXT>();
8814*61046927SAndroid Build Coastguard Worker         cl::Device device(getInfo<CL_QUEUE_DEVICE>());
8815*61046927SAndroid Build Coastguard Worker         cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
8816*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_PLATFORM_(platform, clEnqueueReleaseD3D10ObjectsKHR);
8817*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 120
8818*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
8819*61046927SAndroid Build Coastguard Worker         CL_HPP_INIT_CL_EXT_FCN_PTR_(clEnqueueReleaseD3D10ObjectsKHR);
8820*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
8821*61046927SAndroid Build Coastguard Worker 
8822*61046927SAndroid Build Coastguard Worker         cl_event tmp;
8823*61046927SAndroid Build Coastguard Worker         cl_int err = detail::errHandler(
8824*61046927SAndroid Build Coastguard Worker             pfn_clEnqueueReleaseD3D10ObjectsKHR(
8825*61046927SAndroid Build Coastguard Worker                 object_,
8826*61046927SAndroid Build Coastguard Worker                 (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
8827*61046927SAndroid Build Coastguard Worker                 (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
8828*61046927SAndroid Build Coastguard Worker                 (events != NULL) ? (cl_uint) events->size() : 0,
8829*61046927SAndroid Build Coastguard Worker                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
8830*61046927SAndroid Build Coastguard Worker                 (event != NULL) ? &tmp : NULL),
8831*61046927SAndroid Build Coastguard Worker             __ENQUEUE_RELEASE_GL_ERR);
8832*61046927SAndroid Build Coastguard Worker 
8833*61046927SAndroid Build Coastguard Worker         if (event != NULL && err == CL_SUCCESS)
8834*61046927SAndroid Build Coastguard Worker             *event = tmp;
8835*61046927SAndroid Build Coastguard Worker 
8836*61046927SAndroid Build Coastguard Worker         return err;
8837*61046927SAndroid Build Coastguard Worker     }
8838*61046927SAndroid Build Coastguard Worker #endif
8839*61046927SAndroid Build Coastguard Worker 
8840*61046927SAndroid Build Coastguard Worker /**
8841*61046927SAndroid Build Coastguard Worker  * Deprecated APIs for 1.2
8842*61046927SAndroid Build Coastguard Worker  */
8843*61046927SAndroid Build Coastguard Worker #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
8844*61046927SAndroid Build Coastguard Worker     CL_API_PREFIX__VERSION_1_1_DEPRECATED
enqueueBarrier() const8845*61046927SAndroid Build Coastguard Worker     cl_int enqueueBarrier() const CL_API_SUFFIX__VERSION_1_1_DEPRECATED
8846*61046927SAndroid Build Coastguard Worker     {
8847*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
8848*61046927SAndroid Build Coastguard Worker             ::clEnqueueBarrier(object_),
8849*61046927SAndroid Build Coastguard Worker             __ENQUEUE_BARRIER_ERR);
8850*61046927SAndroid Build Coastguard Worker     }
8851*61046927SAndroid Build Coastguard Worker #endif // CL_USE_DEPRECATED_OPENCL_1_1_APIS
8852*61046927SAndroid Build Coastguard Worker 
flush() const8853*61046927SAndroid Build Coastguard Worker     cl_int flush() const
8854*61046927SAndroid Build Coastguard Worker     {
8855*61046927SAndroid Build Coastguard Worker         return detail::errHandler(::clFlush(object_), __FLUSH_ERR);
8856*61046927SAndroid Build Coastguard Worker     }
8857*61046927SAndroid Build Coastguard Worker 
finish() const8858*61046927SAndroid Build Coastguard Worker     cl_int finish() const
8859*61046927SAndroid Build Coastguard Worker     {
8860*61046927SAndroid Build Coastguard Worker         return detail::errHandler(::clFinish(object_), __FINISH_ERR);
8861*61046927SAndroid Build Coastguard Worker     }
8862*61046927SAndroid Build Coastguard Worker }; // CommandQueue
8863*61046927SAndroid Build Coastguard Worker 
8864*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ std::once_flag CommandQueue::default_initialized_;
8865*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ CommandQueue CommandQueue::default_;
8866*61046927SAndroid Build Coastguard Worker CL_HPP_DEFINE_STATIC_MEMBER_ cl_int CommandQueue::default_error_ = CL_SUCCESS;
8867*61046927SAndroid Build Coastguard Worker 
8868*61046927SAndroid Build Coastguard Worker 
8869*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
8870*61046927SAndroid Build Coastguard Worker enum class DeviceQueueProperties : cl_command_queue_properties
8871*61046927SAndroid Build Coastguard Worker {
8872*61046927SAndroid Build Coastguard Worker     None = 0,
8873*61046927SAndroid Build Coastguard Worker     Profiling = CL_QUEUE_PROFILING_ENABLE,
8874*61046927SAndroid Build Coastguard Worker };
8875*61046927SAndroid Build Coastguard Worker 
operator |(DeviceQueueProperties lhs,DeviceQueueProperties rhs)8876*61046927SAndroid Build Coastguard Worker inline DeviceQueueProperties operator|(DeviceQueueProperties lhs, DeviceQueueProperties rhs)
8877*61046927SAndroid Build Coastguard Worker {
8878*61046927SAndroid Build Coastguard Worker     return static_cast<DeviceQueueProperties>(static_cast<cl_command_queue_properties>(lhs) | static_cast<cl_command_queue_properties>(rhs));
8879*61046927SAndroid Build Coastguard Worker }
8880*61046927SAndroid Build Coastguard Worker 
8881*61046927SAndroid Build Coastguard Worker /*! \class DeviceCommandQueue
8882*61046927SAndroid Build Coastguard Worker  * \brief DeviceCommandQueue interface for device cl_command_queues.
8883*61046927SAndroid Build Coastguard Worker  */
8884*61046927SAndroid Build Coastguard Worker class DeviceCommandQueue : public detail::Wrapper<cl_command_queue>
8885*61046927SAndroid Build Coastguard Worker {
8886*61046927SAndroid Build Coastguard Worker public:
8887*61046927SAndroid Build Coastguard Worker 
8888*61046927SAndroid Build Coastguard Worker     /*!
8889*61046927SAndroid Build Coastguard Worker      * Trivial empty constructor to create a null queue.
8890*61046927SAndroid Build Coastguard Worker      */
DeviceCommandQueue()8891*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue() { }
8892*61046927SAndroid Build Coastguard Worker 
8893*61046927SAndroid Build Coastguard Worker     /*!
8894*61046927SAndroid Build Coastguard Worker      * Default construct device command queue on default context and device
8895*61046927SAndroid Build Coastguard Worker      */
DeviceCommandQueue(DeviceQueueProperties properties,cl_int * err=NULL)8896*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue(DeviceQueueProperties properties, cl_int* err = NULL)
8897*61046927SAndroid Build Coastguard Worker     {
8898*61046927SAndroid Build Coastguard Worker         cl_int error;
8899*61046927SAndroid Build Coastguard Worker         cl::Context context = cl::Context::getDefault();
8900*61046927SAndroid Build Coastguard Worker         cl::Device device = cl::Device::getDefault();
8901*61046927SAndroid Build Coastguard Worker 
8902*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties mergedProperties =
8903*61046927SAndroid Build Coastguard Worker             CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | static_cast<cl_command_queue_properties>(properties);
8904*61046927SAndroid Build Coastguard Worker 
8905*61046927SAndroid Build Coastguard Worker         cl_queue_properties queue_properties[] = {
8906*61046927SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, mergedProperties, 0 };
8907*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateCommandQueueWithProperties(
8908*61046927SAndroid Build Coastguard Worker             context(), device(), queue_properties, &error);
8909*61046927SAndroid Build Coastguard Worker 
8910*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
8911*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
8912*61046927SAndroid Build Coastguard Worker             *err = error;
8913*61046927SAndroid Build Coastguard Worker         }
8914*61046927SAndroid Build Coastguard Worker     }
8915*61046927SAndroid Build Coastguard Worker 
8916*61046927SAndroid Build Coastguard Worker     /*!
8917*61046927SAndroid Build Coastguard Worker      * Create a device command queue for a specified device in the passed context.
8918*61046927SAndroid Build Coastguard Worker      */
DeviceCommandQueue(const Context & context,const Device & device,DeviceQueueProperties properties=DeviceQueueProperties::None,cl_int * err=NULL)8919*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue(
8920*61046927SAndroid Build Coastguard Worker         const Context& context,
8921*61046927SAndroid Build Coastguard Worker         const Device& device,
8922*61046927SAndroid Build Coastguard Worker         DeviceQueueProperties properties = DeviceQueueProperties::None,
8923*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
8924*61046927SAndroid Build Coastguard Worker     {
8925*61046927SAndroid Build Coastguard Worker         cl_int error;
8926*61046927SAndroid Build Coastguard Worker 
8927*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties mergedProperties =
8928*61046927SAndroid Build Coastguard Worker             CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | static_cast<cl_command_queue_properties>(properties);
8929*61046927SAndroid Build Coastguard Worker         cl_queue_properties queue_properties[] = {
8930*61046927SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, mergedProperties, 0 };
8931*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateCommandQueueWithProperties(
8932*61046927SAndroid Build Coastguard Worker             context(), device(), queue_properties, &error);
8933*61046927SAndroid Build Coastguard Worker 
8934*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
8935*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
8936*61046927SAndroid Build Coastguard Worker             *err = error;
8937*61046927SAndroid Build Coastguard Worker         }
8938*61046927SAndroid Build Coastguard Worker     }
8939*61046927SAndroid Build Coastguard Worker 
8940*61046927SAndroid Build Coastguard Worker     /*!
8941*61046927SAndroid Build Coastguard Worker      * Create a device command queue for a specified device in the passed context.
8942*61046927SAndroid Build Coastguard Worker      */
DeviceCommandQueue(const Context & context,const Device & device,cl_uint queueSize,DeviceQueueProperties properties=DeviceQueueProperties::None,cl_int * err=NULL)8943*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue(
8944*61046927SAndroid Build Coastguard Worker         const Context& context,
8945*61046927SAndroid Build Coastguard Worker         const Device& device,
8946*61046927SAndroid Build Coastguard Worker         cl_uint queueSize,
8947*61046927SAndroid Build Coastguard Worker         DeviceQueueProperties properties = DeviceQueueProperties::None,
8948*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
8949*61046927SAndroid Build Coastguard Worker     {
8950*61046927SAndroid Build Coastguard Worker         cl_int error;
8951*61046927SAndroid Build Coastguard Worker 
8952*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties mergedProperties =
8953*61046927SAndroid Build Coastguard Worker             CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | static_cast<cl_command_queue_properties>(properties);
8954*61046927SAndroid Build Coastguard Worker         cl_queue_properties queue_properties[] = {
8955*61046927SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, mergedProperties,
8956*61046927SAndroid Build Coastguard Worker             CL_QUEUE_SIZE, queueSize,
8957*61046927SAndroid Build Coastguard Worker             0 };
8958*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateCommandQueueWithProperties(
8959*61046927SAndroid Build Coastguard Worker             context(), device(), queue_properties, &error);
8960*61046927SAndroid Build Coastguard Worker 
8961*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
8962*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
8963*61046927SAndroid Build Coastguard Worker             *err = error;
8964*61046927SAndroid Build Coastguard Worker         }
8965*61046927SAndroid Build Coastguard Worker     }
8966*61046927SAndroid Build Coastguard Worker 
8967*61046927SAndroid Build Coastguard Worker     /*! \brief Constructor from cl_command_queue - takes ownership.
8968*61046927SAndroid Build Coastguard Worker     *
8969*61046927SAndroid Build Coastguard Worker     * \param retainObject will cause the constructor to retain its cl object.
8970*61046927SAndroid Build Coastguard Worker     *                     Defaults to false to maintain compatibility with
8971*61046927SAndroid Build Coastguard Worker     *                     earlier versions.
8972*61046927SAndroid Build Coastguard Worker     */
DeviceCommandQueue(const cl_command_queue & commandQueue,bool retainObject=false)8973*61046927SAndroid Build Coastguard Worker     explicit DeviceCommandQueue(const cl_command_queue& commandQueue, bool retainObject = false) :
8974*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>(commandQueue, retainObject) { }
8975*61046927SAndroid Build Coastguard Worker 
operator =(const cl_command_queue & rhs)8976*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue& operator = (const cl_command_queue& rhs)
8977*61046927SAndroid Build Coastguard Worker     {
8978*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(rhs);
8979*61046927SAndroid Build Coastguard Worker         return *this;
8980*61046927SAndroid Build Coastguard Worker     }
8981*61046927SAndroid Build Coastguard Worker 
8982*61046927SAndroid Build Coastguard Worker     /*! \brief Copy constructor to forward copy to the superclass correctly.
8983*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
8984*61046927SAndroid Build Coastguard Worker      */
DeviceCommandQueue(const DeviceCommandQueue & queue)8985*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue(const DeviceCommandQueue& queue) : detail::Wrapper<cl_type>(queue) {}
8986*61046927SAndroid Build Coastguard Worker 
8987*61046927SAndroid Build Coastguard Worker     /*! \brief Copy assignment to forward copy to the superclass correctly.
8988*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
8989*61046927SAndroid Build Coastguard Worker      */
operator =(const DeviceCommandQueue & queue)8990*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue& operator = (const DeviceCommandQueue &queue)
8991*61046927SAndroid Build Coastguard Worker     {
8992*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(queue);
8993*61046927SAndroid Build Coastguard Worker         return *this;
8994*61046927SAndroid Build Coastguard Worker     }
8995*61046927SAndroid Build Coastguard Worker 
8996*61046927SAndroid Build Coastguard Worker     /*! \brief Move constructor to forward move to the superclass correctly.
8997*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
8998*61046927SAndroid Build Coastguard Worker      */
DeviceCommandQueue(DeviceCommandQueue && queue)8999*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue(DeviceCommandQueue&& queue) CL_HPP_NOEXCEPT_ : detail::Wrapper<cl_type>(std::move(queue)) {}
9000*61046927SAndroid Build Coastguard Worker 
9001*61046927SAndroid Build Coastguard Worker     /*! \brief Move assignment to forward move to the superclass correctly.
9002*61046927SAndroid Build Coastguard Worker      * Required for MSVC.
9003*61046927SAndroid Build Coastguard Worker      */
operator =(DeviceCommandQueue && queue)9004*61046927SAndroid Build Coastguard Worker     DeviceCommandQueue& operator = (DeviceCommandQueue &&queue)
9005*61046927SAndroid Build Coastguard Worker     {
9006*61046927SAndroid Build Coastguard Worker         detail::Wrapper<cl_type>::operator=(std::move(queue));
9007*61046927SAndroid Build Coastguard Worker         return *this;
9008*61046927SAndroid Build Coastguard Worker     }
9009*61046927SAndroid Build Coastguard Worker 
9010*61046927SAndroid Build Coastguard Worker     template <typename T>
getInfo(cl_command_queue_info name,T * param) const9011*61046927SAndroid Build Coastguard Worker     cl_int getInfo(cl_command_queue_info name, T* param) const
9012*61046927SAndroid Build Coastguard Worker     {
9013*61046927SAndroid Build Coastguard Worker         return detail::errHandler(
9014*61046927SAndroid Build Coastguard Worker             detail::getInfo(
9015*61046927SAndroid Build Coastguard Worker             &::clGetCommandQueueInfo, object_, name, param),
9016*61046927SAndroid Build Coastguard Worker             __GET_COMMAND_QUEUE_INFO_ERR);
9017*61046927SAndroid Build Coastguard Worker     }
9018*61046927SAndroid Build Coastguard Worker 
9019*61046927SAndroid Build Coastguard Worker     template <cl_command_queue_info name> typename
9020*61046927SAndroid Build Coastguard Worker         detail::param_traits<detail::cl_command_queue_info, name>::param_type
getInfo(cl_int * err=NULL) const9021*61046927SAndroid Build Coastguard Worker         getInfo(cl_int* err = NULL) const
9022*61046927SAndroid Build Coastguard Worker     {
9023*61046927SAndroid Build Coastguard Worker         typename detail::param_traits<
9024*61046927SAndroid Build Coastguard Worker             detail::cl_command_queue_info, name>::param_type param;
9025*61046927SAndroid Build Coastguard Worker         cl_int result = getInfo(name, &param);
9026*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9027*61046927SAndroid Build Coastguard Worker             *err = result;
9028*61046927SAndroid Build Coastguard Worker         }
9029*61046927SAndroid Build Coastguard Worker         return param;
9030*61046927SAndroid Build Coastguard Worker     }
9031*61046927SAndroid Build Coastguard Worker 
9032*61046927SAndroid Build Coastguard Worker     /*!
9033*61046927SAndroid Build Coastguard Worker      * Create a new default device command queue for the default device,
9034*61046927SAndroid Build Coastguard Worker      * in the default context and of the default size.
9035*61046927SAndroid Build Coastguard Worker      * If there is already a default queue for the specified device this
9036*61046927SAndroid Build Coastguard Worker      * function will return the pre-existing queue.
9037*61046927SAndroid Build Coastguard Worker      */
makeDefault(cl_int * err=nullptr)9038*61046927SAndroid Build Coastguard Worker     static DeviceCommandQueue makeDefault(
9039*61046927SAndroid Build Coastguard Worker         cl_int *err = nullptr)
9040*61046927SAndroid Build Coastguard Worker     {
9041*61046927SAndroid Build Coastguard Worker         cl_int error;
9042*61046927SAndroid Build Coastguard Worker         cl::Context context = cl::Context::getDefault();
9043*61046927SAndroid Build Coastguard Worker         cl::Device device = cl::Device::getDefault();
9044*61046927SAndroid Build Coastguard Worker 
9045*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties =
9046*61046927SAndroid Build Coastguard Worker             CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT;
9047*61046927SAndroid Build Coastguard Worker         cl_queue_properties queue_properties[] = {
9048*61046927SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, properties,
9049*61046927SAndroid Build Coastguard Worker             0 };
9050*61046927SAndroid Build Coastguard Worker         DeviceCommandQueue deviceQueue(
9051*61046927SAndroid Build Coastguard Worker             ::clCreateCommandQueueWithProperties(
9052*61046927SAndroid Build Coastguard Worker             context(), device(), queue_properties, &error));
9053*61046927SAndroid Build Coastguard Worker 
9054*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
9055*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9056*61046927SAndroid Build Coastguard Worker             *err = error;
9057*61046927SAndroid Build Coastguard Worker         }
9058*61046927SAndroid Build Coastguard Worker 
9059*61046927SAndroid Build Coastguard Worker         return deviceQueue;
9060*61046927SAndroid Build Coastguard Worker     }
9061*61046927SAndroid Build Coastguard Worker 
9062*61046927SAndroid Build Coastguard Worker     /*!
9063*61046927SAndroid Build Coastguard Worker      * Create a new default device command queue for the specified device
9064*61046927SAndroid Build Coastguard Worker      * and of the default size.
9065*61046927SAndroid Build Coastguard Worker      * If there is already a default queue for the specified device this
9066*61046927SAndroid Build Coastguard Worker      * function will return the pre-existing queue.
9067*61046927SAndroid Build Coastguard Worker      */
makeDefault(const Context & context,const Device & device,cl_int * err=nullptr)9068*61046927SAndroid Build Coastguard Worker     static DeviceCommandQueue makeDefault(
9069*61046927SAndroid Build Coastguard Worker         const Context &context, const Device &device, cl_int *err = nullptr)
9070*61046927SAndroid Build Coastguard Worker     {
9071*61046927SAndroid Build Coastguard Worker         cl_int error;
9072*61046927SAndroid Build Coastguard Worker 
9073*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties =
9074*61046927SAndroid Build Coastguard Worker             CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT;
9075*61046927SAndroid Build Coastguard Worker         cl_queue_properties queue_properties[] = {
9076*61046927SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, properties,
9077*61046927SAndroid Build Coastguard Worker             0 };
9078*61046927SAndroid Build Coastguard Worker         DeviceCommandQueue deviceQueue(
9079*61046927SAndroid Build Coastguard Worker             ::clCreateCommandQueueWithProperties(
9080*61046927SAndroid Build Coastguard Worker             context(), device(), queue_properties, &error));
9081*61046927SAndroid Build Coastguard Worker 
9082*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
9083*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9084*61046927SAndroid Build Coastguard Worker             *err = error;
9085*61046927SAndroid Build Coastguard Worker         }
9086*61046927SAndroid Build Coastguard Worker 
9087*61046927SAndroid Build Coastguard Worker         return deviceQueue;
9088*61046927SAndroid Build Coastguard Worker     }
9089*61046927SAndroid Build Coastguard Worker 
9090*61046927SAndroid Build Coastguard Worker     /*!
9091*61046927SAndroid Build Coastguard Worker      * Create a new default device command queue for the specified device
9092*61046927SAndroid Build Coastguard Worker      * and of the requested size in bytes.
9093*61046927SAndroid Build Coastguard Worker      * If there is already a default queue for the specified device this
9094*61046927SAndroid Build Coastguard Worker      * function will return the pre-existing queue.
9095*61046927SAndroid Build Coastguard Worker      */
makeDefault(const Context & context,const Device & device,cl_uint queueSize,cl_int * err=nullptr)9096*61046927SAndroid Build Coastguard Worker     static DeviceCommandQueue makeDefault(
9097*61046927SAndroid Build Coastguard Worker         const Context &context, const Device &device, cl_uint queueSize, cl_int *err = nullptr)
9098*61046927SAndroid Build Coastguard Worker     {
9099*61046927SAndroid Build Coastguard Worker         cl_int error;
9100*61046927SAndroid Build Coastguard Worker 
9101*61046927SAndroid Build Coastguard Worker         cl_command_queue_properties properties =
9102*61046927SAndroid Build Coastguard Worker             CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT;
9103*61046927SAndroid Build Coastguard Worker         cl_queue_properties queue_properties[] = {
9104*61046927SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, properties,
9105*61046927SAndroid Build Coastguard Worker             CL_QUEUE_SIZE, queueSize,
9106*61046927SAndroid Build Coastguard Worker             0 };
9107*61046927SAndroid Build Coastguard Worker         DeviceCommandQueue deviceQueue(
9108*61046927SAndroid Build Coastguard Worker             ::clCreateCommandQueueWithProperties(
9109*61046927SAndroid Build Coastguard Worker                 context(), device(), queue_properties, &error));
9110*61046927SAndroid Build Coastguard Worker 
9111*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR);
9112*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9113*61046927SAndroid Build Coastguard Worker             *err = error;
9114*61046927SAndroid Build Coastguard Worker         }
9115*61046927SAndroid Build Coastguard Worker 
9116*61046927SAndroid Build Coastguard Worker         return deviceQueue;
9117*61046927SAndroid Build Coastguard Worker     }
9118*61046927SAndroid Build Coastguard Worker 
9119*61046927SAndroid Build Coastguard Worker 
9120*61046927SAndroid Build Coastguard Worker 
9121*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 210
9122*61046927SAndroid Build Coastguard Worker     /*!
9123*61046927SAndroid Build Coastguard Worker      * Modify the default device command queue to be used for subsequent kernels.
9124*61046927SAndroid Build Coastguard Worker      * This can update the default command queue for a device repeatedly to account
9125*61046927SAndroid Build Coastguard Worker      * for kernels that rely on the default.
9126*61046927SAndroid Build Coastguard Worker      * @return updated default device command queue.
9127*61046927SAndroid Build Coastguard Worker      */
updateDefault(const Context & context,const Device & device,const DeviceCommandQueue & default_queue,cl_int * err=nullptr)9128*61046927SAndroid Build Coastguard Worker     static DeviceCommandQueue updateDefault(const Context &context, const Device &device, const DeviceCommandQueue &default_queue, cl_int *err = nullptr)
9129*61046927SAndroid Build Coastguard Worker     {
9130*61046927SAndroid Build Coastguard Worker         cl_int error;
9131*61046927SAndroid Build Coastguard Worker         error = clSetDefaultDeviceCommandQueue(context.get(), device.get(), default_queue.get());
9132*61046927SAndroid Build Coastguard Worker 
9133*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __SET_DEFAULT_DEVICE_COMMAND_QUEUE_ERR);
9134*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9135*61046927SAndroid Build Coastguard Worker             *err = error;
9136*61046927SAndroid Build Coastguard Worker         }
9137*61046927SAndroid Build Coastguard Worker         return default_queue;
9138*61046927SAndroid Build Coastguard Worker     }
9139*61046927SAndroid Build Coastguard Worker 
9140*61046927SAndroid Build Coastguard Worker     /*!
9141*61046927SAndroid Build Coastguard Worker      * Return the current default command queue for the specified command queue
9142*61046927SAndroid Build Coastguard Worker      */
getDefault(const CommandQueue & queue,cl_int * err=NULL)9143*61046927SAndroid Build Coastguard Worker     static DeviceCommandQueue getDefault(const CommandQueue &queue, cl_int * err = NULL)
9144*61046927SAndroid Build Coastguard Worker     {
9145*61046927SAndroid Build Coastguard Worker         return queue.getInfo<CL_QUEUE_DEVICE_DEFAULT>(err);
9146*61046927SAndroid Build Coastguard Worker     }
9147*61046927SAndroid Build Coastguard Worker 
9148*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 210
9149*61046927SAndroid Build Coastguard Worker }; // DeviceCommandQueue
9150*61046927SAndroid Build Coastguard Worker 
9151*61046927SAndroid Build Coastguard Worker namespace detail
9152*61046927SAndroid Build Coastguard Worker {
9153*61046927SAndroid Build Coastguard Worker     // Specialization for device command queue
9154*61046927SAndroid Build Coastguard Worker     template <>
9155*61046927SAndroid Build Coastguard Worker     struct KernelArgumentHandler<cl::DeviceCommandQueue, void>
9156*61046927SAndroid Build Coastguard Worker     {
sizecl::detail::KernelArgumentHandler9157*61046927SAndroid Build Coastguard Worker         static size_type size(const cl::DeviceCommandQueue&) { return sizeof(cl_command_queue); }
ptrcl::detail::KernelArgumentHandler9158*61046927SAndroid Build Coastguard Worker         static const cl_command_queue* ptr(const cl::DeviceCommandQueue& value) { return &(value()); }
9159*61046927SAndroid Build Coastguard Worker     };
9160*61046927SAndroid Build Coastguard Worker } // namespace detail
9161*61046927SAndroid Build Coastguard Worker 
9162*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9163*61046927SAndroid Build Coastguard Worker 
9164*61046927SAndroid Build Coastguard Worker 
9165*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
Buffer(const Context & context,IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr,cl_int * err)9166*61046927SAndroid Build Coastguard Worker Buffer::Buffer(
9167*61046927SAndroid Build Coastguard Worker     const Context &context,
9168*61046927SAndroid Build Coastguard Worker     IteratorType startIterator,
9169*61046927SAndroid Build Coastguard Worker     IteratorType endIterator,
9170*61046927SAndroid Build Coastguard Worker     bool readOnly,
9171*61046927SAndroid Build Coastguard Worker     bool useHostPtr,
9172*61046927SAndroid Build Coastguard Worker     cl_int* err)
9173*61046927SAndroid Build Coastguard Worker {
9174*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
9175*61046927SAndroid Build Coastguard Worker     cl_int error;
9176*61046927SAndroid Build Coastguard Worker 
9177*61046927SAndroid Build Coastguard Worker     cl_mem_flags flags = 0;
9178*61046927SAndroid Build Coastguard Worker     if( readOnly ) {
9179*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_ONLY;
9180*61046927SAndroid Build Coastguard Worker     }
9181*61046927SAndroid Build Coastguard Worker     else {
9182*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_WRITE;
9183*61046927SAndroid Build Coastguard Worker     }
9184*61046927SAndroid Build Coastguard Worker     if( useHostPtr ) {
9185*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_USE_HOST_PTR;
9186*61046927SAndroid Build Coastguard Worker     }
9187*61046927SAndroid Build Coastguard Worker 
9188*61046927SAndroid Build Coastguard Worker     size_type size = sizeof(DataType)*(endIterator - startIterator);
9189*61046927SAndroid Build Coastguard Worker 
9190*61046927SAndroid Build Coastguard Worker     if( useHostPtr ) {
9191*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, const_cast<DataType*>(&*startIterator), &error);
9192*61046927SAndroid Build Coastguard Worker     } else {
9193*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
9194*61046927SAndroid Build Coastguard Worker     }
9195*61046927SAndroid Build Coastguard Worker 
9196*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_BUFFER_ERR);
9197*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
9198*61046927SAndroid Build Coastguard Worker         *err = error;
9199*61046927SAndroid Build Coastguard Worker     }
9200*61046927SAndroid Build Coastguard Worker 
9201*61046927SAndroid Build Coastguard Worker     if( !useHostPtr ) {
9202*61046927SAndroid Build Coastguard Worker         CommandQueue queue(context, 0, &error);
9203*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
9204*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9205*61046927SAndroid Build Coastguard Worker             *err = error;
9206*61046927SAndroid Build Coastguard Worker         }
9207*61046927SAndroid Build Coastguard Worker 
9208*61046927SAndroid Build Coastguard Worker         error = cl::copy(queue, startIterator, endIterator, *this);
9209*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
9210*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9211*61046927SAndroid Build Coastguard Worker             *err = error;
9212*61046927SAndroid Build Coastguard Worker         }
9213*61046927SAndroid Build Coastguard Worker     }
9214*61046927SAndroid Build Coastguard Worker }
9215*61046927SAndroid Build Coastguard Worker 
9216*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
Buffer(const CommandQueue & queue,IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr,cl_int * err)9217*61046927SAndroid Build Coastguard Worker Buffer::Buffer(
9218*61046927SAndroid Build Coastguard Worker     const CommandQueue &queue,
9219*61046927SAndroid Build Coastguard Worker     IteratorType startIterator,
9220*61046927SAndroid Build Coastguard Worker     IteratorType endIterator,
9221*61046927SAndroid Build Coastguard Worker     bool readOnly,
9222*61046927SAndroid Build Coastguard Worker     bool useHostPtr,
9223*61046927SAndroid Build Coastguard Worker     cl_int* err)
9224*61046927SAndroid Build Coastguard Worker {
9225*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
9226*61046927SAndroid Build Coastguard Worker     cl_int error;
9227*61046927SAndroid Build Coastguard Worker 
9228*61046927SAndroid Build Coastguard Worker     cl_mem_flags flags = 0;
9229*61046927SAndroid Build Coastguard Worker     if (readOnly) {
9230*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_ONLY;
9231*61046927SAndroid Build Coastguard Worker     }
9232*61046927SAndroid Build Coastguard Worker     else {
9233*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_READ_WRITE;
9234*61046927SAndroid Build Coastguard Worker     }
9235*61046927SAndroid Build Coastguard Worker     if (useHostPtr) {
9236*61046927SAndroid Build Coastguard Worker         flags |= CL_MEM_USE_HOST_PTR;
9237*61046927SAndroid Build Coastguard Worker     }
9238*61046927SAndroid Build Coastguard Worker 
9239*61046927SAndroid Build Coastguard Worker     size_type size = sizeof(DataType)*(endIterator - startIterator);
9240*61046927SAndroid Build Coastguard Worker 
9241*61046927SAndroid Build Coastguard Worker     Context context = queue.getInfo<CL_QUEUE_CONTEXT>();
9242*61046927SAndroid Build Coastguard Worker 
9243*61046927SAndroid Build Coastguard Worker     if (useHostPtr) {
9244*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, const_cast<DataType*>(&*startIterator), &error);
9245*61046927SAndroid Build Coastguard Worker     }
9246*61046927SAndroid Build Coastguard Worker     else {
9247*61046927SAndroid Build Coastguard Worker         object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
9248*61046927SAndroid Build Coastguard Worker     }
9249*61046927SAndroid Build Coastguard Worker 
9250*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __CREATE_BUFFER_ERR);
9251*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
9252*61046927SAndroid Build Coastguard Worker         *err = error;
9253*61046927SAndroid Build Coastguard Worker     }
9254*61046927SAndroid Build Coastguard Worker 
9255*61046927SAndroid Build Coastguard Worker     if (!useHostPtr) {
9256*61046927SAndroid Build Coastguard Worker         error = cl::copy(queue, startIterator, endIterator, *this);
9257*61046927SAndroid Build Coastguard Worker         detail::errHandler(error, __CREATE_BUFFER_ERR);
9258*61046927SAndroid Build Coastguard Worker         if (err != NULL) {
9259*61046927SAndroid Build Coastguard Worker             *err = error;
9260*61046927SAndroid Build Coastguard Worker         }
9261*61046927SAndroid Build Coastguard Worker     }
9262*61046927SAndroid Build Coastguard Worker }
9263*61046927SAndroid Build Coastguard Worker 
enqueueReadBuffer(const Buffer & buffer,cl_bool blocking,size_type offset,size_type size,void * ptr,const vector<Event> * events=NULL,Event * event=NULL)9264*61046927SAndroid Build Coastguard Worker inline cl_int enqueueReadBuffer(
9265*61046927SAndroid Build Coastguard Worker     const Buffer& buffer,
9266*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9267*61046927SAndroid Build Coastguard Worker     size_type offset,
9268*61046927SAndroid Build Coastguard Worker     size_type size,
9269*61046927SAndroid Build Coastguard Worker     void* ptr,
9270*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9271*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9272*61046927SAndroid Build Coastguard Worker {
9273*61046927SAndroid Build Coastguard Worker     cl_int error;
9274*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9275*61046927SAndroid Build Coastguard Worker 
9276*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9277*61046927SAndroid Build Coastguard Worker         return error;
9278*61046927SAndroid Build Coastguard Worker     }
9279*61046927SAndroid Build Coastguard Worker 
9280*61046927SAndroid Build Coastguard Worker     return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event);
9281*61046927SAndroid Build Coastguard Worker }
9282*61046927SAndroid Build Coastguard Worker 
enqueueWriteBuffer(const Buffer & buffer,cl_bool blocking,size_type offset,size_type size,const void * ptr,const vector<Event> * events=NULL,Event * event=NULL)9283*61046927SAndroid Build Coastguard Worker inline cl_int enqueueWriteBuffer(
9284*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
9285*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
9286*61046927SAndroid Build Coastguard Worker         size_type offset,
9287*61046927SAndroid Build Coastguard Worker         size_type size,
9288*61046927SAndroid Build Coastguard Worker         const void* ptr,
9289*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
9290*61046927SAndroid Build Coastguard Worker         Event* event = NULL)
9291*61046927SAndroid Build Coastguard Worker {
9292*61046927SAndroid Build Coastguard Worker     cl_int error;
9293*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9294*61046927SAndroid Build Coastguard Worker 
9295*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9296*61046927SAndroid Build Coastguard Worker         return error;
9297*61046927SAndroid Build Coastguard Worker     }
9298*61046927SAndroid Build Coastguard Worker 
9299*61046927SAndroid Build Coastguard Worker     return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event);
9300*61046927SAndroid Build Coastguard Worker }
9301*61046927SAndroid Build Coastguard Worker 
enqueueMapBuffer(const Buffer & buffer,cl_bool blocking,cl_map_flags flags,size_type offset,size_type size,const vector<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL)9302*61046927SAndroid Build Coastguard Worker inline void* enqueueMapBuffer(
9303*61046927SAndroid Build Coastguard Worker         const Buffer& buffer,
9304*61046927SAndroid Build Coastguard Worker         cl_bool blocking,
9305*61046927SAndroid Build Coastguard Worker         cl_map_flags flags,
9306*61046927SAndroid Build Coastguard Worker         size_type offset,
9307*61046927SAndroid Build Coastguard Worker         size_type size,
9308*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
9309*61046927SAndroid Build Coastguard Worker         Event* event = NULL,
9310*61046927SAndroid Build Coastguard Worker         cl_int* err = NULL)
9311*61046927SAndroid Build Coastguard Worker {
9312*61046927SAndroid Build Coastguard Worker     cl_int error;
9313*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9314*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
9315*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
9316*61046927SAndroid Build Coastguard Worker         *err = error;
9317*61046927SAndroid Build Coastguard Worker     }
9318*61046927SAndroid Build Coastguard Worker 
9319*61046927SAndroid Build Coastguard Worker     void * result = ::clEnqueueMapBuffer(
9320*61046927SAndroid Build Coastguard Worker             queue(), buffer(), blocking, flags, offset, size,
9321*61046927SAndroid Build Coastguard Worker             (events != NULL) ? (cl_uint) events->size() : 0,
9322*61046927SAndroid Build Coastguard Worker             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
9323*61046927SAndroid Build Coastguard Worker             (cl_event*) event,
9324*61046927SAndroid Build Coastguard Worker             &error);
9325*61046927SAndroid Build Coastguard Worker 
9326*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
9327*61046927SAndroid Build Coastguard Worker     if (err != NULL) {
9328*61046927SAndroid Build Coastguard Worker         *err = error;
9329*61046927SAndroid Build Coastguard Worker     }
9330*61046927SAndroid Build Coastguard Worker     return result;
9331*61046927SAndroid Build Coastguard Worker }
9332*61046927SAndroid Build Coastguard Worker 
9333*61046927SAndroid Build Coastguard Worker 
9334*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9335*61046927SAndroid Build Coastguard Worker /**
9336*61046927SAndroid Build Coastguard Worker  * Enqueues to the default queue a command that will allow the host to
9337*61046927SAndroid Build Coastguard Worker  * update a region of a coarse-grained SVM buffer.
9338*61046927SAndroid Build Coastguard Worker  * This variant takes a raw SVM pointer.
9339*61046927SAndroid Build Coastguard Worker  */
9340*61046927SAndroid Build Coastguard Worker template<typename T>
enqueueMapSVM(T * ptr,cl_bool blocking,cl_map_flags flags,size_type size,const vector<Event> * events,Event * event)9341*61046927SAndroid Build Coastguard Worker inline cl_int enqueueMapSVM(
9342*61046927SAndroid Build Coastguard Worker     T* ptr,
9343*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9344*61046927SAndroid Build Coastguard Worker     cl_map_flags flags,
9345*61046927SAndroid Build Coastguard Worker     size_type size,
9346*61046927SAndroid Build Coastguard Worker     const vector<Event>* events,
9347*61046927SAndroid Build Coastguard Worker     Event* event)
9348*61046927SAndroid Build Coastguard Worker {
9349*61046927SAndroid Build Coastguard Worker     cl_int error;
9350*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9351*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9352*61046927SAndroid Build Coastguard Worker         return detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
9353*61046927SAndroid Build Coastguard Worker     }
9354*61046927SAndroid Build Coastguard Worker 
9355*61046927SAndroid Build Coastguard Worker     return queue.enqueueMapSVM(
9356*61046927SAndroid Build Coastguard Worker         ptr, blocking, flags, size, events, event);
9357*61046927SAndroid Build Coastguard Worker }
9358*61046927SAndroid Build Coastguard Worker 
9359*61046927SAndroid Build Coastguard Worker /**
9360*61046927SAndroid Build Coastguard Worker  * Enqueues to the default queue a command that will allow the host to
9361*61046927SAndroid Build Coastguard Worker  * update a region of a coarse-grained SVM buffer.
9362*61046927SAndroid Build Coastguard Worker  * This variant takes a cl::pointer instance.
9363*61046927SAndroid Build Coastguard Worker  */
9364*61046927SAndroid Build Coastguard Worker template<typename T, class D>
enqueueMapSVM(cl::pointer<T,D> & ptr,cl_bool blocking,cl_map_flags flags,size_type size,const vector<Event> * events=NULL,Event * event=NULL)9365*61046927SAndroid Build Coastguard Worker inline cl_int enqueueMapSVM(
9366*61046927SAndroid Build Coastguard Worker     cl::pointer<T, D> &ptr,
9367*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9368*61046927SAndroid Build Coastguard Worker     cl_map_flags flags,
9369*61046927SAndroid Build Coastguard Worker     size_type size,
9370*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9371*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9372*61046927SAndroid Build Coastguard Worker {
9373*61046927SAndroid Build Coastguard Worker     cl_int error;
9374*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9375*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9376*61046927SAndroid Build Coastguard Worker         return detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
9377*61046927SAndroid Build Coastguard Worker     }
9378*61046927SAndroid Build Coastguard Worker 
9379*61046927SAndroid Build Coastguard Worker     return queue.enqueueMapSVM(
9380*61046927SAndroid Build Coastguard Worker         ptr, blocking, flags, size, events, event);
9381*61046927SAndroid Build Coastguard Worker }
9382*61046927SAndroid Build Coastguard Worker 
9383*61046927SAndroid Build Coastguard Worker /**
9384*61046927SAndroid Build Coastguard Worker  * Enqueues to the default queue a command that will allow the host to
9385*61046927SAndroid Build Coastguard Worker  * update a region of a coarse-grained SVM buffer.
9386*61046927SAndroid Build Coastguard Worker  * This variant takes a cl::vector instance.
9387*61046927SAndroid Build Coastguard Worker  */
9388*61046927SAndroid Build Coastguard Worker template<typename T, class Alloc>
enqueueMapSVM(cl::vector<T,Alloc> & container,cl_bool blocking,cl_map_flags flags,const vector<Event> * events=NULL,Event * event=NULL)9389*61046927SAndroid Build Coastguard Worker inline cl_int enqueueMapSVM(
9390*61046927SAndroid Build Coastguard Worker     cl::vector<T, Alloc> &container,
9391*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9392*61046927SAndroid Build Coastguard Worker     cl_map_flags flags,
9393*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9394*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9395*61046927SAndroid Build Coastguard Worker {
9396*61046927SAndroid Build Coastguard Worker     cl_int error;
9397*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9398*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9399*61046927SAndroid Build Coastguard Worker         return detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
9400*61046927SAndroid Build Coastguard Worker     }
9401*61046927SAndroid Build Coastguard Worker 
9402*61046927SAndroid Build Coastguard Worker     return queue.enqueueMapSVM(
9403*61046927SAndroid Build Coastguard Worker         container, blocking, flags, events, event);
9404*61046927SAndroid Build Coastguard Worker }
9405*61046927SAndroid Build Coastguard Worker 
9406*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9407*61046927SAndroid Build Coastguard Worker 
enqueueUnmapMemObject(const Memory & memory,void * mapped_ptr,const vector<Event> * events=NULL,Event * event=NULL)9408*61046927SAndroid Build Coastguard Worker inline cl_int enqueueUnmapMemObject(
9409*61046927SAndroid Build Coastguard Worker     const Memory& memory,
9410*61046927SAndroid Build Coastguard Worker     void* mapped_ptr,
9411*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9412*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9413*61046927SAndroid Build Coastguard Worker {
9414*61046927SAndroid Build Coastguard Worker     cl_int error;
9415*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9416*61046927SAndroid Build Coastguard Worker     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
9417*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9418*61046927SAndroid Build Coastguard Worker         return error;
9419*61046927SAndroid Build Coastguard Worker     }
9420*61046927SAndroid Build Coastguard Worker 
9421*61046927SAndroid Build Coastguard Worker     cl_event tmp;
9422*61046927SAndroid Build Coastguard Worker     cl_int err = detail::errHandler(
9423*61046927SAndroid Build Coastguard Worker         ::clEnqueueUnmapMemObject(
9424*61046927SAndroid Build Coastguard Worker         queue(), memory(), mapped_ptr,
9425*61046927SAndroid Build Coastguard Worker         (events != NULL) ? (cl_uint)events->size() : 0,
9426*61046927SAndroid Build Coastguard Worker         (events != NULL && events->size() > 0) ? (cl_event*)&events->front() : NULL,
9427*61046927SAndroid Build Coastguard Worker         (event != NULL) ? &tmp : NULL),
9428*61046927SAndroid Build Coastguard Worker         __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9429*61046927SAndroid Build Coastguard Worker 
9430*61046927SAndroid Build Coastguard Worker     if (event != NULL && err == CL_SUCCESS)
9431*61046927SAndroid Build Coastguard Worker         *event = tmp;
9432*61046927SAndroid Build Coastguard Worker 
9433*61046927SAndroid Build Coastguard Worker     return err;
9434*61046927SAndroid Build Coastguard Worker }
9435*61046927SAndroid Build Coastguard Worker 
9436*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9437*61046927SAndroid Build Coastguard Worker /**
9438*61046927SAndroid Build Coastguard Worker  * Enqueues to the default queue a command that will release a coarse-grained
9439*61046927SAndroid Build Coastguard Worker  * SVM buffer back to the OpenCL runtime.
9440*61046927SAndroid Build Coastguard Worker  * This variant takes a raw SVM pointer.
9441*61046927SAndroid Build Coastguard Worker  */
9442*61046927SAndroid Build Coastguard Worker template<typename T>
enqueueUnmapSVM(T * ptr,const vector<Event> * events=NULL,Event * event=NULL)9443*61046927SAndroid Build Coastguard Worker inline cl_int enqueueUnmapSVM(
9444*61046927SAndroid Build Coastguard Worker     T* ptr,
9445*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9446*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9447*61046927SAndroid Build Coastguard Worker {
9448*61046927SAndroid Build Coastguard Worker     cl_int error;
9449*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9450*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9451*61046927SAndroid Build Coastguard Worker         return detail::errHandler(error, __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9452*61046927SAndroid Build Coastguard Worker     }
9453*61046927SAndroid Build Coastguard Worker 
9454*61046927SAndroid Build Coastguard Worker     return detail::errHandler(queue.enqueueUnmapSVM(ptr, events, event),
9455*61046927SAndroid Build Coastguard Worker         __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9456*61046927SAndroid Build Coastguard Worker 
9457*61046927SAndroid Build Coastguard Worker }
9458*61046927SAndroid Build Coastguard Worker 
9459*61046927SAndroid Build Coastguard Worker /**
9460*61046927SAndroid Build Coastguard Worker  * Enqueues to the default queue a command that will release a coarse-grained
9461*61046927SAndroid Build Coastguard Worker  * SVM buffer back to the OpenCL runtime.
9462*61046927SAndroid Build Coastguard Worker  * This variant takes a cl::pointer instance.
9463*61046927SAndroid Build Coastguard Worker  */
9464*61046927SAndroid Build Coastguard Worker template<typename T, class D>
enqueueUnmapSVM(cl::pointer<T,D> & ptr,const vector<Event> * events=NULL,Event * event=NULL)9465*61046927SAndroid Build Coastguard Worker inline cl_int enqueueUnmapSVM(
9466*61046927SAndroid Build Coastguard Worker     cl::pointer<T, D> &ptr,
9467*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9468*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9469*61046927SAndroid Build Coastguard Worker {
9470*61046927SAndroid Build Coastguard Worker     cl_int error;
9471*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9472*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9473*61046927SAndroid Build Coastguard Worker         return detail::errHandler(error, __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9474*61046927SAndroid Build Coastguard Worker     }
9475*61046927SAndroid Build Coastguard Worker 
9476*61046927SAndroid Build Coastguard Worker     return detail::errHandler(queue.enqueueUnmapSVM(ptr, events, event),
9477*61046927SAndroid Build Coastguard Worker         __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9478*61046927SAndroid Build Coastguard Worker }
9479*61046927SAndroid Build Coastguard Worker 
9480*61046927SAndroid Build Coastguard Worker /**
9481*61046927SAndroid Build Coastguard Worker  * Enqueues to the default queue a command that will release a coarse-grained
9482*61046927SAndroid Build Coastguard Worker  * SVM buffer back to the OpenCL runtime.
9483*61046927SAndroid Build Coastguard Worker  * This variant takes a cl::vector instance.
9484*61046927SAndroid Build Coastguard Worker  */
9485*61046927SAndroid Build Coastguard Worker template<typename T, class Alloc>
enqueueUnmapSVM(cl::vector<T,Alloc> & container,const vector<Event> * events=NULL,Event * event=NULL)9486*61046927SAndroid Build Coastguard Worker inline cl_int enqueueUnmapSVM(
9487*61046927SAndroid Build Coastguard Worker     cl::vector<T, Alloc> &container,
9488*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9489*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9490*61046927SAndroid Build Coastguard Worker {
9491*61046927SAndroid Build Coastguard Worker     cl_int error;
9492*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9493*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9494*61046927SAndroid Build Coastguard Worker         return detail::errHandler(error, __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9495*61046927SAndroid Build Coastguard Worker     }
9496*61046927SAndroid Build Coastguard Worker 
9497*61046927SAndroid Build Coastguard Worker     return detail::errHandler(queue.enqueueUnmapSVM(container, events, event),
9498*61046927SAndroid Build Coastguard Worker         __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
9499*61046927SAndroid Build Coastguard Worker }
9500*61046927SAndroid Build Coastguard Worker 
9501*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9502*61046927SAndroid Build Coastguard Worker 
enqueueCopyBuffer(const Buffer & src,const Buffer & dst,size_type src_offset,size_type dst_offset,size_type size,const vector<Event> * events=NULL,Event * event=NULL)9503*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyBuffer(
9504*61046927SAndroid Build Coastguard Worker         const Buffer& src,
9505*61046927SAndroid Build Coastguard Worker         const Buffer& dst,
9506*61046927SAndroid Build Coastguard Worker         size_type src_offset,
9507*61046927SAndroid Build Coastguard Worker         size_type dst_offset,
9508*61046927SAndroid Build Coastguard Worker         size_type size,
9509*61046927SAndroid Build Coastguard Worker         const vector<Event>* events = NULL,
9510*61046927SAndroid Build Coastguard Worker         Event* event = NULL)
9511*61046927SAndroid Build Coastguard Worker {
9512*61046927SAndroid Build Coastguard Worker     cl_int error;
9513*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9514*61046927SAndroid Build Coastguard Worker 
9515*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9516*61046927SAndroid Build Coastguard Worker         return error;
9517*61046927SAndroid Build Coastguard Worker     }
9518*61046927SAndroid Build Coastguard Worker 
9519*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event);
9520*61046927SAndroid Build Coastguard Worker }
9521*61046927SAndroid Build Coastguard Worker 
9522*61046927SAndroid Build Coastguard Worker /**
9523*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
9524*61046927SAndroid Build Coastguard Worker  * Host to Device.
9525*61046927SAndroid Build Coastguard Worker  * Uses default command queue.
9526*61046927SAndroid Build Coastguard Worker  */
9527*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(IteratorType startIterator,IteratorType endIterator,cl::Buffer & buffer)9528*61046927SAndroid Build Coastguard Worker inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
9529*61046927SAndroid Build Coastguard Worker {
9530*61046927SAndroid Build Coastguard Worker     cl_int error;
9531*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9532*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS)
9533*61046927SAndroid Build Coastguard Worker         return error;
9534*61046927SAndroid Build Coastguard Worker 
9535*61046927SAndroid Build Coastguard Worker     return cl::copy(queue, startIterator, endIterator, buffer);
9536*61046927SAndroid Build Coastguard Worker }
9537*61046927SAndroid Build Coastguard Worker 
9538*61046927SAndroid Build Coastguard Worker /**
9539*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
9540*61046927SAndroid Build Coastguard Worker  * Device to Host.
9541*61046927SAndroid Build Coastguard Worker  * Uses default command queue.
9542*61046927SAndroid Build Coastguard Worker  */
9543*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(const cl::Buffer & buffer,IteratorType startIterator,IteratorType endIterator)9544*61046927SAndroid Build Coastguard Worker inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
9545*61046927SAndroid Build Coastguard Worker {
9546*61046927SAndroid Build Coastguard Worker     cl_int error;
9547*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9548*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS)
9549*61046927SAndroid Build Coastguard Worker         return error;
9550*61046927SAndroid Build Coastguard Worker 
9551*61046927SAndroid Build Coastguard Worker     return cl::copy(queue, buffer, startIterator, endIterator);
9552*61046927SAndroid Build Coastguard Worker }
9553*61046927SAndroid Build Coastguard Worker 
9554*61046927SAndroid Build Coastguard Worker /**
9555*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
9556*61046927SAndroid Build Coastguard Worker  * Host to Device.
9557*61046927SAndroid Build Coastguard Worker  * Uses specified queue.
9558*61046927SAndroid Build Coastguard Worker  */
9559*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(const CommandQueue & queue,IteratorType startIterator,IteratorType endIterator,cl::Buffer & buffer)9560*61046927SAndroid Build Coastguard Worker inline cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
9561*61046927SAndroid Build Coastguard Worker {
9562*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
9563*61046927SAndroid Build Coastguard Worker     cl_int error;
9564*61046927SAndroid Build Coastguard Worker 
9565*61046927SAndroid Build Coastguard Worker     size_type length = endIterator-startIterator;
9566*61046927SAndroid Build Coastguard Worker     size_type byteLength = length*sizeof(DataType);
9567*61046927SAndroid Build Coastguard Worker 
9568*61046927SAndroid Build Coastguard Worker     DataType *pointer =
9569*61046927SAndroid Build Coastguard Worker         static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));
9570*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueMapBuffer will throw
9571*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
9572*61046927SAndroid Build Coastguard Worker         return error;
9573*61046927SAndroid Build Coastguard Worker     }
9574*61046927SAndroid Build Coastguard Worker #if defined(_MSC_VER)
9575*61046927SAndroid Build Coastguard Worker     std::copy(
9576*61046927SAndroid Build Coastguard Worker         startIterator,
9577*61046927SAndroid Build Coastguard Worker         endIterator,
9578*61046927SAndroid Build Coastguard Worker         stdext::checked_array_iterator<DataType*>(
9579*61046927SAndroid Build Coastguard Worker             pointer, length));
9580*61046927SAndroid Build Coastguard Worker #else
9581*61046927SAndroid Build Coastguard Worker     std::copy(startIterator, endIterator, pointer);
9582*61046927SAndroid Build Coastguard Worker #endif
9583*61046927SAndroid Build Coastguard Worker     Event endEvent;
9584*61046927SAndroid Build Coastguard Worker     error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
9585*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueUnmapMemObject will throw
9586*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
9587*61046927SAndroid Build Coastguard Worker         return error;
9588*61046927SAndroid Build Coastguard Worker     }
9589*61046927SAndroid Build Coastguard Worker     endEvent.wait();
9590*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
9591*61046927SAndroid Build Coastguard Worker }
9592*61046927SAndroid Build Coastguard Worker 
9593*61046927SAndroid Build Coastguard Worker /**
9594*61046927SAndroid Build Coastguard Worker  * Blocking copy operation between iterators and a buffer.
9595*61046927SAndroid Build Coastguard Worker  * Device to Host.
9596*61046927SAndroid Build Coastguard Worker  * Uses specified queue.
9597*61046927SAndroid Build Coastguard Worker  */
9598*61046927SAndroid Build Coastguard Worker template< typename IteratorType >
copy(const CommandQueue & queue,const cl::Buffer & buffer,IteratorType startIterator,IteratorType endIterator)9599*61046927SAndroid Build Coastguard Worker inline cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
9600*61046927SAndroid Build Coastguard Worker {
9601*61046927SAndroid Build Coastguard Worker     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
9602*61046927SAndroid Build Coastguard Worker     cl_int error;
9603*61046927SAndroid Build Coastguard Worker 
9604*61046927SAndroid Build Coastguard Worker     size_type length = endIterator-startIterator;
9605*61046927SAndroid Build Coastguard Worker     size_type byteLength = length*sizeof(DataType);
9606*61046927SAndroid Build Coastguard Worker 
9607*61046927SAndroid Build Coastguard Worker     DataType *pointer =
9608*61046927SAndroid Build Coastguard Worker         static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));
9609*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueMapBuffer will throw
9610*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
9611*61046927SAndroid Build Coastguard Worker         return error;
9612*61046927SAndroid Build Coastguard Worker     }
9613*61046927SAndroid Build Coastguard Worker     std::copy(pointer, pointer + length, startIterator);
9614*61046927SAndroid Build Coastguard Worker     Event endEvent;
9615*61046927SAndroid Build Coastguard Worker     error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
9616*61046927SAndroid Build Coastguard Worker     // if exceptions enabled, enqueueUnmapMemObject will throw
9617*61046927SAndroid Build Coastguard Worker     if( error != CL_SUCCESS ) {
9618*61046927SAndroid Build Coastguard Worker         return error;
9619*61046927SAndroid Build Coastguard Worker     }
9620*61046927SAndroid Build Coastguard Worker     endEvent.wait();
9621*61046927SAndroid Build Coastguard Worker     return CL_SUCCESS;
9622*61046927SAndroid Build Coastguard Worker }
9623*61046927SAndroid Build Coastguard Worker 
9624*61046927SAndroid Build Coastguard Worker 
9625*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9626*61046927SAndroid Build Coastguard Worker /**
9627*61046927SAndroid Build Coastguard Worker  * Blocking SVM map operation - performs a blocking map underneath.
9628*61046927SAndroid Build Coastguard Worker  */
9629*61046927SAndroid Build Coastguard Worker template<typename T, class Alloc>
mapSVM(cl::vector<T,Alloc> & container)9630*61046927SAndroid Build Coastguard Worker inline cl_int mapSVM(cl::vector<T, Alloc> &container)
9631*61046927SAndroid Build Coastguard Worker {
9632*61046927SAndroid Build Coastguard Worker     return enqueueMapSVM(container, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE);
9633*61046927SAndroid Build Coastguard Worker }
9634*61046927SAndroid Build Coastguard Worker 
9635*61046927SAndroid Build Coastguard Worker /**
9636*61046927SAndroid Build Coastguard Worker * Blocking SVM map operation - performs a blocking map underneath.
9637*61046927SAndroid Build Coastguard Worker */
9638*61046927SAndroid Build Coastguard Worker template<typename T, class Alloc>
unmapSVM(cl::vector<T,Alloc> & container)9639*61046927SAndroid Build Coastguard Worker inline cl_int unmapSVM(cl::vector<T, Alloc> &container)
9640*61046927SAndroid Build Coastguard Worker {
9641*61046927SAndroid Build Coastguard Worker     return enqueueUnmapSVM(container);
9642*61046927SAndroid Build Coastguard Worker }
9643*61046927SAndroid Build Coastguard Worker 
9644*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
9645*61046927SAndroid Build Coastguard Worker 
9646*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 110
enqueueReadBufferRect(const Buffer & buffer,cl_bool blocking,const array<size_type,3> & buffer_offset,const array<size_type,3> & host_offset,const array<size_type,3> & region,size_type buffer_row_pitch,size_type buffer_slice_pitch,size_type host_row_pitch,size_type host_slice_pitch,void * ptr,const vector<Event> * events=NULL,Event * event=NULL)9647*61046927SAndroid Build Coastguard Worker inline cl_int enqueueReadBufferRect(
9648*61046927SAndroid Build Coastguard Worker     const Buffer& buffer,
9649*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9650*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& buffer_offset,
9651*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& host_offset,
9652*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9653*61046927SAndroid Build Coastguard Worker     size_type buffer_row_pitch,
9654*61046927SAndroid Build Coastguard Worker     size_type buffer_slice_pitch,
9655*61046927SAndroid Build Coastguard Worker     size_type host_row_pitch,
9656*61046927SAndroid Build Coastguard Worker     size_type host_slice_pitch,
9657*61046927SAndroid Build Coastguard Worker     void *ptr,
9658*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9659*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9660*61046927SAndroid Build Coastguard Worker {
9661*61046927SAndroid Build Coastguard Worker     cl_int error;
9662*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9663*61046927SAndroid Build Coastguard Worker 
9664*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9665*61046927SAndroid Build Coastguard Worker         return error;
9666*61046927SAndroid Build Coastguard Worker     }
9667*61046927SAndroid Build Coastguard Worker 
9668*61046927SAndroid Build Coastguard Worker     return queue.enqueueReadBufferRect(
9669*61046927SAndroid Build Coastguard Worker         buffer,
9670*61046927SAndroid Build Coastguard Worker         blocking,
9671*61046927SAndroid Build Coastguard Worker         buffer_offset,
9672*61046927SAndroid Build Coastguard Worker         host_offset,
9673*61046927SAndroid Build Coastguard Worker         region,
9674*61046927SAndroid Build Coastguard Worker         buffer_row_pitch,
9675*61046927SAndroid Build Coastguard Worker         buffer_slice_pitch,
9676*61046927SAndroid Build Coastguard Worker         host_row_pitch,
9677*61046927SAndroid Build Coastguard Worker         host_slice_pitch,
9678*61046927SAndroid Build Coastguard Worker         ptr,
9679*61046927SAndroid Build Coastguard Worker         events,
9680*61046927SAndroid Build Coastguard Worker         event);
9681*61046927SAndroid Build Coastguard Worker }
9682*61046927SAndroid Build Coastguard Worker 
enqueueWriteBufferRect(const Buffer & buffer,cl_bool blocking,const array<size_type,3> & buffer_offset,const array<size_type,3> & host_offset,const array<size_type,3> & region,size_type buffer_row_pitch,size_type buffer_slice_pitch,size_type host_row_pitch,size_type host_slice_pitch,const void * ptr,const vector<Event> * events=NULL,Event * event=NULL)9683*61046927SAndroid Build Coastguard Worker inline cl_int enqueueWriteBufferRect(
9684*61046927SAndroid Build Coastguard Worker     const Buffer& buffer,
9685*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9686*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& buffer_offset,
9687*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& host_offset,
9688*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9689*61046927SAndroid Build Coastguard Worker     size_type buffer_row_pitch,
9690*61046927SAndroid Build Coastguard Worker     size_type buffer_slice_pitch,
9691*61046927SAndroid Build Coastguard Worker     size_type host_row_pitch,
9692*61046927SAndroid Build Coastguard Worker     size_type host_slice_pitch,
9693*61046927SAndroid Build Coastguard Worker     const void *ptr,
9694*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9695*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9696*61046927SAndroid Build Coastguard Worker {
9697*61046927SAndroid Build Coastguard Worker     cl_int error;
9698*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9699*61046927SAndroid Build Coastguard Worker 
9700*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9701*61046927SAndroid Build Coastguard Worker         return error;
9702*61046927SAndroid Build Coastguard Worker     }
9703*61046927SAndroid Build Coastguard Worker 
9704*61046927SAndroid Build Coastguard Worker     return queue.enqueueWriteBufferRect(
9705*61046927SAndroid Build Coastguard Worker         buffer,
9706*61046927SAndroid Build Coastguard Worker         blocking,
9707*61046927SAndroid Build Coastguard Worker         buffer_offset,
9708*61046927SAndroid Build Coastguard Worker         host_offset,
9709*61046927SAndroid Build Coastguard Worker         region,
9710*61046927SAndroid Build Coastguard Worker         buffer_row_pitch,
9711*61046927SAndroid Build Coastguard Worker         buffer_slice_pitch,
9712*61046927SAndroid Build Coastguard Worker         host_row_pitch,
9713*61046927SAndroid Build Coastguard Worker         host_slice_pitch,
9714*61046927SAndroid Build Coastguard Worker         ptr,
9715*61046927SAndroid Build Coastguard Worker         events,
9716*61046927SAndroid Build Coastguard Worker         event);
9717*61046927SAndroid Build Coastguard Worker }
9718*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferRect(const Buffer & src,const Buffer & dst,const array<size_type,3> & src_origin,const array<size_type,3> & dst_origin,const array<size_type,3> & region,size_type src_row_pitch,size_type src_slice_pitch,size_type dst_row_pitch,size_type dst_slice_pitch,const vector<Event> * events=NULL,Event * event=NULL)9719*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyBufferRect(
9720*61046927SAndroid Build Coastguard Worker     const Buffer& src,
9721*61046927SAndroid Build Coastguard Worker     const Buffer& dst,
9722*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& src_origin,
9723*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& dst_origin,
9724*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9725*61046927SAndroid Build Coastguard Worker     size_type src_row_pitch,
9726*61046927SAndroid Build Coastguard Worker     size_type src_slice_pitch,
9727*61046927SAndroid Build Coastguard Worker     size_type dst_row_pitch,
9728*61046927SAndroid Build Coastguard Worker     size_type dst_slice_pitch,
9729*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9730*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9731*61046927SAndroid Build Coastguard Worker {
9732*61046927SAndroid Build Coastguard Worker     cl_int error;
9733*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9734*61046927SAndroid Build Coastguard Worker 
9735*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9736*61046927SAndroid Build Coastguard Worker         return error;
9737*61046927SAndroid Build Coastguard Worker     }
9738*61046927SAndroid Build Coastguard Worker 
9739*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyBufferRect(
9740*61046927SAndroid Build Coastguard Worker         src,
9741*61046927SAndroid Build Coastguard Worker         dst,
9742*61046927SAndroid Build Coastguard Worker         src_origin,
9743*61046927SAndroid Build Coastguard Worker         dst_origin,
9744*61046927SAndroid Build Coastguard Worker         region,
9745*61046927SAndroid Build Coastguard Worker         src_row_pitch,
9746*61046927SAndroid Build Coastguard Worker         src_slice_pitch,
9747*61046927SAndroid Build Coastguard Worker         dst_row_pitch,
9748*61046927SAndroid Build Coastguard Worker         dst_slice_pitch,
9749*61046927SAndroid Build Coastguard Worker         events,
9750*61046927SAndroid Build Coastguard Worker         event);
9751*61046927SAndroid Build Coastguard Worker }
9752*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_TARGET_OPENCL_VERSION >= 110
9753*61046927SAndroid Build Coastguard Worker 
enqueueReadImage(const Image & image,cl_bool blocking,const array<size_type,3> & origin,const array<size_type,3> & region,size_type row_pitch,size_type slice_pitch,void * ptr,const vector<Event> * events=NULL,Event * event=NULL)9754*61046927SAndroid Build Coastguard Worker inline cl_int enqueueReadImage(
9755*61046927SAndroid Build Coastguard Worker     const Image& image,
9756*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9757*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& origin,
9758*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9759*61046927SAndroid Build Coastguard Worker     size_type row_pitch,
9760*61046927SAndroid Build Coastguard Worker     size_type slice_pitch,
9761*61046927SAndroid Build Coastguard Worker     void* ptr,
9762*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9763*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9764*61046927SAndroid Build Coastguard Worker {
9765*61046927SAndroid Build Coastguard Worker     cl_int error;
9766*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9767*61046927SAndroid Build Coastguard Worker 
9768*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9769*61046927SAndroid Build Coastguard Worker         return error;
9770*61046927SAndroid Build Coastguard Worker     }
9771*61046927SAndroid Build Coastguard Worker 
9772*61046927SAndroid Build Coastguard Worker     return queue.enqueueReadImage(
9773*61046927SAndroid Build Coastguard Worker         image,
9774*61046927SAndroid Build Coastguard Worker         blocking,
9775*61046927SAndroid Build Coastguard Worker         origin,
9776*61046927SAndroid Build Coastguard Worker         region,
9777*61046927SAndroid Build Coastguard Worker         row_pitch,
9778*61046927SAndroid Build Coastguard Worker         slice_pitch,
9779*61046927SAndroid Build Coastguard Worker         ptr,
9780*61046927SAndroid Build Coastguard Worker         events,
9781*61046927SAndroid Build Coastguard Worker         event);
9782*61046927SAndroid Build Coastguard Worker }
9783*61046927SAndroid Build Coastguard Worker 
enqueueWriteImage(const Image & image,cl_bool blocking,const array<size_type,3> & origin,const array<size_type,3> & region,size_type row_pitch,size_type slice_pitch,const void * ptr,const vector<Event> * events=NULL,Event * event=NULL)9784*61046927SAndroid Build Coastguard Worker inline cl_int enqueueWriteImage(
9785*61046927SAndroid Build Coastguard Worker     const Image& image,
9786*61046927SAndroid Build Coastguard Worker     cl_bool blocking,
9787*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& origin,
9788*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9789*61046927SAndroid Build Coastguard Worker     size_type row_pitch,
9790*61046927SAndroid Build Coastguard Worker     size_type slice_pitch,
9791*61046927SAndroid Build Coastguard Worker     const void* ptr,
9792*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9793*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9794*61046927SAndroid Build Coastguard Worker {
9795*61046927SAndroid Build Coastguard Worker     cl_int error;
9796*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9797*61046927SAndroid Build Coastguard Worker 
9798*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9799*61046927SAndroid Build Coastguard Worker         return error;
9800*61046927SAndroid Build Coastguard Worker     }
9801*61046927SAndroid Build Coastguard Worker 
9802*61046927SAndroid Build Coastguard Worker     return queue.enqueueWriteImage(
9803*61046927SAndroid Build Coastguard Worker         image,
9804*61046927SAndroid Build Coastguard Worker         blocking,
9805*61046927SAndroid Build Coastguard Worker         origin,
9806*61046927SAndroid Build Coastguard Worker         region,
9807*61046927SAndroid Build Coastguard Worker         row_pitch,
9808*61046927SAndroid Build Coastguard Worker         slice_pitch,
9809*61046927SAndroid Build Coastguard Worker         ptr,
9810*61046927SAndroid Build Coastguard Worker         events,
9811*61046927SAndroid Build Coastguard Worker         event);
9812*61046927SAndroid Build Coastguard Worker }
9813*61046927SAndroid Build Coastguard Worker 
enqueueCopyImage(const Image & src,const Image & dst,const array<size_type,3> & src_origin,const array<size_type,3> & dst_origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL)9814*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyImage(
9815*61046927SAndroid Build Coastguard Worker     const Image& src,
9816*61046927SAndroid Build Coastguard Worker     const Image& dst,
9817*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& src_origin,
9818*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& dst_origin,
9819*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9820*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9821*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9822*61046927SAndroid Build Coastguard Worker {
9823*61046927SAndroid Build Coastguard Worker     cl_int error;
9824*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9825*61046927SAndroid Build Coastguard Worker 
9826*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9827*61046927SAndroid Build Coastguard Worker         return error;
9828*61046927SAndroid Build Coastguard Worker     }
9829*61046927SAndroid Build Coastguard Worker 
9830*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyImage(
9831*61046927SAndroid Build Coastguard Worker         src,
9832*61046927SAndroid Build Coastguard Worker         dst,
9833*61046927SAndroid Build Coastguard Worker         src_origin,
9834*61046927SAndroid Build Coastguard Worker         dst_origin,
9835*61046927SAndroid Build Coastguard Worker         region,
9836*61046927SAndroid Build Coastguard Worker         events,
9837*61046927SAndroid Build Coastguard Worker         event);
9838*61046927SAndroid Build Coastguard Worker }
9839*61046927SAndroid Build Coastguard Worker 
enqueueCopyImageToBuffer(const Image & src,const Buffer & dst,const array<size_type,3> & src_origin,const array<size_type,3> & region,size_type dst_offset,const vector<Event> * events=NULL,Event * event=NULL)9840*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyImageToBuffer(
9841*61046927SAndroid Build Coastguard Worker     const Image& src,
9842*61046927SAndroid Build Coastguard Worker     const Buffer& dst,
9843*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& src_origin,
9844*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9845*61046927SAndroid Build Coastguard Worker     size_type dst_offset,
9846*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9847*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9848*61046927SAndroid Build Coastguard Worker {
9849*61046927SAndroid Build Coastguard Worker     cl_int error;
9850*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9851*61046927SAndroid Build Coastguard Worker 
9852*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9853*61046927SAndroid Build Coastguard Worker         return error;
9854*61046927SAndroid Build Coastguard Worker     }
9855*61046927SAndroid Build Coastguard Worker 
9856*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyImageToBuffer(
9857*61046927SAndroid Build Coastguard Worker         src,
9858*61046927SAndroid Build Coastguard Worker         dst,
9859*61046927SAndroid Build Coastguard Worker         src_origin,
9860*61046927SAndroid Build Coastguard Worker         region,
9861*61046927SAndroid Build Coastguard Worker         dst_offset,
9862*61046927SAndroid Build Coastguard Worker         events,
9863*61046927SAndroid Build Coastguard Worker         event);
9864*61046927SAndroid Build Coastguard Worker }
9865*61046927SAndroid Build Coastguard Worker 
enqueueCopyBufferToImage(const Buffer & src,const Image & dst,size_type src_offset,const array<size_type,3> & dst_origin,const array<size_type,3> & region,const vector<Event> * events=NULL,Event * event=NULL)9866*61046927SAndroid Build Coastguard Worker inline cl_int enqueueCopyBufferToImage(
9867*61046927SAndroid Build Coastguard Worker     const Buffer& src,
9868*61046927SAndroid Build Coastguard Worker     const Image& dst,
9869*61046927SAndroid Build Coastguard Worker     size_type src_offset,
9870*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& dst_origin,
9871*61046927SAndroid Build Coastguard Worker     const array<size_type, 3>& region,
9872*61046927SAndroid Build Coastguard Worker     const vector<Event>* events = NULL,
9873*61046927SAndroid Build Coastguard Worker     Event* event = NULL)
9874*61046927SAndroid Build Coastguard Worker {
9875*61046927SAndroid Build Coastguard Worker     cl_int error;
9876*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9877*61046927SAndroid Build Coastguard Worker 
9878*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9879*61046927SAndroid Build Coastguard Worker         return error;
9880*61046927SAndroid Build Coastguard Worker     }
9881*61046927SAndroid Build Coastguard Worker 
9882*61046927SAndroid Build Coastguard Worker     return queue.enqueueCopyBufferToImage(
9883*61046927SAndroid Build Coastguard Worker         src,
9884*61046927SAndroid Build Coastguard Worker         dst,
9885*61046927SAndroid Build Coastguard Worker         src_offset,
9886*61046927SAndroid Build Coastguard Worker         dst_origin,
9887*61046927SAndroid Build Coastguard Worker         region,
9888*61046927SAndroid Build Coastguard Worker         events,
9889*61046927SAndroid Build Coastguard Worker         event);
9890*61046927SAndroid Build Coastguard Worker }
9891*61046927SAndroid Build Coastguard Worker 
9892*61046927SAndroid Build Coastguard Worker 
flush(void)9893*61046927SAndroid Build Coastguard Worker inline cl_int flush(void)
9894*61046927SAndroid Build Coastguard Worker {
9895*61046927SAndroid Build Coastguard Worker     cl_int error;
9896*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9897*61046927SAndroid Build Coastguard Worker 
9898*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9899*61046927SAndroid Build Coastguard Worker         return error;
9900*61046927SAndroid Build Coastguard Worker     }
9901*61046927SAndroid Build Coastguard Worker 
9902*61046927SAndroid Build Coastguard Worker     return queue.flush();
9903*61046927SAndroid Build Coastguard Worker }
9904*61046927SAndroid Build Coastguard Worker 
finish(void)9905*61046927SAndroid Build Coastguard Worker inline cl_int finish(void)
9906*61046927SAndroid Build Coastguard Worker {
9907*61046927SAndroid Build Coastguard Worker     cl_int error;
9908*61046927SAndroid Build Coastguard Worker     CommandQueue queue = CommandQueue::getDefault(&error);
9909*61046927SAndroid Build Coastguard Worker 
9910*61046927SAndroid Build Coastguard Worker     if (error != CL_SUCCESS) {
9911*61046927SAndroid Build Coastguard Worker         return error;
9912*61046927SAndroid Build Coastguard Worker     }
9913*61046927SAndroid Build Coastguard Worker 
9914*61046927SAndroid Build Coastguard Worker 
9915*61046927SAndroid Build Coastguard Worker     return queue.finish();
9916*61046927SAndroid Build Coastguard Worker }
9917*61046927SAndroid Build Coastguard Worker 
9918*61046927SAndroid Build Coastguard Worker class EnqueueArgs
9919*61046927SAndroid Build Coastguard Worker {
9920*61046927SAndroid Build Coastguard Worker private:
9921*61046927SAndroid Build Coastguard Worker     CommandQueue queue_;
9922*61046927SAndroid Build Coastguard Worker     const NDRange offset_;
9923*61046927SAndroid Build Coastguard Worker     const NDRange global_;
9924*61046927SAndroid Build Coastguard Worker     const NDRange local_;
9925*61046927SAndroid Build Coastguard Worker     vector<Event> events_;
9926*61046927SAndroid Build Coastguard Worker 
9927*61046927SAndroid Build Coastguard Worker     template<typename... Ts>
9928*61046927SAndroid Build Coastguard Worker     friend class KernelFunctor;
9929*61046927SAndroid Build Coastguard Worker 
9930*61046927SAndroid Build Coastguard Worker public:
EnqueueArgs(NDRange global)9931*61046927SAndroid Build Coastguard Worker     EnqueueArgs(NDRange global) :
9932*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9933*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
9934*61046927SAndroid Build Coastguard Worker       global_(global),
9935*61046927SAndroid Build Coastguard Worker       local_(NullRange)
9936*61046927SAndroid Build Coastguard Worker     {
9937*61046927SAndroid Build Coastguard Worker 
9938*61046927SAndroid Build Coastguard Worker     }
9939*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(NDRange global,NDRange local)9940*61046927SAndroid Build Coastguard Worker     EnqueueArgs(NDRange global, NDRange local) :
9941*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9942*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
9943*61046927SAndroid Build Coastguard Worker       global_(global),
9944*61046927SAndroid Build Coastguard Worker       local_(local)
9945*61046927SAndroid Build Coastguard Worker     {
9946*61046927SAndroid Build Coastguard Worker 
9947*61046927SAndroid Build Coastguard Worker     }
9948*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(NDRange offset,NDRange global,NDRange local)9949*61046927SAndroid Build Coastguard Worker     EnqueueArgs(NDRange offset, NDRange global, NDRange local) :
9950*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9951*61046927SAndroid Build Coastguard Worker       offset_(offset),
9952*61046927SAndroid Build Coastguard Worker       global_(global),
9953*61046927SAndroid Build Coastguard Worker       local_(local)
9954*61046927SAndroid Build Coastguard Worker     {
9955*61046927SAndroid Build Coastguard Worker 
9956*61046927SAndroid Build Coastguard Worker     }
9957*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(Event e,NDRange global)9958*61046927SAndroid Build Coastguard Worker     EnqueueArgs(Event e, NDRange global) :
9959*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9960*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
9961*61046927SAndroid Build Coastguard Worker       global_(global),
9962*61046927SAndroid Build Coastguard Worker       local_(NullRange)
9963*61046927SAndroid Build Coastguard Worker     {
9964*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
9965*61046927SAndroid Build Coastguard Worker     }
9966*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(Event e,NDRange global,NDRange local)9967*61046927SAndroid Build Coastguard Worker     EnqueueArgs(Event e, NDRange global, NDRange local) :
9968*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9969*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
9970*61046927SAndroid Build Coastguard Worker       global_(global),
9971*61046927SAndroid Build Coastguard Worker       local_(local)
9972*61046927SAndroid Build Coastguard Worker     {
9973*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
9974*61046927SAndroid Build Coastguard Worker     }
9975*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(Event e,NDRange offset,NDRange global,NDRange local)9976*61046927SAndroid Build Coastguard Worker     EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) :
9977*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9978*61046927SAndroid Build Coastguard Worker       offset_(offset),
9979*61046927SAndroid Build Coastguard Worker       global_(global),
9980*61046927SAndroid Build Coastguard Worker       local_(local)
9981*61046927SAndroid Build Coastguard Worker     {
9982*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
9983*61046927SAndroid Build Coastguard Worker     }
9984*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(const vector<Event> & events,NDRange global)9985*61046927SAndroid Build Coastguard Worker     EnqueueArgs(const vector<Event> &events, NDRange global) :
9986*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9987*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
9988*61046927SAndroid Build Coastguard Worker       global_(global),
9989*61046927SAndroid Build Coastguard Worker       local_(NullRange),
9990*61046927SAndroid Build Coastguard Worker       events_(events)
9991*61046927SAndroid Build Coastguard Worker     {
9992*61046927SAndroid Build Coastguard Worker 
9993*61046927SAndroid Build Coastguard Worker     }
9994*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(const vector<Event> & events,NDRange global,NDRange local)9995*61046927SAndroid Build Coastguard Worker     EnqueueArgs(const vector<Event> &events, NDRange global, NDRange local) :
9996*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
9997*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
9998*61046927SAndroid Build Coastguard Worker       global_(global),
9999*61046927SAndroid Build Coastguard Worker       local_(local),
10000*61046927SAndroid Build Coastguard Worker       events_(events)
10001*61046927SAndroid Build Coastguard Worker     {
10002*61046927SAndroid Build Coastguard Worker 
10003*61046927SAndroid Build Coastguard Worker     }
10004*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(const vector<Event> & events,NDRange offset,NDRange global,NDRange local)10005*61046927SAndroid Build Coastguard Worker     EnqueueArgs(const vector<Event> &events, NDRange offset, NDRange global, NDRange local) :
10006*61046927SAndroid Build Coastguard Worker       queue_(CommandQueue::getDefault()),
10007*61046927SAndroid Build Coastguard Worker       offset_(offset),
10008*61046927SAndroid Build Coastguard Worker       global_(global),
10009*61046927SAndroid Build Coastguard Worker       local_(local),
10010*61046927SAndroid Build Coastguard Worker       events_(events)
10011*61046927SAndroid Build Coastguard Worker     {
10012*61046927SAndroid Build Coastguard Worker 
10013*61046927SAndroid Build Coastguard Worker     }
10014*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,NDRange global)10015*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, NDRange global) :
10016*61046927SAndroid Build Coastguard Worker       queue_(queue),
10017*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
10018*61046927SAndroid Build Coastguard Worker       global_(global),
10019*61046927SAndroid Build Coastguard Worker       local_(NullRange)
10020*61046927SAndroid Build Coastguard Worker     {
10021*61046927SAndroid Build Coastguard Worker 
10022*61046927SAndroid Build Coastguard Worker     }
10023*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,NDRange global,NDRange local)10024*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) :
10025*61046927SAndroid Build Coastguard Worker       queue_(queue),
10026*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
10027*61046927SAndroid Build Coastguard Worker       global_(global),
10028*61046927SAndroid Build Coastguard Worker       local_(local)
10029*61046927SAndroid Build Coastguard Worker     {
10030*61046927SAndroid Build Coastguard Worker 
10031*61046927SAndroid Build Coastguard Worker     }
10032*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,NDRange offset,NDRange global,NDRange local)10033*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) :
10034*61046927SAndroid Build Coastguard Worker       queue_(queue),
10035*61046927SAndroid Build Coastguard Worker       offset_(offset),
10036*61046927SAndroid Build Coastguard Worker       global_(global),
10037*61046927SAndroid Build Coastguard Worker       local_(local)
10038*61046927SAndroid Build Coastguard Worker     {
10039*61046927SAndroid Build Coastguard Worker 
10040*61046927SAndroid Build Coastguard Worker     }
10041*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,Event e,NDRange global)10042*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, Event e, NDRange global) :
10043*61046927SAndroid Build Coastguard Worker       queue_(queue),
10044*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
10045*61046927SAndroid Build Coastguard Worker       global_(global),
10046*61046927SAndroid Build Coastguard Worker       local_(NullRange)
10047*61046927SAndroid Build Coastguard Worker     {
10048*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
10049*61046927SAndroid Build Coastguard Worker     }
10050*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,Event e,NDRange global,NDRange local)10051*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) :
10052*61046927SAndroid Build Coastguard Worker       queue_(queue),
10053*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
10054*61046927SAndroid Build Coastguard Worker       global_(global),
10055*61046927SAndroid Build Coastguard Worker       local_(local)
10056*61046927SAndroid Build Coastguard Worker     {
10057*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
10058*61046927SAndroid Build Coastguard Worker     }
10059*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,Event e,NDRange offset,NDRange global,NDRange local)10060*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) :
10061*61046927SAndroid Build Coastguard Worker       queue_(queue),
10062*61046927SAndroid Build Coastguard Worker       offset_(offset),
10063*61046927SAndroid Build Coastguard Worker       global_(global),
10064*61046927SAndroid Build Coastguard Worker       local_(local)
10065*61046927SAndroid Build Coastguard Worker     {
10066*61046927SAndroid Build Coastguard Worker         events_.push_back(e);
10067*61046927SAndroid Build Coastguard Worker     }
10068*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,const vector<Event> & events,NDRange global)10069*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, const vector<Event> &events, NDRange global) :
10070*61046927SAndroid Build Coastguard Worker       queue_(queue),
10071*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
10072*61046927SAndroid Build Coastguard Worker       global_(global),
10073*61046927SAndroid Build Coastguard Worker       local_(NullRange),
10074*61046927SAndroid Build Coastguard Worker       events_(events)
10075*61046927SAndroid Build Coastguard Worker     {
10076*61046927SAndroid Build Coastguard Worker 
10077*61046927SAndroid Build Coastguard Worker     }
10078*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,const vector<Event> & events,NDRange global,NDRange local)10079*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, const vector<Event> &events, NDRange global, NDRange local) :
10080*61046927SAndroid Build Coastguard Worker       queue_(queue),
10081*61046927SAndroid Build Coastguard Worker       offset_(NullRange),
10082*61046927SAndroid Build Coastguard Worker       global_(global),
10083*61046927SAndroid Build Coastguard Worker       local_(local),
10084*61046927SAndroid Build Coastguard Worker       events_(events)
10085*61046927SAndroid Build Coastguard Worker     {
10086*61046927SAndroid Build Coastguard Worker 
10087*61046927SAndroid Build Coastguard Worker     }
10088*61046927SAndroid Build Coastguard Worker 
EnqueueArgs(CommandQueue & queue,const vector<Event> & events,NDRange offset,NDRange global,NDRange local)10089*61046927SAndroid Build Coastguard Worker     EnqueueArgs(CommandQueue &queue, const vector<Event> &events, NDRange offset, NDRange global, NDRange local) :
10090*61046927SAndroid Build Coastguard Worker       queue_(queue),
10091*61046927SAndroid Build Coastguard Worker       offset_(offset),
10092*61046927SAndroid Build Coastguard Worker       global_(global),
10093*61046927SAndroid Build Coastguard Worker       local_(local),
10094*61046927SAndroid Build Coastguard Worker       events_(events)
10095*61046927SAndroid Build Coastguard Worker     {
10096*61046927SAndroid Build Coastguard Worker 
10097*61046927SAndroid Build Coastguard Worker     }
10098*61046927SAndroid Build Coastguard Worker };
10099*61046927SAndroid Build Coastguard Worker 
10100*61046927SAndroid Build Coastguard Worker 
10101*61046927SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------
10102*61046927SAndroid Build Coastguard Worker 
10103*61046927SAndroid Build Coastguard Worker 
10104*61046927SAndroid Build Coastguard Worker /**
10105*61046927SAndroid Build Coastguard Worker  * Type safe kernel functor.
10106*61046927SAndroid Build Coastguard Worker  *
10107*61046927SAndroid Build Coastguard Worker  */
10108*61046927SAndroid Build Coastguard Worker template<typename... Ts>
10109*61046927SAndroid Build Coastguard Worker class KernelFunctor
10110*61046927SAndroid Build Coastguard Worker {
10111*61046927SAndroid Build Coastguard Worker private:
10112*61046927SAndroid Build Coastguard Worker     Kernel kernel_;
10113*61046927SAndroid Build Coastguard Worker 
10114*61046927SAndroid Build Coastguard Worker     template<int index, typename T0, typename... T1s>
setArgs(T0 && t0,T1s &&...t1s)10115*61046927SAndroid Build Coastguard Worker     void setArgs(T0&& t0, T1s&&... t1s)
10116*61046927SAndroid Build Coastguard Worker     {
10117*61046927SAndroid Build Coastguard Worker         kernel_.setArg(index, t0);
10118*61046927SAndroid Build Coastguard Worker         setArgs<index + 1, T1s...>(std::forward<T1s>(t1s)...);
10119*61046927SAndroid Build Coastguard Worker     }
10120*61046927SAndroid Build Coastguard Worker 
10121*61046927SAndroid Build Coastguard Worker     template<int index, typename T0>
setArgs(T0 && t0)10122*61046927SAndroid Build Coastguard Worker     void setArgs(T0&& t0)
10123*61046927SAndroid Build Coastguard Worker     {
10124*61046927SAndroid Build Coastguard Worker         kernel_.setArg(index, t0);
10125*61046927SAndroid Build Coastguard Worker     }
10126*61046927SAndroid Build Coastguard Worker 
10127*61046927SAndroid Build Coastguard Worker     template<int index>
setArgs()10128*61046927SAndroid Build Coastguard Worker     void setArgs()
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 public:
KernelFunctor(Kernel kernel)10134*61046927SAndroid Build Coastguard Worker     KernelFunctor(Kernel kernel) : kernel_(kernel)
10135*61046927SAndroid Build Coastguard Worker     {}
10136*61046927SAndroid Build Coastguard Worker 
KernelFunctor(const Program & program,const string name,cl_int * err=NULL)10137*61046927SAndroid Build Coastguard Worker     KernelFunctor(
10138*61046927SAndroid Build Coastguard Worker         const Program& program,
10139*61046927SAndroid Build Coastguard Worker         const string name,
10140*61046927SAndroid Build Coastguard Worker         cl_int * err = NULL) :
10141*61046927SAndroid Build Coastguard Worker         kernel_(program, name.c_str(), err)
10142*61046927SAndroid Build Coastguard Worker     {}
10143*61046927SAndroid Build Coastguard Worker 
10144*61046927SAndroid Build Coastguard Worker     //! \brief Return type of the functor
10145*61046927SAndroid Build Coastguard Worker     typedef Event result_type;
10146*61046927SAndroid Build Coastguard Worker 
10147*61046927SAndroid Build Coastguard Worker     /**
10148*61046927SAndroid Build Coastguard Worker      * Enqueue kernel.
10149*61046927SAndroid Build Coastguard Worker      * @param args Launch parameters of the kernel.
10150*61046927SAndroid Build Coastguard Worker      * @param t0... List of kernel arguments based on the template type of the functor.
10151*61046927SAndroid Build Coastguard Worker      */
operator ()(const EnqueueArgs & args,Ts...ts)10152*61046927SAndroid Build Coastguard Worker     Event operator() (
10153*61046927SAndroid Build Coastguard Worker         const EnqueueArgs& args,
10154*61046927SAndroid Build Coastguard Worker         Ts... ts)
10155*61046927SAndroid Build Coastguard Worker     {
10156*61046927SAndroid Build Coastguard Worker         Event event;
10157*61046927SAndroid Build Coastguard Worker         setArgs<0>(std::forward<Ts>(ts)...);
10158*61046927SAndroid Build Coastguard Worker 
10159*61046927SAndroid Build Coastguard Worker         args.queue_.enqueueNDRangeKernel(
10160*61046927SAndroid Build Coastguard Worker             kernel_,
10161*61046927SAndroid Build Coastguard Worker             args.offset_,
10162*61046927SAndroid Build Coastguard Worker             args.global_,
10163*61046927SAndroid Build Coastguard Worker             args.local_,
10164*61046927SAndroid Build Coastguard Worker             &args.events_,
10165*61046927SAndroid Build Coastguard Worker             &event);
10166*61046927SAndroid Build Coastguard Worker 
10167*61046927SAndroid Build Coastguard Worker         return event;
10168*61046927SAndroid Build Coastguard Worker     }
10169*61046927SAndroid Build Coastguard Worker 
10170*61046927SAndroid Build Coastguard Worker     /**
10171*61046927SAndroid Build Coastguard Worker     * Enqueue kernel with support for error code.
10172*61046927SAndroid Build Coastguard Worker     * @param args Launch parameters of the kernel.
10173*61046927SAndroid Build Coastguard Worker     * @param t0... List of kernel arguments based on the template type of the functor.
10174*61046927SAndroid Build Coastguard Worker     * @param error Out parameter returning the error code from the execution.
10175*61046927SAndroid Build Coastguard Worker     */
operator ()(const EnqueueArgs & args,Ts...ts,cl_int & error)10176*61046927SAndroid Build Coastguard Worker     Event operator() (
10177*61046927SAndroid Build Coastguard Worker         const EnqueueArgs& args,
10178*61046927SAndroid Build Coastguard Worker         Ts... ts,
10179*61046927SAndroid Build Coastguard Worker         cl_int &error)
10180*61046927SAndroid Build Coastguard Worker     {
10181*61046927SAndroid Build Coastguard Worker         Event event;
10182*61046927SAndroid Build Coastguard Worker         setArgs<0>(std::forward<Ts>(ts)...);
10183*61046927SAndroid Build Coastguard Worker 
10184*61046927SAndroid Build Coastguard Worker         error = args.queue_.enqueueNDRangeKernel(
10185*61046927SAndroid Build Coastguard Worker             kernel_,
10186*61046927SAndroid Build Coastguard Worker             args.offset_,
10187*61046927SAndroid Build Coastguard Worker             args.global_,
10188*61046927SAndroid Build Coastguard Worker             args.local_,
10189*61046927SAndroid Build Coastguard Worker             &args.events_,
10190*61046927SAndroid Build Coastguard Worker             &event);
10191*61046927SAndroid Build Coastguard Worker 
10192*61046927SAndroid Build Coastguard Worker         return event;
10193*61046927SAndroid Build Coastguard Worker     }
10194*61046927SAndroid Build Coastguard Worker 
10195*61046927SAndroid Build Coastguard Worker #if CL_HPP_TARGET_OPENCL_VERSION >= 200
setSVMPointers(const vector<void * > & pointerList)10196*61046927SAndroid Build Coastguard Worker     cl_int setSVMPointers(const vector<void*> &pointerList)
10197*61046927SAndroid Build Coastguard Worker     {
10198*61046927SAndroid Build Coastguard Worker         return kernel_.setSVMPointers(pointerList);
10199*61046927SAndroid Build Coastguard Worker     }
10200*61046927SAndroid Build Coastguard Worker 
10201*61046927SAndroid Build Coastguard Worker     template<typename T0, typename... T1s>
setSVMPointers(const T0 & t0,T1s &...ts)10202*61046927SAndroid Build Coastguard Worker     cl_int setSVMPointers(const T0 &t0, T1s &... ts)
10203*61046927SAndroid Build Coastguard Worker     {
10204*61046927SAndroid Build Coastguard Worker         return kernel_.setSVMPointers(t0, ts...);
10205*61046927SAndroid Build Coastguard Worker     }
10206*61046927SAndroid Build Coastguard Worker #endif // #if CL_HPP_TARGET_OPENCL_VERSION >= 200
10207*61046927SAndroid Build Coastguard Worker 
getKernel()10208*61046927SAndroid Build Coastguard Worker     Kernel getKernel()
10209*61046927SAndroid Build Coastguard Worker     {
10210*61046927SAndroid Build Coastguard Worker         return kernel_;
10211*61046927SAndroid Build Coastguard Worker     }
10212*61046927SAndroid Build Coastguard Worker };
10213*61046927SAndroid Build Coastguard Worker 
10214*61046927SAndroid Build Coastguard Worker namespace compatibility {
10215*61046927SAndroid Build Coastguard Worker     /**
10216*61046927SAndroid Build Coastguard Worker      * Backward compatibility class to ensure that cl.hpp code works with opencl.hpp.
10217*61046927SAndroid Build Coastguard Worker      * Please use KernelFunctor directly.
10218*61046927SAndroid Build Coastguard Worker      */
10219*61046927SAndroid Build Coastguard Worker     template<typename... Ts>
10220*61046927SAndroid Build Coastguard Worker     struct make_kernel
10221*61046927SAndroid Build Coastguard Worker     {
10222*61046927SAndroid Build Coastguard Worker         typedef KernelFunctor<Ts...> FunctorType;
10223*61046927SAndroid Build Coastguard Worker 
10224*61046927SAndroid Build Coastguard Worker         FunctorType functor_;
10225*61046927SAndroid Build Coastguard Worker 
make_kernelcl::compatibility::make_kernel10226*61046927SAndroid Build Coastguard Worker         make_kernel(
10227*61046927SAndroid Build Coastguard Worker             const Program& program,
10228*61046927SAndroid Build Coastguard Worker             const string name,
10229*61046927SAndroid Build Coastguard Worker             cl_int * err = NULL) :
10230*61046927SAndroid Build Coastguard Worker             functor_(FunctorType(program, name, err))
10231*61046927SAndroid Build Coastguard Worker         {}
10232*61046927SAndroid Build Coastguard Worker 
make_kernelcl::compatibility::make_kernel10233*61046927SAndroid Build Coastguard Worker         make_kernel(
10234*61046927SAndroid Build Coastguard Worker             const Kernel kernel) :
10235*61046927SAndroid Build Coastguard Worker             functor_(FunctorType(kernel))
10236*61046927SAndroid Build Coastguard Worker         {}
10237*61046927SAndroid Build Coastguard Worker 
10238*61046927SAndroid Build Coastguard Worker         //! \brief Return type of the functor
10239*61046927SAndroid Build Coastguard Worker         typedef Event result_type;
10240*61046927SAndroid Build Coastguard Worker 
10241*61046927SAndroid Build Coastguard Worker         //! \brief Function signature of kernel functor with no event dependency.
10242*61046927SAndroid Build Coastguard Worker         typedef Event type_(
10243*61046927SAndroid Build Coastguard Worker             const EnqueueArgs&,
10244*61046927SAndroid Build Coastguard Worker             Ts...);
10245*61046927SAndroid Build Coastguard Worker 
operator ()cl::compatibility::make_kernel10246*61046927SAndroid Build Coastguard Worker         Event operator()(
10247*61046927SAndroid Build Coastguard Worker             const EnqueueArgs& enqueueArgs,
10248*61046927SAndroid Build Coastguard Worker             Ts... args)
10249*61046927SAndroid Build Coastguard Worker         {
10250*61046927SAndroid Build Coastguard Worker             return functor_(
10251*61046927SAndroid Build Coastguard Worker                 enqueueArgs, args...);
10252*61046927SAndroid Build Coastguard Worker         }
10253*61046927SAndroid Build Coastguard Worker     };
10254*61046927SAndroid Build Coastguard Worker } // namespace compatibility
10255*61046927SAndroid Build Coastguard Worker 
10256*61046927SAndroid Build Coastguard Worker 
10257*61046927SAndroid Build Coastguard Worker //----------------------------------------------------------------------------------------------------------------------
10258*61046927SAndroid Build Coastguard Worker 
10259*61046927SAndroid Build Coastguard Worker #undef CL_HPP_ERR_STR_
10260*61046927SAndroid Build Coastguard Worker #if !defined(CL_HPP_USER_OVERRIDE_ERROR_STRINGS)
10261*61046927SAndroid Build Coastguard Worker #undef __GET_DEVICE_INFO_ERR
10262*61046927SAndroid Build Coastguard Worker #undef __GET_PLATFORM_INFO_ERR
10263*61046927SAndroid Build Coastguard Worker #undef __GET_DEVICE_IDS_ERR
10264*61046927SAndroid Build Coastguard Worker #undef __GET_PLATFORM_IDS_ERR
10265*61046927SAndroid Build Coastguard Worker #undef __GET_CONTEXT_INFO_ERR
10266*61046927SAndroid Build Coastguard Worker #undef __GET_EVENT_INFO_ERR
10267*61046927SAndroid Build Coastguard Worker #undef __GET_EVENT_PROFILE_INFO_ERR
10268*61046927SAndroid Build Coastguard Worker #undef __GET_MEM_OBJECT_INFO_ERR
10269*61046927SAndroid Build Coastguard Worker #undef __GET_IMAGE_INFO_ERR
10270*61046927SAndroid Build Coastguard Worker #undef __GET_SAMPLER_INFO_ERR
10271*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_INFO_ERR
10272*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_ARG_INFO_ERR
10273*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_SUB_GROUP_INFO_ERR
10274*61046927SAndroid Build Coastguard Worker #undef __GET_KERNEL_WORK_GROUP_INFO_ERR
10275*61046927SAndroid Build Coastguard Worker #undef __GET_PROGRAM_INFO_ERR
10276*61046927SAndroid Build Coastguard Worker #undef __GET_PROGRAM_BUILD_INFO_ERR
10277*61046927SAndroid Build Coastguard Worker #undef __GET_COMMAND_QUEUE_INFO_ERR
10278*61046927SAndroid Build Coastguard Worker #undef __CREATE_CONTEXT_ERR
10279*61046927SAndroid Build Coastguard Worker #undef __CREATE_CONTEXT_FROM_TYPE_ERR
10280*61046927SAndroid Build Coastguard Worker #undef __GET_SUPPORTED_IMAGE_FORMATS_ERR
10281*61046927SAndroid Build Coastguard Worker #undef __CREATE_BUFFER_ERR
10282*61046927SAndroid Build Coastguard Worker #undef __COPY_ERR
10283*61046927SAndroid Build Coastguard Worker #undef __CREATE_SUBBUFFER_ERR
10284*61046927SAndroid Build Coastguard Worker #undef __CREATE_GL_BUFFER_ERR
10285*61046927SAndroid Build Coastguard Worker #undef __CREATE_GL_RENDER_BUFFER_ERR
10286*61046927SAndroid Build Coastguard Worker #undef __GET_GL_OBJECT_INFO_ERR
10287*61046927SAndroid Build Coastguard Worker #undef __CREATE_IMAGE_ERR
10288*61046927SAndroid Build Coastguard Worker #undef __CREATE_GL_TEXTURE_ERR
10289*61046927SAndroid Build Coastguard Worker #undef __IMAGE_DIMENSION_ERR
10290*61046927SAndroid Build Coastguard Worker #undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR
10291*61046927SAndroid Build Coastguard Worker #undef __CREATE_USER_EVENT_ERR
10292*61046927SAndroid Build Coastguard Worker #undef __SET_USER_EVENT_STATUS_ERR
10293*61046927SAndroid Build Coastguard Worker #undef __SET_EVENT_CALLBACK_ERR
10294*61046927SAndroid Build Coastguard Worker #undef __WAIT_FOR_EVENTS_ERR
10295*61046927SAndroid Build Coastguard Worker #undef __CREATE_KERNEL_ERR
10296*61046927SAndroid Build Coastguard Worker #undef __SET_KERNEL_ARGS_ERR
10297*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_SOURCE_ERR
10298*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_IL_ERR
10299*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_BINARY_ERR
10300*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_IL_ERR
10301*61046927SAndroid Build Coastguard Worker #undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR
10302*61046927SAndroid Build Coastguard Worker #undef __BUILD_PROGRAM_ERR
10303*61046927SAndroid Build Coastguard Worker #undef __COMPILE_PROGRAM_ERR
10304*61046927SAndroid Build Coastguard Worker #undef __LINK_PROGRAM_ERR
10305*61046927SAndroid Build Coastguard Worker #undef __CREATE_KERNELS_IN_PROGRAM_ERR
10306*61046927SAndroid Build Coastguard Worker #undef __CREATE_COMMAND_QUEUE_WITH_PROPERTIES_ERR
10307*61046927SAndroid Build Coastguard Worker #undef __CREATE_SAMPLER_WITH_PROPERTIES_ERR
10308*61046927SAndroid Build Coastguard Worker #undef __SET_COMMAND_QUEUE_PROPERTY_ERR
10309*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_READ_BUFFER_ERR
10310*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_READ_BUFFER_RECT_ERR
10311*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WRITE_BUFFER_ERR
10312*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WRITE_BUFFER_RECT_ERR
10313*61046927SAndroid Build Coastguard Worker #undef __ENQEUE_COPY_BUFFER_ERR
10314*61046927SAndroid Build Coastguard Worker #undef __ENQEUE_COPY_BUFFER_RECT_ERR
10315*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_FILL_BUFFER_ERR
10316*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_READ_IMAGE_ERR
10317*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WRITE_IMAGE_ERR
10318*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_COPY_IMAGE_ERR
10319*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_FILL_IMAGE_ERR
10320*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR
10321*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR
10322*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MAP_BUFFER_ERR
10323*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MAP_IMAGE_ERR
10324*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR
10325*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_NDRANGE_KERNEL_ERR
10326*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_NATIVE_KERNEL
10327*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR
10328*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MIGRATE_SVM_ERR
10329*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_ACQUIRE_GL_ERR
10330*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_RELEASE_GL_ERR
10331*61046927SAndroid Build Coastguard Worker #undef __CREATE_PIPE_ERR
10332*61046927SAndroid Build Coastguard Worker #undef __GET_PIPE_INFO_ERR
10333*61046927SAndroid Build Coastguard Worker #undef __RETAIN_ERR
10334*61046927SAndroid Build Coastguard Worker #undef __RELEASE_ERR
10335*61046927SAndroid Build Coastguard Worker #undef __FLUSH_ERR
10336*61046927SAndroid Build Coastguard Worker #undef __FINISH_ERR
10337*61046927SAndroid Build Coastguard Worker #undef __VECTOR_CAPACITY_ERR
10338*61046927SAndroid Build Coastguard Worker #undef __CREATE_SUB_DEVICES_ERR
10339*61046927SAndroid Build Coastguard Worker #undef __CREATE_SUB_DEVICES_ERR
10340*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MARKER_ERR
10341*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_WAIT_FOR_EVENTS_ERR
10342*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_BARRIER_ERR
10343*61046927SAndroid Build Coastguard Worker #undef __UNLOAD_COMPILER_ERR
10344*61046927SAndroid Build Coastguard Worker #undef __CREATE_GL_TEXTURE_2D_ERR
10345*61046927SAndroid Build Coastguard Worker #undef __CREATE_GL_TEXTURE_3D_ERR
10346*61046927SAndroid Build Coastguard Worker #undef __CREATE_IMAGE2D_ERR
10347*61046927SAndroid Build Coastguard Worker #undef __CREATE_IMAGE3D_ERR
10348*61046927SAndroid Build Coastguard Worker #undef __CREATE_COMMAND_QUEUE_ERR
10349*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_TASK_ERR
10350*61046927SAndroid Build Coastguard Worker #undef __CREATE_SAMPLER_ERR
10351*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_MARKER_WAIT_LIST_ERR
10352*61046927SAndroid Build Coastguard Worker #undef __ENQUEUE_BARRIER_WAIT_LIST_ERR
10353*61046927SAndroid Build Coastguard Worker #undef __CLONE_KERNEL_ERR
10354*61046927SAndroid Build Coastguard Worker #undef __GET_HOST_TIMER_ERR
10355*61046927SAndroid Build Coastguard Worker #undef __GET_DEVICE_AND_HOST_TIMER_ERR
10356*61046927SAndroid Build Coastguard Worker 
10357*61046927SAndroid Build Coastguard Worker #endif //CL_HPP_USER_OVERRIDE_ERROR_STRINGS
10358*61046927SAndroid Build Coastguard Worker 
10359*61046927SAndroid Build Coastguard Worker // Extensions
10360*61046927SAndroid Build Coastguard Worker #undef CL_HPP_INIT_CL_EXT_FCN_PTR_
10361*61046927SAndroid Build Coastguard Worker #undef CL_HPP_INIT_CL_EXT_FCN_PTR_PLATFORM_
10362*61046927SAndroid Build Coastguard Worker 
10363*61046927SAndroid Build Coastguard Worker #if defined(CL_HPP_USE_CL_DEVICE_FISSION)
10364*61046927SAndroid Build Coastguard Worker #undef CL_HPP_PARAM_NAME_DEVICE_FISSION_
10365*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_USE_CL_DEVICE_FISSION
10366*61046927SAndroid Build Coastguard Worker 
10367*61046927SAndroid Build Coastguard Worker #undef CL_HPP_NOEXCEPT_
10368*61046927SAndroid Build Coastguard Worker #undef CL_HPP_DEFINE_STATIC_MEMBER_
10369*61046927SAndroid Build Coastguard Worker 
10370*61046927SAndroid Build Coastguard Worker } // namespace cl
10371*61046927SAndroid Build Coastguard Worker 
10372*61046927SAndroid Build Coastguard Worker #endif // CL_HPP_
10373