Path: blob/master/3rdparty/include/opencl/1.2/CL/cl.hpp
16348 views
/*******************************************************************************1* Copyright (c) 2008-2013 The Khronos Group Inc.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and/or associated documentation files (the5* "Materials"), to deal in the Materials without restriction, including6* without limitation the rights to use, copy, modify, merge, publish,7* distribute, sublicense, and/or sell copies of the Materials, and to8* permit persons to whom the Materials are furnished to do so, subject to9* the following conditions:10*11* The above copyright notice and this permission notice shall be included12* in all copies or substantial portions of the Materials.13*14* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,15* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.17* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY18* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,19* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE20* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.21******************************************************************************/2223/*! \file24*25* \brief C++ bindings for OpenCL 1.0 (rev 48), OpenCL 1.1 (rev 33) and26* OpenCL 1.2 (rev 15)27* \author Benedict R. Gaster, Laurent Morichetti and Lee Howes28*29* Additions and fixes from:30* Brian Cole, March 3rd 2010 and April 201231* Matt Gruenke, April 2012.32* Bruce Merry, February 2013.33*34* \version 1.2.535* \date June 201336*37* Optional extension support38*39* cl40* cl_ext_device_fission41* #define USE_CL_DEVICE_FISSION42*/4344/*! \mainpage45* \section intro Introduction46* For many large applications C++ is the language of choice and so it seems47* reasonable to define C++ bindings for OpenCL.48*49*50* The interface is contained with a single C++ header file \em cl.hpp and all51* definitions are contained within the namespace \em cl. There is no additional52* requirement to include \em cl.h and to use either the C++ or original C53* bindings it is enough to simply include \em cl.hpp.54*55* The bindings themselves are lightweight and correspond closely to the56* underlying C API. Using the C++ bindings introduces no additional execution57* overhead.58*59* For detail documentation on the bindings see:60*61* The OpenCL C++ Wrapper API 1.2 (revision 09)62* http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf63*64* \section example Example65*66* The following example shows a general use case for the C++67* bindings, including support for the optional exception feature and68* also the supplied vector and string classes, see following sections for69* decriptions of these features.70*71* \code72* #define __CL_ENABLE_EXCEPTIONS73*74* #if defined(__APPLE__) || defined(__MACOSX)75* #include <OpenCL/cl.hpp>76* #else77* #include <CL/cl.hpp>78* #endif79* #include <cstdio>80* #include <cstdlib>81* #include <iostream>82*83* const char * helloStr = "__kernel void "84* "hello(void) "85* "{ "86* " "87* "} ";88*89* int90* main(void)91* {92* cl_int err = CL_SUCCESS;93* try {94*95* std::vector<cl::Platform> platforms;96* cl::Platform::get(&platforms);97* if (platforms.size() == 0) {98* std::cout << "Platform size 0\n";99* return -1;100* }101*102* cl_context_properties properties[] =103* { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};104* cl::Context context(CL_DEVICE_TYPE_CPU, properties);105*106* std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();107*108* cl::Program::Sources source(1,109* std::make_pair(helloStr,strlen(helloStr)));110* cl::Program program_ = cl::Program(context, source);111* program_.build(devices);112*113* cl::Kernel kernel(program_, "hello", &err);114*115* cl::Event event;116* cl::CommandQueue queue(context, devices[0], 0, &err);117* queue.enqueueNDRangeKernel(118* kernel,119* cl::NullRange,120* cl::NDRange(4,4),121* cl::NullRange,122* NULL,123* &event);124*125* event.wait();126* }127* catch (cl::Error err) {128* std::cerr129* << "ERROR: "130* << err.what()131* << "("132* << err.err()133* << ")"134* << std::endl;135* }136*137* return EXIT_SUCCESS;138* }139*140* \endcode141*142*/143#ifndef CL_HPP_144#define CL_HPP_145146#ifdef _WIN32147148#include <windows.h>149#include <malloc.h>150#include <iterator>151#include <intrin.h>152153#if defined(__CL_ENABLE_EXCEPTIONS)154#include <exception>155#endif // #if defined(__CL_ENABLE_EXCEPTIONS)156157#pragma push_macro("max")158#undef max159#if defined(USE_DX_INTEROP)160#include <CL/cl_d3d10.h>161#include <CL/cl_dx9_media_sharing.h>162#endif163#endif // _WIN32164165//166#if defined(USE_CL_DEVICE_FISSION)167#include <CL/cl_ext.h>168#endif169170#if defined(__APPLE__) || defined(__MACOSX)171#include <OpenGL/OpenGL.h>172#include <OpenCL/opencl.h>173#include <libkern/OSAtomic.h>174#else175#include <GL/gl.h>176#include <CL/opencl.h>177#endif // !__APPLE__178179// To avoid accidentally taking ownership of core OpenCL types180// such as cl_kernel constructors are made explicit181// under OpenCL 1.2182#if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)183#define __CL_EXPLICIT_CONSTRUCTORS explicit184#else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)185#define __CL_EXPLICIT_CONSTRUCTORS186#endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)187188// Define deprecated prefixes and suffixes to ensure compilation189// in case they are not pre-defined190#if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)191#define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED192#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)193#if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED)194#define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED195#endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)196197#if !defined(CL_CALLBACK)198#define CL_CALLBACK199#endif //CL_CALLBACK200201#include <utility>202#include <limits>203204#if !defined(__NO_STD_VECTOR)205#include <vector>206#endif207208#if !defined(__NO_STD_STRING)209#include <string>210#endif211212#if defined(__linux__) || defined(__APPLE__) || defined(__MACOSX)213#include <alloca.h>214215#include <emmintrin.h>216#include <xmmintrin.h>217#endif // linux218219#include <cstring>220221222/*! \namespace cl223*224* \brief The OpenCL C++ bindings are defined within this namespace.225*226*/227namespace cl {228229class Memory;230231/**232* Deprecated APIs for 1.2233*/234#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))235#define __INIT_CL_EXT_FCN_PTR(name) \236if(!pfn_##name) { \237pfn_##name = (PFN_##name) \238clGetExtensionFunctionAddress(#name); \239if(!pfn_##name) { \240} \241}242#endif // #if defined(CL_VERSION_1_1)243244#if defined(CL_VERSION_1_2)245#define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \246if(!pfn_##name) { \247pfn_##name = (PFN_##name) \248clGetExtensionFunctionAddressForPlatform(platform, #name); \249if(!pfn_##name) { \250} \251}252#endif // #if defined(CL_VERSION_1_1)253254class Program;255class Device;256class Context;257class CommandQueue;258class Memory;259class Buffer;260261#if defined(__CL_ENABLE_EXCEPTIONS)262/*! \brief Exception class263*264* This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined.265*/266class Error : public std::exception267{268private:269cl_int err_;270const char * errStr_;271public:272/*! \brief Create a new CL error exception for a given error code273* and corresponding message.274*275* \param err error code value.276*277* \param errStr a descriptive string that must remain in scope until278* handling of the exception has concluded. If set, it279* will be returned by what().280*/281Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr)282{}283284~Error() throw() {}285286/*! \brief Get error string associated with exception287*288* \return A memory pointer to the error message string.289*/290virtual const char * what() const throw ()291{292if (errStr_ == NULL) {293return "empty";294}295else {296return errStr_;297}298}299300/*! \brief Get error code associated with exception301*302* \return The error code.303*/304cl_int err(void) const { return err_; }305};306307#define __ERR_STR(x) #x308#else309#define __ERR_STR(x) NULL310#endif // __CL_ENABLE_EXCEPTIONS311312313namespace detail314{315#if defined(__CL_ENABLE_EXCEPTIONS)316static inline cl_int errHandler (317cl_int err,318const char * errStr = NULL)319{320if (err != CL_SUCCESS) {321throw Error(err, errStr);322}323return err;324}325#else326static inline cl_int errHandler (cl_int err, const char * errStr = NULL)327{328(void) errStr; // suppress unused variable warning329return err;330}331#endif // __CL_ENABLE_EXCEPTIONS332}333334335336//! \cond DOXYGEN_DETAIL337#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)338#define __GET_DEVICE_INFO_ERR __ERR_STR(clGetDeviceInfo)339#define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo)340#define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs)341#define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs)342#define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo)343#define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo)344#define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo)345#define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo)346#define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo)347#define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo)348#define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo)349#if defined(CL_VERSION_1_2)350#define __GET_KERNEL_ARG_INFO_ERR __ERR_STR(clGetKernelArgInfo)351#endif // #if defined(CL_VERSION_1_2)352#define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo)353#define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo)354#define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo)355#define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo)356357#define __CREATE_CONTEXT_ERR __ERR_STR(clCreateContext)358#define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType)359#define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats)360361#define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer)362#define __COPY_ERR __ERR_STR(cl::copy)363#define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer)364#define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)365#define __CREATE_GL_RENDER_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)366#define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo)367#if defined(CL_VERSION_1_2)368#define __CREATE_IMAGE_ERR __ERR_STR(clCreateImage)369#define __CREATE_GL_TEXTURE_ERR __ERR_STR(clCreateFromGLTexture)370#define __IMAGE_DIMENSION_ERR __ERR_STR(Incorrect image dimensions)371#endif // #if defined(CL_VERSION_1_2)372#define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler)373#define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback)374375#define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent)376#define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus)377#define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback)378#define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents)379380#define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel)381#define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg)382#define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource)383#define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary)384#if defined(CL_VERSION_1_2)385#define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR __ERR_STR(clCreateProgramWithBuiltInKernels)386#endif // #if defined(CL_VERSION_1_2)387#define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram)388#if defined(CL_VERSION_1_2)389#define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram)390391#endif // #if defined(CL_VERSION_1_2)392#define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram)393394#define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue)395#define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty)396#define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer)397#define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect)398#define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer)399#define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect)400#define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer)401#define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect)402#define __ENQUEUE_FILL_BUFFER_ERR __ERR_STR(clEnqueueFillBuffer)403#define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage)404#define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage)405#define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage)406#define __ENQUEUE_FILL_IMAGE_ERR __ERR_STR(clEnqueueFillImage)407#define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer)408#define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage)409#define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer)410#define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage)411#define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject)412#define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel)413#define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask)414#define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel)415#if defined(CL_VERSION_1_2)416#define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR __ERR_STR(clEnqueueMigrateMemObjects)417#endif // #if defined(CL_VERSION_1_2)418419#define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects)420#define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects)421422423#define __RETAIN_ERR __ERR_STR(Retain Object)424#define __RELEASE_ERR __ERR_STR(Release Object)425#define __FLUSH_ERR __ERR_STR(clFlush)426#define __FINISH_ERR __ERR_STR(clFinish)427#define __VECTOR_CAPACITY_ERR __ERR_STR(Vector capacity error)428429/**430* CL 1.2 version that uses device fission.431*/432#if defined(CL_VERSION_1_2)433#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevices)434#else435#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT)436#endif // #if defined(CL_VERSION_1_2)437438/**439* Deprecated APIs for 1.2440*/441#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))442#define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker)443#define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents)444#define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier)445#define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler)446#define __CREATE_GL_TEXTURE_2D_ERR __ERR_STR(clCreateFromGLTexture2D)447#define __CREATE_GL_TEXTURE_3D_ERR __ERR_STR(clCreateFromGLTexture3D)448#define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D)449#define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D)450#endif // #if defined(CL_VERSION_1_1)451452#endif // __CL_USER_OVERRIDE_ERROR_STRINGS453//! \endcond454455/**456* CL 1.2 marker and barrier commands457*/458#if defined(CL_VERSION_1_2)459#define __ENQUEUE_MARKER_WAIT_LIST_ERR __ERR_STR(clEnqueueMarkerWithWaitList)460#define __ENQUEUE_BARRIER_WAIT_LIST_ERR __ERR_STR(clEnqueueBarrierWithWaitList)461#endif // #if defined(CL_VERSION_1_2)462463#if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING)464typedef std::string STRING_CLASS;465#elif !defined(__USE_DEV_STRING)466467/*! \class string468* \brief Simple string class, that provides a limited subset of std::string469* functionality but avoids many of the issues that come with that class.470471* \note Deprecated. Please use std::string as default or472* re-define the string class to match the std::string473* interface by defining STRING_CLASS474*/475class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED476{477private:478::size_t size_;479char * str_;480public:481//! \brief Constructs an empty string, allocating no memory.482string(void) : size_(0), str_(NULL)483{484}485486/*! \brief Constructs a string populated from an arbitrary value of487* specified size.488*489* An extra '\0' is added, in case none was contained in str.490*491* \param str the initial value of the string instance. Note that '\0'492* characters receive no special treatment. If NULL,493* the string is left empty, with a size of 0.494*495* \param size the number of characters to copy from str.496*/497string(const char * str, ::size_t size) :498size_(size),499str_(NULL)500{501if( size > 0 ) {502str_ = new char[size_+1];503if (str_ != NULL) {504memcpy(str_, str, size_ * sizeof(char));505str_[size_] = '\0';506}507else {508size_ = 0;509}510}511}512513/*! \brief Constructs a string populated from a null-terminated value.514*515* \param str the null-terminated initial value of the string instance.516* If NULL, the string is left empty, with a size of 0.517*/518string(const char * str) :519size_(0),520str_(NULL)521{522if( str ) {523size_= ::strlen(str);524}525if( size_ > 0 ) {526str_ = new char[size_ + 1];527if (str_ != NULL) {528memcpy(str_, str, (size_ + 1) * sizeof(char));529}530}531}532533void resize( ::size_t n )534{535if( size_ == n ) {536return;537}538if (n == 0) {539if( str_ ) {540delete [] str_;541}542str_ = NULL;543size_ = 0;544}545else {546char *newString = new char[n + 1];547int copySize = n;548if( size_ < n ) {549copySize = size_;550}551size_ = n;552553if(str_) {554memcpy(newString, str_, (copySize + 1) * sizeof(char));555}556if( copySize < size_ ) {557memset(newString + copySize, 0, size_ - copySize);558}559newString[size_] = '\0';560561delete [] str_;562str_ = newString;563}564}565566const char& operator[] ( ::size_t pos ) const567{568return str_[pos];569}570571char& operator[] ( ::size_t pos )572{573return str_[pos];574}575576/*! \brief Copies the value of another string to this one.577*578* \param rhs the string to copy.579*580* \returns a reference to the modified instance.581*/582string& operator=(const string& rhs)583{584if (this == &rhs) {585return *this;586}587588if( str_ != NULL ) {589delete [] str_;590str_ = NULL;591size_ = 0;592}593594if (rhs.size_ == 0 || rhs.str_ == NULL) {595str_ = NULL;596size_ = 0;597}598else {599str_ = new char[rhs.size_ + 1];600size_ = rhs.size_;601602if (str_ != NULL) {603memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char));604}605else {606size_ = 0;607}608}609610return *this;611}612613/*! \brief Constructs a string by copying the value of another instance.614*615* \param rhs the string to copy.616*/617string(const string& rhs) :618size_(0),619str_(NULL)620{621*this = rhs;622}623624//! \brief Destructor - frees memory used to hold the current value.625~string()626{627delete[] str_;628str_ = NULL;629}630631//! \brief Queries the length of the string, excluding any added '\0's.632::size_t size(void) const { return size_; }633634//! \brief Queries the length of the string, excluding any added '\0's.635::size_t length(void) const { return size(); }636637/*! \brief Returns a pointer to the private copy held by this instance,638* or "" if empty/unset.639*/640const char * c_str(void) const { return (str_) ? str_ : "";}641};642typedef cl::string STRING_CLASS;643#endif // #elif !defined(__USE_DEV_STRING)644645#if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)646#define VECTOR_CLASS std::vector647#elif !defined(__USE_DEV_VECTOR)648#define VECTOR_CLASS cl::vector649650#if !defined(__MAX_DEFAULT_VECTOR_SIZE)651#define __MAX_DEFAULT_VECTOR_SIZE 10652#endif653654/*! \class vector655* \brief Fixed sized vector implementation that mirroring656*657* \note Deprecated. Please use std::vector as default or658* re-define the vector class to match the std::vector659* interface by defining VECTOR_CLASS660661* \note Not recommended for use with custom objects as662* current implementation will construct N elements663*664* std::vector functionality.665* \brief Fixed sized vector compatible with std::vector.666*667* \note668* This differs from std::vector<> not just in memory allocation,669* but also in terms of when members are constructed, destroyed,670* and assigned instead of being copy constructed.671*672* \param T type of element contained in the vector.673*674* \param N maximum size of the vector.675*/676template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE>677class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED678{679private:680T data_[N];681unsigned int size_;682683public:684//! \brief Constructs an empty vector with no memory allocated.685vector() :686size_(static_cast<unsigned int>(0))687{}688689//! \brief Deallocates the vector's memory and destroys all of its elements.690~vector()691{692clear();693}694695//! \brief Returns the number of elements currently contained.696unsigned int size(void) const697{698return size_;699}700701/*! \brief Empties the vector of all elements.702* \note703* This does not deallocate memory but will invoke destructors704* on contained elements.705*/706void clear()707{708while(!empty()) {709pop_back();710}711}712713/*! \brief Appends an element after the last valid element.714* Calling this on a vector that has reached capacity will throw an715* exception if exceptions are enabled.716*/717void push_back (const T& x)718{719if (size() < N) {720new (&data_[size_]) T(x);721size_++;722} else {723detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);724}725}726727/*! \brief Removes the last valid element from the vector.728* Calling this on an empty vector will throw an exception729* if exceptions are enabled.730*/731void pop_back(void)732{733if (size_ != 0) {734--size_;735data_[size_].~T();736} else {737detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);738}739}740741/*! \brief Constructs with a value copied from another.742*743* \param vec the vector to copy.744*/745vector(const vector<T, N>& vec) :746size_(vec.size_)747{748if (size_ != 0) {749assign(vec.begin(), vec.end());750}751}752753/*! \brief Constructs with a specified number of initial elements.754*755* \param size number of initial elements.756*757* \param val value of initial elements.758*/759vector(unsigned int size, const T& val = T()) :760size_(0)761{762for (unsigned int i = 0; i < size; i++) {763push_back(val);764}765}766767/*! \brief Overwrites the current content with that copied from another768* instance.769*770* \param rhs vector to copy.771*772* \returns a reference to this.773*/774vector<T, N>& operator=(const vector<T, N>& rhs)775{776if (this == &rhs) {777return *this;778}779780if (rhs.size_ != 0) {781assign(rhs.begin(), rhs.end());782} else {783clear();784}785786return *this;787}788789/*! \brief Tests equality against another instance.790*791* \param vec the vector against which to compare.792*/793bool operator==(vector<T,N> &vec)794{795if (size() != vec.size()) {796return false;797}798799for( unsigned int i = 0; i < size(); ++i ) {800if( operator[](i) != vec[i] ) {801return false;802}803}804return true;805}806807//! \brief Conversion operator to T*.808operator T* () { return data_; }809810//! \brief Conversion operator to const T*.811operator const T* () const { return data_; }812813//! \brief Tests whether this instance has any elements.814bool empty (void) const815{816return size_==0;817}818819//! \brief Returns the maximum number of elements this instance can hold.820unsigned int max_size (void) const821{822return N;823}824825//! \brief Returns the maximum number of elements this instance can hold.826unsigned int capacity () const827{828return N;829}830831/*! \brief Returns a reference to a given element.832*833* \param index which element to access. *834* \note835* The caller is responsible for ensuring index is >= 0 and < size().836*/837T& operator[](int index)838{839return data_[index];840}841842/*! \brief Returns a const reference to a given element.843*844* \param index which element to access.845*846* \note847* The caller is responsible for ensuring index is >= 0 and < size().848*/849const T& operator[](int index) const850{851return data_[index];852}853854/*! \brief Assigns elements of the vector based on a source iterator range.855*856* \param start Beginning iterator of source range857* \param end Enditerator of source range858*859* \note860* Will throw an exception if exceptions are enabled and size exceeded.861*/862template<class I>863void assign(I start, I end)864{865clear();866while(start != end) {867push_back(*start);868start++;869}870}871872/*! \class iterator873* \brief Const iterator class for vectors874*/875class iterator876{877private:878const vector<T,N> *vec_;879int index_;880881/**882* Internal iterator constructor to capture reference883* to the vector it iterates over rather than taking884* the vector by copy.885*/886iterator (const vector<T,N> &vec, int index) :887vec_(&vec)888{889if( !vec.empty() ) {890index_ = index;891} else {892index_ = -1;893}894}895896public:897iterator(void) :898index_(-1),899vec_(NULL)900{901}902903iterator(const iterator& rhs) :904vec_(rhs.vec_),905index_(rhs.index_)906{907}908909~iterator(void) {}910911static iterator begin(const cl::vector<T,N> &vec)912{913iterator i(vec, 0);914915return i;916}917918static iterator end(const cl::vector<T,N> &vec)919{920iterator i(vec, vec.size());921922return i;923}924925bool operator==(iterator i)926{927return ((vec_ == i.vec_) &&928(index_ == i.index_));929}930931bool operator!=(iterator i)932{933return (!(*this==i));934}935936iterator& operator++()937{938++index_;939return *this;940}941942iterator operator++(int)943{944iterator retVal(*this);945++index_;946return retVal;947}948949iterator& operator--()950{951--index_;952return *this;953}954955iterator operator--(int)956{957iterator retVal(*this);958--index_;959return retVal;960}961962const T& operator *() const963{964return (*vec_)[index_];965}966};967968iterator begin(void)969{970return iterator::begin(*this);971}972973iterator begin(void) const974{975return iterator::begin(*this);976}977978iterator end(void)979{980return iterator::end(*this);981}982983iterator end(void) const984{985return iterator::end(*this);986}987988T& front(void)989{990return data_[0];991}992993T& back(void)994{995return data_[size_];996}997998const T& front(void) const999{1000return data_[0];1001}10021003const T& back(void) const1004{1005return data_[size_-1];1006}1007};1008#endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)100910101011101210131014namespace detail {1015#define __DEFAULT_NOT_INITIALIZED 11016#define __DEFAULT_BEING_INITIALIZED 21017#define __DEFAULT_INITIALIZED 410181019/*1020* Compare and exchange primitives are needed for handling of defaults1021*/1022inline int compare_exchange(volatile int * dest, int exchange, int comparand)1023{1024#ifdef _WIN321025return (int)(InterlockedCompareExchange(1026(volatile long*)dest,1027(long)exchange,1028(long)comparand));1029#elif defined(__APPLE__) || defined(__MACOSX)1030return OSAtomicOr32Orig((uint32_t)exchange, (volatile uint32_t*)dest);1031#else // !_WIN32 || defined(__APPLE__) || defined(__MACOSX)1032return (__sync_val_compare_and_swap(1033dest,1034comparand,1035exchange));1036#endif // !_WIN321037}10381039inline void fence() { _mm_mfence(); }1040}; // namespace detail104110421043/*! \brief class used to interface between C++ and1044* OpenCL C calls that require arrays of size_t values, whose1045* size is known statically.1046*/1047template <int N>1048class size_t1049{1050private:1051::size_t data_[N];10521053public:1054//! \brief Initialize size_t to all 0s1055size_t()1056{1057for( int i = 0; i < N; ++i ) {1058data_[i] = 0;1059}1060}10611062::size_t& operator[](int index)1063{1064return data_[index];1065}10661067const ::size_t& operator[](int index) const1068{1069return data_[index];1070}10711072//! \brief Conversion operator to T*.1073operator ::size_t* () { return data_; }10741075//! \brief Conversion operator to const T*.1076operator const ::size_t* () const { return data_; }1077};10781079namespace detail {10801081// Generic getInfoHelper. The final parameter is used to guide overload1082// resolution: the actual parameter passed is an int, which makes this1083// a worse conversion sequence than a specialization that declares the1084// parameter as an int.1085template<typename Functor, typename T>1086inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)1087{1088return f(name, sizeof(T), param, NULL);1089}10901091// Specialized getInfoHelper for VECTOR_CLASS params1092template <typename Func, typename T>1093inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, long)1094{1095::size_t required;1096cl_int err = f(name, 0, NULL, &required);1097if (err != CL_SUCCESS) {1098return err;1099}11001101T* value = (T*) alloca(required);1102err = f(name, required, value, NULL);1103if (err != CL_SUCCESS) {1104return err;1105}11061107param->assign(&value[0], &value[required/sizeof(T)]);1108return CL_SUCCESS;1109}11101111/* Specialization for reference-counted types. This depends on the1112* existence of Wrapper<T>::cl_type, and none of the other types having the1113* cl_type member. Note that simplify specifying the parameter as Wrapper<T>1114* does not work, because when using a derived type (e.g. Context) the generic1115* template will provide a better match.1116*/1117template <typename Func, typename T>1118inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, int, typename T::cl_type = 0)1119{1120::size_t required;1121cl_int err = f(name, 0, NULL, &required);1122if (err != CL_SUCCESS) {1123return err;1124}11251126typename T::cl_type * value = (typename T::cl_type *) alloca(required);1127err = f(name, required, value, NULL);1128if (err != CL_SUCCESS) {1129return err;1130}11311132::size_t elements = required / sizeof(typename T::cl_type);1133param->assign(&value[0], &value[elements]);1134for (::size_t i = 0; i < elements; i++)1135{1136if (value[i] != NULL)1137{1138err = (*param)[i].retain();1139if (err != CL_SUCCESS) {1140return err;1141}1142}1143}1144return CL_SUCCESS;1145}11461147// Specialized for getInfo<CL_PROGRAM_BINARIES>1148template <typename Func>1149inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, int)1150{1151cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);11521153if (err != CL_SUCCESS) {1154return err;1155}11561157return CL_SUCCESS;1158}11591160// Specialized GetInfoHelper for STRING_CLASS params1161template <typename Func>1162inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)1163{1164::size_t required;1165cl_int err = f(name, 0, NULL, &required);1166if (err != CL_SUCCESS) {1167return err;1168}11691170char* value = (char*) alloca(required);1171err = f(name, required, value, NULL);1172if (err != CL_SUCCESS) {1173return err;1174}11751176*param = value;1177return CL_SUCCESS;1178}11791180// Specialized GetInfoHelper for cl::size_t params1181template <typename Func, ::size_t N>1182inline cl_int getInfoHelper(Func f, cl_uint name, size_t<N>* param, long)1183{1184::size_t required;1185cl_int err = f(name, 0, NULL, &required);1186if (err != CL_SUCCESS) {1187return err;1188}11891190::size_t* value = (::size_t*) alloca(required);1191err = f(name, required, value, NULL);1192if (err != CL_SUCCESS) {1193return err;1194}11951196for(int i = 0; i < N; ++i) {1197(*param)[i] = value[i];1198}11991200return CL_SUCCESS;1201}12021203template<typename T> struct ReferenceHandler;12041205/* Specialization for reference-counted types. This depends on the1206* existence of Wrapper<T>::cl_type, and none of the other types having the1207* cl_type member. Note that simplify specifying the parameter as Wrapper<T>1208* does not work, because when using a derived type (e.g. Context) the generic1209* template will provide a better match.1210*/1211template<typename Func, typename T>1212inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)1213{1214typename T::cl_type value;1215cl_int err = f(name, sizeof(value), &value, NULL);1216if (err != CL_SUCCESS) {1217return err;1218}1219*param = value;1220if (value != NULL)1221{1222err = param->retain();1223if (err != CL_SUCCESS) {1224return err;1225}1226}1227return CL_SUCCESS;1228}12291230#define __PARAM_NAME_INFO_1_0(F) \1231F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \1232F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \1233F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \1234F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \1235F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \1236\1237F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \1238F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \1239F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \1240F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \1241F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \1242F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \1243F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \1244F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \1245F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \1246F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \1247F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \1248F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \1249F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \1250F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \1251F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \1252F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \1253F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \1254F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \1255F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \1256F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \1257F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \1258F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \1259F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \1260F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \1261F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \1262F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \1263F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \1264F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \1265F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \1266F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\1267F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \1268F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \1269F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \1270F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \1271F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \1272F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \1273F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \1274F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \1275F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \1276F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \1277F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \1278F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \1279F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \1280F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \1281F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \1282F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \1283F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \1284F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \1285F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \1286F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \1287\1288F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \1289F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS<Device>) \1290F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS<cl_context_properties>) \1291\1292F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \1293F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \1294F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \1295F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_uint) \1296\1297F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \1298F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \1299F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \1300F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \1301\1302F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \1303F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \1304F(cl_mem_info, CL_MEM_SIZE, ::size_t) \1305F(cl_mem_info, CL_MEM_HOST_PTR, void*) \1306F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \1307F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \1308F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \1309\1310F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \1311F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \1312F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \1313F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \1314F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \1315F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \1316F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \1317\1318F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \1319F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \1320F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \1321F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \1322F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \1323\1324F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \1325F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \1326F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \1327F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS<Device>) \1328F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \1329F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \1330F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS<char *>) \1331\1332F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \1333F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \1334F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \1335\1336F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \1337F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \1338F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \1339F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \1340F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \1341\1342F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \1343F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \1344F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \1345\1346F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \1347F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \1348F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \1349F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties)13501351#if defined(CL_VERSION_1_1)1352#define __PARAM_NAME_INFO_1_1(F) \1353F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\1354F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \1355F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \1356F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \1357F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \1358F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \1359F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \1360F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \1361F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \1362F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \1363F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \1364F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \1365F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \1366\1367F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \1368F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \1369\1370F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \1371F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \1372\1373F(cl_event_info, CL_EVENT_CONTEXT, cl::Context)1374#endif // CL_VERSION_1_1137513761377#if defined(CL_VERSION_1_2)1378#define __PARAM_NAME_INFO_1_2(F) \1379F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \1380\1381F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \1382F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \1383\1384F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \1385\1386F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \1387\1388F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \1389F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \1390F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \1391F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \1392\1393F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \1394F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \1395F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS<cl_device_partition_property>) \1396F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint) \1397F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, ::size_t) \1398F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \1399F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS)1400#endif // #if defined(CL_VERSION_1_2)14011402#if defined(USE_CL_DEVICE_FISSION)1403#define __PARAM_NAME_DEVICE_FISSION(F) \1404F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \1405F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \1406F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \1407F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \1408F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS<cl_device_partition_property_ext>)1409#endif // USE_CL_DEVICE_FISSION14101411template <typename enum_type, cl_int Name>1412struct param_traits {};14131414#define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \1415struct token; \1416template<> \1417struct param_traits<detail:: token,param_name> \1418{ \1419enum { value = param_name }; \1420typedef T param_type; \1421};14221423__PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS)1424#if defined(CL_VERSION_1_1)1425__PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS)1426#endif // CL_VERSION_1_11427#if defined(CL_VERSION_1_2)1428__PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS)1429#endif // CL_VERSION_1_114301431#if defined(USE_CL_DEVICE_FISSION)1432__PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS);1433#endif // USE_CL_DEVICE_FISSION14341435#ifdef CL_PLATFORM_ICD_SUFFIX_KHR1436__CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS)1437#endif14381439#ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD1440__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong)1441#endif14421443#ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD1444__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>)1445#endif1446#ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD1447__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint)1448#endif1449#ifdef CL_DEVICE_SIMD_WIDTH_AMD1450__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint)1451#endif1452#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD1453__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint)1454#endif1455#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD1456__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint)1457#endif1458#ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD1459__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint)1460#endif1461#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD1462__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint)1463#endif1464#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD1465__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint)1466#endif1467#ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD1468__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint)1469#endif1470#ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD1471__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint)1472#endif14731474#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV1475__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint)1476#endif1477#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV1478__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint)1479#endif1480#ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV1481__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint)1482#endif1483#ifdef CL_DEVICE_WARP_SIZE_NV1484__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint)1485#endif1486#ifdef CL_DEVICE_GPU_OVERLAP_NV1487__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool)1488#endif1489#ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV1490__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool)1491#endif1492#ifdef CL_DEVICE_INTEGRATED_MEMORY_NV1493__CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool)1494#endif14951496// Convenience functions14971498template <typename Func, typename T>1499inline cl_int1500getInfo(Func f, cl_uint name, T* param)1501{1502return getInfoHelper(f, name, param, 0);1503}15041505template <typename Func, typename Arg0>1506struct GetInfoFunctor01507{1508Func f_; const Arg0& arg0_;1509cl_int operator ()(1510cl_uint param, ::size_t size, void* value, ::size_t* size_ret)1511{ return f_(arg0_, param, size, value, size_ret); }1512};15131514template <typename Func, typename Arg0, typename Arg1>1515struct GetInfoFunctor11516{1517Func f_; const Arg0& arg0_; const Arg1& arg1_;1518cl_int operator ()(1519cl_uint param, ::size_t size, void* value, ::size_t* size_ret)1520{ return f_(arg0_, arg1_, param, size, value, size_ret); }1521};15221523template <typename Func, typename Arg0, typename T>1524inline cl_int1525getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)1526{1527GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };1528return getInfoHelper(f0, name, param, 0);1529}15301531template <typename Func, typename Arg0, typename Arg1, typename T>1532inline cl_int1533getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)1534{1535GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };1536return getInfoHelper(f0, name, param, 0);1537}15381539template<typename T>1540struct ReferenceHandler1541{ };15421543#if defined(CL_VERSION_1_2)1544/**1545* OpenCL 1.2 devices do have retain/release.1546*/1547template <>1548struct ReferenceHandler<cl_device_id>1549{1550/**1551* Retain the device.1552* \param device A valid device created using createSubDevices1553* \return1554* CL_SUCCESS if the function executed successfully.1555* CL_INVALID_DEVICE if device was not a valid subdevice1556* CL_OUT_OF_RESOURCES1557* CL_OUT_OF_HOST_MEMORY1558*/1559static cl_int retain(cl_device_id device)1560{ return ::clRetainDevice(device); }1561/**1562* Retain the device.1563* \param device A valid device created using createSubDevices1564* \return1565* CL_SUCCESS if the function executed successfully.1566* CL_INVALID_DEVICE if device was not a valid subdevice1567* CL_OUT_OF_RESOURCES1568* CL_OUT_OF_HOST_MEMORY1569*/1570static cl_int release(cl_device_id device)1571{ return ::clReleaseDevice(device); }1572};1573#else // #if defined(CL_VERSION_1_2)1574/**1575* OpenCL 1.1 devices do not have retain/release.1576*/1577template <>1578struct ReferenceHandler<cl_device_id>1579{1580// cl_device_id does not have retain().1581static cl_int retain(cl_device_id)1582{ return CL_SUCCESS; }1583// cl_device_id does not have release().1584static cl_int release(cl_device_id)1585{ return CL_SUCCESS; }1586};1587#endif // #if defined(CL_VERSION_1_2)15881589template <>1590struct ReferenceHandler<cl_platform_id>1591{1592// cl_platform_id does not have retain().1593static cl_int retain(cl_platform_id)1594{ return CL_SUCCESS; }1595// cl_platform_id does not have release().1596static cl_int release(cl_platform_id)1597{ return CL_SUCCESS; }1598};15991600template <>1601struct ReferenceHandler<cl_context>1602{1603static cl_int retain(cl_context context)1604{ return ::clRetainContext(context); }1605static cl_int release(cl_context context)1606{ return ::clReleaseContext(context); }1607};16081609template <>1610struct ReferenceHandler<cl_command_queue>1611{1612static cl_int retain(cl_command_queue queue)1613{ return ::clRetainCommandQueue(queue); }1614static cl_int release(cl_command_queue queue)1615{ return ::clReleaseCommandQueue(queue); }1616};16171618template <>1619struct ReferenceHandler<cl_mem>1620{1621static cl_int retain(cl_mem memory)1622{ return ::clRetainMemObject(memory); }1623static cl_int release(cl_mem memory)1624{ return ::clReleaseMemObject(memory); }1625};16261627template <>1628struct ReferenceHandler<cl_sampler>1629{1630static cl_int retain(cl_sampler sampler)1631{ return ::clRetainSampler(sampler); }1632static cl_int release(cl_sampler sampler)1633{ return ::clReleaseSampler(sampler); }1634};16351636template <>1637struct ReferenceHandler<cl_program>1638{1639static cl_int retain(cl_program program)1640{ return ::clRetainProgram(program); }1641static cl_int release(cl_program program)1642{ return ::clReleaseProgram(program); }1643};16441645template <>1646struct ReferenceHandler<cl_kernel>1647{1648static cl_int retain(cl_kernel kernel)1649{ return ::clRetainKernel(kernel); }1650static cl_int release(cl_kernel kernel)1651{ return ::clReleaseKernel(kernel); }1652};16531654template <>1655struct ReferenceHandler<cl_event>1656{1657static cl_int retain(cl_event event)1658{ return ::clRetainEvent(event); }1659static cl_int release(cl_event event)1660{ return ::clReleaseEvent(event); }1661};166216631664// Extracts version number with major in the upper 16 bits, minor in the lower 161665static cl_uint getVersion(const char *versionInfo)1666{1667int highVersion = 0;1668int lowVersion = 0;1669int index = 7;1670while(versionInfo[index] != '.' ) {1671highVersion *= 10;1672highVersion += versionInfo[index]-'0';1673++index;1674}1675++index;1676while(versionInfo[index] != ' ' ) {1677lowVersion *= 10;1678lowVersion += versionInfo[index]-'0';1679++index;1680}1681return (highVersion << 16) | lowVersion;1682}16831684static cl_uint getPlatformVersion(cl_platform_id platform)1685{1686::size_t size = 0;1687clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);1688char *versionInfo = (char *) alloca(size);1689clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size);1690return getVersion(versionInfo);1691}16921693static cl_uint getDevicePlatformVersion(cl_device_id device)1694{1695cl_platform_id platform;1696clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);1697return getPlatformVersion(platform);1698}16991700#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)1701static cl_uint getContextPlatformVersion(cl_context context)1702{1703// The platform cannot be queried directly, so we first have to grab a1704// device and obtain its context1705::size_t size = 0;1706clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);1707if (size == 0)1708return 0;1709cl_device_id *devices = (cl_device_id *) alloca(size);1710clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL);1711return getDevicePlatformVersion(devices[0]);1712}1713#endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)17141715template <typename T>1716class Wrapper1717{1718public:1719typedef T cl_type;17201721protected:1722cl_type object_;17231724public:1725Wrapper() : object_(NULL) { }17261727Wrapper(const cl_type &obj) : object_(obj) { }17281729~Wrapper()1730{1731if (object_ != NULL) { release(); }1732}17331734Wrapper(const Wrapper<cl_type>& rhs)1735{1736object_ = rhs.object_;1737if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }1738}17391740Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)1741{1742if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }1743object_ = rhs.object_;1744if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }1745return *this;1746}17471748Wrapper<cl_type>& operator = (const cl_type &rhs)1749{1750if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }1751object_ = rhs;1752return *this;1753}17541755cl_type operator ()() const { return object_; }17561757cl_type& operator ()() { return object_; }17581759protected:1760template<typename Func, typename U>1761friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);17621763cl_int retain() const1764{1765return ReferenceHandler<cl_type>::retain(object_);1766}17671768cl_int release() const1769{1770return ReferenceHandler<cl_type>::release(object_);1771}1772};17731774template <>1775class Wrapper<cl_device_id>1776{1777public:1778typedef cl_device_id cl_type;17791780protected:1781cl_type object_;1782bool referenceCountable_;17831784static bool isReferenceCountable(cl_device_id device)1785{1786bool retVal = false;1787if (device != NULL) {1788int version = getDevicePlatformVersion(device);1789if(version > ((1 << 16) + 1)) {1790retVal = true;1791}1792}1793return retVal;1794}17951796public:1797Wrapper() : object_(NULL), referenceCountable_(false)1798{1799}18001801Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false)1802{1803referenceCountable_ = isReferenceCountable(obj);1804}18051806~Wrapper()1807{1808if (object_ != NULL) { release(); }1809}18101811Wrapper(const Wrapper<cl_type>& rhs)1812{1813object_ = rhs.object_;1814referenceCountable_ = isReferenceCountable(object_);1815if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }1816}18171818Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)1819{1820if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }1821object_ = rhs.object_;1822referenceCountable_ = rhs.referenceCountable_;1823if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }1824return *this;1825}18261827Wrapper<cl_type>& operator = (const cl_type &rhs)1828{1829if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }1830object_ = rhs;1831referenceCountable_ = isReferenceCountable(object_);1832return *this;1833}18341835cl_type operator ()() const { return object_; }18361837cl_type& operator ()() { return object_; }18381839protected:1840template<typename Func, typename U>1841friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);18421843template<typename Func, typename U>1844friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS<U>*, int, typename U::cl_type);18451846cl_int retain() const1847{1848if( referenceCountable_ ) {1849return ReferenceHandler<cl_type>::retain(object_);1850}1851else {1852return CL_SUCCESS;1853}1854}18551856cl_int release() const1857{1858if( referenceCountable_ ) {1859return ReferenceHandler<cl_type>::release(object_);1860}1861else {1862return CL_SUCCESS;1863}1864}1865};18661867} // namespace detail1868//! \endcond18691870/*! \stuct ImageFormat1871* \brief Adds constructors and member functions for cl_image_format.1872*1873* \see cl_image_format1874*/1875struct ImageFormat : public cl_image_format1876{1877//! \brief Default constructor - performs no initialization.1878ImageFormat(){}18791880//! \brief Initializing constructor.1881ImageFormat(cl_channel_order order, cl_channel_type type)1882{1883image_channel_order = order;1884image_channel_data_type = type;1885}18861887//! \brief Assignment operator.1888ImageFormat& operator = (const ImageFormat& rhs)1889{1890if (this != &rhs) {1891this->image_channel_data_type = rhs.image_channel_data_type;1892this->image_channel_order = rhs.image_channel_order;1893}1894return *this;1895}1896};18971898/*! \brief Class interface for cl_device_id.1899*1900* \note Copies of these objects are inexpensive, since they don't 'own'1901* any underlying resources or data structures.1902*1903* \see cl_device_id1904*/1905class Device : public detail::Wrapper<cl_device_id>1906{1907public:1908//! \brief Default constructor - initializes to NULL.1909Device() : detail::Wrapper<cl_type>() { }19101911/*! \brief Copy constructor.1912*1913* This simply copies the device ID value, which is an inexpensive operation.1914*/1915Device(const Device& device) : detail::Wrapper<cl_type>(device) { }19161917/*! \brief Constructor from cl_device_id.1918*1919* This simply copies the device ID value, which is an inexpensive operation.1920*/1921Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { }19221923/*! \brief Returns the first device on the default context.1924*1925* \see Context::getDefault()1926*/1927static Device getDefault(cl_int * err = NULL);19281929/*! \brief Assignment operator from Device.1930*1931* This simply copies the device ID value, which is an inexpensive operation.1932*/1933Device& operator = (const Device& rhs)1934{1935if (this != &rhs) {1936detail::Wrapper<cl_type>::operator=(rhs);1937}1938return *this;1939}19401941/*! \brief Assignment operator from cl_device_id.1942*1943* This simply copies the device ID value, which is an inexpensive operation.1944*/1945Device& operator = (const cl_device_id& rhs)1946{1947detail::Wrapper<cl_type>::operator=(rhs);1948return *this;1949}19501951//! \brief Wrapper for clGetDeviceInfo().1952template <typename T>1953cl_int getInfo(cl_device_info name, T* param) const1954{1955return detail::errHandler(1956detail::getInfo(&::clGetDeviceInfo, object_, name, param),1957__GET_DEVICE_INFO_ERR);1958}19591960//! \brief Wrapper for clGetDeviceInfo() that returns by value.1961template <cl_int name> typename1962detail::param_traits<detail::cl_device_info, name>::param_type1963getInfo(cl_int* err = NULL) const1964{1965typename detail::param_traits<1966detail::cl_device_info, name>::param_type param;1967cl_int result = getInfo(name, ¶m);1968if (err != NULL) {1969*err = result;1970}1971return param;1972}19731974/**1975* CL 1.2 version1976*/1977#if defined(CL_VERSION_1_2)1978//! \brief Wrapper for clCreateSubDevicesEXT().1979cl_int createSubDevices(1980const cl_device_partition_property * properties,1981VECTOR_CLASS<Device>* devices)1982{1983cl_uint n = 0;1984cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n);1985if (err != CL_SUCCESS) {1986return detail::errHandler(err, __CREATE_SUB_DEVICES);1987}19881989cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));1990err = clCreateSubDevices(object_, properties, n, ids, NULL);1991if (err != CL_SUCCESS) {1992return detail::errHandler(err, __CREATE_SUB_DEVICES);1993}19941995devices->assign(&ids[0], &ids[n]);1996return CL_SUCCESS;1997}1998#endif // #if defined(CL_VERSION_1_2)19992000/**2001* CL 1.1 version that uses device fission.2002*/2003#if defined(CL_VERSION_1_1)2004#if defined(USE_CL_DEVICE_FISSION)2005cl_int createSubDevices(2006const cl_device_partition_property_ext * properties,2007VECTOR_CLASS<Device>* devices)2008{2009typedef CL_API_ENTRY cl_int2010( CL_API_CALL * PFN_clCreateSubDevicesEXT)(2011cl_device_id /*in_device*/,2012const cl_device_partition_property_ext * /* properties */,2013cl_uint /*num_entries*/,2014cl_device_id * /*out_devices*/,2015cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;20162017static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL;2018__INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT);20192020cl_uint n = 0;2021cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n);2022if (err != CL_SUCCESS) {2023return detail::errHandler(err, __CREATE_SUB_DEVICES);2024}20252026cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));2027err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL);2028if (err != CL_SUCCESS) {2029return detail::errHandler(err, __CREATE_SUB_DEVICES);2030}20312032devices->assign(&ids[0], &ids[n]);2033return CL_SUCCESS;2034}2035#endif // #if defined(USE_CL_DEVICE_FISSION)2036#endif // #if defined(CL_VERSION_1_1)2037};20382039/*! \brief Class interface for cl_platform_id.2040*2041* \note Copies of these objects are inexpensive, since they don't 'own'2042* any underlying resources or data structures.2043*2044* \see cl_platform_id2045*/2046class Platform : public detail::Wrapper<cl_platform_id>2047{2048public:2049//! \brief Default constructor - initializes to NULL.2050Platform() : detail::Wrapper<cl_type>() { }20512052/*! \brief Copy constructor.2053*2054* This simply copies the platform ID value, which is an inexpensive operation.2055*/2056Platform(const Platform& platform) : detail::Wrapper<cl_type>(platform) { }20572058/*! \brief Constructor from cl_platform_id.2059*2060* This simply copies the platform ID value, which is an inexpensive operation.2061*/2062Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { }20632064/*! \brief Assignment operator from Platform.2065*2066* This simply copies the platform ID value, which is an inexpensive operation.2067*/2068Platform& operator = (const Platform& rhs)2069{2070if (this != &rhs) {2071detail::Wrapper<cl_type>::operator=(rhs);2072}2073return *this;2074}20752076/*! \brief Assignment operator from cl_platform_id.2077*2078* This simply copies the platform ID value, which is an inexpensive operation.2079*/2080Platform& operator = (const cl_platform_id& rhs)2081{2082detail::Wrapper<cl_type>::operator=(rhs);2083return *this;2084}20852086//! \brief Wrapper for clGetPlatformInfo().2087cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const2088{2089return detail::errHandler(2090detail::getInfo(&::clGetPlatformInfo, object_, name, param),2091__GET_PLATFORM_INFO_ERR);2092}20932094//! \brief Wrapper for clGetPlatformInfo() that returns by value.2095template <cl_int name> typename2096detail::param_traits<detail::cl_platform_info, name>::param_type2097getInfo(cl_int* err = NULL) const2098{2099typename detail::param_traits<2100detail::cl_platform_info, name>::param_type param;2101cl_int result = getInfo(name, ¶m);2102if (err != NULL) {2103*err = result;2104}2105return param;2106}21072108/*! \brief Gets a list of devices for this platform.2109*2110* Wraps clGetDeviceIDs().2111*/2112cl_int getDevices(2113cl_device_type type,2114VECTOR_CLASS<Device>* devices) const2115{2116cl_uint n = 0;2117if( devices == NULL ) {2118return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);2119}2120cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n);2121if (err != CL_SUCCESS) {2122return detail::errHandler(err, __GET_DEVICE_IDS_ERR);2123}21242125cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));2126err = ::clGetDeviceIDs(object_, type, n, ids, NULL);2127if (err != CL_SUCCESS) {2128return detail::errHandler(err, __GET_DEVICE_IDS_ERR);2129}21302131devices->assign(&ids[0], &ids[n]);2132return CL_SUCCESS;2133}21342135#if defined(USE_DX_INTEROP)2136/*! \brief Get the list of available D3D10 devices.2137*2138* \param d3d_device_source.2139*2140* \param d3d_object.2141*2142* \param d3d_device_set.2143*2144* \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device2145* values returned in devices can be used to identify a specific OpenCL2146* device. If \a devices argument is NULL, this argument is ignored.2147*2148* \return One of the following values:2149* - CL_SUCCESS if the function is executed successfully.2150*2151* The application can query specific capabilities of the OpenCL device(s)2152* returned by cl::getDevices. This can be used by the application to2153* determine which device(s) to use.2154*2155* \note In the case that exceptions are enabled and a return value2156* other than CL_SUCCESS is generated, then cl::Error exception is2157* generated.2158*/2159cl_int getDevices(2160cl_d3d10_device_source_khr d3d_device_source,2161void * d3d_object,2162cl_d3d10_device_set_khr d3d_device_set,2163VECTOR_CLASS<Device>* devices) const2164{2165typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)(2166cl_platform_id platform,2167cl_d3d10_device_source_khr d3d_device_source,2168void * d3d_object,2169cl_d3d10_device_set_khr d3d_device_set,2170cl_uint num_entries,2171cl_device_id * devices,2172cl_uint* num_devices);21732174if( devices == NULL ) {2175return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);2176}21772178static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL;2179__INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR);21802181cl_uint n = 0;2182cl_int err = pfn_clGetDeviceIDsFromD3D10KHR(2183object_,2184d3d_device_source,2185d3d_object,2186d3d_device_set,21870,2188NULL,2189&n);2190if (err != CL_SUCCESS) {2191return detail::errHandler(err, __GET_DEVICE_IDS_ERR);2192}21932194cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));2195err = pfn_clGetDeviceIDsFromD3D10KHR(2196object_,2197d3d_device_source,2198d3d_object,2199d3d_device_set,2200n,2201ids,2202NULL);2203if (err != CL_SUCCESS) {2204return detail::errHandler(err, __GET_DEVICE_IDS_ERR);2205}22062207devices->assign(&ids[0], &ids[n]);2208return CL_SUCCESS;2209}2210#endif22112212/*! \brief Gets a list of available platforms.2213*2214* Wraps clGetPlatformIDs().2215*/2216static cl_int get(2217VECTOR_CLASS<Platform>* platforms)2218{2219cl_uint n = 0;22202221if( platforms == NULL ) {2222return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);2223}22242225cl_int err = ::clGetPlatformIDs(0, NULL, &n);2226if (err != CL_SUCCESS) {2227return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);2228}22292230cl_platform_id* ids = (cl_platform_id*) alloca(2231n * sizeof(cl_platform_id));2232err = ::clGetPlatformIDs(n, ids, NULL);2233if (err != CL_SUCCESS) {2234return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);2235}22362237platforms->assign(&ids[0], &ids[n]);2238return CL_SUCCESS;2239}22402241/*! \brief Gets the first available platform.2242*2243* Wraps clGetPlatformIDs(), returning the first result.2244*/2245static cl_int get(2246Platform * platform)2247{2248cl_uint n = 0;22492250if( platform == NULL ) {2251return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);2252}22532254cl_int err = ::clGetPlatformIDs(0, NULL, &n);2255if (err != CL_SUCCESS) {2256return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);2257}22582259cl_platform_id* ids = (cl_platform_id*) alloca(2260n * sizeof(cl_platform_id));2261err = ::clGetPlatformIDs(n, ids, NULL);2262if (err != CL_SUCCESS) {2263return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);2264}22652266*platform = ids[0];2267return CL_SUCCESS;2268}22692270/*! \brief Gets the first available platform, returning it by value.2271*2272* Wraps clGetPlatformIDs(), returning the first result.2273*/2274static Platform get(2275cl_int * errResult = NULL)2276{2277Platform platform;2278cl_uint n = 0;2279cl_int err = ::clGetPlatformIDs(0, NULL, &n);2280if (err != CL_SUCCESS) {2281detail::errHandler(err, __GET_PLATFORM_IDS_ERR);2282if (errResult != NULL) {2283*errResult = err;2284}2285}22862287cl_platform_id* ids = (cl_platform_id*) alloca(2288n * sizeof(cl_platform_id));2289err = ::clGetPlatformIDs(n, ids, NULL);22902291if (err != CL_SUCCESS) {2292detail::errHandler(err, __GET_PLATFORM_IDS_ERR);2293}22942295if (errResult != NULL) {2296*errResult = err;2297}22982299return ids[0];2300}23012302static Platform getDefault(2303cl_int *errResult = NULL )2304{2305return get(errResult);2306}230723082309#if defined(CL_VERSION_1_2)2310//! \brief Wrapper for clUnloadCompiler().2311cl_int2312unloadCompiler()2313{2314return ::clUnloadPlatformCompiler(object_);2315}2316#endif // #if defined(CL_VERSION_1_2)2317}; // class Platform23182319/**2320* Deprecated APIs for 1.22321*/2322#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))2323/**2324* Unload the OpenCL compiler.2325* \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead.2326*/2327inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int2328UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;2329inline cl_int2330UnloadCompiler()2331{2332return ::clUnloadCompiler();2333}2334#endif // #if defined(CL_VERSION_1_1)23352336/*! \brief Class interface for cl_context.2337*2338* \note Copies of these objects are shallow, meaning that the copy will refer2339* to the same underlying cl_context as the original. For details, see2340* clRetainContext() and clReleaseContext().2341*2342* \see cl_context2343*/2344class Context2345: public detail::Wrapper<cl_context>2346{2347private:2348static volatile int default_initialized_;2349static Context default_;2350static volatile cl_int default_error_;2351public:2352/*! \brief Destructor.2353*2354* This calls clReleaseContext() on the value held by this instance.2355*/2356~Context() { }23572358/*! \brief Constructs a context including a list of specified devices.2359*2360* Wraps clCreateContext().2361*/2362Context(2363const VECTOR_CLASS<Device>& devices,2364cl_context_properties* properties = NULL,2365void (CL_CALLBACK * notifyFptr)(2366const char *,2367const void *,2368::size_t,2369void *) = NULL,2370void* data = NULL,2371cl_int* err = NULL)2372{2373cl_int error;23742375::size_t numDevices = devices.size();2376cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));2377for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {2378deviceIDs[deviceIndex] = (devices[deviceIndex])();2379}23802381object_ = ::clCreateContext(2382properties, (cl_uint) numDevices,2383deviceIDs,2384notifyFptr, data, &error);23852386detail::errHandler(error, __CREATE_CONTEXT_ERR);2387if (err != NULL) {2388*err = error;2389}2390}23912392Context(2393const Device& device,2394cl_context_properties* properties = NULL,2395void (CL_CALLBACK * notifyFptr)(2396const char *,2397const void *,2398::size_t,2399void *) = NULL,2400void* data = NULL,2401cl_int* err = NULL)2402{2403cl_int error;24042405cl_device_id deviceID = device();24062407object_ = ::clCreateContext(2408properties, 1,2409&deviceID,2410notifyFptr, data, &error);24112412detail::errHandler(error, __CREATE_CONTEXT_ERR);2413if (err != NULL) {2414*err = error;2415}2416}24172418/*! \brief Constructs a context including all devices of a specified type.2419*2420* Wraps clCreateContextFromType().2421*/2422Context(2423cl_device_type type,2424cl_context_properties* properties = NULL,2425void (CL_CALLBACK * notifyFptr)(2426const char *,2427const void *,2428::size_t,2429void *) = NULL,2430void* data = NULL,2431cl_int* err = NULL)2432{2433cl_int error;24342435#if !defined(__APPLE__) || !defined(__MACOS)2436cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };2437if (properties == NULL) {2438prop[1] = (cl_context_properties)Platform::get(&error)();2439if (error != CL_SUCCESS) {2440detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);2441if (err != NULL) {2442*err = error;2443return;2444}2445}24462447properties = &prop[0];2448}2449#endif2450object_ = ::clCreateContextFromType(2451properties, type, notifyFptr, data, &error);24522453detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);2454if (err != NULL) {2455*err = error;2456}2457}24582459/*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.2460*2461* \note All calls to this function return the same cl_context as the first.2462*/2463static Context getDefault(cl_int * err = NULL)2464{2465int state = detail::compare_exchange(2466&default_initialized_,2467__DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);24682469if (state & __DEFAULT_INITIALIZED) {2470if (err != NULL) {2471*err = default_error_;2472}2473return default_;2474}24752476if (state & __DEFAULT_BEING_INITIALIZED) {2477// Assume writes will propagate eventually...2478while(default_initialized_ != __DEFAULT_INITIALIZED) {2479detail::fence();2480}24812482if (err != NULL) {2483*err = default_error_;2484}2485return default_;2486}24872488cl_int error;2489default_ = Context(2490CL_DEVICE_TYPE_DEFAULT,2491NULL,2492NULL,2493NULL,2494&error);24952496detail::fence();24972498default_error_ = error;2499// Assume writes will propagate eventually...2500default_initialized_ = __DEFAULT_INITIALIZED;25012502detail::fence();25032504if (err != NULL) {2505*err = default_error_;2506}2507return default_;25082509}25102511//! \brief Default constructor - initializes to NULL.2512Context() : detail::Wrapper<cl_type>() { }25132514/*! \brief Copy constructor.2515*2516* This calls clRetainContext() on the parameter's cl_context.2517*/2518Context(const Context& context) : detail::Wrapper<cl_type>(context) { }25192520/*! \brief Constructor from cl_context - takes ownership.2521*2522* This effectively transfers ownership of a refcount on the cl_context2523* into the new Context object.2524*/2525__CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { }25262527/*! \brief Assignment operator from Context.2528*2529* This calls clRetainContext() on the parameter and clReleaseContext() on2530* the previous value held by this instance.2531*/2532Context& operator = (const Context& rhs)2533{2534if (this != &rhs) {2535detail::Wrapper<cl_type>::operator=(rhs);2536}2537return *this;2538}25392540/*! \brief Assignment operator from cl_context - takes ownership.2541*2542* This effectively transfers ownership of a refcount on the rhs and calls2543* clReleaseContext() on the value previously held by this instance.2544*/2545Context& operator = (const cl_context& rhs)2546{2547detail::Wrapper<cl_type>::operator=(rhs);2548return *this;2549}25502551//! \brief Wrapper for clGetContextInfo().2552template <typename T>2553cl_int getInfo(cl_context_info name, T* param) const2554{2555return detail::errHandler(2556detail::getInfo(&::clGetContextInfo, object_, name, param),2557__GET_CONTEXT_INFO_ERR);2558}25592560//! \brief Wrapper for clGetContextInfo() that returns by value.2561template <cl_int name> typename2562detail::param_traits<detail::cl_context_info, name>::param_type2563getInfo(cl_int* err = NULL) const2564{2565typename detail::param_traits<2566detail::cl_context_info, name>::param_type param;2567cl_int result = getInfo(name, ¶m);2568if (err != NULL) {2569*err = result;2570}2571return param;2572}25732574/*! \brief Gets a list of supported image formats.2575*2576* Wraps clGetSupportedImageFormats().2577*/2578cl_int getSupportedImageFormats(2579cl_mem_flags flags,2580cl_mem_object_type type,2581VECTOR_CLASS<ImageFormat>* formats) const2582{2583cl_uint numEntries;2584cl_int err = ::clGetSupportedImageFormats(2585object_,2586flags,2587type,25880,2589NULL,2590&numEntries);2591if (err != CL_SUCCESS) {2592return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);2593}25942595ImageFormat* value = (ImageFormat*)2596alloca(numEntries * sizeof(ImageFormat));2597err = ::clGetSupportedImageFormats(2598object_,2599flags,2600type,2601numEntries,2602(cl_image_format*) value,2603NULL);2604if (err != CL_SUCCESS) {2605return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);2606}26072608formats->assign(&value[0], &value[numEntries]);2609return CL_SUCCESS;2610}2611};26122613inline Device Device::getDefault(cl_int * err)2614{2615cl_int error;2616Device device;26172618Context context = Context::getDefault(&error);2619detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);26202621if (error != CL_SUCCESS) {2622if (err != NULL) {2623*err = error;2624}2625}2626else {2627device = context.getInfo<CL_CONTEXT_DEVICES>()[0];2628if (err != NULL) {2629*err = CL_SUCCESS;2630}2631}26322633return device;2634}263526362637#ifdef _WIN322638__declspec(selectany) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;2639__declspec(selectany) Context Context::default_;2640__declspec(selectany) volatile cl_int Context::default_error_ = CL_SUCCESS;2641#else2642__attribute__((weak)) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;2643__attribute__((weak)) Context Context::default_;2644__attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS;2645#endif26462647/*! \brief Class interface for cl_event.2648*2649* \note Copies of these objects are shallow, meaning that the copy will refer2650* to the same underlying cl_event as the original. For details, see2651* clRetainEvent() and clReleaseEvent().2652*2653* \see cl_event2654*/2655class Event : public detail::Wrapper<cl_event>2656{2657public:2658/*! \brief Destructor.2659*2660* This calls clReleaseEvent() on the value held by this instance.2661*/2662~Event() { }26632664//! \brief Default constructor - initializes to NULL.2665Event() : detail::Wrapper<cl_type>() { }26662667/*! \brief Copy constructor.2668*2669* This calls clRetainEvent() on the parameter's cl_event.2670*/2671Event(const Event& event) : detail::Wrapper<cl_type>(event) { }26722673/*! \brief Constructor from cl_event - takes ownership.2674*2675* This effectively transfers ownership of a refcount on the cl_event2676* into the new Event object.2677*/2678Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { }26792680/*! \brief Assignment operator from cl_event - takes ownership.2681*2682* This effectively transfers ownership of a refcount on the rhs and calls2683* clReleaseEvent() on the value previously held by this instance.2684*/2685Event& operator = (const Event& rhs)2686{2687if (this != &rhs) {2688detail::Wrapper<cl_type>::operator=(rhs);2689}2690return *this;2691}26922693/*! \brief Assignment operator from cl_event.2694*2695* This calls clRetainEvent() on the parameter and clReleaseEvent() on2696* the previous value held by this instance.2697*/2698Event& operator = (const cl_event& rhs)2699{2700detail::Wrapper<cl_type>::operator=(rhs);2701return *this;2702}27032704//! \brief Wrapper for clGetEventInfo().2705template <typename T>2706cl_int getInfo(cl_event_info name, T* param) const2707{2708return detail::errHandler(2709detail::getInfo(&::clGetEventInfo, object_, name, param),2710__GET_EVENT_INFO_ERR);2711}27122713//! \brief Wrapper for clGetEventInfo() that returns by value.2714template <cl_int name> typename2715detail::param_traits<detail::cl_event_info, name>::param_type2716getInfo(cl_int* err = NULL) const2717{2718typename detail::param_traits<2719detail::cl_event_info, name>::param_type param;2720cl_int result = getInfo(name, ¶m);2721if (err != NULL) {2722*err = result;2723}2724return param;2725}27262727//! \brief Wrapper for clGetEventProfilingInfo().2728template <typename T>2729cl_int getProfilingInfo(cl_profiling_info name, T* param) const2730{2731return detail::errHandler(detail::getInfo(2732&::clGetEventProfilingInfo, object_, name, param),2733__GET_EVENT_PROFILE_INFO_ERR);2734}27352736//! \brief Wrapper for clGetEventProfilingInfo() that returns by value.2737template <cl_int name> typename2738detail::param_traits<detail::cl_profiling_info, name>::param_type2739getProfilingInfo(cl_int* err = NULL) const2740{2741typename detail::param_traits<2742detail::cl_profiling_info, name>::param_type param;2743cl_int result = getProfilingInfo(name, ¶m);2744if (err != NULL) {2745*err = result;2746}2747return param;2748}27492750/*! \brief Blocks the calling thread until this event completes.2751*2752* Wraps clWaitForEvents().2753*/2754cl_int wait() const2755{2756return detail::errHandler(2757::clWaitForEvents(1, &object_),2758__WAIT_FOR_EVENTS_ERR);2759}27602761#if defined(CL_VERSION_1_1)2762/*! \brief Registers a user callback function for a specific command execution status.2763*2764* Wraps clSetEventCallback().2765*/2766cl_int setCallback(2767cl_int type,2768void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *),2769void * user_data = NULL)2770{2771return detail::errHandler(2772::clSetEventCallback(2773object_,2774type,2775pfn_notify,2776user_data),2777__SET_EVENT_CALLBACK_ERR);2778}2779#endif27802781/*! \brief Blocks the calling thread until every event specified is complete.2782*2783* Wraps clWaitForEvents().2784*/2785static cl_int2786waitForEvents(const VECTOR_CLASS<Event>& events)2787{2788return detail::errHandler(2789::clWaitForEvents(2790(cl_uint) events.size(), (cl_event*)&events.front()),2791__WAIT_FOR_EVENTS_ERR);2792}2793};27942795#if defined(CL_VERSION_1_1)2796/*! \brief Class interface for user events (a subset of cl_event's).2797*2798* See Event for details about copy semantics, etc.2799*/2800class UserEvent : public Event2801{2802public:2803/*! \brief Constructs a user event on a given context.2804*2805* Wraps clCreateUserEvent().2806*/2807UserEvent(2808const Context& context,2809cl_int * err = NULL)2810{2811cl_int error;2812object_ = ::clCreateUserEvent(2813context(),2814&error);28152816detail::errHandler(error, __CREATE_USER_EVENT_ERR);2817if (err != NULL) {2818*err = error;2819}2820}28212822//! \brief Default constructor - initializes to NULL.2823UserEvent() : Event() { }28242825//! \brief Copy constructor - performs shallow copy.2826UserEvent(const UserEvent& event) : Event(event) { }28272828//! \brief Assignment Operator - performs shallow copy.2829UserEvent& operator = (const UserEvent& rhs)2830{2831if (this != &rhs) {2832Event::operator=(rhs);2833}2834return *this;2835}28362837/*! \brief Sets the execution status of a user event object.2838*2839* Wraps clSetUserEventStatus().2840*/2841cl_int setStatus(cl_int status)2842{2843return detail::errHandler(2844::clSetUserEventStatus(object_,status),2845__SET_USER_EVENT_STATUS_ERR);2846}2847};2848#endif28492850/*! \brief Blocks the calling thread until every event specified is complete.2851*2852* Wraps clWaitForEvents().2853*/2854inline static cl_int2855WaitForEvents(const VECTOR_CLASS<Event>& events)2856{2857return detail::errHandler(2858::clWaitForEvents(2859(cl_uint) events.size(), (cl_event*)&events.front()),2860__WAIT_FOR_EVENTS_ERR);2861}28622863/*! \brief Class interface for cl_mem.2864*2865* \note Copies of these objects are shallow, meaning that the copy will refer2866* to the same underlying cl_mem as the original. For details, see2867* clRetainMemObject() and clReleaseMemObject().2868*2869* \see cl_mem2870*/2871class Memory : public detail::Wrapper<cl_mem>2872{2873public:28742875/*! \brief Destructor.2876*2877* This calls clReleaseMemObject() on the value held by this instance.2878*/2879~Memory() {}28802881//! \brief Default constructor - initializes to NULL.2882Memory() : detail::Wrapper<cl_type>() { }28832884/*! \brief Copy constructor - performs shallow copy.2885*2886* This calls clRetainMemObject() on the parameter's cl_mem.2887*/2888Memory(const Memory& memory) : detail::Wrapper<cl_type>(memory) { }28892890/*! \brief Constructor from cl_mem - takes ownership.2891*2892* This effectively transfers ownership of a refcount on the cl_mem2893* into the new Memory object.2894*/2895__CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { }28962897/*! \brief Assignment operator from Memory.2898*2899* This calls clRetainMemObject() on the parameter and clReleaseMemObject()2900* on the previous value held by this instance.2901*/2902Memory& operator = (const Memory& rhs)2903{2904if (this != &rhs) {2905detail::Wrapper<cl_type>::operator=(rhs);2906}2907return *this;2908}29092910/*! \brief Assignment operator from cl_mem - takes ownership.2911*2912* This effectively transfers ownership of a refcount on the rhs and calls2913* clReleaseMemObject() on the value previously held by this instance.2914*/2915Memory& operator = (const cl_mem& rhs)2916{2917detail::Wrapper<cl_type>::operator=(rhs);2918return *this;2919}29202921//! \brief Wrapper for clGetMemObjectInfo().2922template <typename T>2923cl_int getInfo(cl_mem_info name, T* param) const2924{2925return detail::errHandler(2926detail::getInfo(&::clGetMemObjectInfo, object_, name, param),2927__GET_MEM_OBJECT_INFO_ERR);2928}29292930//! \brief Wrapper for clGetMemObjectInfo() that returns by value.2931template <cl_int name> typename2932detail::param_traits<detail::cl_mem_info, name>::param_type2933getInfo(cl_int* err = NULL) const2934{2935typename detail::param_traits<2936detail::cl_mem_info, name>::param_type param;2937cl_int result = getInfo(name, ¶m);2938if (err != NULL) {2939*err = result;2940}2941return param;2942}29432944#if defined(CL_VERSION_1_1)2945/*! \brief Registers a callback function to be called when the memory object2946* is no longer needed.2947*2948* Wraps clSetMemObjectDestructorCallback().2949*2950* Repeated calls to this function, for a given cl_mem value, will append2951* to the list of functions called (in reverse order) when memory object's2952* resources are freed and the memory object is deleted.2953*2954* \note2955* The registered callbacks are associated with the underlying cl_mem2956* value - not the Memory class instance.2957*/2958cl_int setDestructorCallback(2959void (CL_CALLBACK * pfn_notify)(cl_mem, void *),2960void * user_data = NULL)2961{2962return detail::errHandler(2963::clSetMemObjectDestructorCallback(2964object_,2965pfn_notify,2966user_data),2967__SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR);2968}2969#endif29702971};29722973// Pre-declare copy functions2974class Buffer;2975template< typename IteratorType >2976cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );2977template< typename IteratorType >2978cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );29792980/*! \brief Class interface for Buffer Memory Objects.2981*2982* See Memory for details about copy semantics, etc.2983*2984* \see Memory2985*/2986class Buffer : public Memory2987{2988public:29892990/*! \brief Constructs a Buffer in a specified context.2991*2992* Wraps clCreateBuffer().2993*2994* \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was2995* specified. Note alignment & exclusivity requirements.2996*/2997Buffer(2998const Context& context,2999cl_mem_flags flags,3000::size_t size,3001void* host_ptr = NULL,3002cl_int* err = NULL)3003{3004cl_int error;3005object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);30063007detail::errHandler(error, __CREATE_BUFFER_ERR);3008if (err != NULL) {3009*err = error;3010}3011}30123013/*! \brief Constructs a Buffer in the default context.3014*3015* Wraps clCreateBuffer().3016*3017* \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was3018* specified. Note alignment & exclusivity requirements.3019*3020* \see Context::getDefault()3021*/3022Buffer(3023cl_mem_flags flags,3024::size_t size,3025void* host_ptr = NULL,3026cl_int* err = NULL)3027{3028cl_int error;30293030Context context = Context::getDefault(err);30313032object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);30333034detail::errHandler(error, __CREATE_BUFFER_ERR);3035if (err != NULL) {3036*err = error;3037}3038}30393040/*!3041* \brief Construct a Buffer from a host container via iterators.3042* If useHostPtr is specified iterators must be random access.3043*/3044template< typename IteratorType >3045Buffer(3046IteratorType startIterator,3047IteratorType endIterator,3048bool readOnly,3049bool useHostPtr = false,3050cl_int* err = NULL)3051{3052typedef typename std::iterator_traits<IteratorType>::value_type DataType;3053cl_int error;30543055cl_mem_flags flags = 0;3056if( readOnly ) {3057flags |= CL_MEM_READ_ONLY;3058}3059else {3060flags |= CL_MEM_READ_WRITE;3061}3062if( useHostPtr ) {3063flags |= CL_MEM_USE_HOST_PTR;3064}30653066::size_t size = sizeof(DataType)*(endIterator - startIterator);30673068Context context = Context::getDefault(err);30693070if( useHostPtr ) {3071object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);3072} else {3073object_ = ::clCreateBuffer(context(), flags, size, 0, &error);3074}30753076detail::errHandler(error, __CREATE_BUFFER_ERR);3077if (err != NULL) {3078*err = error;3079}30803081if( !useHostPtr ) {3082error = cl::copy(startIterator, endIterator, *this);3083detail::errHandler(error, __CREATE_BUFFER_ERR);3084if (err != NULL) {3085*err = error;3086}3087}3088}30893090//! \brief Default constructor - initializes to NULL.3091Buffer() : Memory() { }30923093/*! \brief Copy constructor - performs shallow copy.3094*3095* See Memory for further details.3096*/3097Buffer(const Buffer& buffer) : Memory(buffer) { }30983099/*! \brief Constructor from cl_mem - takes ownership.3100*3101* See Memory for further details.3102*/3103__CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { }31043105/*! \brief Assignment from Buffer - performs shallow copy.3106*3107* See Memory for further details.3108*/3109Buffer& operator = (const Buffer& rhs)3110{3111if (this != &rhs) {3112Memory::operator=(rhs);3113}3114return *this;3115}31163117/*! \brief Assignment from cl_mem - performs shallow copy.3118*3119* See Memory for further details.3120*/3121Buffer& operator = (const cl_mem& rhs)3122{3123Memory::operator=(rhs);3124return *this;3125}31263127#if defined(CL_VERSION_1_1)3128/*! \brief Creates a new buffer object from this.3129*3130* Wraps clCreateSubBuffer().3131*/3132Buffer createSubBuffer(3133cl_mem_flags flags,3134cl_buffer_create_type buffer_create_type,3135const void * buffer_create_info,3136cl_int * err = NULL)3137{3138Buffer result;3139cl_int error;3140result.object_ = ::clCreateSubBuffer(3141object_,3142flags,3143buffer_create_type,3144buffer_create_info,3145&error);31463147detail::errHandler(error, __CREATE_SUBBUFFER_ERR);3148if (err != NULL) {3149*err = error;3150}31513152return result;3153}3154#endif3155};31563157#if defined (USE_DX_INTEROP)3158/*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.3159*3160* This is provided to facilitate interoperability with Direct3D.3161*3162* See Memory for details about copy semantics, etc.3163*3164* \see Memory3165*/3166class BufferD3D10 : public Buffer3167{3168public:3169typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)(3170cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer,3171cl_int* errcode_ret);31723173/*! \brief Constructs a BufferD3D10, in a specified context, from a3174* given ID3D10Buffer.3175*3176* Wraps clCreateFromD3D10BufferKHR().3177*/3178BufferD3D10(3179const Context& context,3180cl_mem_flags flags,3181ID3D10Buffer* bufobj,3182cl_int * err = NULL)3183{3184static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL;31853186#if defined(CL_VERSION_1_2)3187vector<cl_context_properties> props = context.getInfo<CL_CONTEXT_PROPERTIES>();3188cl_platform platform = -1;3189for( int i = 0; i < props.size(); ++i ) {3190if( props[i] == CL_CONTEXT_PLATFORM ) {3191platform = props[i+1];3192}3193}3194__INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR);3195#endif3196#if defined(CL_VERSION_1_1)3197__INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR);3198#endif31993200cl_int error;3201object_ = pfn_clCreateFromD3D10BufferKHR(3202context(),3203flags,3204bufobj,3205&error);32063207detail::errHandler(error, __CREATE_GL_BUFFER_ERR);3208if (err != NULL) {3209*err = error;3210}3211}32123213//! \brief Default constructor - initializes to NULL.3214BufferD3D10() : Buffer() { }32153216/*! \brief Copy constructor - performs shallow copy.3217*3218* See Memory for further details.3219*/3220BufferD3D10(const BufferD3D10& buffer) : Buffer(buffer) { }32213222/*! \brief Constructor from cl_mem - takes ownership.3223*3224* See Memory for further details.3225*/3226__CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { }32273228/*! \brief Assignment from BufferD3D10 - performs shallow copy.3229*3230* See Memory for further details.3231*/3232BufferD3D10& operator = (const BufferD3D10& rhs)3233{3234if (this != &rhs) {3235Buffer::operator=(rhs);3236}3237return *this;3238}32393240/*! \brief Assignment from cl_mem - performs shallow copy.3241*3242* See Memory for further details.3243*/3244BufferD3D10& operator = (const cl_mem& rhs)3245{3246Buffer::operator=(rhs);3247return *this;3248}3249};3250#endif32513252/*! \brief Class interface for GL Buffer Memory Objects.3253*3254* This is provided to facilitate interoperability with OpenGL.3255*3256* See Memory for details about copy semantics, etc.3257*3258* \see Memory3259*/3260class BufferGL : public Buffer3261{3262public:3263/*! \brief Constructs a BufferGL in a specified context, from a given3264* GL buffer.3265*3266* Wraps clCreateFromGLBuffer().3267*/3268BufferGL(3269const Context& context,3270cl_mem_flags flags,3271GLuint bufobj,3272cl_int * err = NULL)3273{3274cl_int error;3275object_ = ::clCreateFromGLBuffer(3276context(),3277flags,3278bufobj,3279&error);32803281detail::errHandler(error, __CREATE_GL_BUFFER_ERR);3282if (err != NULL) {3283*err = error;3284}3285}32863287//! \brief Default constructor - initializes to NULL.3288BufferGL() : Buffer() { }32893290/*! \brief Copy constructor - performs shallow copy.3291*3292* See Memory for further details.3293*/3294BufferGL(const BufferGL& buffer) : Buffer(buffer) { }32953296/*! \brief Constructor from cl_mem - takes ownership.3297*3298* See Memory for further details.3299*/3300__CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { }33013302/*! \brief Assignment from BufferGL - performs shallow copy.3303*3304* See Memory for further details.3305*/3306BufferGL& operator = (const BufferGL& rhs)3307{3308if (this != &rhs) {3309Buffer::operator=(rhs);3310}3311return *this;3312}33133314/*! \brief Assignment from cl_mem - performs shallow copy.3315*3316* See Memory for further details.3317*/3318BufferGL& operator = (const cl_mem& rhs)3319{3320Buffer::operator=(rhs);3321return *this;3322}33233324//! \brief Wrapper for clGetGLObjectInfo().3325cl_int getObjectInfo(3326cl_gl_object_type *type,3327GLuint * gl_object_name)3328{3329return detail::errHandler(3330::clGetGLObjectInfo(object_,type,gl_object_name),3331__GET_GL_OBJECT_INFO_ERR);3332}3333};33343335/*! \brief Class interface for GL Render Buffer Memory Objects.3336*3337* This is provided to facilitate interoperability with OpenGL.3338*3339* See Memory for details about copy semantics, etc.3340*3341* \see Memory3342*/3343class BufferRenderGL : public Buffer3344{3345public:3346/*! \brief Constructs a BufferRenderGL in a specified context, from a given3347* GL Renderbuffer.3348*3349* Wraps clCreateFromGLRenderbuffer().3350*/3351BufferRenderGL(3352const Context& context,3353cl_mem_flags flags,3354GLuint bufobj,3355cl_int * err = NULL)3356{3357cl_int error;3358object_ = ::clCreateFromGLRenderbuffer(3359context(),3360flags,3361bufobj,3362&error);33633364detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);3365if (err != NULL) {3366*err = error;3367}3368}33693370//! \brief Default constructor - initializes to NULL.3371BufferRenderGL() : Buffer() { }33723373/*! \brief Copy constructor - performs shallow copy.3374*3375* See Memory for further details.3376*/3377BufferRenderGL(const BufferGL& buffer) : Buffer(buffer) { }33783379/*! \brief Constructor from cl_mem - takes ownership.3380*3381* See Memory for further details.3382*/3383__CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Buffer(buffer) { }33843385/*! \brief Assignment from BufferGL - performs shallow copy.3386*3387* See Memory for further details.3388*/3389BufferRenderGL& operator = (const BufferRenderGL& rhs)3390{3391if (this != &rhs) {3392Buffer::operator=(rhs);3393}3394return *this;3395}33963397/*! \brief Assignment from cl_mem - performs shallow copy.3398*3399* See Memory for further details.3400*/3401BufferRenderGL& operator = (const cl_mem& rhs)3402{3403Buffer::operator=(rhs);3404return *this;3405}34063407//! \brief Wrapper for clGetGLObjectInfo().3408cl_int getObjectInfo(3409cl_gl_object_type *type,3410GLuint * gl_object_name)3411{3412return detail::errHandler(3413::clGetGLObjectInfo(object_,type,gl_object_name),3414__GET_GL_OBJECT_INFO_ERR);3415}3416};34173418/*! \brief C++ base class for Image Memory objects.3419*3420* See Memory for details about copy semantics, etc.3421*3422* \see Memory3423*/3424class Image : public Memory3425{3426protected:3427//! \brief Default constructor - initializes to NULL.3428Image() : Memory() { }34293430/*! \brief Copy constructor - performs shallow copy.3431*3432* See Memory for further details.3433*/3434Image(const Image& image) : Memory(image) { }34353436/*! \brief Constructor from cl_mem - takes ownership.3437*3438* See Memory for further details.3439*/3440__CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { }34413442/*! \brief Assignment from Image - performs shallow copy.3443*3444* See Memory for further details.3445*/3446Image& operator = (const Image& rhs)3447{3448if (this != &rhs) {3449Memory::operator=(rhs);3450}3451return *this;3452}34533454/*! \brief Assignment from cl_mem - performs shallow copy.3455*3456* See Memory for further details.3457*/3458Image& operator = (const cl_mem& rhs)3459{3460Memory::operator=(rhs);3461return *this;3462}34633464public:3465//! \brief Wrapper for clGetImageInfo().3466template <typename T>3467cl_int getImageInfo(cl_image_info name, T* param) const3468{3469return detail::errHandler(3470detail::getInfo(&::clGetImageInfo, object_, name, param),3471__GET_IMAGE_INFO_ERR);3472}34733474//! \brief Wrapper for clGetImageInfo() that returns by value.3475template <cl_int name> typename3476detail::param_traits<detail::cl_image_info, name>::param_type3477getImageInfo(cl_int* err = NULL) const3478{3479typename detail::param_traits<3480detail::cl_image_info, name>::param_type param;3481cl_int result = getImageInfo(name, ¶m);3482if (err != NULL) {3483*err = result;3484}3485return param;3486}3487};34883489#if defined(CL_VERSION_1_2)3490/*! \brief Class interface for 1D Image Memory objects.3491*3492* See Memory for details about copy semantics, etc.3493*3494* \see Memory3495*/3496class Image1D : public Image3497{3498public:3499/*! \brief Constructs a 1D Image in a specified context.3500*3501* Wraps clCreateImage().3502*/3503Image1D(3504const Context& context,3505cl_mem_flags flags,3506ImageFormat format,3507::size_t width,3508void* host_ptr = NULL,3509cl_int* err = NULL)3510{3511cl_int error;3512cl_image_desc desc;3513desc.image_type = CL_MEM_OBJECT_IMAGE1D;3514desc.image_width = width;3515desc.image_row_pitch = 0;3516desc.num_mip_levels = 0;3517desc.num_samples = 0;3518desc.buffer = 0;3519object_ = ::clCreateImage(3520context(),3521flags,3522&format,3523&desc,3524host_ptr,3525&error);35263527detail::errHandler(error, __CREATE_IMAGE_ERR);3528if (err != NULL) {3529*err = error;3530}3531}35323533//! \brief Default constructor - initializes to NULL.3534Image1D() { }35353536/*! \brief Copy constructor - performs shallow copy.3537*3538* See Memory for further details.3539*/3540Image1D(const Image1D& image1D) : Image(image1D) { }35413542/*! \brief Constructor from cl_mem - takes ownership.3543*3544* See Memory for further details.3545*/3546__CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { }35473548/*! \brief Assignment from Image1D - performs shallow copy.3549*3550* See Memory for further details.3551*/3552Image1D& operator = (const Image1D& rhs)3553{3554if (this != &rhs) {3555Image::operator=(rhs);3556}3557return *this;3558}35593560/*! \brief Assignment from cl_mem - performs shallow copy.3561*3562* See Memory for further details.3563*/3564Image1D& operator = (const cl_mem& rhs)3565{3566Image::operator=(rhs);3567return *this;3568}3569};35703571/*! \class Image1DBuffer3572* \brief Image interface for 1D buffer images.3573*/3574class Image1DBuffer : public Image3575{3576public:3577Image1DBuffer(3578const Context& context,3579cl_mem_flags flags,3580ImageFormat format,3581::size_t width,3582const Buffer &buffer,3583cl_int* err = NULL)3584{3585cl_int error;3586cl_image_desc desc;3587desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;3588desc.image_width = width;3589desc.image_row_pitch = 0;3590desc.num_mip_levels = 0;3591desc.num_samples = 0;3592desc.buffer = buffer();3593object_ = ::clCreateImage(3594context(),3595flags,3596&format,3597&desc,3598NULL,3599&error);36003601detail::errHandler(error, __CREATE_IMAGE_ERR);3602if (err != NULL) {3603*err = error;3604}3605}36063607Image1DBuffer() { }36083609Image1DBuffer(const Image1DBuffer& image1D) : Image(image1D) { }36103611__CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { }36123613Image1DBuffer& operator = (const Image1DBuffer& rhs)3614{3615if (this != &rhs) {3616Image::operator=(rhs);3617}3618return *this;3619}36203621Image1DBuffer& operator = (const cl_mem& rhs)3622{3623Image::operator=(rhs);3624return *this;3625}3626};36273628/*! \class Image1DArray3629* \brief Image interface for arrays of 1D images.3630*/3631class Image1DArray : public Image3632{3633public:3634Image1DArray(3635const Context& context,3636cl_mem_flags flags,3637ImageFormat format,3638::size_t arraySize,3639::size_t width,3640::size_t rowPitch,3641void* host_ptr = NULL,3642cl_int* err = NULL)3643{3644cl_int error;3645cl_image_desc desc;3646desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY;3647desc.image_array_size = arraySize;3648desc.image_width = width;3649desc.image_row_pitch = rowPitch;3650desc.num_mip_levels = 0;3651desc.num_samples = 0;3652desc.buffer = 0;3653object_ = ::clCreateImage(3654context(),3655flags,3656&format,3657&desc,3658host_ptr,3659&error);36603661detail::errHandler(error, __CREATE_IMAGE_ERR);3662if (err != NULL) {3663*err = error;3664}3665}36663667Image1DArray() { }36683669Image1DArray(const Image1DArray& imageArray) : Image(imageArray) { }36703671__CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { }36723673Image1DArray& operator = (const Image1DArray& rhs)3674{3675if (this != &rhs) {3676Image::operator=(rhs);3677}3678return *this;3679}36803681Image1DArray& operator = (const cl_mem& rhs)3682{3683Image::operator=(rhs);3684return *this;3685}3686};3687#endif // #if defined(CL_VERSION_1_2)368836893690/*! \brief Class interface for 2D Image Memory objects.3691*3692* See Memory for details about copy semantics, etc.3693*3694* \see Memory3695*/3696class Image2D : public Image3697{3698public:3699/*! \brief Constructs a 1D Image in a specified context.3700*3701* Wraps clCreateImage().3702*/3703Image2D(3704const Context& context,3705cl_mem_flags flags,3706ImageFormat format,3707::size_t width,3708::size_t height,3709::size_t row_pitch = 0,3710void* host_ptr = NULL,3711cl_int* err = NULL)3712{3713cl_int error;3714bool useCreateImage;37153716#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)3717// Run-time decision based on the actual platform3718{3719cl_uint version = detail::getContextPlatformVersion(context());3720useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above3721}3722#elif defined(CL_VERSION_1_2)3723useCreateImage = true;3724#else3725useCreateImage = false;3726#endif37273728#if defined(CL_VERSION_1_2)3729if (useCreateImage)3730{3731cl_image_desc desc;3732desc.image_type = CL_MEM_OBJECT_IMAGE2D;3733desc.image_width = width;3734desc.image_height = height;3735desc.image_row_pitch = row_pitch;3736desc.num_mip_levels = 0;3737desc.num_samples = 0;3738desc.buffer = 0;3739object_ = ::clCreateImage(3740context(),3741flags,3742&format,3743&desc,3744host_ptr,3745&error);37463747detail::errHandler(error, __CREATE_IMAGE_ERR);3748if (err != NULL) {3749*err = error;3750}3751}3752#endif // #if defined(CL_VERSION_1_2)3753#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)3754if (!useCreateImage)3755{3756object_ = ::clCreateImage2D(3757context(), flags,&format, width, height, row_pitch, host_ptr, &error);37583759detail::errHandler(error, __CREATE_IMAGE2D_ERR);3760if (err != NULL) {3761*err = error;3762}3763}3764#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)3765}37663767//! \brief Default constructor - initializes to NULL.3768Image2D() { }37693770/*! \brief Copy constructor - performs shallow copy.3771*3772* See Memory for further details.3773*/3774Image2D(const Image2D& image2D) : Image(image2D) { }37753776/*! \brief Constructor from cl_mem - takes ownership.3777*3778* See Memory for further details.3779*/3780__CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { }37813782/*! \brief Assignment from Image2D - performs shallow copy.3783*3784* See Memory for further details.3785*/3786Image2D& operator = (const Image2D& rhs)3787{3788if (this != &rhs) {3789Image::operator=(rhs);3790}3791return *this;3792}37933794/*! \brief Assignment from cl_mem - performs shallow copy.3795*3796* See Memory for further details.3797*/3798Image2D& operator = (const cl_mem& rhs)3799{3800Image::operator=(rhs);3801return *this;3802}3803};380438053806#if !defined(CL_VERSION_1_2)3807/*! \brief Class interface for GL 2D Image Memory objects.3808*3809* This is provided to facilitate interoperability with OpenGL.3810*3811* See Memory for details about copy semantics, etc.3812*3813* \see Memory3814* \note Deprecated for OpenCL 1.2. Please use ImageGL instead.3815*/3816class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D3817{3818public:3819/*! \brief Constructs an Image2DGL in a specified context, from a given3820* GL Texture.3821*3822* Wraps clCreateFromGLTexture2D().3823*/3824Image2DGL(3825const Context& context,3826cl_mem_flags flags,3827GLenum target,3828GLint miplevel,3829GLuint texobj,3830cl_int * err = NULL)3831{3832cl_int error;3833object_ = ::clCreateFromGLTexture2D(3834context(),3835flags,3836target,3837miplevel,3838texobj,3839&error);38403841detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR);3842if (err != NULL) {3843*err = error;3844}38453846}38473848//! \brief Default constructor - initializes to NULL.3849Image2DGL() : Image2D() { }38503851/*! \brief Copy constructor - performs shallow copy.3852*3853* See Memory for further details.3854*/3855Image2DGL(const Image2DGL& image) : Image2D(image) { }38563857/*! \brief Constructor from cl_mem - takes ownership.3858*3859* See Memory for further details.3860*/3861__CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { }38623863/*! \brief Assignment from Image2DGL - performs shallow copy.3864*3865* See Memory for further details.3866*/3867Image2DGL& operator = (const Image2DGL& rhs)3868{3869if (this != &rhs) {3870Image2D::operator=(rhs);3871}3872return *this;3873}38743875/*! \brief Assignment from cl_mem - performs shallow copy.3876*3877* See Memory for further details.3878*/3879Image2DGL& operator = (const cl_mem& rhs)3880{3881Image2D::operator=(rhs);3882return *this;3883}3884};3885#endif // #if !defined(CL_VERSION_1_2)38863887#if defined(CL_VERSION_1_2)3888/*! \class Image2DArray3889* \brief Image interface for arrays of 2D images.3890*/3891class Image2DArray : public Image3892{3893public:3894Image2DArray(3895const Context& context,3896cl_mem_flags flags,3897ImageFormat format,3898::size_t arraySize,3899::size_t width,3900::size_t height,3901::size_t rowPitch,3902::size_t slicePitch,3903void* host_ptr = NULL,3904cl_int* err = NULL)3905{3906cl_int error;3907cl_image_desc desc;3908desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY;3909desc.image_array_size = arraySize;3910desc.image_width = width;3911desc.image_height = height;3912desc.image_row_pitch = rowPitch;3913desc.image_slice_pitch = slicePitch;3914desc.num_mip_levels = 0;3915desc.num_samples = 0;3916desc.buffer = 0;3917object_ = ::clCreateImage(3918context(),3919flags,3920&format,3921&desc,3922host_ptr,3923&error);39243925detail::errHandler(error, __CREATE_IMAGE_ERR);3926if (err != NULL) {3927*err = error;3928}3929}39303931Image2DArray() { }39323933Image2DArray(const Image2DArray& imageArray) : Image(imageArray) { }39343935__CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { }39363937Image2DArray& operator = (const Image2DArray& rhs)3938{3939if (this != &rhs) {3940Image::operator=(rhs);3941}3942return *this;3943}39443945Image2DArray& operator = (const cl_mem& rhs)3946{3947Image::operator=(rhs);3948return *this;3949}3950};3951#endif // #if defined(CL_VERSION_1_2)39523953/*! \brief Class interface for 3D Image Memory objects.3954*3955* See Memory for details about copy semantics, etc.3956*3957* \see Memory3958*/3959class Image3D : public Image3960{3961public:3962/*! \brief Constructs a 3D Image in a specified context.3963*3964* Wraps clCreateImage().3965*/3966Image3D(3967const Context& context,3968cl_mem_flags flags,3969ImageFormat format,3970::size_t width,3971::size_t height,3972::size_t depth,3973::size_t row_pitch = 0,3974::size_t slice_pitch = 0,3975void* host_ptr = NULL,3976cl_int* err = NULL)3977{3978cl_int error;3979bool useCreateImage;39803981#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)3982// Run-time decision based on the actual platform3983{3984cl_uint version = detail::getContextPlatformVersion(context());3985useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above3986}3987#elif defined(CL_VERSION_1_2)3988useCreateImage = true;3989#else3990useCreateImage = false;3991#endif39923993#if defined(CL_VERSION_1_2)3994if (useCreateImage)3995{3996cl_image_desc desc;3997desc.image_type = CL_MEM_OBJECT_IMAGE3D;3998desc.image_width = width;3999desc.image_height = height;4000desc.image_depth = depth;4001desc.image_row_pitch = row_pitch;4002desc.image_slice_pitch = slice_pitch;4003desc.num_mip_levels = 0;4004desc.num_samples = 0;4005desc.buffer = 0;4006object_ = ::clCreateImage(4007context(),4008flags,4009&format,4010&desc,4011host_ptr,4012&error);40134014detail::errHandler(error, __CREATE_IMAGE_ERR);4015if (err != NULL) {4016*err = error;4017}4018}4019#endif // #if defined(CL_VERSION_1_2)4020#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)4021if (!useCreateImage)4022{4023object_ = ::clCreateImage3D(4024context(), flags, &format, width, height, depth, row_pitch,4025slice_pitch, host_ptr, &error);40264027detail::errHandler(error, __CREATE_IMAGE3D_ERR);4028if (err != NULL) {4029*err = error;4030}4031}4032#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)4033}40344035//! \brief Default constructor - initializes to NULL.4036Image3D() { }40374038/*! \brief Copy constructor - performs shallow copy.4039*4040* See Memory for further details.4041*/4042Image3D(const Image3D& image3D) : Image(image3D) { }40434044/*! \brief Constructor from cl_mem - takes ownership.4045*4046* See Memory for further details.4047*/4048__CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { }40494050/*! \brief Assignment from Image3D - performs shallow copy.4051*4052* See Memory for further details.4053*/4054Image3D& operator = (const Image3D& rhs)4055{4056if (this != &rhs) {4057Image::operator=(rhs);4058}4059return *this;4060}40614062/*! \brief Assignment from cl_mem - performs shallow copy.4063*4064* See Memory for further details.4065*/4066Image3D& operator = (const cl_mem& rhs)4067{4068Image::operator=(rhs);4069return *this;4070}4071};40724073#if !defined(CL_VERSION_1_2)4074/*! \brief Class interface for GL 3D Image Memory objects.4075*4076* This is provided to facilitate interoperability with OpenGL.4077*4078* See Memory for details about copy semantics, etc.4079*4080* \see Memory4081*/4082class Image3DGL : public Image3D4083{4084public:4085/*! \brief Constructs an Image3DGL in a specified context, from a given4086* GL Texture.4087*4088* Wraps clCreateFromGLTexture3D().4089*/4090Image3DGL(4091const Context& context,4092cl_mem_flags flags,4093GLenum target,4094GLint miplevel,4095GLuint texobj,4096cl_int * err = NULL)4097{4098cl_int error;4099object_ = ::clCreateFromGLTexture3D(4100context(),4101flags,4102target,4103miplevel,4104texobj,4105&error);41064107detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR);4108if (err != NULL) {4109*err = error;4110}4111}41124113//! \brief Default constructor - initializes to NULL.4114Image3DGL() : Image3D() { }41154116/*! \brief Copy constructor - performs shallow copy.4117*4118* See Memory for further details.4119*/4120Image3DGL(const Image3DGL& image) : Image3D(image) { }41214122/*! \brief Constructor from cl_mem - takes ownership.4123*4124* See Memory for further details.4125*/4126__CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { }41274128/*! \brief Assignment from Image3DGL - performs shallow copy.4129*4130* See Memory for further details.4131*/4132Image3DGL& operator = (const Image3DGL& rhs)4133{4134if (this != &rhs) {4135Image3D::operator=(rhs);4136}4137return *this;4138}41394140/*! \brief Assignment from cl_mem - performs shallow copy.4141*4142* See Memory for further details.4143*/4144Image3DGL& operator = (const cl_mem& rhs)4145{4146Image3D::operator=(rhs);4147return *this;4148}4149};4150#endif // #if !defined(CL_VERSION_1_2)41514152#if defined(CL_VERSION_1_2)4153/*! \class ImageGL4154* \brief general image interface for GL interop.4155* We abstract the 2D and 3D GL images into a single instance here4156* that wraps all GL sourced images on the grounds that setup information4157* was performed by OpenCL anyway.4158*/4159class ImageGL : public Image4160{4161public:4162ImageGL(4163const Context& context,4164cl_mem_flags flags,4165GLenum target,4166GLint miplevel,4167GLuint texobj,4168cl_int * err = NULL)4169{4170cl_int error;4171object_ = ::clCreateFromGLTexture(4172context(),4173flags,4174target,4175miplevel,4176texobj,4177&error);41784179detail::errHandler(error, __CREATE_GL_TEXTURE_ERR);4180if (err != NULL) {4181*err = error;4182}4183}41844185ImageGL() : Image() { }41864187ImageGL(const ImageGL& image) : Image(image) { }41884189__CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { }41904191ImageGL& operator = (const ImageGL& rhs)4192{4193if (this != &rhs) {4194Image::operator=(rhs);4195}4196return *this;4197}41984199ImageGL& operator = (const cl_mem& rhs)4200{4201Image::operator=(rhs);4202return *this;4203}4204};4205#endif // #if defined(CL_VERSION_1_2)42064207/*! \brief Class interface for cl_sampler.4208*4209* \note Copies of these objects are shallow, meaning that the copy will refer4210* to the same underlying cl_sampler as the original. For details, see4211* clRetainSampler() and clReleaseSampler().4212*4213* \see cl_sampler4214*/4215class Sampler : public detail::Wrapper<cl_sampler>4216{4217public:4218/*! \brief Destructor.4219*4220* This calls clReleaseSampler() on the value held by this instance.4221*/4222~Sampler() { }42234224//! \brief Default constructor - initializes to NULL.4225Sampler() { }42264227/*! \brief Constructs a Sampler in a specified context.4228*4229* Wraps clCreateSampler().4230*/4231Sampler(4232const Context& context,4233cl_bool normalized_coords,4234cl_addressing_mode addressing_mode,4235cl_filter_mode filter_mode,4236cl_int* err = NULL)4237{4238cl_int error;4239object_ = ::clCreateSampler(4240context(),4241normalized_coords,4242addressing_mode,4243filter_mode,4244&error);42454246detail::errHandler(error, __CREATE_SAMPLER_ERR);4247if (err != NULL) {4248*err = error;4249}4250}42514252/*! \brief Copy constructor - performs shallow copy.4253*4254* This calls clRetainSampler() on the parameter's cl_sampler.4255*/4256Sampler(const Sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }42574258/*! \brief Constructor from cl_sampler - takes ownership.4259*4260* This effectively transfers ownership of a refcount on the cl_sampler4261* into the new Sampler object.4262*/4263Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }42644265/*! \brief Assignment operator from Sampler.4266*4267* This calls clRetainSampler() on the parameter and clReleaseSampler()4268* on the previous value held by this instance.4269*/4270Sampler& operator = (const Sampler& rhs)4271{4272if (this != &rhs) {4273detail::Wrapper<cl_type>::operator=(rhs);4274}4275return *this;4276}42774278/*! \brief Assignment operator from cl_sampler - takes ownership.4279*4280* This effectively transfers ownership of a refcount on the rhs and calls4281* clReleaseSampler() on the value previously held by this instance.4282*/4283Sampler& operator = (const cl_sampler& rhs)4284{4285detail::Wrapper<cl_type>::operator=(rhs);4286return *this;4287}42884289//! \brief Wrapper for clGetSamplerInfo().4290template <typename T>4291cl_int getInfo(cl_sampler_info name, T* param) const4292{4293return detail::errHandler(4294detail::getInfo(&::clGetSamplerInfo, object_, name, param),4295__GET_SAMPLER_INFO_ERR);4296}42974298//! \brief Wrapper for clGetSamplerInfo() that returns by value.4299template <cl_int name> typename4300detail::param_traits<detail::cl_sampler_info, name>::param_type4301getInfo(cl_int* err = NULL) const4302{4303typename detail::param_traits<4304detail::cl_sampler_info, name>::param_type param;4305cl_int result = getInfo(name, ¶m);4306if (err != NULL) {4307*err = result;4308}4309return param;4310}4311};43124313class Program;4314class CommandQueue;4315class Kernel;43164317//! \brief Class interface for specifying NDRange values.4318class NDRange4319{4320private:4321size_t<3> sizes_;4322cl_uint dimensions_;43234324public:4325//! \brief Default constructor - resulting range has zero dimensions.4326NDRange()4327: dimensions_(0)4328{ }43294330//! \brief Constructs one-dimensional range.4331NDRange(::size_t size0)4332: dimensions_(1)4333{4334sizes_[0] = size0;4335}43364337//! \brief Constructs two-dimensional range.4338NDRange(::size_t size0, ::size_t size1)4339: dimensions_(2)4340{4341sizes_[0] = size0;4342sizes_[1] = size1;4343}43444345//! \brief Constructs three-dimensional range.4346NDRange(::size_t size0, ::size_t size1, ::size_t size2)4347: dimensions_(3)4348{4349sizes_[0] = size0;4350sizes_[1] = size1;4351sizes_[2] = size2;4352}43534354/*! \brief Conversion operator to const ::size_t *.4355*4356* \returns a pointer to the size of the first dimension.4357*/4358operator const ::size_t*() const {4359return (const ::size_t*) sizes_;4360}43614362//! \brief Queries the number of dimensions in the range.4363::size_t dimensions() const { return dimensions_; }4364};43654366//! \brief A zero-dimensional range.4367static const NDRange NullRange;43684369//! \brief Local address wrapper for use with Kernel::setArg4370struct LocalSpaceArg4371{4372::size_t size_;4373};43744375namespace detail {43764377template <typename T>4378struct KernelArgumentHandler4379{4380static ::size_t size(const T&) { return sizeof(T); }4381static T* ptr(T& value) { return &value; }4382};43834384template <>4385struct KernelArgumentHandler<LocalSpaceArg>4386{4387static ::size_t size(const LocalSpaceArg& value) { return value.size_; }4388static void* ptr(LocalSpaceArg&) { return NULL; }4389};43904391}4392//! \endcond43934394/*! __local4395* \brief Helper function for generating LocalSpaceArg objects.4396* Deprecated. Replaced with Local.4397*/4398inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg4399__local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;4400inline LocalSpaceArg4401__local(::size_t size)4402{4403LocalSpaceArg ret = { size };4404return ret;4405}44064407/*! Local4408* \brief Helper function for generating LocalSpaceArg objects.4409*/4410inline LocalSpaceArg4411Local(::size_t size)4412{4413LocalSpaceArg ret = { size };4414return ret;4415}44164417//class KernelFunctor;44184419/*! \brief Class interface for cl_kernel.4420*4421* \note Copies of these objects are shallow, meaning that the copy will refer4422* to the same underlying cl_kernel as the original. For details, see4423* clRetainKernel() and clReleaseKernel().4424*4425* \see cl_kernel4426*/4427class Kernel : public detail::Wrapper<cl_kernel>4428{4429public:4430inline Kernel(const Program& program, const char* name, cl_int* err = NULL);44314432/*! \brief Destructor.4433*4434* This calls clReleaseKernel() on the value held by this instance.4435*/4436~Kernel() { }44374438//! \brief Default constructor - initializes to NULL.4439Kernel() { }44404441/*! \brief Copy constructor - performs shallow copy.4442*4443* This calls clRetainKernel() on the parameter's cl_kernel.4444*/4445Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }44464447/*! \brief Constructor from cl_kernel - takes ownership.4448*4449* This effectively transfers ownership of a refcount on the cl_kernel4450* into the new Kernel object.4451*/4452__CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }44534454/*! \brief Assignment operator from Kernel.4455*4456* This calls clRetainKernel() on the parameter and clReleaseKernel()4457* on the previous value held by this instance.4458*/4459Kernel& operator = (const Kernel& rhs)4460{4461if (this != &rhs) {4462detail::Wrapper<cl_type>::operator=(rhs);4463}4464return *this;4465}44664467/*! \brief Assignment operator from cl_kernel - takes ownership.4468*4469* This effectively transfers ownership of a refcount on the rhs and calls4470* clReleaseKernel() on the value previously held by this instance.4471*/4472Kernel& operator = (const cl_kernel& rhs)4473{4474detail::Wrapper<cl_type>::operator=(rhs);4475return *this;4476}44774478template <typename T>4479cl_int getInfo(cl_kernel_info name, T* param) const4480{4481return detail::errHandler(4482detail::getInfo(&::clGetKernelInfo, object_, name, param),4483__GET_KERNEL_INFO_ERR);4484}44854486template <cl_int name> typename4487detail::param_traits<detail::cl_kernel_info, name>::param_type4488getInfo(cl_int* err = NULL) const4489{4490typename detail::param_traits<4491detail::cl_kernel_info, name>::param_type param;4492cl_int result = getInfo(name, ¶m);4493if (err != NULL) {4494*err = result;4495}4496return param;4497}44984499#if defined(CL_VERSION_1_2)4500template <typename T>4501cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const4502{4503return detail::errHandler(4504detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param),4505__GET_KERNEL_ARG_INFO_ERR);4506}45074508template <cl_int name> typename4509detail::param_traits<detail::cl_kernel_arg_info, name>::param_type4510getArgInfo(cl_uint argIndex, cl_int* err = NULL) const4511{4512typename detail::param_traits<4513detail::cl_kernel_arg_info, name>::param_type param;4514cl_int result = getArgInfo(argIndex, name, ¶m);4515if (err != NULL) {4516*err = result;4517}4518return param;4519}4520#endif // #if defined(CL_VERSION_1_2)45214522template <typename T>4523cl_int getWorkGroupInfo(4524const Device& device, cl_kernel_work_group_info name, T* param) const4525{4526return detail::errHandler(4527detail::getInfo(4528&::clGetKernelWorkGroupInfo, object_, device(), name, param),4529__GET_KERNEL_WORK_GROUP_INFO_ERR);4530}45314532template <cl_int name> typename4533detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type4534getWorkGroupInfo(const Device& device, cl_int* err = NULL) const4535{4536typename detail::param_traits<4537detail::cl_kernel_work_group_info, name>::param_type param;4538cl_int result = getWorkGroupInfo(device, name, ¶m);4539if (err != NULL) {4540*err = result;4541}4542return param;4543}45444545template <typename T>4546cl_int setArg(cl_uint index, T value)4547{4548return detail::errHandler(4549::clSetKernelArg(4550object_,4551index,4552detail::KernelArgumentHandler<T>::size(value),4553detail::KernelArgumentHandler<T>::ptr(value)),4554__SET_KERNEL_ARGS_ERR);4555}45564557cl_int setArg(cl_uint index, ::size_t size, void* argPtr)4558{4559return detail::errHandler(4560::clSetKernelArg(object_, index, size, argPtr),4561__SET_KERNEL_ARGS_ERR);4562}4563};45644565/*! \class Program4566* \brief Program interface that implements cl_program.4567*/4568class Program : public detail::Wrapper<cl_program>4569{4570public:4571typedef VECTOR_CLASS<std::pair<const void*, ::size_t> > Binaries;4572typedef VECTOR_CLASS<std::pair<const char*, ::size_t> > Sources;45734574Program(4575const STRING_CLASS& source,4576cl_int* err = NULL)4577{4578cl_int error;45794580const char * strings = source.c_str();4581const ::size_t length = source.size();45824583Context context = Context::getDefault(err);45844585object_ = ::clCreateProgramWithSource(4586context(), (cl_uint)1, &strings, &length, &error);45874588detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);45894590if (error == CL_SUCCESS) {45914592error = ::clBuildProgram(4593object_,45940,4595NULL,4596"",4597NULL,4598NULL);45994600detail::errHandler(error, __BUILD_PROGRAM_ERR);4601}46024603if (err != NULL) {4604*err = error;4605}4606}46074608Program(4609const STRING_CLASS& source,4610bool build,4611cl_int* err = NULL)4612{4613cl_int error;46144615const char * strings = source.c_str();4616const ::size_t length = source.size();46174618Context context = Context::getDefault(err);46194620object_ = ::clCreateProgramWithSource(4621context(), (cl_uint)1, &strings, &length, &error);46224623detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);46244625if (error == CL_SUCCESS && build) {46264627error = ::clBuildProgram(4628object_,46290,4630NULL,4631"",4632NULL,4633NULL);46344635detail::errHandler(error, __BUILD_PROGRAM_ERR);4636}46374638if (err != NULL) {4639*err = error;4640}4641}46424643Program(4644const Context& context,4645const STRING_CLASS& source,4646bool build = false,4647cl_int* err = NULL)4648{4649cl_int error;46504651const char * strings = source.c_str();4652const ::size_t length = source.size();46534654object_ = ::clCreateProgramWithSource(4655context(), (cl_uint)1, &strings, &length, &error);46564657detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);46584659if (error == CL_SUCCESS && build) {46604661error = ::clBuildProgram(4662object_,46630,4664NULL,4665"",4666NULL,4667NULL);46684669detail::errHandler(error, __BUILD_PROGRAM_ERR);4670}46714672if (err != NULL) {4673*err = error;4674}4675}46764677Program(4678const Context& context,4679const Sources& sources,4680cl_int* err = NULL)4681{4682cl_int error;46834684const ::size_t n = (::size_t)sources.size();4685::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t));4686const char** strings = (const char**) alloca(n * sizeof(const char*));46874688for (::size_t i = 0; i < n; ++i) {4689strings[i] = sources[(int)i].first;4690lengths[i] = sources[(int)i].second;4691}46924693object_ = ::clCreateProgramWithSource(4694context(), (cl_uint)n, strings, lengths, &error);46954696detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);4697if (err != NULL) {4698*err = error;4699}4700}47014702/**4703* Construct a program object from a list of devices and a per-device list of binaries.4704* \param context A valid OpenCL context in which to construct the program.4705* \param devices A vector of OpenCL device objects for which the program will be created.4706* \param binaries A vector of pairs of a pointer to a binary object and its length.4707* \param binaryStatus An optional vector that on completion will be resized to4708* match the size of binaries and filled with values to specify if each binary4709* was successfully loaded.4710* Set to CL_SUCCESS if the binary was successfully loaded.4711* Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.4712* Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.4713* \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:4714* CL_INVALID_CONTEXT if context is not a valid context.4715* CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices;4716* or if any entry in binaries is NULL or has length 0.4717* CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.4718* CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device.4719* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.4720*/4721Program(4722const Context& context,4723const VECTOR_CLASS<Device>& devices,4724const Binaries& binaries,4725VECTOR_CLASS<cl_int>* binaryStatus = NULL,4726cl_int* err = NULL)4727{4728cl_int error;47294730const ::size_t numDevices = devices.size();47314732// Catch size mismatch early and return4733if(binaries.size() != numDevices) {4734error = CL_INVALID_VALUE;4735detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);4736if (err != NULL) {4737*err = error;4738}4739return;4740}47414742::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t));4743const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**));47444745for (::size_t i = 0; i < numDevices; ++i) {4746images[i] = (const unsigned char*)binaries[i].first;4747lengths[i] = binaries[(int)i].second;4748}47494750cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));4751for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {4752deviceIDs[deviceIndex] = (devices[deviceIndex])();4753}47544755if(binaryStatus) {4756binaryStatus->resize(numDevices);4757}47584759object_ = ::clCreateProgramWithBinary(4760context(), (cl_uint) devices.size(),4761deviceIDs,4762lengths, images, binaryStatus != NULL4763? &binaryStatus->front()4764: NULL, &error);47654766detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);4767if (err != NULL) {4768*err = error;4769}4770}477147724773#if defined(CL_VERSION_1_2)4774/**4775* Create program using builtin kernels.4776* \param kernelNames Semi-colon separated list of builtin kernel names4777*/4778Program(4779const Context& context,4780const VECTOR_CLASS<Device>& devices,4781const STRING_CLASS& kernelNames,4782cl_int* err = NULL)4783{4784cl_int error;478547864787::size_t numDevices = devices.size();4788cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));4789for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {4790deviceIDs[deviceIndex] = (devices[deviceIndex])();4791}47924793object_ = ::clCreateProgramWithBuiltInKernels(4794context(),4795(cl_uint) devices.size(),4796deviceIDs,4797kernelNames.c_str(),4798&error);47994800detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR);4801if (err != NULL) {4802*err = error;4803}4804}4805#endif // #if defined(CL_VERSION_1_2)48064807Program() { }48084809Program(const Program& program) : detail::Wrapper<cl_type>(program) { }48104811__CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { }48124813Program& operator = (const Program& rhs)4814{4815if (this != &rhs) {4816detail::Wrapper<cl_type>::operator=(rhs);4817}4818return *this;4819}48204821Program& operator = (const cl_program& rhs)4822{4823detail::Wrapper<cl_type>::operator=(rhs);4824return *this;4825}48264827cl_int build(4828const VECTOR_CLASS<Device>& devices,4829const char* options = NULL,4830void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,4831void* data = NULL) const4832{4833::size_t numDevices = devices.size();4834cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));4835for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {4836deviceIDs[deviceIndex] = (devices[deviceIndex])();4837}48384839return detail::errHandler(4840::clBuildProgram(4841object_,4842(cl_uint)4843devices.size(),4844deviceIDs,4845options,4846notifyFptr,4847data),4848__BUILD_PROGRAM_ERR);4849}48504851cl_int build(4852const char* options = NULL,4853void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,4854void* data = NULL) const4855{4856return detail::errHandler(4857::clBuildProgram(4858object_,48590,4860NULL,4861options,4862notifyFptr,4863data),4864__BUILD_PROGRAM_ERR);4865}48664867#if defined(CL_VERSION_1_2)4868cl_int compile(4869const char* options = NULL,4870void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,4871void* data = NULL) const4872{4873return detail::errHandler(4874::clCompileProgram(4875object_,48760,4877NULL,4878options,48790,4880NULL,4881NULL,4882notifyFptr,4883data),4884__COMPILE_PROGRAM_ERR);4885}4886#endif48874888template <typename T>4889cl_int getInfo(cl_program_info name, T* param) const4890{4891return detail::errHandler(4892detail::getInfo(&::clGetProgramInfo, object_, name, param),4893__GET_PROGRAM_INFO_ERR);4894}48954896template <cl_int name> typename4897detail::param_traits<detail::cl_program_info, name>::param_type4898getInfo(cl_int* err = NULL) const4899{4900typename detail::param_traits<4901detail::cl_program_info, name>::param_type param;4902cl_int result = getInfo(name, ¶m);4903if (err != NULL) {4904*err = result;4905}4906return param;4907}49084909template <typename T>4910cl_int getBuildInfo(4911const Device& device, cl_program_build_info name, T* param) const4912{4913return detail::errHandler(4914detail::getInfo(4915&::clGetProgramBuildInfo, object_, device(), name, param),4916__GET_PROGRAM_BUILD_INFO_ERR);4917}49184919template <cl_int name> typename4920detail::param_traits<detail::cl_program_build_info, name>::param_type4921getBuildInfo(const Device& device, cl_int* err = NULL) const4922{4923typename detail::param_traits<4924detail::cl_program_build_info, name>::param_type param;4925cl_int result = getBuildInfo(device, name, ¶m);4926if (err != NULL) {4927*err = result;4928}4929return param;4930}49314932cl_int createKernels(VECTOR_CLASS<Kernel>* kernels)4933{4934cl_uint numKernels;4935cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels);4936if (err != CL_SUCCESS) {4937return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);4938}49394940Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel));4941err = ::clCreateKernelsInProgram(4942object_, numKernels, (cl_kernel*) value, NULL);4943if (err != CL_SUCCESS) {4944return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);4945}49464947kernels->assign(&value[0], &value[numKernels]);4948return CL_SUCCESS;4949}4950};49514952#if defined(CL_VERSION_1_2)4953inline Program linkProgram(4954Program input1,4955Program input2,4956const char* options = NULL,4957void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,4958void* data = NULL,4959cl_int* err = NULL)4960{4961cl_int err_local = CL_SUCCESS;49624963cl_program programs[2] = { input1(), input2() };49644965Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>();49664967cl_program prog = ::clLinkProgram(4968ctx(),49690,4970NULL,4971options,49722,4973programs,4974notifyFptr,4975data,4976&err_local);49774978detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);4979if (err != NULL) {4980*err = err_local;4981}49824983return Program(prog);4984}49854986inline Program linkProgram(4987VECTOR_CLASS<Program> inputPrograms,4988const char* options = NULL,4989void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,4990void* data = NULL,4991cl_int* err = NULL)4992{4993cl_int err_local = CL_SUCCESS;49944995cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));49964997if (programs != NULL) {4998for (unsigned int i = 0; i < inputPrograms.size(); i++) {4999programs[i] = inputPrograms[i]();5000}5001}50025003cl_program prog = ::clLinkProgram(5004Context::getDefault()(),50050,5006NULL,5007options,5008(cl_uint)inputPrograms.size(),5009programs,5010notifyFptr,5011data,5012&err_local);50135014detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);5015if (err != NULL) {5016*err = err_local;5017}50185019return Program(prog);5020}5021#endif50225023template<>5024inline VECTOR_CLASS<char *> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* err) const5025{5026VECTOR_CLASS< ::size_t> sizes = getInfo<CL_PROGRAM_BINARY_SIZES>();5027VECTOR_CLASS<char *> binaries;5028for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s)5029{5030char *ptr = NULL;5031if (*s != 0)5032ptr = new char[*s];5033binaries.push_back(ptr);5034}50355036cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries);5037if (err != NULL) {5038*err = result;5039}5040return binaries;5041}50425043inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)5044{5045cl_int error;50465047object_ = ::clCreateKernel(program(), name, &error);5048detail::errHandler(error, __CREATE_KERNEL_ERR);50495050if (err != NULL) {5051*err = error;5052}50535054}50555056/*! \class CommandQueue5057* \brief CommandQueue interface for cl_command_queue.5058*/5059class CommandQueue : public detail::Wrapper<cl_command_queue>5060{5061private:5062static volatile int default_initialized_;5063static CommandQueue default_;5064static volatile cl_int default_error_;5065public:5066CommandQueue(5067cl_command_queue_properties properties,5068cl_int* err = NULL)5069{5070cl_int error;50715072Context context = Context::getDefault(&error);5073detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);50745075if (error != CL_SUCCESS) {5076if (err != NULL) {5077*err = error;5078}5079}5080else {5081Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];50825083object_ = ::clCreateCommandQueue(5084context(), device(), properties, &error);50855086detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);5087if (err != NULL) {5088*err = error;5089}5090}5091}50925093CommandQueue(5094const Context& context,5095const Device& device,5096cl_command_queue_properties properties = 0,5097cl_int* err = NULL)5098{5099cl_int error;5100object_ = ::clCreateCommandQueue(5101context(), device(), properties, &error);51025103detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);5104if (err != NULL) {5105*err = error;5106}5107}51085109static CommandQueue getDefault(cl_int * err = NULL)5110{5111int state = detail::compare_exchange(5112&default_initialized_,5113__DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);51145115if (state & __DEFAULT_INITIALIZED) {5116if (err != NULL) {5117*err = default_error_;5118}5119return default_;5120}51215122if (state & __DEFAULT_BEING_INITIALIZED) {5123// Assume writes will propagate eventually...5124while(default_initialized_ != __DEFAULT_INITIALIZED) {5125detail::fence();5126}51275128if (err != NULL) {5129*err = default_error_;5130}5131return default_;5132}51335134cl_int error;51355136Context context = Context::getDefault(&error);5137detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);51385139if (error != CL_SUCCESS) {5140if (err != NULL) {5141*err = error;5142}5143}5144else {5145Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];51465147default_ = CommandQueue(context, device, 0, &error);51485149detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);5150if (err != NULL) {5151*err = error;5152}5153}51545155detail::fence();51565157default_error_ = error;5158// Assume writes will propagate eventually...5159default_initialized_ = __DEFAULT_INITIALIZED;51605161detail::fence();51625163if (err != NULL) {5164*err = default_error_;5165}5166return default_;51675168}51695170CommandQueue() { }51715172CommandQueue(const CommandQueue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }51735174CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }51755176CommandQueue& operator = (const CommandQueue& rhs)5177{5178if (this != &rhs) {5179detail::Wrapper<cl_type>::operator=(rhs);5180}5181return *this;5182}51835184CommandQueue& operator = (const cl_command_queue& rhs)5185{5186detail::Wrapper<cl_type>::operator=(rhs);5187return *this;5188}51895190template <typename T>5191cl_int getInfo(cl_command_queue_info name, T* param) const5192{5193return detail::errHandler(5194detail::getInfo(5195&::clGetCommandQueueInfo, object_, name, param),5196__GET_COMMAND_QUEUE_INFO_ERR);5197}51985199template <cl_int name> typename5200detail::param_traits<detail::cl_command_queue_info, name>::param_type5201getInfo(cl_int* err = NULL) const5202{5203typename detail::param_traits<5204detail::cl_command_queue_info, name>::param_type param;5205cl_int result = getInfo(name, ¶m);5206if (err != NULL) {5207*err = result;5208}5209return param;5210}52115212cl_int enqueueReadBuffer(5213const Buffer& buffer,5214cl_bool blocking,5215::size_t offset,5216::size_t size,5217void* ptr,5218const VECTOR_CLASS<Event>* events = NULL,5219Event* event = NULL) const5220{5221cl_event tmp;5222cl_int err = detail::errHandler(5223::clEnqueueReadBuffer(5224object_, buffer(), blocking, offset, size,5225ptr,5226(events != NULL) ? (cl_uint) events->size() : 0,5227(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5228(event != NULL) ? &tmp : NULL),5229__ENQUEUE_READ_BUFFER_ERR);52305231if (event != NULL && err == CL_SUCCESS)5232*event = tmp;52335234return err;5235}52365237cl_int enqueueWriteBuffer(5238const Buffer& buffer,5239cl_bool blocking,5240::size_t offset,5241::size_t size,5242const void* ptr,5243const VECTOR_CLASS<Event>* events = NULL,5244Event* event = NULL) const5245{5246cl_event tmp;5247cl_int err = detail::errHandler(5248::clEnqueueWriteBuffer(5249object_, buffer(), blocking, offset, size,5250ptr,5251(events != NULL) ? (cl_uint) events->size() : 0,5252(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5253(event != NULL) ? &tmp : NULL),5254__ENQUEUE_WRITE_BUFFER_ERR);52555256if (event != NULL && err == CL_SUCCESS)5257*event = tmp;52585259return err;5260}52615262cl_int enqueueCopyBuffer(5263const Buffer& src,5264const Buffer& dst,5265::size_t src_offset,5266::size_t dst_offset,5267::size_t size,5268const VECTOR_CLASS<Event>* events = NULL,5269Event* event = NULL) const5270{5271cl_event tmp;5272cl_int err = detail::errHandler(5273::clEnqueueCopyBuffer(5274object_, src(), dst(), src_offset, dst_offset, size,5275(events != NULL) ? (cl_uint) events->size() : 0,5276(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5277(event != NULL) ? &tmp : NULL),5278__ENQEUE_COPY_BUFFER_ERR);52795280if (event != NULL && err == CL_SUCCESS)5281*event = tmp;52825283return err;5284}52855286cl_int enqueueReadBufferRect(5287const Buffer& buffer,5288cl_bool blocking,5289const size_t<3>& buffer_offset,5290const size_t<3>& host_offset,5291const size_t<3>& region,5292::size_t buffer_row_pitch,5293::size_t buffer_slice_pitch,5294::size_t host_row_pitch,5295::size_t host_slice_pitch,5296void *ptr,5297const VECTOR_CLASS<Event>* events = NULL,5298Event* event = NULL) const5299{5300cl_event tmp;5301cl_int err = detail::errHandler(5302::clEnqueueReadBufferRect(5303object_,5304buffer(),5305blocking,5306(const ::size_t *)buffer_offset,5307(const ::size_t *)host_offset,5308(const ::size_t *)region,5309buffer_row_pitch,5310buffer_slice_pitch,5311host_row_pitch,5312host_slice_pitch,5313ptr,5314(events != NULL) ? (cl_uint) events->size() : 0,5315(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5316(event != NULL) ? &tmp : NULL),5317__ENQUEUE_READ_BUFFER_RECT_ERR);53185319if (event != NULL && err == CL_SUCCESS)5320*event = tmp;53215322return err;5323}53245325cl_int enqueueWriteBufferRect(5326const Buffer& buffer,5327cl_bool blocking,5328const size_t<3>& buffer_offset,5329const size_t<3>& host_offset,5330const size_t<3>& region,5331::size_t buffer_row_pitch,5332::size_t buffer_slice_pitch,5333::size_t host_row_pitch,5334::size_t host_slice_pitch,5335void *ptr,5336const VECTOR_CLASS<Event>* events = NULL,5337Event* event = NULL) const5338{5339cl_event tmp;5340cl_int err = detail::errHandler(5341::clEnqueueWriteBufferRect(5342object_,5343buffer(),5344blocking,5345(const ::size_t *)buffer_offset,5346(const ::size_t *)host_offset,5347(const ::size_t *)region,5348buffer_row_pitch,5349buffer_slice_pitch,5350host_row_pitch,5351host_slice_pitch,5352ptr,5353(events != NULL) ? (cl_uint) events->size() : 0,5354(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5355(event != NULL) ? &tmp : NULL),5356__ENQUEUE_WRITE_BUFFER_RECT_ERR);53575358if (event != NULL && err == CL_SUCCESS)5359*event = tmp;53605361return err;5362}53635364cl_int enqueueCopyBufferRect(5365const Buffer& src,5366const Buffer& dst,5367const size_t<3>& src_origin,5368const size_t<3>& dst_origin,5369const size_t<3>& region,5370::size_t src_row_pitch,5371::size_t src_slice_pitch,5372::size_t dst_row_pitch,5373::size_t dst_slice_pitch,5374const VECTOR_CLASS<Event>* events = NULL,5375Event* event = NULL) const5376{5377cl_event tmp;5378cl_int err = detail::errHandler(5379::clEnqueueCopyBufferRect(5380object_,5381src(),5382dst(),5383(const ::size_t *)src_origin,5384(const ::size_t *)dst_origin,5385(const ::size_t *)region,5386src_row_pitch,5387src_slice_pitch,5388dst_row_pitch,5389dst_slice_pitch,5390(events != NULL) ? (cl_uint) events->size() : 0,5391(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5392(event != NULL) ? &tmp : NULL),5393__ENQEUE_COPY_BUFFER_RECT_ERR);53945395if (event != NULL && err == CL_SUCCESS)5396*event = tmp;53975398return err;5399}54005401#if defined(CL_VERSION_1_2)5402/**5403* Enqueue a command to fill a buffer object with a pattern5404* of a given size. The pattern is specified a as vector.5405* \tparam PatternType The datatype of the pattern field.5406* The pattern type must be an accepted OpenCL data type.5407*/5408template<typename PatternType>5409cl_int enqueueFillBuffer(5410const Buffer& buffer,5411PatternType pattern,5412::size_t offset,5413::size_t size,5414const VECTOR_CLASS<Event>* events = NULL,5415Event* event = NULL) const5416{5417cl_event tmp;5418cl_int err = detail::errHandler(5419::clEnqueueFillBuffer(5420object_,5421buffer(),5422static_cast<void*>(&pattern),5423sizeof(PatternType),5424offset,5425size,5426(events != NULL) ? (cl_uint) events->size() : 0,5427(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5428(event != NULL) ? &tmp : NULL),5429__ENQUEUE_FILL_BUFFER_ERR);54305431if (event != NULL && err == CL_SUCCESS)5432*event = tmp;54335434return err;5435}5436#endif // #if defined(CL_VERSION_1_2)54375438cl_int enqueueReadImage(5439const Image& image,5440cl_bool blocking,5441const size_t<3>& origin,5442const size_t<3>& region,5443::size_t row_pitch,5444::size_t slice_pitch,5445void* ptr,5446const VECTOR_CLASS<Event>* events = NULL,5447Event* event = NULL) const5448{5449cl_event tmp;5450cl_int err = detail::errHandler(5451::clEnqueueReadImage(5452object_, image(), blocking, (const ::size_t *) origin,5453(const ::size_t *) region, row_pitch, slice_pitch, ptr,5454(events != NULL) ? (cl_uint) events->size() : 0,5455(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5456(event != NULL) ? &tmp : NULL),5457__ENQUEUE_READ_IMAGE_ERR);54585459if (event != NULL && err == CL_SUCCESS)5460*event = tmp;54615462return err;5463}54645465cl_int enqueueWriteImage(5466const Image& image,5467cl_bool blocking,5468const size_t<3>& origin,5469const size_t<3>& region,5470::size_t row_pitch,5471::size_t slice_pitch,5472void* ptr,5473const VECTOR_CLASS<Event>* events = NULL,5474Event* event = NULL) const5475{5476cl_event tmp;5477cl_int err = detail::errHandler(5478::clEnqueueWriteImage(5479object_, image(), blocking, (const ::size_t *) origin,5480(const ::size_t *) region, row_pitch, slice_pitch, ptr,5481(events != NULL) ? (cl_uint) events->size() : 0,5482(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5483(event != NULL) ? &tmp : NULL),5484__ENQUEUE_WRITE_IMAGE_ERR);54855486if (event != NULL && err == CL_SUCCESS)5487*event = tmp;54885489return err;5490}54915492cl_int enqueueCopyImage(5493const Image& src,5494const Image& dst,5495const size_t<3>& src_origin,5496const size_t<3>& dst_origin,5497const size_t<3>& region,5498const VECTOR_CLASS<Event>* events = NULL,5499Event* event = NULL) const5500{5501cl_event tmp;5502cl_int err = detail::errHandler(5503::clEnqueueCopyImage(5504object_, src(), dst(), (const ::size_t *) src_origin,5505(const ::size_t *)dst_origin, (const ::size_t *) region,5506(events != NULL) ? (cl_uint) events->size() : 0,5507(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5508(event != NULL) ? &tmp : NULL),5509__ENQUEUE_COPY_IMAGE_ERR);55105511if (event != NULL && err == CL_SUCCESS)5512*event = tmp;55135514return err;5515}55165517#if defined(CL_VERSION_1_2)5518/**5519* Enqueue a command to fill an image object with a specified color.5520* \param fillColor is the color to use to fill the image.5521* This is a four component RGBA floating-point color value if5522* the image channel data type is not an unnormalized signed or5523* unsigned data type.5524*/5525cl_int enqueueFillImage(5526const Image& image,5527cl_float4 fillColor,5528const size_t<3>& origin,5529const size_t<3>& region,5530const VECTOR_CLASS<Event>* events = NULL,5531Event* event = NULL) const5532{5533cl_event tmp;5534cl_int err = detail::errHandler(5535::clEnqueueFillImage(5536object_,5537image(),5538static_cast<void*>(&fillColor),5539(const ::size_t *) origin,5540(const ::size_t *) region,5541(events != NULL) ? (cl_uint) events->size() : 0,5542(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5543(event != NULL) ? &tmp : NULL),5544__ENQUEUE_FILL_IMAGE_ERR);55455546if (event != NULL && err == CL_SUCCESS)5547*event = tmp;55485549return err;5550}55515552/**5553* Enqueue a command to fill an image object with a specified color.5554* \param fillColor is the color to use to fill the image.5555* This is a four component RGBA signed integer color value if5556* the image channel data type is an unnormalized signed integer5557* type.5558*/5559cl_int enqueueFillImage(5560const Image& image,5561cl_int4 fillColor,5562const size_t<3>& origin,5563const size_t<3>& region,5564const VECTOR_CLASS<Event>* events = NULL,5565Event* event = NULL) const5566{5567cl_event tmp;5568cl_int err = detail::errHandler(5569::clEnqueueFillImage(5570object_,5571image(),5572static_cast<void*>(&fillColor),5573(const ::size_t *) origin,5574(const ::size_t *) region,5575(events != NULL) ? (cl_uint) events->size() : 0,5576(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5577(event != NULL) ? &tmp : NULL),5578__ENQUEUE_FILL_IMAGE_ERR);55795580if (event != NULL && err == CL_SUCCESS)5581*event = tmp;55825583return err;5584}55855586/**5587* Enqueue a command to fill an image object with a specified color.5588* \param fillColor is the color to use to fill the image.5589* This is a four component RGBA unsigned integer color value if5590* the image channel data type is an unnormalized unsigned integer5591* type.5592*/5593cl_int enqueueFillImage(5594const Image& image,5595cl_uint4 fillColor,5596const size_t<3>& origin,5597const size_t<3>& region,5598const VECTOR_CLASS<Event>* events = NULL,5599Event* event = NULL) const5600{5601cl_event tmp;5602cl_int err = detail::errHandler(5603::clEnqueueFillImage(5604object_,5605image(),5606static_cast<void*>(&fillColor),5607(const ::size_t *) origin,5608(const ::size_t *) region,5609(events != NULL) ? (cl_uint) events->size() : 0,5610(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5611(event != NULL) ? &tmp : NULL),5612__ENQUEUE_FILL_IMAGE_ERR);56135614if (event != NULL && err == CL_SUCCESS)5615*event = tmp;56165617return err;5618}5619#endif // #if defined(CL_VERSION_1_2)56205621cl_int enqueueCopyImageToBuffer(5622const Image& src,5623const Buffer& dst,5624const size_t<3>& src_origin,5625const size_t<3>& region,5626::size_t dst_offset,5627const VECTOR_CLASS<Event>* events = NULL,5628Event* event = NULL) const5629{5630cl_event tmp;5631cl_int err = detail::errHandler(5632::clEnqueueCopyImageToBuffer(5633object_, src(), dst(), (const ::size_t *) src_origin,5634(const ::size_t *) region, dst_offset,5635(events != NULL) ? (cl_uint) events->size() : 0,5636(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5637(event != NULL) ? &tmp : NULL),5638__ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR);56395640if (event != NULL && err == CL_SUCCESS)5641*event = tmp;56425643return err;5644}56455646cl_int enqueueCopyBufferToImage(5647const Buffer& src,5648const Image& dst,5649::size_t src_offset,5650const size_t<3>& dst_origin,5651const size_t<3>& region,5652const VECTOR_CLASS<Event>* events = NULL,5653Event* event = NULL) const5654{5655cl_event tmp;5656cl_int err = detail::errHandler(5657::clEnqueueCopyBufferToImage(5658object_, src(), dst(), src_offset,5659(const ::size_t *) dst_origin, (const ::size_t *) region,5660(events != NULL) ? (cl_uint) events->size() : 0,5661(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5662(event != NULL) ? &tmp : NULL),5663__ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR);56645665if (event != NULL && err == CL_SUCCESS)5666*event = tmp;56675668return err;5669}56705671void* enqueueMapBuffer(5672const Buffer& buffer,5673cl_bool blocking,5674cl_map_flags flags,5675::size_t offset,5676::size_t size,5677const VECTOR_CLASS<Event>* events = NULL,5678Event* event = NULL,5679cl_int* err = NULL) const5680{5681cl_int error;5682void * result = ::clEnqueueMapBuffer(5683object_, buffer(), blocking, flags, offset, size,5684(events != NULL) ? (cl_uint) events->size() : 0,5685(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5686(cl_event*) event,5687&error);56885689detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);5690if (err != NULL) {5691*err = error;5692}5693return result;5694}56955696void* enqueueMapImage(5697const Image& buffer,5698cl_bool blocking,5699cl_map_flags flags,5700const size_t<3>& origin,5701const size_t<3>& region,5702::size_t * row_pitch,5703::size_t * slice_pitch,5704const VECTOR_CLASS<Event>* events = NULL,5705Event* event = NULL,5706cl_int* err = NULL) const5707{5708cl_int error;5709void * result = ::clEnqueueMapImage(5710object_, buffer(), blocking, flags,5711(const ::size_t *) origin, (const ::size_t *) region,5712row_pitch, slice_pitch,5713(events != NULL) ? (cl_uint) events->size() : 0,5714(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5715(cl_event*) event,5716&error);57175718detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);5719if (err != NULL) {5720*err = error;5721}5722return result;5723}57245725cl_int enqueueUnmapMemObject(5726const Memory& memory,5727void* mapped_ptr,5728const VECTOR_CLASS<Event>* events = NULL,5729Event* event = NULL) const5730{5731cl_event tmp;5732cl_int err = detail::errHandler(5733::clEnqueueUnmapMemObject(5734object_, memory(), mapped_ptr,5735(events != NULL) ? (cl_uint) events->size() : 0,5736(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5737(event != NULL) ? &tmp : NULL),5738__ENQUEUE_UNMAP_MEM_OBJECT_ERR);57395740if (event != NULL && err == CL_SUCCESS)5741*event = tmp;57425743return err;5744}57455746#if defined(CL_VERSION_1_2)5747/**5748* Enqueues a marker command which waits for either a list of events to complete,5749* or all previously enqueued commands to complete.5750*5751* Enqueues a marker command which waits for either a list of events to complete,5752* or if the list is empty it waits for all commands previously enqueued in command_queue5753* to complete before it completes. This command returns an event which can be waited on,5754* i.e. this event can be waited on to insure that all events either in the event_wait_list5755* or all previously enqueued commands, queued before this command to command_queue,5756* have completed.5757*/5758cl_int enqueueMarkerWithWaitList(5759const VECTOR_CLASS<Event> *events = 0,5760Event *event = 0)5761{5762cl_event tmp;5763cl_int err = detail::errHandler(5764::clEnqueueMarkerWithWaitList(5765object_,5766(events != NULL) ? (cl_uint) events->size() : 0,5767(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5768(event != NULL) ? &tmp : NULL),5769__ENQUEUE_MARKER_WAIT_LIST_ERR);57705771if (event != NULL && err == CL_SUCCESS)5772*event = tmp;57735774return err;5775}57765777/**5778* A synchronization point that enqueues a barrier operation.5779*5780* Enqueues a barrier command which waits for either a list of events to complete,5781* or if the list is empty it waits for all commands previously enqueued in command_queue5782* to complete before it completes. This command blocks command execution, that is, any5783* following commands enqueued after it do not execute until it completes. This command5784* returns an event which can be waited on, i.e. this event can be waited on to insure that5785* all events either in the event_wait_list or all previously enqueued commands, queued5786* before this command to command_queue, have completed.5787*/5788cl_int enqueueBarrierWithWaitList(5789const VECTOR_CLASS<Event> *events = 0,5790Event *event = 0)5791{5792cl_event tmp;5793cl_int err = detail::errHandler(5794::clEnqueueBarrierWithWaitList(5795object_,5796(events != NULL) ? (cl_uint) events->size() : 0,5797(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5798(event != NULL) ? &tmp : NULL),5799__ENQUEUE_BARRIER_WAIT_LIST_ERR);58005801if (event != NULL && err == CL_SUCCESS)5802*event = tmp;58035804return err;5805}58065807/**5808* Enqueues a command to indicate with which device a set of memory objects5809* should be associated.5810*/5811cl_int enqueueMigrateMemObjects(5812const VECTOR_CLASS<Memory> &memObjects,5813cl_mem_migration_flags flags,5814const VECTOR_CLASS<Event>* events = NULL,5815Event* event = NULL5816)5817{5818cl_event tmp;58195820cl_mem* localMemObjects = static_cast<cl_mem*>(alloca(memObjects.size() * sizeof(cl_mem)));5821for( int i = 0; i < (int)memObjects.size(); ++i ) {5822localMemObjects[i] = memObjects[i]();5823}582458255826cl_int err = detail::errHandler(5827::clEnqueueMigrateMemObjects(5828object_,5829(cl_uint)memObjects.size(),5830static_cast<const cl_mem*>(localMemObjects),5831flags,5832(events != NULL) ? (cl_uint) events->size() : 0,5833(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5834(event != NULL) ? &tmp : NULL),5835__ENQUEUE_UNMAP_MEM_OBJECT_ERR);58365837if (event != NULL && err == CL_SUCCESS)5838*event = tmp;58395840return err;5841}5842#endif // #if defined(CL_VERSION_1_2)58435844cl_int enqueueNDRangeKernel(5845const Kernel& kernel,5846const NDRange& offset,5847const NDRange& global,5848const NDRange& local = NullRange,5849const VECTOR_CLASS<Event>* events = NULL,5850Event* event = NULL) const5851{5852cl_event tmp;5853cl_int err = detail::errHandler(5854::clEnqueueNDRangeKernel(5855object_, kernel(), (cl_uint) global.dimensions(),5856offset.dimensions() != 0 ? (const ::size_t*) offset : NULL,5857(const ::size_t*) global,5858local.dimensions() != 0 ? (const ::size_t*) local : NULL,5859(events != NULL) ? (cl_uint) events->size() : 0,5860(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5861(event != NULL) ? &tmp : NULL),5862__ENQUEUE_NDRANGE_KERNEL_ERR);58635864if (event != NULL && err == CL_SUCCESS)5865*event = tmp;58665867return err;5868}58695870cl_int enqueueTask(5871const Kernel& kernel,5872const VECTOR_CLASS<Event>* events = NULL,5873Event* event = NULL) const5874{5875cl_event tmp;5876cl_int err = detail::errHandler(5877::clEnqueueTask(5878object_, kernel(),5879(events != NULL) ? (cl_uint) events->size() : 0,5880(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5881(event != NULL) ? &tmp : NULL),5882__ENQUEUE_TASK_ERR);58835884if (event != NULL && err == CL_SUCCESS)5885*event = tmp;58865887return err;5888}58895890cl_int enqueueNativeKernel(5891void (CL_CALLBACK *userFptr)(void *),5892std::pair<void*, ::size_t> args,5893const VECTOR_CLASS<Memory>* mem_objects = NULL,5894const VECTOR_CLASS<const void*>* mem_locs = NULL,5895const VECTOR_CLASS<Event>* events = NULL,5896Event* event = NULL) const5897{5898cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0)5899? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem))5900: NULL;59015902if (mems != NULL) {5903for (unsigned int i = 0; i < mem_objects->size(); i++) {5904mems[i] = ((*mem_objects)[i])();5905}5906}59075908cl_event tmp;5909cl_int err = detail::errHandler(5910::clEnqueueNativeKernel(5911object_, userFptr, args.first, args.second,5912(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,5913mems,5914(mem_locs != NULL) ? (const void **) &mem_locs->front() : NULL,5915(events != NULL) ? (cl_uint) events->size() : 0,5916(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5917(event != NULL) ? &tmp : NULL),5918__ENQUEUE_NATIVE_KERNEL);59195920if (event != NULL && err == CL_SUCCESS)5921*event = tmp;59225923return err;5924}59255926/**5927* Deprecated APIs for 1.25928*/5929#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))5930CL_EXT_PREFIX__VERSION_1_1_DEPRECATED5931cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED5932{5933return detail::errHandler(5934::clEnqueueMarker(object_, (cl_event*) event),5935__ENQUEUE_MARKER_ERR);5936}59375938CL_EXT_PREFIX__VERSION_1_1_DEPRECATED5939cl_int enqueueWaitForEvents(const VECTOR_CLASS<Event>& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED5940{5941return detail::errHandler(5942::clEnqueueWaitForEvents(5943object_,5944(cl_uint) events.size(),5945(const cl_event*) &events.front()),5946__ENQUEUE_WAIT_FOR_EVENTS_ERR);5947}5948#endif // #if defined(CL_VERSION_1_1)59495950cl_int enqueueAcquireGLObjects(5951const VECTOR_CLASS<Memory>* mem_objects = NULL,5952const VECTOR_CLASS<Event>* events = NULL,5953Event* event = NULL) const5954{5955cl_event tmp;5956cl_int err = detail::errHandler(5957::clEnqueueAcquireGLObjects(5958object_,5959(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,5960(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,5961(events != NULL) ? (cl_uint) events->size() : 0,5962(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5963(event != NULL) ? &tmp : NULL),5964__ENQUEUE_ACQUIRE_GL_ERR);59655966if (event != NULL && err == CL_SUCCESS)5967*event = tmp;59685969return err;5970}59715972cl_int enqueueReleaseGLObjects(5973const VECTOR_CLASS<Memory>* mem_objects = NULL,5974const VECTOR_CLASS<Event>* events = NULL,5975Event* event = NULL) const5976{5977cl_event tmp;5978cl_int err = detail::errHandler(5979::clEnqueueReleaseGLObjects(5980object_,5981(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,5982(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,5983(events != NULL) ? (cl_uint) events->size() : 0,5984(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,5985(event != NULL) ? &tmp : NULL),5986__ENQUEUE_RELEASE_GL_ERR);59875988if (event != NULL && err == CL_SUCCESS)5989*event = tmp;59905991return err;5992}59935994#if defined (USE_DX_INTEROP)5995typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)(5996cl_command_queue command_queue, cl_uint num_objects,5997const cl_mem* mem_objects, cl_uint num_events_in_wait_list,5998const cl_event* event_wait_list, cl_event* event);5999typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(6000cl_command_queue command_queue, cl_uint num_objects,6001const cl_mem* mem_objects, cl_uint num_events_in_wait_list,6002const cl_event* event_wait_list, cl_event* event);60036004cl_int enqueueAcquireD3D10Objects(6005const VECTOR_CLASS<Memory>* mem_objects = NULL,6006const VECTOR_CLASS<Event>* events = NULL,6007Event* event = NULL) const6008{6009static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL;6010#if defined(CL_VERSION_1_2)6011cl_context context = getInfo<CL_QUEUE_CONTEXT>();6012cl::Device device(getInfo<CL_QUEUE_DEVICE>());6013cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();6014__INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR);6015#endif6016#if defined(CL_VERSION_1_1)6017__INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR);6018#endif60196020cl_event tmp;6021cl_int err = detail::errHandler(6022pfn_clEnqueueAcquireD3D10ObjectsKHR(6023object_,6024(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,6025(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,6026(events != NULL) ? (cl_uint) events->size() : 0,6027(events != NULL) ? (cl_event*) &events->front() : NULL,6028(event != NULL) ? &tmp : NULL),6029__ENQUEUE_ACQUIRE_GL_ERR);60306031if (event != NULL && err == CL_SUCCESS)6032*event = tmp;60336034return err;6035}60366037cl_int enqueueReleaseD3D10Objects(6038const VECTOR_CLASS<Memory>* mem_objects = NULL,6039const VECTOR_CLASS<Event>* events = NULL,6040Event* event = NULL) const6041{6042static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL;6043#if defined(CL_VERSION_1_2)6044cl_context context = getInfo<CL_QUEUE_CONTEXT>();6045cl::Device device(getInfo<CL_QUEUE_DEVICE>());6046cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();6047__INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR);6048#endif // #if defined(CL_VERSION_1_2)6049#if defined(CL_VERSION_1_1)6050__INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR);6051#endif // #if defined(CL_VERSION_1_1)60526053cl_event tmp;6054cl_int err = detail::errHandler(6055pfn_clEnqueueReleaseD3D10ObjectsKHR(6056object_,6057(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,6058(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL,6059(events != NULL) ? (cl_uint) events->size() : 0,6060(events != NULL) ? (cl_event*) &events->front() : NULL,6061(event != NULL) ? &tmp : NULL),6062__ENQUEUE_RELEASE_GL_ERR);60636064if (event != NULL && err == CL_SUCCESS)6065*event = tmp;60666067return err;6068}6069#endif60706071/**6072* Deprecated APIs for 1.26073*/6074#if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))6075CL_EXT_PREFIX__VERSION_1_1_DEPRECATED6076cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED6077{6078return detail::errHandler(6079::clEnqueueBarrier(object_),6080__ENQUEUE_BARRIER_ERR);6081}6082#endif // #if defined(CL_VERSION_1_1)60836084cl_int flush() const6085{6086return detail::errHandler(::clFlush(object_), __FLUSH_ERR);6087}60886089cl_int finish() const6090{6091return detail::errHandler(::clFinish(object_), __FINISH_ERR);6092}6093};60946095#ifdef _WIN326096__declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;6097__declspec(selectany) CommandQueue CommandQueue::default_;6098__declspec(selectany) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS;6099#else6100__attribute__((weak)) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;6101__attribute__((weak)) CommandQueue CommandQueue::default_;6102__attribute__((weak)) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS;6103#endif61046105inline cl_int enqueueReadBuffer(6106const Buffer& buffer,6107cl_bool blocking,6108::size_t offset,6109::size_t size,6110void* ptr,6111const VECTOR_CLASS<Event>* events = NULL,6112Event* event = NULL)6113{6114cl_int error;6115CommandQueue queue = CommandQueue::getDefault(&error);61166117if (error != CL_SUCCESS) {6118return error;6119}61206121return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event);6122}61236124inline cl_int enqueueWriteBuffer(6125const Buffer& buffer,6126cl_bool blocking,6127::size_t offset,6128::size_t size,6129const void* ptr,6130const VECTOR_CLASS<Event>* events = NULL,6131Event* event = NULL)6132{6133cl_int error;6134CommandQueue queue = CommandQueue::getDefault(&error);61356136if (error != CL_SUCCESS) {6137return error;6138}61396140return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event);6141}61426143inline void* enqueueMapBuffer(6144const Buffer& buffer,6145cl_bool blocking,6146cl_map_flags flags,6147::size_t offset,6148::size_t size,6149const VECTOR_CLASS<Event>* events = NULL,6150Event* event = NULL,6151cl_int* err = NULL)6152{6153cl_int error;6154CommandQueue queue = CommandQueue::getDefault(&error);6155detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);6156if (err != NULL) {6157*err = error;6158}61596160void * result = ::clEnqueueMapBuffer(6161queue(), buffer(), blocking, flags, offset, size,6162(events != NULL) ? (cl_uint) events->size() : 0,6163(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,6164(cl_event*) event,6165&error);61666167detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);6168if (err != NULL) {6169*err = error;6170}6171return result;6172}61736174inline cl_int enqueueUnmapMemObject(6175const Memory& memory,6176void* mapped_ptr,6177const VECTOR_CLASS<Event>* events = NULL,6178Event* event = NULL)6179{6180cl_int error;6181CommandQueue queue = CommandQueue::getDefault(&error);6182detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);6183if (error != CL_SUCCESS) {6184return error;6185}61866187cl_event tmp;6188cl_int err = detail::errHandler(6189::clEnqueueUnmapMemObject(6190queue(), memory(), mapped_ptr,6191(events != NULL) ? (cl_uint) events->size() : 0,6192(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,6193(event != NULL) ? &tmp : NULL),6194__ENQUEUE_UNMAP_MEM_OBJECT_ERR);61956196if (event != NULL && err == CL_SUCCESS)6197*event = tmp;61986199return err;6200}62016202inline cl_int enqueueCopyBuffer(6203const Buffer& src,6204const Buffer& dst,6205::size_t src_offset,6206::size_t dst_offset,6207::size_t size,6208const VECTOR_CLASS<Event>* events = NULL,6209Event* event = NULL)6210{6211cl_int error;6212CommandQueue queue = CommandQueue::getDefault(&error);62136214if (error != CL_SUCCESS) {6215return error;6216}62176218return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event);6219}62206221/**6222* Blocking copy operation between iterators and a buffer.6223*/6224template< typename IteratorType >6225inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )6226{6227typedef typename std::iterator_traits<IteratorType>::value_type DataType;6228cl_int error;62296230::size_t length = endIterator-startIterator;6231::size_t byteLength = length*sizeof(DataType);62326233DataType *pointer =6234static_cast<DataType*>(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));6235// if exceptions enabled, enqueueMapBuffer will throw6236if( error != CL_SUCCESS ) {6237return error;6238}6239#if defined(_MSC_VER)6240std::copy(6241startIterator,6242endIterator,6243stdext::checked_array_iterator<DataType*>(6244pointer, length));6245#else6246std::copy(startIterator, endIterator, pointer);6247#endif6248Event endEvent;6249error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);6250// if exceptions enabled, enqueueUnmapMemObject will throw6251if( error != CL_SUCCESS ) {6252return error;6253}6254endEvent.wait();6255return CL_SUCCESS;6256}62576258/**6259* Blocking copy operation between iterators and a buffer.6260*/6261template< typename IteratorType >6262inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )6263{6264typedef typename std::iterator_traits<IteratorType>::value_type DataType;6265cl_int error;62666267::size_t length = endIterator-startIterator;6268::size_t byteLength = length*sizeof(DataType);62696270DataType *pointer =6271static_cast<DataType*>(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));6272// if exceptions enabled, enqueueMapBuffer will throw6273if( error != CL_SUCCESS ) {6274return error;6275}6276std::copy(pointer, pointer + length, startIterator);6277Event endEvent;6278error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);6279// if exceptions enabled, enqueueUnmapMemObject will throw6280if( error != CL_SUCCESS ) {6281return error;6282}6283endEvent.wait();6284return CL_SUCCESS;6285}62866287#if defined(CL_VERSION_1_1)6288inline cl_int enqueueReadBufferRect(6289const Buffer& buffer,6290cl_bool blocking,6291const size_t<3>& buffer_offset,6292const size_t<3>& host_offset,6293const size_t<3>& region,6294::size_t buffer_row_pitch,6295::size_t buffer_slice_pitch,6296::size_t host_row_pitch,6297::size_t host_slice_pitch,6298void *ptr,6299const VECTOR_CLASS<Event>* events = NULL,6300Event* event = NULL)6301{6302cl_int error;6303CommandQueue queue = CommandQueue::getDefault(&error);63046305if (error != CL_SUCCESS) {6306return error;6307}63086309return queue.enqueueReadBufferRect(6310buffer,6311blocking,6312buffer_offset,6313host_offset,6314region,6315buffer_row_pitch,6316buffer_slice_pitch,6317host_row_pitch,6318host_slice_pitch,6319ptr,6320events,6321event);6322}63236324inline cl_int enqueueWriteBufferRect(6325const Buffer& buffer,6326cl_bool blocking,6327const size_t<3>& buffer_offset,6328const size_t<3>& host_offset,6329const size_t<3>& region,6330::size_t buffer_row_pitch,6331::size_t buffer_slice_pitch,6332::size_t host_row_pitch,6333::size_t host_slice_pitch,6334void *ptr,6335const VECTOR_CLASS<Event>* events = NULL,6336Event* event = NULL)6337{6338cl_int error;6339CommandQueue queue = CommandQueue::getDefault(&error);63406341if (error != CL_SUCCESS) {6342return error;6343}63446345return queue.enqueueWriteBufferRect(6346buffer,6347blocking,6348buffer_offset,6349host_offset,6350region,6351buffer_row_pitch,6352buffer_slice_pitch,6353host_row_pitch,6354host_slice_pitch,6355ptr,6356events,6357event);6358}63596360inline cl_int enqueueCopyBufferRect(6361const Buffer& src,6362const Buffer& dst,6363const size_t<3>& src_origin,6364const size_t<3>& dst_origin,6365const size_t<3>& region,6366::size_t src_row_pitch,6367::size_t src_slice_pitch,6368::size_t dst_row_pitch,6369::size_t dst_slice_pitch,6370const VECTOR_CLASS<Event>* events = NULL,6371Event* event = NULL)6372{6373cl_int error;6374CommandQueue queue = CommandQueue::getDefault(&error);63756376if (error != CL_SUCCESS) {6377return error;6378}63796380return queue.enqueueCopyBufferRect(6381src,6382dst,6383src_origin,6384dst_origin,6385region,6386src_row_pitch,6387src_slice_pitch,6388dst_row_pitch,6389dst_slice_pitch,6390events,6391event);6392}6393#endif63946395inline cl_int enqueueReadImage(6396const Image& image,6397cl_bool blocking,6398const size_t<3>& origin,6399const size_t<3>& region,6400::size_t row_pitch,6401::size_t slice_pitch,6402void* ptr,6403const VECTOR_CLASS<Event>* events = NULL,6404Event* event = NULL)6405{6406cl_int error;6407CommandQueue queue = CommandQueue::getDefault(&error);64086409if (error != CL_SUCCESS) {6410return error;6411}64126413return queue.enqueueReadImage(6414image,6415blocking,6416origin,6417region,6418row_pitch,6419slice_pitch,6420ptr,6421events,6422event);6423}64246425inline cl_int enqueueWriteImage(6426const Image& image,6427cl_bool blocking,6428const size_t<3>& origin,6429const size_t<3>& region,6430::size_t row_pitch,6431::size_t slice_pitch,6432void* ptr,6433const VECTOR_CLASS<Event>* events = NULL,6434Event* event = NULL)6435{6436cl_int error;6437CommandQueue queue = CommandQueue::getDefault(&error);64386439if (error != CL_SUCCESS) {6440return error;6441}64426443return queue.enqueueWriteImage(6444image,6445blocking,6446origin,6447region,6448row_pitch,6449slice_pitch,6450ptr,6451events,6452event);6453}64546455inline cl_int enqueueCopyImage(6456const Image& src,6457const Image& dst,6458const size_t<3>& src_origin,6459const size_t<3>& dst_origin,6460const size_t<3>& region,6461const VECTOR_CLASS<Event>* events = NULL,6462Event* event = NULL)6463{6464cl_int error;6465CommandQueue queue = CommandQueue::getDefault(&error);64666467if (error != CL_SUCCESS) {6468return error;6469}64706471return queue.enqueueCopyImage(6472src,6473dst,6474src_origin,6475dst_origin,6476region,6477events,6478event);6479}64806481inline cl_int enqueueCopyImageToBuffer(6482const Image& src,6483const Buffer& dst,6484const size_t<3>& src_origin,6485const size_t<3>& region,6486::size_t dst_offset,6487const VECTOR_CLASS<Event>* events = NULL,6488Event* event = NULL)6489{6490cl_int error;6491CommandQueue queue = CommandQueue::getDefault(&error);64926493if (error != CL_SUCCESS) {6494return error;6495}64966497return queue.enqueueCopyImageToBuffer(6498src,6499dst,6500src_origin,6501region,6502dst_offset,6503events,6504event);6505}65066507inline cl_int enqueueCopyBufferToImage(6508const Buffer& src,6509const Image& dst,6510::size_t src_offset,6511const size_t<3>& dst_origin,6512const size_t<3>& region,6513const VECTOR_CLASS<Event>* events = NULL,6514Event* event = NULL)6515{6516cl_int error;6517CommandQueue queue = CommandQueue::getDefault(&error);65186519if (error != CL_SUCCESS) {6520return error;6521}65226523return queue.enqueueCopyBufferToImage(6524src,6525dst,6526src_offset,6527dst_origin,6528region,6529events,6530event);6531}653265336534inline cl_int flush(void)6535{6536cl_int error;6537CommandQueue queue = CommandQueue::getDefault(&error);65386539if (error != CL_SUCCESS) {6540return error;6541}65426543return queue.flush();6544}65456546inline cl_int finish(void)6547{6548cl_int error;6549CommandQueue queue = CommandQueue::getDefault(&error);65506551if (error != CL_SUCCESS) {6552return error;6553}655465556556return queue.finish();6557}65586559// Kernel Functor support6560// New interface as of September 20116561// Requires the C++11 std::tr1::function (note do not support TR1)6562// Visual Studio 2010 and GCC 4.265636564struct EnqueueArgs6565{6566CommandQueue queue_;6567const NDRange offset_;6568const NDRange global_;6569const NDRange local_;6570VECTOR_CLASS<Event> events_;65716572EnqueueArgs(NDRange global) :6573queue_(CommandQueue::getDefault()),6574offset_(NullRange),6575global_(global),6576local_(NullRange)6577{65786579}65806581EnqueueArgs(NDRange global, NDRange local) :6582queue_(CommandQueue::getDefault()),6583offset_(NullRange),6584global_(global),6585local_(local)6586{65876588}65896590EnqueueArgs(NDRange offset, NDRange global, NDRange local) :6591queue_(CommandQueue::getDefault()),6592offset_(offset),6593global_(global),6594local_(local)6595{65966597}65986599EnqueueArgs(Event e, NDRange global) :6600queue_(CommandQueue::getDefault()),6601offset_(NullRange),6602global_(global),6603local_(NullRange)6604{6605events_.push_back(e);6606}66076608EnqueueArgs(Event e, NDRange global, NDRange local) :6609queue_(CommandQueue::getDefault()),6610offset_(NullRange),6611global_(global),6612local_(local)6613{6614events_.push_back(e);6615}66166617EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) :6618queue_(CommandQueue::getDefault()),6619offset_(offset),6620global_(global),6621local_(local)6622{6623events_.push_back(e);6624}66256626EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global) :6627queue_(CommandQueue::getDefault()),6628offset_(NullRange),6629global_(global),6630local_(NullRange),6631events_(events)6632{66336634}66356636EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :6637queue_(CommandQueue::getDefault()),6638offset_(NullRange),6639global_(global),6640local_(local),6641events_(events)6642{66436644}66456646EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :6647queue_(CommandQueue::getDefault()),6648offset_(offset),6649global_(global),6650local_(local),6651events_(events)6652{66536654}66556656EnqueueArgs(CommandQueue &queue, NDRange global) :6657queue_(queue),6658offset_(NullRange),6659global_(global),6660local_(NullRange)6661{66626663}66646665EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) :6666queue_(queue),6667offset_(NullRange),6668global_(global),6669local_(local)6670{66716672}66736674EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) :6675queue_(queue),6676offset_(offset),6677global_(global),6678local_(local)6679{66806681}66826683EnqueueArgs(CommandQueue &queue, Event e, NDRange global) :6684queue_(queue),6685offset_(NullRange),6686global_(global),6687local_(NullRange)6688{6689events_.push_back(e);6690}66916692EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) :6693queue_(queue),6694offset_(NullRange),6695global_(global),6696local_(local)6697{6698events_.push_back(e);6699}67006701EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) :6702queue_(queue),6703offset_(offset),6704global_(global),6705local_(local)6706{6707events_.push_back(e);6708}67096710EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global) :6711queue_(queue),6712offset_(NullRange),6713global_(global),6714local_(NullRange),6715events_(events)6716{67176718}67196720EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :6721queue_(queue),6722offset_(NullRange),6723global_(global),6724local_(local),6725events_(events)6726{67276728}67296730EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :6731queue_(queue),6732offset_(offset),6733global_(global),6734local_(local),6735events_(events)6736{67376738}6739};67406741namespace detail {67426743class NullType {};67446745template<int index, typename T0>6746struct SetArg6747{6748static void set (Kernel kernel, T0 arg)6749{6750kernel.setArg(index, arg);6751}6752};67536754template<int index>6755struct SetArg<index, NullType>6756{6757static void set (Kernel, NullType)6758{6759}6760};67616762template <6763typename T0, typename T1, typename T2, typename T3,6764typename T4, typename T5, typename T6, typename T7,6765typename T8, typename T9, typename T10, typename T11,6766typename T12, typename T13, typename T14, typename T15,6767typename T16, typename T17, typename T18, typename T19,6768typename T20, typename T21, typename T22, typename T23,6769typename T24, typename T25, typename T26, typename T27,6770typename T28, typename T29, typename T30, typename T316771>6772class KernelFunctorGlobal6773{6774private:6775Kernel kernel_;67766777public:6778KernelFunctorGlobal(6779Kernel kernel) :6780kernel_(kernel)6781{}67826783KernelFunctorGlobal(6784const Program& program,6785const STRING_CLASS name,6786cl_int * err = NULL) :6787kernel_(program, name.c_str(), err)6788{}67896790Event operator() (6791const EnqueueArgs& args,6792T0 t0,6793T1 t1 = NullType(),6794T2 t2 = NullType(),6795T3 t3 = NullType(),6796T4 t4 = NullType(),6797T5 t5 = NullType(),6798T6 t6 = NullType(),6799T7 t7 = NullType(),6800T8 t8 = NullType(),6801T9 t9 = NullType(),6802T10 t10 = NullType(),6803T11 t11 = NullType(),6804T12 t12 = NullType(),6805T13 t13 = NullType(),6806T14 t14 = NullType(),6807T15 t15 = NullType(),6808T16 t16 = NullType(),6809T17 t17 = NullType(),6810T18 t18 = NullType(),6811T19 t19 = NullType(),6812T20 t20 = NullType(),6813T21 t21 = NullType(),6814T22 t22 = NullType(),6815T23 t23 = NullType(),6816T24 t24 = NullType(),6817T25 t25 = NullType(),6818T26 t26 = NullType(),6819T27 t27 = NullType(),6820T28 t28 = NullType(),6821T29 t29 = NullType(),6822T30 t30 = NullType(),6823T31 t31 = NullType()6824)6825{6826Event event;6827SetArg<0, T0>::set(kernel_, t0);6828SetArg<1, T1>::set(kernel_, t1);6829SetArg<2, T2>::set(kernel_, t2);6830SetArg<3, T3>::set(kernel_, t3);6831SetArg<4, T4>::set(kernel_, t4);6832SetArg<5, T5>::set(kernel_, t5);6833SetArg<6, T6>::set(kernel_, t6);6834SetArg<7, T7>::set(kernel_, t7);6835SetArg<8, T8>::set(kernel_, t8);6836SetArg<9, T9>::set(kernel_, t9);6837SetArg<10, T10>::set(kernel_, t10);6838SetArg<11, T11>::set(kernel_, t11);6839SetArg<12, T12>::set(kernel_, t12);6840SetArg<13, T13>::set(kernel_, t13);6841SetArg<14, T14>::set(kernel_, t14);6842SetArg<15, T15>::set(kernel_, t15);6843SetArg<16, T16>::set(kernel_, t16);6844SetArg<17, T17>::set(kernel_, t17);6845SetArg<18, T18>::set(kernel_, t18);6846SetArg<19, T19>::set(kernel_, t19);6847SetArg<20, T20>::set(kernel_, t20);6848SetArg<21, T21>::set(kernel_, t21);6849SetArg<22, T22>::set(kernel_, t22);6850SetArg<23, T23>::set(kernel_, t23);6851SetArg<24, T24>::set(kernel_, t24);6852SetArg<25, T25>::set(kernel_, t25);6853SetArg<26, T26>::set(kernel_, t26);6854SetArg<27, T27>::set(kernel_, t27);6855SetArg<28, T28>::set(kernel_, t28);6856SetArg<29, T29>::set(kernel_, t29);6857SetArg<30, T30>::set(kernel_, t30);6858SetArg<31, T31>::set(kernel_, t31);68596860args.queue_.enqueueNDRangeKernel(6861kernel_,6862args.offset_,6863args.global_,6864args.local_,6865&args.events_,6866&event);68676868return event;6869}68706871};68726873//------------------------------------------------------------------------------------------------------687468756876template<6877typename T0,6878typename T1,6879typename T2,6880typename T3,6881typename T4,6882typename T5,6883typename T6,6884typename T7,6885typename T8,6886typename T9,6887typename T10,6888typename T11,6889typename T12,6890typename T13,6891typename T14,6892typename T15,6893typename T16,6894typename T17,6895typename T18,6896typename T19,6897typename T20,6898typename T21,6899typename T22,6900typename T23,6901typename T24,6902typename T25,6903typename T26,6904typename T27,6905typename T28,6906typename T29,6907typename T30,6908typename T31>6909struct functionImplementation_6910{6911typedef detail::KernelFunctorGlobal<6912T0,6913T1,6914T2,6915T3,6916T4,6917T5,6918T6,6919T7,6920T8,6921T9,6922T10,6923T11,6924T12,6925T13,6926T14,6927T15,6928T16,6929T17,6930T18,6931T19,6932T20,6933T21,6934T22,6935T23,6936T24,6937T25,6938T26,6939T27,6940T28,6941T29,6942T30,6943T31> FunctorType;69446945FunctorType functor_;69466947functionImplementation_(const FunctorType &functor) :6948functor_(functor)6949{69506951#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32))6952// Fail variadic expansion for dev116953static_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.");6954#endif69556956}69576958//! \brief Return type of the functor6959typedef Event result_type;69606961//! \brief Function signature of kernel functor with no event dependency.6962typedef Event type_(6963const EnqueueArgs&,6964T0,6965T1,6966T2,6967T3,6968T4,6969T5,6970T6,6971T7,6972T8,6973T9,6974T10,6975T11,6976T12,6977T13,6978T14,6979T15,6980T16,6981T17,6982T18,6983T19,6984T20,6985T21,6986T22,6987T23,6988T24,6989T25,6990T26,6991T27,6992T28,6993T29,6994T30,6995T31);69966997Event operator()(6998const EnqueueArgs& enqueueArgs,6999T0 arg0,7000T1 arg1,7001T2 arg2,7002T3 arg3,7003T4 arg4,7004T5 arg5,7005T6 arg6,7006T7 arg7,7007T8 arg8,7008T9 arg9,7009T10 arg10,7010T11 arg11,7011T12 arg12,7012T13 arg13,7013T14 arg14,7014T15 arg15,7015T16 arg16,7016T17 arg17,7017T18 arg18,7018T19 arg19,7019T20 arg20,7020T21 arg21,7021T22 arg22,7022T23 arg23,7023T24 arg24,7024T25 arg25,7025T26 arg26,7026T27 arg27,7027T28 arg28,7028T29 arg29,7029T30 arg30,7030T31 arg31)7031{7032return functor_(7033enqueueArgs,7034arg0,7035arg1,7036arg2,7037arg3,7038arg4,7039arg5,7040arg6,7041arg7,7042arg8,7043arg9,7044arg10,7045arg11,7046arg12,7047arg13,7048arg14,7049arg15,7050arg16,7051arg17,7052arg18,7053arg19,7054arg20,7055arg21,7056arg22,7057arg23,7058arg24,7059arg25,7060arg26,7061arg27,7062arg28,7063arg29,7064arg30,7065arg31);7066}706770687069};70707071template<7072typename T0,7073typename T1,7074typename T2,7075typename T3,7076typename T4,7077typename T5,7078typename T6,7079typename T7,7080typename T8,7081typename T9,7082typename T10,7083typename T11,7084typename T12,7085typename T13,7086typename T14,7087typename T15,7088typename T16,7089typename T17,7090typename T18,7091typename T19,7092typename T20,7093typename T21,7094typename T22,7095typename T23,7096typename T24,7097typename T25,7098typename T26,7099typename T27,7100typename T28,7101typename T29,7102typename T30>7103struct functionImplementation_7104< T0,7105T1,7106T2,7107T3,7108T4,7109T5,7110T6,7111T7,7112T8,7113T9,7114T10,7115T11,7116T12,7117T13,7118T14,7119T15,7120T16,7121T17,7122T18,7123T19,7124T20,7125T21,7126T22,7127T23,7128T24,7129T25,7130T26,7131T27,7132T28,7133T29,7134T30,7135NullType>7136{7137typedef detail::KernelFunctorGlobal<7138T0,7139T1,7140T2,7141T3,7142T4,7143T5,7144T6,7145T7,7146T8,7147T9,7148T10,7149T11,7150T12,7151T13,7152T14,7153T15,7154T16,7155T17,7156T18,7157T19,7158T20,7159T21,7160T22,7161T23,7162T24,7163T25,7164T26,7165T27,7166T28,7167T29,7168T30,7169NullType> FunctorType;71707171FunctorType functor_;71727173functionImplementation_(const FunctorType &functor) :7174functor_(functor)7175{71767177#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31))7178// Fail variadic expansion for dev117179static_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.");7180#endif71817182}71837184//! \brief Return type of the functor7185typedef Event result_type;71867187//! \brief Function signature of kernel functor with no event dependency.7188typedef Event type_(7189const EnqueueArgs&,7190T0,7191T1,7192T2,7193T3,7194T4,7195T5,7196T6,7197T7,7198T8,7199T9,7200T10,7201T11,7202T12,7203T13,7204T14,7205T15,7206T16,7207T17,7208T18,7209T19,7210T20,7211T21,7212T22,7213T23,7214T24,7215T25,7216T26,7217T27,7218T28,7219T29,7220T30);72217222Event operator()(7223const EnqueueArgs& enqueueArgs,7224T0 arg0,7225T1 arg1,7226T2 arg2,7227T3 arg3,7228T4 arg4,7229T5 arg5,7230T6 arg6,7231T7 arg7,7232T8 arg8,7233T9 arg9,7234T10 arg10,7235T11 arg11,7236T12 arg12,7237T13 arg13,7238T14 arg14,7239T15 arg15,7240T16 arg16,7241T17 arg17,7242T18 arg18,7243T19 arg19,7244T20 arg20,7245T21 arg21,7246T22 arg22,7247T23 arg23,7248T24 arg24,7249T25 arg25,7250T26 arg26,7251T27 arg27,7252T28 arg28,7253T29 arg29,7254T30 arg30)7255{7256return functor_(7257enqueueArgs,7258arg0,7259arg1,7260arg2,7261arg3,7262arg4,7263arg5,7264arg6,7265arg7,7266arg8,7267arg9,7268arg10,7269arg11,7270arg12,7271arg13,7272arg14,7273arg15,7274arg16,7275arg17,7276arg18,7277arg19,7278arg20,7279arg21,7280arg22,7281arg23,7282arg24,7283arg25,7284arg26,7285arg27,7286arg28,7287arg29,7288arg30);7289}729072917292};72937294template<7295typename T0,7296typename T1,7297typename T2,7298typename T3,7299typename T4,7300typename T5,7301typename T6,7302typename T7,7303typename T8,7304typename T9,7305typename T10,7306typename T11,7307typename T12,7308typename T13,7309typename T14,7310typename T15,7311typename T16,7312typename T17,7313typename T18,7314typename T19,7315typename T20,7316typename T21,7317typename T22,7318typename T23,7319typename T24,7320typename T25,7321typename T26,7322typename T27,7323typename T28,7324typename T29>7325struct functionImplementation_7326< T0,7327T1,7328T2,7329T3,7330T4,7331T5,7332T6,7333T7,7334T8,7335T9,7336T10,7337T11,7338T12,7339T13,7340T14,7341T15,7342T16,7343T17,7344T18,7345T19,7346T20,7347T21,7348T22,7349T23,7350T24,7351T25,7352T26,7353T27,7354T28,7355T29,7356NullType,7357NullType>7358{7359typedef detail::KernelFunctorGlobal<7360T0,7361T1,7362T2,7363T3,7364T4,7365T5,7366T6,7367T7,7368T8,7369T9,7370T10,7371T11,7372T12,7373T13,7374T14,7375T15,7376T16,7377T17,7378T18,7379T19,7380T20,7381T21,7382T22,7383T23,7384T24,7385T25,7386T26,7387T27,7388T28,7389T29,7390NullType,7391NullType> FunctorType;73927393FunctorType functor_;73947395functionImplementation_(const FunctorType &functor) :7396functor_(functor)7397{73987399#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30))7400// Fail variadic expansion for dev117401static_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.");7402#endif74037404}74057406//! \brief Return type of the functor7407typedef Event result_type;74087409//! \brief Function signature of kernel functor with no event dependency.7410typedef Event type_(7411const EnqueueArgs&,7412T0,7413T1,7414T2,7415T3,7416T4,7417T5,7418T6,7419T7,7420T8,7421T9,7422T10,7423T11,7424T12,7425T13,7426T14,7427T15,7428T16,7429T17,7430T18,7431T19,7432T20,7433T21,7434T22,7435T23,7436T24,7437T25,7438T26,7439T27,7440T28,7441T29);74427443Event operator()(7444const EnqueueArgs& enqueueArgs,7445T0 arg0,7446T1 arg1,7447T2 arg2,7448T3 arg3,7449T4 arg4,7450T5 arg5,7451T6 arg6,7452T7 arg7,7453T8 arg8,7454T9 arg9,7455T10 arg10,7456T11 arg11,7457T12 arg12,7458T13 arg13,7459T14 arg14,7460T15 arg15,7461T16 arg16,7462T17 arg17,7463T18 arg18,7464T19 arg19,7465T20 arg20,7466T21 arg21,7467T22 arg22,7468T23 arg23,7469T24 arg24,7470T25 arg25,7471T26 arg26,7472T27 arg27,7473T28 arg28,7474T29 arg29)7475{7476return functor_(7477enqueueArgs,7478arg0,7479arg1,7480arg2,7481arg3,7482arg4,7483arg5,7484arg6,7485arg7,7486arg8,7487arg9,7488arg10,7489arg11,7490arg12,7491arg13,7492arg14,7493arg15,7494arg16,7495arg17,7496arg18,7497arg19,7498arg20,7499arg21,7500arg22,7501arg23,7502arg24,7503arg25,7504arg26,7505arg27,7506arg28,7507arg29);7508}750975107511};75127513template<7514typename T0,7515typename T1,7516typename T2,7517typename T3,7518typename T4,7519typename T5,7520typename T6,7521typename T7,7522typename T8,7523typename T9,7524typename T10,7525typename T11,7526typename T12,7527typename T13,7528typename T14,7529typename T15,7530typename T16,7531typename T17,7532typename T18,7533typename T19,7534typename T20,7535typename T21,7536typename T22,7537typename T23,7538typename T24,7539typename T25,7540typename T26,7541typename T27,7542typename T28>7543struct functionImplementation_7544< T0,7545T1,7546T2,7547T3,7548T4,7549T5,7550T6,7551T7,7552T8,7553T9,7554T10,7555T11,7556T12,7557T13,7558T14,7559T15,7560T16,7561T17,7562T18,7563T19,7564T20,7565T21,7566T22,7567T23,7568T24,7569T25,7570T26,7571T27,7572T28,7573NullType,7574NullType,7575NullType>7576{7577typedef detail::KernelFunctorGlobal<7578T0,7579T1,7580T2,7581T3,7582T4,7583T5,7584T6,7585T7,7586T8,7587T9,7588T10,7589T11,7590T12,7591T13,7592T14,7593T15,7594T16,7595T17,7596T18,7597T19,7598T20,7599T21,7600T22,7601T23,7602T24,7603T25,7604T26,7605T27,7606T28,7607NullType,7608NullType,7609NullType> FunctorType;76107611FunctorType functor_;76127613functionImplementation_(const FunctorType &functor) :7614functor_(functor)7615{76167617#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29))7618// Fail variadic expansion for dev117619static_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.");7620#endif76217622}76237624//! \brief Return type of the functor7625typedef Event result_type;76267627//! \brief Function signature of kernel functor with no event dependency.7628typedef Event type_(7629const EnqueueArgs&,7630T0,7631T1,7632T2,7633T3,7634T4,7635T5,7636T6,7637T7,7638T8,7639T9,7640T10,7641T11,7642T12,7643T13,7644T14,7645T15,7646T16,7647T17,7648T18,7649T19,7650T20,7651T21,7652T22,7653T23,7654T24,7655T25,7656T26,7657T27,7658T28);76597660Event operator()(7661const EnqueueArgs& enqueueArgs,7662T0 arg0,7663T1 arg1,7664T2 arg2,7665T3 arg3,7666T4 arg4,7667T5 arg5,7668T6 arg6,7669T7 arg7,7670T8 arg8,7671T9 arg9,7672T10 arg10,7673T11 arg11,7674T12 arg12,7675T13 arg13,7676T14 arg14,7677T15 arg15,7678T16 arg16,7679T17 arg17,7680T18 arg18,7681T19 arg19,7682T20 arg20,7683T21 arg21,7684T22 arg22,7685T23 arg23,7686T24 arg24,7687T25 arg25,7688T26 arg26,7689T27 arg27,7690T28 arg28)7691{7692return functor_(7693enqueueArgs,7694arg0,7695arg1,7696arg2,7697arg3,7698arg4,7699arg5,7700arg6,7701arg7,7702arg8,7703arg9,7704arg10,7705arg11,7706arg12,7707arg13,7708arg14,7709arg15,7710arg16,7711arg17,7712arg18,7713arg19,7714arg20,7715arg21,7716arg22,7717arg23,7718arg24,7719arg25,7720arg26,7721arg27,7722arg28);7723}772477257726};77277728template<7729typename T0,7730typename T1,7731typename T2,7732typename T3,7733typename T4,7734typename T5,7735typename T6,7736typename T7,7737typename T8,7738typename T9,7739typename T10,7740typename T11,7741typename T12,7742typename T13,7743typename T14,7744typename T15,7745typename T16,7746typename T17,7747typename T18,7748typename T19,7749typename T20,7750typename T21,7751typename T22,7752typename T23,7753typename T24,7754typename T25,7755typename T26,7756typename T27>7757struct functionImplementation_7758< T0,7759T1,7760T2,7761T3,7762T4,7763T5,7764T6,7765T7,7766T8,7767T9,7768T10,7769T11,7770T12,7771T13,7772T14,7773T15,7774T16,7775T17,7776T18,7777T19,7778T20,7779T21,7780T22,7781T23,7782T24,7783T25,7784T26,7785T27,7786NullType,7787NullType,7788NullType,7789NullType>7790{7791typedef detail::KernelFunctorGlobal<7792T0,7793T1,7794T2,7795T3,7796T4,7797T5,7798T6,7799T7,7800T8,7801T9,7802T10,7803T11,7804T12,7805T13,7806T14,7807T15,7808T16,7809T17,7810T18,7811T19,7812T20,7813T21,7814T22,7815T23,7816T24,7817T25,7818T26,7819T27,7820NullType,7821NullType,7822NullType,7823NullType> FunctorType;78247825FunctorType functor_;78267827functionImplementation_(const FunctorType &functor) :7828functor_(functor)7829{78307831#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28))7832// Fail variadic expansion for dev117833static_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.");7834#endif78357836}78377838//! \brief Return type of the functor7839typedef Event result_type;78407841//! \brief Function signature of kernel functor with no event dependency.7842typedef Event type_(7843const EnqueueArgs&,7844T0,7845T1,7846T2,7847T3,7848T4,7849T5,7850T6,7851T7,7852T8,7853T9,7854T10,7855T11,7856T12,7857T13,7858T14,7859T15,7860T16,7861T17,7862T18,7863T19,7864T20,7865T21,7866T22,7867T23,7868T24,7869T25,7870T26,7871T27);78727873Event operator()(7874const EnqueueArgs& enqueueArgs,7875T0 arg0,7876T1 arg1,7877T2 arg2,7878T3 arg3,7879T4 arg4,7880T5 arg5,7881T6 arg6,7882T7 arg7,7883T8 arg8,7884T9 arg9,7885T10 arg10,7886T11 arg11,7887T12 arg12,7888T13 arg13,7889T14 arg14,7890T15 arg15,7891T16 arg16,7892T17 arg17,7893T18 arg18,7894T19 arg19,7895T20 arg20,7896T21 arg21,7897T22 arg22,7898T23 arg23,7899T24 arg24,7900T25 arg25,7901T26 arg26,7902T27 arg27)7903{7904return functor_(7905enqueueArgs,7906arg0,7907arg1,7908arg2,7909arg3,7910arg4,7911arg5,7912arg6,7913arg7,7914arg8,7915arg9,7916arg10,7917arg11,7918arg12,7919arg13,7920arg14,7921arg15,7922arg16,7923arg17,7924arg18,7925arg19,7926arg20,7927arg21,7928arg22,7929arg23,7930arg24,7931arg25,7932arg26,7933arg27);7934}793579367937};79387939template<7940typename T0,7941typename T1,7942typename T2,7943typename T3,7944typename T4,7945typename T5,7946typename T6,7947typename T7,7948typename T8,7949typename T9,7950typename T10,7951typename T11,7952typename T12,7953typename T13,7954typename T14,7955typename T15,7956typename T16,7957typename T17,7958typename T18,7959typename T19,7960typename T20,7961typename T21,7962typename T22,7963typename T23,7964typename T24,7965typename T25,7966typename T26>7967struct functionImplementation_7968< T0,7969T1,7970T2,7971T3,7972T4,7973T5,7974T6,7975T7,7976T8,7977T9,7978T10,7979T11,7980T12,7981T13,7982T14,7983T15,7984T16,7985T17,7986T18,7987T19,7988T20,7989T21,7990T22,7991T23,7992T24,7993T25,7994T26,7995NullType,7996NullType,7997NullType,7998NullType,7999NullType>8000{8001typedef detail::KernelFunctorGlobal<8002T0,8003T1,8004T2,8005T3,8006T4,8007T5,8008T6,8009T7,8010T8,8011T9,8012T10,8013T11,8014T12,8015T13,8016T14,8017T15,8018T16,8019T17,8020T18,8021T19,8022T20,8023T21,8024T22,8025T23,8026T24,8027T25,8028T26,8029NullType,8030NullType,8031NullType,8032NullType,8033NullType> FunctorType;80348035FunctorType functor_;80368037functionImplementation_(const FunctorType &functor) :8038functor_(functor)8039{80408041#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27))8042// Fail variadic expansion for dev118043static_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.");8044#endif80458046}80478048//! \brief Return type of the functor8049typedef Event result_type;80508051//! \brief Function signature of kernel functor with no event dependency.8052typedef Event type_(8053const EnqueueArgs&,8054T0,8055T1,8056T2,8057T3,8058T4,8059T5,8060T6,8061T7,8062T8,8063T9,8064T10,8065T11,8066T12,8067T13,8068T14,8069T15,8070T16,8071T17,8072T18,8073T19,8074T20,8075T21,8076T22,8077T23,8078T24,8079T25,8080T26);80818082Event operator()(8083const EnqueueArgs& enqueueArgs,8084T0 arg0,8085T1 arg1,8086T2 arg2,8087T3 arg3,8088T4 arg4,8089T5 arg5,8090T6 arg6,8091T7 arg7,8092T8 arg8,8093T9 arg9,8094T10 arg10,8095T11 arg11,8096T12 arg12,8097T13 arg13,8098T14 arg14,8099T15 arg15,8100T16 arg16,8101T17 arg17,8102T18 arg18,8103T19 arg19,8104T20 arg20,8105T21 arg21,8106T22 arg22,8107T23 arg23,8108T24 arg24,8109T25 arg25,8110T26 arg26)8111{8112return functor_(8113enqueueArgs,8114arg0,8115arg1,8116arg2,8117arg3,8118arg4,8119arg5,8120arg6,8121arg7,8122arg8,8123arg9,8124arg10,8125arg11,8126arg12,8127arg13,8128arg14,8129arg15,8130arg16,8131arg17,8132arg18,8133arg19,8134arg20,8135arg21,8136arg22,8137arg23,8138arg24,8139arg25,8140arg26);8141}814281438144};81458146template<8147typename T0,8148typename T1,8149typename T2,8150typename T3,8151typename T4,8152typename T5,8153typename T6,8154typename T7,8155typename T8,8156typename T9,8157typename T10,8158typename T11,8159typename T12,8160typename T13,8161typename T14,8162typename T15,8163typename T16,8164typename T17,8165typename T18,8166typename T19,8167typename T20,8168typename T21,8169typename T22,8170typename T23,8171typename T24,8172typename T25>8173struct functionImplementation_8174< T0,8175T1,8176T2,8177T3,8178T4,8179T5,8180T6,8181T7,8182T8,8183T9,8184T10,8185T11,8186T12,8187T13,8188T14,8189T15,8190T16,8191T17,8192T18,8193T19,8194T20,8195T21,8196T22,8197T23,8198T24,8199T25,8200NullType,8201NullType,8202NullType,8203NullType,8204NullType,8205NullType>8206{8207typedef detail::KernelFunctorGlobal<8208T0,8209T1,8210T2,8211T3,8212T4,8213T5,8214T6,8215T7,8216T8,8217T9,8218T10,8219T11,8220T12,8221T13,8222T14,8223T15,8224T16,8225T17,8226T18,8227T19,8228T20,8229T21,8230T22,8231T23,8232T24,8233T25,8234NullType,8235NullType,8236NullType,8237NullType,8238NullType,8239NullType> FunctorType;82408241FunctorType functor_;82428243functionImplementation_(const FunctorType &functor) :8244functor_(functor)8245{82468247#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26))8248// Fail variadic expansion for dev118249static_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.");8250#endif82518252}82538254//! \brief Return type of the functor8255typedef Event result_type;82568257//! \brief Function signature of kernel functor with no event dependency.8258typedef Event type_(8259const EnqueueArgs&,8260T0,8261T1,8262T2,8263T3,8264T4,8265T5,8266T6,8267T7,8268T8,8269T9,8270T10,8271T11,8272T12,8273T13,8274T14,8275T15,8276T16,8277T17,8278T18,8279T19,8280T20,8281T21,8282T22,8283T23,8284T24,8285T25);82868287Event operator()(8288const EnqueueArgs& enqueueArgs,8289T0 arg0,8290T1 arg1,8291T2 arg2,8292T3 arg3,8293T4 arg4,8294T5 arg5,8295T6 arg6,8296T7 arg7,8297T8 arg8,8298T9 arg9,8299T10 arg10,8300T11 arg11,8301T12 arg12,8302T13 arg13,8303T14 arg14,8304T15 arg15,8305T16 arg16,8306T17 arg17,8307T18 arg18,8308T19 arg19,8309T20 arg20,8310T21 arg21,8311T22 arg22,8312T23 arg23,8313T24 arg24,8314T25 arg25)8315{8316return functor_(8317enqueueArgs,8318arg0,8319arg1,8320arg2,8321arg3,8322arg4,8323arg5,8324arg6,8325arg7,8326arg8,8327arg9,8328arg10,8329arg11,8330arg12,8331arg13,8332arg14,8333arg15,8334arg16,8335arg17,8336arg18,8337arg19,8338arg20,8339arg21,8340arg22,8341arg23,8342arg24,8343arg25);8344}834583468347};83488349template<8350typename T0,8351typename T1,8352typename T2,8353typename T3,8354typename T4,8355typename T5,8356typename T6,8357typename T7,8358typename T8,8359typename T9,8360typename T10,8361typename T11,8362typename T12,8363typename T13,8364typename T14,8365typename T15,8366typename T16,8367typename T17,8368typename T18,8369typename T19,8370typename T20,8371typename T21,8372typename T22,8373typename T23,8374typename T24>8375struct functionImplementation_8376< T0,8377T1,8378T2,8379T3,8380T4,8381T5,8382T6,8383T7,8384T8,8385T9,8386T10,8387T11,8388T12,8389T13,8390T14,8391T15,8392T16,8393T17,8394T18,8395T19,8396T20,8397T21,8398T22,8399T23,8400T24,8401NullType,8402NullType,8403NullType,8404NullType,8405NullType,8406NullType,8407NullType>8408{8409typedef detail::KernelFunctorGlobal<8410T0,8411T1,8412T2,8413T3,8414T4,8415T5,8416T6,8417T7,8418T8,8419T9,8420T10,8421T11,8422T12,8423T13,8424T14,8425T15,8426T16,8427T17,8428T18,8429T19,8430T20,8431T21,8432T22,8433T23,8434T24,8435NullType,8436NullType,8437NullType,8438NullType,8439NullType,8440NullType,8441NullType> FunctorType;84428443FunctorType functor_;84448445functionImplementation_(const FunctorType &functor) :8446functor_(functor)8447{84488449#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25))8450// Fail variadic expansion for dev118451static_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.");8452#endif84538454}84558456//! \brief Return type of the functor8457typedef Event result_type;84588459//! \brief Function signature of kernel functor with no event dependency.8460typedef Event type_(8461const EnqueueArgs&,8462T0,8463T1,8464T2,8465T3,8466T4,8467T5,8468T6,8469T7,8470T8,8471T9,8472T10,8473T11,8474T12,8475T13,8476T14,8477T15,8478T16,8479T17,8480T18,8481T19,8482T20,8483T21,8484T22,8485T23,8486T24);84878488Event operator()(8489const EnqueueArgs& enqueueArgs,8490T0 arg0,8491T1 arg1,8492T2 arg2,8493T3 arg3,8494T4 arg4,8495T5 arg5,8496T6 arg6,8497T7 arg7,8498T8 arg8,8499T9 arg9,8500T10 arg10,8501T11 arg11,8502T12 arg12,8503T13 arg13,8504T14 arg14,8505T15 arg15,8506T16 arg16,8507T17 arg17,8508T18 arg18,8509T19 arg19,8510T20 arg20,8511T21 arg21,8512T22 arg22,8513T23 arg23,8514T24 arg24)8515{8516return functor_(8517enqueueArgs,8518arg0,8519arg1,8520arg2,8521arg3,8522arg4,8523arg5,8524arg6,8525arg7,8526arg8,8527arg9,8528arg10,8529arg11,8530arg12,8531arg13,8532arg14,8533arg15,8534arg16,8535arg17,8536arg18,8537arg19,8538arg20,8539arg21,8540arg22,8541arg23,8542arg24);8543}854485458546};85478548template<8549typename T0,8550typename T1,8551typename T2,8552typename T3,8553typename T4,8554typename T5,8555typename T6,8556typename T7,8557typename T8,8558typename T9,8559typename T10,8560typename T11,8561typename T12,8562typename T13,8563typename T14,8564typename T15,8565typename T16,8566typename T17,8567typename T18,8568typename T19,8569typename T20,8570typename T21,8571typename T22,8572typename T23>8573struct functionImplementation_8574< T0,8575T1,8576T2,8577T3,8578T4,8579T5,8580T6,8581T7,8582T8,8583T9,8584T10,8585T11,8586T12,8587T13,8588T14,8589T15,8590T16,8591T17,8592T18,8593T19,8594T20,8595T21,8596T22,8597T23,8598NullType,8599NullType,8600NullType,8601NullType,8602NullType,8603NullType,8604NullType,8605NullType>8606{8607typedef detail::KernelFunctorGlobal<8608T0,8609T1,8610T2,8611T3,8612T4,8613T5,8614T6,8615T7,8616T8,8617T9,8618T10,8619T11,8620T12,8621T13,8622T14,8623T15,8624T16,8625T17,8626T18,8627T19,8628T20,8629T21,8630T22,8631T23,8632NullType,8633NullType,8634NullType,8635NullType,8636NullType,8637NullType,8638NullType,8639NullType> FunctorType;86408641FunctorType functor_;86428643functionImplementation_(const FunctorType &functor) :8644functor_(functor)8645{86468647#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24))8648// Fail variadic expansion for dev118649static_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.");8650#endif86518652}86538654//! \brief Return type of the functor8655typedef Event result_type;86568657//! \brief Function signature of kernel functor with no event dependency.8658typedef Event type_(8659const EnqueueArgs&,8660T0,8661T1,8662T2,8663T3,8664T4,8665T5,8666T6,8667T7,8668T8,8669T9,8670T10,8671T11,8672T12,8673T13,8674T14,8675T15,8676T16,8677T17,8678T18,8679T19,8680T20,8681T21,8682T22,8683T23);86848685Event operator()(8686const EnqueueArgs& enqueueArgs,8687T0 arg0,8688T1 arg1,8689T2 arg2,8690T3 arg3,8691T4 arg4,8692T5 arg5,8693T6 arg6,8694T7 arg7,8695T8 arg8,8696T9 arg9,8697T10 arg10,8698T11 arg11,8699T12 arg12,8700T13 arg13,8701T14 arg14,8702T15 arg15,8703T16 arg16,8704T17 arg17,8705T18 arg18,8706T19 arg19,8707T20 arg20,8708T21 arg21,8709T22 arg22,8710T23 arg23)8711{8712return functor_(8713enqueueArgs,8714arg0,8715arg1,8716arg2,8717arg3,8718arg4,8719arg5,8720arg6,8721arg7,8722arg8,8723arg9,8724arg10,8725arg11,8726arg12,8727arg13,8728arg14,8729arg15,8730arg16,8731arg17,8732arg18,8733arg19,8734arg20,8735arg21,8736arg22,8737arg23);8738}873987408741};87428743template<8744typename T0,8745typename T1,8746typename T2,8747typename T3,8748typename T4,8749typename T5,8750typename T6,8751typename T7,8752typename T8,8753typename T9,8754typename T10,8755typename T11,8756typename T12,8757typename T13,8758typename T14,8759typename T15,8760typename T16,8761typename T17,8762typename T18,8763typename T19,8764typename T20,8765typename T21,8766typename T22>8767struct functionImplementation_8768< T0,8769T1,8770T2,8771T3,8772T4,8773T5,8774T6,8775T7,8776T8,8777T9,8778T10,8779T11,8780T12,8781T13,8782T14,8783T15,8784T16,8785T17,8786T18,8787T19,8788T20,8789T21,8790T22,8791NullType,8792NullType,8793NullType,8794NullType,8795NullType,8796NullType,8797NullType,8798NullType,8799NullType>8800{8801typedef detail::KernelFunctorGlobal<8802T0,8803T1,8804T2,8805T3,8806T4,8807T5,8808T6,8809T7,8810T8,8811T9,8812T10,8813T11,8814T12,8815T13,8816T14,8817T15,8818T16,8819T17,8820T18,8821T19,8822T20,8823T21,8824T22,8825NullType,8826NullType,8827NullType,8828NullType,8829NullType,8830NullType,8831NullType,8832NullType,8833NullType> FunctorType;88348835FunctorType functor_;88368837functionImplementation_(const FunctorType &functor) :8838functor_(functor)8839{88408841#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23))8842// Fail variadic expansion for dev118843static_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.");8844#endif88458846}88478848//! \brief Return type of the functor8849typedef Event result_type;88508851//! \brief Function signature of kernel functor with no event dependency.8852typedef Event type_(8853const EnqueueArgs&,8854T0,8855T1,8856T2,8857T3,8858T4,8859T5,8860T6,8861T7,8862T8,8863T9,8864T10,8865T11,8866T12,8867T13,8868T14,8869T15,8870T16,8871T17,8872T18,8873T19,8874T20,8875T21,8876T22);88778878Event operator()(8879const EnqueueArgs& enqueueArgs,8880T0 arg0,8881T1 arg1,8882T2 arg2,8883T3 arg3,8884T4 arg4,8885T5 arg5,8886T6 arg6,8887T7 arg7,8888T8 arg8,8889T9 arg9,8890T10 arg10,8891T11 arg11,8892T12 arg12,8893T13 arg13,8894T14 arg14,8895T15 arg15,8896T16 arg16,8897T17 arg17,8898T18 arg18,8899T19 arg19,8900T20 arg20,8901T21 arg21,8902T22 arg22)8903{8904return functor_(8905enqueueArgs,8906arg0,8907arg1,8908arg2,8909arg3,8910arg4,8911arg5,8912arg6,8913arg7,8914arg8,8915arg9,8916arg10,8917arg11,8918arg12,8919arg13,8920arg14,8921arg15,8922arg16,8923arg17,8924arg18,8925arg19,8926arg20,8927arg21,8928arg22);8929}893089318932};89338934template<8935typename T0,8936typename T1,8937typename T2,8938typename T3,8939typename T4,8940typename T5,8941typename T6,8942typename T7,8943typename T8,8944typename T9,8945typename T10,8946typename T11,8947typename T12,8948typename T13,8949typename T14,8950typename T15,8951typename T16,8952typename T17,8953typename T18,8954typename T19,8955typename T20,8956typename T21>8957struct functionImplementation_8958< T0,8959T1,8960T2,8961T3,8962T4,8963T5,8964T6,8965T7,8966T8,8967T9,8968T10,8969T11,8970T12,8971T13,8972T14,8973T15,8974T16,8975T17,8976T18,8977T19,8978T20,8979T21,8980NullType,8981NullType,8982NullType,8983NullType,8984NullType,8985NullType,8986NullType,8987NullType,8988NullType,8989NullType>8990{8991typedef detail::KernelFunctorGlobal<8992T0,8993T1,8994T2,8995T3,8996T4,8997T5,8998T6,8999T7,9000T8,9001T9,9002T10,9003T11,9004T12,9005T13,9006T14,9007T15,9008T16,9009T17,9010T18,9011T19,9012T20,9013T21,9014NullType,9015NullType,9016NullType,9017NullType,9018NullType,9019NullType,9020NullType,9021NullType,9022NullType,9023NullType> FunctorType;90249025FunctorType functor_;90269027functionImplementation_(const FunctorType &functor) :9028functor_(functor)9029{90309031#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22))9032// Fail variadic expansion for dev119033static_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.");9034#endif90359036}90379038//! \brief Return type of the functor9039typedef Event result_type;90409041//! \brief Function signature of kernel functor with no event dependency.9042typedef Event type_(9043const EnqueueArgs&,9044T0,9045T1,9046T2,9047T3,9048T4,9049T5,9050T6,9051T7,9052T8,9053T9,9054T10,9055T11,9056T12,9057T13,9058T14,9059T15,9060T16,9061T17,9062T18,9063T19,9064T20,9065T21);90669067Event operator()(9068const EnqueueArgs& enqueueArgs,9069T0 arg0,9070T1 arg1,9071T2 arg2,9072T3 arg3,9073T4 arg4,9074T5 arg5,9075T6 arg6,9076T7 arg7,9077T8 arg8,9078T9 arg9,9079T10 arg10,9080T11 arg11,9081T12 arg12,9082T13 arg13,9083T14 arg14,9084T15 arg15,9085T16 arg16,9086T17 arg17,9087T18 arg18,9088T19 arg19,9089T20 arg20,9090T21 arg21)9091{9092return functor_(9093enqueueArgs,9094arg0,9095arg1,9096arg2,9097arg3,9098arg4,9099arg5,9100arg6,9101arg7,9102arg8,9103arg9,9104arg10,9105arg11,9106arg12,9107arg13,9108arg14,9109arg15,9110arg16,9111arg17,9112arg18,9113arg19,9114arg20,9115arg21);9116}911791189119};91209121template<9122typename T0,9123typename T1,9124typename T2,9125typename T3,9126typename T4,9127typename T5,9128typename T6,9129typename T7,9130typename T8,9131typename T9,9132typename T10,9133typename T11,9134typename T12,9135typename T13,9136typename T14,9137typename T15,9138typename T16,9139typename T17,9140typename T18,9141typename T19,9142typename T20>9143struct functionImplementation_9144< T0,9145T1,9146T2,9147T3,9148T4,9149T5,9150T6,9151T7,9152T8,9153T9,9154T10,9155T11,9156T12,9157T13,9158T14,9159T15,9160T16,9161T17,9162T18,9163T19,9164T20,9165NullType,9166NullType,9167NullType,9168NullType,9169NullType,9170NullType,9171NullType,9172NullType,9173NullType,9174NullType,9175NullType>9176{9177typedef detail::KernelFunctorGlobal<9178T0,9179T1,9180T2,9181T3,9182T4,9183T5,9184T6,9185T7,9186T8,9187T9,9188T10,9189T11,9190T12,9191T13,9192T14,9193T15,9194T16,9195T17,9196T18,9197T19,9198T20,9199NullType,9200NullType,9201NullType,9202NullType,9203NullType,9204NullType,9205NullType,9206NullType,9207NullType,9208NullType,9209NullType> FunctorType;92109211FunctorType functor_;92129213functionImplementation_(const FunctorType &functor) :9214functor_(functor)9215{92169217#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21))9218// Fail variadic expansion for dev119219static_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.");9220#endif92219222}92239224//! \brief Return type of the functor9225typedef Event result_type;92269227//! \brief Function signature of kernel functor with no event dependency.9228typedef Event type_(9229const EnqueueArgs&,9230T0,9231T1,9232T2,9233T3,9234T4,9235T5,9236T6,9237T7,9238T8,9239T9,9240T10,9241T11,9242T12,9243T13,9244T14,9245T15,9246T16,9247T17,9248T18,9249T19,9250T20);92519252Event operator()(9253const EnqueueArgs& enqueueArgs,9254T0 arg0,9255T1 arg1,9256T2 arg2,9257T3 arg3,9258T4 arg4,9259T5 arg5,9260T6 arg6,9261T7 arg7,9262T8 arg8,9263T9 arg9,9264T10 arg10,9265T11 arg11,9266T12 arg12,9267T13 arg13,9268T14 arg14,9269T15 arg15,9270T16 arg16,9271T17 arg17,9272T18 arg18,9273T19 arg19,9274T20 arg20)9275{9276return functor_(9277enqueueArgs,9278arg0,9279arg1,9280arg2,9281arg3,9282arg4,9283arg5,9284arg6,9285arg7,9286arg8,9287arg9,9288arg10,9289arg11,9290arg12,9291arg13,9292arg14,9293arg15,9294arg16,9295arg17,9296arg18,9297arg19,9298arg20);9299}930093019302};93039304template<9305typename T0,9306typename T1,9307typename T2,9308typename T3,9309typename T4,9310typename T5,9311typename T6,9312typename T7,9313typename T8,9314typename T9,9315typename T10,9316typename T11,9317typename T12,9318typename T13,9319typename T14,9320typename T15,9321typename T16,9322typename T17,9323typename T18,9324typename T19>9325struct functionImplementation_9326< T0,9327T1,9328T2,9329T3,9330T4,9331T5,9332T6,9333T7,9334T8,9335T9,9336T10,9337T11,9338T12,9339T13,9340T14,9341T15,9342T16,9343T17,9344T18,9345T19,9346NullType,9347NullType,9348NullType,9349NullType,9350NullType,9351NullType,9352NullType,9353NullType,9354NullType,9355NullType,9356NullType,9357NullType>9358{9359typedef detail::KernelFunctorGlobal<9360T0,9361T1,9362T2,9363T3,9364T4,9365T5,9366T6,9367T7,9368T8,9369T9,9370T10,9371T11,9372T12,9373T13,9374T14,9375T15,9376T16,9377T17,9378T18,9379T19,9380NullType,9381NullType,9382NullType,9383NullType,9384NullType,9385NullType,9386NullType,9387NullType,9388NullType,9389NullType,9390NullType,9391NullType> FunctorType;93929393FunctorType functor_;93949395functionImplementation_(const FunctorType &functor) :9396functor_(functor)9397{93989399#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20))9400// Fail variadic expansion for dev119401static_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.");9402#endif94039404}94059406//! \brief Return type of the functor9407typedef Event result_type;94089409//! \brief Function signature of kernel functor with no event dependency.9410typedef Event type_(9411const EnqueueArgs&,9412T0,9413T1,9414T2,9415T3,9416T4,9417T5,9418T6,9419T7,9420T8,9421T9,9422T10,9423T11,9424T12,9425T13,9426T14,9427T15,9428T16,9429T17,9430T18,9431T19);94329433Event operator()(9434const EnqueueArgs& enqueueArgs,9435T0 arg0,9436T1 arg1,9437T2 arg2,9438T3 arg3,9439T4 arg4,9440T5 arg5,9441T6 arg6,9442T7 arg7,9443T8 arg8,9444T9 arg9,9445T10 arg10,9446T11 arg11,9447T12 arg12,9448T13 arg13,9449T14 arg14,9450T15 arg15,9451T16 arg16,9452T17 arg17,9453T18 arg18,9454T19 arg19)9455{9456return functor_(9457enqueueArgs,9458arg0,9459arg1,9460arg2,9461arg3,9462arg4,9463arg5,9464arg6,9465arg7,9466arg8,9467arg9,9468arg10,9469arg11,9470arg12,9471arg13,9472arg14,9473arg15,9474arg16,9475arg17,9476arg18,9477arg19);9478}947994809481};94829483template<9484typename T0,9485typename T1,9486typename T2,9487typename T3,9488typename T4,9489typename T5,9490typename T6,9491typename T7,9492typename T8,9493typename T9,9494typename T10,9495typename T11,9496typename T12,9497typename T13,9498typename T14,9499typename T15,9500typename T16,9501typename T17,9502typename T18>9503struct functionImplementation_9504< T0,9505T1,9506T2,9507T3,9508T4,9509T5,9510T6,9511T7,9512T8,9513T9,9514T10,9515T11,9516T12,9517T13,9518T14,9519T15,9520T16,9521T17,9522T18,9523NullType,9524NullType,9525NullType,9526NullType,9527NullType,9528NullType,9529NullType,9530NullType,9531NullType,9532NullType,9533NullType,9534NullType,9535NullType>9536{9537typedef detail::KernelFunctorGlobal<9538T0,9539T1,9540T2,9541T3,9542T4,9543T5,9544T6,9545T7,9546T8,9547T9,9548T10,9549T11,9550T12,9551T13,9552T14,9553T15,9554T16,9555T17,9556T18,9557NullType,9558NullType,9559NullType,9560NullType,9561NullType,9562NullType,9563NullType,9564NullType,9565NullType,9566NullType,9567NullType,9568NullType,9569NullType> FunctorType;95709571FunctorType functor_;95729573functionImplementation_(const FunctorType &functor) :9574functor_(functor)9575{95769577#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19))9578// Fail variadic expansion for dev119579static_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.");9580#endif95819582}95839584//! \brief Return type of the functor9585typedef Event result_type;95869587//! \brief Function signature of kernel functor with no event dependency.9588typedef Event type_(9589const EnqueueArgs&,9590T0,9591T1,9592T2,9593T3,9594T4,9595T5,9596T6,9597T7,9598T8,9599T9,9600T10,9601T11,9602T12,9603T13,9604T14,9605T15,9606T16,9607T17,9608T18);96099610Event operator()(9611const EnqueueArgs& enqueueArgs,9612T0 arg0,9613T1 arg1,9614T2 arg2,9615T3 arg3,9616T4 arg4,9617T5 arg5,9618T6 arg6,9619T7 arg7,9620T8 arg8,9621T9 arg9,9622T10 arg10,9623T11 arg11,9624T12 arg12,9625T13 arg13,9626T14 arg14,9627T15 arg15,9628T16 arg16,9629T17 arg17,9630T18 arg18)9631{9632return functor_(9633enqueueArgs,9634arg0,9635arg1,9636arg2,9637arg3,9638arg4,9639arg5,9640arg6,9641arg7,9642arg8,9643arg9,9644arg10,9645arg11,9646arg12,9647arg13,9648arg14,9649arg15,9650arg16,9651arg17,9652arg18);9653}965496559656};96579658template<9659typename T0,9660typename T1,9661typename T2,9662typename T3,9663typename T4,9664typename T5,9665typename T6,9666typename T7,9667typename T8,9668typename T9,9669typename T10,9670typename T11,9671typename T12,9672typename T13,9673typename T14,9674typename T15,9675typename T16,9676typename T17>9677struct functionImplementation_9678< T0,9679T1,9680T2,9681T3,9682T4,9683T5,9684T6,9685T7,9686T8,9687T9,9688T10,9689T11,9690T12,9691T13,9692T14,9693T15,9694T16,9695T17,9696NullType,9697NullType,9698NullType,9699NullType,9700NullType,9701NullType,9702NullType,9703NullType,9704NullType,9705NullType,9706NullType,9707NullType,9708NullType,9709NullType>9710{9711typedef detail::KernelFunctorGlobal<9712T0,9713T1,9714T2,9715T3,9716T4,9717T5,9718T6,9719T7,9720T8,9721T9,9722T10,9723T11,9724T12,9725T13,9726T14,9727T15,9728T16,9729T17,9730NullType,9731NullType,9732NullType,9733NullType,9734NullType,9735NullType,9736NullType,9737NullType,9738NullType,9739NullType,9740NullType,9741NullType,9742NullType,9743NullType> FunctorType;97449745FunctorType functor_;97469747functionImplementation_(const FunctorType &functor) :9748functor_(functor)9749{97509751#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18))9752// Fail variadic expansion for dev119753static_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.");9754#endif97559756}97579758//! \brief Return type of the functor9759typedef Event result_type;97609761//! \brief Function signature of kernel functor with no event dependency.9762typedef Event type_(9763const EnqueueArgs&,9764T0,9765T1,9766T2,9767T3,9768T4,9769T5,9770T6,9771T7,9772T8,9773T9,9774T10,9775T11,9776T12,9777T13,9778T14,9779T15,9780T16,9781T17);97829783Event operator()(9784const EnqueueArgs& enqueueArgs,9785T0 arg0,9786T1 arg1,9787T2 arg2,9788T3 arg3,9789T4 arg4,9790T5 arg5,9791T6 arg6,9792T7 arg7,9793T8 arg8,9794T9 arg9,9795T10 arg10,9796T11 arg11,9797T12 arg12,9798T13 arg13,9799T14 arg14,9800T15 arg15,9801T16 arg16,9802T17 arg17)9803{9804return functor_(9805enqueueArgs,9806arg0,9807arg1,9808arg2,9809arg3,9810arg4,9811arg5,9812arg6,9813arg7,9814arg8,9815arg9,9816arg10,9817arg11,9818arg12,9819arg13,9820arg14,9821arg15,9822arg16,9823arg17);9824}982598269827};98289829template<9830typename T0,9831typename T1,9832typename T2,9833typename T3,9834typename T4,9835typename T5,9836typename T6,9837typename T7,9838typename T8,9839typename T9,9840typename T10,9841typename T11,9842typename T12,9843typename T13,9844typename T14,9845typename T15,9846typename T16>9847struct functionImplementation_9848< T0,9849T1,9850T2,9851T3,9852T4,9853T5,9854T6,9855T7,9856T8,9857T9,9858T10,9859T11,9860T12,9861T13,9862T14,9863T15,9864T16,9865NullType,9866NullType,9867NullType,9868NullType,9869NullType,9870NullType,9871NullType,9872NullType,9873NullType,9874NullType,9875NullType,9876NullType,9877NullType,9878NullType,9879NullType>9880{9881typedef detail::KernelFunctorGlobal<9882T0,9883T1,9884T2,9885T3,9886T4,9887T5,9888T6,9889T7,9890T8,9891T9,9892T10,9893T11,9894T12,9895T13,9896T14,9897T15,9898T16,9899NullType,9900NullType,9901NullType,9902NullType,9903NullType,9904NullType,9905NullType,9906NullType,9907NullType,9908NullType,9909NullType,9910NullType,9911NullType,9912NullType,9913NullType> FunctorType;99149915FunctorType functor_;99169917functionImplementation_(const FunctorType &functor) :9918functor_(functor)9919{99209921#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17))9922// Fail variadic expansion for dev119923static_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.");9924#endif99259926}99279928//! \brief Return type of the functor9929typedef Event result_type;99309931//! \brief Function signature of kernel functor with no event dependency.9932typedef Event type_(9933const EnqueueArgs&,9934T0,9935T1,9936T2,9937T3,9938T4,9939T5,9940T6,9941T7,9942T8,9943T9,9944T10,9945T11,9946T12,9947T13,9948T14,9949T15,9950T16);99519952Event operator()(9953const EnqueueArgs& enqueueArgs,9954T0 arg0,9955T1 arg1,9956T2 arg2,9957T3 arg3,9958T4 arg4,9959T5 arg5,9960T6 arg6,9961T7 arg7,9962T8 arg8,9963T9 arg9,9964T10 arg10,9965T11 arg11,9966T12 arg12,9967T13 arg13,9968T14 arg14,9969T15 arg15,9970T16 arg16)9971{9972return functor_(9973enqueueArgs,9974arg0,9975arg1,9976arg2,9977arg3,9978arg4,9979arg5,9980arg6,9981arg7,9982arg8,9983arg9,9984arg10,9985arg11,9986arg12,9987arg13,9988arg14,9989arg15,9990arg16);9991}999299939994};99959996template<9997typename T0,9998typename T1,9999typename T2,10000typename T3,10001typename T4,10002typename T5,10003typename T6,10004typename T7,10005typename T8,10006typename T9,10007typename T10,10008typename T11,10009typename T12,10010typename T13,10011typename T14,10012typename T15>10013struct functionImplementation_10014< T0,10015T1,10016T2,10017T3,10018T4,10019T5,10020T6,10021T7,10022T8,10023T9,10024T10,10025T11,10026T12,10027T13,10028T14,10029T15,10030NullType,10031NullType,10032NullType,10033NullType,10034NullType,10035NullType,10036NullType,10037NullType,10038NullType,10039NullType,10040NullType,10041NullType,10042NullType,10043NullType,10044NullType,10045NullType>10046{10047typedef detail::KernelFunctorGlobal<10048T0,10049T1,10050T2,10051T3,10052T4,10053T5,10054T6,10055T7,10056T8,10057T9,10058T10,10059T11,10060T12,10061T13,10062T14,10063T15,10064NullType,10065NullType,10066NullType,10067NullType,10068NullType,10069NullType,10070NullType,10071NullType,10072NullType,10073NullType,10074NullType,10075NullType,10076NullType,10077NullType,10078NullType,10079NullType> FunctorType;1008010081FunctorType functor_;1008210083functionImplementation_(const FunctorType &functor) :10084functor_(functor)10085{1008610087#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16))10088// Fail variadic expansion for dev1110089static_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.");10090#endif1009110092}1009310094//! \brief Return type of the functor10095typedef Event result_type;1009610097//! \brief Function signature of kernel functor with no event dependency.10098typedef Event type_(10099const EnqueueArgs&,10100T0,10101T1,10102T2,10103T3,10104T4,10105T5,10106T6,10107T7,10108T8,10109T9,10110T10,10111T11,10112T12,10113T13,10114T14,10115T15);1011610117Event operator()(10118const EnqueueArgs& enqueueArgs,10119T0 arg0,10120T1 arg1,10121T2 arg2,10122T3 arg3,10123T4 arg4,10124T5 arg5,10125T6 arg6,10126T7 arg7,10127T8 arg8,10128T9 arg9,10129T10 arg10,10130T11 arg11,10131T12 arg12,10132T13 arg13,10133T14 arg14,10134T15 arg15)10135{10136return functor_(10137enqueueArgs,10138arg0,10139arg1,10140arg2,10141arg3,10142arg4,10143arg5,10144arg6,10145arg7,10146arg8,10147arg9,10148arg10,10149arg11,10150arg12,10151arg13,10152arg14,10153arg15);10154}101551015610157};1015810159template<10160typename T0,10161typename T1,10162typename T2,10163typename T3,10164typename T4,10165typename T5,10166typename T6,10167typename T7,10168typename T8,10169typename T9,10170typename T10,10171typename T11,10172typename T12,10173typename T13,10174typename T14>10175struct functionImplementation_10176< T0,10177T1,10178T2,10179T3,10180T4,10181T5,10182T6,10183T7,10184T8,10185T9,10186T10,10187T11,10188T12,10189T13,10190T14,10191NullType,10192NullType,10193NullType,10194NullType,10195NullType,10196NullType,10197NullType,10198NullType,10199NullType,10200NullType,10201NullType,10202NullType,10203NullType,10204NullType,10205NullType,10206NullType,10207NullType>10208{10209typedef detail::KernelFunctorGlobal<10210T0,10211T1,10212T2,10213T3,10214T4,10215T5,10216T6,10217T7,10218T8,10219T9,10220T10,10221T11,10222T12,10223T13,10224T14,10225NullType,10226NullType,10227NullType,10228NullType,10229NullType,10230NullType,10231NullType,10232NullType,10233NullType,10234NullType,10235NullType,10236NullType,10237NullType,10238NullType,10239NullType,10240NullType,10241NullType> FunctorType;1024210243FunctorType functor_;1024410245functionImplementation_(const FunctorType &functor) :10246functor_(functor)10247{1024810249#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15))10250// Fail variadic expansion for dev1110251static_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.");10252#endif1025310254}1025510256//! \brief Return type of the functor10257typedef Event result_type;1025810259//! \brief Function signature of kernel functor with no event dependency.10260typedef Event type_(10261const EnqueueArgs&,10262T0,10263T1,10264T2,10265T3,10266T4,10267T5,10268T6,10269T7,10270T8,10271T9,10272T10,10273T11,10274T12,10275T13,10276T14);1027710278Event operator()(10279const EnqueueArgs& enqueueArgs,10280T0 arg0,10281T1 arg1,10282T2 arg2,10283T3 arg3,10284T4 arg4,10285T5 arg5,10286T6 arg6,10287T7 arg7,10288T8 arg8,10289T9 arg9,10290T10 arg10,10291T11 arg11,10292T12 arg12,10293T13 arg13,10294T14 arg14)10295{10296return functor_(10297enqueueArgs,10298arg0,10299arg1,10300arg2,10301arg3,10302arg4,10303arg5,10304arg6,10305arg7,10306arg8,10307arg9,10308arg10,10309arg11,10310arg12,10311arg13,10312arg14);10313}103141031510316};1031710318template<10319typename T0,10320typename T1,10321typename T2,10322typename T3,10323typename T4,10324typename T5,10325typename T6,10326typename T7,10327typename T8,10328typename T9,10329typename T10,10330typename T11,10331typename T12,10332typename T13>10333struct functionImplementation_10334< T0,10335T1,10336T2,10337T3,10338T4,10339T5,10340T6,10341T7,10342T8,10343T9,10344T10,10345T11,10346T12,10347T13,10348NullType,10349NullType,10350NullType,10351NullType,10352NullType,10353NullType,10354NullType,10355NullType,10356NullType,10357NullType,10358NullType,10359NullType,10360NullType,10361NullType,10362NullType,10363NullType,10364NullType,10365NullType>10366{10367typedef detail::KernelFunctorGlobal<10368T0,10369T1,10370T2,10371T3,10372T4,10373T5,10374T6,10375T7,10376T8,10377T9,10378T10,10379T11,10380T12,10381T13,10382NullType,10383NullType,10384NullType,10385NullType,10386NullType,10387NullType,10388NullType,10389NullType,10390NullType,10391NullType,10392NullType,10393NullType,10394NullType,10395NullType,10396NullType,10397NullType,10398NullType,10399NullType> FunctorType;1040010401FunctorType functor_;1040210403functionImplementation_(const FunctorType &functor) :10404functor_(functor)10405{1040610407#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14))10408// Fail variadic expansion for dev1110409static_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.");10410#endif1041110412}1041310414//! \brief Return type of the functor10415typedef Event result_type;1041610417//! \brief Function signature of kernel functor with no event dependency.10418typedef Event type_(10419const EnqueueArgs&,10420T0,10421T1,10422T2,10423T3,10424T4,10425T5,10426T6,10427T7,10428T8,10429T9,10430T10,10431T11,10432T12,10433T13);1043410435Event operator()(10436const EnqueueArgs& enqueueArgs,10437T0 arg0,10438T1 arg1,10439T2 arg2,10440T3 arg3,10441T4 arg4,10442T5 arg5,10443T6 arg6,10444T7 arg7,10445T8 arg8,10446T9 arg9,10447T10 arg10,10448T11 arg11,10449T12 arg12,10450T13 arg13)10451{10452return functor_(10453enqueueArgs,10454arg0,10455arg1,10456arg2,10457arg3,10458arg4,10459arg5,10460arg6,10461arg7,10462arg8,10463arg9,10464arg10,10465arg11,10466arg12,10467arg13);10468}104691047010471};1047210473template<10474typename T0,10475typename T1,10476typename T2,10477typename T3,10478typename T4,10479typename T5,10480typename T6,10481typename T7,10482typename T8,10483typename T9,10484typename T10,10485typename T11,10486typename T12>10487struct functionImplementation_10488< T0,10489T1,10490T2,10491T3,10492T4,10493T5,10494T6,10495T7,10496T8,10497T9,10498T10,10499T11,10500T12,10501NullType,10502NullType,10503NullType,10504NullType,10505NullType,10506NullType,10507NullType,10508NullType,10509NullType,10510NullType,10511NullType,10512NullType,10513NullType,10514NullType,10515NullType,10516NullType,10517NullType,10518NullType,10519NullType>10520{10521typedef detail::KernelFunctorGlobal<10522T0,10523T1,10524T2,10525T3,10526T4,10527T5,10528T6,10529T7,10530T8,10531T9,10532T10,10533T11,10534T12,10535NullType,10536NullType,10537NullType,10538NullType,10539NullType,10540NullType,10541NullType,10542NullType,10543NullType,10544NullType,10545NullType,10546NullType,10547NullType,10548NullType,10549NullType,10550NullType,10551NullType,10552NullType,10553NullType> FunctorType;1055410555FunctorType functor_;1055610557functionImplementation_(const FunctorType &functor) :10558functor_(functor)10559{1056010561#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13))10562// Fail variadic expansion for dev1110563static_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.");10564#endif1056510566}1056710568//! \brief Return type of the functor10569typedef Event result_type;1057010571//! \brief Function signature of kernel functor with no event dependency.10572typedef Event type_(10573const EnqueueArgs&,10574T0,10575T1,10576T2,10577T3,10578T4,10579T5,10580T6,10581T7,10582T8,10583T9,10584T10,10585T11,10586T12);1058710588Event operator()(10589const EnqueueArgs& enqueueArgs,10590T0 arg0,10591T1 arg1,10592T2 arg2,10593T3 arg3,10594T4 arg4,10595T5 arg5,10596T6 arg6,10597T7 arg7,10598T8 arg8,10599T9 arg9,10600T10 arg10,10601T11 arg11,10602T12 arg12)10603{10604return functor_(10605enqueueArgs,10606arg0,10607arg1,10608arg2,10609arg3,10610arg4,10611arg5,10612arg6,10613arg7,10614arg8,10615arg9,10616arg10,10617arg11,10618arg12);10619}106201062110622};1062310624template<10625typename T0,10626typename T1,10627typename T2,10628typename T3,10629typename T4,10630typename T5,10631typename T6,10632typename T7,10633typename T8,10634typename T9,10635typename T10,10636typename T11>10637struct functionImplementation_10638< T0,10639T1,10640T2,10641T3,10642T4,10643T5,10644T6,10645T7,10646T8,10647T9,10648T10,10649T11,10650NullType,10651NullType,10652NullType,10653NullType,10654NullType,10655NullType,10656NullType,10657NullType,10658NullType,10659NullType,10660NullType,10661NullType,10662NullType,10663NullType,10664NullType,10665NullType,10666NullType,10667NullType,10668NullType,10669NullType>10670{10671typedef detail::KernelFunctorGlobal<10672T0,10673T1,10674T2,10675T3,10676T4,10677T5,10678T6,10679T7,10680T8,10681T9,10682T10,10683T11,10684NullType,10685NullType,10686NullType,10687NullType,10688NullType,10689NullType,10690NullType,10691NullType,10692NullType,10693NullType,10694NullType,10695NullType,10696NullType,10697NullType,10698NullType,10699NullType,10700NullType,10701NullType,10702NullType,10703NullType> FunctorType;1070410705FunctorType functor_;1070610707functionImplementation_(const FunctorType &functor) :10708functor_(functor)10709{1071010711#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12))10712// Fail variadic expansion for dev1110713static_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.");10714#endif1071510716}1071710718//! \brief Return type of the functor10719typedef Event result_type;1072010721//! \brief Function signature of kernel functor with no event dependency.10722typedef Event type_(10723const EnqueueArgs&,10724T0,10725T1,10726T2,10727T3,10728T4,10729T5,10730T6,10731T7,10732T8,10733T9,10734T10,10735T11);1073610737Event operator()(10738const EnqueueArgs& enqueueArgs,10739T0 arg0,10740T1 arg1,10741T2 arg2,10742T3 arg3,10743T4 arg4,10744T5 arg5,10745T6 arg6,10746T7 arg7,10747T8 arg8,10748T9 arg9,10749T10 arg10,10750T11 arg11)10751{10752return functor_(10753enqueueArgs,10754arg0,10755arg1,10756arg2,10757arg3,10758arg4,10759arg5,10760arg6,10761arg7,10762arg8,10763arg9,10764arg10,10765arg11);10766}107671076810769};1077010771template<10772typename T0,10773typename T1,10774typename T2,10775typename T3,10776typename T4,10777typename T5,10778typename T6,10779typename T7,10780typename T8,10781typename T9,10782typename T10>10783struct functionImplementation_10784< T0,10785T1,10786T2,10787T3,10788T4,10789T5,10790T6,10791T7,10792T8,10793T9,10794T10,10795NullType,10796NullType,10797NullType,10798NullType,10799NullType,10800NullType,10801NullType,10802NullType,10803NullType,10804NullType,10805NullType,10806NullType,10807NullType,10808NullType,10809NullType,10810NullType,10811NullType,10812NullType,10813NullType,10814NullType,10815NullType>10816{10817typedef detail::KernelFunctorGlobal<10818T0,10819T1,10820T2,10821T3,10822T4,10823T5,10824T6,10825T7,10826T8,10827T9,10828T10,10829NullType,10830NullType,10831NullType,10832NullType,10833NullType,10834NullType,10835NullType,10836NullType,10837NullType,10838NullType,10839NullType,10840NullType,10841NullType,10842NullType,10843NullType,10844NullType,10845NullType,10846NullType,10847NullType,10848NullType,10849NullType> FunctorType;1085010851FunctorType functor_;1085210853functionImplementation_(const FunctorType &functor) :10854functor_(functor)10855{1085610857#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11))10858// Fail variadic expansion for dev1110859static_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.");10860#endif1086110862}1086310864//! \brief Return type of the functor10865typedef Event result_type;1086610867//! \brief Function signature of kernel functor with no event dependency.10868typedef Event type_(10869const EnqueueArgs&,10870T0,10871T1,10872T2,10873T3,10874T4,10875T5,10876T6,10877T7,10878T8,10879T9,10880T10);1088110882Event operator()(10883const EnqueueArgs& enqueueArgs,10884T0 arg0,10885T1 arg1,10886T2 arg2,10887T3 arg3,10888T4 arg4,10889T5 arg5,10890T6 arg6,10891T7 arg7,10892T8 arg8,10893T9 arg9,10894T10 arg10)10895{10896return functor_(10897enqueueArgs,10898arg0,10899arg1,10900arg2,10901arg3,10902arg4,10903arg5,10904arg6,10905arg7,10906arg8,10907arg9,10908arg10);10909}109101091110912};1091310914template<10915typename T0,10916typename T1,10917typename T2,10918typename T3,10919typename T4,10920typename T5,10921typename T6,10922typename T7,10923typename T8,10924typename T9>10925struct functionImplementation_10926< T0,10927T1,10928T2,10929T3,10930T4,10931T5,10932T6,10933T7,10934T8,10935T9,10936NullType,10937NullType,10938NullType,10939NullType,10940NullType,10941NullType,10942NullType,10943NullType,10944NullType,10945NullType,10946NullType,10947NullType,10948NullType,10949NullType,10950NullType,10951NullType,10952NullType,10953NullType,10954NullType,10955NullType,10956NullType,10957NullType>10958{10959typedef detail::KernelFunctorGlobal<10960T0,10961T1,10962T2,10963T3,10964T4,10965T5,10966T6,10967T7,10968T8,10969T9,10970NullType,10971NullType,10972NullType,10973NullType,10974NullType,10975NullType,10976NullType,10977NullType,10978NullType,10979NullType,10980NullType,10981NullType,10982NullType,10983NullType,10984NullType,10985NullType,10986NullType,10987NullType,10988NullType,10989NullType,10990NullType,10991NullType> FunctorType;1099210993FunctorType functor_;1099410995functionImplementation_(const FunctorType &functor) :10996functor_(functor)10997{1099810999#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10))11000// Fail variadic expansion for dev1111001static_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.");11002#endif1100311004}1100511006//! \brief Return type of the functor11007typedef Event result_type;1100811009//! \brief Function signature of kernel functor with no event dependency.11010typedef Event type_(11011const EnqueueArgs&,11012T0,11013T1,11014T2,11015T3,11016T4,11017T5,11018T6,11019T7,11020T8,11021T9);1102211023Event operator()(11024const EnqueueArgs& enqueueArgs,11025T0 arg0,11026T1 arg1,11027T2 arg2,11028T3 arg3,11029T4 arg4,11030T5 arg5,11031T6 arg6,11032T7 arg7,11033T8 arg8,11034T9 arg9)11035{11036return functor_(11037enqueueArgs,11038arg0,11039arg1,11040arg2,11041arg3,11042arg4,11043arg5,11044arg6,11045arg7,11046arg8,11047arg9);11048}110491105011051};1105211053template<11054typename T0,11055typename T1,11056typename T2,11057typename T3,11058typename T4,11059typename T5,11060typename T6,11061typename T7,11062typename T8>11063struct functionImplementation_11064< T0,11065T1,11066T2,11067T3,11068T4,11069T5,11070T6,11071T7,11072T8,11073NullType,11074NullType,11075NullType,11076NullType,11077NullType,11078NullType,11079NullType,11080NullType,11081NullType,11082NullType,11083NullType,11084NullType,11085NullType,11086NullType,11087NullType,11088NullType,11089NullType,11090NullType,11091NullType,11092NullType,11093NullType,11094NullType,11095NullType>11096{11097typedef detail::KernelFunctorGlobal<11098T0,11099T1,11100T2,11101T3,11102T4,11103T5,11104T6,11105T7,11106T8,11107NullType,11108NullType,11109NullType,11110NullType,11111NullType,11112NullType,11113NullType,11114NullType,11115NullType,11116NullType,11117NullType,11118NullType,11119NullType,11120NullType,11121NullType,11122NullType,11123NullType,11124NullType,11125NullType,11126NullType,11127NullType,11128NullType,11129NullType> FunctorType;1113011131FunctorType functor_;1113211133functionImplementation_(const FunctorType &functor) :11134functor_(functor)11135{1113611137#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9))11138// Fail variadic expansion for dev1111139static_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.");11140#endif1114111142}1114311144//! \brief Return type of the functor11145typedef Event result_type;1114611147//! \brief Function signature of kernel functor with no event dependency.11148typedef Event type_(11149const EnqueueArgs&,11150T0,11151T1,11152T2,11153T3,11154T4,11155T5,11156T6,11157T7,11158T8);1115911160Event operator()(11161const EnqueueArgs& enqueueArgs,11162T0 arg0,11163T1 arg1,11164T2 arg2,11165T3 arg3,11166T4 arg4,11167T5 arg5,11168T6 arg6,11169T7 arg7,11170T8 arg8)11171{11172return functor_(11173enqueueArgs,11174arg0,11175arg1,11176arg2,11177arg3,11178arg4,11179arg5,11180arg6,11181arg7,11182arg8);11183}111841118511186};1118711188template<11189typename T0,11190typename T1,11191typename T2,11192typename T3,11193typename T4,11194typename T5,11195typename T6,11196typename T7>11197struct functionImplementation_11198< T0,11199T1,11200T2,11201T3,11202T4,11203T5,11204T6,11205T7,11206NullType,11207NullType,11208NullType,11209NullType,11210NullType,11211NullType,11212NullType,11213NullType,11214NullType,11215NullType,11216NullType,11217NullType,11218NullType,11219NullType,11220NullType,11221NullType,11222NullType,11223NullType,11224NullType,11225NullType,11226NullType,11227NullType,11228NullType,11229NullType>11230{11231typedef detail::KernelFunctorGlobal<11232T0,11233T1,11234T2,11235T3,11236T4,11237T5,11238T6,11239T7,11240NullType,11241NullType,11242NullType,11243NullType,11244NullType,11245NullType,11246NullType,11247NullType,11248NullType,11249NullType,11250NullType,11251NullType,11252NullType,11253NullType,11254NullType,11255NullType,11256NullType,11257NullType,11258NullType,11259NullType,11260NullType,11261NullType,11262NullType,11263NullType> FunctorType;1126411265FunctorType functor_;1126611267functionImplementation_(const FunctorType &functor) :11268functor_(functor)11269{1127011271#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8))11272// Fail variadic expansion for dev1111273static_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.");11274#endif1127511276}1127711278//! \brief Return type of the functor11279typedef Event result_type;1128011281//! \brief Function signature of kernel functor with no event dependency.11282typedef Event type_(11283const EnqueueArgs&,11284T0,11285T1,11286T2,11287T3,11288T4,11289T5,11290T6,11291T7);1129211293Event operator()(11294const EnqueueArgs& enqueueArgs,11295T0 arg0,11296T1 arg1,11297T2 arg2,11298T3 arg3,11299T4 arg4,11300T5 arg5,11301T6 arg6,11302T7 arg7)11303{11304return functor_(11305enqueueArgs,11306arg0,11307arg1,11308arg2,11309arg3,11310arg4,11311arg5,11312arg6,11313arg7);11314}113151131611317};1131811319template<11320typename T0,11321typename T1,11322typename T2,11323typename T3,11324typename T4,11325typename T5,11326typename T6>11327struct functionImplementation_11328< T0,11329T1,11330T2,11331T3,11332T4,11333T5,11334T6,11335NullType,11336NullType,11337NullType,11338NullType,11339NullType,11340NullType,11341NullType,11342NullType,11343NullType,11344NullType,11345NullType,11346NullType,11347NullType,11348NullType,11349NullType,11350NullType,11351NullType,11352NullType,11353NullType,11354NullType,11355NullType,11356NullType,11357NullType,11358NullType,11359NullType>11360{11361typedef detail::KernelFunctorGlobal<11362T0,11363T1,11364T2,11365T3,11366T4,11367T5,11368T6,11369NullType,11370NullType,11371NullType,11372NullType,11373NullType,11374NullType,11375NullType,11376NullType,11377NullType,11378NullType,11379NullType,11380NullType,11381NullType,11382NullType,11383NullType,11384NullType,11385NullType,11386NullType,11387NullType,11388NullType,11389NullType,11390NullType,11391NullType,11392NullType,11393NullType> FunctorType;1139411395FunctorType functor_;1139611397functionImplementation_(const FunctorType &functor) :11398functor_(functor)11399{1140011401#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7))11402// Fail variadic expansion for dev1111403static_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.");11404#endif1140511406}1140711408//! \brief Return type of the functor11409typedef Event result_type;1141011411//! \brief Function signature of kernel functor with no event dependency.11412typedef Event type_(11413const EnqueueArgs&,11414T0,11415T1,11416T2,11417T3,11418T4,11419T5,11420T6);1142111422Event operator()(11423const EnqueueArgs& enqueueArgs,11424T0 arg0,11425T1 arg1,11426T2 arg2,11427T3 arg3,11428T4 arg4,11429T5 arg5,11430T6 arg6)11431{11432return functor_(11433enqueueArgs,11434arg0,11435arg1,11436arg2,11437arg3,11438arg4,11439arg5,11440arg6);11441}114421144311444};1144511446template<11447typename T0,11448typename T1,11449typename T2,11450typename T3,11451typename T4,11452typename T5>11453struct functionImplementation_11454< T0,11455T1,11456T2,11457T3,11458T4,11459T5,11460NullType,11461NullType,11462NullType,11463NullType,11464NullType,11465NullType,11466NullType,11467NullType,11468NullType,11469NullType,11470NullType,11471NullType,11472NullType,11473NullType,11474NullType,11475NullType,11476NullType,11477NullType,11478NullType,11479NullType,11480NullType,11481NullType,11482NullType,11483NullType,11484NullType,11485NullType>11486{11487typedef detail::KernelFunctorGlobal<11488T0,11489T1,11490T2,11491T3,11492T4,11493T5,11494NullType,11495NullType,11496NullType,11497NullType,11498NullType,11499NullType,11500NullType,11501NullType,11502NullType,11503NullType,11504NullType,11505NullType,11506NullType,11507NullType,11508NullType,11509NullType,11510NullType,11511NullType,11512NullType,11513NullType,11514NullType,11515NullType,11516NullType,11517NullType,11518NullType,11519NullType> FunctorType;1152011521FunctorType functor_;1152211523functionImplementation_(const FunctorType &functor) :11524functor_(functor)11525{1152611527#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6))11528// Fail variadic expansion for dev1111529static_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.");11530#endif1153111532}1153311534//! \brief Return type of the functor11535typedef Event result_type;1153611537//! \brief Function signature of kernel functor with no event dependency.11538typedef Event type_(11539const EnqueueArgs&,11540T0,11541T1,11542T2,11543T3,11544T4,11545T5);1154611547Event operator()(11548const EnqueueArgs& enqueueArgs,11549T0 arg0,11550T1 arg1,11551T2 arg2,11552T3 arg3,11553T4 arg4,11554T5 arg5)11555{11556return functor_(11557enqueueArgs,11558arg0,11559arg1,11560arg2,11561arg3,11562arg4,11563arg5);11564}115651156611567};1156811569template<11570typename T0,11571typename T1,11572typename T2,11573typename T3,11574typename T4>11575struct functionImplementation_11576< T0,11577T1,11578T2,11579T3,11580T4,11581NullType,11582NullType,11583NullType,11584NullType,11585NullType,11586NullType,11587NullType,11588NullType,11589NullType,11590NullType,11591NullType,11592NullType,11593NullType,11594NullType,11595NullType,11596NullType,11597NullType,11598NullType,11599NullType,11600NullType,11601NullType,11602NullType,11603NullType,11604NullType,11605NullType,11606NullType,11607NullType>11608{11609typedef detail::KernelFunctorGlobal<11610T0,11611T1,11612T2,11613T3,11614T4,11615NullType,11616NullType,11617NullType,11618NullType,11619NullType,11620NullType,11621NullType,11622NullType,11623NullType,11624NullType,11625NullType,11626NullType,11627NullType,11628NullType,11629NullType,11630NullType,11631NullType,11632NullType,11633NullType,11634NullType,11635NullType,11636NullType,11637NullType,11638NullType,11639NullType,11640NullType,11641NullType> FunctorType;1164211643FunctorType functor_;1164411645functionImplementation_(const FunctorType &functor) :11646functor_(functor)11647{1164811649#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5))11650// Fail variadic expansion for dev1111651static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");11652#endif1165311654}1165511656//! \brief Return type of the functor11657typedef Event result_type;1165811659//! \brief Function signature of kernel functor with no event dependency.11660typedef Event type_(11661const EnqueueArgs&,11662T0,11663T1,11664T2,11665T3,11666T4);1166711668Event operator()(11669const EnqueueArgs& enqueueArgs,11670T0 arg0,11671T1 arg1,11672T2 arg2,11673T3 arg3,11674T4 arg4)11675{11676return functor_(11677enqueueArgs,11678arg0,11679arg1,11680arg2,11681arg3,11682arg4);11683}116841168511686};1168711688template<11689typename T0,11690typename T1,11691typename T2,11692typename T3>11693struct functionImplementation_11694< T0,11695T1,11696T2,11697T3,11698NullType,11699NullType,11700NullType,11701NullType,11702NullType,11703NullType,11704NullType,11705NullType,11706NullType,11707NullType,11708NullType,11709NullType,11710NullType,11711NullType,11712NullType,11713NullType,11714NullType,11715NullType,11716NullType,11717NullType,11718NullType,11719NullType,11720NullType,11721NullType,11722NullType,11723NullType,11724NullType,11725NullType>11726{11727typedef detail::KernelFunctorGlobal<11728T0,11729T1,11730T2,11731T3,11732NullType,11733NullType,11734NullType,11735NullType,11736NullType,11737NullType,11738NullType,11739NullType,11740NullType,11741NullType,11742NullType,11743NullType,11744NullType,11745NullType,11746NullType,11747NullType,11748NullType,11749NullType,11750NullType,11751NullType,11752NullType,11753NullType,11754NullType,11755NullType,11756NullType,11757NullType,11758NullType,11759NullType> FunctorType;1176011761FunctorType functor_;1176211763functionImplementation_(const FunctorType &functor) :11764functor_(functor)11765{1176611767#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4))11768// Fail variadic expansion for dev1111769static_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.");11770#endif1177111772}1177311774//! \brief Return type of the functor11775typedef Event result_type;1177611777//! \brief Function signature of kernel functor with no event dependency.11778typedef Event type_(11779const EnqueueArgs&,11780T0,11781T1,11782T2,11783T3);1178411785Event operator()(11786const EnqueueArgs& enqueueArgs,11787T0 arg0,11788T1 arg1,11789T2 arg2,11790T3 arg3)11791{11792return functor_(11793enqueueArgs,11794arg0,11795arg1,11796arg2,11797arg3);11798}117991180011801};1180211803template<11804typename T0,11805typename T1,11806typename T2>11807struct functionImplementation_11808< T0,11809T1,11810T2,11811NullType,11812NullType,11813NullType,11814NullType,11815NullType,11816NullType,11817NullType,11818NullType,11819NullType,11820NullType,11821NullType,11822NullType,11823NullType,11824NullType,11825NullType,11826NullType,11827NullType,11828NullType,11829NullType,11830NullType,11831NullType,11832NullType,11833NullType,11834NullType,11835NullType,11836NullType,11837NullType,11838NullType,11839NullType>11840{11841typedef detail::KernelFunctorGlobal<11842T0,11843T1,11844T2,11845NullType,11846NullType,11847NullType,11848NullType,11849NullType,11850NullType,11851NullType,11852NullType,11853NullType,11854NullType,11855NullType,11856NullType,11857NullType,11858NullType,11859NullType,11860NullType,11861NullType,11862NullType,11863NullType,11864NullType,11865NullType,11866NullType,11867NullType,11868NullType,11869NullType,11870NullType,11871NullType,11872NullType,11873NullType> FunctorType;1187411875FunctorType functor_;1187611877functionImplementation_(const FunctorType &functor) :11878functor_(functor)11879{1188011881#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3))11882// Fail variadic expansion for dev1111883static_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.");11884#endif1188511886}1188711888//! \brief Return type of the functor11889typedef Event result_type;1189011891//! \brief Function signature of kernel functor with no event dependency.11892typedef Event type_(11893const EnqueueArgs&,11894T0,11895T1,11896T2);1189711898Event operator()(11899const EnqueueArgs& enqueueArgs,11900T0 arg0,11901T1 arg1,11902T2 arg2)11903{11904return functor_(11905enqueueArgs,11906arg0,11907arg1,11908arg2);11909}119101191111912};1191311914template<11915typename T0,11916typename T1>11917struct functionImplementation_11918< T0,11919T1,11920NullType,11921NullType,11922NullType,11923NullType,11924NullType,11925NullType,11926NullType,11927NullType,11928NullType,11929NullType,11930NullType,11931NullType,11932NullType,11933NullType,11934NullType,11935NullType,11936NullType,11937NullType,11938NullType,11939NullType,11940NullType,11941NullType,11942NullType,11943NullType,11944NullType,11945NullType,11946NullType,11947NullType,11948NullType,11949NullType>11950{11951typedef detail::KernelFunctorGlobal<11952T0,11953T1,11954NullType,11955NullType,11956NullType,11957NullType,11958NullType,11959NullType,11960NullType,11961NullType,11962NullType,11963NullType,11964NullType,11965NullType,11966NullType,11967NullType,11968NullType,11969NullType,11970NullType,11971NullType,11972NullType,11973NullType,11974NullType,11975NullType,11976NullType,11977NullType,11978NullType,11979NullType,11980NullType,11981NullType,11982NullType,11983NullType> FunctorType;1198411985FunctorType functor_;1198611987functionImplementation_(const FunctorType &functor) :11988functor_(functor)11989{1199011991#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2))11992// Fail variadic expansion for dev1111993static_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.");11994#endif1199511996}1199711998//! \brief Return type of the functor11999typedef Event result_type;1200012001//! \brief Function signature of kernel functor with no event dependency.12002typedef Event type_(12003const EnqueueArgs&,12004T0,12005T1);1200612007Event operator()(12008const EnqueueArgs& enqueueArgs,12009T0 arg0,12010T1 arg1)12011{12012return functor_(12013enqueueArgs,12014arg0,12015arg1);12016}120171201812019};1202012021template<12022typename T0>12023struct functionImplementation_12024< T0,12025NullType,12026NullType,12027NullType,12028NullType,12029NullType,12030NullType,12031NullType,12032NullType,12033NullType,12034NullType,12035NullType,12036NullType,12037NullType,12038NullType,12039NullType,12040NullType,12041NullType,12042NullType,12043NullType,12044NullType,12045NullType,12046NullType,12047NullType,12048NullType,12049NullType,12050NullType,12051NullType,12052NullType,12053NullType,12054NullType,12055NullType>12056{12057typedef detail::KernelFunctorGlobal<12058T0,12059NullType,12060NullType,12061NullType,12062NullType,12063NullType,12064NullType,12065NullType,12066NullType,12067NullType,12068NullType,12069NullType,12070NullType,12071NullType,12072NullType,12073NullType,12074NullType,12075NullType,12076NullType,12077NullType,12078NullType,12079NullType,12080NullType,12081NullType,12082NullType,12083NullType,12084NullType,12085NullType,12086NullType,12087NullType,12088NullType,12089NullType> FunctorType;1209012091FunctorType functor_;1209212093functionImplementation_(const FunctorType &functor) :12094functor_(functor)12095{1209612097#if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1))12098// Fail variadic expansion for dev1112099static_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.");12100#endif1210112102}1210312104//! \brief Return type of the functor12105typedef Event result_type;1210612107//! \brief Function signature of kernel functor with no event dependency.12108typedef Event type_(12109const EnqueueArgs&,12110T0);1211112112Event operator()(12113const EnqueueArgs& enqueueArgs,12114T0 arg0)12115{12116return functor_(12117enqueueArgs,12118arg0);12119}121201212112122};121231212412125121261212712128} // namespace detail1212912130//----------------------------------------------------------------------------------------------1213112132template <12133typename T0, typename T1 = detail::NullType, typename T2 = detail::NullType,12134typename T3 = detail::NullType, typename T4 = detail::NullType,12135typename T5 = detail::NullType, typename T6 = detail::NullType,12136typename T7 = detail::NullType, typename T8 = detail::NullType,12137typename T9 = detail::NullType, typename T10 = detail::NullType,12138typename T11 = detail::NullType, typename T12 = detail::NullType,12139typename T13 = detail::NullType, typename T14 = detail::NullType,12140typename T15 = detail::NullType, typename T16 = detail::NullType,12141typename T17 = detail::NullType, typename T18 = detail::NullType,12142typename T19 = detail::NullType, typename T20 = detail::NullType,12143typename T21 = detail::NullType, typename T22 = detail::NullType,12144typename T23 = detail::NullType, typename T24 = detail::NullType,12145typename T25 = detail::NullType, typename T26 = detail::NullType,12146typename T27 = detail::NullType, typename T28 = detail::NullType,12147typename T29 = detail::NullType, typename T30 = detail::NullType,12148typename T31 = detail::NullType12149>12150struct make_kernel :12151public detail::functionImplementation_<12152T0, T1, T2, T3,12153T4, T5, T6, T7,12154T8, T9, T10, T11,12155T12, T13, T14, T15,12156T16, T17, T18, T19,12157T20, T21, T22, T23,12158T24, T25, T26, T27,12159T28, T29, T30, T3112160>12161{12162public:12163typedef detail::KernelFunctorGlobal<12164T0, T1, T2, T3,12165T4, T5, T6, T7,12166T8, T9, T10, T11,12167T12, T13, T14, T15,12168T16, T17, T18, T19,12169T20, T21, T22, T23,12170T24, T25, T26, T27,12171T28, T29, T30, T3112172> FunctorType;1217312174make_kernel(12175const Program& program,12176const STRING_CLASS name,12177cl_int * err = NULL) :12178detail::functionImplementation_<12179T0, T1, T2, T3,12180T4, T5, T6, T7,12181T8, T9, T10, T11,12182T12, T13, T14, T15,12183T16, T17, T18, T19,12184T20, T21, T22, T23,12185T24, T25, T26, T27,12186T28, T29, T30, T3112187>(12188FunctorType(program, name, err))12189{}1219012191make_kernel(12192const Kernel kernel) :12193detail::functionImplementation_<12194T0, T1, T2, T3,12195T4, T5, T6, T7,12196T8, T9, T10, T11,12197T12, T13, T14, T15,12198T16, T17, T18, T19,12199T20, T21, T22, T23,12200T24, T25, T26, T27,12201T28, T29, T30, T3112202>(12203FunctorType(kernel))12204{}12205};122061220712208//----------------------------------------------------------------------------------------------------------------------1220912210#undef __ERR_STR12211#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)12212#undef __GET_DEVICE_INFO_ERR12213#undef __GET_PLATFORM_INFO_ERR12214#undef __GET_DEVICE_IDS_ERR12215#undef __GET_CONTEXT_INFO_ERR12216#undef __GET_EVENT_INFO_ERR12217#undef __GET_EVENT_PROFILE_INFO_ERR12218#undef __GET_MEM_OBJECT_INFO_ERR12219#undef __GET_IMAGE_INFO_ERR12220#undef __GET_SAMPLER_INFO_ERR12221#undef __GET_KERNEL_INFO_ERR12222#undef __GET_KERNEL_ARG_INFO_ERR12223#undef __GET_KERNEL_WORK_GROUP_INFO_ERR12224#undef __GET_PROGRAM_INFO_ERR12225#undef __GET_PROGRAM_BUILD_INFO_ERR12226#undef __GET_COMMAND_QUEUE_INFO_ERR1222712228#undef __CREATE_CONTEXT_ERR12229#undef __CREATE_CONTEXT_FROM_TYPE_ERR12230#undef __GET_SUPPORTED_IMAGE_FORMATS_ERR1223112232#undef __CREATE_BUFFER_ERR12233#undef __CREATE_SUBBUFFER_ERR12234#undef __CREATE_IMAGE2D_ERR12235#undef __CREATE_IMAGE3D_ERR12236#undef __CREATE_SAMPLER_ERR12237#undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR1223812239#undef __CREATE_USER_EVENT_ERR12240#undef __SET_USER_EVENT_STATUS_ERR12241#undef __SET_EVENT_CALLBACK_ERR12242#undef __SET_PRINTF_CALLBACK_ERR1224312244#undef __WAIT_FOR_EVENTS_ERR1224512246#undef __CREATE_KERNEL_ERR12247#undef __SET_KERNEL_ARGS_ERR12248#undef __CREATE_PROGRAM_WITH_SOURCE_ERR12249#undef __CREATE_PROGRAM_WITH_BINARY_ERR12250#undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR12251#undef __BUILD_PROGRAM_ERR12252#undef __CREATE_KERNELS_IN_PROGRAM_ERR1225312254#undef __CREATE_COMMAND_QUEUE_ERR12255#undef __SET_COMMAND_QUEUE_PROPERTY_ERR12256#undef __ENQUEUE_READ_BUFFER_ERR12257#undef __ENQUEUE_WRITE_BUFFER_ERR12258#undef __ENQUEUE_READ_BUFFER_RECT_ERR12259#undef __ENQUEUE_WRITE_BUFFER_RECT_ERR12260#undef __ENQEUE_COPY_BUFFER_ERR12261#undef __ENQEUE_COPY_BUFFER_RECT_ERR12262#undef __ENQUEUE_READ_IMAGE_ERR12263#undef __ENQUEUE_WRITE_IMAGE_ERR12264#undef __ENQUEUE_COPY_IMAGE_ERR12265#undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR12266#undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR12267#undef __ENQUEUE_MAP_BUFFER_ERR12268#undef __ENQUEUE_MAP_IMAGE_ERR12269#undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR12270#undef __ENQUEUE_NDRANGE_KERNEL_ERR12271#undef __ENQUEUE_TASK_ERR12272#undef __ENQUEUE_NATIVE_KERNEL1227312274#undef __CL_EXPLICIT_CONSTRUCTORS1227512276#undef __UNLOAD_COMPILER_ERR12277#endif //__CL_USER_OVERRIDE_ERROR_STRINGS1227812279#undef __CL_FUNCTION_TYPE1228012281// Extensions12282/**12283* Deprecated APIs for 1.212284*/12285#if defined(CL_VERSION_1_1)12286#undef __INIT_CL_EXT_FCN_PTR12287#endif // #if defined(CL_VERSION_1_1)12288#undef __CREATE_SUB_DEVICES1228912290#if defined(USE_CL_DEVICE_FISSION)12291#undef __PARAM_NAME_DEVICE_FISSION12292#endif // USE_CL_DEVICE_FISSION1229312294#undef __DEFAULT_NOT_INITIALIZED12295#undef __DEFAULT_BEING_INITIALIZED12296#undef __DEFAULT_INITIALIZED1229712298} // namespace cl1229912300#ifdef _WIN3212301#pragma pop_macro("max")12302#endif // _WIN321230312304#endif // CL_HPP_123051230612307