Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/include/opencl/1.2/CL/cl.hpp
16348 views
1
/*******************************************************************************
2
* Copyright (c) 2008-2013 The Khronos Group Inc.
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and/or associated documentation files (the
6
* "Materials"), to deal in the Materials without restriction, including
7
* without limitation the rights to use, copy, modify, merge, publish,
8
* distribute, sublicense, and/or sell copies of the Materials, and to
9
* permit persons to whom the Materials are furnished to do so, subject to
10
* the following conditions:
11
*
12
* The above copyright notice and this permission notice shall be included
13
* in all copies or substantial portions of the Materials.
14
*
15
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
22
******************************************************************************/
23
24
/*! \file
25
*
26
* \brief C++ bindings for OpenCL 1.0 (rev 48), OpenCL 1.1 (rev 33) and
27
* OpenCL 1.2 (rev 15)
28
* \author Benedict R. Gaster, Laurent Morichetti and Lee Howes
29
*
30
* Additions and fixes from:
31
* Brian Cole, March 3rd 2010 and April 2012
32
* Matt Gruenke, April 2012.
33
* Bruce Merry, February 2013.
34
*
35
* \version 1.2.5
36
* \date June 2013
37
*
38
* Optional extension support
39
*
40
* cl
41
* cl_ext_device_fission
42
* #define USE_CL_DEVICE_FISSION
43
*/
44
45
/*! \mainpage
46
* \section intro Introduction
47
* For many large applications C++ is the language of choice and so it seems
48
* reasonable to define C++ bindings for OpenCL.
49
*
50
*
51
* The interface is contained with a single C++ header file \em cl.hpp and all
52
* definitions are contained within the namespace \em cl. There is no additional
53
* requirement to include \em cl.h and to use either the C++ or original C
54
* bindings it is enough to simply include \em cl.hpp.
55
*
56
* The bindings themselves are lightweight and correspond closely to the
57
* underlying C API. Using the C++ bindings introduces no additional execution
58
* overhead.
59
*
60
* For detail documentation on the bindings see:
61
*
62
* The OpenCL C++ Wrapper API 1.2 (revision 09)
63
* http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf
64
*
65
* \section example Example
66
*
67
* The following example shows a general use case for the C++
68
* bindings, including support for the optional exception feature and
69
* also the supplied vector and string classes, see following sections for
70
* decriptions of these features.
71
*
72
* \code
73
* #define __CL_ENABLE_EXCEPTIONS
74
*
75
* #if defined(__APPLE__) || defined(__MACOSX)
76
* #include <OpenCL/cl.hpp>
77
* #else
78
* #include <CL/cl.hpp>
79
* #endif
80
* #include <cstdio>
81
* #include <cstdlib>
82
* #include <iostream>
83
*
84
* const char * helloStr = "__kernel void "
85
* "hello(void) "
86
* "{ "
87
* " "
88
* "} ";
89
*
90
* int
91
* main(void)
92
* {
93
* cl_int err = CL_SUCCESS;
94
* try {
95
*
96
* std::vector<cl::Platform> platforms;
97
* cl::Platform::get(&platforms);
98
* if (platforms.size() == 0) {
99
* std::cout << "Platform size 0\n";
100
* return -1;
101
* }
102
*
103
* cl_context_properties properties[] =
104
* { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
105
* cl::Context context(CL_DEVICE_TYPE_CPU, properties);
106
*
107
* std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
108
*
109
* cl::Program::Sources source(1,
110
* std::make_pair(helloStr,strlen(helloStr)));
111
* cl::Program program_ = cl::Program(context, source);
112
* program_.build(devices);
113
*
114
* cl::Kernel kernel(program_, "hello", &err);
115
*
116
* cl::Event event;
117
* cl::CommandQueue queue(context, devices[0], 0, &err);
118
* queue.enqueueNDRangeKernel(
119
* kernel,
120
* cl::NullRange,
121
* cl::NDRange(4,4),
122
* cl::NullRange,
123
* NULL,
124
* &event);
125
*
126
* event.wait();
127
* }
128
* catch (cl::Error err) {
129
* std::cerr
130
* << "ERROR: "
131
* << err.what()
132
* << "("
133
* << err.err()
134
* << ")"
135
* << std::endl;
136
* }
137
*
138
* return EXIT_SUCCESS;
139
* }
140
*
141
* \endcode
142
*
143
*/
144
#ifndef CL_HPP_
145
#define CL_HPP_
146
147
#ifdef _WIN32
148
149
#include <windows.h>
150
#include <malloc.h>
151
#include <iterator>
152
#include <intrin.h>
153
154
#if defined(__CL_ENABLE_EXCEPTIONS)
155
#include <exception>
156
#endif // #if defined(__CL_ENABLE_EXCEPTIONS)
157
158
#pragma push_macro("max")
159
#undef max
160
#if defined(USE_DX_INTEROP)
161
#include <CL/cl_d3d10.h>
162
#include <CL/cl_dx9_media_sharing.h>
163
#endif
164
#endif // _WIN32
165
166
//
167
#if defined(USE_CL_DEVICE_FISSION)
168
#include <CL/cl_ext.h>
169
#endif
170
171
#if defined(__APPLE__) || defined(__MACOSX)
172
#include <OpenGL/OpenGL.h>
173
#include <OpenCL/opencl.h>
174
#include <libkern/OSAtomic.h>
175
#else
176
#include <GL/gl.h>
177
#include <CL/opencl.h>
178
#endif // !__APPLE__
179
180
// To avoid accidentally taking ownership of core OpenCL types
181
// such as cl_kernel constructors are made explicit
182
// under OpenCL 1.2
183
#if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
184
#define __CL_EXPLICIT_CONSTRUCTORS explicit
185
#else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
186
#define __CL_EXPLICIT_CONSTRUCTORS
187
#endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
188
189
// Define deprecated prefixes and suffixes to ensure compilation
190
// in case they are not pre-defined
191
#if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
192
#define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
193
#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
194
#if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED)
195
#define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
196
#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
197
198
#if !defined(CL_CALLBACK)
199
#define CL_CALLBACK
200
#endif //CL_CALLBACK
201
202
#include <utility>
203
#include <limits>
204
205
#if !defined(__NO_STD_VECTOR)
206
#include <vector>
207
#endif
208
209
#if !defined(__NO_STD_STRING)
210
#include <string>
211
#endif
212
213
#if defined(__linux__) || defined(__APPLE__) || defined(__MACOSX)
214
#include <alloca.h>
215
216
#include <emmintrin.h>
217
#include <xmmintrin.h>
218
#endif // linux
219
220
#include <cstring>
221
222
223
/*! \namespace cl
224
*
225
* \brief The OpenCL C++ bindings are defined within this namespace.
226
*
227
*/
228
namespace cl {
229
230
class Memory;
231
232
/**
233
* Deprecated APIs for 1.2
234
*/
235
#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
236
#define __INIT_CL_EXT_FCN_PTR(name) \
237
if(!pfn_##name) { \
238
pfn_##name = (PFN_##name) \
239
clGetExtensionFunctionAddress(#name); \
240
if(!pfn_##name) { \
241
} \
242
}
243
#endif // #if defined(CL_VERSION_1_1)
244
245
#if defined(CL_VERSION_1_2)
246
#define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \
247
if(!pfn_##name) { \
248
pfn_##name = (PFN_##name) \
249
clGetExtensionFunctionAddressForPlatform(platform, #name); \
250
if(!pfn_##name) { \
251
} \
252
}
253
#endif // #if defined(CL_VERSION_1_1)
254
255
class Program;
256
class Device;
257
class Context;
258
class CommandQueue;
259
class Memory;
260
class Buffer;
261
262
#if defined(__CL_ENABLE_EXCEPTIONS)
263
/*! \brief Exception class
264
*
265
* This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined.
266
*/
267
class Error : public std::exception
268
{
269
private:
270
cl_int err_;
271
const char * errStr_;
272
public:
273
/*! \brief Create a new CL error exception for a given error code
274
* and corresponding message.
275
*
276
* \param err error code value.
277
*
278
* \param errStr a descriptive string that must remain in scope until
279
* handling of the exception has concluded. If set, it
280
* will be returned by what().
281
*/
282
Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr)
283
{}
284
285
~Error() throw() {}
286
287
/*! \brief Get error string associated with exception
288
*
289
* \return A memory pointer to the error message string.
290
*/
291
virtual const char * what() const throw ()
292
{
293
if (errStr_ == NULL) {
294
return "empty";
295
}
296
else {
297
return errStr_;
298
}
299
}
300
301
/*! \brief Get error code associated with exception
302
*
303
* \return The error code.
304
*/
305
cl_int err(void) const { return err_; }
306
};
307
308
#define __ERR_STR(x) #x
309
#else
310
#define __ERR_STR(x) NULL
311
#endif // __CL_ENABLE_EXCEPTIONS
312
313
314
namespace detail
315
{
316
#if defined(__CL_ENABLE_EXCEPTIONS)
317
static inline cl_int errHandler (
318
cl_int err,
319
const char * errStr = NULL)
320
{
321
if (err != CL_SUCCESS) {
322
throw Error(err, errStr);
323
}
324
return err;
325
}
326
#else
327
static inline cl_int errHandler (cl_int err, const char * errStr = NULL)
328
{
329
(void) errStr; // suppress unused variable warning
330
return err;
331
}
332
#endif // __CL_ENABLE_EXCEPTIONS
333
}
334
335
336
337
//! \cond DOXYGEN_DETAIL
338
#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
339
#define __GET_DEVICE_INFO_ERR __ERR_STR(clGetDeviceInfo)
340
#define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo)
341
#define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs)
342
#define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs)
343
#define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo)
344
#define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo)
345
#define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo)
346
#define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo)
347
#define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo)
348
#define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo)
349
#define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo)
350
#if defined(CL_VERSION_1_2)
351
#define __GET_KERNEL_ARG_INFO_ERR __ERR_STR(clGetKernelArgInfo)
352
#endif // #if defined(CL_VERSION_1_2)
353
#define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo)
354
#define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo)
355
#define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo)
356
#define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo)
357
358
#define __CREATE_CONTEXT_ERR __ERR_STR(clCreateContext)
359
#define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType)
360
#define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats)
361
362
#define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer)
363
#define __COPY_ERR __ERR_STR(cl::copy)
364
#define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer)
365
#define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)
366
#define __CREATE_GL_RENDER_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)
367
#define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo)
368
#if defined(CL_VERSION_1_2)
369
#define __CREATE_IMAGE_ERR __ERR_STR(clCreateImage)
370
#define __CREATE_GL_TEXTURE_ERR __ERR_STR(clCreateFromGLTexture)
371
#define __IMAGE_DIMENSION_ERR __ERR_STR(Incorrect image dimensions)
372
#endif // #if defined(CL_VERSION_1_2)
373
#define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler)
374
#define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback)
375
376
#define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent)
377
#define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus)
378
#define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback)
379
#define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents)
380
381
#define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel)
382
#define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg)
383
#define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource)
384
#define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary)
385
#if defined(CL_VERSION_1_2)
386
#define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR __ERR_STR(clCreateProgramWithBuiltInKernels)
387
#endif // #if defined(CL_VERSION_1_2)
388
#define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram)
389
#if defined(CL_VERSION_1_2)
390
#define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram)
391
392
#endif // #if defined(CL_VERSION_1_2)
393
#define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram)
394
395
#define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue)
396
#define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty)
397
#define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer)
398
#define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect)
399
#define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer)
400
#define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect)
401
#define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer)
402
#define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect)
403
#define __ENQUEUE_FILL_BUFFER_ERR __ERR_STR(clEnqueueFillBuffer)
404
#define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage)
405
#define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage)
406
#define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage)
407
#define __ENQUEUE_FILL_IMAGE_ERR __ERR_STR(clEnqueueFillImage)
408
#define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer)
409
#define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage)
410
#define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer)
411
#define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage)
412
#define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject)
413
#define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel)
414
#define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask)
415
#define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel)
416
#if defined(CL_VERSION_1_2)
417
#define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR __ERR_STR(clEnqueueMigrateMemObjects)
418
#endif // #if defined(CL_VERSION_1_2)
419
420
#define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects)
421
#define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects)
422
423
424
#define __RETAIN_ERR __ERR_STR(Retain Object)
425
#define __RELEASE_ERR __ERR_STR(Release Object)
426
#define __FLUSH_ERR __ERR_STR(clFlush)
427
#define __FINISH_ERR __ERR_STR(clFinish)
428
#define __VECTOR_CAPACITY_ERR __ERR_STR(Vector capacity error)
429
430
/**
431
* CL 1.2 version that uses device fission.
432
*/
433
#if defined(CL_VERSION_1_2)
434
#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevices)
435
#else
436
#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT)
437
#endif // #if defined(CL_VERSION_1_2)
438
439
/**
440
* Deprecated APIs for 1.2
441
*/
442
#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
443
#define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker)
444
#define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents)
445
#define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier)
446
#define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler)
447
#define __CREATE_GL_TEXTURE_2D_ERR __ERR_STR(clCreateFromGLTexture2D)
448
#define __CREATE_GL_TEXTURE_3D_ERR __ERR_STR(clCreateFromGLTexture3D)
449
#define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D)
450
#define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D)
451
#endif // #if defined(CL_VERSION_1_1)
452
453
#endif // __CL_USER_OVERRIDE_ERROR_STRINGS
454
//! \endcond
455
456
/**
457
* CL 1.2 marker and barrier commands
458
*/
459
#if defined(CL_VERSION_1_2)
460
#define __ENQUEUE_MARKER_WAIT_LIST_ERR __ERR_STR(clEnqueueMarkerWithWaitList)
461
#define __ENQUEUE_BARRIER_WAIT_LIST_ERR __ERR_STR(clEnqueueBarrierWithWaitList)
462
#endif // #if defined(CL_VERSION_1_2)
463
464
#if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING)
465
typedef std::string STRING_CLASS;
466
#elif !defined(__USE_DEV_STRING)
467
468
/*! \class string
469
* \brief Simple string class, that provides a limited subset of std::string
470
* functionality but avoids many of the issues that come with that class.
471
472
* \note Deprecated. Please use std::string as default or
473
* re-define the string class to match the std::string
474
* interface by defining STRING_CLASS
475
*/
476
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
477
{
478
private:
479
::size_t size_;
480
char * str_;
481
public:
482
//! \brief Constructs an empty string, allocating no memory.
483
string(void) : size_(0), str_(NULL)
484
{
485
}
486
487
/*! \brief Constructs a string populated from an arbitrary value of
488
* specified size.
489
*
490
* An extra '\0' is added, in case none was contained in str.
491
*
492
* \param str the initial value of the string instance. Note that '\0'
493
* characters receive no special treatment. If NULL,
494
* the string is left empty, with a size of 0.
495
*
496
* \param size the number of characters to copy from str.
497
*/
498
string(const char * str, ::size_t size) :
499
size_(size),
500
str_(NULL)
501
{
502
if( size > 0 ) {
503
str_ = new char[size_+1];
504
if (str_ != NULL) {
505
memcpy(str_, str, size_ * sizeof(char));
506
str_[size_] = '\0';
507
}
508
else {
509
size_ = 0;
510
}
511
}
512
}
513
514
/*! \brief Constructs a string populated from a null-terminated value.
515
*
516
* \param str the null-terminated initial value of the string instance.
517
* If NULL, the string is left empty, with a size of 0.
518
*/
519
string(const char * str) :
520
size_(0),
521
str_(NULL)
522
{
523
if( str ) {
524
size_= ::strlen(str);
525
}
526
if( size_ > 0 ) {
527
str_ = new char[size_ + 1];
528
if (str_ != NULL) {
529
memcpy(str_, str, (size_ + 1) * sizeof(char));
530
}
531
}
532
}
533
534
void resize( ::size_t n )
535
{
536
if( size_ == n ) {
537
return;
538
}
539
if (n == 0) {
540
if( str_ ) {
541
delete [] str_;
542
}
543
str_ = NULL;
544
size_ = 0;
545
}
546
else {
547
char *newString = new char[n + 1];
548
int copySize = n;
549
if( size_ < n ) {
550
copySize = size_;
551
}
552
size_ = n;
553
554
if(str_) {
555
memcpy(newString, str_, (copySize + 1) * sizeof(char));
556
}
557
if( copySize < size_ ) {
558
memset(newString + copySize, 0, size_ - copySize);
559
}
560
newString[size_] = '\0';
561
562
delete [] str_;
563
str_ = newString;
564
}
565
}
566
567
const char& operator[] ( ::size_t pos ) const
568
{
569
return str_[pos];
570
}
571
572
char& operator[] ( ::size_t pos )
573
{
574
return str_[pos];
575
}
576
577
/*! \brief Copies the value of another string to this one.
578
*
579
* \param rhs the string to copy.
580
*
581
* \returns a reference to the modified instance.
582
*/
583
string& operator=(const string& rhs)
584
{
585
if (this == &rhs) {
586
return *this;
587
}
588
589
if( str_ != NULL ) {
590
delete [] str_;
591
str_ = NULL;
592
size_ = 0;
593
}
594
595
if (rhs.size_ == 0 || rhs.str_ == NULL) {
596
str_ = NULL;
597
size_ = 0;
598
}
599
else {
600
str_ = new char[rhs.size_ + 1];
601
size_ = rhs.size_;
602
603
if (str_ != NULL) {
604
memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char));
605
}
606
else {
607
size_ = 0;
608
}
609
}
610
611
return *this;
612
}
613
614
/*! \brief Constructs a string by copying the value of another instance.
615
*
616
* \param rhs the string to copy.
617
*/
618
string(const string& rhs) :
619
size_(0),
620
str_(NULL)
621
{
622
*this = rhs;
623
}
624
625
//! \brief Destructor - frees memory used to hold the current value.
626
~string()
627
{
628
delete[] str_;
629
str_ = NULL;
630
}
631
632
//! \brief Queries the length of the string, excluding any added '\0's.
633
::size_t size(void) const { return size_; }
634
635
//! \brief Queries the length of the string, excluding any added '\0's.
636
::size_t length(void) const { return size(); }
637
638
/*! \brief Returns a pointer to the private copy held by this instance,
639
* or "" if empty/unset.
640
*/
641
const char * c_str(void) const { return (str_) ? str_ : "";}
642
};
643
typedef cl::string STRING_CLASS;
644
#endif // #elif !defined(__USE_DEV_STRING)
645
646
#if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
647
#define VECTOR_CLASS std::vector
648
#elif !defined(__USE_DEV_VECTOR)
649
#define VECTOR_CLASS cl::vector
650
651
#if !defined(__MAX_DEFAULT_VECTOR_SIZE)
652
#define __MAX_DEFAULT_VECTOR_SIZE 10
653
#endif
654
655
/*! \class vector
656
* \brief Fixed sized vector implementation that mirroring
657
*
658
* \note Deprecated. Please use std::vector as default or
659
* re-define the vector class to match the std::vector
660
* interface by defining VECTOR_CLASS
661
662
* \note Not recommended for use with custom objects as
663
* current implementation will construct N elements
664
*
665
* std::vector functionality.
666
* \brief Fixed sized vector compatible with std::vector.
667
*
668
* \note
669
* This differs from std::vector<> not just in memory allocation,
670
* but also in terms of when members are constructed, destroyed,
671
* and assigned instead of being copy constructed.
672
*
673
* \param T type of element contained in the vector.
674
*
675
* \param N maximum size of the vector.
676
*/
677
template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE>
678
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
679
{
680
private:
681
T data_[N];
682
unsigned int size_;
683
684
public:
685
//! \brief Constructs an empty vector with no memory allocated.
686
vector() :
687
size_(static_cast<unsigned int>(0))
688
{}
689
690
//! \brief Deallocates the vector's memory and destroys all of its elements.
691
~vector()
692
{
693
clear();
694
}
695
696
//! \brief Returns the number of elements currently contained.
697
unsigned int size(void) const
698
{
699
return size_;
700
}
701
702
/*! \brief Empties the vector of all elements.
703
* \note
704
* This does not deallocate memory but will invoke destructors
705
* on contained elements.
706
*/
707
void clear()
708
{
709
while(!empty()) {
710
pop_back();
711
}
712
}
713
714
/*! \brief Appends an element after the last valid element.
715
* Calling this on a vector that has reached capacity will throw an
716
* exception if exceptions are enabled.
717
*/
718
void push_back (const T& x)
719
{
720
if (size() < N) {
721
new (&data_[size_]) T(x);
722
size_++;
723
} else {
724
detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
725
}
726
}
727
728
/*! \brief Removes the last valid element from the vector.
729
* Calling this on an empty vector will throw an exception
730
* if exceptions are enabled.
731
*/
732
void pop_back(void)
733
{
734
if (size_ != 0) {
735
--size_;
736
data_[size_].~T();
737
} else {
738
detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
739
}
740
}
741
742
/*! \brief Constructs with a value copied from another.
743
*
744
* \param vec the vector to copy.
745
*/
746
vector(const vector<T, N>& vec) :
747
size_(vec.size_)
748
{
749
if (size_ != 0) {
750
assign(vec.begin(), vec.end());
751
}
752
}
753
754
/*! \brief Constructs with a specified number of initial elements.
755
*
756
* \param size number of initial elements.
757
*
758
* \param val value of initial elements.
759
*/
760
vector(unsigned int size, const T& val = T()) :
761
size_(0)
762
{
763
for (unsigned int i = 0; i < size; i++) {
764
push_back(val);
765
}
766
}
767
768
/*! \brief Overwrites the current content with that copied from another
769
* instance.
770
*
771
* \param rhs vector to copy.
772
*
773
* \returns a reference to this.
774
*/
775
vector<T, N>& operator=(const vector<T, N>& rhs)
776
{
777
if (this == &rhs) {
778
return *this;
779
}
780
781
if (rhs.size_ != 0) {
782
assign(rhs.begin(), rhs.end());
783
} else {
784
clear();
785
}
786
787
return *this;
788
}
789
790
/*! \brief Tests equality against another instance.
791
*
792
* \param vec the vector against which to compare.
793
*/
794
bool operator==(vector<T,N> &vec)
795
{
796
if (size() != vec.size()) {
797
return false;
798
}
799
800
for( unsigned int i = 0; i < size(); ++i ) {
801
if( operator[](i) != vec[i] ) {
802
return false;
803
}
804
}
805
return true;
806
}
807
808
//! \brief Conversion operator to T*.
809
operator T* () { return data_; }
810
811
//! \brief Conversion operator to const T*.
812
operator const T* () const { return data_; }
813
814
//! \brief Tests whether this instance has any elements.
815
bool empty (void) const
816
{
817
return size_==0;
818
}
819
820
//! \brief Returns the maximum number of elements this instance can hold.
821
unsigned int max_size (void) const
822
{
823
return N;
824
}
825
826
//! \brief Returns the maximum number of elements this instance can hold.
827
unsigned int capacity () const
828
{
829
return N;
830
}
831
832
/*! \brief Returns a reference to a given element.
833
*
834
* \param index which element to access. *
835
* \note
836
* The caller is responsible for ensuring index is >= 0 and < size().
837
*/
838
T& operator[](int index)
839
{
840
return data_[index];
841
}
842
843
/*! \brief Returns a const reference to a given element.
844
*
845
* \param index which element to access.
846
*
847
* \note
848
* The caller is responsible for ensuring index is >= 0 and < size().
849
*/
850
const T& operator[](int index) const
851
{
852
return data_[index];
853
}
854
855
/*! \brief Assigns elements of the vector based on a source iterator range.
856
*
857
* \param start Beginning iterator of source range
858
* \param end Enditerator of source range
859
*
860
* \note
861
* Will throw an exception if exceptions are enabled and size exceeded.
862
*/
863
template<class I>
864
void assign(I start, I end)
865
{
866
clear();
867
while(start != end) {
868
push_back(*start);
869
start++;
870
}
871
}
872
873
/*! \class iterator
874
* \brief Const iterator class for vectors
875
*/
876
class iterator
877
{
878
private:
879
const vector<T,N> *vec_;
880
int index_;
881
882
/**
883
* Internal iterator constructor to capture reference
884
* to the vector it iterates over rather than taking
885
* the vector by copy.
886
*/
887
iterator (const vector<T,N> &vec, int index) :
888
vec_(&vec)
889
{
890
if( !vec.empty() ) {
891
index_ = index;
892
} else {
893
index_ = -1;
894
}
895
}
896
897
public:
898
iterator(void) :
899
index_(-1),
900
vec_(NULL)
901
{
902
}
903
904
iterator(const iterator& rhs) :
905
vec_(rhs.vec_),
906
index_(rhs.index_)
907
{
908
}
909
910
~iterator(void) {}
911
912
static iterator begin(const cl::vector<T,N> &vec)
913
{
914
iterator i(vec, 0);
915
916
return i;
917
}
918
919
static iterator end(const cl::vector<T,N> &vec)
920
{
921
iterator i(vec, vec.size());
922
923
return i;
924
}
925
926
bool operator==(iterator i)
927
{
928
return ((vec_ == i.vec_) &&
929
(index_ == i.index_));
930
}
931
932
bool operator!=(iterator i)
933
{
934
return (!(*this==i));
935
}
936
937
iterator& operator++()
938
{
939
++index_;
940
return *this;
941
}
942
943
iterator operator++(int)
944
{
945
iterator retVal(*this);
946
++index_;
947
return retVal;
948
}
949
950
iterator& operator--()
951
{
952
--index_;
953
return *this;
954
}
955
956
iterator operator--(int)
957
{
958
iterator retVal(*this);
959
--index_;
960
return retVal;
961
}
962
963
const T& operator *() const
964
{
965
return (*vec_)[index_];
966
}
967
};
968
969
iterator begin(void)
970
{
971
return iterator::begin(*this);
972
}
973
974
iterator begin(void) const
975
{
976
return iterator::begin(*this);
977
}
978
979
iterator end(void)
980
{
981
return iterator::end(*this);
982
}
983
984
iterator end(void) const
985
{
986
return iterator::end(*this);
987
}
988
989
T& front(void)
990
{
991
return data_[0];
992
}
993
994
T& back(void)
995
{
996
return data_[size_];
997
}
998
999
const T& front(void) const
1000
{
1001
return data_[0];
1002
}
1003
1004
const T& back(void) const
1005
{
1006
return data_[size_-1];
1007
}
1008
};
1009
#endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
1010
1011
1012
1013
1014
1015
namespace detail {
1016
#define __DEFAULT_NOT_INITIALIZED 1
1017
#define __DEFAULT_BEING_INITIALIZED 2
1018
#define __DEFAULT_INITIALIZED 4
1019
1020
/*
1021
* Compare and exchange primitives are needed for handling of defaults
1022
*/
1023
inline int compare_exchange(volatile int * dest, int exchange, int comparand)
1024
{
1025
#ifdef _WIN32
1026
return (int)(InterlockedCompareExchange(
1027
(volatile long*)dest,
1028
(long)exchange,
1029
(long)comparand));
1030
#elif defined(__APPLE__) || defined(__MACOSX)
1031
return OSAtomicOr32Orig((uint32_t)exchange, (volatile uint32_t*)dest);
1032
#else // !_WIN32 || defined(__APPLE__) || defined(__MACOSX)
1033
return (__sync_val_compare_and_swap(
1034
dest,
1035
comparand,
1036
exchange));
1037
#endif // !_WIN32
1038
}
1039
1040
inline void fence() { _mm_mfence(); }
1041
}; // namespace detail
1042
1043
1044
/*! \brief class used to interface between C++ and
1045
* OpenCL C calls that require arrays of size_t values, whose
1046
* size is known statically.
1047
*/
1048
template <int N>
1049
class size_t
1050
{
1051
private:
1052
::size_t data_[N];
1053
1054
public:
1055
//! \brief Initialize size_t to all 0s
1056
size_t()
1057
{
1058
for( int i = 0; i < N; ++i ) {
1059
data_[i] = 0;
1060
}
1061
}
1062
1063
::size_t& operator[](int index)
1064
{
1065
return data_[index];
1066
}
1067
1068
const ::size_t& operator[](int index) const
1069
{
1070
return data_[index];
1071
}
1072
1073
//! \brief Conversion operator to T*.
1074
operator ::size_t* () { return data_; }
1075
1076
//! \brief Conversion operator to const T*.
1077
operator const ::size_t* () const { return data_; }
1078
};
1079
1080
namespace detail {
1081
1082
// Generic getInfoHelper. The final parameter is used to guide overload
1083
// resolution: the actual parameter passed is an int, which makes this
1084
// a worse conversion sequence than a specialization that declares the
1085
// parameter as an int.
1086
template<typename Functor, typename T>
1087
inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)
1088
{
1089
return f(name, sizeof(T), param, NULL);
1090
}
1091
1092
// Specialized getInfoHelper for VECTOR_CLASS params
1093
template <typename Func, typename T>
1094
inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, long)
1095
{
1096
::size_t required;
1097
cl_int err = f(name, 0, NULL, &required);
1098
if (err != CL_SUCCESS) {
1099
return err;
1100
}
1101
1102
T* value = (T*) alloca(required);
1103
err = f(name, required, value, NULL);
1104
if (err != CL_SUCCESS) {
1105
return err;
1106
}
1107
1108
param->assign(&value[0], &value[required/sizeof(T)]);
1109
return CL_SUCCESS;
1110
}
1111
1112
/* Specialization for reference-counted types. This depends on the
1113
* existence of Wrapper<T>::cl_type, and none of the other types having the
1114
* cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1115
* does not work, because when using a derived type (e.g. Context) the generic
1116
* template will provide a better match.
1117
*/
1118
template <typename Func, typename T>
1119
inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, int, typename T::cl_type = 0)
1120
{
1121
::size_t required;
1122
cl_int err = f(name, 0, NULL, &required);
1123
if (err != CL_SUCCESS) {
1124
return err;
1125
}
1126
1127
typename T::cl_type * value = (typename T::cl_type *) alloca(required);
1128
err = f(name, required, value, NULL);
1129
if (err != CL_SUCCESS) {
1130
return err;
1131
}
1132
1133
::size_t elements = required / sizeof(typename T::cl_type);
1134
param->assign(&value[0], &value[elements]);
1135
for (::size_t i = 0; i < elements; i++)
1136
{
1137
if (value[i] != NULL)
1138
{
1139
err = (*param)[i].retain();
1140
if (err != CL_SUCCESS) {
1141
return err;
1142
}
1143
}
1144
}
1145
return CL_SUCCESS;
1146
}
1147
1148
// Specialized for getInfo<CL_PROGRAM_BINARIES>
1149
template <typename Func>
1150
inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, int)
1151
{
1152
cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);
1153
1154
if (err != CL_SUCCESS) {
1155
return err;
1156
}
1157
1158
return CL_SUCCESS;
1159
}
1160
1161
// Specialized GetInfoHelper for STRING_CLASS params
1162
template <typename Func>
1163
inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
1164
{
1165
::size_t required;
1166
cl_int err = f(name, 0, NULL, &required);
1167
if (err != CL_SUCCESS) {
1168
return err;
1169
}
1170
1171
char* value = (char*) alloca(required);
1172
err = f(name, required, value, NULL);
1173
if (err != CL_SUCCESS) {
1174
return err;
1175
}
1176
1177
*param = value;
1178
return CL_SUCCESS;
1179
}
1180
1181
// Specialized GetInfoHelper for cl::size_t params
1182
template <typename Func, ::size_t N>
1183
inline cl_int getInfoHelper(Func f, cl_uint name, size_t<N>* param, long)
1184
{
1185
::size_t required;
1186
cl_int err = f(name, 0, NULL, &required);
1187
if (err != CL_SUCCESS) {
1188
return err;
1189
}
1190
1191
::size_t* value = (::size_t*) alloca(required);
1192
err = f(name, required, value, NULL);
1193
if (err != CL_SUCCESS) {
1194
return err;
1195
}
1196
1197
for(int i = 0; i < N; ++i) {
1198
(*param)[i] = value[i];
1199
}
1200
1201
return CL_SUCCESS;
1202
}
1203
1204
template<typename T> struct ReferenceHandler;
1205
1206
/* Specialization for reference-counted types. This depends on the
1207
* existence of Wrapper<T>::cl_type, and none of the other types having the
1208
* cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1209
* does not work, because when using a derived type (e.g. Context) the generic
1210
* template will provide a better match.
1211
*/
1212
template<typename Func, typename T>
1213
inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)
1214
{
1215
typename T::cl_type value;
1216
cl_int err = f(name, sizeof(value), &value, NULL);
1217
if (err != CL_SUCCESS) {
1218
return err;
1219
}
1220
*param = value;
1221
if (value != NULL)
1222
{
1223
err = param->retain();
1224
if (err != CL_SUCCESS) {
1225
return err;
1226
}
1227
}
1228
return CL_SUCCESS;
1229
}
1230
1231
#define __PARAM_NAME_INFO_1_0(F) \
1232
F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \
1233
F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \
1234
F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \
1235
F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \
1236
F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \
1237
\
1238
F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \
1239
F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \
1240
F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \
1241
F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \
1242
F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \
1243
F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \
1244
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \
1245
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \
1246
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \
1247
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \
1248
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \
1249
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \
1250
F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \
1251
F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \
1252
F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \
1253
F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \
1254
F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \
1255
F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \
1256
F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \
1257
F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \
1258
F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \
1259
F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \
1260
F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \
1261
F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \
1262
F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \
1263
F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \
1264
F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \
1265
F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \
1266
F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \
1267
F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\
1268
F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \
1269
F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \
1270
F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \
1271
F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \
1272
F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \
1273
F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \
1274
F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \
1275
F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \
1276
F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \
1277
F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \
1278
F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \
1279
F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \
1280
F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \
1281
F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \
1282
F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \
1283
F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \
1284
F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \
1285
F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \
1286
F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \
1287
F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \
1288
\
1289
F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \
1290
F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS<Device>) \
1291
F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS<cl_context_properties>) \
1292
\
1293
F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \
1294
F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \
1295
F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \
1296
F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_uint) \
1297
\
1298
F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \
1299
F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \
1300
F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \
1301
F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \
1302
\
1303
F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \
1304
F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \
1305
F(cl_mem_info, CL_MEM_SIZE, ::size_t) \
1306
F(cl_mem_info, CL_MEM_HOST_PTR, void*) \
1307
F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \
1308
F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \
1309
F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \
1310
\
1311
F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \
1312
F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \
1313
F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \
1314
F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \
1315
F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \
1316
F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \
1317
F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \
1318
\
1319
F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \
1320
F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \
1321
F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \
1322
F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \
1323
F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \
1324
\
1325
F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \
1326
F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \
1327
F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \
1328
F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS<Device>) \
1329
F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \
1330
F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \
1331
F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS<char *>) \
1332
\
1333
F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \
1334
F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \
1335
F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \
1336
\
1337
F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \
1338
F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \
1339
F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \
1340
F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \
1341
F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \
1342
\
1343
F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \
1344
F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \
1345
F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \
1346
\
1347
F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \
1348
F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \
1349
F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \
1350
F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties)
1351
1352
#if defined(CL_VERSION_1_1)
1353
#define __PARAM_NAME_INFO_1_1(F) \
1354
F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\
1355
F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \
1356
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \
1357
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \
1358
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \
1359
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \
1360
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \
1361
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \
1362
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \
1363
F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \
1364
F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \
1365
F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \
1366
F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \
1367
\
1368
F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \
1369
F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \
1370
\
1371
F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \
1372
F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \
1373
\
1374
F(cl_event_info, CL_EVENT_CONTEXT, cl::Context)
1375
#endif // CL_VERSION_1_1
1376
1377
1378
#if defined(CL_VERSION_1_2)
1379
#define __PARAM_NAME_INFO_1_2(F) \
1380
F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \
1381
\
1382
F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \
1383
F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \
1384
\
1385
F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \
1386
\
1387
F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \
1388
\
1389
F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \
1390
F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \
1391
F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \
1392
F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \
1393
\
1394
F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \
1395
F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \
1396
F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS<cl_device_partition_property>) \
1397
F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint) \
1398
F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, ::size_t) \
1399
F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \
1400
F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS)
1401
#endif // #if defined(CL_VERSION_1_2)
1402
1403
#if defined(USE_CL_DEVICE_FISSION)
1404
#define __PARAM_NAME_DEVICE_FISSION(F) \
1405
F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \
1406
F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
1407
F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
1408
F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \
1409
F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS<cl_device_partition_property_ext>)
1410
#endif // USE_CL_DEVICE_FISSION
1411
1412
template <typename enum_type, cl_int Name>
1413
struct param_traits {};
1414
1415
#define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \
1416
struct token; \
1417
template<> \
1418
struct param_traits<detail:: token,param_name> \
1419
{ \
1420
enum { value = param_name }; \
1421
typedef T param_type; \
1422
};
1423
1424
__PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS)
1425
#if defined(CL_VERSION_1_1)
1426
__PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS)
1427
#endif // CL_VERSION_1_1
1428
#if defined(CL_VERSION_1_2)
1429
__PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS)
1430
#endif // CL_VERSION_1_1
1431
1432
#if defined(USE_CL_DEVICE_FISSION)
1433
__PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS);
1434
#endif // USE_CL_DEVICE_FISSION
1435
1436
#ifdef CL_PLATFORM_ICD_SUFFIX_KHR
1437
__CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS)
1438
#endif
1439
1440
#ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
1441
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong)
1442
#endif
1443
1444
#ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
1445
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>)
1446
#endif
1447
#ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
1448
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint)
1449
#endif
1450
#ifdef CL_DEVICE_SIMD_WIDTH_AMD
1451
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint)
1452
#endif
1453
#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
1454
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint)
1455
#endif
1456
#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
1457
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint)
1458
#endif
1459
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
1460
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint)
1461
#endif
1462
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
1463
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint)
1464
#endif
1465
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
1466
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint)
1467
#endif
1468
#ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
1469
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint)
1470
#endif
1471
#ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
1472
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint)
1473
#endif
1474
1475
#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
1476
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint)
1477
#endif
1478
#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV
1479
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint)
1480
#endif
1481
#ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV
1482
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint)
1483
#endif
1484
#ifdef CL_DEVICE_WARP_SIZE_NV
1485
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint)
1486
#endif
1487
#ifdef CL_DEVICE_GPU_OVERLAP_NV
1488
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool)
1489
#endif
1490
#ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV
1491
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool)
1492
#endif
1493
#ifdef CL_DEVICE_INTEGRATED_MEMORY_NV
1494
__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool)
1495
#endif
1496
1497
// Convenience functions
1498
1499
template <typename Func, typename T>
1500
inline cl_int
1501
getInfo(Func f, cl_uint name, T* param)
1502
{
1503
return getInfoHelper(f, name, param, 0);
1504
}
1505
1506
template <typename Func, typename Arg0>
1507
struct GetInfoFunctor0
1508
{
1509
Func f_; const Arg0& arg0_;
1510
cl_int operator ()(
1511
cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
1512
{ return f_(arg0_, param, size, value, size_ret); }
1513
};
1514
1515
template <typename Func, typename Arg0, typename Arg1>
1516
struct GetInfoFunctor1
1517
{
1518
Func f_; const Arg0& arg0_; const Arg1& arg1_;
1519
cl_int operator ()(
1520
cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
1521
{ return f_(arg0_, arg1_, param, size, value, size_ret); }
1522
};
1523
1524
template <typename Func, typename Arg0, typename T>
1525
inline cl_int
1526
getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)
1527
{
1528
GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };
1529
return getInfoHelper(f0, name, param, 0);
1530
}
1531
1532
template <typename Func, typename Arg0, typename Arg1, typename T>
1533
inline cl_int
1534
getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)
1535
{
1536
GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };
1537
return getInfoHelper(f0, name, param, 0);
1538
}
1539
1540
template<typename T>
1541
struct ReferenceHandler
1542
{ };
1543
1544
#if defined(CL_VERSION_1_2)
1545
/**
1546
* OpenCL 1.2 devices do have retain/release.
1547
*/
1548
template <>
1549
struct ReferenceHandler<cl_device_id>
1550
{
1551
/**
1552
* Retain the device.
1553
* \param device A valid device created using createSubDevices
1554
* \return
1555
* CL_SUCCESS if the function executed successfully.
1556
* CL_INVALID_DEVICE if device was not a valid subdevice
1557
* CL_OUT_OF_RESOURCES
1558
* CL_OUT_OF_HOST_MEMORY
1559
*/
1560
static cl_int retain(cl_device_id device)
1561
{ return ::clRetainDevice(device); }
1562
/**
1563
* Retain the device.
1564
* \param device A valid device created using createSubDevices
1565
* \return
1566
* CL_SUCCESS if the function executed successfully.
1567
* CL_INVALID_DEVICE if device was not a valid subdevice
1568
* CL_OUT_OF_RESOURCES
1569
* CL_OUT_OF_HOST_MEMORY
1570
*/
1571
static cl_int release(cl_device_id device)
1572
{ return ::clReleaseDevice(device); }
1573
};
1574
#else // #if defined(CL_VERSION_1_2)
1575
/**
1576
* OpenCL 1.1 devices do not have retain/release.
1577
*/
1578
template <>
1579
struct ReferenceHandler<cl_device_id>
1580
{
1581
// cl_device_id does not have retain().
1582
static cl_int retain(cl_device_id)
1583
{ return CL_SUCCESS; }
1584
// cl_device_id does not have release().
1585
static cl_int release(cl_device_id)
1586
{ return CL_SUCCESS; }
1587
};
1588
#endif // #if defined(CL_VERSION_1_2)
1589
1590
template <>
1591
struct ReferenceHandler<cl_platform_id>
1592
{
1593
// cl_platform_id does not have retain().
1594
static cl_int retain(cl_platform_id)
1595
{ return CL_SUCCESS; }
1596
// cl_platform_id does not have release().
1597
static cl_int release(cl_platform_id)
1598
{ return CL_SUCCESS; }
1599
};
1600
1601
template <>
1602
struct ReferenceHandler<cl_context>
1603
{
1604
static cl_int retain(cl_context context)
1605
{ return ::clRetainContext(context); }
1606
static cl_int release(cl_context context)
1607
{ return ::clReleaseContext(context); }
1608
};
1609
1610
template <>
1611
struct ReferenceHandler<cl_command_queue>
1612
{
1613
static cl_int retain(cl_command_queue queue)
1614
{ return ::clRetainCommandQueue(queue); }
1615
static cl_int release(cl_command_queue queue)
1616
{ return ::clReleaseCommandQueue(queue); }
1617
};
1618
1619
template <>
1620
struct ReferenceHandler<cl_mem>
1621
{
1622
static cl_int retain(cl_mem memory)
1623
{ return ::clRetainMemObject(memory); }
1624
static cl_int release(cl_mem memory)
1625
{ return ::clReleaseMemObject(memory); }
1626
};
1627
1628
template <>
1629
struct ReferenceHandler<cl_sampler>
1630
{
1631
static cl_int retain(cl_sampler sampler)
1632
{ return ::clRetainSampler(sampler); }
1633
static cl_int release(cl_sampler sampler)
1634
{ return ::clReleaseSampler(sampler); }
1635
};
1636
1637
template <>
1638
struct ReferenceHandler<cl_program>
1639
{
1640
static cl_int retain(cl_program program)
1641
{ return ::clRetainProgram(program); }
1642
static cl_int release(cl_program program)
1643
{ return ::clReleaseProgram(program); }
1644
};
1645
1646
template <>
1647
struct ReferenceHandler<cl_kernel>
1648
{
1649
static cl_int retain(cl_kernel kernel)
1650
{ return ::clRetainKernel(kernel); }
1651
static cl_int release(cl_kernel kernel)
1652
{ return ::clReleaseKernel(kernel); }
1653
};
1654
1655
template <>
1656
struct ReferenceHandler<cl_event>
1657
{
1658
static cl_int retain(cl_event event)
1659
{ return ::clRetainEvent(event); }
1660
static cl_int release(cl_event event)
1661
{ return ::clReleaseEvent(event); }
1662
};
1663
1664
1665
// Extracts version number with major in the upper 16 bits, minor in the lower 16
1666
static cl_uint getVersion(const char *versionInfo)
1667
{
1668
int highVersion = 0;
1669
int lowVersion = 0;
1670
int index = 7;
1671
while(versionInfo[index] != '.' ) {
1672
highVersion *= 10;
1673
highVersion += versionInfo[index]-'0';
1674
++index;
1675
}
1676
++index;
1677
while(versionInfo[index] != ' ' ) {
1678
lowVersion *= 10;
1679
lowVersion += versionInfo[index]-'0';
1680
++index;
1681
}
1682
return (highVersion << 16) | lowVersion;
1683
}
1684
1685
static cl_uint getPlatformVersion(cl_platform_id platform)
1686
{
1687
::size_t size = 0;
1688
clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);
1689
char *versionInfo = (char *) alloca(size);
1690
clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size);
1691
return getVersion(versionInfo);
1692
}
1693
1694
static cl_uint getDevicePlatformVersion(cl_device_id device)
1695
{
1696
cl_platform_id platform;
1697
clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);
1698
return getPlatformVersion(platform);
1699
}
1700
1701
#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
1702
static cl_uint getContextPlatformVersion(cl_context context)
1703
{
1704
// The platform cannot be queried directly, so we first have to grab a
1705
// device and obtain its context
1706
::size_t size = 0;
1707
clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);
1708
if (size == 0)
1709
return 0;
1710
cl_device_id *devices = (cl_device_id *) alloca(size);
1711
clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL);
1712
return getDevicePlatformVersion(devices[0]);
1713
}
1714
#endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
1715
1716
template <typename T>
1717
class Wrapper
1718
{
1719
public:
1720
typedef T cl_type;
1721
1722
protected:
1723
cl_type object_;
1724
1725
public:
1726
Wrapper() : object_(NULL) { }
1727
1728
Wrapper(const cl_type &obj) : object_(obj) { }
1729
1730
~Wrapper()
1731
{
1732
if (object_ != NULL) { release(); }
1733
}
1734
1735
Wrapper(const Wrapper<cl_type>& rhs)
1736
{
1737
object_ = rhs.object_;
1738
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1739
}
1740
1741
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1742
{
1743
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1744
object_ = rhs.object_;
1745
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1746
return *this;
1747
}
1748
1749
Wrapper<cl_type>& operator = (const cl_type &rhs)
1750
{
1751
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1752
object_ = rhs;
1753
return *this;
1754
}
1755
1756
cl_type operator ()() const { return object_; }
1757
1758
cl_type& operator ()() { return object_; }
1759
1760
protected:
1761
template<typename Func, typename U>
1762
friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1763
1764
cl_int retain() const
1765
{
1766
return ReferenceHandler<cl_type>::retain(object_);
1767
}
1768
1769
cl_int release() const
1770
{
1771
return ReferenceHandler<cl_type>::release(object_);
1772
}
1773
};
1774
1775
template <>
1776
class Wrapper<cl_device_id>
1777
{
1778
public:
1779
typedef cl_device_id cl_type;
1780
1781
protected:
1782
cl_type object_;
1783
bool referenceCountable_;
1784
1785
static bool isReferenceCountable(cl_device_id device)
1786
{
1787
bool retVal = false;
1788
if (device != NULL) {
1789
int version = getDevicePlatformVersion(device);
1790
if(version > ((1 << 16) + 1)) {
1791
retVal = true;
1792
}
1793
}
1794
return retVal;
1795
}
1796
1797
public:
1798
Wrapper() : object_(NULL), referenceCountable_(false)
1799
{
1800
}
1801
1802
Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false)
1803
{
1804
referenceCountable_ = isReferenceCountable(obj);
1805
}
1806
1807
~Wrapper()
1808
{
1809
if (object_ != NULL) { release(); }
1810
}
1811
1812
Wrapper(const Wrapper<cl_type>& rhs)
1813
{
1814
object_ = rhs.object_;
1815
referenceCountable_ = isReferenceCountable(object_);
1816
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1817
}
1818
1819
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1820
{
1821
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1822
object_ = rhs.object_;
1823
referenceCountable_ = rhs.referenceCountable_;
1824
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1825
return *this;
1826
}
1827
1828
Wrapper<cl_type>& operator = (const cl_type &rhs)
1829
{
1830
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1831
object_ = rhs;
1832
referenceCountable_ = isReferenceCountable(object_);
1833
return *this;
1834
}
1835
1836
cl_type operator ()() const { return object_; }
1837
1838
cl_type& operator ()() { return object_; }
1839
1840
protected:
1841
template<typename Func, typename U>
1842
friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1843
1844
template<typename Func, typename U>
1845
friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS<U>*, int, typename U::cl_type);
1846
1847
cl_int retain() const
1848
{
1849
if( referenceCountable_ ) {
1850
return ReferenceHandler<cl_type>::retain(object_);
1851
}
1852
else {
1853
return CL_SUCCESS;
1854
}
1855
}
1856
1857
cl_int release() const
1858
{
1859
if( referenceCountable_ ) {
1860
return ReferenceHandler<cl_type>::release(object_);
1861
}
1862
else {
1863
return CL_SUCCESS;
1864
}
1865
}
1866
};
1867
1868
} // namespace detail
1869
//! \endcond
1870
1871
/*! \stuct ImageFormat
1872
* \brief Adds constructors and member functions for cl_image_format.
1873
*
1874
* \see cl_image_format
1875
*/
1876
struct ImageFormat : public cl_image_format
1877
{
1878
//! \brief Default constructor - performs no initialization.
1879
ImageFormat(){}
1880
1881
//! \brief Initializing constructor.
1882
ImageFormat(cl_channel_order order, cl_channel_type type)
1883
{
1884
image_channel_order = order;
1885
image_channel_data_type = type;
1886
}
1887
1888
//! \brief Assignment operator.
1889
ImageFormat& operator = (const ImageFormat& rhs)
1890
{
1891
if (this != &rhs) {
1892
this->image_channel_data_type = rhs.image_channel_data_type;
1893
this->image_channel_order = rhs.image_channel_order;
1894
}
1895
return *this;
1896
}
1897
};
1898
1899
/*! \brief Class interface for cl_device_id.
1900
*
1901
* \note Copies of these objects are inexpensive, since they don't 'own'
1902
* any underlying resources or data structures.
1903
*
1904
* \see cl_device_id
1905
*/
1906
class Device : public detail::Wrapper<cl_device_id>
1907
{
1908
public:
1909
//! \brief Default constructor - initializes to NULL.
1910
Device() : detail::Wrapper<cl_type>() { }
1911
1912
/*! \brief Copy constructor.
1913
*
1914
* This simply copies the device ID value, which is an inexpensive operation.
1915
*/
1916
Device(const Device& device) : detail::Wrapper<cl_type>(device) { }
1917
1918
/*! \brief Constructor from cl_device_id.
1919
*
1920
* This simply copies the device ID value, which is an inexpensive operation.
1921
*/
1922
Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { }
1923
1924
/*! \brief Returns the first device on the default context.
1925
*
1926
* \see Context::getDefault()
1927
*/
1928
static Device getDefault(cl_int * err = NULL);
1929
1930
/*! \brief Assignment operator from Device.
1931
*
1932
* This simply copies the device ID value, which is an inexpensive operation.
1933
*/
1934
Device& operator = (const Device& rhs)
1935
{
1936
if (this != &rhs) {
1937
detail::Wrapper<cl_type>::operator=(rhs);
1938
}
1939
return *this;
1940
}
1941
1942
/*! \brief Assignment operator from cl_device_id.
1943
*
1944
* This simply copies the device ID value, which is an inexpensive operation.
1945
*/
1946
Device& operator = (const cl_device_id& rhs)
1947
{
1948
detail::Wrapper<cl_type>::operator=(rhs);
1949
return *this;
1950
}
1951
1952
//! \brief Wrapper for clGetDeviceInfo().
1953
template <typename T>
1954
cl_int getInfo(cl_device_info name, T* param) const
1955
{
1956
return detail::errHandler(
1957
detail::getInfo(&::clGetDeviceInfo, object_, name, param),
1958
__GET_DEVICE_INFO_ERR);
1959
}
1960
1961
//! \brief Wrapper for clGetDeviceInfo() that returns by value.
1962
template <cl_int name> typename
1963
detail::param_traits<detail::cl_device_info, name>::param_type
1964
getInfo(cl_int* err = NULL) const
1965
{
1966
typename detail::param_traits<
1967
detail::cl_device_info, name>::param_type param;
1968
cl_int result = getInfo(name, &param);
1969
if (err != NULL) {
1970
*err = result;
1971
}
1972
return param;
1973
}
1974
1975
/**
1976
* CL 1.2 version
1977
*/
1978
#if defined(CL_VERSION_1_2)
1979
//! \brief Wrapper for clCreateSubDevicesEXT().
1980
cl_int createSubDevices(
1981
const cl_device_partition_property * properties,
1982
VECTOR_CLASS<Device>* devices)
1983
{
1984
cl_uint n = 0;
1985
cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n);
1986
if (err != CL_SUCCESS) {
1987
return detail::errHandler(err, __CREATE_SUB_DEVICES);
1988
}
1989
1990
cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
1991
err = clCreateSubDevices(object_, properties, n, ids, NULL);
1992
if (err != CL_SUCCESS) {
1993
return detail::errHandler(err, __CREATE_SUB_DEVICES);
1994
}
1995
1996
devices->assign(&ids[0], &ids[n]);
1997
return CL_SUCCESS;
1998
}
1999
#endif // #if defined(CL_VERSION_1_2)
2000
2001
/**
2002
* CL 1.1 version that uses device fission.
2003
*/
2004
#if defined(CL_VERSION_1_1)
2005
#if defined(USE_CL_DEVICE_FISSION)
2006
cl_int createSubDevices(
2007
const cl_device_partition_property_ext * properties,
2008
VECTOR_CLASS<Device>* devices)
2009
{
2010
typedef CL_API_ENTRY cl_int
2011
( CL_API_CALL * PFN_clCreateSubDevicesEXT)(
2012
cl_device_id /*in_device*/,
2013
const cl_device_partition_property_ext * /* properties */,
2014
cl_uint /*num_entries*/,
2015
cl_device_id * /*out_devices*/,
2016
cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
2017
2018
static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL;
2019
__INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT);
2020
2021
cl_uint n = 0;
2022
cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n);
2023
if (err != CL_SUCCESS) {
2024
return detail::errHandler(err, __CREATE_SUB_DEVICES);
2025
}
2026
2027
cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2028
err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL);
2029
if (err != CL_SUCCESS) {
2030
return detail::errHandler(err, __CREATE_SUB_DEVICES);
2031
}
2032
2033
devices->assign(&ids[0], &ids[n]);
2034
return CL_SUCCESS;
2035
}
2036
#endif // #if defined(USE_CL_DEVICE_FISSION)
2037
#endif // #if defined(CL_VERSION_1_1)
2038
};
2039
2040
/*! \brief Class interface for cl_platform_id.
2041
*
2042
* \note Copies of these objects are inexpensive, since they don't 'own'
2043
* any underlying resources or data structures.
2044
*
2045
* \see cl_platform_id
2046
*/
2047
class Platform : public detail::Wrapper<cl_platform_id>
2048
{
2049
public:
2050
//! \brief Default constructor - initializes to NULL.
2051
Platform() : detail::Wrapper<cl_type>() { }
2052
2053
/*! \brief Copy constructor.
2054
*
2055
* This simply copies the platform ID value, which is an inexpensive operation.
2056
*/
2057
Platform(const Platform& platform) : detail::Wrapper<cl_type>(platform) { }
2058
2059
/*! \brief Constructor from cl_platform_id.
2060
*
2061
* This simply copies the platform ID value, which is an inexpensive operation.
2062
*/
2063
Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { }
2064
2065
/*! \brief Assignment operator from Platform.
2066
*
2067
* This simply copies the platform ID value, which is an inexpensive operation.
2068
*/
2069
Platform& operator = (const Platform& rhs)
2070
{
2071
if (this != &rhs) {
2072
detail::Wrapper<cl_type>::operator=(rhs);
2073
}
2074
return *this;
2075
}
2076
2077
/*! \brief Assignment operator from cl_platform_id.
2078
*
2079
* This simply copies the platform ID value, which is an inexpensive operation.
2080
*/
2081
Platform& operator = (const cl_platform_id& rhs)
2082
{
2083
detail::Wrapper<cl_type>::operator=(rhs);
2084
return *this;
2085
}
2086
2087
//! \brief Wrapper for clGetPlatformInfo().
2088
cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const
2089
{
2090
return detail::errHandler(
2091
detail::getInfo(&::clGetPlatformInfo, object_, name, param),
2092
__GET_PLATFORM_INFO_ERR);
2093
}
2094
2095
//! \brief Wrapper for clGetPlatformInfo() that returns by value.
2096
template <cl_int name> typename
2097
detail::param_traits<detail::cl_platform_info, name>::param_type
2098
getInfo(cl_int* err = NULL) const
2099
{
2100
typename detail::param_traits<
2101
detail::cl_platform_info, name>::param_type param;
2102
cl_int result = getInfo(name, &param);
2103
if (err != NULL) {
2104
*err = result;
2105
}
2106
return param;
2107
}
2108
2109
/*! \brief Gets a list of devices for this platform.
2110
*
2111
* Wraps clGetDeviceIDs().
2112
*/
2113
cl_int getDevices(
2114
cl_device_type type,
2115
VECTOR_CLASS<Device>* devices) const
2116
{
2117
cl_uint n = 0;
2118
if( devices == NULL ) {
2119
return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2120
}
2121
cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n);
2122
if (err != CL_SUCCESS) {
2123
return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2124
}
2125
2126
cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2127
err = ::clGetDeviceIDs(object_, type, n, ids, NULL);
2128
if (err != CL_SUCCESS) {
2129
return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2130
}
2131
2132
devices->assign(&ids[0], &ids[n]);
2133
return CL_SUCCESS;
2134
}
2135
2136
#if defined(USE_DX_INTEROP)
2137
/*! \brief Get the list of available D3D10 devices.
2138
*
2139
* \param d3d_device_source.
2140
*
2141
* \param d3d_object.
2142
*
2143
* \param d3d_device_set.
2144
*
2145
* \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device
2146
* values returned in devices can be used to identify a specific OpenCL
2147
* device. If \a devices argument is NULL, this argument is ignored.
2148
*
2149
* \return One of the following values:
2150
* - CL_SUCCESS if the function is executed successfully.
2151
*
2152
* The application can query specific capabilities of the OpenCL device(s)
2153
* returned by cl::getDevices. This can be used by the application to
2154
* determine which device(s) to use.
2155
*
2156
* \note In the case that exceptions are enabled and a return value
2157
* other than CL_SUCCESS is generated, then cl::Error exception is
2158
* generated.
2159
*/
2160
cl_int getDevices(
2161
cl_d3d10_device_source_khr d3d_device_source,
2162
void * d3d_object,
2163
cl_d3d10_device_set_khr d3d_device_set,
2164
VECTOR_CLASS<Device>* devices) const
2165
{
2166
typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)(
2167
cl_platform_id platform,
2168
cl_d3d10_device_source_khr d3d_device_source,
2169
void * d3d_object,
2170
cl_d3d10_device_set_khr d3d_device_set,
2171
cl_uint num_entries,
2172
cl_device_id * devices,
2173
cl_uint* num_devices);
2174
2175
if( devices == NULL ) {
2176
return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2177
}
2178
2179
static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL;
2180
__INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR);
2181
2182
cl_uint n = 0;
2183
cl_int err = pfn_clGetDeviceIDsFromD3D10KHR(
2184
object_,
2185
d3d_device_source,
2186
d3d_object,
2187
d3d_device_set,
2188
0,
2189
NULL,
2190
&n);
2191
if (err != CL_SUCCESS) {
2192
return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2193
}
2194
2195
cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2196
err = pfn_clGetDeviceIDsFromD3D10KHR(
2197
object_,
2198
d3d_device_source,
2199
d3d_object,
2200
d3d_device_set,
2201
n,
2202
ids,
2203
NULL);
2204
if (err != CL_SUCCESS) {
2205
return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2206
}
2207
2208
devices->assign(&ids[0], &ids[n]);
2209
return CL_SUCCESS;
2210
}
2211
#endif
2212
2213
/*! \brief Gets a list of available platforms.
2214
*
2215
* Wraps clGetPlatformIDs().
2216
*/
2217
static cl_int get(
2218
VECTOR_CLASS<Platform>* platforms)
2219
{
2220
cl_uint n = 0;
2221
2222
if( platforms == NULL ) {
2223
return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2224
}
2225
2226
cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2227
if (err != CL_SUCCESS) {
2228
return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2229
}
2230
2231
cl_platform_id* ids = (cl_platform_id*) alloca(
2232
n * sizeof(cl_platform_id));
2233
err = ::clGetPlatformIDs(n, ids, NULL);
2234
if (err != CL_SUCCESS) {
2235
return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2236
}
2237
2238
platforms->assign(&ids[0], &ids[n]);
2239
return CL_SUCCESS;
2240
}
2241
2242
/*! \brief Gets the first available platform.
2243
*
2244
* Wraps clGetPlatformIDs(), returning the first result.
2245
*/
2246
static cl_int get(
2247
Platform * platform)
2248
{
2249
cl_uint n = 0;
2250
2251
if( platform == NULL ) {
2252
return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2253
}
2254
2255
cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2256
if (err != CL_SUCCESS) {
2257
return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2258
}
2259
2260
cl_platform_id* ids = (cl_platform_id*) alloca(
2261
n * sizeof(cl_platform_id));
2262
err = ::clGetPlatformIDs(n, ids, NULL);
2263
if (err != CL_SUCCESS) {
2264
return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2265
}
2266
2267
*platform = ids[0];
2268
return CL_SUCCESS;
2269
}
2270
2271
/*! \brief Gets the first available platform, returning it by value.
2272
*
2273
* Wraps clGetPlatformIDs(), returning the first result.
2274
*/
2275
static Platform get(
2276
cl_int * errResult = NULL)
2277
{
2278
Platform platform;
2279
cl_uint n = 0;
2280
cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2281
if (err != CL_SUCCESS) {
2282
detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2283
if (errResult != NULL) {
2284
*errResult = err;
2285
}
2286
}
2287
2288
cl_platform_id* ids = (cl_platform_id*) alloca(
2289
n * sizeof(cl_platform_id));
2290
err = ::clGetPlatformIDs(n, ids, NULL);
2291
2292
if (err != CL_SUCCESS) {
2293
detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2294
}
2295
2296
if (errResult != NULL) {
2297
*errResult = err;
2298
}
2299
2300
return ids[0];
2301
}
2302
2303
static Platform getDefault(
2304
cl_int *errResult = NULL )
2305
{
2306
return get(errResult);
2307
}
2308
2309
2310
#if defined(CL_VERSION_1_2)
2311
//! \brief Wrapper for clUnloadCompiler().
2312
cl_int
2313
unloadCompiler()
2314
{
2315
return ::clUnloadPlatformCompiler(object_);
2316
}
2317
#endif // #if defined(CL_VERSION_1_2)
2318
}; // class Platform
2319
2320
/**
2321
* Deprecated APIs for 1.2
2322
*/
2323
#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
2324
/**
2325
* Unload the OpenCL compiler.
2326
* \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead.
2327
*/
2328
inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int
2329
UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
2330
inline cl_int
2331
UnloadCompiler()
2332
{
2333
return ::clUnloadCompiler();
2334
}
2335
#endif // #if defined(CL_VERSION_1_1)
2336
2337
/*! \brief Class interface for cl_context.
2338
*
2339
* \note Copies of these objects are shallow, meaning that the copy will refer
2340
* to the same underlying cl_context as the original. For details, see
2341
* clRetainContext() and clReleaseContext().
2342
*
2343
* \see cl_context
2344
*/
2345
class Context
2346
: public detail::Wrapper<cl_context>
2347
{
2348
private:
2349
static volatile int default_initialized_;
2350
static Context default_;
2351
static volatile cl_int default_error_;
2352
public:
2353
/*! \brief Destructor.
2354
*
2355
* This calls clReleaseContext() on the value held by this instance.
2356
*/
2357
~Context() { }
2358
2359
/*! \brief Constructs a context including a list of specified devices.
2360
*
2361
* Wraps clCreateContext().
2362
*/
2363
Context(
2364
const VECTOR_CLASS<Device>& devices,
2365
cl_context_properties* properties = NULL,
2366
void (CL_CALLBACK * notifyFptr)(
2367
const char *,
2368
const void *,
2369
::size_t,
2370
void *) = NULL,
2371
void* data = NULL,
2372
cl_int* err = NULL)
2373
{
2374
cl_int error;
2375
2376
::size_t numDevices = devices.size();
2377
cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
2378
for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
2379
deviceIDs[deviceIndex] = (devices[deviceIndex])();
2380
}
2381
2382
object_ = ::clCreateContext(
2383
properties, (cl_uint) numDevices,
2384
deviceIDs,
2385
notifyFptr, data, &error);
2386
2387
detail::errHandler(error, __CREATE_CONTEXT_ERR);
2388
if (err != NULL) {
2389
*err = error;
2390
}
2391
}
2392
2393
Context(
2394
const Device& device,
2395
cl_context_properties* properties = NULL,
2396
void (CL_CALLBACK * notifyFptr)(
2397
const char *,
2398
const void *,
2399
::size_t,
2400
void *) = NULL,
2401
void* data = NULL,
2402
cl_int* err = NULL)
2403
{
2404
cl_int error;
2405
2406
cl_device_id deviceID = device();
2407
2408
object_ = ::clCreateContext(
2409
properties, 1,
2410
&deviceID,
2411
notifyFptr, data, &error);
2412
2413
detail::errHandler(error, __CREATE_CONTEXT_ERR);
2414
if (err != NULL) {
2415
*err = error;
2416
}
2417
}
2418
2419
/*! \brief Constructs a context including all devices of a specified type.
2420
*
2421
* Wraps clCreateContextFromType().
2422
*/
2423
Context(
2424
cl_device_type type,
2425
cl_context_properties* properties = NULL,
2426
void (CL_CALLBACK * notifyFptr)(
2427
const char *,
2428
const void *,
2429
::size_t,
2430
void *) = NULL,
2431
void* data = NULL,
2432
cl_int* err = NULL)
2433
{
2434
cl_int error;
2435
2436
#if !defined(__APPLE__) || !defined(__MACOS)
2437
cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };
2438
if (properties == NULL) {
2439
prop[1] = (cl_context_properties)Platform::get(&error)();
2440
if (error != CL_SUCCESS) {
2441
detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2442
if (err != NULL) {
2443
*err = error;
2444
return;
2445
}
2446
}
2447
2448
properties = &prop[0];
2449
}
2450
#endif
2451
object_ = ::clCreateContextFromType(
2452
properties, type, notifyFptr, data, &error);
2453
2454
detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2455
if (err != NULL) {
2456
*err = error;
2457
}
2458
}
2459
2460
/*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.
2461
*
2462
* \note All calls to this function return the same cl_context as the first.
2463
*/
2464
static Context getDefault(cl_int * err = NULL)
2465
{
2466
int state = detail::compare_exchange(
2467
&default_initialized_,
2468
__DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
2469
2470
if (state & __DEFAULT_INITIALIZED) {
2471
if (err != NULL) {
2472
*err = default_error_;
2473
}
2474
return default_;
2475
}
2476
2477
if (state & __DEFAULT_BEING_INITIALIZED) {
2478
// Assume writes will propagate eventually...
2479
while(default_initialized_ != __DEFAULT_INITIALIZED) {
2480
detail::fence();
2481
}
2482
2483
if (err != NULL) {
2484
*err = default_error_;
2485
}
2486
return default_;
2487
}
2488
2489
cl_int error;
2490
default_ = Context(
2491
CL_DEVICE_TYPE_DEFAULT,
2492
NULL,
2493
NULL,
2494
NULL,
2495
&error);
2496
2497
detail::fence();
2498
2499
default_error_ = error;
2500
// Assume writes will propagate eventually...
2501
default_initialized_ = __DEFAULT_INITIALIZED;
2502
2503
detail::fence();
2504
2505
if (err != NULL) {
2506
*err = default_error_;
2507
}
2508
return default_;
2509
2510
}
2511
2512
//! \brief Default constructor - initializes to NULL.
2513
Context() : detail::Wrapper<cl_type>() { }
2514
2515
/*! \brief Copy constructor.
2516
*
2517
* This calls clRetainContext() on the parameter's cl_context.
2518
*/
2519
Context(const Context& context) : detail::Wrapper<cl_type>(context) { }
2520
2521
/*! \brief Constructor from cl_context - takes ownership.
2522
*
2523
* This effectively transfers ownership of a refcount on the cl_context
2524
* into the new Context object.
2525
*/
2526
__CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { }
2527
2528
/*! \brief Assignment operator from Context.
2529
*
2530
* This calls clRetainContext() on the parameter and clReleaseContext() on
2531
* the previous value held by this instance.
2532
*/
2533
Context& operator = (const Context& rhs)
2534
{
2535
if (this != &rhs) {
2536
detail::Wrapper<cl_type>::operator=(rhs);
2537
}
2538
return *this;
2539
}
2540
2541
/*! \brief Assignment operator from cl_context - takes ownership.
2542
*
2543
* This effectively transfers ownership of a refcount on the rhs and calls
2544
* clReleaseContext() on the value previously held by this instance.
2545
*/
2546
Context& operator = (const cl_context& rhs)
2547
{
2548
detail::Wrapper<cl_type>::operator=(rhs);
2549
return *this;
2550
}
2551
2552
//! \brief Wrapper for clGetContextInfo().
2553
template <typename T>
2554
cl_int getInfo(cl_context_info name, T* param) const
2555
{
2556
return detail::errHandler(
2557
detail::getInfo(&::clGetContextInfo, object_, name, param),
2558
__GET_CONTEXT_INFO_ERR);
2559
}
2560
2561
//! \brief Wrapper for clGetContextInfo() that returns by value.
2562
template <cl_int name> typename
2563
detail::param_traits<detail::cl_context_info, name>::param_type
2564
getInfo(cl_int* err = NULL) const
2565
{
2566
typename detail::param_traits<
2567
detail::cl_context_info, name>::param_type param;
2568
cl_int result = getInfo(name, &param);
2569
if (err != NULL) {
2570
*err = result;
2571
}
2572
return param;
2573
}
2574
2575
/*! \brief Gets a list of supported image formats.
2576
*
2577
* Wraps clGetSupportedImageFormats().
2578
*/
2579
cl_int getSupportedImageFormats(
2580
cl_mem_flags flags,
2581
cl_mem_object_type type,
2582
VECTOR_CLASS<ImageFormat>* formats) const
2583
{
2584
cl_uint numEntries;
2585
cl_int err = ::clGetSupportedImageFormats(
2586
object_,
2587
flags,
2588
type,
2589
0,
2590
NULL,
2591
&numEntries);
2592
if (err != CL_SUCCESS) {
2593
return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
2594
}
2595
2596
ImageFormat* value = (ImageFormat*)
2597
alloca(numEntries * sizeof(ImageFormat));
2598
err = ::clGetSupportedImageFormats(
2599
object_,
2600
flags,
2601
type,
2602
numEntries,
2603
(cl_image_format*) value,
2604
NULL);
2605
if (err != CL_SUCCESS) {
2606
return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
2607
}
2608
2609
formats->assign(&value[0], &value[numEntries]);
2610
return CL_SUCCESS;
2611
}
2612
};
2613
2614
inline Device Device::getDefault(cl_int * err)
2615
{
2616
cl_int error;
2617
Device device;
2618
2619
Context context = Context::getDefault(&error);
2620
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
2621
2622
if (error != CL_SUCCESS) {
2623
if (err != NULL) {
2624
*err = error;
2625
}
2626
}
2627
else {
2628
device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
2629
if (err != NULL) {
2630
*err = CL_SUCCESS;
2631
}
2632
}
2633
2634
return device;
2635
}
2636
2637
2638
#ifdef _WIN32
2639
__declspec(selectany) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
2640
__declspec(selectany) Context Context::default_;
2641
__declspec(selectany) volatile cl_int Context::default_error_ = CL_SUCCESS;
2642
#else
2643
__attribute__((weak)) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
2644
__attribute__((weak)) Context Context::default_;
2645
__attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS;
2646
#endif
2647
2648
/*! \brief Class interface for cl_event.
2649
*
2650
* \note Copies of these objects are shallow, meaning that the copy will refer
2651
* to the same underlying cl_event as the original. For details, see
2652
* clRetainEvent() and clReleaseEvent().
2653
*
2654
* \see cl_event
2655
*/
2656
class Event : public detail::Wrapper<cl_event>
2657
{
2658
public:
2659
/*! \brief Destructor.
2660
*
2661
* This calls clReleaseEvent() on the value held by this instance.
2662
*/
2663
~Event() { }
2664
2665
//! \brief Default constructor - initializes to NULL.
2666
Event() : detail::Wrapper<cl_type>() { }
2667
2668
/*! \brief Copy constructor.
2669
*
2670
* This calls clRetainEvent() on the parameter's cl_event.
2671
*/
2672
Event(const Event& event) : detail::Wrapper<cl_type>(event) { }
2673
2674
/*! \brief Constructor from cl_event - takes ownership.
2675
*
2676
* This effectively transfers ownership of a refcount on the cl_event
2677
* into the new Event object.
2678
*/
2679
Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { }
2680
2681
/*! \brief Assignment operator from cl_event - takes ownership.
2682
*
2683
* This effectively transfers ownership of a refcount on the rhs and calls
2684
* clReleaseEvent() on the value previously held by this instance.
2685
*/
2686
Event& operator = (const Event& rhs)
2687
{
2688
if (this != &rhs) {
2689
detail::Wrapper<cl_type>::operator=(rhs);
2690
}
2691
return *this;
2692
}
2693
2694
/*! \brief Assignment operator from cl_event.
2695
*
2696
* This calls clRetainEvent() on the parameter and clReleaseEvent() on
2697
* the previous value held by this instance.
2698
*/
2699
Event& operator = (const cl_event& rhs)
2700
{
2701
detail::Wrapper<cl_type>::operator=(rhs);
2702
return *this;
2703
}
2704
2705
//! \brief Wrapper for clGetEventInfo().
2706
template <typename T>
2707
cl_int getInfo(cl_event_info name, T* param) const
2708
{
2709
return detail::errHandler(
2710
detail::getInfo(&::clGetEventInfo, object_, name, param),
2711
__GET_EVENT_INFO_ERR);
2712
}
2713
2714
//! \brief Wrapper for clGetEventInfo() that returns by value.
2715
template <cl_int name> typename
2716
detail::param_traits<detail::cl_event_info, name>::param_type
2717
getInfo(cl_int* err = NULL) const
2718
{
2719
typename detail::param_traits<
2720
detail::cl_event_info, name>::param_type param;
2721
cl_int result = getInfo(name, &param);
2722
if (err != NULL) {
2723
*err = result;
2724
}
2725
return param;
2726
}
2727
2728
//! \brief Wrapper for clGetEventProfilingInfo().
2729
template <typename T>
2730
cl_int getProfilingInfo(cl_profiling_info name, T* param) const
2731
{
2732
return detail::errHandler(detail::getInfo(
2733
&::clGetEventProfilingInfo, object_, name, param),
2734
__GET_EVENT_PROFILE_INFO_ERR);
2735
}
2736
2737
//! \brief Wrapper for clGetEventProfilingInfo() that returns by value.
2738
template <cl_int name> typename
2739
detail::param_traits<detail::cl_profiling_info, name>::param_type
2740
getProfilingInfo(cl_int* err = NULL) const
2741
{
2742
typename detail::param_traits<
2743
detail::cl_profiling_info, name>::param_type param;
2744
cl_int result = getProfilingInfo(name, &param);
2745
if (err != NULL) {
2746
*err = result;
2747
}
2748
return param;
2749
}
2750
2751
/*! \brief Blocks the calling thread until this event completes.
2752
*
2753
* Wraps clWaitForEvents().
2754
*/
2755
cl_int wait() const
2756
{
2757
return detail::errHandler(
2758
::clWaitForEvents(1, &object_),
2759
__WAIT_FOR_EVENTS_ERR);
2760
}
2761
2762
#if defined(CL_VERSION_1_1)
2763
/*! \brief Registers a user callback function for a specific command execution status.
2764
*
2765
* Wraps clSetEventCallback().
2766
*/
2767
cl_int setCallback(
2768
cl_int type,
2769
void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *),
2770
void * user_data = NULL)
2771
{
2772
return detail::errHandler(
2773
::clSetEventCallback(
2774
object_,
2775
type,
2776
pfn_notify,
2777
user_data),
2778
__SET_EVENT_CALLBACK_ERR);
2779
}
2780
#endif
2781
2782
/*! \brief Blocks the calling thread until every event specified is complete.
2783
*
2784
* Wraps clWaitForEvents().
2785
*/
2786
static cl_int
2787
waitForEvents(const VECTOR_CLASS<Event>& events)
2788
{
2789
return detail::errHandler(
2790
::clWaitForEvents(
2791
(cl_uint) events.size(), (cl_event*)&events.front()),
2792
__WAIT_FOR_EVENTS_ERR);
2793
}
2794
};
2795
2796
#if defined(CL_VERSION_1_1)
2797
/*! \brief Class interface for user events (a subset of cl_event's).
2798
*
2799
* See Event for details about copy semantics, etc.
2800
*/
2801
class UserEvent : public Event
2802
{
2803
public:
2804
/*! \brief Constructs a user event on a given context.
2805
*
2806
* Wraps clCreateUserEvent().
2807
*/
2808
UserEvent(
2809
const Context& context,
2810
cl_int * err = NULL)
2811
{
2812
cl_int error;
2813
object_ = ::clCreateUserEvent(
2814
context(),
2815
&error);
2816
2817
detail::errHandler(error, __CREATE_USER_EVENT_ERR);
2818
if (err != NULL) {
2819
*err = error;
2820
}
2821
}
2822
2823
//! \brief Default constructor - initializes to NULL.
2824
UserEvent() : Event() { }
2825
2826
//! \brief Copy constructor - performs shallow copy.
2827
UserEvent(const UserEvent& event) : Event(event) { }
2828
2829
//! \brief Assignment Operator - performs shallow copy.
2830
UserEvent& operator = (const UserEvent& rhs)
2831
{
2832
if (this != &rhs) {
2833
Event::operator=(rhs);
2834
}
2835
return *this;
2836
}
2837
2838
/*! \brief Sets the execution status of a user event object.
2839
*
2840
* Wraps clSetUserEventStatus().
2841
*/
2842
cl_int setStatus(cl_int status)
2843
{
2844
return detail::errHandler(
2845
::clSetUserEventStatus(object_,status),
2846
__SET_USER_EVENT_STATUS_ERR);
2847
}
2848
};
2849
#endif
2850
2851
/*! \brief Blocks the calling thread until every event specified is complete.
2852
*
2853
* Wraps clWaitForEvents().
2854
*/
2855
inline static cl_int
2856
WaitForEvents(const VECTOR_CLASS<Event>& events)
2857
{
2858
return detail::errHandler(
2859
::clWaitForEvents(
2860
(cl_uint) events.size(), (cl_event*)&events.front()),
2861
__WAIT_FOR_EVENTS_ERR);
2862
}
2863
2864
/*! \brief Class interface for cl_mem.
2865
*
2866
* \note Copies of these objects are shallow, meaning that the copy will refer
2867
* to the same underlying cl_mem as the original. For details, see
2868
* clRetainMemObject() and clReleaseMemObject().
2869
*
2870
* \see cl_mem
2871
*/
2872
class Memory : public detail::Wrapper<cl_mem>
2873
{
2874
public:
2875
2876
/*! \brief Destructor.
2877
*
2878
* This calls clReleaseMemObject() on the value held by this instance.
2879
*/
2880
~Memory() {}
2881
2882
//! \brief Default constructor - initializes to NULL.
2883
Memory() : detail::Wrapper<cl_type>() { }
2884
2885
/*! \brief Copy constructor - performs shallow copy.
2886
*
2887
* This calls clRetainMemObject() on the parameter's cl_mem.
2888
*/
2889
Memory(const Memory& memory) : detail::Wrapper<cl_type>(memory) { }
2890
2891
/*! \brief Constructor from cl_mem - takes ownership.
2892
*
2893
* This effectively transfers ownership of a refcount on the cl_mem
2894
* into the new Memory object.
2895
*/
2896
__CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { }
2897
2898
/*! \brief Assignment operator from Memory.
2899
*
2900
* This calls clRetainMemObject() on the parameter and clReleaseMemObject()
2901
* on the previous value held by this instance.
2902
*/
2903
Memory& operator = (const Memory& rhs)
2904
{
2905
if (this != &rhs) {
2906
detail::Wrapper<cl_type>::operator=(rhs);
2907
}
2908
return *this;
2909
}
2910
2911
/*! \brief Assignment operator from cl_mem - takes ownership.
2912
*
2913
* This effectively transfers ownership of a refcount on the rhs and calls
2914
* clReleaseMemObject() on the value previously held by this instance.
2915
*/
2916
Memory& operator = (const cl_mem& rhs)
2917
{
2918
detail::Wrapper<cl_type>::operator=(rhs);
2919
return *this;
2920
}
2921
2922
//! \brief Wrapper for clGetMemObjectInfo().
2923
template <typename T>
2924
cl_int getInfo(cl_mem_info name, T* param) const
2925
{
2926
return detail::errHandler(
2927
detail::getInfo(&::clGetMemObjectInfo, object_, name, param),
2928
__GET_MEM_OBJECT_INFO_ERR);
2929
}
2930
2931
//! \brief Wrapper for clGetMemObjectInfo() that returns by value.
2932
template <cl_int name> typename
2933
detail::param_traits<detail::cl_mem_info, name>::param_type
2934
getInfo(cl_int* err = NULL) const
2935
{
2936
typename detail::param_traits<
2937
detail::cl_mem_info, name>::param_type param;
2938
cl_int result = getInfo(name, &param);
2939
if (err != NULL) {
2940
*err = result;
2941
}
2942
return param;
2943
}
2944
2945
#if defined(CL_VERSION_1_1)
2946
/*! \brief Registers a callback function to be called when the memory object
2947
* is no longer needed.
2948
*
2949
* Wraps clSetMemObjectDestructorCallback().
2950
*
2951
* Repeated calls to this function, for a given cl_mem value, will append
2952
* to the list of functions called (in reverse order) when memory object's
2953
* resources are freed and the memory object is deleted.
2954
*
2955
* \note
2956
* The registered callbacks are associated with the underlying cl_mem
2957
* value - not the Memory class instance.
2958
*/
2959
cl_int setDestructorCallback(
2960
void (CL_CALLBACK * pfn_notify)(cl_mem, void *),
2961
void * user_data = NULL)
2962
{
2963
return detail::errHandler(
2964
::clSetMemObjectDestructorCallback(
2965
object_,
2966
pfn_notify,
2967
user_data),
2968
__SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR);
2969
}
2970
#endif
2971
2972
};
2973
2974
// Pre-declare copy functions
2975
class Buffer;
2976
template< typename IteratorType >
2977
cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
2978
template< typename IteratorType >
2979
cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
2980
2981
/*! \brief Class interface for Buffer Memory Objects.
2982
*
2983
* See Memory for details about copy semantics, etc.
2984
*
2985
* \see Memory
2986
*/
2987
class Buffer : public Memory
2988
{
2989
public:
2990
2991
/*! \brief Constructs a Buffer in a specified context.
2992
*
2993
* Wraps clCreateBuffer().
2994
*
2995
* \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
2996
* specified. Note alignment & exclusivity requirements.
2997
*/
2998
Buffer(
2999
const Context& context,
3000
cl_mem_flags flags,
3001
::size_t size,
3002
void* host_ptr = NULL,
3003
cl_int* err = NULL)
3004
{
3005
cl_int error;
3006
object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3007
3008
detail::errHandler(error, __CREATE_BUFFER_ERR);
3009
if (err != NULL) {
3010
*err = error;
3011
}
3012
}
3013
3014
/*! \brief Constructs a Buffer in the default context.
3015
*
3016
* Wraps clCreateBuffer().
3017
*
3018
* \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3019
* specified. Note alignment & exclusivity requirements.
3020
*
3021
* \see Context::getDefault()
3022
*/
3023
Buffer(
3024
cl_mem_flags flags,
3025
::size_t size,
3026
void* host_ptr = NULL,
3027
cl_int* err = NULL)
3028
{
3029
cl_int error;
3030
3031
Context context = Context::getDefault(err);
3032
3033
object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3034
3035
detail::errHandler(error, __CREATE_BUFFER_ERR);
3036
if (err != NULL) {
3037
*err = error;
3038
}
3039
}
3040
3041
/*!
3042
* \brief Construct a Buffer from a host container via iterators.
3043
* If useHostPtr is specified iterators must be random access.
3044
*/
3045
template< typename IteratorType >
3046
Buffer(
3047
IteratorType startIterator,
3048
IteratorType endIterator,
3049
bool readOnly,
3050
bool useHostPtr = false,
3051
cl_int* err = NULL)
3052
{
3053
typedef typename std::iterator_traits<IteratorType>::value_type DataType;
3054
cl_int error;
3055
3056
cl_mem_flags flags = 0;
3057
if( readOnly ) {
3058
flags |= CL_MEM_READ_ONLY;
3059
}
3060
else {
3061
flags |= CL_MEM_READ_WRITE;
3062
}
3063
if( useHostPtr ) {
3064
flags |= CL_MEM_USE_HOST_PTR;
3065
}
3066
3067
::size_t size = sizeof(DataType)*(endIterator - startIterator);
3068
3069
Context context = Context::getDefault(err);
3070
3071
if( useHostPtr ) {
3072
object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
3073
} else {
3074
object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
3075
}
3076
3077
detail::errHandler(error, __CREATE_BUFFER_ERR);
3078
if (err != NULL) {
3079
*err = error;
3080
}
3081
3082
if( !useHostPtr ) {
3083
error = cl::copy(startIterator, endIterator, *this);
3084
detail::errHandler(error, __CREATE_BUFFER_ERR);
3085
if (err != NULL) {
3086
*err = error;
3087
}
3088
}
3089
}
3090
3091
//! \brief Default constructor - initializes to NULL.
3092
Buffer() : Memory() { }
3093
3094
/*! \brief Copy constructor - performs shallow copy.
3095
*
3096
* See Memory for further details.
3097
*/
3098
Buffer(const Buffer& buffer) : Memory(buffer) { }
3099
3100
/*! \brief Constructor from cl_mem - takes ownership.
3101
*
3102
* See Memory for further details.
3103
*/
3104
__CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { }
3105
3106
/*! \brief Assignment from Buffer - performs shallow copy.
3107
*
3108
* See Memory for further details.
3109
*/
3110
Buffer& operator = (const Buffer& rhs)
3111
{
3112
if (this != &rhs) {
3113
Memory::operator=(rhs);
3114
}
3115
return *this;
3116
}
3117
3118
/*! \brief Assignment from cl_mem - performs shallow copy.
3119
*
3120
* See Memory for further details.
3121
*/
3122
Buffer& operator = (const cl_mem& rhs)
3123
{
3124
Memory::operator=(rhs);
3125
return *this;
3126
}
3127
3128
#if defined(CL_VERSION_1_1)
3129
/*! \brief Creates a new buffer object from this.
3130
*
3131
* Wraps clCreateSubBuffer().
3132
*/
3133
Buffer createSubBuffer(
3134
cl_mem_flags flags,
3135
cl_buffer_create_type buffer_create_type,
3136
const void * buffer_create_info,
3137
cl_int * err = NULL)
3138
{
3139
Buffer result;
3140
cl_int error;
3141
result.object_ = ::clCreateSubBuffer(
3142
object_,
3143
flags,
3144
buffer_create_type,
3145
buffer_create_info,
3146
&error);
3147
3148
detail::errHandler(error, __CREATE_SUBBUFFER_ERR);
3149
if (err != NULL) {
3150
*err = error;
3151
}
3152
3153
return result;
3154
}
3155
#endif
3156
};
3157
3158
#if defined (USE_DX_INTEROP)
3159
/*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.
3160
*
3161
* This is provided to facilitate interoperability with Direct3D.
3162
*
3163
* See Memory for details about copy semantics, etc.
3164
*
3165
* \see Memory
3166
*/
3167
class BufferD3D10 : public Buffer
3168
{
3169
public:
3170
typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)(
3171
cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer,
3172
cl_int* errcode_ret);
3173
3174
/*! \brief Constructs a BufferD3D10, in a specified context, from a
3175
* given ID3D10Buffer.
3176
*
3177
* Wraps clCreateFromD3D10BufferKHR().
3178
*/
3179
BufferD3D10(
3180
const Context& context,
3181
cl_mem_flags flags,
3182
ID3D10Buffer* bufobj,
3183
cl_int * err = NULL)
3184
{
3185
static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL;
3186
3187
#if defined(CL_VERSION_1_2)
3188
vector<cl_context_properties> props = context.getInfo<CL_CONTEXT_PROPERTIES>();
3189
cl_platform platform = -1;
3190
for( int i = 0; i < props.size(); ++i ) {
3191
if( props[i] == CL_CONTEXT_PLATFORM ) {
3192
platform = props[i+1];
3193
}
3194
}
3195
__INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR);
3196
#endif
3197
#if defined(CL_VERSION_1_1)
3198
__INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR);
3199
#endif
3200
3201
cl_int error;
3202
object_ = pfn_clCreateFromD3D10BufferKHR(
3203
context(),
3204
flags,
3205
bufobj,
3206
&error);
3207
3208
detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
3209
if (err != NULL) {
3210
*err = error;
3211
}
3212
}
3213
3214
//! \brief Default constructor - initializes to NULL.
3215
BufferD3D10() : Buffer() { }
3216
3217
/*! \brief Copy constructor - performs shallow copy.
3218
*
3219
* See Memory for further details.
3220
*/
3221
BufferD3D10(const BufferD3D10& buffer) : Buffer(buffer) { }
3222
3223
/*! \brief Constructor from cl_mem - takes ownership.
3224
*
3225
* See Memory for further details.
3226
*/
3227
__CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { }
3228
3229
/*! \brief Assignment from BufferD3D10 - performs shallow copy.
3230
*
3231
* See Memory for further details.
3232
*/
3233
BufferD3D10& operator = (const BufferD3D10& rhs)
3234
{
3235
if (this != &rhs) {
3236
Buffer::operator=(rhs);
3237
}
3238
return *this;
3239
}
3240
3241
/*! \brief Assignment from cl_mem - performs shallow copy.
3242
*
3243
* See Memory for further details.
3244
*/
3245
BufferD3D10& operator = (const cl_mem& rhs)
3246
{
3247
Buffer::operator=(rhs);
3248
return *this;
3249
}
3250
};
3251
#endif
3252
3253
/*! \brief Class interface for GL Buffer Memory Objects.
3254
*
3255
* This is provided to facilitate interoperability with OpenGL.
3256
*
3257
* See Memory for details about copy semantics, etc.
3258
*
3259
* \see Memory
3260
*/
3261
class BufferGL : public Buffer
3262
{
3263
public:
3264
/*! \brief Constructs a BufferGL in a specified context, from a given
3265
* GL buffer.
3266
*
3267
* Wraps clCreateFromGLBuffer().
3268
*/
3269
BufferGL(
3270
const Context& context,
3271
cl_mem_flags flags,
3272
GLuint bufobj,
3273
cl_int * err = NULL)
3274
{
3275
cl_int error;
3276
object_ = ::clCreateFromGLBuffer(
3277
context(),
3278
flags,
3279
bufobj,
3280
&error);
3281
3282
detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
3283
if (err != NULL) {
3284
*err = error;
3285
}
3286
}
3287
3288
//! \brief Default constructor - initializes to NULL.
3289
BufferGL() : Buffer() { }
3290
3291
/*! \brief Copy constructor - performs shallow copy.
3292
*
3293
* See Memory for further details.
3294
*/
3295
BufferGL(const BufferGL& buffer) : Buffer(buffer) { }
3296
3297
/*! \brief Constructor from cl_mem - takes ownership.
3298
*
3299
* See Memory for further details.
3300
*/
3301
__CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { }
3302
3303
/*! \brief Assignment from BufferGL - performs shallow copy.
3304
*
3305
* See Memory for further details.
3306
*/
3307
BufferGL& operator = (const BufferGL& rhs)
3308
{
3309
if (this != &rhs) {
3310
Buffer::operator=(rhs);
3311
}
3312
return *this;
3313
}
3314
3315
/*! \brief Assignment from cl_mem - performs shallow copy.
3316
*
3317
* See Memory for further details.
3318
*/
3319
BufferGL& operator = (const cl_mem& rhs)
3320
{
3321
Buffer::operator=(rhs);
3322
return *this;
3323
}
3324
3325
//! \brief Wrapper for clGetGLObjectInfo().
3326
cl_int getObjectInfo(
3327
cl_gl_object_type *type,
3328
GLuint * gl_object_name)
3329
{
3330
return detail::errHandler(
3331
::clGetGLObjectInfo(object_,type,gl_object_name),
3332
__GET_GL_OBJECT_INFO_ERR);
3333
}
3334
};
3335
3336
/*! \brief Class interface for GL Render Buffer Memory Objects.
3337
*
3338
* This is provided to facilitate interoperability with OpenGL.
3339
*
3340
* See Memory for details about copy semantics, etc.
3341
*
3342
* \see Memory
3343
*/
3344
class BufferRenderGL : public Buffer
3345
{
3346
public:
3347
/*! \brief Constructs a BufferRenderGL in a specified context, from a given
3348
* GL Renderbuffer.
3349
*
3350
* Wraps clCreateFromGLRenderbuffer().
3351
*/
3352
BufferRenderGL(
3353
const Context& context,
3354
cl_mem_flags flags,
3355
GLuint bufobj,
3356
cl_int * err = NULL)
3357
{
3358
cl_int error;
3359
object_ = ::clCreateFromGLRenderbuffer(
3360
context(),
3361
flags,
3362
bufobj,
3363
&error);
3364
3365
detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
3366
if (err != NULL) {
3367
*err = error;
3368
}
3369
}
3370
3371
//! \brief Default constructor - initializes to NULL.
3372
BufferRenderGL() : Buffer() { }
3373
3374
/*! \brief Copy constructor - performs shallow copy.
3375
*
3376
* See Memory for further details.
3377
*/
3378
BufferRenderGL(const BufferGL& buffer) : Buffer(buffer) { }
3379
3380
/*! \brief Constructor from cl_mem - takes ownership.
3381
*
3382
* See Memory for further details.
3383
*/
3384
__CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Buffer(buffer) { }
3385
3386
/*! \brief Assignment from BufferGL - performs shallow copy.
3387
*
3388
* See Memory for further details.
3389
*/
3390
BufferRenderGL& operator = (const BufferRenderGL& rhs)
3391
{
3392
if (this != &rhs) {
3393
Buffer::operator=(rhs);
3394
}
3395
return *this;
3396
}
3397
3398
/*! \brief Assignment from cl_mem - performs shallow copy.
3399
*
3400
* See Memory for further details.
3401
*/
3402
BufferRenderGL& operator = (const cl_mem& rhs)
3403
{
3404
Buffer::operator=(rhs);
3405
return *this;
3406
}
3407
3408
//! \brief Wrapper for clGetGLObjectInfo().
3409
cl_int getObjectInfo(
3410
cl_gl_object_type *type,
3411
GLuint * gl_object_name)
3412
{
3413
return detail::errHandler(
3414
::clGetGLObjectInfo(object_,type,gl_object_name),
3415
__GET_GL_OBJECT_INFO_ERR);
3416
}
3417
};
3418
3419
/*! \brief C++ base class for Image Memory objects.
3420
*
3421
* See Memory for details about copy semantics, etc.
3422
*
3423
* \see Memory
3424
*/
3425
class Image : public Memory
3426
{
3427
protected:
3428
//! \brief Default constructor - initializes to NULL.
3429
Image() : Memory() { }
3430
3431
/*! \brief Copy constructor - performs shallow copy.
3432
*
3433
* See Memory for further details.
3434
*/
3435
Image(const Image& image) : Memory(image) { }
3436
3437
/*! \brief Constructor from cl_mem - takes ownership.
3438
*
3439
* See Memory for further details.
3440
*/
3441
__CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { }
3442
3443
/*! \brief Assignment from Image - performs shallow copy.
3444
*
3445
* See Memory for further details.
3446
*/
3447
Image& operator = (const Image& rhs)
3448
{
3449
if (this != &rhs) {
3450
Memory::operator=(rhs);
3451
}
3452
return *this;
3453
}
3454
3455
/*! \brief Assignment from cl_mem - performs shallow copy.
3456
*
3457
* See Memory for further details.
3458
*/
3459
Image& operator = (const cl_mem& rhs)
3460
{
3461
Memory::operator=(rhs);
3462
return *this;
3463
}
3464
3465
public:
3466
//! \brief Wrapper for clGetImageInfo().
3467
template <typename T>
3468
cl_int getImageInfo(cl_image_info name, T* param) const
3469
{
3470
return detail::errHandler(
3471
detail::getInfo(&::clGetImageInfo, object_, name, param),
3472
__GET_IMAGE_INFO_ERR);
3473
}
3474
3475
//! \brief Wrapper for clGetImageInfo() that returns by value.
3476
template <cl_int name> typename
3477
detail::param_traits<detail::cl_image_info, name>::param_type
3478
getImageInfo(cl_int* err = NULL) const
3479
{
3480
typename detail::param_traits<
3481
detail::cl_image_info, name>::param_type param;
3482
cl_int result = getImageInfo(name, &param);
3483
if (err != NULL) {
3484
*err = result;
3485
}
3486
return param;
3487
}
3488
};
3489
3490
#if defined(CL_VERSION_1_2)
3491
/*! \brief Class interface for 1D Image Memory objects.
3492
*
3493
* See Memory for details about copy semantics, etc.
3494
*
3495
* \see Memory
3496
*/
3497
class Image1D : public Image
3498
{
3499
public:
3500
/*! \brief Constructs a 1D Image in a specified context.
3501
*
3502
* Wraps clCreateImage().
3503
*/
3504
Image1D(
3505
const Context& context,
3506
cl_mem_flags flags,
3507
ImageFormat format,
3508
::size_t width,
3509
void* host_ptr = NULL,
3510
cl_int* err = NULL)
3511
{
3512
cl_int error;
3513
cl_image_desc desc;
3514
desc.image_type = CL_MEM_OBJECT_IMAGE1D;
3515
desc.image_width = width;
3516
desc.image_row_pitch = 0;
3517
desc.num_mip_levels = 0;
3518
desc.num_samples = 0;
3519
desc.buffer = 0;
3520
object_ = ::clCreateImage(
3521
context(),
3522
flags,
3523
&format,
3524
&desc,
3525
host_ptr,
3526
&error);
3527
3528
detail::errHandler(error, __CREATE_IMAGE_ERR);
3529
if (err != NULL) {
3530
*err = error;
3531
}
3532
}
3533
3534
//! \brief Default constructor - initializes to NULL.
3535
Image1D() { }
3536
3537
/*! \brief Copy constructor - performs shallow copy.
3538
*
3539
* See Memory for further details.
3540
*/
3541
Image1D(const Image1D& image1D) : Image(image1D) { }
3542
3543
/*! \brief Constructor from cl_mem - takes ownership.
3544
*
3545
* See Memory for further details.
3546
*/
3547
__CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { }
3548
3549
/*! \brief Assignment from Image1D - performs shallow copy.
3550
*
3551
* See Memory for further details.
3552
*/
3553
Image1D& operator = (const Image1D& rhs)
3554
{
3555
if (this != &rhs) {
3556
Image::operator=(rhs);
3557
}
3558
return *this;
3559
}
3560
3561
/*! \brief Assignment from cl_mem - performs shallow copy.
3562
*
3563
* See Memory for further details.
3564
*/
3565
Image1D& operator = (const cl_mem& rhs)
3566
{
3567
Image::operator=(rhs);
3568
return *this;
3569
}
3570
};
3571
3572
/*! \class Image1DBuffer
3573
* \brief Image interface for 1D buffer images.
3574
*/
3575
class Image1DBuffer : public Image
3576
{
3577
public:
3578
Image1DBuffer(
3579
const Context& context,
3580
cl_mem_flags flags,
3581
ImageFormat format,
3582
::size_t width,
3583
const Buffer &buffer,
3584
cl_int* err = NULL)
3585
{
3586
cl_int error;
3587
cl_image_desc desc;
3588
desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
3589
desc.image_width = width;
3590
desc.image_row_pitch = 0;
3591
desc.num_mip_levels = 0;
3592
desc.num_samples = 0;
3593
desc.buffer = buffer();
3594
object_ = ::clCreateImage(
3595
context(),
3596
flags,
3597
&format,
3598
&desc,
3599
NULL,
3600
&error);
3601
3602
detail::errHandler(error, __CREATE_IMAGE_ERR);
3603
if (err != NULL) {
3604
*err = error;
3605
}
3606
}
3607
3608
Image1DBuffer() { }
3609
3610
Image1DBuffer(const Image1DBuffer& image1D) : Image(image1D) { }
3611
3612
__CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { }
3613
3614
Image1DBuffer& operator = (const Image1DBuffer& rhs)
3615
{
3616
if (this != &rhs) {
3617
Image::operator=(rhs);
3618
}
3619
return *this;
3620
}
3621
3622
Image1DBuffer& operator = (const cl_mem& rhs)
3623
{
3624
Image::operator=(rhs);
3625
return *this;
3626
}
3627
};
3628
3629
/*! \class Image1DArray
3630
* \brief Image interface for arrays of 1D images.
3631
*/
3632
class Image1DArray : public Image
3633
{
3634
public:
3635
Image1DArray(
3636
const Context& context,
3637
cl_mem_flags flags,
3638
ImageFormat format,
3639
::size_t arraySize,
3640
::size_t width,
3641
::size_t rowPitch,
3642
void* host_ptr = NULL,
3643
cl_int* err = NULL)
3644
{
3645
cl_int error;
3646
cl_image_desc desc;
3647
desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY;
3648
desc.image_array_size = arraySize;
3649
desc.image_width = width;
3650
desc.image_row_pitch = rowPitch;
3651
desc.num_mip_levels = 0;
3652
desc.num_samples = 0;
3653
desc.buffer = 0;
3654
object_ = ::clCreateImage(
3655
context(),
3656
flags,
3657
&format,
3658
&desc,
3659
host_ptr,
3660
&error);
3661
3662
detail::errHandler(error, __CREATE_IMAGE_ERR);
3663
if (err != NULL) {
3664
*err = error;
3665
}
3666
}
3667
3668
Image1DArray() { }
3669
3670
Image1DArray(const Image1DArray& imageArray) : Image(imageArray) { }
3671
3672
__CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { }
3673
3674
Image1DArray& operator = (const Image1DArray& rhs)
3675
{
3676
if (this != &rhs) {
3677
Image::operator=(rhs);
3678
}
3679
return *this;
3680
}
3681
3682
Image1DArray& operator = (const cl_mem& rhs)
3683
{
3684
Image::operator=(rhs);
3685
return *this;
3686
}
3687
};
3688
#endif // #if defined(CL_VERSION_1_2)
3689
3690
3691
/*! \brief Class interface for 2D Image Memory objects.
3692
*
3693
* See Memory for details about copy semantics, etc.
3694
*
3695
* \see Memory
3696
*/
3697
class Image2D : public Image
3698
{
3699
public:
3700
/*! \brief Constructs a 1D Image in a specified context.
3701
*
3702
* Wraps clCreateImage().
3703
*/
3704
Image2D(
3705
const Context& context,
3706
cl_mem_flags flags,
3707
ImageFormat format,
3708
::size_t width,
3709
::size_t height,
3710
::size_t row_pitch = 0,
3711
void* host_ptr = NULL,
3712
cl_int* err = NULL)
3713
{
3714
cl_int error;
3715
bool useCreateImage;
3716
3717
#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3718
// Run-time decision based on the actual platform
3719
{
3720
cl_uint version = detail::getContextPlatformVersion(context());
3721
useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
3722
}
3723
#elif defined(CL_VERSION_1_2)
3724
useCreateImage = true;
3725
#else
3726
useCreateImage = false;
3727
#endif
3728
3729
#if defined(CL_VERSION_1_2)
3730
if (useCreateImage)
3731
{
3732
cl_image_desc desc;
3733
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
3734
desc.image_width = width;
3735
desc.image_height = height;
3736
desc.image_row_pitch = row_pitch;
3737
desc.num_mip_levels = 0;
3738
desc.num_samples = 0;
3739
desc.buffer = 0;
3740
object_ = ::clCreateImage(
3741
context(),
3742
flags,
3743
&format,
3744
&desc,
3745
host_ptr,
3746
&error);
3747
3748
detail::errHandler(error, __CREATE_IMAGE_ERR);
3749
if (err != NULL) {
3750
*err = error;
3751
}
3752
}
3753
#endif // #if defined(CL_VERSION_1_2)
3754
#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3755
if (!useCreateImage)
3756
{
3757
object_ = ::clCreateImage2D(
3758
context(), flags,&format, width, height, row_pitch, host_ptr, &error);
3759
3760
detail::errHandler(error, __CREATE_IMAGE2D_ERR);
3761
if (err != NULL) {
3762
*err = error;
3763
}
3764
}
3765
#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3766
}
3767
3768
//! \brief Default constructor - initializes to NULL.
3769
Image2D() { }
3770
3771
/*! \brief Copy constructor - performs shallow copy.
3772
*
3773
* See Memory for further details.
3774
*/
3775
Image2D(const Image2D& image2D) : Image(image2D) { }
3776
3777
/*! \brief Constructor from cl_mem - takes ownership.
3778
*
3779
* See Memory for further details.
3780
*/
3781
__CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { }
3782
3783
/*! \brief Assignment from Image2D - performs shallow copy.
3784
*
3785
* See Memory for further details.
3786
*/
3787
Image2D& operator = (const Image2D& rhs)
3788
{
3789
if (this != &rhs) {
3790
Image::operator=(rhs);
3791
}
3792
return *this;
3793
}
3794
3795
/*! \brief Assignment from cl_mem - performs shallow copy.
3796
*
3797
* See Memory for further details.
3798
*/
3799
Image2D& operator = (const cl_mem& rhs)
3800
{
3801
Image::operator=(rhs);
3802
return *this;
3803
}
3804
};
3805
3806
3807
#if !defined(CL_VERSION_1_2)
3808
/*! \brief Class interface for GL 2D Image Memory objects.
3809
*
3810
* This is provided to facilitate interoperability with OpenGL.
3811
*
3812
* See Memory for details about copy semantics, etc.
3813
*
3814
* \see Memory
3815
* \note Deprecated for OpenCL 1.2. Please use ImageGL instead.
3816
*/
3817
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D
3818
{
3819
public:
3820
/*! \brief Constructs an Image2DGL in a specified context, from a given
3821
* GL Texture.
3822
*
3823
* Wraps clCreateFromGLTexture2D().
3824
*/
3825
Image2DGL(
3826
const Context& context,
3827
cl_mem_flags flags,
3828
GLenum target,
3829
GLint miplevel,
3830
GLuint texobj,
3831
cl_int * err = NULL)
3832
{
3833
cl_int error;
3834
object_ = ::clCreateFromGLTexture2D(
3835
context(),
3836
flags,
3837
target,
3838
miplevel,
3839
texobj,
3840
&error);
3841
3842
detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR);
3843
if (err != NULL) {
3844
*err = error;
3845
}
3846
3847
}
3848
3849
//! \brief Default constructor - initializes to NULL.
3850
Image2DGL() : Image2D() { }
3851
3852
/*! \brief Copy constructor - performs shallow copy.
3853
*
3854
* See Memory for further details.
3855
*/
3856
Image2DGL(const Image2DGL& image) : Image2D(image) { }
3857
3858
/*! \brief Constructor from cl_mem - takes ownership.
3859
*
3860
* See Memory for further details.
3861
*/
3862
__CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { }
3863
3864
/*! \brief Assignment from Image2DGL - performs shallow copy.
3865
*
3866
* See Memory for further details.
3867
*/
3868
Image2DGL& operator = (const Image2DGL& rhs)
3869
{
3870
if (this != &rhs) {
3871
Image2D::operator=(rhs);
3872
}
3873
return *this;
3874
}
3875
3876
/*! \brief Assignment from cl_mem - performs shallow copy.
3877
*
3878
* See Memory for further details.
3879
*/
3880
Image2DGL& operator = (const cl_mem& rhs)
3881
{
3882
Image2D::operator=(rhs);
3883
return *this;
3884
}
3885
};
3886
#endif // #if !defined(CL_VERSION_1_2)
3887
3888
#if defined(CL_VERSION_1_2)
3889
/*! \class Image2DArray
3890
* \brief Image interface for arrays of 2D images.
3891
*/
3892
class Image2DArray : public Image
3893
{
3894
public:
3895
Image2DArray(
3896
const Context& context,
3897
cl_mem_flags flags,
3898
ImageFormat format,
3899
::size_t arraySize,
3900
::size_t width,
3901
::size_t height,
3902
::size_t rowPitch,
3903
::size_t slicePitch,
3904
void* host_ptr = NULL,
3905
cl_int* err = NULL)
3906
{
3907
cl_int error;
3908
cl_image_desc desc;
3909
desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY;
3910
desc.image_array_size = arraySize;
3911
desc.image_width = width;
3912
desc.image_height = height;
3913
desc.image_row_pitch = rowPitch;
3914
desc.image_slice_pitch = slicePitch;
3915
desc.num_mip_levels = 0;
3916
desc.num_samples = 0;
3917
desc.buffer = 0;
3918
object_ = ::clCreateImage(
3919
context(),
3920
flags,
3921
&format,
3922
&desc,
3923
host_ptr,
3924
&error);
3925
3926
detail::errHandler(error, __CREATE_IMAGE_ERR);
3927
if (err != NULL) {
3928
*err = error;
3929
}
3930
}
3931
3932
Image2DArray() { }
3933
3934
Image2DArray(const Image2DArray& imageArray) : Image(imageArray) { }
3935
3936
__CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { }
3937
3938
Image2DArray& operator = (const Image2DArray& rhs)
3939
{
3940
if (this != &rhs) {
3941
Image::operator=(rhs);
3942
}
3943
return *this;
3944
}
3945
3946
Image2DArray& operator = (const cl_mem& rhs)
3947
{
3948
Image::operator=(rhs);
3949
return *this;
3950
}
3951
};
3952
#endif // #if defined(CL_VERSION_1_2)
3953
3954
/*! \brief Class interface for 3D Image Memory objects.
3955
*
3956
* See Memory for details about copy semantics, etc.
3957
*
3958
* \see Memory
3959
*/
3960
class Image3D : public Image
3961
{
3962
public:
3963
/*! \brief Constructs a 3D Image in a specified context.
3964
*
3965
* Wraps clCreateImage().
3966
*/
3967
Image3D(
3968
const Context& context,
3969
cl_mem_flags flags,
3970
ImageFormat format,
3971
::size_t width,
3972
::size_t height,
3973
::size_t depth,
3974
::size_t row_pitch = 0,
3975
::size_t slice_pitch = 0,
3976
void* host_ptr = NULL,
3977
cl_int* err = NULL)
3978
{
3979
cl_int error;
3980
bool useCreateImage;
3981
3982
#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3983
// Run-time decision based on the actual platform
3984
{
3985
cl_uint version = detail::getContextPlatformVersion(context());
3986
useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
3987
}
3988
#elif defined(CL_VERSION_1_2)
3989
useCreateImage = true;
3990
#else
3991
useCreateImage = false;
3992
#endif
3993
3994
#if defined(CL_VERSION_1_2)
3995
if (useCreateImage)
3996
{
3997
cl_image_desc desc;
3998
desc.image_type = CL_MEM_OBJECT_IMAGE3D;
3999
desc.image_width = width;
4000
desc.image_height = height;
4001
desc.image_depth = depth;
4002
desc.image_row_pitch = row_pitch;
4003
desc.image_slice_pitch = slice_pitch;
4004
desc.num_mip_levels = 0;
4005
desc.num_samples = 0;
4006
desc.buffer = 0;
4007
object_ = ::clCreateImage(
4008
context(),
4009
flags,
4010
&format,
4011
&desc,
4012
host_ptr,
4013
&error);
4014
4015
detail::errHandler(error, __CREATE_IMAGE_ERR);
4016
if (err != NULL) {
4017
*err = error;
4018
}
4019
}
4020
#endif // #if defined(CL_VERSION_1_2)
4021
#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4022
if (!useCreateImage)
4023
{
4024
object_ = ::clCreateImage3D(
4025
context(), flags, &format, width, height, depth, row_pitch,
4026
slice_pitch, host_ptr, &error);
4027
4028
detail::errHandler(error, __CREATE_IMAGE3D_ERR);
4029
if (err != NULL) {
4030
*err = error;
4031
}
4032
}
4033
#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4034
}
4035
4036
//! \brief Default constructor - initializes to NULL.
4037
Image3D() { }
4038
4039
/*! \brief Copy constructor - performs shallow copy.
4040
*
4041
* See Memory for further details.
4042
*/
4043
Image3D(const Image3D& image3D) : Image(image3D) { }
4044
4045
/*! \brief Constructor from cl_mem - takes ownership.
4046
*
4047
* See Memory for further details.
4048
*/
4049
__CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { }
4050
4051
/*! \brief Assignment from Image3D - performs shallow copy.
4052
*
4053
* See Memory for further details.
4054
*/
4055
Image3D& operator = (const Image3D& rhs)
4056
{
4057
if (this != &rhs) {
4058
Image::operator=(rhs);
4059
}
4060
return *this;
4061
}
4062
4063
/*! \brief Assignment from cl_mem - performs shallow copy.
4064
*
4065
* See Memory for further details.
4066
*/
4067
Image3D& operator = (const cl_mem& rhs)
4068
{
4069
Image::operator=(rhs);
4070
return *this;
4071
}
4072
};
4073
4074
#if !defined(CL_VERSION_1_2)
4075
/*! \brief Class interface for GL 3D Image Memory objects.
4076
*
4077
* This is provided to facilitate interoperability with OpenGL.
4078
*
4079
* See Memory for details about copy semantics, etc.
4080
*
4081
* \see Memory
4082
*/
4083
class Image3DGL : public Image3D
4084
{
4085
public:
4086
/*! \brief Constructs an Image3DGL in a specified context, from a given
4087
* GL Texture.
4088
*
4089
* Wraps clCreateFromGLTexture3D().
4090
*/
4091
Image3DGL(
4092
const Context& context,
4093
cl_mem_flags flags,
4094
GLenum target,
4095
GLint miplevel,
4096
GLuint texobj,
4097
cl_int * err = NULL)
4098
{
4099
cl_int error;
4100
object_ = ::clCreateFromGLTexture3D(
4101
context(),
4102
flags,
4103
target,
4104
miplevel,
4105
texobj,
4106
&error);
4107
4108
detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR);
4109
if (err != NULL) {
4110
*err = error;
4111
}
4112
}
4113
4114
//! \brief Default constructor - initializes to NULL.
4115
Image3DGL() : Image3D() { }
4116
4117
/*! \brief Copy constructor - performs shallow copy.
4118
*
4119
* See Memory for further details.
4120
*/
4121
Image3DGL(const Image3DGL& image) : Image3D(image) { }
4122
4123
/*! \brief Constructor from cl_mem - takes ownership.
4124
*
4125
* See Memory for further details.
4126
*/
4127
__CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { }
4128
4129
/*! \brief Assignment from Image3DGL - performs shallow copy.
4130
*
4131
* See Memory for further details.
4132
*/
4133
Image3DGL& operator = (const Image3DGL& rhs)
4134
{
4135
if (this != &rhs) {
4136
Image3D::operator=(rhs);
4137
}
4138
return *this;
4139
}
4140
4141
/*! \brief Assignment from cl_mem - performs shallow copy.
4142
*
4143
* See Memory for further details.
4144
*/
4145
Image3DGL& operator = (const cl_mem& rhs)
4146
{
4147
Image3D::operator=(rhs);
4148
return *this;
4149
}
4150
};
4151
#endif // #if !defined(CL_VERSION_1_2)
4152
4153
#if defined(CL_VERSION_1_2)
4154
/*! \class ImageGL
4155
* \brief general image interface for GL interop.
4156
* We abstract the 2D and 3D GL images into a single instance here
4157
* that wraps all GL sourced images on the grounds that setup information
4158
* was performed by OpenCL anyway.
4159
*/
4160
class ImageGL : public Image
4161
{
4162
public:
4163
ImageGL(
4164
const Context& context,
4165
cl_mem_flags flags,
4166
GLenum target,
4167
GLint miplevel,
4168
GLuint texobj,
4169
cl_int * err = NULL)
4170
{
4171
cl_int error;
4172
object_ = ::clCreateFromGLTexture(
4173
context(),
4174
flags,
4175
target,
4176
miplevel,
4177
texobj,
4178
&error);
4179
4180
detail::errHandler(error, __CREATE_GL_TEXTURE_ERR);
4181
if (err != NULL) {
4182
*err = error;
4183
}
4184
}
4185
4186
ImageGL() : Image() { }
4187
4188
ImageGL(const ImageGL& image) : Image(image) { }
4189
4190
__CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { }
4191
4192
ImageGL& operator = (const ImageGL& rhs)
4193
{
4194
if (this != &rhs) {
4195
Image::operator=(rhs);
4196
}
4197
return *this;
4198
}
4199
4200
ImageGL& operator = (const cl_mem& rhs)
4201
{
4202
Image::operator=(rhs);
4203
return *this;
4204
}
4205
};
4206
#endif // #if defined(CL_VERSION_1_2)
4207
4208
/*! \brief Class interface for cl_sampler.
4209
*
4210
* \note Copies of these objects are shallow, meaning that the copy will refer
4211
* to the same underlying cl_sampler as the original. For details, see
4212
* clRetainSampler() and clReleaseSampler().
4213
*
4214
* \see cl_sampler
4215
*/
4216
class Sampler : public detail::Wrapper<cl_sampler>
4217
{
4218
public:
4219
/*! \brief Destructor.
4220
*
4221
* This calls clReleaseSampler() on the value held by this instance.
4222
*/
4223
~Sampler() { }
4224
4225
//! \brief Default constructor - initializes to NULL.
4226
Sampler() { }
4227
4228
/*! \brief Constructs a Sampler in a specified context.
4229
*
4230
* Wraps clCreateSampler().
4231
*/
4232
Sampler(
4233
const Context& context,
4234
cl_bool normalized_coords,
4235
cl_addressing_mode addressing_mode,
4236
cl_filter_mode filter_mode,
4237
cl_int* err = NULL)
4238
{
4239
cl_int error;
4240
object_ = ::clCreateSampler(
4241
context(),
4242
normalized_coords,
4243
addressing_mode,
4244
filter_mode,
4245
&error);
4246
4247
detail::errHandler(error, __CREATE_SAMPLER_ERR);
4248
if (err != NULL) {
4249
*err = error;
4250
}
4251
}
4252
4253
/*! \brief Copy constructor - performs shallow copy.
4254
*
4255
* This calls clRetainSampler() on the parameter's cl_sampler.
4256
*/
4257
Sampler(const Sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
4258
4259
/*! \brief Constructor from cl_sampler - takes ownership.
4260
*
4261
* This effectively transfers ownership of a refcount on the cl_sampler
4262
* into the new Sampler object.
4263
*/
4264
Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
4265
4266
/*! \brief Assignment operator from Sampler.
4267
*
4268
* This calls clRetainSampler() on the parameter and clReleaseSampler()
4269
* on the previous value held by this instance.
4270
*/
4271
Sampler& operator = (const Sampler& rhs)
4272
{
4273
if (this != &rhs) {
4274
detail::Wrapper<cl_type>::operator=(rhs);
4275
}
4276
return *this;
4277
}
4278
4279
/*! \brief Assignment operator from cl_sampler - takes ownership.
4280
*
4281
* This effectively transfers ownership of a refcount on the rhs and calls
4282
* clReleaseSampler() on the value previously held by this instance.
4283
*/
4284
Sampler& operator = (const cl_sampler& rhs)
4285
{
4286
detail::Wrapper<cl_type>::operator=(rhs);
4287
return *this;
4288
}
4289
4290
//! \brief Wrapper for clGetSamplerInfo().
4291
template <typename T>
4292
cl_int getInfo(cl_sampler_info name, T* param) const
4293
{
4294
return detail::errHandler(
4295
detail::getInfo(&::clGetSamplerInfo, object_, name, param),
4296
__GET_SAMPLER_INFO_ERR);
4297
}
4298
4299
//! \brief Wrapper for clGetSamplerInfo() that returns by value.
4300
template <cl_int name> typename
4301
detail::param_traits<detail::cl_sampler_info, name>::param_type
4302
getInfo(cl_int* err = NULL) const
4303
{
4304
typename detail::param_traits<
4305
detail::cl_sampler_info, name>::param_type param;
4306
cl_int result = getInfo(name, &param);
4307
if (err != NULL) {
4308
*err = result;
4309
}
4310
return param;
4311
}
4312
};
4313
4314
class Program;
4315
class CommandQueue;
4316
class Kernel;
4317
4318
//! \brief Class interface for specifying NDRange values.
4319
class NDRange
4320
{
4321
private:
4322
size_t<3> sizes_;
4323
cl_uint dimensions_;
4324
4325
public:
4326
//! \brief Default constructor - resulting range has zero dimensions.
4327
NDRange()
4328
: dimensions_(0)
4329
{ }
4330
4331
//! \brief Constructs one-dimensional range.
4332
NDRange(::size_t size0)
4333
: dimensions_(1)
4334
{
4335
sizes_[0] = size0;
4336
}
4337
4338
//! \brief Constructs two-dimensional range.
4339
NDRange(::size_t size0, ::size_t size1)
4340
: dimensions_(2)
4341
{
4342
sizes_[0] = size0;
4343
sizes_[1] = size1;
4344
}
4345
4346
//! \brief Constructs three-dimensional range.
4347
NDRange(::size_t size0, ::size_t size1, ::size_t size2)
4348
: dimensions_(3)
4349
{
4350
sizes_[0] = size0;
4351
sizes_[1] = size1;
4352
sizes_[2] = size2;
4353
}
4354
4355
/*! \brief Conversion operator to const ::size_t *.
4356
*
4357
* \returns a pointer to the size of the first dimension.
4358
*/
4359
operator const ::size_t*() const {
4360
return (const ::size_t*) sizes_;
4361
}
4362
4363
//! \brief Queries the number of dimensions in the range.
4364
::size_t dimensions() const { return dimensions_; }
4365
};
4366
4367
//! \brief A zero-dimensional range.
4368
static const NDRange NullRange;
4369
4370
//! \brief Local address wrapper for use with Kernel::setArg
4371
struct LocalSpaceArg
4372
{
4373
::size_t size_;
4374
};
4375
4376
namespace detail {
4377
4378
template <typename T>
4379
struct KernelArgumentHandler
4380
{
4381
static ::size_t size(const T&) { return sizeof(T); }
4382
static T* ptr(T& value) { return &value; }
4383
};
4384
4385
template <>
4386
struct KernelArgumentHandler<LocalSpaceArg>
4387
{
4388
static ::size_t size(const LocalSpaceArg& value) { return value.size_; }
4389
static void* ptr(LocalSpaceArg&) { return NULL; }
4390
};
4391
4392
}
4393
//! \endcond
4394
4395
/*! __local
4396
* \brief Helper function for generating LocalSpaceArg objects.
4397
* Deprecated. Replaced with Local.
4398
*/
4399
inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg
4400
__local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
4401
inline LocalSpaceArg
4402
__local(::size_t size)
4403
{
4404
LocalSpaceArg ret = { size };
4405
return ret;
4406
}
4407
4408
/*! Local
4409
* \brief Helper function for generating LocalSpaceArg objects.
4410
*/
4411
inline LocalSpaceArg
4412
Local(::size_t size)
4413
{
4414
LocalSpaceArg ret = { size };
4415
return ret;
4416
}
4417
4418
//class KernelFunctor;
4419
4420
/*! \brief Class interface for cl_kernel.
4421
*
4422
* \note Copies of these objects are shallow, meaning that the copy will refer
4423
* to the same underlying cl_kernel as the original. For details, see
4424
* clRetainKernel() and clReleaseKernel().
4425
*
4426
* \see cl_kernel
4427
*/
4428
class Kernel : public detail::Wrapper<cl_kernel>
4429
{
4430
public:
4431
inline Kernel(const Program& program, const char* name, cl_int* err = NULL);
4432
4433
/*! \brief Destructor.
4434
*
4435
* This calls clReleaseKernel() on the value held by this instance.
4436
*/
4437
~Kernel() { }
4438
4439
//! \brief Default constructor - initializes to NULL.
4440
Kernel() { }
4441
4442
/*! \brief Copy constructor - performs shallow copy.
4443
*
4444
* This calls clRetainKernel() on the parameter's cl_kernel.
4445
*/
4446
Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
4447
4448
/*! \brief Constructor from cl_kernel - takes ownership.
4449
*
4450
* This effectively transfers ownership of a refcount on the cl_kernel
4451
* into the new Kernel object.
4452
*/
4453
__CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
4454
4455
/*! \brief Assignment operator from Kernel.
4456
*
4457
* This calls clRetainKernel() on the parameter and clReleaseKernel()
4458
* on the previous value held by this instance.
4459
*/
4460
Kernel& operator = (const Kernel& rhs)
4461
{
4462
if (this != &rhs) {
4463
detail::Wrapper<cl_type>::operator=(rhs);
4464
}
4465
return *this;
4466
}
4467
4468
/*! \brief Assignment operator from cl_kernel - takes ownership.
4469
*
4470
* This effectively transfers ownership of a refcount on the rhs and calls
4471
* clReleaseKernel() on the value previously held by this instance.
4472
*/
4473
Kernel& operator = (const cl_kernel& rhs)
4474
{
4475
detail::Wrapper<cl_type>::operator=(rhs);
4476
return *this;
4477
}
4478
4479
template <typename T>
4480
cl_int getInfo(cl_kernel_info name, T* param) const
4481
{
4482
return detail::errHandler(
4483
detail::getInfo(&::clGetKernelInfo, object_, name, param),
4484
__GET_KERNEL_INFO_ERR);
4485
}
4486
4487
template <cl_int name> typename
4488
detail::param_traits<detail::cl_kernel_info, name>::param_type
4489
getInfo(cl_int* err = NULL) const
4490
{
4491
typename detail::param_traits<
4492
detail::cl_kernel_info, name>::param_type param;
4493
cl_int result = getInfo(name, &param);
4494
if (err != NULL) {
4495
*err = result;
4496
}
4497
return param;
4498
}
4499
4500
#if defined(CL_VERSION_1_2)
4501
template <typename T>
4502
cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const
4503
{
4504
return detail::errHandler(
4505
detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param),
4506
__GET_KERNEL_ARG_INFO_ERR);
4507
}
4508
4509
template <cl_int name> typename
4510
detail::param_traits<detail::cl_kernel_arg_info, name>::param_type
4511
getArgInfo(cl_uint argIndex, cl_int* err = NULL) const
4512
{
4513
typename detail::param_traits<
4514
detail::cl_kernel_arg_info, name>::param_type param;
4515
cl_int result = getArgInfo(argIndex, name, &param);
4516
if (err != NULL) {
4517
*err = result;
4518
}
4519
return param;
4520
}
4521
#endif // #if defined(CL_VERSION_1_2)
4522
4523
template <typename T>
4524
cl_int getWorkGroupInfo(
4525
const Device& device, cl_kernel_work_group_info name, T* param) const
4526
{
4527
return detail::errHandler(
4528
detail::getInfo(
4529
&::clGetKernelWorkGroupInfo, object_, device(), name, param),
4530
__GET_KERNEL_WORK_GROUP_INFO_ERR);
4531
}
4532
4533
template <cl_int name> typename
4534
detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type
4535
getWorkGroupInfo(const Device& device, cl_int* err = NULL) const
4536
{
4537
typename detail::param_traits<
4538
detail::cl_kernel_work_group_info, name>::param_type param;
4539
cl_int result = getWorkGroupInfo(device, name, &param);
4540
if (err != NULL) {
4541
*err = result;
4542
}
4543
return param;
4544
}
4545
4546
template <typename T>
4547
cl_int setArg(cl_uint index, T value)
4548
{
4549
return detail::errHandler(
4550
::clSetKernelArg(
4551
object_,
4552
index,
4553
detail::KernelArgumentHandler<T>::size(value),
4554
detail::KernelArgumentHandler<T>::ptr(value)),
4555
__SET_KERNEL_ARGS_ERR);
4556
}
4557
4558
cl_int setArg(cl_uint index, ::size_t size, void* argPtr)
4559
{
4560
return detail::errHandler(
4561
::clSetKernelArg(object_, index, size, argPtr),
4562
__SET_KERNEL_ARGS_ERR);
4563
}
4564
};
4565
4566
/*! \class Program
4567
* \brief Program interface that implements cl_program.
4568
*/
4569
class Program : public detail::Wrapper<cl_program>
4570
{
4571
public:
4572
typedef VECTOR_CLASS<std::pair<const void*, ::size_t> > Binaries;
4573
typedef VECTOR_CLASS<std::pair<const char*, ::size_t> > Sources;
4574
4575
Program(
4576
const STRING_CLASS& source,
4577
cl_int* err = NULL)
4578
{
4579
cl_int error;
4580
4581
const char * strings = source.c_str();
4582
const ::size_t length = source.size();
4583
4584
Context context = Context::getDefault(err);
4585
4586
object_ = ::clCreateProgramWithSource(
4587
context(), (cl_uint)1, &strings, &length, &error);
4588
4589
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
4590
4591
if (error == CL_SUCCESS) {
4592
4593
error = ::clBuildProgram(
4594
object_,
4595
0,
4596
NULL,
4597
"",
4598
NULL,
4599
NULL);
4600
4601
detail::errHandler(error, __BUILD_PROGRAM_ERR);
4602
}
4603
4604
if (err != NULL) {
4605
*err = error;
4606
}
4607
}
4608
4609
Program(
4610
const STRING_CLASS& source,
4611
bool build,
4612
cl_int* err = NULL)
4613
{
4614
cl_int error;
4615
4616
const char * strings = source.c_str();
4617
const ::size_t length = source.size();
4618
4619
Context context = Context::getDefault(err);
4620
4621
object_ = ::clCreateProgramWithSource(
4622
context(), (cl_uint)1, &strings, &length, &error);
4623
4624
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
4625
4626
if (error == CL_SUCCESS && build) {
4627
4628
error = ::clBuildProgram(
4629
object_,
4630
0,
4631
NULL,
4632
"",
4633
NULL,
4634
NULL);
4635
4636
detail::errHandler(error, __BUILD_PROGRAM_ERR);
4637
}
4638
4639
if (err != NULL) {
4640
*err = error;
4641
}
4642
}
4643
4644
Program(
4645
const Context& context,
4646
const STRING_CLASS& source,
4647
bool build = false,
4648
cl_int* err = NULL)
4649
{
4650
cl_int error;
4651
4652
const char * strings = source.c_str();
4653
const ::size_t length = source.size();
4654
4655
object_ = ::clCreateProgramWithSource(
4656
context(), (cl_uint)1, &strings, &length, &error);
4657
4658
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
4659
4660
if (error == CL_SUCCESS && build) {
4661
4662
error = ::clBuildProgram(
4663
object_,
4664
0,
4665
NULL,
4666
"",
4667
NULL,
4668
NULL);
4669
4670
detail::errHandler(error, __BUILD_PROGRAM_ERR);
4671
}
4672
4673
if (err != NULL) {
4674
*err = error;
4675
}
4676
}
4677
4678
Program(
4679
const Context& context,
4680
const Sources& sources,
4681
cl_int* err = NULL)
4682
{
4683
cl_int error;
4684
4685
const ::size_t n = (::size_t)sources.size();
4686
::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t));
4687
const char** strings = (const char**) alloca(n * sizeof(const char*));
4688
4689
for (::size_t i = 0; i < n; ++i) {
4690
strings[i] = sources[(int)i].first;
4691
lengths[i] = sources[(int)i].second;
4692
}
4693
4694
object_ = ::clCreateProgramWithSource(
4695
context(), (cl_uint)n, strings, lengths, &error);
4696
4697
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
4698
if (err != NULL) {
4699
*err = error;
4700
}
4701
}
4702
4703
/**
4704
* Construct a program object from a list of devices and a per-device list of binaries.
4705
* \param context A valid OpenCL context in which to construct the program.
4706
* \param devices A vector of OpenCL device objects for which the program will be created.
4707
* \param binaries A vector of pairs of a pointer to a binary object and its length.
4708
* \param binaryStatus An optional vector that on completion will be resized to
4709
* match the size of binaries and filled with values to specify if each binary
4710
* was successfully loaded.
4711
* Set to CL_SUCCESS if the binary was successfully loaded.
4712
* Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.
4713
* Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.
4714
* \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:
4715
* CL_INVALID_CONTEXT if context is not a valid context.
4716
* CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices;
4717
* or if any entry in binaries is NULL or has length 0.
4718
* CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.
4719
* CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device.
4720
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
4721
*/
4722
Program(
4723
const Context& context,
4724
const VECTOR_CLASS<Device>& devices,
4725
const Binaries& binaries,
4726
VECTOR_CLASS<cl_int>* binaryStatus = NULL,
4727
cl_int* err = NULL)
4728
{
4729
cl_int error;
4730
4731
const ::size_t numDevices = devices.size();
4732
4733
// Catch size mismatch early and return
4734
if(binaries.size() != numDevices) {
4735
error = CL_INVALID_VALUE;
4736
detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
4737
if (err != NULL) {
4738
*err = error;
4739
}
4740
return;
4741
}
4742
4743
::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t));
4744
const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**));
4745
4746
for (::size_t i = 0; i < numDevices; ++i) {
4747
images[i] = (const unsigned char*)binaries[i].first;
4748
lengths[i] = binaries[(int)i].second;
4749
}
4750
4751
cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
4752
for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
4753
deviceIDs[deviceIndex] = (devices[deviceIndex])();
4754
}
4755
4756
if(binaryStatus) {
4757
binaryStatus->resize(numDevices);
4758
}
4759
4760
object_ = ::clCreateProgramWithBinary(
4761
context(), (cl_uint) devices.size(),
4762
deviceIDs,
4763
lengths, images, binaryStatus != NULL
4764
? &binaryStatus->front()
4765
: NULL, &error);
4766
4767
detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
4768
if (err != NULL) {
4769
*err = error;
4770
}
4771
}
4772
4773
4774
#if defined(CL_VERSION_1_2)
4775
/**
4776
* Create program using builtin kernels.
4777
* \param kernelNames Semi-colon separated list of builtin kernel names
4778
*/
4779
Program(
4780
const Context& context,
4781
const VECTOR_CLASS<Device>& devices,
4782
const STRING_CLASS& kernelNames,
4783
cl_int* err = NULL)
4784
{
4785
cl_int error;
4786
4787
4788
::size_t numDevices = devices.size();
4789
cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
4790
for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
4791
deviceIDs[deviceIndex] = (devices[deviceIndex])();
4792
}
4793
4794
object_ = ::clCreateProgramWithBuiltInKernels(
4795
context(),
4796
(cl_uint) devices.size(),
4797
deviceIDs,
4798
kernelNames.c_str(),
4799
&error);
4800
4801
detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR);
4802
if (err != NULL) {
4803
*err = error;
4804
}
4805
}
4806
#endif // #if defined(CL_VERSION_1_2)
4807
4808
Program() { }
4809
4810
Program(const Program& program) : detail::Wrapper<cl_type>(program) { }
4811
4812
__CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { }
4813
4814
Program& operator = (const Program& rhs)
4815
{
4816
if (this != &rhs) {
4817
detail::Wrapper<cl_type>::operator=(rhs);
4818
}
4819
return *this;
4820
}
4821
4822
Program& operator = (const cl_program& rhs)
4823
{
4824
detail::Wrapper<cl_type>::operator=(rhs);
4825
return *this;
4826
}
4827
4828
cl_int build(
4829
const VECTOR_CLASS<Device>& devices,
4830
const char* options = NULL,
4831
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
4832
void* data = NULL) const
4833
{
4834
::size_t numDevices = devices.size();
4835
cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
4836
for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
4837
deviceIDs[deviceIndex] = (devices[deviceIndex])();
4838
}
4839
4840
return detail::errHandler(
4841
::clBuildProgram(
4842
object_,
4843
(cl_uint)
4844
devices.size(),
4845
deviceIDs,
4846
options,
4847
notifyFptr,
4848
data),
4849
__BUILD_PROGRAM_ERR);
4850
}
4851
4852
cl_int build(
4853
const char* options = NULL,
4854
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
4855
void* data = NULL) const
4856
{
4857
return detail::errHandler(
4858
::clBuildProgram(
4859
object_,
4860
0,
4861
NULL,
4862
options,
4863
notifyFptr,
4864
data),
4865
__BUILD_PROGRAM_ERR);
4866
}
4867
4868
#if defined(CL_VERSION_1_2)
4869
cl_int compile(
4870
const char* options = NULL,
4871
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
4872
void* data = NULL) const
4873
{
4874
return detail::errHandler(
4875
::clCompileProgram(
4876
object_,
4877
0,
4878
NULL,
4879
options,
4880
0,
4881
NULL,
4882
NULL,
4883
notifyFptr,
4884
data),
4885
__COMPILE_PROGRAM_ERR);
4886
}
4887
#endif
4888
4889
template <typename T>
4890
cl_int getInfo(cl_program_info name, T* param) const
4891
{
4892
return detail::errHandler(
4893
detail::getInfo(&::clGetProgramInfo, object_, name, param),
4894
__GET_PROGRAM_INFO_ERR);
4895
}
4896
4897
template <cl_int name> typename
4898
detail::param_traits<detail::cl_program_info, name>::param_type
4899
getInfo(cl_int* err = NULL) const
4900
{
4901
typename detail::param_traits<
4902
detail::cl_program_info, name>::param_type param;
4903
cl_int result = getInfo(name, &param);
4904
if (err != NULL) {
4905
*err = result;
4906
}
4907
return param;
4908
}
4909
4910
template <typename T>
4911
cl_int getBuildInfo(
4912
const Device& device, cl_program_build_info name, T* param) const
4913
{
4914
return detail::errHandler(
4915
detail::getInfo(
4916
&::clGetProgramBuildInfo, object_, device(), name, param),
4917
__GET_PROGRAM_BUILD_INFO_ERR);
4918
}
4919
4920
template <cl_int name> typename
4921
detail::param_traits<detail::cl_program_build_info, name>::param_type
4922
getBuildInfo(const Device& device, cl_int* err = NULL) const
4923
{
4924
typename detail::param_traits<
4925
detail::cl_program_build_info, name>::param_type param;
4926
cl_int result = getBuildInfo(device, name, &param);
4927
if (err != NULL) {
4928
*err = result;
4929
}
4930
return param;
4931
}
4932
4933
cl_int createKernels(VECTOR_CLASS<Kernel>* kernels)
4934
{
4935
cl_uint numKernels;
4936
cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels);
4937
if (err != CL_SUCCESS) {
4938
return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
4939
}
4940
4941
Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel));
4942
err = ::clCreateKernelsInProgram(
4943
object_, numKernels, (cl_kernel*) value, NULL);
4944
if (err != CL_SUCCESS) {
4945
return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
4946
}
4947
4948
kernels->assign(&value[0], &value[numKernels]);
4949
return CL_SUCCESS;
4950
}
4951
};
4952
4953
#if defined(CL_VERSION_1_2)
4954
inline Program linkProgram(
4955
Program input1,
4956
Program input2,
4957
const char* options = NULL,
4958
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
4959
void* data = NULL,
4960
cl_int* err = NULL)
4961
{
4962
cl_int err_local = CL_SUCCESS;
4963
4964
cl_program programs[2] = { input1(), input2() };
4965
4966
Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>();
4967
4968
cl_program prog = ::clLinkProgram(
4969
ctx(),
4970
0,
4971
NULL,
4972
options,
4973
2,
4974
programs,
4975
notifyFptr,
4976
data,
4977
&err_local);
4978
4979
detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);
4980
if (err != NULL) {
4981
*err = err_local;
4982
}
4983
4984
return Program(prog);
4985
}
4986
4987
inline Program linkProgram(
4988
VECTOR_CLASS<Program> inputPrograms,
4989
const char* options = NULL,
4990
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
4991
void* data = NULL,
4992
cl_int* err = NULL)
4993
{
4994
cl_int err_local = CL_SUCCESS;
4995
4996
cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));
4997
4998
if (programs != NULL) {
4999
for (unsigned int i = 0; i < inputPrograms.size(); i++) {
5000
programs[i] = inputPrograms[i]();
5001
}
5002
}
5003
5004
cl_program prog = ::clLinkProgram(
5005
Context::getDefault()(),
5006
0,
5007
NULL,
5008
options,
5009
(cl_uint)inputPrograms.size(),
5010
programs,
5011
notifyFptr,
5012
data,
5013
&err_local);
5014
5015
detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);
5016
if (err != NULL) {
5017
*err = err_local;
5018
}
5019
5020
return Program(prog);
5021
}
5022
#endif
5023
5024
template<>
5025
inline VECTOR_CLASS<char *> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* err) const
5026
{
5027
VECTOR_CLASS< ::size_t> sizes = getInfo<CL_PROGRAM_BINARY_SIZES>();
5028
VECTOR_CLASS<char *> binaries;
5029
for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s)
5030
{
5031
char *ptr = NULL;
5032
if (*s != 0)
5033
ptr = new char[*s];
5034
binaries.push_back(ptr);
5035
}
5036
5037
cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries);
5038
if (err != NULL) {
5039
*err = result;
5040
}
5041
return binaries;
5042
}
5043
5044
inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
5045
{
5046
cl_int error;
5047
5048
object_ = ::clCreateKernel(program(), name, &error);
5049
detail::errHandler(error, __CREATE_KERNEL_ERR);
5050
5051
if (err != NULL) {
5052
*err = error;
5053
}
5054
5055
}
5056
5057
/*! \class CommandQueue
5058
* \brief CommandQueue interface for cl_command_queue.
5059
*/
5060
class CommandQueue : public detail::Wrapper<cl_command_queue>
5061
{
5062
private:
5063
static volatile int default_initialized_;
5064
static CommandQueue default_;
5065
static volatile cl_int default_error_;
5066
public:
5067
CommandQueue(
5068
cl_command_queue_properties properties,
5069
cl_int* err = NULL)
5070
{
5071
cl_int error;
5072
5073
Context context = Context::getDefault(&error);
5074
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5075
5076
if (error != CL_SUCCESS) {
5077
if (err != NULL) {
5078
*err = error;
5079
}
5080
}
5081
else {
5082
Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
5083
5084
object_ = ::clCreateCommandQueue(
5085
context(), device(), properties, &error);
5086
5087
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5088
if (err != NULL) {
5089
*err = error;
5090
}
5091
}
5092
}
5093
5094
CommandQueue(
5095
const Context& context,
5096
const Device& device,
5097
cl_command_queue_properties properties = 0,
5098
cl_int* err = NULL)
5099
{
5100
cl_int error;
5101
object_ = ::clCreateCommandQueue(
5102
context(), device(), properties, &error);
5103
5104
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5105
if (err != NULL) {
5106
*err = error;
5107
}
5108
}
5109
5110
static CommandQueue getDefault(cl_int * err = NULL)
5111
{
5112
int state = detail::compare_exchange(
5113
&default_initialized_,
5114
__DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
5115
5116
if (state & __DEFAULT_INITIALIZED) {
5117
if (err != NULL) {
5118
*err = default_error_;
5119
}
5120
return default_;
5121
}
5122
5123
if (state & __DEFAULT_BEING_INITIALIZED) {
5124
// Assume writes will propagate eventually...
5125
while(default_initialized_ != __DEFAULT_INITIALIZED) {
5126
detail::fence();
5127
}
5128
5129
if (err != NULL) {
5130
*err = default_error_;
5131
}
5132
return default_;
5133
}
5134
5135
cl_int error;
5136
5137
Context context = Context::getDefault(&error);
5138
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5139
5140
if (error != CL_SUCCESS) {
5141
if (err != NULL) {
5142
*err = error;
5143
}
5144
}
5145
else {
5146
Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
5147
5148
default_ = CommandQueue(context, device, 0, &error);
5149
5150
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5151
if (err != NULL) {
5152
*err = error;
5153
}
5154
}
5155
5156
detail::fence();
5157
5158
default_error_ = error;
5159
// Assume writes will propagate eventually...
5160
default_initialized_ = __DEFAULT_INITIALIZED;
5161
5162
detail::fence();
5163
5164
if (err != NULL) {
5165
*err = default_error_;
5166
}
5167
return default_;
5168
5169
}
5170
5171
CommandQueue() { }
5172
5173
CommandQueue(const CommandQueue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
5174
5175
CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
5176
5177
CommandQueue& operator = (const CommandQueue& rhs)
5178
{
5179
if (this != &rhs) {
5180
detail::Wrapper<cl_type>::operator=(rhs);
5181
}
5182
return *this;
5183
}
5184
5185
CommandQueue& operator = (const cl_command_queue& rhs)
5186
{
5187
detail::Wrapper<cl_type>::operator=(rhs);
5188
return *this;
5189
}
5190
5191
template <typename T>
5192
cl_int getInfo(cl_command_queue_info name, T* param) const
5193
{
5194
return detail::errHandler(
5195
detail::getInfo(
5196
&::clGetCommandQueueInfo, object_, name, param),
5197
__GET_COMMAND_QUEUE_INFO_ERR);
5198
}
5199
5200
template <cl_int name> typename
5201
detail::param_traits<detail::cl_command_queue_info, name>::param_type
5202
getInfo(cl_int* err = NULL) const
5203
{
5204
typename detail::param_traits<
5205
detail::cl_command_queue_info, name>::param_type param;
5206
cl_int result = getInfo(name, &param);
5207
if (err != NULL) {
5208
*err = result;
5209
}
5210
return param;
5211
}
5212
5213
cl_int enqueueReadBuffer(
5214
const Buffer& buffer,
5215
cl_bool blocking,
5216
::size_t offset,
5217
::size_t size,
5218
void* ptr,
5219
const VECTOR_CLASS<Event>* events = NULL,
5220
Event* event = NULL) const
5221
{
5222
cl_event tmp;
5223
cl_int err = detail::errHandler(
5224
::clEnqueueReadBuffer(
5225
object_, buffer(), blocking, offset, size,
5226
ptr,
5227
(events != NULL) ? (cl_uint) events->size() : 0,
5228
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5229
(event != NULL) ? &tmp : NULL),
5230
__ENQUEUE_READ_BUFFER_ERR);
5231
5232
if (event != NULL && err == CL_SUCCESS)
5233
*event = tmp;
5234
5235
return err;
5236
}
5237
5238
cl_int enqueueWriteBuffer(
5239
const Buffer& buffer,
5240
cl_bool blocking,
5241
::size_t offset,
5242
::size_t size,
5243
const void* ptr,
5244
const VECTOR_CLASS<Event>* events = NULL,
5245
Event* event = NULL) const
5246
{
5247
cl_event tmp;
5248
cl_int err = detail::errHandler(
5249
::clEnqueueWriteBuffer(
5250
object_, buffer(), blocking, offset, size,
5251
ptr,
5252
(events != NULL) ? (cl_uint) events->size() : 0,
5253
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5254
(event != NULL) ? &tmp : NULL),
5255
__ENQUEUE_WRITE_BUFFER_ERR);
5256
5257
if (event != NULL && err == CL_SUCCESS)
5258
*event = tmp;
5259
5260
return err;
5261
}
5262
5263
cl_int enqueueCopyBuffer(
5264
const Buffer& src,
5265
const Buffer& dst,
5266
::size_t src_offset,
5267
::size_t dst_offset,
5268
::size_t size,
5269
const VECTOR_CLASS<Event>* events = NULL,
5270
Event* event = NULL) const
5271
{
5272
cl_event tmp;
5273
cl_int err = detail::errHandler(
5274
::clEnqueueCopyBuffer(
5275
object_, src(), dst(), src_offset, dst_offset, size,
5276
(events != NULL) ? (cl_uint) events->size() : 0,
5277
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5278
(event != NULL) ? &tmp : NULL),
5279
__ENQEUE_COPY_BUFFER_ERR);
5280
5281
if (event != NULL && err == CL_SUCCESS)
5282
*event = tmp;
5283
5284
return err;
5285
}
5286
5287
cl_int enqueueReadBufferRect(
5288
const Buffer& buffer,
5289
cl_bool blocking,
5290
const size_t<3>& buffer_offset,
5291
const size_t<3>& host_offset,
5292
const size_t<3>& region,
5293
::size_t buffer_row_pitch,
5294
::size_t buffer_slice_pitch,
5295
::size_t host_row_pitch,
5296
::size_t host_slice_pitch,
5297
void *ptr,
5298
const VECTOR_CLASS<Event>* events = NULL,
5299
Event* event = NULL) const
5300
{
5301
cl_event tmp;
5302
cl_int err = detail::errHandler(
5303
::clEnqueueReadBufferRect(
5304
object_,
5305
buffer(),
5306
blocking,
5307
(const ::size_t *)buffer_offset,
5308
(const ::size_t *)host_offset,
5309
(const ::size_t *)region,
5310
buffer_row_pitch,
5311
buffer_slice_pitch,
5312
host_row_pitch,
5313
host_slice_pitch,
5314
ptr,
5315
(events != NULL) ? (cl_uint) events->size() : 0,
5316
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5317
(event != NULL) ? &tmp : NULL),
5318
__ENQUEUE_READ_BUFFER_RECT_ERR);
5319
5320
if (event != NULL && err == CL_SUCCESS)
5321
*event = tmp;
5322
5323
return err;
5324
}
5325
5326
cl_int enqueueWriteBufferRect(
5327
const Buffer& buffer,
5328
cl_bool blocking,
5329
const size_t<3>& buffer_offset,
5330
const size_t<3>& host_offset,
5331
const size_t<3>& region,
5332
::size_t buffer_row_pitch,
5333
::size_t buffer_slice_pitch,
5334
::size_t host_row_pitch,
5335
::size_t host_slice_pitch,
5336
void *ptr,
5337
const VECTOR_CLASS<Event>* events = NULL,
5338
Event* event = NULL) const
5339
{
5340
cl_event tmp;
5341
cl_int err = detail::errHandler(
5342
::clEnqueueWriteBufferRect(
5343
object_,
5344
buffer(),
5345
blocking,
5346
(const ::size_t *)buffer_offset,
5347
(const ::size_t *)host_offset,
5348
(const ::size_t *)region,
5349
buffer_row_pitch,
5350
buffer_slice_pitch,
5351
host_row_pitch,
5352
host_slice_pitch,
5353
ptr,
5354
(events != NULL) ? (cl_uint) events->size() : 0,
5355
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5356
(event != NULL) ? &tmp : NULL),
5357
__ENQUEUE_WRITE_BUFFER_RECT_ERR);
5358
5359
if (event != NULL && err == CL_SUCCESS)
5360
*event = tmp;
5361
5362
return err;
5363
}
5364
5365
cl_int enqueueCopyBufferRect(
5366
const Buffer& src,
5367
const Buffer& dst,
5368
const size_t<3>& src_origin,
5369
const size_t<3>& dst_origin,
5370
const size_t<3>& region,
5371
::size_t src_row_pitch,
5372
::size_t src_slice_pitch,
5373
::size_t dst_row_pitch,
5374
::size_t dst_slice_pitch,
5375
const VECTOR_CLASS<Event>* events = NULL,
5376
Event* event = NULL) const
5377
{
5378
cl_event tmp;
5379
cl_int err = detail::errHandler(
5380
::clEnqueueCopyBufferRect(
5381
object_,
5382
src(),
5383
dst(),
5384
(const ::size_t *)src_origin,
5385
(const ::size_t *)dst_origin,
5386
(const ::size_t *)region,
5387
src_row_pitch,
5388
src_slice_pitch,
5389
dst_row_pitch,
5390
dst_slice_pitch,
5391
(events != NULL) ? (cl_uint) events->size() : 0,
5392
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5393
(event != NULL) ? &tmp : NULL),
5394
__ENQEUE_COPY_BUFFER_RECT_ERR);
5395
5396
if (event != NULL && err == CL_SUCCESS)
5397
*event = tmp;
5398
5399
return err;
5400
}
5401
5402
#if defined(CL_VERSION_1_2)
5403
/**
5404
* Enqueue a command to fill a buffer object with a pattern
5405
* of a given size. The pattern is specified a as vector.
5406
* \tparam PatternType The datatype of the pattern field.
5407
* The pattern type must be an accepted OpenCL data type.
5408
*/
5409
template<typename PatternType>
5410
cl_int enqueueFillBuffer(
5411
const Buffer& buffer,
5412
PatternType pattern,
5413
::size_t offset,
5414
::size_t size,
5415
const VECTOR_CLASS<Event>* events = NULL,
5416
Event* event = NULL) const
5417
{
5418
cl_event tmp;
5419
cl_int err = detail::errHandler(
5420
::clEnqueueFillBuffer(
5421
object_,
5422
buffer(),
5423
static_cast<void*>(&pattern),
5424
sizeof(PatternType),
5425
offset,
5426
size,
5427
(events != NULL) ? (cl_uint) events->size() : 0,
5428
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5429
(event != NULL) ? &tmp : NULL),
5430
__ENQUEUE_FILL_BUFFER_ERR);
5431
5432
if (event != NULL && err == CL_SUCCESS)
5433
*event = tmp;
5434
5435
return err;
5436
}
5437
#endif // #if defined(CL_VERSION_1_2)
5438
5439
cl_int enqueueReadImage(
5440
const Image& image,
5441
cl_bool blocking,
5442
const size_t<3>& origin,
5443
const size_t<3>& region,
5444
::size_t row_pitch,
5445
::size_t slice_pitch,
5446
void* ptr,
5447
const VECTOR_CLASS<Event>* events = NULL,
5448
Event* event = NULL) const
5449
{
5450
cl_event tmp;
5451
cl_int err = detail::errHandler(
5452
::clEnqueueReadImage(
5453
object_, image(), blocking, (const ::size_t *) origin,
5454
(const ::size_t *) region, row_pitch, slice_pitch, ptr,
5455
(events != NULL) ? (cl_uint) events->size() : 0,
5456
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5457
(event != NULL) ? &tmp : NULL),
5458
__ENQUEUE_READ_IMAGE_ERR);
5459
5460
if (event != NULL && err == CL_SUCCESS)
5461
*event = tmp;
5462
5463
return err;
5464
}
5465
5466
cl_int enqueueWriteImage(
5467
const Image& image,
5468
cl_bool blocking,
5469
const size_t<3>& origin,
5470
const size_t<3>& region,
5471
::size_t row_pitch,
5472
::size_t slice_pitch,
5473
void* ptr,
5474
const VECTOR_CLASS<Event>* events = NULL,
5475
Event* event = NULL) const
5476
{
5477
cl_event tmp;
5478
cl_int err = detail::errHandler(
5479
::clEnqueueWriteImage(
5480
object_, image(), blocking, (const ::size_t *) origin,
5481
(const ::size_t *) region, row_pitch, slice_pitch, ptr,
5482
(events != NULL) ? (cl_uint) events->size() : 0,
5483
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5484
(event != NULL) ? &tmp : NULL),
5485
__ENQUEUE_WRITE_IMAGE_ERR);
5486
5487
if (event != NULL && err == CL_SUCCESS)
5488
*event = tmp;
5489
5490
return err;
5491
}
5492
5493
cl_int enqueueCopyImage(
5494
const Image& src,
5495
const Image& dst,
5496
const size_t<3>& src_origin,
5497
const size_t<3>& dst_origin,
5498
const size_t<3>& region,
5499
const VECTOR_CLASS<Event>* events = NULL,
5500
Event* event = NULL) const
5501
{
5502
cl_event tmp;
5503
cl_int err = detail::errHandler(
5504
::clEnqueueCopyImage(
5505
object_, src(), dst(), (const ::size_t *) src_origin,
5506
(const ::size_t *)dst_origin, (const ::size_t *) region,
5507
(events != NULL) ? (cl_uint) events->size() : 0,
5508
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5509
(event != NULL) ? &tmp : NULL),
5510
__ENQUEUE_COPY_IMAGE_ERR);
5511
5512
if (event != NULL && err == CL_SUCCESS)
5513
*event = tmp;
5514
5515
return err;
5516
}
5517
5518
#if defined(CL_VERSION_1_2)
5519
/**
5520
* Enqueue a command to fill an image object with a specified color.
5521
* \param fillColor is the color to use to fill the image.
5522
* This is a four component RGBA floating-point color value if
5523
* the image channel data type is not an unnormalized signed or
5524
* unsigned data type.
5525
*/
5526
cl_int enqueueFillImage(
5527
const Image& image,
5528
cl_float4 fillColor,
5529
const size_t<3>& origin,
5530
const size_t<3>& region,
5531
const VECTOR_CLASS<Event>* events = NULL,
5532
Event* event = NULL) const
5533
{
5534
cl_event tmp;
5535
cl_int err = detail::errHandler(
5536
::clEnqueueFillImage(
5537
object_,
5538
image(),
5539
static_cast<void*>(&fillColor),
5540
(const ::size_t *) origin,
5541
(const ::size_t *) region,
5542
(events != NULL) ? (cl_uint) events->size() : 0,
5543
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5544
(event != NULL) ? &tmp : NULL),
5545
__ENQUEUE_FILL_IMAGE_ERR);
5546
5547
if (event != NULL && err == CL_SUCCESS)
5548
*event = tmp;
5549
5550
return err;
5551
}
5552
5553
/**
5554
* Enqueue a command to fill an image object with a specified color.
5555
* \param fillColor is the color to use to fill the image.
5556
* This is a four component RGBA signed integer color value if
5557
* the image channel data type is an unnormalized signed integer
5558
* type.
5559
*/
5560
cl_int enqueueFillImage(
5561
const Image& image,
5562
cl_int4 fillColor,
5563
const size_t<3>& origin,
5564
const size_t<3>& region,
5565
const VECTOR_CLASS<Event>* events = NULL,
5566
Event* event = NULL) const
5567
{
5568
cl_event tmp;
5569
cl_int err = detail::errHandler(
5570
::clEnqueueFillImage(
5571
object_,
5572
image(),
5573
static_cast<void*>(&fillColor),
5574
(const ::size_t *) origin,
5575
(const ::size_t *) region,
5576
(events != NULL) ? (cl_uint) events->size() : 0,
5577
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5578
(event != NULL) ? &tmp : NULL),
5579
__ENQUEUE_FILL_IMAGE_ERR);
5580
5581
if (event != NULL && err == CL_SUCCESS)
5582
*event = tmp;
5583
5584
return err;
5585
}
5586
5587
/**
5588
* Enqueue a command to fill an image object with a specified color.
5589
* \param fillColor is the color to use to fill the image.
5590
* This is a four component RGBA unsigned integer color value if
5591
* the image channel data type is an unnormalized unsigned integer
5592
* type.
5593
*/
5594
cl_int enqueueFillImage(
5595
const Image& image,
5596
cl_uint4 fillColor,
5597
const size_t<3>& origin,
5598
const size_t<3>& region,
5599
const VECTOR_CLASS<Event>* events = NULL,
5600
Event* event = NULL) const
5601
{
5602
cl_event tmp;
5603
cl_int err = detail::errHandler(
5604
::clEnqueueFillImage(
5605
object_,
5606
image(),
5607
static_cast<void*>(&fillColor),
5608
(const ::size_t *) origin,
5609
(const ::size_t *) region,
5610
(events != NULL) ? (cl_uint) events->size() : 0,
5611
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5612
(event != NULL) ? &tmp : NULL),
5613
__ENQUEUE_FILL_IMAGE_ERR);
5614
5615
if (event != NULL && err == CL_SUCCESS)
5616
*event = tmp;
5617
5618
return err;
5619
}
5620
#endif // #if defined(CL_VERSION_1_2)
5621
5622
cl_int enqueueCopyImageToBuffer(
5623
const Image& src,
5624
const Buffer& dst,
5625
const size_t<3>& src_origin,
5626
const size_t<3>& region,
5627
::size_t dst_offset,
5628
const VECTOR_CLASS<Event>* events = NULL,
5629
Event* event = NULL) const
5630
{
5631
cl_event tmp;
5632
cl_int err = detail::errHandler(
5633
::clEnqueueCopyImageToBuffer(
5634
object_, src(), dst(), (const ::size_t *) src_origin,
5635
(const ::size_t *) region, dst_offset,
5636
(events != NULL) ? (cl_uint) events->size() : 0,
5637
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5638
(event != NULL) ? &tmp : NULL),
5639
__ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR);
5640
5641
if (event != NULL && err == CL_SUCCESS)
5642
*event = tmp;
5643
5644
return err;
5645
}
5646
5647
cl_int enqueueCopyBufferToImage(
5648
const Buffer& src,
5649
const Image& dst,
5650
::size_t src_offset,
5651
const size_t<3>& dst_origin,
5652
const size_t<3>& region,
5653
const VECTOR_CLASS<Event>* events = NULL,
5654
Event* event = NULL) const
5655
{
5656
cl_event tmp;
5657
cl_int err = detail::errHandler(
5658
::clEnqueueCopyBufferToImage(
5659
object_, src(), dst(), src_offset,
5660
(const ::size_t *) dst_origin, (const ::size_t *) region,
5661
(events != NULL) ? (cl_uint) events->size() : 0,
5662
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5663
(event != NULL) ? &tmp : NULL),
5664
__ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR);
5665
5666
if (event != NULL && err == CL_SUCCESS)
5667
*event = tmp;
5668
5669
return err;
5670
}
5671
5672
void* enqueueMapBuffer(
5673
const Buffer& buffer,
5674
cl_bool blocking,
5675
cl_map_flags flags,
5676
::size_t offset,
5677
::size_t size,
5678
const VECTOR_CLASS<Event>* events = NULL,
5679
Event* event = NULL,
5680
cl_int* err = NULL) const
5681
{
5682
cl_int error;
5683
void * result = ::clEnqueueMapBuffer(
5684
object_, buffer(), blocking, flags, offset, size,
5685
(events != NULL) ? (cl_uint) events->size() : 0,
5686
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5687
(cl_event*) event,
5688
&error);
5689
5690
detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
5691
if (err != NULL) {
5692
*err = error;
5693
}
5694
return result;
5695
}
5696
5697
void* enqueueMapImage(
5698
const Image& buffer,
5699
cl_bool blocking,
5700
cl_map_flags flags,
5701
const size_t<3>& origin,
5702
const size_t<3>& region,
5703
::size_t * row_pitch,
5704
::size_t * slice_pitch,
5705
const VECTOR_CLASS<Event>* events = NULL,
5706
Event* event = NULL,
5707
cl_int* err = NULL) const
5708
{
5709
cl_int error;
5710
void * result = ::clEnqueueMapImage(
5711
object_, buffer(), blocking, flags,
5712
(const ::size_t *) origin, (const ::size_t *) region,
5713
row_pitch, slice_pitch,
5714
(events != NULL) ? (cl_uint) events->size() : 0,
5715
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5716
(cl_event*) event,
5717
&error);
5718
5719
detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);
5720
if (err != NULL) {
5721
*err = error;
5722
}
5723
return result;
5724
}
5725
5726
cl_int enqueueUnmapMemObject(
5727
const Memory& memory,
5728
void* mapped_ptr,
5729
const VECTOR_CLASS<Event>* events = NULL,
5730
Event* event = NULL) const
5731
{
5732
cl_event tmp;
5733
cl_int err = detail::errHandler(
5734
::clEnqueueUnmapMemObject(
5735
object_, memory(), mapped_ptr,
5736
(events != NULL) ? (cl_uint) events->size() : 0,
5737
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5738
(event != NULL) ? &tmp : NULL),
5739
__ENQUEUE_UNMAP_MEM_OBJECT_ERR);
5740
5741
if (event != NULL && err == CL_SUCCESS)
5742
*event = tmp;
5743
5744
return err;
5745
}
5746
5747
#if defined(CL_VERSION_1_2)
5748
/**
5749
* Enqueues a marker command which waits for either a list of events to complete,
5750
* or all previously enqueued commands to complete.
5751
*
5752
* Enqueues a marker command which waits for either a list of events to complete,
5753
* or if the list is empty it waits for all commands previously enqueued in command_queue
5754
* to complete before it completes. This command returns an event which can be waited on,
5755
* i.e. this event can be waited on to insure that all events either in the event_wait_list
5756
* or all previously enqueued commands, queued before this command to command_queue,
5757
* have completed.
5758
*/
5759
cl_int enqueueMarkerWithWaitList(
5760
const VECTOR_CLASS<Event> *events = 0,
5761
Event *event = 0)
5762
{
5763
cl_event tmp;
5764
cl_int err = detail::errHandler(
5765
::clEnqueueMarkerWithWaitList(
5766
object_,
5767
(events != NULL) ? (cl_uint) events->size() : 0,
5768
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5769
(event != NULL) ? &tmp : NULL),
5770
__ENQUEUE_MARKER_WAIT_LIST_ERR);
5771
5772
if (event != NULL && err == CL_SUCCESS)
5773
*event = tmp;
5774
5775
return err;
5776
}
5777
5778
/**
5779
* A synchronization point that enqueues a barrier operation.
5780
*
5781
* Enqueues a barrier command which waits for either a list of events to complete,
5782
* or if the list is empty it waits for all commands previously enqueued in command_queue
5783
* to complete before it completes. This command blocks command execution, that is, any
5784
* following commands enqueued after it do not execute until it completes. This command
5785
* returns an event which can be waited on, i.e. this event can be waited on to insure that
5786
* all events either in the event_wait_list or all previously enqueued commands, queued
5787
* before this command to command_queue, have completed.
5788
*/
5789
cl_int enqueueBarrierWithWaitList(
5790
const VECTOR_CLASS<Event> *events = 0,
5791
Event *event = 0)
5792
{
5793
cl_event tmp;
5794
cl_int err = detail::errHandler(
5795
::clEnqueueBarrierWithWaitList(
5796
object_,
5797
(events != NULL) ? (cl_uint) events->size() : 0,
5798
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5799
(event != NULL) ? &tmp : NULL),
5800
__ENQUEUE_BARRIER_WAIT_LIST_ERR);
5801
5802
if (event != NULL && err == CL_SUCCESS)
5803
*event = tmp;
5804
5805
return err;
5806
}
5807
5808
/**
5809
* Enqueues a command to indicate with which device a set of memory objects
5810
* should be associated.
5811
*/
5812
cl_int enqueueMigrateMemObjects(
5813
const VECTOR_CLASS<Memory> &memObjects,
5814
cl_mem_migration_flags flags,
5815
const VECTOR_CLASS<Event>* events = NULL,
5816
Event* event = NULL
5817
)
5818
{
5819
cl_event tmp;
5820
5821
cl_mem* localMemObjects = static_cast<cl_mem*>(alloca(memObjects.size() * sizeof(cl_mem)));
5822
for( int i = 0; i < (int)memObjects.size(); ++i ) {
5823
localMemObjects[i] = memObjects[i]();
5824
}
5825
5826
5827
cl_int err = detail::errHandler(
5828
::clEnqueueMigrateMemObjects(
5829
object_,
5830
(cl_uint)memObjects.size(),
5831
static_cast<const cl_mem*>(localMemObjects),
5832
flags,
5833
(events != NULL) ? (cl_uint) events->size() : 0,
5834
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5835
(event != NULL) ? &tmp : NULL),
5836
__ENQUEUE_UNMAP_MEM_OBJECT_ERR);
5837
5838
if (event != NULL && err == CL_SUCCESS)
5839
*event = tmp;
5840
5841
return err;
5842
}
5843
#endif // #if defined(CL_VERSION_1_2)
5844
5845
cl_int enqueueNDRangeKernel(
5846
const Kernel& kernel,
5847
const NDRange& offset,
5848
const NDRange& global,
5849
const NDRange& local = NullRange,
5850
const VECTOR_CLASS<Event>* events = NULL,
5851
Event* event = NULL) const
5852
{
5853
cl_event tmp;
5854
cl_int err = detail::errHandler(
5855
::clEnqueueNDRangeKernel(
5856
object_, kernel(), (cl_uint) global.dimensions(),
5857
offset.dimensions() != 0 ? (const ::size_t*) offset : NULL,
5858
(const ::size_t*) global,
5859
local.dimensions() != 0 ? (const ::size_t*) local : NULL,
5860
(events != NULL) ? (cl_uint) events->size() : 0,
5861
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5862
(event != NULL) ? &tmp : NULL),
5863
__ENQUEUE_NDRANGE_KERNEL_ERR);
5864
5865
if (event != NULL && err == CL_SUCCESS)
5866
*event = tmp;
5867
5868
return err;
5869
}
5870
5871
cl_int enqueueTask(
5872
const Kernel& kernel,
5873
const VECTOR_CLASS<Event>* events = NULL,
5874
Event* event = NULL) const
5875
{
5876
cl_event tmp;
5877
cl_int err = detail::errHandler(
5878
::clEnqueueTask(
5879
object_, kernel(),
5880
(events != NULL) ? (cl_uint) events->size() : 0,
5881
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5882
(event != NULL) ? &tmp : NULL),
5883
__ENQUEUE_TASK_ERR);
5884
5885
if (event != NULL && err == CL_SUCCESS)
5886
*event = tmp;
5887
5888
return err;
5889
}
5890
5891
cl_int enqueueNativeKernel(
5892
void (CL_CALLBACK *userFptr)(void *),
5893
std::pair<void*, ::size_t> args,
5894
const VECTOR_CLASS<Memory>* mem_objects = NULL,
5895
const VECTOR_CLASS<const void*>* mem_locs = NULL,
5896
const VECTOR_CLASS<Event>* events = NULL,
5897
Event* event = NULL) const
5898
{
5899
cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0)
5900
? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem))
5901
: NULL;
5902
5903
if (mems != NULL) {
5904
for (unsigned int i = 0; i < mem_objects->size(); i++) {
5905
mems[i] = ((*mem_objects)[i])();
5906
}
5907
}
5908
5909
cl_event tmp;
5910
cl_int err = detail::errHandler(
5911
::clEnqueueNativeKernel(
5912
object_, userFptr, args.first, args.second,
5913
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
5914
mems,
5915
(mem_locs != NULL) ? (const void **) &mem_locs->front() : NULL,
5916
(events != NULL) ? (cl_uint) events->size() : 0,
5917
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5918
(event != NULL) ? &tmp : NULL),
5919
__ENQUEUE_NATIVE_KERNEL);
5920
5921
if (event != NULL && err == CL_SUCCESS)
5922
*event = tmp;
5923
5924
return err;
5925
}
5926
5927
/**
5928
* Deprecated APIs for 1.2
5929
*/
5930
#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
5931
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
5932
cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
5933
{
5934
return detail::errHandler(
5935
::clEnqueueMarker(object_, (cl_event*) event),
5936
__ENQUEUE_MARKER_ERR);
5937
}
5938
5939
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
5940
cl_int enqueueWaitForEvents(const VECTOR_CLASS<Event>& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
5941
{
5942
return detail::errHandler(
5943
::clEnqueueWaitForEvents(
5944
object_,
5945
(cl_uint) events.size(),
5946
(const cl_event*) &events.front()),
5947
__ENQUEUE_WAIT_FOR_EVENTS_ERR);
5948
}
5949
#endif // #if defined(CL_VERSION_1_1)
5950
5951
cl_int enqueueAcquireGLObjects(
5952
const VECTOR_CLASS<Memory>* mem_objects = NULL,
5953
const VECTOR_CLASS<Event>* events = NULL,
5954
Event* event = NULL) const
5955
{
5956
cl_event tmp;
5957
cl_int err = detail::errHandler(
5958
::clEnqueueAcquireGLObjects(
5959
object_,
5960
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
5961
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,
5962
(events != NULL) ? (cl_uint) events->size() : 0,
5963
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5964
(event != NULL) ? &tmp : NULL),
5965
__ENQUEUE_ACQUIRE_GL_ERR);
5966
5967
if (event != NULL && err == CL_SUCCESS)
5968
*event = tmp;
5969
5970
return err;
5971
}
5972
5973
cl_int enqueueReleaseGLObjects(
5974
const VECTOR_CLASS<Memory>* mem_objects = NULL,
5975
const VECTOR_CLASS<Event>* events = NULL,
5976
Event* event = NULL) const
5977
{
5978
cl_event tmp;
5979
cl_int err = detail::errHandler(
5980
::clEnqueueReleaseGLObjects(
5981
object_,
5982
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
5983
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,
5984
(events != NULL) ? (cl_uint) events->size() : 0,
5985
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5986
(event != NULL) ? &tmp : NULL),
5987
__ENQUEUE_RELEASE_GL_ERR);
5988
5989
if (event != NULL && err == CL_SUCCESS)
5990
*event = tmp;
5991
5992
return err;
5993
}
5994
5995
#if defined (USE_DX_INTEROP)
5996
typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)(
5997
cl_command_queue command_queue, cl_uint num_objects,
5998
const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
5999
const cl_event* event_wait_list, cl_event* event);
6000
typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
6001
cl_command_queue command_queue, cl_uint num_objects,
6002
const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
6003
const cl_event* event_wait_list, cl_event* event);
6004
6005
cl_int enqueueAcquireD3D10Objects(
6006
const VECTOR_CLASS<Memory>* mem_objects = NULL,
6007
const VECTOR_CLASS<Event>* events = NULL,
6008
Event* event = NULL) const
6009
{
6010
static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL;
6011
#if defined(CL_VERSION_1_2)
6012
cl_context context = getInfo<CL_QUEUE_CONTEXT>();
6013
cl::Device device(getInfo<CL_QUEUE_DEVICE>());
6014
cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
6015
__INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR);
6016
#endif
6017
#if defined(CL_VERSION_1_1)
6018
__INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR);
6019
#endif
6020
6021
cl_event tmp;
6022
cl_int err = detail::errHandler(
6023
pfn_clEnqueueAcquireD3D10ObjectsKHR(
6024
object_,
6025
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6026
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,
6027
(events != NULL) ? (cl_uint) events->size() : 0,
6028
(events != NULL) ? (cl_event*) &events->front() : NULL,
6029
(event != NULL) ? &tmp : NULL),
6030
__ENQUEUE_ACQUIRE_GL_ERR);
6031
6032
if (event != NULL && err == CL_SUCCESS)
6033
*event = tmp;
6034
6035
return err;
6036
}
6037
6038
cl_int enqueueReleaseD3D10Objects(
6039
const VECTOR_CLASS<Memory>* mem_objects = NULL,
6040
const VECTOR_CLASS<Event>* events = NULL,
6041
Event* event = NULL) const
6042
{
6043
static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL;
6044
#if defined(CL_VERSION_1_2)
6045
cl_context context = getInfo<CL_QUEUE_CONTEXT>();
6046
cl::Device device(getInfo<CL_QUEUE_DEVICE>());
6047
cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
6048
__INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR);
6049
#endif // #if defined(CL_VERSION_1_2)
6050
#if defined(CL_VERSION_1_1)
6051
__INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR);
6052
#endif // #if defined(CL_VERSION_1_1)
6053
6054
cl_event tmp;
6055
cl_int err = detail::errHandler(
6056
pfn_clEnqueueReleaseD3D10ObjectsKHR(
6057
object_,
6058
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6059
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,
6060
(events != NULL) ? (cl_uint) events->size() : 0,
6061
(events != NULL) ? (cl_event*) &events->front() : NULL,
6062
(event != NULL) ? &tmp : NULL),
6063
__ENQUEUE_RELEASE_GL_ERR);
6064
6065
if (event != NULL && err == CL_SUCCESS)
6066
*event = tmp;
6067
6068
return err;
6069
}
6070
#endif
6071
6072
/**
6073
* Deprecated APIs for 1.2
6074
*/
6075
#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
6076
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
6077
cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6078
{
6079
return detail::errHandler(
6080
::clEnqueueBarrier(object_),
6081
__ENQUEUE_BARRIER_ERR);
6082
}
6083
#endif // #if defined(CL_VERSION_1_1)
6084
6085
cl_int flush() const
6086
{
6087
return detail::errHandler(::clFlush(object_), __FLUSH_ERR);
6088
}
6089
6090
cl_int finish() const
6091
{
6092
return detail::errHandler(::clFinish(object_), __FINISH_ERR);
6093
}
6094
};
6095
6096
#ifdef _WIN32
6097
__declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
6098
__declspec(selectany) CommandQueue CommandQueue::default_;
6099
__declspec(selectany) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS;
6100
#else
6101
__attribute__((weak)) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
6102
__attribute__((weak)) CommandQueue CommandQueue::default_;
6103
__attribute__((weak)) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS;
6104
#endif
6105
6106
inline cl_int enqueueReadBuffer(
6107
const Buffer& buffer,
6108
cl_bool blocking,
6109
::size_t offset,
6110
::size_t size,
6111
void* ptr,
6112
const VECTOR_CLASS<Event>* events = NULL,
6113
Event* event = NULL)
6114
{
6115
cl_int error;
6116
CommandQueue queue = CommandQueue::getDefault(&error);
6117
6118
if (error != CL_SUCCESS) {
6119
return error;
6120
}
6121
6122
return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event);
6123
}
6124
6125
inline cl_int enqueueWriteBuffer(
6126
const Buffer& buffer,
6127
cl_bool blocking,
6128
::size_t offset,
6129
::size_t size,
6130
const void* ptr,
6131
const VECTOR_CLASS<Event>* events = NULL,
6132
Event* event = NULL)
6133
{
6134
cl_int error;
6135
CommandQueue queue = CommandQueue::getDefault(&error);
6136
6137
if (error != CL_SUCCESS) {
6138
return error;
6139
}
6140
6141
return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event);
6142
}
6143
6144
inline void* enqueueMapBuffer(
6145
const Buffer& buffer,
6146
cl_bool blocking,
6147
cl_map_flags flags,
6148
::size_t offset,
6149
::size_t size,
6150
const VECTOR_CLASS<Event>* events = NULL,
6151
Event* event = NULL,
6152
cl_int* err = NULL)
6153
{
6154
cl_int error;
6155
CommandQueue queue = CommandQueue::getDefault(&error);
6156
detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6157
if (err != NULL) {
6158
*err = error;
6159
}
6160
6161
void * result = ::clEnqueueMapBuffer(
6162
queue(), buffer(), blocking, flags, offset, size,
6163
(events != NULL) ? (cl_uint) events->size() : 0,
6164
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6165
(cl_event*) event,
6166
&error);
6167
6168
detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6169
if (err != NULL) {
6170
*err = error;
6171
}
6172
return result;
6173
}
6174
6175
inline cl_int enqueueUnmapMemObject(
6176
const Memory& memory,
6177
void* mapped_ptr,
6178
const VECTOR_CLASS<Event>* events = NULL,
6179
Event* event = NULL)
6180
{
6181
cl_int error;
6182
CommandQueue queue = CommandQueue::getDefault(&error);
6183
detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6184
if (error != CL_SUCCESS) {
6185
return error;
6186
}
6187
6188
cl_event tmp;
6189
cl_int err = detail::errHandler(
6190
::clEnqueueUnmapMemObject(
6191
queue(), memory(), mapped_ptr,
6192
(events != NULL) ? (cl_uint) events->size() : 0,
6193
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6194
(event != NULL) ? &tmp : NULL),
6195
__ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6196
6197
if (event != NULL && err == CL_SUCCESS)
6198
*event = tmp;
6199
6200
return err;
6201
}
6202
6203
inline cl_int enqueueCopyBuffer(
6204
const Buffer& src,
6205
const Buffer& dst,
6206
::size_t src_offset,
6207
::size_t dst_offset,
6208
::size_t size,
6209
const VECTOR_CLASS<Event>* events = NULL,
6210
Event* event = NULL)
6211
{
6212
cl_int error;
6213
CommandQueue queue = CommandQueue::getDefault(&error);
6214
6215
if (error != CL_SUCCESS) {
6216
return error;
6217
}
6218
6219
return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event);
6220
}
6221
6222
/**
6223
* Blocking copy operation between iterators and a buffer.
6224
*/
6225
template< typename IteratorType >
6226
inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
6227
{
6228
typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6229
cl_int error;
6230
6231
::size_t length = endIterator-startIterator;
6232
::size_t byteLength = length*sizeof(DataType);
6233
6234
DataType *pointer =
6235
static_cast<DataType*>(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));
6236
// if exceptions enabled, enqueueMapBuffer will throw
6237
if( error != CL_SUCCESS ) {
6238
return error;
6239
}
6240
#if defined(_MSC_VER)
6241
std::copy(
6242
startIterator,
6243
endIterator,
6244
stdext::checked_array_iterator<DataType*>(
6245
pointer, length));
6246
#else
6247
std::copy(startIterator, endIterator, pointer);
6248
#endif
6249
Event endEvent;
6250
error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
6251
// if exceptions enabled, enqueueUnmapMemObject will throw
6252
if( error != CL_SUCCESS ) {
6253
return error;
6254
}
6255
endEvent.wait();
6256
return CL_SUCCESS;
6257
}
6258
6259
/**
6260
* Blocking copy operation between iterators and a buffer.
6261
*/
6262
template< typename IteratorType >
6263
inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
6264
{
6265
typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6266
cl_int error;
6267
6268
::size_t length = endIterator-startIterator;
6269
::size_t byteLength = length*sizeof(DataType);
6270
6271
DataType *pointer =
6272
static_cast<DataType*>(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));
6273
// if exceptions enabled, enqueueMapBuffer will throw
6274
if( error != CL_SUCCESS ) {
6275
return error;
6276
}
6277
std::copy(pointer, pointer + length, startIterator);
6278
Event endEvent;
6279
error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
6280
// if exceptions enabled, enqueueUnmapMemObject will throw
6281
if( error != CL_SUCCESS ) {
6282
return error;
6283
}
6284
endEvent.wait();
6285
return CL_SUCCESS;
6286
}
6287
6288
#if defined(CL_VERSION_1_1)
6289
inline cl_int enqueueReadBufferRect(
6290
const Buffer& buffer,
6291
cl_bool blocking,
6292
const size_t<3>& buffer_offset,
6293
const size_t<3>& host_offset,
6294
const size_t<3>& region,
6295
::size_t buffer_row_pitch,
6296
::size_t buffer_slice_pitch,
6297
::size_t host_row_pitch,
6298
::size_t host_slice_pitch,
6299
void *ptr,
6300
const VECTOR_CLASS<Event>* events = NULL,
6301
Event* event = NULL)
6302
{
6303
cl_int error;
6304
CommandQueue queue = CommandQueue::getDefault(&error);
6305
6306
if (error != CL_SUCCESS) {
6307
return error;
6308
}
6309
6310
return queue.enqueueReadBufferRect(
6311
buffer,
6312
blocking,
6313
buffer_offset,
6314
host_offset,
6315
region,
6316
buffer_row_pitch,
6317
buffer_slice_pitch,
6318
host_row_pitch,
6319
host_slice_pitch,
6320
ptr,
6321
events,
6322
event);
6323
}
6324
6325
inline cl_int enqueueWriteBufferRect(
6326
const Buffer& buffer,
6327
cl_bool blocking,
6328
const size_t<3>& buffer_offset,
6329
const size_t<3>& host_offset,
6330
const size_t<3>& region,
6331
::size_t buffer_row_pitch,
6332
::size_t buffer_slice_pitch,
6333
::size_t host_row_pitch,
6334
::size_t host_slice_pitch,
6335
void *ptr,
6336
const VECTOR_CLASS<Event>* events = NULL,
6337
Event* event = NULL)
6338
{
6339
cl_int error;
6340
CommandQueue queue = CommandQueue::getDefault(&error);
6341
6342
if (error != CL_SUCCESS) {
6343
return error;
6344
}
6345
6346
return queue.enqueueWriteBufferRect(
6347
buffer,
6348
blocking,
6349
buffer_offset,
6350
host_offset,
6351
region,
6352
buffer_row_pitch,
6353
buffer_slice_pitch,
6354
host_row_pitch,
6355
host_slice_pitch,
6356
ptr,
6357
events,
6358
event);
6359
}
6360
6361
inline cl_int enqueueCopyBufferRect(
6362
const Buffer& src,
6363
const Buffer& dst,
6364
const size_t<3>& src_origin,
6365
const size_t<3>& dst_origin,
6366
const size_t<3>& region,
6367
::size_t src_row_pitch,
6368
::size_t src_slice_pitch,
6369
::size_t dst_row_pitch,
6370
::size_t dst_slice_pitch,
6371
const VECTOR_CLASS<Event>* events = NULL,
6372
Event* event = NULL)
6373
{
6374
cl_int error;
6375
CommandQueue queue = CommandQueue::getDefault(&error);
6376
6377
if (error != CL_SUCCESS) {
6378
return error;
6379
}
6380
6381
return queue.enqueueCopyBufferRect(
6382
src,
6383
dst,
6384
src_origin,
6385
dst_origin,
6386
region,
6387
src_row_pitch,
6388
src_slice_pitch,
6389
dst_row_pitch,
6390
dst_slice_pitch,
6391
events,
6392
event);
6393
}
6394
#endif
6395
6396
inline cl_int enqueueReadImage(
6397
const Image& image,
6398
cl_bool blocking,
6399
const size_t<3>& origin,
6400
const size_t<3>& region,
6401
::size_t row_pitch,
6402
::size_t slice_pitch,
6403
void* ptr,
6404
const VECTOR_CLASS<Event>* events = NULL,
6405
Event* event = NULL)
6406
{
6407
cl_int error;
6408
CommandQueue queue = CommandQueue::getDefault(&error);
6409
6410
if (error != CL_SUCCESS) {
6411
return error;
6412
}
6413
6414
return queue.enqueueReadImage(
6415
image,
6416
blocking,
6417
origin,
6418
region,
6419
row_pitch,
6420
slice_pitch,
6421
ptr,
6422
events,
6423
event);
6424
}
6425
6426
inline cl_int enqueueWriteImage(
6427
const Image& image,
6428
cl_bool blocking,
6429
const size_t<3>& origin,
6430
const size_t<3>& region,
6431
::size_t row_pitch,
6432
::size_t slice_pitch,
6433
void* ptr,
6434
const VECTOR_CLASS<Event>* events = NULL,
6435
Event* event = NULL)
6436
{
6437
cl_int error;
6438
CommandQueue queue = CommandQueue::getDefault(&error);
6439
6440
if (error != CL_SUCCESS) {
6441
return error;
6442
}
6443
6444
return queue.enqueueWriteImage(
6445
image,
6446
blocking,
6447
origin,
6448
region,
6449
row_pitch,
6450
slice_pitch,
6451
ptr,
6452
events,
6453
event);
6454
}
6455
6456
inline cl_int enqueueCopyImage(
6457
const Image& src,
6458
const Image& dst,
6459
const size_t<3>& src_origin,
6460
const size_t<3>& dst_origin,
6461
const size_t<3>& region,
6462
const VECTOR_CLASS<Event>* events = NULL,
6463
Event* event = NULL)
6464
{
6465
cl_int error;
6466
CommandQueue queue = CommandQueue::getDefault(&error);
6467
6468
if (error != CL_SUCCESS) {
6469
return error;
6470
}
6471
6472
return queue.enqueueCopyImage(
6473
src,
6474
dst,
6475
src_origin,
6476
dst_origin,
6477
region,
6478
events,
6479
event);
6480
}
6481
6482
inline cl_int enqueueCopyImageToBuffer(
6483
const Image& src,
6484
const Buffer& dst,
6485
const size_t<3>& src_origin,
6486
const size_t<3>& region,
6487
::size_t dst_offset,
6488
const VECTOR_CLASS<Event>* events = NULL,
6489
Event* event = NULL)
6490
{
6491
cl_int error;
6492
CommandQueue queue = CommandQueue::getDefault(&error);
6493
6494
if (error != CL_SUCCESS) {
6495
return error;
6496
}
6497
6498
return queue.enqueueCopyImageToBuffer(
6499
src,
6500
dst,
6501
src_origin,
6502
region,
6503
dst_offset,
6504
events,
6505
event);
6506
}
6507
6508
inline cl_int enqueueCopyBufferToImage(
6509
const Buffer& src,
6510
const Image& dst,
6511
::size_t src_offset,
6512
const size_t<3>& dst_origin,
6513
const size_t<3>& region,
6514
const VECTOR_CLASS<Event>* events = NULL,
6515
Event* event = NULL)
6516
{
6517
cl_int error;
6518
CommandQueue queue = CommandQueue::getDefault(&error);
6519
6520
if (error != CL_SUCCESS) {
6521
return error;
6522
}
6523
6524
return queue.enqueueCopyBufferToImage(
6525
src,
6526
dst,
6527
src_offset,
6528
dst_origin,
6529
region,
6530
events,
6531
event);
6532
}
6533
6534
6535
inline cl_int flush(void)
6536
{
6537
cl_int error;
6538
CommandQueue queue = CommandQueue::getDefault(&error);
6539
6540
if (error != CL_SUCCESS) {
6541
return error;
6542
}
6543
6544
return queue.flush();
6545
}
6546
6547
inline cl_int finish(void)
6548
{
6549
cl_int error;
6550
CommandQueue queue = CommandQueue::getDefault(&error);
6551
6552
if (error != CL_SUCCESS) {
6553
return error;
6554
}
6555
6556
6557
return queue.finish();
6558
}
6559
6560
// Kernel Functor support
6561
// New interface as of September 2011
6562
// Requires the C++11 std::tr1::function (note do not support TR1)
6563
// Visual Studio 2010 and GCC 4.2
6564
6565
struct EnqueueArgs
6566
{
6567
CommandQueue queue_;
6568
const NDRange offset_;
6569
const NDRange global_;
6570
const NDRange local_;
6571
VECTOR_CLASS<Event> events_;
6572
6573
EnqueueArgs(NDRange global) :
6574
queue_(CommandQueue::getDefault()),
6575
offset_(NullRange),
6576
global_(global),
6577
local_(NullRange)
6578
{
6579
6580
}
6581
6582
EnqueueArgs(NDRange global, NDRange local) :
6583
queue_(CommandQueue::getDefault()),
6584
offset_(NullRange),
6585
global_(global),
6586
local_(local)
6587
{
6588
6589
}
6590
6591
EnqueueArgs(NDRange offset, NDRange global, NDRange local) :
6592
queue_(CommandQueue::getDefault()),
6593
offset_(offset),
6594
global_(global),
6595
local_(local)
6596
{
6597
6598
}
6599
6600
EnqueueArgs(Event e, NDRange global) :
6601
queue_(CommandQueue::getDefault()),
6602
offset_(NullRange),
6603
global_(global),
6604
local_(NullRange)
6605
{
6606
events_.push_back(e);
6607
}
6608
6609
EnqueueArgs(Event e, NDRange global, NDRange local) :
6610
queue_(CommandQueue::getDefault()),
6611
offset_(NullRange),
6612
global_(global),
6613
local_(local)
6614
{
6615
events_.push_back(e);
6616
}
6617
6618
EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) :
6619
queue_(CommandQueue::getDefault()),
6620
offset_(offset),
6621
global_(global),
6622
local_(local)
6623
{
6624
events_.push_back(e);
6625
}
6626
6627
EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global) :
6628
queue_(CommandQueue::getDefault()),
6629
offset_(NullRange),
6630
global_(global),
6631
local_(NullRange),
6632
events_(events)
6633
{
6634
6635
}
6636
6637
EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
6638
queue_(CommandQueue::getDefault()),
6639
offset_(NullRange),
6640
global_(global),
6641
local_(local),
6642
events_(events)
6643
{
6644
6645
}
6646
6647
EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
6648
queue_(CommandQueue::getDefault()),
6649
offset_(offset),
6650
global_(global),
6651
local_(local),
6652
events_(events)
6653
{
6654
6655
}
6656
6657
EnqueueArgs(CommandQueue &queue, NDRange global) :
6658
queue_(queue),
6659
offset_(NullRange),
6660
global_(global),
6661
local_(NullRange)
6662
{
6663
6664
}
6665
6666
EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) :
6667
queue_(queue),
6668
offset_(NullRange),
6669
global_(global),
6670
local_(local)
6671
{
6672
6673
}
6674
6675
EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) :
6676
queue_(queue),
6677
offset_(offset),
6678
global_(global),
6679
local_(local)
6680
{
6681
6682
}
6683
6684
EnqueueArgs(CommandQueue &queue, Event e, NDRange global) :
6685
queue_(queue),
6686
offset_(NullRange),
6687
global_(global),
6688
local_(NullRange)
6689
{
6690
events_.push_back(e);
6691
}
6692
6693
EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) :
6694
queue_(queue),
6695
offset_(NullRange),
6696
global_(global),
6697
local_(local)
6698
{
6699
events_.push_back(e);
6700
}
6701
6702
EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) :
6703
queue_(queue),
6704
offset_(offset),
6705
global_(global),
6706
local_(local)
6707
{
6708
events_.push_back(e);
6709
}
6710
6711
EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global) :
6712
queue_(queue),
6713
offset_(NullRange),
6714
global_(global),
6715
local_(NullRange),
6716
events_(events)
6717
{
6718
6719
}
6720
6721
EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
6722
queue_(queue),
6723
offset_(NullRange),
6724
global_(global),
6725
local_(local),
6726
events_(events)
6727
{
6728
6729
}
6730
6731
EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
6732
queue_(queue),
6733
offset_(offset),
6734
global_(global),
6735
local_(local),
6736
events_(events)
6737
{
6738
6739
}
6740
};
6741
6742
namespace detail {
6743
6744
class NullType {};
6745
6746
template<int index, typename T0>
6747
struct SetArg
6748
{
6749
static void set (Kernel kernel, T0 arg)
6750
{
6751
kernel.setArg(index, arg);
6752
}
6753
};
6754
6755
template<int index>
6756
struct SetArg<index, NullType>
6757
{
6758
static void set (Kernel, NullType)
6759
{
6760
}
6761
};
6762
6763
template <
6764
typename T0, typename T1, typename T2, typename T3,
6765
typename T4, typename T5, typename T6, typename T7,
6766
typename T8, typename T9, typename T10, typename T11,
6767
typename T12, typename T13, typename T14, typename T15,
6768
typename T16, typename T17, typename T18, typename T19,
6769
typename T20, typename T21, typename T22, typename T23,
6770
typename T24, typename T25, typename T26, typename T27,
6771
typename T28, typename T29, typename T30, typename T31
6772
>
6773
class KernelFunctorGlobal
6774
{
6775
private:
6776
Kernel kernel_;
6777
6778
public:
6779
KernelFunctorGlobal(
6780
Kernel kernel) :
6781
kernel_(kernel)
6782
{}
6783
6784
KernelFunctorGlobal(
6785
const Program& program,
6786
const STRING_CLASS name,
6787
cl_int * err = NULL) :
6788
kernel_(program, name.c_str(), err)
6789
{}
6790
6791
Event operator() (
6792
const EnqueueArgs& args,
6793
T0 t0,
6794
T1 t1 = NullType(),
6795
T2 t2 = NullType(),
6796
T3 t3 = NullType(),
6797
T4 t4 = NullType(),
6798
T5 t5 = NullType(),
6799
T6 t6 = NullType(),
6800
T7 t7 = NullType(),
6801
T8 t8 = NullType(),
6802
T9 t9 = NullType(),
6803
T10 t10 = NullType(),
6804
T11 t11 = NullType(),
6805
T12 t12 = NullType(),
6806
T13 t13 = NullType(),
6807
T14 t14 = NullType(),
6808
T15 t15 = NullType(),
6809
T16 t16 = NullType(),
6810
T17 t17 = NullType(),
6811
T18 t18 = NullType(),
6812
T19 t19 = NullType(),
6813
T20 t20 = NullType(),
6814
T21 t21 = NullType(),
6815
T22 t22 = NullType(),
6816
T23 t23 = NullType(),
6817
T24 t24 = NullType(),
6818
T25 t25 = NullType(),
6819
T26 t26 = NullType(),
6820
T27 t27 = NullType(),
6821
T28 t28 = NullType(),
6822
T29 t29 = NullType(),
6823
T30 t30 = NullType(),
6824
T31 t31 = NullType()
6825
)
6826
{
6827
Event event;
6828
SetArg<0, T0>::set(kernel_, t0);
6829
SetArg<1, T1>::set(kernel_, t1);
6830
SetArg<2, T2>::set(kernel_, t2);
6831
SetArg<3, T3>::set(kernel_, t3);
6832
SetArg<4, T4>::set(kernel_, t4);
6833
SetArg<5, T5>::set(kernel_, t5);
6834
SetArg<6, T6>::set(kernel_, t6);
6835
SetArg<7, T7>::set(kernel_, t7);
6836
SetArg<8, T8>::set(kernel_, t8);
6837
SetArg<9, T9>::set(kernel_, t9);
6838
SetArg<10, T10>::set(kernel_, t10);
6839
SetArg<11, T11>::set(kernel_, t11);
6840
SetArg<12, T12>::set(kernel_, t12);
6841
SetArg<13, T13>::set(kernel_, t13);
6842
SetArg<14, T14>::set(kernel_, t14);
6843
SetArg<15, T15>::set(kernel_, t15);
6844
SetArg<16, T16>::set(kernel_, t16);
6845
SetArg<17, T17>::set(kernel_, t17);
6846
SetArg<18, T18>::set(kernel_, t18);
6847
SetArg<19, T19>::set(kernel_, t19);
6848
SetArg<20, T20>::set(kernel_, t20);
6849
SetArg<21, T21>::set(kernel_, t21);
6850
SetArg<22, T22>::set(kernel_, t22);
6851
SetArg<23, T23>::set(kernel_, t23);
6852
SetArg<24, T24>::set(kernel_, t24);
6853
SetArg<25, T25>::set(kernel_, t25);
6854
SetArg<26, T26>::set(kernel_, t26);
6855
SetArg<27, T27>::set(kernel_, t27);
6856
SetArg<28, T28>::set(kernel_, t28);
6857
SetArg<29, T29>::set(kernel_, t29);
6858
SetArg<30, T30>::set(kernel_, t30);
6859
SetArg<31, T31>::set(kernel_, t31);
6860
6861
args.queue_.enqueueNDRangeKernel(
6862
kernel_,
6863
args.offset_,
6864
args.global_,
6865
args.local_,
6866
&args.events_,
6867
&event);
6868
6869
return event;
6870
}
6871
6872
};
6873
6874
//------------------------------------------------------------------------------------------------------
6875
6876
6877
template<
6878
typename T0,
6879
typename T1,
6880
typename T2,
6881
typename T3,
6882
typename T4,
6883
typename T5,
6884
typename T6,
6885
typename T7,
6886
typename T8,
6887
typename T9,
6888
typename T10,
6889
typename T11,
6890
typename T12,
6891
typename T13,
6892
typename T14,
6893
typename T15,
6894
typename T16,
6895
typename T17,
6896
typename T18,
6897
typename T19,
6898
typename T20,
6899
typename T21,
6900
typename T22,
6901
typename T23,
6902
typename T24,
6903
typename T25,
6904
typename T26,
6905
typename T27,
6906
typename T28,
6907
typename T29,
6908
typename T30,
6909
typename T31>
6910
struct functionImplementation_
6911
{
6912
typedef detail::KernelFunctorGlobal<
6913
T0,
6914
T1,
6915
T2,
6916
T3,
6917
T4,
6918
T5,
6919
T6,
6920
T7,
6921
T8,
6922
T9,
6923
T10,
6924
T11,
6925
T12,
6926
T13,
6927
T14,
6928
T15,
6929
T16,
6930
T17,
6931
T18,
6932
T19,
6933
T20,
6934
T21,
6935
T22,
6936
T23,
6937
T24,
6938
T25,
6939
T26,
6940
T27,
6941
T28,
6942
T29,
6943
T30,
6944
T31> FunctorType;
6945
6946
FunctorType functor_;
6947
6948
functionImplementation_(const FunctorType &functor) :
6949
functor_(functor)
6950
{
6951
6952
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32))
6953
// Fail variadic expansion for dev11
6954
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
6955
#endif
6956
6957
}
6958
6959
//! \brief Return type of the functor
6960
typedef Event result_type;
6961
6962
//! \brief Function signature of kernel functor with no event dependency.
6963
typedef Event type_(
6964
const EnqueueArgs&,
6965
T0,
6966
T1,
6967
T2,
6968
T3,
6969
T4,
6970
T5,
6971
T6,
6972
T7,
6973
T8,
6974
T9,
6975
T10,
6976
T11,
6977
T12,
6978
T13,
6979
T14,
6980
T15,
6981
T16,
6982
T17,
6983
T18,
6984
T19,
6985
T20,
6986
T21,
6987
T22,
6988
T23,
6989
T24,
6990
T25,
6991
T26,
6992
T27,
6993
T28,
6994
T29,
6995
T30,
6996
T31);
6997
6998
Event operator()(
6999
const EnqueueArgs& enqueueArgs,
7000
T0 arg0,
7001
T1 arg1,
7002
T2 arg2,
7003
T3 arg3,
7004
T4 arg4,
7005
T5 arg5,
7006
T6 arg6,
7007
T7 arg7,
7008
T8 arg8,
7009
T9 arg9,
7010
T10 arg10,
7011
T11 arg11,
7012
T12 arg12,
7013
T13 arg13,
7014
T14 arg14,
7015
T15 arg15,
7016
T16 arg16,
7017
T17 arg17,
7018
T18 arg18,
7019
T19 arg19,
7020
T20 arg20,
7021
T21 arg21,
7022
T22 arg22,
7023
T23 arg23,
7024
T24 arg24,
7025
T25 arg25,
7026
T26 arg26,
7027
T27 arg27,
7028
T28 arg28,
7029
T29 arg29,
7030
T30 arg30,
7031
T31 arg31)
7032
{
7033
return functor_(
7034
enqueueArgs,
7035
arg0,
7036
arg1,
7037
arg2,
7038
arg3,
7039
arg4,
7040
arg5,
7041
arg6,
7042
arg7,
7043
arg8,
7044
arg9,
7045
arg10,
7046
arg11,
7047
arg12,
7048
arg13,
7049
arg14,
7050
arg15,
7051
arg16,
7052
arg17,
7053
arg18,
7054
arg19,
7055
arg20,
7056
arg21,
7057
arg22,
7058
arg23,
7059
arg24,
7060
arg25,
7061
arg26,
7062
arg27,
7063
arg28,
7064
arg29,
7065
arg30,
7066
arg31);
7067
}
7068
7069
7070
};
7071
7072
template<
7073
typename T0,
7074
typename T1,
7075
typename T2,
7076
typename T3,
7077
typename T4,
7078
typename T5,
7079
typename T6,
7080
typename T7,
7081
typename T8,
7082
typename T9,
7083
typename T10,
7084
typename T11,
7085
typename T12,
7086
typename T13,
7087
typename T14,
7088
typename T15,
7089
typename T16,
7090
typename T17,
7091
typename T18,
7092
typename T19,
7093
typename T20,
7094
typename T21,
7095
typename T22,
7096
typename T23,
7097
typename T24,
7098
typename T25,
7099
typename T26,
7100
typename T27,
7101
typename T28,
7102
typename T29,
7103
typename T30>
7104
struct functionImplementation_
7105
< T0,
7106
T1,
7107
T2,
7108
T3,
7109
T4,
7110
T5,
7111
T6,
7112
T7,
7113
T8,
7114
T9,
7115
T10,
7116
T11,
7117
T12,
7118
T13,
7119
T14,
7120
T15,
7121
T16,
7122
T17,
7123
T18,
7124
T19,
7125
T20,
7126
T21,
7127
T22,
7128
T23,
7129
T24,
7130
T25,
7131
T26,
7132
T27,
7133
T28,
7134
T29,
7135
T30,
7136
NullType>
7137
{
7138
typedef detail::KernelFunctorGlobal<
7139
T0,
7140
T1,
7141
T2,
7142
T3,
7143
T4,
7144
T5,
7145
T6,
7146
T7,
7147
T8,
7148
T9,
7149
T10,
7150
T11,
7151
T12,
7152
T13,
7153
T14,
7154
T15,
7155
T16,
7156
T17,
7157
T18,
7158
T19,
7159
T20,
7160
T21,
7161
T22,
7162
T23,
7163
T24,
7164
T25,
7165
T26,
7166
T27,
7167
T28,
7168
T29,
7169
T30,
7170
NullType> FunctorType;
7171
7172
FunctorType functor_;
7173
7174
functionImplementation_(const FunctorType &functor) :
7175
functor_(functor)
7176
{
7177
7178
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31))
7179
// Fail variadic expansion for dev11
7180
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7181
#endif
7182
7183
}
7184
7185
//! \brief Return type of the functor
7186
typedef Event result_type;
7187
7188
//! \brief Function signature of kernel functor with no event dependency.
7189
typedef Event type_(
7190
const EnqueueArgs&,
7191
T0,
7192
T1,
7193
T2,
7194
T3,
7195
T4,
7196
T5,
7197
T6,
7198
T7,
7199
T8,
7200
T9,
7201
T10,
7202
T11,
7203
T12,
7204
T13,
7205
T14,
7206
T15,
7207
T16,
7208
T17,
7209
T18,
7210
T19,
7211
T20,
7212
T21,
7213
T22,
7214
T23,
7215
T24,
7216
T25,
7217
T26,
7218
T27,
7219
T28,
7220
T29,
7221
T30);
7222
7223
Event operator()(
7224
const EnqueueArgs& enqueueArgs,
7225
T0 arg0,
7226
T1 arg1,
7227
T2 arg2,
7228
T3 arg3,
7229
T4 arg4,
7230
T5 arg5,
7231
T6 arg6,
7232
T7 arg7,
7233
T8 arg8,
7234
T9 arg9,
7235
T10 arg10,
7236
T11 arg11,
7237
T12 arg12,
7238
T13 arg13,
7239
T14 arg14,
7240
T15 arg15,
7241
T16 arg16,
7242
T17 arg17,
7243
T18 arg18,
7244
T19 arg19,
7245
T20 arg20,
7246
T21 arg21,
7247
T22 arg22,
7248
T23 arg23,
7249
T24 arg24,
7250
T25 arg25,
7251
T26 arg26,
7252
T27 arg27,
7253
T28 arg28,
7254
T29 arg29,
7255
T30 arg30)
7256
{
7257
return functor_(
7258
enqueueArgs,
7259
arg0,
7260
arg1,
7261
arg2,
7262
arg3,
7263
arg4,
7264
arg5,
7265
arg6,
7266
arg7,
7267
arg8,
7268
arg9,
7269
arg10,
7270
arg11,
7271
arg12,
7272
arg13,
7273
arg14,
7274
arg15,
7275
arg16,
7276
arg17,
7277
arg18,
7278
arg19,
7279
arg20,
7280
arg21,
7281
arg22,
7282
arg23,
7283
arg24,
7284
arg25,
7285
arg26,
7286
arg27,
7287
arg28,
7288
arg29,
7289
arg30);
7290
}
7291
7292
7293
};
7294
7295
template<
7296
typename T0,
7297
typename T1,
7298
typename T2,
7299
typename T3,
7300
typename T4,
7301
typename T5,
7302
typename T6,
7303
typename T7,
7304
typename T8,
7305
typename T9,
7306
typename T10,
7307
typename T11,
7308
typename T12,
7309
typename T13,
7310
typename T14,
7311
typename T15,
7312
typename T16,
7313
typename T17,
7314
typename T18,
7315
typename T19,
7316
typename T20,
7317
typename T21,
7318
typename T22,
7319
typename T23,
7320
typename T24,
7321
typename T25,
7322
typename T26,
7323
typename T27,
7324
typename T28,
7325
typename T29>
7326
struct functionImplementation_
7327
< T0,
7328
T1,
7329
T2,
7330
T3,
7331
T4,
7332
T5,
7333
T6,
7334
T7,
7335
T8,
7336
T9,
7337
T10,
7338
T11,
7339
T12,
7340
T13,
7341
T14,
7342
T15,
7343
T16,
7344
T17,
7345
T18,
7346
T19,
7347
T20,
7348
T21,
7349
T22,
7350
T23,
7351
T24,
7352
T25,
7353
T26,
7354
T27,
7355
T28,
7356
T29,
7357
NullType,
7358
NullType>
7359
{
7360
typedef detail::KernelFunctorGlobal<
7361
T0,
7362
T1,
7363
T2,
7364
T3,
7365
T4,
7366
T5,
7367
T6,
7368
T7,
7369
T8,
7370
T9,
7371
T10,
7372
T11,
7373
T12,
7374
T13,
7375
T14,
7376
T15,
7377
T16,
7378
T17,
7379
T18,
7380
T19,
7381
T20,
7382
T21,
7383
T22,
7384
T23,
7385
T24,
7386
T25,
7387
T26,
7388
T27,
7389
T28,
7390
T29,
7391
NullType,
7392
NullType> FunctorType;
7393
7394
FunctorType functor_;
7395
7396
functionImplementation_(const FunctorType &functor) :
7397
functor_(functor)
7398
{
7399
7400
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30))
7401
// Fail variadic expansion for dev11
7402
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7403
#endif
7404
7405
}
7406
7407
//! \brief Return type of the functor
7408
typedef Event result_type;
7409
7410
//! \brief Function signature of kernel functor with no event dependency.
7411
typedef Event type_(
7412
const EnqueueArgs&,
7413
T0,
7414
T1,
7415
T2,
7416
T3,
7417
T4,
7418
T5,
7419
T6,
7420
T7,
7421
T8,
7422
T9,
7423
T10,
7424
T11,
7425
T12,
7426
T13,
7427
T14,
7428
T15,
7429
T16,
7430
T17,
7431
T18,
7432
T19,
7433
T20,
7434
T21,
7435
T22,
7436
T23,
7437
T24,
7438
T25,
7439
T26,
7440
T27,
7441
T28,
7442
T29);
7443
7444
Event operator()(
7445
const EnqueueArgs& enqueueArgs,
7446
T0 arg0,
7447
T1 arg1,
7448
T2 arg2,
7449
T3 arg3,
7450
T4 arg4,
7451
T5 arg5,
7452
T6 arg6,
7453
T7 arg7,
7454
T8 arg8,
7455
T9 arg9,
7456
T10 arg10,
7457
T11 arg11,
7458
T12 arg12,
7459
T13 arg13,
7460
T14 arg14,
7461
T15 arg15,
7462
T16 arg16,
7463
T17 arg17,
7464
T18 arg18,
7465
T19 arg19,
7466
T20 arg20,
7467
T21 arg21,
7468
T22 arg22,
7469
T23 arg23,
7470
T24 arg24,
7471
T25 arg25,
7472
T26 arg26,
7473
T27 arg27,
7474
T28 arg28,
7475
T29 arg29)
7476
{
7477
return functor_(
7478
enqueueArgs,
7479
arg0,
7480
arg1,
7481
arg2,
7482
arg3,
7483
arg4,
7484
arg5,
7485
arg6,
7486
arg7,
7487
arg8,
7488
arg9,
7489
arg10,
7490
arg11,
7491
arg12,
7492
arg13,
7493
arg14,
7494
arg15,
7495
arg16,
7496
arg17,
7497
arg18,
7498
arg19,
7499
arg20,
7500
arg21,
7501
arg22,
7502
arg23,
7503
arg24,
7504
arg25,
7505
arg26,
7506
arg27,
7507
arg28,
7508
arg29);
7509
}
7510
7511
7512
};
7513
7514
template<
7515
typename T0,
7516
typename T1,
7517
typename T2,
7518
typename T3,
7519
typename T4,
7520
typename T5,
7521
typename T6,
7522
typename T7,
7523
typename T8,
7524
typename T9,
7525
typename T10,
7526
typename T11,
7527
typename T12,
7528
typename T13,
7529
typename T14,
7530
typename T15,
7531
typename T16,
7532
typename T17,
7533
typename T18,
7534
typename T19,
7535
typename T20,
7536
typename T21,
7537
typename T22,
7538
typename T23,
7539
typename T24,
7540
typename T25,
7541
typename T26,
7542
typename T27,
7543
typename T28>
7544
struct functionImplementation_
7545
< T0,
7546
T1,
7547
T2,
7548
T3,
7549
T4,
7550
T5,
7551
T6,
7552
T7,
7553
T8,
7554
T9,
7555
T10,
7556
T11,
7557
T12,
7558
T13,
7559
T14,
7560
T15,
7561
T16,
7562
T17,
7563
T18,
7564
T19,
7565
T20,
7566
T21,
7567
T22,
7568
T23,
7569
T24,
7570
T25,
7571
T26,
7572
T27,
7573
T28,
7574
NullType,
7575
NullType,
7576
NullType>
7577
{
7578
typedef detail::KernelFunctorGlobal<
7579
T0,
7580
T1,
7581
T2,
7582
T3,
7583
T4,
7584
T5,
7585
T6,
7586
T7,
7587
T8,
7588
T9,
7589
T10,
7590
T11,
7591
T12,
7592
T13,
7593
T14,
7594
T15,
7595
T16,
7596
T17,
7597
T18,
7598
T19,
7599
T20,
7600
T21,
7601
T22,
7602
T23,
7603
T24,
7604
T25,
7605
T26,
7606
T27,
7607
T28,
7608
NullType,
7609
NullType,
7610
NullType> FunctorType;
7611
7612
FunctorType functor_;
7613
7614
functionImplementation_(const FunctorType &functor) :
7615
functor_(functor)
7616
{
7617
7618
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29))
7619
// Fail variadic expansion for dev11
7620
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7621
#endif
7622
7623
}
7624
7625
//! \brief Return type of the functor
7626
typedef Event result_type;
7627
7628
//! \brief Function signature of kernel functor with no event dependency.
7629
typedef Event type_(
7630
const EnqueueArgs&,
7631
T0,
7632
T1,
7633
T2,
7634
T3,
7635
T4,
7636
T5,
7637
T6,
7638
T7,
7639
T8,
7640
T9,
7641
T10,
7642
T11,
7643
T12,
7644
T13,
7645
T14,
7646
T15,
7647
T16,
7648
T17,
7649
T18,
7650
T19,
7651
T20,
7652
T21,
7653
T22,
7654
T23,
7655
T24,
7656
T25,
7657
T26,
7658
T27,
7659
T28);
7660
7661
Event operator()(
7662
const EnqueueArgs& enqueueArgs,
7663
T0 arg0,
7664
T1 arg1,
7665
T2 arg2,
7666
T3 arg3,
7667
T4 arg4,
7668
T5 arg5,
7669
T6 arg6,
7670
T7 arg7,
7671
T8 arg8,
7672
T9 arg9,
7673
T10 arg10,
7674
T11 arg11,
7675
T12 arg12,
7676
T13 arg13,
7677
T14 arg14,
7678
T15 arg15,
7679
T16 arg16,
7680
T17 arg17,
7681
T18 arg18,
7682
T19 arg19,
7683
T20 arg20,
7684
T21 arg21,
7685
T22 arg22,
7686
T23 arg23,
7687
T24 arg24,
7688
T25 arg25,
7689
T26 arg26,
7690
T27 arg27,
7691
T28 arg28)
7692
{
7693
return functor_(
7694
enqueueArgs,
7695
arg0,
7696
arg1,
7697
arg2,
7698
arg3,
7699
arg4,
7700
arg5,
7701
arg6,
7702
arg7,
7703
arg8,
7704
arg9,
7705
arg10,
7706
arg11,
7707
arg12,
7708
arg13,
7709
arg14,
7710
arg15,
7711
arg16,
7712
arg17,
7713
arg18,
7714
arg19,
7715
arg20,
7716
arg21,
7717
arg22,
7718
arg23,
7719
arg24,
7720
arg25,
7721
arg26,
7722
arg27,
7723
arg28);
7724
}
7725
7726
7727
};
7728
7729
template<
7730
typename T0,
7731
typename T1,
7732
typename T2,
7733
typename T3,
7734
typename T4,
7735
typename T5,
7736
typename T6,
7737
typename T7,
7738
typename T8,
7739
typename T9,
7740
typename T10,
7741
typename T11,
7742
typename T12,
7743
typename T13,
7744
typename T14,
7745
typename T15,
7746
typename T16,
7747
typename T17,
7748
typename T18,
7749
typename T19,
7750
typename T20,
7751
typename T21,
7752
typename T22,
7753
typename T23,
7754
typename T24,
7755
typename T25,
7756
typename T26,
7757
typename T27>
7758
struct functionImplementation_
7759
< T0,
7760
T1,
7761
T2,
7762
T3,
7763
T4,
7764
T5,
7765
T6,
7766
T7,
7767
T8,
7768
T9,
7769
T10,
7770
T11,
7771
T12,
7772
T13,
7773
T14,
7774
T15,
7775
T16,
7776
T17,
7777
T18,
7778
T19,
7779
T20,
7780
T21,
7781
T22,
7782
T23,
7783
T24,
7784
T25,
7785
T26,
7786
T27,
7787
NullType,
7788
NullType,
7789
NullType,
7790
NullType>
7791
{
7792
typedef detail::KernelFunctorGlobal<
7793
T0,
7794
T1,
7795
T2,
7796
T3,
7797
T4,
7798
T5,
7799
T6,
7800
T7,
7801
T8,
7802
T9,
7803
T10,
7804
T11,
7805
T12,
7806
T13,
7807
T14,
7808
T15,
7809
T16,
7810
T17,
7811
T18,
7812
T19,
7813
T20,
7814
T21,
7815
T22,
7816
T23,
7817
T24,
7818
T25,
7819
T26,
7820
T27,
7821
NullType,
7822
NullType,
7823
NullType,
7824
NullType> FunctorType;
7825
7826
FunctorType functor_;
7827
7828
functionImplementation_(const FunctorType &functor) :
7829
functor_(functor)
7830
{
7831
7832
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28))
7833
// Fail variadic expansion for dev11
7834
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7835
#endif
7836
7837
}
7838
7839
//! \brief Return type of the functor
7840
typedef Event result_type;
7841
7842
//! \brief Function signature of kernel functor with no event dependency.
7843
typedef Event type_(
7844
const EnqueueArgs&,
7845
T0,
7846
T1,
7847
T2,
7848
T3,
7849
T4,
7850
T5,
7851
T6,
7852
T7,
7853
T8,
7854
T9,
7855
T10,
7856
T11,
7857
T12,
7858
T13,
7859
T14,
7860
T15,
7861
T16,
7862
T17,
7863
T18,
7864
T19,
7865
T20,
7866
T21,
7867
T22,
7868
T23,
7869
T24,
7870
T25,
7871
T26,
7872
T27);
7873
7874
Event operator()(
7875
const EnqueueArgs& enqueueArgs,
7876
T0 arg0,
7877
T1 arg1,
7878
T2 arg2,
7879
T3 arg3,
7880
T4 arg4,
7881
T5 arg5,
7882
T6 arg6,
7883
T7 arg7,
7884
T8 arg8,
7885
T9 arg9,
7886
T10 arg10,
7887
T11 arg11,
7888
T12 arg12,
7889
T13 arg13,
7890
T14 arg14,
7891
T15 arg15,
7892
T16 arg16,
7893
T17 arg17,
7894
T18 arg18,
7895
T19 arg19,
7896
T20 arg20,
7897
T21 arg21,
7898
T22 arg22,
7899
T23 arg23,
7900
T24 arg24,
7901
T25 arg25,
7902
T26 arg26,
7903
T27 arg27)
7904
{
7905
return functor_(
7906
enqueueArgs,
7907
arg0,
7908
arg1,
7909
arg2,
7910
arg3,
7911
arg4,
7912
arg5,
7913
arg6,
7914
arg7,
7915
arg8,
7916
arg9,
7917
arg10,
7918
arg11,
7919
arg12,
7920
arg13,
7921
arg14,
7922
arg15,
7923
arg16,
7924
arg17,
7925
arg18,
7926
arg19,
7927
arg20,
7928
arg21,
7929
arg22,
7930
arg23,
7931
arg24,
7932
arg25,
7933
arg26,
7934
arg27);
7935
}
7936
7937
7938
};
7939
7940
template<
7941
typename T0,
7942
typename T1,
7943
typename T2,
7944
typename T3,
7945
typename T4,
7946
typename T5,
7947
typename T6,
7948
typename T7,
7949
typename T8,
7950
typename T9,
7951
typename T10,
7952
typename T11,
7953
typename T12,
7954
typename T13,
7955
typename T14,
7956
typename T15,
7957
typename T16,
7958
typename T17,
7959
typename T18,
7960
typename T19,
7961
typename T20,
7962
typename T21,
7963
typename T22,
7964
typename T23,
7965
typename T24,
7966
typename T25,
7967
typename T26>
7968
struct functionImplementation_
7969
< T0,
7970
T1,
7971
T2,
7972
T3,
7973
T4,
7974
T5,
7975
T6,
7976
T7,
7977
T8,
7978
T9,
7979
T10,
7980
T11,
7981
T12,
7982
T13,
7983
T14,
7984
T15,
7985
T16,
7986
T17,
7987
T18,
7988
T19,
7989
T20,
7990
T21,
7991
T22,
7992
T23,
7993
T24,
7994
T25,
7995
T26,
7996
NullType,
7997
NullType,
7998
NullType,
7999
NullType,
8000
NullType>
8001
{
8002
typedef detail::KernelFunctorGlobal<
8003
T0,
8004
T1,
8005
T2,
8006
T3,
8007
T4,
8008
T5,
8009
T6,
8010
T7,
8011
T8,
8012
T9,
8013
T10,
8014
T11,
8015
T12,
8016
T13,
8017
T14,
8018
T15,
8019
T16,
8020
T17,
8021
T18,
8022
T19,
8023
T20,
8024
T21,
8025
T22,
8026
T23,
8027
T24,
8028
T25,
8029
T26,
8030
NullType,
8031
NullType,
8032
NullType,
8033
NullType,
8034
NullType> FunctorType;
8035
8036
FunctorType functor_;
8037
8038
functionImplementation_(const FunctorType &functor) :
8039
functor_(functor)
8040
{
8041
8042
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27))
8043
// Fail variadic expansion for dev11
8044
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8045
#endif
8046
8047
}
8048
8049
//! \brief Return type of the functor
8050
typedef Event result_type;
8051
8052
//! \brief Function signature of kernel functor with no event dependency.
8053
typedef Event type_(
8054
const EnqueueArgs&,
8055
T0,
8056
T1,
8057
T2,
8058
T3,
8059
T4,
8060
T5,
8061
T6,
8062
T7,
8063
T8,
8064
T9,
8065
T10,
8066
T11,
8067
T12,
8068
T13,
8069
T14,
8070
T15,
8071
T16,
8072
T17,
8073
T18,
8074
T19,
8075
T20,
8076
T21,
8077
T22,
8078
T23,
8079
T24,
8080
T25,
8081
T26);
8082
8083
Event operator()(
8084
const EnqueueArgs& enqueueArgs,
8085
T0 arg0,
8086
T1 arg1,
8087
T2 arg2,
8088
T3 arg3,
8089
T4 arg4,
8090
T5 arg5,
8091
T6 arg6,
8092
T7 arg7,
8093
T8 arg8,
8094
T9 arg9,
8095
T10 arg10,
8096
T11 arg11,
8097
T12 arg12,
8098
T13 arg13,
8099
T14 arg14,
8100
T15 arg15,
8101
T16 arg16,
8102
T17 arg17,
8103
T18 arg18,
8104
T19 arg19,
8105
T20 arg20,
8106
T21 arg21,
8107
T22 arg22,
8108
T23 arg23,
8109
T24 arg24,
8110
T25 arg25,
8111
T26 arg26)
8112
{
8113
return functor_(
8114
enqueueArgs,
8115
arg0,
8116
arg1,
8117
arg2,
8118
arg3,
8119
arg4,
8120
arg5,
8121
arg6,
8122
arg7,
8123
arg8,
8124
arg9,
8125
arg10,
8126
arg11,
8127
arg12,
8128
arg13,
8129
arg14,
8130
arg15,
8131
arg16,
8132
arg17,
8133
arg18,
8134
arg19,
8135
arg20,
8136
arg21,
8137
arg22,
8138
arg23,
8139
arg24,
8140
arg25,
8141
arg26);
8142
}
8143
8144
8145
};
8146
8147
template<
8148
typename T0,
8149
typename T1,
8150
typename T2,
8151
typename T3,
8152
typename T4,
8153
typename T5,
8154
typename T6,
8155
typename T7,
8156
typename T8,
8157
typename T9,
8158
typename T10,
8159
typename T11,
8160
typename T12,
8161
typename T13,
8162
typename T14,
8163
typename T15,
8164
typename T16,
8165
typename T17,
8166
typename T18,
8167
typename T19,
8168
typename T20,
8169
typename T21,
8170
typename T22,
8171
typename T23,
8172
typename T24,
8173
typename T25>
8174
struct functionImplementation_
8175
< T0,
8176
T1,
8177
T2,
8178
T3,
8179
T4,
8180
T5,
8181
T6,
8182
T7,
8183
T8,
8184
T9,
8185
T10,
8186
T11,
8187
T12,
8188
T13,
8189
T14,
8190
T15,
8191
T16,
8192
T17,
8193
T18,
8194
T19,
8195
T20,
8196
T21,
8197
T22,
8198
T23,
8199
T24,
8200
T25,
8201
NullType,
8202
NullType,
8203
NullType,
8204
NullType,
8205
NullType,
8206
NullType>
8207
{
8208
typedef detail::KernelFunctorGlobal<
8209
T0,
8210
T1,
8211
T2,
8212
T3,
8213
T4,
8214
T5,
8215
T6,
8216
T7,
8217
T8,
8218
T9,
8219
T10,
8220
T11,
8221
T12,
8222
T13,
8223
T14,
8224
T15,
8225
T16,
8226
T17,
8227
T18,
8228
T19,
8229
T20,
8230
T21,
8231
T22,
8232
T23,
8233
T24,
8234
T25,
8235
NullType,
8236
NullType,
8237
NullType,
8238
NullType,
8239
NullType,
8240
NullType> FunctorType;
8241
8242
FunctorType functor_;
8243
8244
functionImplementation_(const FunctorType &functor) :
8245
functor_(functor)
8246
{
8247
8248
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26))
8249
// Fail variadic expansion for dev11
8250
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8251
#endif
8252
8253
}
8254
8255
//! \brief Return type of the functor
8256
typedef Event result_type;
8257
8258
//! \brief Function signature of kernel functor with no event dependency.
8259
typedef Event type_(
8260
const EnqueueArgs&,
8261
T0,
8262
T1,
8263
T2,
8264
T3,
8265
T4,
8266
T5,
8267
T6,
8268
T7,
8269
T8,
8270
T9,
8271
T10,
8272
T11,
8273
T12,
8274
T13,
8275
T14,
8276
T15,
8277
T16,
8278
T17,
8279
T18,
8280
T19,
8281
T20,
8282
T21,
8283
T22,
8284
T23,
8285
T24,
8286
T25);
8287
8288
Event operator()(
8289
const EnqueueArgs& enqueueArgs,
8290
T0 arg0,
8291
T1 arg1,
8292
T2 arg2,
8293
T3 arg3,
8294
T4 arg4,
8295
T5 arg5,
8296
T6 arg6,
8297
T7 arg7,
8298
T8 arg8,
8299
T9 arg9,
8300
T10 arg10,
8301
T11 arg11,
8302
T12 arg12,
8303
T13 arg13,
8304
T14 arg14,
8305
T15 arg15,
8306
T16 arg16,
8307
T17 arg17,
8308
T18 arg18,
8309
T19 arg19,
8310
T20 arg20,
8311
T21 arg21,
8312
T22 arg22,
8313
T23 arg23,
8314
T24 arg24,
8315
T25 arg25)
8316
{
8317
return functor_(
8318
enqueueArgs,
8319
arg0,
8320
arg1,
8321
arg2,
8322
arg3,
8323
arg4,
8324
arg5,
8325
arg6,
8326
arg7,
8327
arg8,
8328
arg9,
8329
arg10,
8330
arg11,
8331
arg12,
8332
arg13,
8333
arg14,
8334
arg15,
8335
arg16,
8336
arg17,
8337
arg18,
8338
arg19,
8339
arg20,
8340
arg21,
8341
arg22,
8342
arg23,
8343
arg24,
8344
arg25);
8345
}
8346
8347
8348
};
8349
8350
template<
8351
typename T0,
8352
typename T1,
8353
typename T2,
8354
typename T3,
8355
typename T4,
8356
typename T5,
8357
typename T6,
8358
typename T7,
8359
typename T8,
8360
typename T9,
8361
typename T10,
8362
typename T11,
8363
typename T12,
8364
typename T13,
8365
typename T14,
8366
typename T15,
8367
typename T16,
8368
typename T17,
8369
typename T18,
8370
typename T19,
8371
typename T20,
8372
typename T21,
8373
typename T22,
8374
typename T23,
8375
typename T24>
8376
struct functionImplementation_
8377
< T0,
8378
T1,
8379
T2,
8380
T3,
8381
T4,
8382
T5,
8383
T6,
8384
T7,
8385
T8,
8386
T9,
8387
T10,
8388
T11,
8389
T12,
8390
T13,
8391
T14,
8392
T15,
8393
T16,
8394
T17,
8395
T18,
8396
T19,
8397
T20,
8398
T21,
8399
T22,
8400
T23,
8401
T24,
8402
NullType,
8403
NullType,
8404
NullType,
8405
NullType,
8406
NullType,
8407
NullType,
8408
NullType>
8409
{
8410
typedef detail::KernelFunctorGlobal<
8411
T0,
8412
T1,
8413
T2,
8414
T3,
8415
T4,
8416
T5,
8417
T6,
8418
T7,
8419
T8,
8420
T9,
8421
T10,
8422
T11,
8423
T12,
8424
T13,
8425
T14,
8426
T15,
8427
T16,
8428
T17,
8429
T18,
8430
T19,
8431
T20,
8432
T21,
8433
T22,
8434
T23,
8435
T24,
8436
NullType,
8437
NullType,
8438
NullType,
8439
NullType,
8440
NullType,
8441
NullType,
8442
NullType> FunctorType;
8443
8444
FunctorType functor_;
8445
8446
functionImplementation_(const FunctorType &functor) :
8447
functor_(functor)
8448
{
8449
8450
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25))
8451
// Fail variadic expansion for dev11
8452
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8453
#endif
8454
8455
}
8456
8457
//! \brief Return type of the functor
8458
typedef Event result_type;
8459
8460
//! \brief Function signature of kernel functor with no event dependency.
8461
typedef Event type_(
8462
const EnqueueArgs&,
8463
T0,
8464
T1,
8465
T2,
8466
T3,
8467
T4,
8468
T5,
8469
T6,
8470
T7,
8471
T8,
8472
T9,
8473
T10,
8474
T11,
8475
T12,
8476
T13,
8477
T14,
8478
T15,
8479
T16,
8480
T17,
8481
T18,
8482
T19,
8483
T20,
8484
T21,
8485
T22,
8486
T23,
8487
T24);
8488
8489
Event operator()(
8490
const EnqueueArgs& enqueueArgs,
8491
T0 arg0,
8492
T1 arg1,
8493
T2 arg2,
8494
T3 arg3,
8495
T4 arg4,
8496
T5 arg5,
8497
T6 arg6,
8498
T7 arg7,
8499
T8 arg8,
8500
T9 arg9,
8501
T10 arg10,
8502
T11 arg11,
8503
T12 arg12,
8504
T13 arg13,
8505
T14 arg14,
8506
T15 arg15,
8507
T16 arg16,
8508
T17 arg17,
8509
T18 arg18,
8510
T19 arg19,
8511
T20 arg20,
8512
T21 arg21,
8513
T22 arg22,
8514
T23 arg23,
8515
T24 arg24)
8516
{
8517
return functor_(
8518
enqueueArgs,
8519
arg0,
8520
arg1,
8521
arg2,
8522
arg3,
8523
arg4,
8524
arg5,
8525
arg6,
8526
arg7,
8527
arg8,
8528
arg9,
8529
arg10,
8530
arg11,
8531
arg12,
8532
arg13,
8533
arg14,
8534
arg15,
8535
arg16,
8536
arg17,
8537
arg18,
8538
arg19,
8539
arg20,
8540
arg21,
8541
arg22,
8542
arg23,
8543
arg24);
8544
}
8545
8546
8547
};
8548
8549
template<
8550
typename T0,
8551
typename T1,
8552
typename T2,
8553
typename T3,
8554
typename T4,
8555
typename T5,
8556
typename T6,
8557
typename T7,
8558
typename T8,
8559
typename T9,
8560
typename T10,
8561
typename T11,
8562
typename T12,
8563
typename T13,
8564
typename T14,
8565
typename T15,
8566
typename T16,
8567
typename T17,
8568
typename T18,
8569
typename T19,
8570
typename T20,
8571
typename T21,
8572
typename T22,
8573
typename T23>
8574
struct functionImplementation_
8575
< T0,
8576
T1,
8577
T2,
8578
T3,
8579
T4,
8580
T5,
8581
T6,
8582
T7,
8583
T8,
8584
T9,
8585
T10,
8586
T11,
8587
T12,
8588
T13,
8589
T14,
8590
T15,
8591
T16,
8592
T17,
8593
T18,
8594
T19,
8595
T20,
8596
T21,
8597
T22,
8598
T23,
8599
NullType,
8600
NullType,
8601
NullType,
8602
NullType,
8603
NullType,
8604
NullType,
8605
NullType,
8606
NullType>
8607
{
8608
typedef detail::KernelFunctorGlobal<
8609
T0,
8610
T1,
8611
T2,
8612
T3,
8613
T4,
8614
T5,
8615
T6,
8616
T7,
8617
T8,
8618
T9,
8619
T10,
8620
T11,
8621
T12,
8622
T13,
8623
T14,
8624
T15,
8625
T16,
8626
T17,
8627
T18,
8628
T19,
8629
T20,
8630
T21,
8631
T22,
8632
T23,
8633
NullType,
8634
NullType,
8635
NullType,
8636
NullType,
8637
NullType,
8638
NullType,
8639
NullType,
8640
NullType> FunctorType;
8641
8642
FunctorType functor_;
8643
8644
functionImplementation_(const FunctorType &functor) :
8645
functor_(functor)
8646
{
8647
8648
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24))
8649
// Fail variadic expansion for dev11
8650
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8651
#endif
8652
8653
}
8654
8655
//! \brief Return type of the functor
8656
typedef Event result_type;
8657
8658
//! \brief Function signature of kernel functor with no event dependency.
8659
typedef Event type_(
8660
const EnqueueArgs&,
8661
T0,
8662
T1,
8663
T2,
8664
T3,
8665
T4,
8666
T5,
8667
T6,
8668
T7,
8669
T8,
8670
T9,
8671
T10,
8672
T11,
8673
T12,
8674
T13,
8675
T14,
8676
T15,
8677
T16,
8678
T17,
8679
T18,
8680
T19,
8681
T20,
8682
T21,
8683
T22,
8684
T23);
8685
8686
Event operator()(
8687
const EnqueueArgs& enqueueArgs,
8688
T0 arg0,
8689
T1 arg1,
8690
T2 arg2,
8691
T3 arg3,
8692
T4 arg4,
8693
T5 arg5,
8694
T6 arg6,
8695
T7 arg7,
8696
T8 arg8,
8697
T9 arg9,
8698
T10 arg10,
8699
T11 arg11,
8700
T12 arg12,
8701
T13 arg13,
8702
T14 arg14,
8703
T15 arg15,
8704
T16 arg16,
8705
T17 arg17,
8706
T18 arg18,
8707
T19 arg19,
8708
T20 arg20,
8709
T21 arg21,
8710
T22 arg22,
8711
T23 arg23)
8712
{
8713
return functor_(
8714
enqueueArgs,
8715
arg0,
8716
arg1,
8717
arg2,
8718
arg3,
8719
arg4,
8720
arg5,
8721
arg6,
8722
arg7,
8723
arg8,
8724
arg9,
8725
arg10,
8726
arg11,
8727
arg12,
8728
arg13,
8729
arg14,
8730
arg15,
8731
arg16,
8732
arg17,
8733
arg18,
8734
arg19,
8735
arg20,
8736
arg21,
8737
arg22,
8738
arg23);
8739
}
8740
8741
8742
};
8743
8744
template<
8745
typename T0,
8746
typename T1,
8747
typename T2,
8748
typename T3,
8749
typename T4,
8750
typename T5,
8751
typename T6,
8752
typename T7,
8753
typename T8,
8754
typename T9,
8755
typename T10,
8756
typename T11,
8757
typename T12,
8758
typename T13,
8759
typename T14,
8760
typename T15,
8761
typename T16,
8762
typename T17,
8763
typename T18,
8764
typename T19,
8765
typename T20,
8766
typename T21,
8767
typename T22>
8768
struct functionImplementation_
8769
< T0,
8770
T1,
8771
T2,
8772
T3,
8773
T4,
8774
T5,
8775
T6,
8776
T7,
8777
T8,
8778
T9,
8779
T10,
8780
T11,
8781
T12,
8782
T13,
8783
T14,
8784
T15,
8785
T16,
8786
T17,
8787
T18,
8788
T19,
8789
T20,
8790
T21,
8791
T22,
8792
NullType,
8793
NullType,
8794
NullType,
8795
NullType,
8796
NullType,
8797
NullType,
8798
NullType,
8799
NullType,
8800
NullType>
8801
{
8802
typedef detail::KernelFunctorGlobal<
8803
T0,
8804
T1,
8805
T2,
8806
T3,
8807
T4,
8808
T5,
8809
T6,
8810
T7,
8811
T8,
8812
T9,
8813
T10,
8814
T11,
8815
T12,
8816
T13,
8817
T14,
8818
T15,
8819
T16,
8820
T17,
8821
T18,
8822
T19,
8823
T20,
8824
T21,
8825
T22,
8826
NullType,
8827
NullType,
8828
NullType,
8829
NullType,
8830
NullType,
8831
NullType,
8832
NullType,
8833
NullType,
8834
NullType> FunctorType;
8835
8836
FunctorType functor_;
8837
8838
functionImplementation_(const FunctorType &functor) :
8839
functor_(functor)
8840
{
8841
8842
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23))
8843
// Fail variadic expansion for dev11
8844
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8845
#endif
8846
8847
}
8848
8849
//! \brief Return type of the functor
8850
typedef Event result_type;
8851
8852
//! \brief Function signature of kernel functor with no event dependency.
8853
typedef Event type_(
8854
const EnqueueArgs&,
8855
T0,
8856
T1,
8857
T2,
8858
T3,
8859
T4,
8860
T5,
8861
T6,
8862
T7,
8863
T8,
8864
T9,
8865
T10,
8866
T11,
8867
T12,
8868
T13,
8869
T14,
8870
T15,
8871
T16,
8872
T17,
8873
T18,
8874
T19,
8875
T20,
8876
T21,
8877
T22);
8878
8879
Event operator()(
8880
const EnqueueArgs& enqueueArgs,
8881
T0 arg0,
8882
T1 arg1,
8883
T2 arg2,
8884
T3 arg3,
8885
T4 arg4,
8886
T5 arg5,
8887
T6 arg6,
8888
T7 arg7,
8889
T8 arg8,
8890
T9 arg9,
8891
T10 arg10,
8892
T11 arg11,
8893
T12 arg12,
8894
T13 arg13,
8895
T14 arg14,
8896
T15 arg15,
8897
T16 arg16,
8898
T17 arg17,
8899
T18 arg18,
8900
T19 arg19,
8901
T20 arg20,
8902
T21 arg21,
8903
T22 arg22)
8904
{
8905
return functor_(
8906
enqueueArgs,
8907
arg0,
8908
arg1,
8909
arg2,
8910
arg3,
8911
arg4,
8912
arg5,
8913
arg6,
8914
arg7,
8915
arg8,
8916
arg9,
8917
arg10,
8918
arg11,
8919
arg12,
8920
arg13,
8921
arg14,
8922
arg15,
8923
arg16,
8924
arg17,
8925
arg18,
8926
arg19,
8927
arg20,
8928
arg21,
8929
arg22);
8930
}
8931
8932
8933
};
8934
8935
template<
8936
typename T0,
8937
typename T1,
8938
typename T2,
8939
typename T3,
8940
typename T4,
8941
typename T5,
8942
typename T6,
8943
typename T7,
8944
typename T8,
8945
typename T9,
8946
typename T10,
8947
typename T11,
8948
typename T12,
8949
typename T13,
8950
typename T14,
8951
typename T15,
8952
typename T16,
8953
typename T17,
8954
typename T18,
8955
typename T19,
8956
typename T20,
8957
typename T21>
8958
struct functionImplementation_
8959
< T0,
8960
T1,
8961
T2,
8962
T3,
8963
T4,
8964
T5,
8965
T6,
8966
T7,
8967
T8,
8968
T9,
8969
T10,
8970
T11,
8971
T12,
8972
T13,
8973
T14,
8974
T15,
8975
T16,
8976
T17,
8977
T18,
8978
T19,
8979
T20,
8980
T21,
8981
NullType,
8982
NullType,
8983
NullType,
8984
NullType,
8985
NullType,
8986
NullType,
8987
NullType,
8988
NullType,
8989
NullType,
8990
NullType>
8991
{
8992
typedef detail::KernelFunctorGlobal<
8993
T0,
8994
T1,
8995
T2,
8996
T3,
8997
T4,
8998
T5,
8999
T6,
9000
T7,
9001
T8,
9002
T9,
9003
T10,
9004
T11,
9005
T12,
9006
T13,
9007
T14,
9008
T15,
9009
T16,
9010
T17,
9011
T18,
9012
T19,
9013
T20,
9014
T21,
9015
NullType,
9016
NullType,
9017
NullType,
9018
NullType,
9019
NullType,
9020
NullType,
9021
NullType,
9022
NullType,
9023
NullType,
9024
NullType> FunctorType;
9025
9026
FunctorType functor_;
9027
9028
functionImplementation_(const FunctorType &functor) :
9029
functor_(functor)
9030
{
9031
9032
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22))
9033
// Fail variadic expansion for dev11
9034
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9035
#endif
9036
9037
}
9038
9039
//! \brief Return type of the functor
9040
typedef Event result_type;
9041
9042
//! \brief Function signature of kernel functor with no event dependency.
9043
typedef Event type_(
9044
const EnqueueArgs&,
9045
T0,
9046
T1,
9047
T2,
9048
T3,
9049
T4,
9050
T5,
9051
T6,
9052
T7,
9053
T8,
9054
T9,
9055
T10,
9056
T11,
9057
T12,
9058
T13,
9059
T14,
9060
T15,
9061
T16,
9062
T17,
9063
T18,
9064
T19,
9065
T20,
9066
T21);
9067
9068
Event operator()(
9069
const EnqueueArgs& enqueueArgs,
9070
T0 arg0,
9071
T1 arg1,
9072
T2 arg2,
9073
T3 arg3,
9074
T4 arg4,
9075
T5 arg5,
9076
T6 arg6,
9077
T7 arg7,
9078
T8 arg8,
9079
T9 arg9,
9080
T10 arg10,
9081
T11 arg11,
9082
T12 arg12,
9083
T13 arg13,
9084
T14 arg14,
9085
T15 arg15,
9086
T16 arg16,
9087
T17 arg17,
9088
T18 arg18,
9089
T19 arg19,
9090
T20 arg20,
9091
T21 arg21)
9092
{
9093
return functor_(
9094
enqueueArgs,
9095
arg0,
9096
arg1,
9097
arg2,
9098
arg3,
9099
arg4,
9100
arg5,
9101
arg6,
9102
arg7,
9103
arg8,
9104
arg9,
9105
arg10,
9106
arg11,
9107
arg12,
9108
arg13,
9109
arg14,
9110
arg15,
9111
arg16,
9112
arg17,
9113
arg18,
9114
arg19,
9115
arg20,
9116
arg21);
9117
}
9118
9119
9120
};
9121
9122
template<
9123
typename T0,
9124
typename T1,
9125
typename T2,
9126
typename T3,
9127
typename T4,
9128
typename T5,
9129
typename T6,
9130
typename T7,
9131
typename T8,
9132
typename T9,
9133
typename T10,
9134
typename T11,
9135
typename T12,
9136
typename T13,
9137
typename T14,
9138
typename T15,
9139
typename T16,
9140
typename T17,
9141
typename T18,
9142
typename T19,
9143
typename T20>
9144
struct functionImplementation_
9145
< T0,
9146
T1,
9147
T2,
9148
T3,
9149
T4,
9150
T5,
9151
T6,
9152
T7,
9153
T8,
9154
T9,
9155
T10,
9156
T11,
9157
T12,
9158
T13,
9159
T14,
9160
T15,
9161
T16,
9162
T17,
9163
T18,
9164
T19,
9165
T20,
9166
NullType,
9167
NullType,
9168
NullType,
9169
NullType,
9170
NullType,
9171
NullType,
9172
NullType,
9173
NullType,
9174
NullType,
9175
NullType,
9176
NullType>
9177
{
9178
typedef detail::KernelFunctorGlobal<
9179
T0,
9180
T1,
9181
T2,
9182
T3,
9183
T4,
9184
T5,
9185
T6,
9186
T7,
9187
T8,
9188
T9,
9189
T10,
9190
T11,
9191
T12,
9192
T13,
9193
T14,
9194
T15,
9195
T16,
9196
T17,
9197
T18,
9198
T19,
9199
T20,
9200
NullType,
9201
NullType,
9202
NullType,
9203
NullType,
9204
NullType,
9205
NullType,
9206
NullType,
9207
NullType,
9208
NullType,
9209
NullType,
9210
NullType> FunctorType;
9211
9212
FunctorType functor_;
9213
9214
functionImplementation_(const FunctorType &functor) :
9215
functor_(functor)
9216
{
9217
9218
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21))
9219
// Fail variadic expansion for dev11
9220
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9221
#endif
9222
9223
}
9224
9225
//! \brief Return type of the functor
9226
typedef Event result_type;
9227
9228
//! \brief Function signature of kernel functor with no event dependency.
9229
typedef Event type_(
9230
const EnqueueArgs&,
9231
T0,
9232
T1,
9233
T2,
9234
T3,
9235
T4,
9236
T5,
9237
T6,
9238
T7,
9239
T8,
9240
T9,
9241
T10,
9242
T11,
9243
T12,
9244
T13,
9245
T14,
9246
T15,
9247
T16,
9248
T17,
9249
T18,
9250
T19,
9251
T20);
9252
9253
Event operator()(
9254
const EnqueueArgs& enqueueArgs,
9255
T0 arg0,
9256
T1 arg1,
9257
T2 arg2,
9258
T3 arg3,
9259
T4 arg4,
9260
T5 arg5,
9261
T6 arg6,
9262
T7 arg7,
9263
T8 arg8,
9264
T9 arg9,
9265
T10 arg10,
9266
T11 arg11,
9267
T12 arg12,
9268
T13 arg13,
9269
T14 arg14,
9270
T15 arg15,
9271
T16 arg16,
9272
T17 arg17,
9273
T18 arg18,
9274
T19 arg19,
9275
T20 arg20)
9276
{
9277
return functor_(
9278
enqueueArgs,
9279
arg0,
9280
arg1,
9281
arg2,
9282
arg3,
9283
arg4,
9284
arg5,
9285
arg6,
9286
arg7,
9287
arg8,
9288
arg9,
9289
arg10,
9290
arg11,
9291
arg12,
9292
arg13,
9293
arg14,
9294
arg15,
9295
arg16,
9296
arg17,
9297
arg18,
9298
arg19,
9299
arg20);
9300
}
9301
9302
9303
};
9304
9305
template<
9306
typename T0,
9307
typename T1,
9308
typename T2,
9309
typename T3,
9310
typename T4,
9311
typename T5,
9312
typename T6,
9313
typename T7,
9314
typename T8,
9315
typename T9,
9316
typename T10,
9317
typename T11,
9318
typename T12,
9319
typename T13,
9320
typename T14,
9321
typename T15,
9322
typename T16,
9323
typename T17,
9324
typename T18,
9325
typename T19>
9326
struct functionImplementation_
9327
< T0,
9328
T1,
9329
T2,
9330
T3,
9331
T4,
9332
T5,
9333
T6,
9334
T7,
9335
T8,
9336
T9,
9337
T10,
9338
T11,
9339
T12,
9340
T13,
9341
T14,
9342
T15,
9343
T16,
9344
T17,
9345
T18,
9346
T19,
9347
NullType,
9348
NullType,
9349
NullType,
9350
NullType,
9351
NullType,
9352
NullType,
9353
NullType,
9354
NullType,
9355
NullType,
9356
NullType,
9357
NullType,
9358
NullType>
9359
{
9360
typedef detail::KernelFunctorGlobal<
9361
T0,
9362
T1,
9363
T2,
9364
T3,
9365
T4,
9366
T5,
9367
T6,
9368
T7,
9369
T8,
9370
T9,
9371
T10,
9372
T11,
9373
T12,
9374
T13,
9375
T14,
9376
T15,
9377
T16,
9378
T17,
9379
T18,
9380
T19,
9381
NullType,
9382
NullType,
9383
NullType,
9384
NullType,
9385
NullType,
9386
NullType,
9387
NullType,
9388
NullType,
9389
NullType,
9390
NullType,
9391
NullType,
9392
NullType> FunctorType;
9393
9394
FunctorType functor_;
9395
9396
functionImplementation_(const FunctorType &functor) :
9397
functor_(functor)
9398
{
9399
9400
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20))
9401
// Fail variadic expansion for dev11
9402
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9403
#endif
9404
9405
}
9406
9407
//! \brief Return type of the functor
9408
typedef Event result_type;
9409
9410
//! \brief Function signature of kernel functor with no event dependency.
9411
typedef Event type_(
9412
const EnqueueArgs&,
9413
T0,
9414
T1,
9415
T2,
9416
T3,
9417
T4,
9418
T5,
9419
T6,
9420
T7,
9421
T8,
9422
T9,
9423
T10,
9424
T11,
9425
T12,
9426
T13,
9427
T14,
9428
T15,
9429
T16,
9430
T17,
9431
T18,
9432
T19);
9433
9434
Event operator()(
9435
const EnqueueArgs& enqueueArgs,
9436
T0 arg0,
9437
T1 arg1,
9438
T2 arg2,
9439
T3 arg3,
9440
T4 arg4,
9441
T5 arg5,
9442
T6 arg6,
9443
T7 arg7,
9444
T8 arg8,
9445
T9 arg9,
9446
T10 arg10,
9447
T11 arg11,
9448
T12 arg12,
9449
T13 arg13,
9450
T14 arg14,
9451
T15 arg15,
9452
T16 arg16,
9453
T17 arg17,
9454
T18 arg18,
9455
T19 arg19)
9456
{
9457
return functor_(
9458
enqueueArgs,
9459
arg0,
9460
arg1,
9461
arg2,
9462
arg3,
9463
arg4,
9464
arg5,
9465
arg6,
9466
arg7,
9467
arg8,
9468
arg9,
9469
arg10,
9470
arg11,
9471
arg12,
9472
arg13,
9473
arg14,
9474
arg15,
9475
arg16,
9476
arg17,
9477
arg18,
9478
arg19);
9479
}
9480
9481
9482
};
9483
9484
template<
9485
typename T0,
9486
typename T1,
9487
typename T2,
9488
typename T3,
9489
typename T4,
9490
typename T5,
9491
typename T6,
9492
typename T7,
9493
typename T8,
9494
typename T9,
9495
typename T10,
9496
typename T11,
9497
typename T12,
9498
typename T13,
9499
typename T14,
9500
typename T15,
9501
typename T16,
9502
typename T17,
9503
typename T18>
9504
struct functionImplementation_
9505
< T0,
9506
T1,
9507
T2,
9508
T3,
9509
T4,
9510
T5,
9511
T6,
9512
T7,
9513
T8,
9514
T9,
9515
T10,
9516
T11,
9517
T12,
9518
T13,
9519
T14,
9520
T15,
9521
T16,
9522
T17,
9523
T18,
9524
NullType,
9525
NullType,
9526
NullType,
9527
NullType,
9528
NullType,
9529
NullType,
9530
NullType,
9531
NullType,
9532
NullType,
9533
NullType,
9534
NullType,
9535
NullType,
9536
NullType>
9537
{
9538
typedef detail::KernelFunctorGlobal<
9539
T0,
9540
T1,
9541
T2,
9542
T3,
9543
T4,
9544
T5,
9545
T6,
9546
T7,
9547
T8,
9548
T9,
9549
T10,
9550
T11,
9551
T12,
9552
T13,
9553
T14,
9554
T15,
9555
T16,
9556
T17,
9557
T18,
9558
NullType,
9559
NullType,
9560
NullType,
9561
NullType,
9562
NullType,
9563
NullType,
9564
NullType,
9565
NullType,
9566
NullType,
9567
NullType,
9568
NullType,
9569
NullType,
9570
NullType> FunctorType;
9571
9572
FunctorType functor_;
9573
9574
functionImplementation_(const FunctorType &functor) :
9575
functor_(functor)
9576
{
9577
9578
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19))
9579
// Fail variadic expansion for dev11
9580
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9581
#endif
9582
9583
}
9584
9585
//! \brief Return type of the functor
9586
typedef Event result_type;
9587
9588
//! \brief Function signature of kernel functor with no event dependency.
9589
typedef Event type_(
9590
const EnqueueArgs&,
9591
T0,
9592
T1,
9593
T2,
9594
T3,
9595
T4,
9596
T5,
9597
T6,
9598
T7,
9599
T8,
9600
T9,
9601
T10,
9602
T11,
9603
T12,
9604
T13,
9605
T14,
9606
T15,
9607
T16,
9608
T17,
9609
T18);
9610
9611
Event operator()(
9612
const EnqueueArgs& enqueueArgs,
9613
T0 arg0,
9614
T1 arg1,
9615
T2 arg2,
9616
T3 arg3,
9617
T4 arg4,
9618
T5 arg5,
9619
T6 arg6,
9620
T7 arg7,
9621
T8 arg8,
9622
T9 arg9,
9623
T10 arg10,
9624
T11 arg11,
9625
T12 arg12,
9626
T13 arg13,
9627
T14 arg14,
9628
T15 arg15,
9629
T16 arg16,
9630
T17 arg17,
9631
T18 arg18)
9632
{
9633
return functor_(
9634
enqueueArgs,
9635
arg0,
9636
arg1,
9637
arg2,
9638
arg3,
9639
arg4,
9640
arg5,
9641
arg6,
9642
arg7,
9643
arg8,
9644
arg9,
9645
arg10,
9646
arg11,
9647
arg12,
9648
arg13,
9649
arg14,
9650
arg15,
9651
arg16,
9652
arg17,
9653
arg18);
9654
}
9655
9656
9657
};
9658
9659
template<
9660
typename T0,
9661
typename T1,
9662
typename T2,
9663
typename T3,
9664
typename T4,
9665
typename T5,
9666
typename T6,
9667
typename T7,
9668
typename T8,
9669
typename T9,
9670
typename T10,
9671
typename T11,
9672
typename T12,
9673
typename T13,
9674
typename T14,
9675
typename T15,
9676
typename T16,
9677
typename T17>
9678
struct functionImplementation_
9679
< T0,
9680
T1,
9681
T2,
9682
T3,
9683
T4,
9684
T5,
9685
T6,
9686
T7,
9687
T8,
9688
T9,
9689
T10,
9690
T11,
9691
T12,
9692
T13,
9693
T14,
9694
T15,
9695
T16,
9696
T17,
9697
NullType,
9698
NullType,
9699
NullType,
9700
NullType,
9701
NullType,
9702
NullType,
9703
NullType,
9704
NullType,
9705
NullType,
9706
NullType,
9707
NullType,
9708
NullType,
9709
NullType,
9710
NullType>
9711
{
9712
typedef detail::KernelFunctorGlobal<
9713
T0,
9714
T1,
9715
T2,
9716
T3,
9717
T4,
9718
T5,
9719
T6,
9720
T7,
9721
T8,
9722
T9,
9723
T10,
9724
T11,
9725
T12,
9726
T13,
9727
T14,
9728
T15,
9729
T16,
9730
T17,
9731
NullType,
9732
NullType,
9733
NullType,
9734
NullType,
9735
NullType,
9736
NullType,
9737
NullType,
9738
NullType,
9739
NullType,
9740
NullType,
9741
NullType,
9742
NullType,
9743
NullType,
9744
NullType> FunctorType;
9745
9746
FunctorType functor_;
9747
9748
functionImplementation_(const FunctorType &functor) :
9749
functor_(functor)
9750
{
9751
9752
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18))
9753
// Fail variadic expansion for dev11
9754
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9755
#endif
9756
9757
}
9758
9759
//! \brief Return type of the functor
9760
typedef Event result_type;
9761
9762
//! \brief Function signature of kernel functor with no event dependency.
9763
typedef Event type_(
9764
const EnqueueArgs&,
9765
T0,
9766
T1,
9767
T2,
9768
T3,
9769
T4,
9770
T5,
9771
T6,
9772
T7,
9773
T8,
9774
T9,
9775
T10,
9776
T11,
9777
T12,
9778
T13,
9779
T14,
9780
T15,
9781
T16,
9782
T17);
9783
9784
Event operator()(
9785
const EnqueueArgs& enqueueArgs,
9786
T0 arg0,
9787
T1 arg1,
9788
T2 arg2,
9789
T3 arg3,
9790
T4 arg4,
9791
T5 arg5,
9792
T6 arg6,
9793
T7 arg7,
9794
T8 arg8,
9795
T9 arg9,
9796
T10 arg10,
9797
T11 arg11,
9798
T12 arg12,
9799
T13 arg13,
9800
T14 arg14,
9801
T15 arg15,
9802
T16 arg16,
9803
T17 arg17)
9804
{
9805
return functor_(
9806
enqueueArgs,
9807
arg0,
9808
arg1,
9809
arg2,
9810
arg3,
9811
arg4,
9812
arg5,
9813
arg6,
9814
arg7,
9815
arg8,
9816
arg9,
9817
arg10,
9818
arg11,
9819
arg12,
9820
arg13,
9821
arg14,
9822
arg15,
9823
arg16,
9824
arg17);
9825
}
9826
9827
9828
};
9829
9830
template<
9831
typename T0,
9832
typename T1,
9833
typename T2,
9834
typename T3,
9835
typename T4,
9836
typename T5,
9837
typename T6,
9838
typename T7,
9839
typename T8,
9840
typename T9,
9841
typename T10,
9842
typename T11,
9843
typename T12,
9844
typename T13,
9845
typename T14,
9846
typename T15,
9847
typename T16>
9848
struct functionImplementation_
9849
< T0,
9850
T1,
9851
T2,
9852
T3,
9853
T4,
9854
T5,
9855
T6,
9856
T7,
9857
T8,
9858
T9,
9859
T10,
9860
T11,
9861
T12,
9862
T13,
9863
T14,
9864
T15,
9865
T16,
9866
NullType,
9867
NullType,
9868
NullType,
9869
NullType,
9870
NullType,
9871
NullType,
9872
NullType,
9873
NullType,
9874
NullType,
9875
NullType,
9876
NullType,
9877
NullType,
9878
NullType,
9879
NullType,
9880
NullType>
9881
{
9882
typedef detail::KernelFunctorGlobal<
9883
T0,
9884
T1,
9885
T2,
9886
T3,
9887
T4,
9888
T5,
9889
T6,
9890
T7,
9891
T8,
9892
T9,
9893
T10,
9894
T11,
9895
T12,
9896
T13,
9897
T14,
9898
T15,
9899
T16,
9900
NullType,
9901
NullType,
9902
NullType,
9903
NullType,
9904
NullType,
9905
NullType,
9906
NullType,
9907
NullType,
9908
NullType,
9909
NullType,
9910
NullType,
9911
NullType,
9912
NullType,
9913
NullType,
9914
NullType> FunctorType;
9915
9916
FunctorType functor_;
9917
9918
functionImplementation_(const FunctorType &functor) :
9919
functor_(functor)
9920
{
9921
9922
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17))
9923
// Fail variadic expansion for dev11
9924
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9925
#endif
9926
9927
}
9928
9929
//! \brief Return type of the functor
9930
typedef Event result_type;
9931
9932
//! \brief Function signature of kernel functor with no event dependency.
9933
typedef Event type_(
9934
const EnqueueArgs&,
9935
T0,
9936
T1,
9937
T2,
9938
T3,
9939
T4,
9940
T5,
9941
T6,
9942
T7,
9943
T8,
9944
T9,
9945
T10,
9946
T11,
9947
T12,
9948
T13,
9949
T14,
9950
T15,
9951
T16);
9952
9953
Event operator()(
9954
const EnqueueArgs& enqueueArgs,
9955
T0 arg0,
9956
T1 arg1,
9957
T2 arg2,
9958
T3 arg3,
9959
T4 arg4,
9960
T5 arg5,
9961
T6 arg6,
9962
T7 arg7,
9963
T8 arg8,
9964
T9 arg9,
9965
T10 arg10,
9966
T11 arg11,
9967
T12 arg12,
9968
T13 arg13,
9969
T14 arg14,
9970
T15 arg15,
9971
T16 arg16)
9972
{
9973
return functor_(
9974
enqueueArgs,
9975
arg0,
9976
arg1,
9977
arg2,
9978
arg3,
9979
arg4,
9980
arg5,
9981
arg6,
9982
arg7,
9983
arg8,
9984
arg9,
9985
arg10,
9986
arg11,
9987
arg12,
9988
arg13,
9989
arg14,
9990
arg15,
9991
arg16);
9992
}
9993
9994
9995
};
9996
9997
template<
9998
typename T0,
9999
typename T1,
10000
typename T2,
10001
typename T3,
10002
typename T4,
10003
typename T5,
10004
typename T6,
10005
typename T7,
10006
typename T8,
10007
typename T9,
10008
typename T10,
10009
typename T11,
10010
typename T12,
10011
typename T13,
10012
typename T14,
10013
typename T15>
10014
struct functionImplementation_
10015
< T0,
10016
T1,
10017
T2,
10018
T3,
10019
T4,
10020
T5,
10021
T6,
10022
T7,
10023
T8,
10024
T9,
10025
T10,
10026
T11,
10027
T12,
10028
T13,
10029
T14,
10030
T15,
10031
NullType,
10032
NullType,
10033
NullType,
10034
NullType,
10035
NullType,
10036
NullType,
10037
NullType,
10038
NullType,
10039
NullType,
10040
NullType,
10041
NullType,
10042
NullType,
10043
NullType,
10044
NullType,
10045
NullType,
10046
NullType>
10047
{
10048
typedef detail::KernelFunctorGlobal<
10049
T0,
10050
T1,
10051
T2,
10052
T3,
10053
T4,
10054
T5,
10055
T6,
10056
T7,
10057
T8,
10058
T9,
10059
T10,
10060
T11,
10061
T12,
10062
T13,
10063
T14,
10064
T15,
10065
NullType,
10066
NullType,
10067
NullType,
10068
NullType,
10069
NullType,
10070
NullType,
10071
NullType,
10072
NullType,
10073
NullType,
10074
NullType,
10075
NullType,
10076
NullType,
10077
NullType,
10078
NullType,
10079
NullType,
10080
NullType> FunctorType;
10081
10082
FunctorType functor_;
10083
10084
functionImplementation_(const FunctorType &functor) :
10085
functor_(functor)
10086
{
10087
10088
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16))
10089
// Fail variadic expansion for dev11
10090
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10091
#endif
10092
10093
}
10094
10095
//! \brief Return type of the functor
10096
typedef Event result_type;
10097
10098
//! \brief Function signature of kernel functor with no event dependency.
10099
typedef Event type_(
10100
const EnqueueArgs&,
10101
T0,
10102
T1,
10103
T2,
10104
T3,
10105
T4,
10106
T5,
10107
T6,
10108
T7,
10109
T8,
10110
T9,
10111
T10,
10112
T11,
10113
T12,
10114
T13,
10115
T14,
10116
T15);
10117
10118
Event operator()(
10119
const EnqueueArgs& enqueueArgs,
10120
T0 arg0,
10121
T1 arg1,
10122
T2 arg2,
10123
T3 arg3,
10124
T4 arg4,
10125
T5 arg5,
10126
T6 arg6,
10127
T7 arg7,
10128
T8 arg8,
10129
T9 arg9,
10130
T10 arg10,
10131
T11 arg11,
10132
T12 arg12,
10133
T13 arg13,
10134
T14 arg14,
10135
T15 arg15)
10136
{
10137
return functor_(
10138
enqueueArgs,
10139
arg0,
10140
arg1,
10141
arg2,
10142
arg3,
10143
arg4,
10144
arg5,
10145
arg6,
10146
arg7,
10147
arg8,
10148
arg9,
10149
arg10,
10150
arg11,
10151
arg12,
10152
arg13,
10153
arg14,
10154
arg15);
10155
}
10156
10157
10158
};
10159
10160
template<
10161
typename T0,
10162
typename T1,
10163
typename T2,
10164
typename T3,
10165
typename T4,
10166
typename T5,
10167
typename T6,
10168
typename T7,
10169
typename T8,
10170
typename T9,
10171
typename T10,
10172
typename T11,
10173
typename T12,
10174
typename T13,
10175
typename T14>
10176
struct functionImplementation_
10177
< T0,
10178
T1,
10179
T2,
10180
T3,
10181
T4,
10182
T5,
10183
T6,
10184
T7,
10185
T8,
10186
T9,
10187
T10,
10188
T11,
10189
T12,
10190
T13,
10191
T14,
10192
NullType,
10193
NullType,
10194
NullType,
10195
NullType,
10196
NullType,
10197
NullType,
10198
NullType,
10199
NullType,
10200
NullType,
10201
NullType,
10202
NullType,
10203
NullType,
10204
NullType,
10205
NullType,
10206
NullType,
10207
NullType,
10208
NullType>
10209
{
10210
typedef detail::KernelFunctorGlobal<
10211
T0,
10212
T1,
10213
T2,
10214
T3,
10215
T4,
10216
T5,
10217
T6,
10218
T7,
10219
T8,
10220
T9,
10221
T10,
10222
T11,
10223
T12,
10224
T13,
10225
T14,
10226
NullType,
10227
NullType,
10228
NullType,
10229
NullType,
10230
NullType,
10231
NullType,
10232
NullType,
10233
NullType,
10234
NullType,
10235
NullType,
10236
NullType,
10237
NullType,
10238
NullType,
10239
NullType,
10240
NullType,
10241
NullType,
10242
NullType> FunctorType;
10243
10244
FunctorType functor_;
10245
10246
functionImplementation_(const FunctorType &functor) :
10247
functor_(functor)
10248
{
10249
10250
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15))
10251
// Fail variadic expansion for dev11
10252
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10253
#endif
10254
10255
}
10256
10257
//! \brief Return type of the functor
10258
typedef Event result_type;
10259
10260
//! \brief Function signature of kernel functor with no event dependency.
10261
typedef Event type_(
10262
const EnqueueArgs&,
10263
T0,
10264
T1,
10265
T2,
10266
T3,
10267
T4,
10268
T5,
10269
T6,
10270
T7,
10271
T8,
10272
T9,
10273
T10,
10274
T11,
10275
T12,
10276
T13,
10277
T14);
10278
10279
Event operator()(
10280
const EnqueueArgs& enqueueArgs,
10281
T0 arg0,
10282
T1 arg1,
10283
T2 arg2,
10284
T3 arg3,
10285
T4 arg4,
10286
T5 arg5,
10287
T6 arg6,
10288
T7 arg7,
10289
T8 arg8,
10290
T9 arg9,
10291
T10 arg10,
10292
T11 arg11,
10293
T12 arg12,
10294
T13 arg13,
10295
T14 arg14)
10296
{
10297
return functor_(
10298
enqueueArgs,
10299
arg0,
10300
arg1,
10301
arg2,
10302
arg3,
10303
arg4,
10304
arg5,
10305
arg6,
10306
arg7,
10307
arg8,
10308
arg9,
10309
arg10,
10310
arg11,
10311
arg12,
10312
arg13,
10313
arg14);
10314
}
10315
10316
10317
};
10318
10319
template<
10320
typename T0,
10321
typename T1,
10322
typename T2,
10323
typename T3,
10324
typename T4,
10325
typename T5,
10326
typename T6,
10327
typename T7,
10328
typename T8,
10329
typename T9,
10330
typename T10,
10331
typename T11,
10332
typename T12,
10333
typename T13>
10334
struct functionImplementation_
10335
< T0,
10336
T1,
10337
T2,
10338
T3,
10339
T4,
10340
T5,
10341
T6,
10342
T7,
10343
T8,
10344
T9,
10345
T10,
10346
T11,
10347
T12,
10348
T13,
10349
NullType,
10350
NullType,
10351
NullType,
10352
NullType,
10353
NullType,
10354
NullType,
10355
NullType,
10356
NullType,
10357
NullType,
10358
NullType,
10359
NullType,
10360
NullType,
10361
NullType,
10362
NullType,
10363
NullType,
10364
NullType,
10365
NullType,
10366
NullType>
10367
{
10368
typedef detail::KernelFunctorGlobal<
10369
T0,
10370
T1,
10371
T2,
10372
T3,
10373
T4,
10374
T5,
10375
T6,
10376
T7,
10377
T8,
10378
T9,
10379
T10,
10380
T11,
10381
T12,
10382
T13,
10383
NullType,
10384
NullType,
10385
NullType,
10386
NullType,
10387
NullType,
10388
NullType,
10389
NullType,
10390
NullType,
10391
NullType,
10392
NullType,
10393
NullType,
10394
NullType,
10395
NullType,
10396
NullType,
10397
NullType,
10398
NullType,
10399
NullType,
10400
NullType> FunctorType;
10401
10402
FunctorType functor_;
10403
10404
functionImplementation_(const FunctorType &functor) :
10405
functor_(functor)
10406
{
10407
10408
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14))
10409
// Fail variadic expansion for dev11
10410
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10411
#endif
10412
10413
}
10414
10415
//! \brief Return type of the functor
10416
typedef Event result_type;
10417
10418
//! \brief Function signature of kernel functor with no event dependency.
10419
typedef Event type_(
10420
const EnqueueArgs&,
10421
T0,
10422
T1,
10423
T2,
10424
T3,
10425
T4,
10426
T5,
10427
T6,
10428
T7,
10429
T8,
10430
T9,
10431
T10,
10432
T11,
10433
T12,
10434
T13);
10435
10436
Event operator()(
10437
const EnqueueArgs& enqueueArgs,
10438
T0 arg0,
10439
T1 arg1,
10440
T2 arg2,
10441
T3 arg3,
10442
T4 arg4,
10443
T5 arg5,
10444
T6 arg6,
10445
T7 arg7,
10446
T8 arg8,
10447
T9 arg9,
10448
T10 arg10,
10449
T11 arg11,
10450
T12 arg12,
10451
T13 arg13)
10452
{
10453
return functor_(
10454
enqueueArgs,
10455
arg0,
10456
arg1,
10457
arg2,
10458
arg3,
10459
arg4,
10460
arg5,
10461
arg6,
10462
arg7,
10463
arg8,
10464
arg9,
10465
arg10,
10466
arg11,
10467
arg12,
10468
arg13);
10469
}
10470
10471
10472
};
10473
10474
template<
10475
typename T0,
10476
typename T1,
10477
typename T2,
10478
typename T3,
10479
typename T4,
10480
typename T5,
10481
typename T6,
10482
typename T7,
10483
typename T8,
10484
typename T9,
10485
typename T10,
10486
typename T11,
10487
typename T12>
10488
struct functionImplementation_
10489
< T0,
10490
T1,
10491
T2,
10492
T3,
10493
T4,
10494
T5,
10495
T6,
10496
T7,
10497
T8,
10498
T9,
10499
T10,
10500
T11,
10501
T12,
10502
NullType,
10503
NullType,
10504
NullType,
10505
NullType,
10506
NullType,
10507
NullType,
10508
NullType,
10509
NullType,
10510
NullType,
10511
NullType,
10512
NullType,
10513
NullType,
10514
NullType,
10515
NullType,
10516
NullType,
10517
NullType,
10518
NullType,
10519
NullType,
10520
NullType>
10521
{
10522
typedef detail::KernelFunctorGlobal<
10523
T0,
10524
T1,
10525
T2,
10526
T3,
10527
T4,
10528
T5,
10529
T6,
10530
T7,
10531
T8,
10532
T9,
10533
T10,
10534
T11,
10535
T12,
10536
NullType,
10537
NullType,
10538
NullType,
10539
NullType,
10540
NullType,
10541
NullType,
10542
NullType,
10543
NullType,
10544
NullType,
10545
NullType,
10546
NullType,
10547
NullType,
10548
NullType,
10549
NullType,
10550
NullType,
10551
NullType,
10552
NullType,
10553
NullType,
10554
NullType> FunctorType;
10555
10556
FunctorType functor_;
10557
10558
functionImplementation_(const FunctorType &functor) :
10559
functor_(functor)
10560
{
10561
10562
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13))
10563
// Fail variadic expansion for dev11
10564
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10565
#endif
10566
10567
}
10568
10569
//! \brief Return type of the functor
10570
typedef Event result_type;
10571
10572
//! \brief Function signature of kernel functor with no event dependency.
10573
typedef Event type_(
10574
const EnqueueArgs&,
10575
T0,
10576
T1,
10577
T2,
10578
T3,
10579
T4,
10580
T5,
10581
T6,
10582
T7,
10583
T8,
10584
T9,
10585
T10,
10586
T11,
10587
T12);
10588
10589
Event operator()(
10590
const EnqueueArgs& enqueueArgs,
10591
T0 arg0,
10592
T1 arg1,
10593
T2 arg2,
10594
T3 arg3,
10595
T4 arg4,
10596
T5 arg5,
10597
T6 arg6,
10598
T7 arg7,
10599
T8 arg8,
10600
T9 arg9,
10601
T10 arg10,
10602
T11 arg11,
10603
T12 arg12)
10604
{
10605
return functor_(
10606
enqueueArgs,
10607
arg0,
10608
arg1,
10609
arg2,
10610
arg3,
10611
arg4,
10612
arg5,
10613
arg6,
10614
arg7,
10615
arg8,
10616
arg9,
10617
arg10,
10618
arg11,
10619
arg12);
10620
}
10621
10622
10623
};
10624
10625
template<
10626
typename T0,
10627
typename T1,
10628
typename T2,
10629
typename T3,
10630
typename T4,
10631
typename T5,
10632
typename T6,
10633
typename T7,
10634
typename T8,
10635
typename T9,
10636
typename T10,
10637
typename T11>
10638
struct functionImplementation_
10639
< T0,
10640
T1,
10641
T2,
10642
T3,
10643
T4,
10644
T5,
10645
T6,
10646
T7,
10647
T8,
10648
T9,
10649
T10,
10650
T11,
10651
NullType,
10652
NullType,
10653
NullType,
10654
NullType,
10655
NullType,
10656
NullType,
10657
NullType,
10658
NullType,
10659
NullType,
10660
NullType,
10661
NullType,
10662
NullType,
10663
NullType,
10664
NullType,
10665
NullType,
10666
NullType,
10667
NullType,
10668
NullType,
10669
NullType,
10670
NullType>
10671
{
10672
typedef detail::KernelFunctorGlobal<
10673
T0,
10674
T1,
10675
T2,
10676
T3,
10677
T4,
10678
T5,
10679
T6,
10680
T7,
10681
T8,
10682
T9,
10683
T10,
10684
T11,
10685
NullType,
10686
NullType,
10687
NullType,
10688
NullType,
10689
NullType,
10690
NullType,
10691
NullType,
10692
NullType,
10693
NullType,
10694
NullType,
10695
NullType,
10696
NullType,
10697
NullType,
10698
NullType,
10699
NullType,
10700
NullType,
10701
NullType,
10702
NullType,
10703
NullType,
10704
NullType> FunctorType;
10705
10706
FunctorType functor_;
10707
10708
functionImplementation_(const FunctorType &functor) :
10709
functor_(functor)
10710
{
10711
10712
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12))
10713
// Fail variadic expansion for dev11
10714
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10715
#endif
10716
10717
}
10718
10719
//! \brief Return type of the functor
10720
typedef Event result_type;
10721
10722
//! \brief Function signature of kernel functor with no event dependency.
10723
typedef Event type_(
10724
const EnqueueArgs&,
10725
T0,
10726
T1,
10727
T2,
10728
T3,
10729
T4,
10730
T5,
10731
T6,
10732
T7,
10733
T8,
10734
T9,
10735
T10,
10736
T11);
10737
10738
Event operator()(
10739
const EnqueueArgs& enqueueArgs,
10740
T0 arg0,
10741
T1 arg1,
10742
T2 arg2,
10743
T3 arg3,
10744
T4 arg4,
10745
T5 arg5,
10746
T6 arg6,
10747
T7 arg7,
10748
T8 arg8,
10749
T9 arg9,
10750
T10 arg10,
10751
T11 arg11)
10752
{
10753
return functor_(
10754
enqueueArgs,
10755
arg0,
10756
arg1,
10757
arg2,
10758
arg3,
10759
arg4,
10760
arg5,
10761
arg6,
10762
arg7,
10763
arg8,
10764
arg9,
10765
arg10,
10766
arg11);
10767
}
10768
10769
10770
};
10771
10772
template<
10773
typename T0,
10774
typename T1,
10775
typename T2,
10776
typename T3,
10777
typename T4,
10778
typename T5,
10779
typename T6,
10780
typename T7,
10781
typename T8,
10782
typename T9,
10783
typename T10>
10784
struct functionImplementation_
10785
< T0,
10786
T1,
10787
T2,
10788
T3,
10789
T4,
10790
T5,
10791
T6,
10792
T7,
10793
T8,
10794
T9,
10795
T10,
10796
NullType,
10797
NullType,
10798
NullType,
10799
NullType,
10800
NullType,
10801
NullType,
10802
NullType,
10803
NullType,
10804
NullType,
10805
NullType,
10806
NullType,
10807
NullType,
10808
NullType,
10809
NullType,
10810
NullType,
10811
NullType,
10812
NullType,
10813
NullType,
10814
NullType,
10815
NullType,
10816
NullType>
10817
{
10818
typedef detail::KernelFunctorGlobal<
10819
T0,
10820
T1,
10821
T2,
10822
T3,
10823
T4,
10824
T5,
10825
T6,
10826
T7,
10827
T8,
10828
T9,
10829
T10,
10830
NullType,
10831
NullType,
10832
NullType,
10833
NullType,
10834
NullType,
10835
NullType,
10836
NullType,
10837
NullType,
10838
NullType,
10839
NullType,
10840
NullType,
10841
NullType,
10842
NullType,
10843
NullType,
10844
NullType,
10845
NullType,
10846
NullType,
10847
NullType,
10848
NullType,
10849
NullType,
10850
NullType> FunctorType;
10851
10852
FunctorType functor_;
10853
10854
functionImplementation_(const FunctorType &functor) :
10855
functor_(functor)
10856
{
10857
10858
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11))
10859
// Fail variadic expansion for dev11
10860
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10861
#endif
10862
10863
}
10864
10865
//! \brief Return type of the functor
10866
typedef Event result_type;
10867
10868
//! \brief Function signature of kernel functor with no event dependency.
10869
typedef Event type_(
10870
const EnqueueArgs&,
10871
T0,
10872
T1,
10873
T2,
10874
T3,
10875
T4,
10876
T5,
10877
T6,
10878
T7,
10879
T8,
10880
T9,
10881
T10);
10882
10883
Event operator()(
10884
const EnqueueArgs& enqueueArgs,
10885
T0 arg0,
10886
T1 arg1,
10887
T2 arg2,
10888
T3 arg3,
10889
T4 arg4,
10890
T5 arg5,
10891
T6 arg6,
10892
T7 arg7,
10893
T8 arg8,
10894
T9 arg9,
10895
T10 arg10)
10896
{
10897
return functor_(
10898
enqueueArgs,
10899
arg0,
10900
arg1,
10901
arg2,
10902
arg3,
10903
arg4,
10904
arg5,
10905
arg6,
10906
arg7,
10907
arg8,
10908
arg9,
10909
arg10);
10910
}
10911
10912
10913
};
10914
10915
template<
10916
typename T0,
10917
typename T1,
10918
typename T2,
10919
typename T3,
10920
typename T4,
10921
typename T5,
10922
typename T6,
10923
typename T7,
10924
typename T8,
10925
typename T9>
10926
struct functionImplementation_
10927
< T0,
10928
T1,
10929
T2,
10930
T3,
10931
T4,
10932
T5,
10933
T6,
10934
T7,
10935
T8,
10936
T9,
10937
NullType,
10938
NullType,
10939
NullType,
10940
NullType,
10941
NullType,
10942
NullType,
10943
NullType,
10944
NullType,
10945
NullType,
10946
NullType,
10947
NullType,
10948
NullType,
10949
NullType,
10950
NullType,
10951
NullType,
10952
NullType,
10953
NullType,
10954
NullType,
10955
NullType,
10956
NullType,
10957
NullType,
10958
NullType>
10959
{
10960
typedef detail::KernelFunctorGlobal<
10961
T0,
10962
T1,
10963
T2,
10964
T3,
10965
T4,
10966
T5,
10967
T6,
10968
T7,
10969
T8,
10970
T9,
10971
NullType,
10972
NullType,
10973
NullType,
10974
NullType,
10975
NullType,
10976
NullType,
10977
NullType,
10978
NullType,
10979
NullType,
10980
NullType,
10981
NullType,
10982
NullType,
10983
NullType,
10984
NullType,
10985
NullType,
10986
NullType,
10987
NullType,
10988
NullType,
10989
NullType,
10990
NullType,
10991
NullType,
10992
NullType> FunctorType;
10993
10994
FunctorType functor_;
10995
10996
functionImplementation_(const FunctorType &functor) :
10997
functor_(functor)
10998
{
10999
11000
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10))
11001
// Fail variadic expansion for dev11
11002
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11003
#endif
11004
11005
}
11006
11007
//! \brief Return type of the functor
11008
typedef Event result_type;
11009
11010
//! \brief Function signature of kernel functor with no event dependency.
11011
typedef Event type_(
11012
const EnqueueArgs&,
11013
T0,
11014
T1,
11015
T2,
11016
T3,
11017
T4,
11018
T5,
11019
T6,
11020
T7,
11021
T8,
11022
T9);
11023
11024
Event operator()(
11025
const EnqueueArgs& enqueueArgs,
11026
T0 arg0,
11027
T1 arg1,
11028
T2 arg2,
11029
T3 arg3,
11030
T4 arg4,
11031
T5 arg5,
11032
T6 arg6,
11033
T7 arg7,
11034
T8 arg8,
11035
T9 arg9)
11036
{
11037
return functor_(
11038
enqueueArgs,
11039
arg0,
11040
arg1,
11041
arg2,
11042
arg3,
11043
arg4,
11044
arg5,
11045
arg6,
11046
arg7,
11047
arg8,
11048
arg9);
11049
}
11050
11051
11052
};
11053
11054
template<
11055
typename T0,
11056
typename T1,
11057
typename T2,
11058
typename T3,
11059
typename T4,
11060
typename T5,
11061
typename T6,
11062
typename T7,
11063
typename T8>
11064
struct functionImplementation_
11065
< T0,
11066
T1,
11067
T2,
11068
T3,
11069
T4,
11070
T5,
11071
T6,
11072
T7,
11073
T8,
11074
NullType,
11075
NullType,
11076
NullType,
11077
NullType,
11078
NullType,
11079
NullType,
11080
NullType,
11081
NullType,
11082
NullType,
11083
NullType,
11084
NullType,
11085
NullType,
11086
NullType,
11087
NullType,
11088
NullType,
11089
NullType,
11090
NullType,
11091
NullType,
11092
NullType,
11093
NullType,
11094
NullType,
11095
NullType,
11096
NullType>
11097
{
11098
typedef detail::KernelFunctorGlobal<
11099
T0,
11100
T1,
11101
T2,
11102
T3,
11103
T4,
11104
T5,
11105
T6,
11106
T7,
11107
T8,
11108
NullType,
11109
NullType,
11110
NullType,
11111
NullType,
11112
NullType,
11113
NullType,
11114
NullType,
11115
NullType,
11116
NullType,
11117
NullType,
11118
NullType,
11119
NullType,
11120
NullType,
11121
NullType,
11122
NullType,
11123
NullType,
11124
NullType,
11125
NullType,
11126
NullType,
11127
NullType,
11128
NullType,
11129
NullType,
11130
NullType> FunctorType;
11131
11132
FunctorType functor_;
11133
11134
functionImplementation_(const FunctorType &functor) :
11135
functor_(functor)
11136
{
11137
11138
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9))
11139
// Fail variadic expansion for dev11
11140
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11141
#endif
11142
11143
}
11144
11145
//! \brief Return type of the functor
11146
typedef Event result_type;
11147
11148
//! \brief Function signature of kernel functor with no event dependency.
11149
typedef Event type_(
11150
const EnqueueArgs&,
11151
T0,
11152
T1,
11153
T2,
11154
T3,
11155
T4,
11156
T5,
11157
T6,
11158
T7,
11159
T8);
11160
11161
Event operator()(
11162
const EnqueueArgs& enqueueArgs,
11163
T0 arg0,
11164
T1 arg1,
11165
T2 arg2,
11166
T3 arg3,
11167
T4 arg4,
11168
T5 arg5,
11169
T6 arg6,
11170
T7 arg7,
11171
T8 arg8)
11172
{
11173
return functor_(
11174
enqueueArgs,
11175
arg0,
11176
arg1,
11177
arg2,
11178
arg3,
11179
arg4,
11180
arg5,
11181
arg6,
11182
arg7,
11183
arg8);
11184
}
11185
11186
11187
};
11188
11189
template<
11190
typename T0,
11191
typename T1,
11192
typename T2,
11193
typename T3,
11194
typename T4,
11195
typename T5,
11196
typename T6,
11197
typename T7>
11198
struct functionImplementation_
11199
< T0,
11200
T1,
11201
T2,
11202
T3,
11203
T4,
11204
T5,
11205
T6,
11206
T7,
11207
NullType,
11208
NullType,
11209
NullType,
11210
NullType,
11211
NullType,
11212
NullType,
11213
NullType,
11214
NullType,
11215
NullType,
11216
NullType,
11217
NullType,
11218
NullType,
11219
NullType,
11220
NullType,
11221
NullType,
11222
NullType,
11223
NullType,
11224
NullType,
11225
NullType,
11226
NullType,
11227
NullType,
11228
NullType,
11229
NullType,
11230
NullType>
11231
{
11232
typedef detail::KernelFunctorGlobal<
11233
T0,
11234
T1,
11235
T2,
11236
T3,
11237
T4,
11238
T5,
11239
T6,
11240
T7,
11241
NullType,
11242
NullType,
11243
NullType,
11244
NullType,
11245
NullType,
11246
NullType,
11247
NullType,
11248
NullType,
11249
NullType,
11250
NullType,
11251
NullType,
11252
NullType,
11253
NullType,
11254
NullType,
11255
NullType,
11256
NullType,
11257
NullType,
11258
NullType,
11259
NullType,
11260
NullType,
11261
NullType,
11262
NullType,
11263
NullType,
11264
NullType> FunctorType;
11265
11266
FunctorType functor_;
11267
11268
functionImplementation_(const FunctorType &functor) :
11269
functor_(functor)
11270
{
11271
11272
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8))
11273
// Fail variadic expansion for dev11
11274
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11275
#endif
11276
11277
}
11278
11279
//! \brief Return type of the functor
11280
typedef Event result_type;
11281
11282
//! \brief Function signature of kernel functor with no event dependency.
11283
typedef Event type_(
11284
const EnqueueArgs&,
11285
T0,
11286
T1,
11287
T2,
11288
T3,
11289
T4,
11290
T5,
11291
T6,
11292
T7);
11293
11294
Event operator()(
11295
const EnqueueArgs& enqueueArgs,
11296
T0 arg0,
11297
T1 arg1,
11298
T2 arg2,
11299
T3 arg3,
11300
T4 arg4,
11301
T5 arg5,
11302
T6 arg6,
11303
T7 arg7)
11304
{
11305
return functor_(
11306
enqueueArgs,
11307
arg0,
11308
arg1,
11309
arg2,
11310
arg3,
11311
arg4,
11312
arg5,
11313
arg6,
11314
arg7);
11315
}
11316
11317
11318
};
11319
11320
template<
11321
typename T0,
11322
typename T1,
11323
typename T2,
11324
typename T3,
11325
typename T4,
11326
typename T5,
11327
typename T6>
11328
struct functionImplementation_
11329
< T0,
11330
T1,
11331
T2,
11332
T3,
11333
T4,
11334
T5,
11335
T6,
11336
NullType,
11337
NullType,
11338
NullType,
11339
NullType,
11340
NullType,
11341
NullType,
11342
NullType,
11343
NullType,
11344
NullType,
11345
NullType,
11346
NullType,
11347
NullType,
11348
NullType,
11349
NullType,
11350
NullType,
11351
NullType,
11352
NullType,
11353
NullType,
11354
NullType,
11355
NullType,
11356
NullType,
11357
NullType,
11358
NullType,
11359
NullType,
11360
NullType>
11361
{
11362
typedef detail::KernelFunctorGlobal<
11363
T0,
11364
T1,
11365
T2,
11366
T3,
11367
T4,
11368
T5,
11369
T6,
11370
NullType,
11371
NullType,
11372
NullType,
11373
NullType,
11374
NullType,
11375
NullType,
11376
NullType,
11377
NullType,
11378
NullType,
11379
NullType,
11380
NullType,
11381
NullType,
11382
NullType,
11383
NullType,
11384
NullType,
11385
NullType,
11386
NullType,
11387
NullType,
11388
NullType,
11389
NullType,
11390
NullType,
11391
NullType,
11392
NullType,
11393
NullType,
11394
NullType> FunctorType;
11395
11396
FunctorType functor_;
11397
11398
functionImplementation_(const FunctorType &functor) :
11399
functor_(functor)
11400
{
11401
11402
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7))
11403
// Fail variadic expansion for dev11
11404
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11405
#endif
11406
11407
}
11408
11409
//! \brief Return type of the functor
11410
typedef Event result_type;
11411
11412
//! \brief Function signature of kernel functor with no event dependency.
11413
typedef Event type_(
11414
const EnqueueArgs&,
11415
T0,
11416
T1,
11417
T2,
11418
T3,
11419
T4,
11420
T5,
11421
T6);
11422
11423
Event operator()(
11424
const EnqueueArgs& enqueueArgs,
11425
T0 arg0,
11426
T1 arg1,
11427
T2 arg2,
11428
T3 arg3,
11429
T4 arg4,
11430
T5 arg5,
11431
T6 arg6)
11432
{
11433
return functor_(
11434
enqueueArgs,
11435
arg0,
11436
arg1,
11437
arg2,
11438
arg3,
11439
arg4,
11440
arg5,
11441
arg6);
11442
}
11443
11444
11445
};
11446
11447
template<
11448
typename T0,
11449
typename T1,
11450
typename T2,
11451
typename T3,
11452
typename T4,
11453
typename T5>
11454
struct functionImplementation_
11455
< T0,
11456
T1,
11457
T2,
11458
T3,
11459
T4,
11460
T5,
11461
NullType,
11462
NullType,
11463
NullType,
11464
NullType,
11465
NullType,
11466
NullType,
11467
NullType,
11468
NullType,
11469
NullType,
11470
NullType,
11471
NullType,
11472
NullType,
11473
NullType,
11474
NullType,
11475
NullType,
11476
NullType,
11477
NullType,
11478
NullType,
11479
NullType,
11480
NullType,
11481
NullType,
11482
NullType,
11483
NullType,
11484
NullType,
11485
NullType,
11486
NullType>
11487
{
11488
typedef detail::KernelFunctorGlobal<
11489
T0,
11490
T1,
11491
T2,
11492
T3,
11493
T4,
11494
T5,
11495
NullType,
11496
NullType,
11497
NullType,
11498
NullType,
11499
NullType,
11500
NullType,
11501
NullType,
11502
NullType,
11503
NullType,
11504
NullType,
11505
NullType,
11506
NullType,
11507
NullType,
11508
NullType,
11509
NullType,
11510
NullType,
11511
NullType,
11512
NullType,
11513
NullType,
11514
NullType,
11515
NullType,
11516
NullType,
11517
NullType,
11518
NullType,
11519
NullType,
11520
NullType> FunctorType;
11521
11522
FunctorType functor_;
11523
11524
functionImplementation_(const FunctorType &functor) :
11525
functor_(functor)
11526
{
11527
11528
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6))
11529
// Fail variadic expansion for dev11
11530
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11531
#endif
11532
11533
}
11534
11535
//! \brief Return type of the functor
11536
typedef Event result_type;
11537
11538
//! \brief Function signature of kernel functor with no event dependency.
11539
typedef Event type_(
11540
const EnqueueArgs&,
11541
T0,
11542
T1,
11543
T2,
11544
T3,
11545
T4,
11546
T5);
11547
11548
Event operator()(
11549
const EnqueueArgs& enqueueArgs,
11550
T0 arg0,
11551
T1 arg1,
11552
T2 arg2,
11553
T3 arg3,
11554
T4 arg4,
11555
T5 arg5)
11556
{
11557
return functor_(
11558
enqueueArgs,
11559
arg0,
11560
arg1,
11561
arg2,
11562
arg3,
11563
arg4,
11564
arg5);
11565
}
11566
11567
11568
};
11569
11570
template<
11571
typename T0,
11572
typename T1,
11573
typename T2,
11574
typename T3,
11575
typename T4>
11576
struct functionImplementation_
11577
< T0,
11578
T1,
11579
T2,
11580
T3,
11581
T4,
11582
NullType,
11583
NullType,
11584
NullType,
11585
NullType,
11586
NullType,
11587
NullType,
11588
NullType,
11589
NullType,
11590
NullType,
11591
NullType,
11592
NullType,
11593
NullType,
11594
NullType,
11595
NullType,
11596
NullType,
11597
NullType,
11598
NullType,
11599
NullType,
11600
NullType,
11601
NullType,
11602
NullType,
11603
NullType,
11604
NullType,
11605
NullType,
11606
NullType,
11607
NullType,
11608
NullType>
11609
{
11610
typedef detail::KernelFunctorGlobal<
11611
T0,
11612
T1,
11613
T2,
11614
T3,
11615
T4,
11616
NullType,
11617
NullType,
11618
NullType,
11619
NullType,
11620
NullType,
11621
NullType,
11622
NullType,
11623
NullType,
11624
NullType,
11625
NullType,
11626
NullType,
11627
NullType,
11628
NullType,
11629
NullType,
11630
NullType,
11631
NullType,
11632
NullType,
11633
NullType,
11634
NullType,
11635
NullType,
11636
NullType,
11637
NullType,
11638
NullType,
11639
NullType,
11640
NullType,
11641
NullType,
11642
NullType> FunctorType;
11643
11644
FunctorType functor_;
11645
11646
functionImplementation_(const FunctorType &functor) :
11647
functor_(functor)
11648
{
11649
11650
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5))
11651
// Fail variadic expansion for dev11
11652
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11653
#endif
11654
11655
}
11656
11657
//! \brief Return type of the functor
11658
typedef Event result_type;
11659
11660
//! \brief Function signature of kernel functor with no event dependency.
11661
typedef Event type_(
11662
const EnqueueArgs&,
11663
T0,
11664
T1,
11665
T2,
11666
T3,
11667
T4);
11668
11669
Event operator()(
11670
const EnqueueArgs& enqueueArgs,
11671
T0 arg0,
11672
T1 arg1,
11673
T2 arg2,
11674
T3 arg3,
11675
T4 arg4)
11676
{
11677
return functor_(
11678
enqueueArgs,
11679
arg0,
11680
arg1,
11681
arg2,
11682
arg3,
11683
arg4);
11684
}
11685
11686
11687
};
11688
11689
template<
11690
typename T0,
11691
typename T1,
11692
typename T2,
11693
typename T3>
11694
struct functionImplementation_
11695
< T0,
11696
T1,
11697
T2,
11698
T3,
11699
NullType,
11700
NullType,
11701
NullType,
11702
NullType,
11703
NullType,
11704
NullType,
11705
NullType,
11706
NullType,
11707
NullType,
11708
NullType,
11709
NullType,
11710
NullType,
11711
NullType,
11712
NullType,
11713
NullType,
11714
NullType,
11715
NullType,
11716
NullType,
11717
NullType,
11718
NullType,
11719
NullType,
11720
NullType,
11721
NullType,
11722
NullType,
11723
NullType,
11724
NullType,
11725
NullType,
11726
NullType>
11727
{
11728
typedef detail::KernelFunctorGlobal<
11729
T0,
11730
T1,
11731
T2,
11732
T3,
11733
NullType,
11734
NullType,
11735
NullType,
11736
NullType,
11737
NullType,
11738
NullType,
11739
NullType,
11740
NullType,
11741
NullType,
11742
NullType,
11743
NullType,
11744
NullType,
11745
NullType,
11746
NullType,
11747
NullType,
11748
NullType,
11749
NullType,
11750
NullType,
11751
NullType,
11752
NullType,
11753
NullType,
11754
NullType,
11755
NullType,
11756
NullType,
11757
NullType,
11758
NullType,
11759
NullType,
11760
NullType> FunctorType;
11761
11762
FunctorType functor_;
11763
11764
functionImplementation_(const FunctorType &functor) :
11765
functor_(functor)
11766
{
11767
11768
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4))
11769
// Fail variadic expansion for dev11
11770
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11771
#endif
11772
11773
}
11774
11775
//! \brief Return type of the functor
11776
typedef Event result_type;
11777
11778
//! \brief Function signature of kernel functor with no event dependency.
11779
typedef Event type_(
11780
const EnqueueArgs&,
11781
T0,
11782
T1,
11783
T2,
11784
T3);
11785
11786
Event operator()(
11787
const EnqueueArgs& enqueueArgs,
11788
T0 arg0,
11789
T1 arg1,
11790
T2 arg2,
11791
T3 arg3)
11792
{
11793
return functor_(
11794
enqueueArgs,
11795
arg0,
11796
arg1,
11797
arg2,
11798
arg3);
11799
}
11800
11801
11802
};
11803
11804
template<
11805
typename T0,
11806
typename T1,
11807
typename T2>
11808
struct functionImplementation_
11809
< T0,
11810
T1,
11811
T2,
11812
NullType,
11813
NullType,
11814
NullType,
11815
NullType,
11816
NullType,
11817
NullType,
11818
NullType,
11819
NullType,
11820
NullType,
11821
NullType,
11822
NullType,
11823
NullType,
11824
NullType,
11825
NullType,
11826
NullType,
11827
NullType,
11828
NullType,
11829
NullType,
11830
NullType,
11831
NullType,
11832
NullType,
11833
NullType,
11834
NullType,
11835
NullType,
11836
NullType,
11837
NullType,
11838
NullType,
11839
NullType,
11840
NullType>
11841
{
11842
typedef detail::KernelFunctorGlobal<
11843
T0,
11844
T1,
11845
T2,
11846
NullType,
11847
NullType,
11848
NullType,
11849
NullType,
11850
NullType,
11851
NullType,
11852
NullType,
11853
NullType,
11854
NullType,
11855
NullType,
11856
NullType,
11857
NullType,
11858
NullType,
11859
NullType,
11860
NullType,
11861
NullType,
11862
NullType,
11863
NullType,
11864
NullType,
11865
NullType,
11866
NullType,
11867
NullType,
11868
NullType,
11869
NullType,
11870
NullType,
11871
NullType,
11872
NullType,
11873
NullType,
11874
NullType> FunctorType;
11875
11876
FunctorType functor_;
11877
11878
functionImplementation_(const FunctorType &functor) :
11879
functor_(functor)
11880
{
11881
11882
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3))
11883
// Fail variadic expansion for dev11
11884
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11885
#endif
11886
11887
}
11888
11889
//! \brief Return type of the functor
11890
typedef Event result_type;
11891
11892
//! \brief Function signature of kernel functor with no event dependency.
11893
typedef Event type_(
11894
const EnqueueArgs&,
11895
T0,
11896
T1,
11897
T2);
11898
11899
Event operator()(
11900
const EnqueueArgs& enqueueArgs,
11901
T0 arg0,
11902
T1 arg1,
11903
T2 arg2)
11904
{
11905
return functor_(
11906
enqueueArgs,
11907
arg0,
11908
arg1,
11909
arg2);
11910
}
11911
11912
11913
};
11914
11915
template<
11916
typename T0,
11917
typename T1>
11918
struct functionImplementation_
11919
< T0,
11920
T1,
11921
NullType,
11922
NullType,
11923
NullType,
11924
NullType,
11925
NullType,
11926
NullType,
11927
NullType,
11928
NullType,
11929
NullType,
11930
NullType,
11931
NullType,
11932
NullType,
11933
NullType,
11934
NullType,
11935
NullType,
11936
NullType,
11937
NullType,
11938
NullType,
11939
NullType,
11940
NullType,
11941
NullType,
11942
NullType,
11943
NullType,
11944
NullType,
11945
NullType,
11946
NullType,
11947
NullType,
11948
NullType,
11949
NullType,
11950
NullType>
11951
{
11952
typedef detail::KernelFunctorGlobal<
11953
T0,
11954
T1,
11955
NullType,
11956
NullType,
11957
NullType,
11958
NullType,
11959
NullType,
11960
NullType,
11961
NullType,
11962
NullType,
11963
NullType,
11964
NullType,
11965
NullType,
11966
NullType,
11967
NullType,
11968
NullType,
11969
NullType,
11970
NullType,
11971
NullType,
11972
NullType,
11973
NullType,
11974
NullType,
11975
NullType,
11976
NullType,
11977
NullType,
11978
NullType,
11979
NullType,
11980
NullType,
11981
NullType,
11982
NullType,
11983
NullType,
11984
NullType> FunctorType;
11985
11986
FunctorType functor_;
11987
11988
functionImplementation_(const FunctorType &functor) :
11989
functor_(functor)
11990
{
11991
11992
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2))
11993
// Fail variadic expansion for dev11
11994
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11995
#endif
11996
11997
}
11998
11999
//! \brief Return type of the functor
12000
typedef Event result_type;
12001
12002
//! \brief Function signature of kernel functor with no event dependency.
12003
typedef Event type_(
12004
const EnqueueArgs&,
12005
T0,
12006
T1);
12007
12008
Event operator()(
12009
const EnqueueArgs& enqueueArgs,
12010
T0 arg0,
12011
T1 arg1)
12012
{
12013
return functor_(
12014
enqueueArgs,
12015
arg0,
12016
arg1);
12017
}
12018
12019
12020
};
12021
12022
template<
12023
typename T0>
12024
struct functionImplementation_
12025
< T0,
12026
NullType,
12027
NullType,
12028
NullType,
12029
NullType,
12030
NullType,
12031
NullType,
12032
NullType,
12033
NullType,
12034
NullType,
12035
NullType,
12036
NullType,
12037
NullType,
12038
NullType,
12039
NullType,
12040
NullType,
12041
NullType,
12042
NullType,
12043
NullType,
12044
NullType,
12045
NullType,
12046
NullType,
12047
NullType,
12048
NullType,
12049
NullType,
12050
NullType,
12051
NullType,
12052
NullType,
12053
NullType,
12054
NullType,
12055
NullType,
12056
NullType>
12057
{
12058
typedef detail::KernelFunctorGlobal<
12059
T0,
12060
NullType,
12061
NullType,
12062
NullType,
12063
NullType,
12064
NullType,
12065
NullType,
12066
NullType,
12067
NullType,
12068
NullType,
12069
NullType,
12070
NullType,
12071
NullType,
12072
NullType,
12073
NullType,
12074
NullType,
12075
NullType,
12076
NullType,
12077
NullType,
12078
NullType,
12079
NullType,
12080
NullType,
12081
NullType,
12082
NullType,
12083
NullType,
12084
NullType,
12085
NullType,
12086
NullType,
12087
NullType,
12088
NullType,
12089
NullType,
12090
NullType> FunctorType;
12091
12092
FunctorType functor_;
12093
12094
functionImplementation_(const FunctorType &functor) :
12095
functor_(functor)
12096
{
12097
12098
#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1))
12099
// Fail variadic expansion for dev11
12100
static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12101
#endif
12102
12103
}
12104
12105
//! \brief Return type of the functor
12106
typedef Event result_type;
12107
12108
//! \brief Function signature of kernel functor with no event dependency.
12109
typedef Event type_(
12110
const EnqueueArgs&,
12111
T0);
12112
12113
Event operator()(
12114
const EnqueueArgs& enqueueArgs,
12115
T0 arg0)
12116
{
12117
return functor_(
12118
enqueueArgs,
12119
arg0);
12120
}
12121
12122
12123
};
12124
12125
12126
12127
12128
12129
} // namespace detail
12130
12131
//----------------------------------------------------------------------------------------------
12132
12133
template <
12134
typename T0, typename T1 = detail::NullType, typename T2 = detail::NullType,
12135
typename T3 = detail::NullType, typename T4 = detail::NullType,
12136
typename T5 = detail::NullType, typename T6 = detail::NullType,
12137
typename T7 = detail::NullType, typename T8 = detail::NullType,
12138
typename T9 = detail::NullType, typename T10 = detail::NullType,
12139
typename T11 = detail::NullType, typename T12 = detail::NullType,
12140
typename T13 = detail::NullType, typename T14 = detail::NullType,
12141
typename T15 = detail::NullType, typename T16 = detail::NullType,
12142
typename T17 = detail::NullType, typename T18 = detail::NullType,
12143
typename T19 = detail::NullType, typename T20 = detail::NullType,
12144
typename T21 = detail::NullType, typename T22 = detail::NullType,
12145
typename T23 = detail::NullType, typename T24 = detail::NullType,
12146
typename T25 = detail::NullType, typename T26 = detail::NullType,
12147
typename T27 = detail::NullType, typename T28 = detail::NullType,
12148
typename T29 = detail::NullType, typename T30 = detail::NullType,
12149
typename T31 = detail::NullType
12150
>
12151
struct make_kernel :
12152
public detail::functionImplementation_<
12153
T0, T1, T2, T3,
12154
T4, T5, T6, T7,
12155
T8, T9, T10, T11,
12156
T12, T13, T14, T15,
12157
T16, T17, T18, T19,
12158
T20, T21, T22, T23,
12159
T24, T25, T26, T27,
12160
T28, T29, T30, T31
12161
>
12162
{
12163
public:
12164
typedef detail::KernelFunctorGlobal<
12165
T0, T1, T2, T3,
12166
T4, T5, T6, T7,
12167
T8, T9, T10, T11,
12168
T12, T13, T14, T15,
12169
T16, T17, T18, T19,
12170
T20, T21, T22, T23,
12171
T24, T25, T26, T27,
12172
T28, T29, T30, T31
12173
> FunctorType;
12174
12175
make_kernel(
12176
const Program& program,
12177
const STRING_CLASS name,
12178
cl_int * err = NULL) :
12179
detail::functionImplementation_<
12180
T0, T1, T2, T3,
12181
T4, T5, T6, T7,
12182
T8, T9, T10, T11,
12183
T12, T13, T14, T15,
12184
T16, T17, T18, T19,
12185
T20, T21, T22, T23,
12186
T24, T25, T26, T27,
12187
T28, T29, T30, T31
12188
>(
12189
FunctorType(program, name, err))
12190
{}
12191
12192
make_kernel(
12193
const Kernel kernel) :
12194
detail::functionImplementation_<
12195
T0, T1, T2, T3,
12196
T4, T5, T6, T7,
12197
T8, T9, T10, T11,
12198
T12, T13, T14, T15,
12199
T16, T17, T18, T19,
12200
T20, T21, T22, T23,
12201
T24, T25, T26, T27,
12202
T28, T29, T30, T31
12203
>(
12204
FunctorType(kernel))
12205
{}
12206
};
12207
12208
12209
//----------------------------------------------------------------------------------------------------------------------
12210
12211
#undef __ERR_STR
12212
#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
12213
#undef __GET_DEVICE_INFO_ERR
12214
#undef __GET_PLATFORM_INFO_ERR
12215
#undef __GET_DEVICE_IDS_ERR
12216
#undef __GET_CONTEXT_INFO_ERR
12217
#undef __GET_EVENT_INFO_ERR
12218
#undef __GET_EVENT_PROFILE_INFO_ERR
12219
#undef __GET_MEM_OBJECT_INFO_ERR
12220
#undef __GET_IMAGE_INFO_ERR
12221
#undef __GET_SAMPLER_INFO_ERR
12222
#undef __GET_KERNEL_INFO_ERR
12223
#undef __GET_KERNEL_ARG_INFO_ERR
12224
#undef __GET_KERNEL_WORK_GROUP_INFO_ERR
12225
#undef __GET_PROGRAM_INFO_ERR
12226
#undef __GET_PROGRAM_BUILD_INFO_ERR
12227
#undef __GET_COMMAND_QUEUE_INFO_ERR
12228
12229
#undef __CREATE_CONTEXT_ERR
12230
#undef __CREATE_CONTEXT_FROM_TYPE_ERR
12231
#undef __GET_SUPPORTED_IMAGE_FORMATS_ERR
12232
12233
#undef __CREATE_BUFFER_ERR
12234
#undef __CREATE_SUBBUFFER_ERR
12235
#undef __CREATE_IMAGE2D_ERR
12236
#undef __CREATE_IMAGE3D_ERR
12237
#undef __CREATE_SAMPLER_ERR
12238
#undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR
12239
12240
#undef __CREATE_USER_EVENT_ERR
12241
#undef __SET_USER_EVENT_STATUS_ERR
12242
#undef __SET_EVENT_CALLBACK_ERR
12243
#undef __SET_PRINTF_CALLBACK_ERR
12244
12245
#undef __WAIT_FOR_EVENTS_ERR
12246
12247
#undef __CREATE_KERNEL_ERR
12248
#undef __SET_KERNEL_ARGS_ERR
12249
#undef __CREATE_PROGRAM_WITH_SOURCE_ERR
12250
#undef __CREATE_PROGRAM_WITH_BINARY_ERR
12251
#undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR
12252
#undef __BUILD_PROGRAM_ERR
12253
#undef __CREATE_KERNELS_IN_PROGRAM_ERR
12254
12255
#undef __CREATE_COMMAND_QUEUE_ERR
12256
#undef __SET_COMMAND_QUEUE_PROPERTY_ERR
12257
#undef __ENQUEUE_READ_BUFFER_ERR
12258
#undef __ENQUEUE_WRITE_BUFFER_ERR
12259
#undef __ENQUEUE_READ_BUFFER_RECT_ERR
12260
#undef __ENQUEUE_WRITE_BUFFER_RECT_ERR
12261
#undef __ENQEUE_COPY_BUFFER_ERR
12262
#undef __ENQEUE_COPY_BUFFER_RECT_ERR
12263
#undef __ENQUEUE_READ_IMAGE_ERR
12264
#undef __ENQUEUE_WRITE_IMAGE_ERR
12265
#undef __ENQUEUE_COPY_IMAGE_ERR
12266
#undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR
12267
#undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR
12268
#undef __ENQUEUE_MAP_BUFFER_ERR
12269
#undef __ENQUEUE_MAP_IMAGE_ERR
12270
#undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR
12271
#undef __ENQUEUE_NDRANGE_KERNEL_ERR
12272
#undef __ENQUEUE_TASK_ERR
12273
#undef __ENQUEUE_NATIVE_KERNEL
12274
12275
#undef __CL_EXPLICIT_CONSTRUCTORS
12276
12277
#undef __UNLOAD_COMPILER_ERR
12278
#endif //__CL_USER_OVERRIDE_ERROR_STRINGS
12279
12280
#undef __CL_FUNCTION_TYPE
12281
12282
// Extensions
12283
/**
12284
* Deprecated APIs for 1.2
12285
*/
12286
#if defined(CL_VERSION_1_1)
12287
#undef __INIT_CL_EXT_FCN_PTR
12288
#endif // #if defined(CL_VERSION_1_1)
12289
#undef __CREATE_SUB_DEVICES
12290
12291
#if defined(USE_CL_DEVICE_FISSION)
12292
#undef __PARAM_NAME_DEVICE_FISSION
12293
#endif // USE_CL_DEVICE_FISSION
12294
12295
#undef __DEFAULT_NOT_INITIALIZED
12296
#undef __DEFAULT_BEING_INITIALIZED
12297
#undef __DEFAULT_INITIALIZED
12298
12299
} // namespace cl
12300
12301
#ifdef _WIN32
12302
#pragma pop_macro("max")
12303
#endif // _WIN32
12304
12305
#endif // CL_HPP_
12306
12307