cl.hpp revision af69d88d
1af69d88dSmrg/******************************************************************************* 2af69d88dSmrg * Copyright (c) 2008-2010 The Khronos Group Inc. 3af69d88dSmrg * 4af69d88dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5af69d88dSmrg * copy of this software and/or associated documentation files (the 6af69d88dSmrg * "Materials"), to deal in the Materials without restriction, including 7af69d88dSmrg * without limitation the rights to use, copy, modify, merge, publish, 8af69d88dSmrg * distribute, sublicense, and/or sell copies of the Materials, and to 9af69d88dSmrg * permit persons to whom the Materials are furnished to do so, subject to 10af69d88dSmrg * the following conditions: 11af69d88dSmrg * 12af69d88dSmrg * The above copyright notice and this permission notice shall be included 13af69d88dSmrg * in all copies or substantial portions of the Materials. 14af69d88dSmrg * 15af69d88dSmrg * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16af69d88dSmrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17af69d88dSmrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18af69d88dSmrg * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 19af69d88dSmrg * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20af69d88dSmrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21af69d88dSmrg * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 22af69d88dSmrg ******************************************************************************/ 23af69d88dSmrg 24af69d88dSmrg/*! \file 25af69d88dSmrg * 26af69d88dSmrg * \brief C++ bindings for OpenCL 1.0 (rev 48) and OpenCL 1.1 (rev 33) 27af69d88dSmrg * \author Benedict R. Gaster and Laurent Morichetti 28af69d88dSmrg * 29af69d88dSmrg * Additions and fixes from Brian Cole, March 3rd 2010. 30af69d88dSmrg * 31af69d88dSmrg * \version 1.1 32af69d88dSmrg * \date June 2010 33af69d88dSmrg * 34af69d88dSmrg * Optional extension support 35af69d88dSmrg * 36af69d88dSmrg * cl 37af69d88dSmrg * cl_ext_device_fission 38af69d88dSmrg * #define USE_CL_DEVICE_FISSION 39af69d88dSmrg */ 40af69d88dSmrg 41af69d88dSmrg/*! \mainpage 42af69d88dSmrg * \section intro Introduction 43af69d88dSmrg * For many large applications C++ is the language of choice and so it seems 44af69d88dSmrg * reasonable to define C++ bindings for OpenCL. 45af69d88dSmrg * 46af69d88dSmrg * 47af69d88dSmrg * The interface is contained with a single C++ header file \em cl.hpp and all 48af69d88dSmrg * definitions are contained within the namespace \em cl. There is no additional 49af69d88dSmrg * requirement to include \em cl.h and to use either the C++ or original C 50af69d88dSmrg * bindings it is enough to simply include \em cl.hpp. 51af69d88dSmrg * 52af69d88dSmrg * The bindings themselves are lightweight and correspond closely to the 53af69d88dSmrg * underlying C API. Using the C++ bindings introduces no additional execution 54af69d88dSmrg * overhead. 55af69d88dSmrg * 56af69d88dSmrg * For detail documentation on the bindings see: 57af69d88dSmrg * 58af69d88dSmrg * The OpenCL C++ Wrapper API 1.1 (revision 04) 59af69d88dSmrg * http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.1.pdf 60af69d88dSmrg * 61af69d88dSmrg * \section example Example 62af69d88dSmrg * 63af69d88dSmrg * The following example shows a general use case for the C++ 64af69d88dSmrg * bindings, including support for the optional exception feature and 65af69d88dSmrg * also the supplied vector and string classes, see following sections for 66af69d88dSmrg * decriptions of these features. 67af69d88dSmrg * 68af69d88dSmrg * \code 69af69d88dSmrg * #define __CL_ENABLE_EXCEPTIONS 70af69d88dSmrg * 71af69d88dSmrg * #if defined(__APPLE__) || defined(__MACOSX) 72af69d88dSmrg * #include <OpenCL/cl.hpp> 73af69d88dSmrg * #else 74af69d88dSmrg * #include <CL/cl.hpp> 75af69d88dSmrg * #endif 76af69d88dSmrg * #include <cstdio> 77af69d88dSmrg * #include <cstdlib> 78af69d88dSmrg * #include <iostream> 79af69d88dSmrg * 80af69d88dSmrg * const char * helloStr = "__kernel void " 81af69d88dSmrg * "hello(void) " 82af69d88dSmrg * "{ " 83af69d88dSmrg * " " 84af69d88dSmrg * "} "; 85af69d88dSmrg * 86af69d88dSmrg * int 87af69d88dSmrg * main(void) 88af69d88dSmrg * { 89af69d88dSmrg * cl_int err = CL_SUCCESS; 90af69d88dSmrg * try { 91af69d88dSmrg * 92af69d88dSmrg * std::vector<cl::Platform> platforms; 93af69d88dSmrg * cl::Platform::get(&platforms); 94af69d88dSmrg * if (platforms.size() == 0) { 95af69d88dSmrg * std::cout << "Platform size 0\n"; 96af69d88dSmrg * return -1; 97af69d88dSmrg * } 98af69d88dSmrg * 99af69d88dSmrg * cl_context_properties properties[] = 100af69d88dSmrg * { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0}; 101af69d88dSmrg * cl::Context context(CL_DEVICE_TYPE_CPU, properties); 102af69d88dSmrg * 103af69d88dSmrg * std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>(); 104af69d88dSmrg * 105af69d88dSmrg * cl::Program::Sources source(1, 106af69d88dSmrg * std::make_pair(helloStr,strlen(helloStr))); 107af69d88dSmrg * cl::Program program_ = cl::Program(context, source); 108af69d88dSmrg * program_.build(devices); 109af69d88dSmrg * 110af69d88dSmrg * cl::Kernel kernel(program_, "hello", &err); 111af69d88dSmrg * 112af69d88dSmrg * cl::Event event; 113af69d88dSmrg * cl::CommandQueue queue(context, devices[0], 0, &err); 114af69d88dSmrg * queue.enqueueNDRangeKernel( 115af69d88dSmrg * kernel, 116af69d88dSmrg * cl::NullRange, 117af69d88dSmrg * cl::NDRange(4,4), 118af69d88dSmrg * cl::NullRange, 119af69d88dSmrg * NULL, 120af69d88dSmrg * &event); 121af69d88dSmrg * 122af69d88dSmrg * event.wait(); 123af69d88dSmrg * } 124af69d88dSmrg * catch (cl::Error err) { 125af69d88dSmrg * std::cerr 126af69d88dSmrg * << "ERROR: " 127af69d88dSmrg * << err.what() 128af69d88dSmrg * << "(" 129af69d88dSmrg * << err.err() 130af69d88dSmrg * << ")" 131af69d88dSmrg * << std::endl; 132af69d88dSmrg * } 133af69d88dSmrg * 134af69d88dSmrg * return EXIT_SUCCESS; 135af69d88dSmrg * } 136af69d88dSmrg * 137af69d88dSmrg * \endcode 138af69d88dSmrg * 139af69d88dSmrg */ 140af69d88dSmrg#ifndef CL_HPP_ 141af69d88dSmrg#define CL_HPP_ 142af69d88dSmrg 143af69d88dSmrg#ifdef _WIN32 144af69d88dSmrg#include <windows.h> 145af69d88dSmrg#include <malloc.h> 146af69d88dSmrg#if defined(USE_DX_INTEROP) 147af69d88dSmrg#include <CL/cl_d3d10.h> 148af69d88dSmrg#endif 149af69d88dSmrg#endif // _WIN32 150af69d88dSmrg 151af69d88dSmrg// 152af69d88dSmrg#if defined(USE_CL_DEVICE_FISSION) 153af69d88dSmrg#include <CL/cl_ext.h> 154af69d88dSmrg#endif 155af69d88dSmrg 156af69d88dSmrg#if defined(__APPLE__) || defined(__MACOSX) 157af69d88dSmrg#include <OpenGL/OpenGL.h> 158af69d88dSmrg#include <OpenCL/opencl.h> 159af69d88dSmrg#else 160af69d88dSmrg#include <GL/gl.h> 161af69d88dSmrg#include <CL/opencl.h> 162af69d88dSmrg#endif // !__APPLE__ 163af69d88dSmrg 164af69d88dSmrg#if !defined(CL_CALLBACK) 165af69d88dSmrg#define CL_CALLBACK 166af69d88dSmrg#endif //CL_CALLBACK 167af69d88dSmrg 168af69d88dSmrg#include <utility> 169af69d88dSmrg 170af69d88dSmrg#if !defined(__NO_STD_VECTOR) 171af69d88dSmrg#include <vector> 172af69d88dSmrg#endif 173af69d88dSmrg 174af69d88dSmrg#if !defined(__NO_STD_STRING) 175af69d88dSmrg#include <string> 176af69d88dSmrg#endif 177af69d88dSmrg 178af69d88dSmrg#if defined(linux) || defined(__APPLE__) || defined(__MACOSX) 179af69d88dSmrg# include <alloca.h> 180af69d88dSmrg#endif // linux 181af69d88dSmrg 182af69d88dSmrg#include <cstring> 183af69d88dSmrg 184af69d88dSmrg/*! \namespace cl 185af69d88dSmrg * 186af69d88dSmrg * \brief The OpenCL C++ bindings are defined within this namespace. 187af69d88dSmrg * 188af69d88dSmrg */ 189af69d88dSmrgnamespace cl { 190af69d88dSmrg 191af69d88dSmrg#define __INIT_CL_EXT_FCN_PTR(name) \ 192af69d88dSmrg if(!pfn_##name) { \ 193af69d88dSmrg pfn_##name = (PFN_##name) \ 194af69d88dSmrg clGetExtensionFunctionAddress(#name); \ 195af69d88dSmrg if(!pfn_##name) { \ 196af69d88dSmrg } \ 197af69d88dSmrg } 198af69d88dSmrg 199af69d88dSmrgclass Program; 200af69d88dSmrgclass Device; 201af69d88dSmrgclass Context; 202af69d88dSmrgclass CommandQueue; 203af69d88dSmrgclass Memory; 204af69d88dSmrg 205af69d88dSmrg#if defined(__CL_ENABLE_EXCEPTIONS) 206af69d88dSmrg#include <exception> 207af69d88dSmrg/*! \class Error 208af69d88dSmrg * \brief Exception class 209af69d88dSmrg */ 210af69d88dSmrgclass Error : public std::exception 211af69d88dSmrg{ 212af69d88dSmrgprivate: 213af69d88dSmrg cl_int err_; 214af69d88dSmrg const char * errStr_; 215af69d88dSmrgpublic: 216af69d88dSmrg /*! Create a new CL error exception for a given error code 217af69d88dSmrg * and corresponding message. 218af69d88dSmrg */ 219af69d88dSmrg Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr) 220af69d88dSmrg {} 221af69d88dSmrg 222af69d88dSmrg ~Error() throw() {} 223af69d88dSmrg 224af69d88dSmrg /*! \brief Get error string associated with exception 225af69d88dSmrg * 226af69d88dSmrg * \return A memory pointer to the error message string. 227af69d88dSmrg */ 228af69d88dSmrg virtual const char * what() const throw () 229af69d88dSmrg { 230af69d88dSmrg if (errStr_ == NULL) { 231af69d88dSmrg return "empty"; 232af69d88dSmrg } 233af69d88dSmrg else { 234af69d88dSmrg return errStr_; 235af69d88dSmrg } 236af69d88dSmrg } 237af69d88dSmrg 238af69d88dSmrg /*! \brief Get error code associated with exception 239af69d88dSmrg * 240af69d88dSmrg * \return The error code. 241af69d88dSmrg */ 242af69d88dSmrg const cl_int err(void) const { return err_; } 243af69d88dSmrg}; 244af69d88dSmrg 245af69d88dSmrg#define __ERR_STR(x) #x 246af69d88dSmrg#else 247af69d88dSmrg#define __ERR_STR(x) NULL 248af69d88dSmrg#endif // __CL_ENABLE_EXCEPTIONS 249af69d88dSmrg 250af69d88dSmrg//! \cond DOXYGEN_DETAIL 251af69d88dSmrg#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) 252af69d88dSmrg#define __GET_DEVICE_INFO_ERR __ERR_STR(clgetDeviceInfo) 253af69d88dSmrg#define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo) 254af69d88dSmrg#define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs) 255af69d88dSmrg#define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs) 256af69d88dSmrg#define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo) 257af69d88dSmrg#define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo) 258af69d88dSmrg#define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo) 259af69d88dSmrg#define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo) 260af69d88dSmrg#define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo) 261af69d88dSmrg#define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo) 262af69d88dSmrg#define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo) 263af69d88dSmrg#define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo) 264af69d88dSmrg#define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo) 265af69d88dSmrg#define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo) 266af69d88dSmrg#define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo) 267af69d88dSmrg 268af69d88dSmrg#define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType) 269af69d88dSmrg#define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats) 270af69d88dSmrg 271af69d88dSmrg#define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer) 272af69d88dSmrg#define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer) 273af69d88dSmrg#define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer) 274af69d88dSmrg#define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo) 275af69d88dSmrg#define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D) 276af69d88dSmrg#define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D) 277af69d88dSmrg#define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler) 278af69d88dSmrg#define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback) 279af69d88dSmrg 280af69d88dSmrg#define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent) 281af69d88dSmrg#define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus) 282af69d88dSmrg#define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback) 283af69d88dSmrg#define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents) 284af69d88dSmrg 285af69d88dSmrg#define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel) 286af69d88dSmrg#define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg) 287af69d88dSmrg#define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource) 288af69d88dSmrg#define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary) 289af69d88dSmrg#define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram) 290af69d88dSmrg#define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram) 291af69d88dSmrg 292af69d88dSmrg#define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue) 293af69d88dSmrg#define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty) 294af69d88dSmrg#define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer) 295af69d88dSmrg#define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect) 296af69d88dSmrg#define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer) 297af69d88dSmrg#define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect) 298af69d88dSmrg#define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer) 299af69d88dSmrg#define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect) 300af69d88dSmrg#define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage) 301af69d88dSmrg#define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage) 302af69d88dSmrg#define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage) 303af69d88dSmrg#define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer) 304af69d88dSmrg#define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage) 305af69d88dSmrg#define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer) 306af69d88dSmrg#define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage) 307af69d88dSmrg#define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject) 308af69d88dSmrg#define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel) 309af69d88dSmrg#define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask) 310af69d88dSmrg#define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel) 311af69d88dSmrg#define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker) 312af69d88dSmrg#define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents) 313af69d88dSmrg#define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier) 314af69d88dSmrg 315af69d88dSmrg#define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects) 316af69d88dSmrg#define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects) 317af69d88dSmrg 318af69d88dSmrg#define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler) 319af69d88dSmrg 320af69d88dSmrg#define __FLUSH_ERR __ERR_STR(clFlush) 321af69d88dSmrg#define __FINISH_ERR __ERR_STR(clFinish) 322af69d88dSmrg 323af69d88dSmrg#define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT) 324af69d88dSmrg#endif // __CL_USER_OVERRIDE_ERROR_STRINGS 325af69d88dSmrg//! \endcond 326af69d88dSmrg 327af69d88dSmrg/*! \class string 328af69d88dSmrg * \brief Simple string class, that provides a limited subset of std::string 329af69d88dSmrg * functionality but avoids many of the issues that come with that class. 330af69d88dSmrg */ 331af69d88dSmrgclass string 332af69d88dSmrg{ 333af69d88dSmrgprivate: 334af69d88dSmrg ::size_t size_; 335af69d88dSmrg char * str_; 336af69d88dSmrgpublic: 337af69d88dSmrg string(void) : size_(0), str_(NULL) 338af69d88dSmrg { 339af69d88dSmrg } 340af69d88dSmrg 341af69d88dSmrg string(char * str, ::size_t size) : 342af69d88dSmrg size_(size), 343af69d88dSmrg str_(NULL) 344af69d88dSmrg { 345af69d88dSmrg str_ = new char[size_+1]; 346af69d88dSmrg if (str_ != NULL) { 347af69d88dSmrg memcpy(str_, str, size_ * sizeof(char)); 348af69d88dSmrg str_[size_] = '\0'; 349af69d88dSmrg } 350af69d88dSmrg else { 351af69d88dSmrg size_ = 0; 352af69d88dSmrg } 353af69d88dSmrg } 354af69d88dSmrg 355af69d88dSmrg string(char * str) : 356af69d88dSmrg str_(NULL) 357af69d88dSmrg { 358af69d88dSmrg size_= ::strlen(str); 359af69d88dSmrg str_ = new char[size_ + 1]; 360af69d88dSmrg if (str_ != NULL) { 361af69d88dSmrg memcpy(str_, str, (size_ + 1) * sizeof(char)); 362af69d88dSmrg } 363af69d88dSmrg else { 364af69d88dSmrg size_ = 0; 365af69d88dSmrg } 366af69d88dSmrg } 367af69d88dSmrg 368af69d88dSmrg string& operator=(const string& rhs) 369af69d88dSmrg { 370af69d88dSmrg if (this == &rhs) { 371af69d88dSmrg return *this; 372af69d88dSmrg } 373af69d88dSmrg 374af69d88dSmrg if (rhs.size_ == 0 || rhs.str_ == NULL) { 375af69d88dSmrg size_ = 0; 376af69d88dSmrg str_ = NULL; 377af69d88dSmrg } 378af69d88dSmrg else { 379af69d88dSmrg size_ = rhs.size_; 380af69d88dSmrg str_ = new char[size_ + 1]; 381af69d88dSmrg if (str_ != NULL) { 382af69d88dSmrg memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char)); 383af69d88dSmrg } 384af69d88dSmrg else { 385af69d88dSmrg size_ = 0; 386af69d88dSmrg } 387af69d88dSmrg } 388af69d88dSmrg 389af69d88dSmrg return *this; 390af69d88dSmrg } 391af69d88dSmrg 392af69d88dSmrg string(const string& rhs) 393af69d88dSmrg { 394af69d88dSmrg *this = rhs; 395af69d88dSmrg } 396af69d88dSmrg 397af69d88dSmrg ~string() 398af69d88dSmrg { 399af69d88dSmrg if (str_ != NULL) { 400af69d88dSmrg delete[] str_; 401af69d88dSmrg } 402af69d88dSmrg } 403af69d88dSmrg 404af69d88dSmrg ::size_t size(void) const { return size_; } 405af69d88dSmrg ::size_t length(void) const { return size(); } 406af69d88dSmrg 407af69d88dSmrg const char * c_str(void) const { return (str_) ? str_ : "";} 408af69d88dSmrg}; 409af69d88dSmrg 410af69d88dSmrg#if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING) 411af69d88dSmrg#include <string> 412af69d88dSmrgtypedef std::string STRING_CLASS; 413af69d88dSmrg#elif !defined(__USE_DEV_STRING) 414af69d88dSmrgtypedef cl::string STRING_CLASS; 415af69d88dSmrg#endif 416af69d88dSmrg 417af69d88dSmrg#if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) 418af69d88dSmrg#include <vector> 419af69d88dSmrg#define VECTOR_CLASS std::vector 420af69d88dSmrg#elif !defined(__USE_DEV_VECTOR) 421af69d88dSmrg#define VECTOR_CLASS cl::vector 422af69d88dSmrg#endif 423af69d88dSmrg 424af69d88dSmrg#if !defined(__MAX_DEFAULT_VECTOR_SIZE) 425af69d88dSmrg#define __MAX_DEFAULT_VECTOR_SIZE 10 426af69d88dSmrg#endif 427af69d88dSmrg 428af69d88dSmrg/*! \class vector 429af69d88dSmrg * \brief Fixed sized vector implementation that mirroring 430af69d88dSmrg * std::vector functionality. 431af69d88dSmrg */ 432af69d88dSmrgtemplate <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE> 433af69d88dSmrgclass vector 434af69d88dSmrg{ 435af69d88dSmrgprivate: 436af69d88dSmrg T data_[N]; 437af69d88dSmrg unsigned int size_; 438af69d88dSmrg bool empty_; 439af69d88dSmrgpublic: 440af69d88dSmrg vector() : 441af69d88dSmrg size_(-1), 442af69d88dSmrg empty_(true) 443af69d88dSmrg {} 444af69d88dSmrg 445af69d88dSmrg ~vector() {} 446af69d88dSmrg 447af69d88dSmrg unsigned int size(void) const 448af69d88dSmrg { 449af69d88dSmrg return size_ + 1; 450af69d88dSmrg } 451af69d88dSmrg 452af69d88dSmrg void clear() 453af69d88dSmrg { 454af69d88dSmrg size_ = -1; 455af69d88dSmrg empty_ = true; 456af69d88dSmrg } 457af69d88dSmrg 458af69d88dSmrg void push_back (const T& x) 459af69d88dSmrg { 460af69d88dSmrg if (size() < N) { 461af69d88dSmrg size_++; 462af69d88dSmrg data_[size_] = x; 463af69d88dSmrg empty_ = false; 464af69d88dSmrg } 465af69d88dSmrg } 466af69d88dSmrg 467af69d88dSmrg void pop_back(void) 468af69d88dSmrg { 469af69d88dSmrg if (!empty_) { 470af69d88dSmrg data_[size_].~T(); 471af69d88dSmrg size_--; 472af69d88dSmrg if (size_ == -1) { 473af69d88dSmrg empty_ = true; 474af69d88dSmrg } 475af69d88dSmrg } 476af69d88dSmrg } 477af69d88dSmrg 478af69d88dSmrg vector(const vector<T, N>& vec) : 479af69d88dSmrg size_(vec.size_), 480af69d88dSmrg empty_(vec.empty_) 481af69d88dSmrg { 482af69d88dSmrg if (!empty_) { 483af69d88dSmrg memcpy(&data_[0], &vec.data_[0], size() * sizeof(T)); 484af69d88dSmrg } 485af69d88dSmrg } 486af69d88dSmrg 487af69d88dSmrg vector(unsigned int size, const T& val = T()) : 488af69d88dSmrg size_(-1), 489af69d88dSmrg empty_(true) 490af69d88dSmrg { 491af69d88dSmrg for (unsigned int i = 0; i < size; i++) { 492af69d88dSmrg push_back(val); 493af69d88dSmrg } 494af69d88dSmrg } 495af69d88dSmrg 496af69d88dSmrg vector<T, N>& operator=(const vector<T, N>& rhs) 497af69d88dSmrg { 498af69d88dSmrg if (this == &rhs) { 499af69d88dSmrg return *this; 500af69d88dSmrg } 501af69d88dSmrg 502af69d88dSmrg size_ = rhs.size_; 503af69d88dSmrg empty_ = rhs.empty_; 504af69d88dSmrg 505af69d88dSmrg if (!empty_) { 506af69d88dSmrg memcpy(&data_[0], &rhs.data_[0], size() * sizeof(T)); 507af69d88dSmrg } 508af69d88dSmrg 509af69d88dSmrg return *this; 510af69d88dSmrg } 511af69d88dSmrg 512af69d88dSmrg bool operator==(vector<T,N> &vec) 513af69d88dSmrg { 514af69d88dSmrg if (empty_ && vec.empty_) { 515af69d88dSmrg return true; 516af69d88dSmrg } 517af69d88dSmrg 518af69d88dSmrg if (size() != vec.size()) { 519af69d88dSmrg return false; 520af69d88dSmrg } 521af69d88dSmrg 522af69d88dSmrg return memcmp(&data_[0], &vec.data_[0], size() * sizeof(T)) == 0 ? true : false; 523af69d88dSmrg } 524af69d88dSmrg 525af69d88dSmrg operator T* () { return data_; } 526af69d88dSmrg operator const T* () const { return data_; } 527af69d88dSmrg 528af69d88dSmrg bool empty (void) const 529af69d88dSmrg { 530af69d88dSmrg return empty_; 531af69d88dSmrg } 532af69d88dSmrg 533af69d88dSmrg unsigned int max_size (void) const 534af69d88dSmrg { 535af69d88dSmrg return N; 536af69d88dSmrg } 537af69d88dSmrg 538af69d88dSmrg unsigned int capacity () const 539af69d88dSmrg { 540af69d88dSmrg return sizeof(T) * N; 541af69d88dSmrg } 542af69d88dSmrg 543af69d88dSmrg T& operator[](int index) 544af69d88dSmrg { 545af69d88dSmrg return data_[index]; 546af69d88dSmrg } 547af69d88dSmrg 548af69d88dSmrg T operator[](int index) const 549af69d88dSmrg { 550af69d88dSmrg return data_[index]; 551af69d88dSmrg } 552af69d88dSmrg 553af69d88dSmrg template<class I> 554af69d88dSmrg void assign(I start, I end) 555af69d88dSmrg { 556af69d88dSmrg clear(); 557af69d88dSmrg while(start < end) { 558af69d88dSmrg push_back(*start); 559af69d88dSmrg start++; 560af69d88dSmrg } 561af69d88dSmrg } 562af69d88dSmrg 563af69d88dSmrg /*! \class iterator 564af69d88dSmrg * \brief Iterator class for vectors 565af69d88dSmrg */ 566af69d88dSmrg class iterator 567af69d88dSmrg { 568af69d88dSmrg private: 569af69d88dSmrg vector<T,N> vec_; 570af69d88dSmrg int index_; 571af69d88dSmrg bool initialized_; 572af69d88dSmrg public: 573af69d88dSmrg iterator(void) : 574af69d88dSmrg index_(-1), 575af69d88dSmrg initialized_(false) 576af69d88dSmrg { 577af69d88dSmrg index_ = -1; 578af69d88dSmrg initialized_ = false; 579af69d88dSmrg } 580af69d88dSmrg 581af69d88dSmrg ~iterator(void) {} 582af69d88dSmrg 583af69d88dSmrg static iterator begin(vector<T,N> &vec) 584af69d88dSmrg { 585af69d88dSmrg iterator i; 586af69d88dSmrg 587af69d88dSmrg if (!vec.empty()) { 588af69d88dSmrg i.index_ = 0; 589af69d88dSmrg } 590af69d88dSmrg 591af69d88dSmrg i.vec_ = vec; 592af69d88dSmrg i.initialized_ = true; 593af69d88dSmrg return i; 594af69d88dSmrg } 595af69d88dSmrg 596af69d88dSmrg static iterator end(vector<T,N> &vec) 597af69d88dSmrg { 598af69d88dSmrg iterator i; 599af69d88dSmrg 600af69d88dSmrg if (!vec.empty()) { 601af69d88dSmrg i.index_ = vec.size(); 602af69d88dSmrg } 603af69d88dSmrg i.vec_ = vec; 604af69d88dSmrg i.initialized_ = true; 605af69d88dSmrg return i; 606af69d88dSmrg } 607af69d88dSmrg 608af69d88dSmrg bool operator==(iterator i) 609af69d88dSmrg { 610af69d88dSmrg return ((vec_ == i.vec_) && 611af69d88dSmrg (index_ == i.index_) && 612af69d88dSmrg (initialized_ == i.initialized_)); 613af69d88dSmrg } 614af69d88dSmrg 615af69d88dSmrg bool operator!=(iterator i) 616af69d88dSmrg { 617af69d88dSmrg return (!(*this==i)); 618af69d88dSmrg } 619af69d88dSmrg 620af69d88dSmrg void operator++() 621af69d88dSmrg { 622af69d88dSmrg index_++; 623af69d88dSmrg } 624af69d88dSmrg 625af69d88dSmrg void operator++(int x) 626af69d88dSmrg { 627af69d88dSmrg index_ += x; 628af69d88dSmrg } 629af69d88dSmrg 630af69d88dSmrg void operator--() 631af69d88dSmrg { 632af69d88dSmrg index_--; 633af69d88dSmrg } 634af69d88dSmrg 635af69d88dSmrg void operator--(int x) 636af69d88dSmrg { 637af69d88dSmrg index_ -= x; 638af69d88dSmrg } 639af69d88dSmrg 640af69d88dSmrg T operator *() 641af69d88dSmrg { 642af69d88dSmrg return vec_[index_]; 643af69d88dSmrg } 644af69d88dSmrg }; 645af69d88dSmrg 646af69d88dSmrg iterator begin(void) 647af69d88dSmrg { 648af69d88dSmrg return iterator::begin(*this); 649af69d88dSmrg } 650af69d88dSmrg 651af69d88dSmrg iterator end(void) 652af69d88dSmrg { 653af69d88dSmrg return iterator::end(*this); 654af69d88dSmrg } 655af69d88dSmrg 656af69d88dSmrg T& front(void) 657af69d88dSmrg { 658af69d88dSmrg return data_[0]; 659af69d88dSmrg } 660af69d88dSmrg 661af69d88dSmrg T& back(void) 662af69d88dSmrg { 663af69d88dSmrg return data_[size_]; 664af69d88dSmrg } 665af69d88dSmrg 666af69d88dSmrg const T& front(void) const 667af69d88dSmrg { 668af69d88dSmrg return data_[0]; 669af69d88dSmrg } 670af69d88dSmrg 671af69d88dSmrg const T& back(void) const 672af69d88dSmrg { 673af69d88dSmrg return data_[size_]; 674af69d88dSmrg } 675af69d88dSmrg}; 676af69d88dSmrg 677af69d88dSmrg/*! 678af69d88dSmrg * \brief size_t class used to interface between C++ and 679af69d88dSmrg * OpenCL C calls that require arrays of size_t values, who's 680af69d88dSmrg * size is known statically. 681af69d88dSmrg */ 682af69d88dSmrgtemplate <int N> 683af69d88dSmrgstruct size_t : public cl::vector< ::size_t, N> { }; 684af69d88dSmrg 685af69d88dSmrgnamespace detail { 686af69d88dSmrg 687af69d88dSmrg// GetInfo help struct 688af69d88dSmrgtemplate <typename Functor, typename T> 689af69d88dSmrgstruct GetInfoHelper 690af69d88dSmrg{ 691af69d88dSmrg static cl_int 692af69d88dSmrg get(Functor f, cl_uint name, T* param) 693af69d88dSmrg { 694af69d88dSmrg return f(name, sizeof(T), param, NULL); 695af69d88dSmrg } 696af69d88dSmrg}; 697af69d88dSmrg 698af69d88dSmrg// Specialized GetInfoHelper for VECTOR_CLASS params 699af69d88dSmrgtemplate <typename Func, typename T> 700af69d88dSmrgstruct GetInfoHelper<Func, VECTOR_CLASS<T> > 701af69d88dSmrg{ 702af69d88dSmrg static cl_int get(Func f, cl_uint name, VECTOR_CLASS<T>* param) 703af69d88dSmrg { 704af69d88dSmrg ::size_t required; 705af69d88dSmrg cl_int err = f(name, 0, NULL, &required); 706af69d88dSmrg if (err != CL_SUCCESS) { 707af69d88dSmrg return err; 708af69d88dSmrg } 709af69d88dSmrg 710af69d88dSmrg T* value = (T*) alloca(required); 711af69d88dSmrg err = f(name, required, value, NULL); 712af69d88dSmrg if (err != CL_SUCCESS) { 713af69d88dSmrg return err; 714af69d88dSmrg } 715af69d88dSmrg 716af69d88dSmrg param->assign(&value[0], &value[required/sizeof(T)]); 717af69d88dSmrg return CL_SUCCESS; 718af69d88dSmrg } 719af69d88dSmrg}; 720af69d88dSmrg 721af69d88dSmrg// Specialized for getInfo<CL_PROGRAM_BINARIES> 722af69d88dSmrgtemplate <typename Func> 723af69d88dSmrgstruct GetInfoHelper<Func, VECTOR_CLASS<char *> > 724af69d88dSmrg{ 725af69d88dSmrg static cl_int 726af69d88dSmrg get(Func f, cl_uint name, VECTOR_CLASS<char *>* param) 727af69d88dSmrg { 728af69d88dSmrg cl_uint err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL); 729af69d88dSmrg if (err != CL_SUCCESS) { 730af69d88dSmrg return err; 731af69d88dSmrg } 732af69d88dSmrg 733af69d88dSmrg return CL_SUCCESS; 734af69d88dSmrg } 735af69d88dSmrg}; 736af69d88dSmrg 737af69d88dSmrg// Specialized GetInfoHelper for STRING_CLASS params 738af69d88dSmrgtemplate <typename Func> 739af69d88dSmrgstruct GetInfoHelper<Func, STRING_CLASS> 740af69d88dSmrg{ 741af69d88dSmrg static cl_int get(Func f, cl_uint name, STRING_CLASS* param) 742af69d88dSmrg { 743af69d88dSmrg ::size_t required; 744af69d88dSmrg cl_int err = f(name, 0, NULL, &required); 745af69d88dSmrg if (err != CL_SUCCESS) { 746af69d88dSmrg return err; 747af69d88dSmrg } 748af69d88dSmrg 749af69d88dSmrg char* value = (char*) alloca(required); 750af69d88dSmrg err = f(name, required, value, NULL); 751af69d88dSmrg if (err != CL_SUCCESS) { 752af69d88dSmrg return err; 753af69d88dSmrg } 754af69d88dSmrg 755af69d88dSmrg *param = value; 756af69d88dSmrg return CL_SUCCESS; 757af69d88dSmrg } 758af69d88dSmrg}; 759af69d88dSmrg 760af69d88dSmrg#define __GET_INFO_HELPER_WITH_RETAIN(CPP_TYPE) \ 761af69d88dSmrgnamespace detail { \ 762af69d88dSmrgtemplate <typename Func> \ 763af69d88dSmrgstruct GetInfoHelper<Func, CPP_TYPE> \ 764af69d88dSmrg{ \ 765af69d88dSmrg static cl_int get(Func f, cl_uint name, CPP_TYPE* param) \ 766af69d88dSmrg { \ 767af69d88dSmrg cl_uint err = f(name, sizeof(CPP_TYPE), param, NULL); \ 768af69d88dSmrg if (err != CL_SUCCESS) { \ 769af69d88dSmrg return err; \ 770af69d88dSmrg } \ 771af69d88dSmrg \ 772af69d88dSmrg return ReferenceHandler<CPP_TYPE::cl_type>::retain((*param)()); \ 773af69d88dSmrg } \ 774af69d88dSmrg}; \ 775af69d88dSmrg} 776af69d88dSmrg 777af69d88dSmrg 778af69d88dSmrg#define __PARAM_NAME_INFO_1_0(F) \ 779af69d88dSmrg F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \ 780af69d88dSmrg F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \ 781af69d88dSmrg F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \ 782af69d88dSmrg F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \ 783af69d88dSmrg F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \ 784af69d88dSmrg \ 785af69d88dSmrg F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \ 786af69d88dSmrg F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \ 787af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \ 788af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \ 789af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \ 790af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \ 791af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \ 792af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \ 793af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \ 794af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \ 795af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \ 796af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \ 797af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \ 798af69d88dSmrg F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_bitfield) \ 799af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \ 800af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \ 801af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \ 802af69d88dSmrg F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \ 803af69d88dSmrg F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \ 804af69d88dSmrg F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \ 805af69d88dSmrg F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \ 806af69d88dSmrg F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \ 807af69d88dSmrg F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_uint) \ 808af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \ 809af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \ 810af69d88dSmrg F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \ 811af69d88dSmrg F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \ 812af69d88dSmrg F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \ 813af69d88dSmrg F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \ 814af69d88dSmrg F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\ 815af69d88dSmrg F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \ 816af69d88dSmrg F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \ 817af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \ 818af69d88dSmrg F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \ 819af69d88dSmrg F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \ 820af69d88dSmrg F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \ 821af69d88dSmrg F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \ 822af69d88dSmrg F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \ 823af69d88dSmrg F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \ 824af69d88dSmrg F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \ 825af69d88dSmrg F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \ 826af69d88dSmrg F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \ 827af69d88dSmrg F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \ 828af69d88dSmrg F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \ 829af69d88dSmrg F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \ 830af69d88dSmrg F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \ 831af69d88dSmrg F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \ 832af69d88dSmrg F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \ 833af69d88dSmrg F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \ 834af69d88dSmrg F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \ 835af69d88dSmrg \ 836af69d88dSmrg F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \ 837af69d88dSmrg F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS<Device>) \ 838af69d88dSmrg F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS<cl_context_properties>) \ 839af69d88dSmrg \ 840af69d88dSmrg F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \ 841af69d88dSmrg F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \ 842af69d88dSmrg F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \ 843af69d88dSmrg F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_uint) \ 844af69d88dSmrg \ 845af69d88dSmrg F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \ 846af69d88dSmrg F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \ 847af69d88dSmrg F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \ 848af69d88dSmrg F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \ 849af69d88dSmrg \ 850af69d88dSmrg F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \ 851af69d88dSmrg F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \ 852af69d88dSmrg F(cl_mem_info, CL_MEM_SIZE, ::size_t) \ 853af69d88dSmrg F(cl_mem_info, CL_MEM_HOST_PTR, void*) \ 854af69d88dSmrg F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \ 855af69d88dSmrg F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \ 856af69d88dSmrg F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \ 857af69d88dSmrg \ 858af69d88dSmrg F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \ 859af69d88dSmrg F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \ 860af69d88dSmrg F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \ 861af69d88dSmrg F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \ 862af69d88dSmrg F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \ 863af69d88dSmrg F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \ 864af69d88dSmrg F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \ 865af69d88dSmrg \ 866af69d88dSmrg F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \ 867af69d88dSmrg F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \ 868af69d88dSmrg F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \ 869af69d88dSmrg F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \ 870af69d88dSmrg F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \ 871af69d88dSmrg \ 872af69d88dSmrg F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \ 873af69d88dSmrg F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \ 874af69d88dSmrg F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \ 875af69d88dSmrg F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS<cl_device_id>) \ 876af69d88dSmrg F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \ 877af69d88dSmrg F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \ 878af69d88dSmrg F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS<char *>) \ 879af69d88dSmrg \ 880af69d88dSmrg F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \ 881af69d88dSmrg F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \ 882af69d88dSmrg F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \ 883af69d88dSmrg \ 884af69d88dSmrg F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \ 885af69d88dSmrg F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \ 886af69d88dSmrg F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \ 887af69d88dSmrg F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \ 888af69d88dSmrg F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \ 889af69d88dSmrg \ 890af69d88dSmrg F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \ 891af69d88dSmrg F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \ 892af69d88dSmrg F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \ 893af69d88dSmrg \ 894af69d88dSmrg F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \ 895af69d88dSmrg F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \ 896af69d88dSmrg F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \ 897af69d88dSmrg F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties) 898af69d88dSmrg 899af69d88dSmrg#if defined(CL_VERSION_1_1) 900af69d88dSmrg#define __PARAM_NAME_INFO_1_1(F) \ 901af69d88dSmrg F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\ 902af69d88dSmrg F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \ 903af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \ 904af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \ 905af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \ 906af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \ 907af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \ 908af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \ 909af69d88dSmrg F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \ 910af69d88dSmrg F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \ 911af69d88dSmrg F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \ 912af69d88dSmrg F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \ 913af69d88dSmrg \ 914af69d88dSmrg F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \ 915af69d88dSmrg F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \ 916af69d88dSmrg \ 917af69d88dSmrg F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \ 918af69d88dSmrg F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \ 919af69d88dSmrg \ 920af69d88dSmrg F(cl_event_info, CL_EVENT_CONTEXT, cl::Context) 921af69d88dSmrg#endif // CL_VERSION_1_1 922af69d88dSmrg 923af69d88dSmrg#if defined(USE_CL_DEVICE_FISSION) 924af69d88dSmrg#define __PARAM_NAME_DEVICE_FISSION(F) \ 925af69d88dSmrg F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \ 926af69d88dSmrg F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \ 927af69d88dSmrg F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \ 928af69d88dSmrg F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \ 929af69d88dSmrg F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) 930af69d88dSmrg#endif // USE_CL_DEVICE_FISSION 931af69d88dSmrg 932af69d88dSmrgtemplate <typename enum_type, cl_int Name> 933af69d88dSmrgstruct param_traits {}; 934af69d88dSmrg 935af69d88dSmrg#define __DECLARE_PARAM_TRAITS(token, param_name, T) \ 936af69d88dSmrgstruct token; \ 937af69d88dSmrgtemplate<> \ 938af69d88dSmrgstruct param_traits<detail:: token,param_name> \ 939af69d88dSmrg{ \ 940af69d88dSmrg enum { value = param_name }; \ 941af69d88dSmrg typedef T param_type; \ 942af69d88dSmrg}; 943af69d88dSmrg 944af69d88dSmrg__PARAM_NAME_INFO_1_0(__DECLARE_PARAM_TRAITS); 945af69d88dSmrg#if defined(CL_VERSION_1_1) 946af69d88dSmrg__PARAM_NAME_INFO_1_1(__DECLARE_PARAM_TRAITS); 947af69d88dSmrg#endif // CL_VERSION_1_1 948af69d88dSmrg 949af69d88dSmrg#if defined(USE_CL_DEVICE_FISSION) 950af69d88dSmrg__PARAM_NAME_DEVICE_FISSION(__DECLARE_PARAM_TRAITS); 951af69d88dSmrg#endif // USE_CL_DEVICE_FISSION 952af69d88dSmrg 953af69d88dSmrg#undef __DECLARE_PARAM_TRAITS 954af69d88dSmrg 955af69d88dSmrg// Convenience functions 956af69d88dSmrg 957af69d88dSmrgtemplate <typename Func, typename T> 958af69d88dSmrginline cl_int 959af69d88dSmrggetInfo(Func f, cl_uint name, T* param) 960af69d88dSmrg{ 961af69d88dSmrg return GetInfoHelper<Func, T>::get(f, name, param); 962af69d88dSmrg} 963af69d88dSmrg 964af69d88dSmrgtemplate <typename Func, typename Arg0> 965af69d88dSmrgstruct GetInfoFunctor0 966af69d88dSmrg{ 967af69d88dSmrg Func f_; const Arg0& arg0_; 968af69d88dSmrg cl_int operator ()( 969af69d88dSmrg cl_uint param, ::size_t size, void* value, ::size_t* size_ret) 970af69d88dSmrg { return f_(arg0_, param, size, value, size_ret); } 971af69d88dSmrg}; 972af69d88dSmrg 973af69d88dSmrgtemplate <typename Func, typename Arg0, typename Arg1> 974af69d88dSmrgstruct GetInfoFunctor1 975af69d88dSmrg{ 976af69d88dSmrg Func f_; const Arg0& arg0_; const Arg1& arg1_; 977af69d88dSmrg cl_int operator ()( 978af69d88dSmrg cl_uint param, ::size_t size, void* value, ::size_t* size_ret) 979af69d88dSmrg { return f_(arg0_, arg1_, param, size, value, size_ret); } 980af69d88dSmrg}; 981af69d88dSmrg 982af69d88dSmrgtemplate <typename Func, typename Arg0, typename T> 983af69d88dSmrginline cl_int 984af69d88dSmrggetInfo(Func f, const Arg0& arg0, cl_uint name, T* param) 985af69d88dSmrg{ 986af69d88dSmrg GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 }; 987af69d88dSmrg return GetInfoHelper<GetInfoFunctor0<Func, Arg0>, T> 988af69d88dSmrg ::get(f0, name, param); 989af69d88dSmrg} 990af69d88dSmrg 991af69d88dSmrgtemplate <typename Func, typename Arg0, typename Arg1, typename T> 992af69d88dSmrginline cl_int 993af69d88dSmrggetInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param) 994af69d88dSmrg{ 995af69d88dSmrg GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 }; 996af69d88dSmrg return GetInfoHelper<GetInfoFunctor1<Func, Arg0, Arg1>, T> 997af69d88dSmrg ::get(f0, name, param); 998af69d88dSmrg} 999af69d88dSmrg 1000af69d88dSmrgtemplate<typename T> 1001af69d88dSmrgstruct ReferenceHandler 1002af69d88dSmrg{ }; 1003af69d88dSmrg 1004af69d88dSmrgtemplate <> 1005af69d88dSmrgstruct ReferenceHandler<cl_device_id> 1006af69d88dSmrg{ 1007af69d88dSmrg // cl_device_id does not have retain(). 1008af69d88dSmrg static cl_int retain(cl_device_id) 1009af69d88dSmrg { return CL_INVALID_DEVICE; } 1010af69d88dSmrg // cl_device_id does not have release(). 1011af69d88dSmrg static cl_int release(cl_device_id) 1012af69d88dSmrg { return CL_INVALID_DEVICE; } 1013af69d88dSmrg}; 1014af69d88dSmrg 1015af69d88dSmrgtemplate <> 1016af69d88dSmrgstruct ReferenceHandler<cl_platform_id> 1017af69d88dSmrg{ 1018af69d88dSmrg // cl_platform_id does not have retain(). 1019af69d88dSmrg static cl_int retain(cl_platform_id) 1020af69d88dSmrg { return CL_INVALID_PLATFORM; } 1021af69d88dSmrg // cl_platform_id does not have release(). 1022af69d88dSmrg static cl_int release(cl_platform_id) 1023af69d88dSmrg { return CL_INVALID_PLATFORM; } 1024af69d88dSmrg}; 1025af69d88dSmrg 1026af69d88dSmrgtemplate <> 1027af69d88dSmrgstruct ReferenceHandler<cl_context> 1028af69d88dSmrg{ 1029af69d88dSmrg static cl_int retain(cl_context context) 1030af69d88dSmrg { return ::clRetainContext(context); } 1031af69d88dSmrg static cl_int release(cl_context context) 1032af69d88dSmrg { return ::clReleaseContext(context); } 1033af69d88dSmrg}; 1034af69d88dSmrg 1035af69d88dSmrgtemplate <> 1036af69d88dSmrgstruct ReferenceHandler<cl_command_queue> 1037af69d88dSmrg{ 1038af69d88dSmrg static cl_int retain(cl_command_queue queue) 1039af69d88dSmrg { return ::clRetainCommandQueue(queue); } 1040af69d88dSmrg static cl_int release(cl_command_queue queue) 1041af69d88dSmrg { return ::clReleaseCommandQueue(queue); } 1042af69d88dSmrg}; 1043af69d88dSmrg 1044af69d88dSmrgtemplate <> 1045af69d88dSmrgstruct ReferenceHandler<cl_mem> 1046af69d88dSmrg{ 1047af69d88dSmrg static cl_int retain(cl_mem memory) 1048af69d88dSmrg { return ::clRetainMemObject(memory); } 1049af69d88dSmrg static cl_int release(cl_mem memory) 1050af69d88dSmrg { return ::clReleaseMemObject(memory); } 1051af69d88dSmrg}; 1052af69d88dSmrg 1053af69d88dSmrgtemplate <> 1054af69d88dSmrgstruct ReferenceHandler<cl_sampler> 1055af69d88dSmrg{ 1056af69d88dSmrg static cl_int retain(cl_sampler sampler) 1057af69d88dSmrg { return ::clRetainSampler(sampler); } 1058af69d88dSmrg static cl_int release(cl_sampler sampler) 1059af69d88dSmrg { return ::clReleaseSampler(sampler); } 1060af69d88dSmrg}; 1061af69d88dSmrg 1062af69d88dSmrgtemplate <> 1063af69d88dSmrgstruct ReferenceHandler<cl_program> 1064af69d88dSmrg{ 1065af69d88dSmrg static cl_int retain(cl_program program) 1066af69d88dSmrg { return ::clRetainProgram(program); } 1067af69d88dSmrg static cl_int release(cl_program program) 1068af69d88dSmrg { return ::clReleaseProgram(program); } 1069af69d88dSmrg}; 1070af69d88dSmrg 1071af69d88dSmrgtemplate <> 1072af69d88dSmrgstruct ReferenceHandler<cl_kernel> 1073af69d88dSmrg{ 1074af69d88dSmrg static cl_int retain(cl_kernel kernel) 1075af69d88dSmrg { return ::clRetainKernel(kernel); } 1076af69d88dSmrg static cl_int release(cl_kernel kernel) 1077af69d88dSmrg { return ::clReleaseKernel(kernel); } 1078af69d88dSmrg}; 1079af69d88dSmrg 1080af69d88dSmrgtemplate <> 1081af69d88dSmrgstruct ReferenceHandler<cl_event> 1082af69d88dSmrg{ 1083af69d88dSmrg static cl_int retain(cl_event event) 1084af69d88dSmrg { return ::clRetainEvent(event); } 1085af69d88dSmrg static cl_int release(cl_event event) 1086af69d88dSmrg { return ::clReleaseEvent(event); } 1087af69d88dSmrg}; 1088af69d88dSmrg 1089af69d88dSmrgtemplate <typename T> 1090af69d88dSmrgclass Wrapper 1091af69d88dSmrg{ 1092af69d88dSmrgpublic: 1093af69d88dSmrg typedef T cl_type; 1094af69d88dSmrg 1095af69d88dSmrgprotected: 1096af69d88dSmrg cl_type object_; 1097af69d88dSmrg 1098af69d88dSmrgpublic: 1099af69d88dSmrg Wrapper() : object_(NULL) { } 1100af69d88dSmrg 1101af69d88dSmrg ~Wrapper() 1102af69d88dSmrg { 1103af69d88dSmrg if (object_ != NULL) { release(); } 1104af69d88dSmrg } 1105af69d88dSmrg 1106af69d88dSmrg Wrapper(const Wrapper<cl_type>& rhs) 1107af69d88dSmrg { 1108af69d88dSmrg object_ = rhs.object_; 1109af69d88dSmrg if (object_ != NULL) { retain(); } 1110af69d88dSmrg } 1111af69d88dSmrg 1112af69d88dSmrg Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs) 1113af69d88dSmrg { 1114af69d88dSmrg if (object_ != NULL) { release(); } 1115af69d88dSmrg object_ = rhs.object_; 1116af69d88dSmrg if (object_ != NULL) { retain(); } 1117af69d88dSmrg return *this; 1118af69d88dSmrg } 1119af69d88dSmrg 1120af69d88dSmrg cl_type operator ()() const { return object_; } 1121af69d88dSmrg 1122af69d88dSmrg cl_type& operator ()() { return object_; } 1123af69d88dSmrg 1124af69d88dSmrgprotected: 1125af69d88dSmrg 1126af69d88dSmrg cl_int retain() const 1127af69d88dSmrg { 1128af69d88dSmrg return ReferenceHandler<cl_type>::retain(object_); 1129af69d88dSmrg } 1130af69d88dSmrg 1131af69d88dSmrg cl_int release() const 1132af69d88dSmrg { 1133af69d88dSmrg return ReferenceHandler<cl_type>::release(object_); 1134af69d88dSmrg } 1135af69d88dSmrg}; 1136af69d88dSmrg 1137af69d88dSmrg#if defined(__CL_ENABLE_EXCEPTIONS) 1138af69d88dSmrgstatic inline cl_int errHandler ( 1139af69d88dSmrg cl_int err, 1140af69d88dSmrg const char * errStr = NULL) throw(Error) 1141af69d88dSmrg{ 1142af69d88dSmrg if (err != CL_SUCCESS) { 1143af69d88dSmrg throw Error(err, errStr); 1144af69d88dSmrg } 1145af69d88dSmrg return err; 1146af69d88dSmrg} 1147af69d88dSmrg#else 1148af69d88dSmrgstatic inline cl_int errHandler (cl_int err, const char * errStr = NULL) 1149af69d88dSmrg{ 1150af69d88dSmrg return err; 1151af69d88dSmrg} 1152af69d88dSmrg#endif // __CL_ENABLE_EXCEPTIONS 1153af69d88dSmrg 1154af69d88dSmrg} // namespace detail 1155af69d88dSmrg//! \endcond 1156af69d88dSmrg 1157af69d88dSmrg/*! \stuct ImageFormat 1158af69d88dSmrg * \brief ImageFormat interface fro cl_image_format. 1159af69d88dSmrg */ 1160af69d88dSmrgstruct ImageFormat : public cl_image_format 1161af69d88dSmrg{ 1162af69d88dSmrg ImageFormat(){} 1163af69d88dSmrg 1164af69d88dSmrg ImageFormat(cl_channel_order order, cl_channel_type type) 1165af69d88dSmrg { 1166af69d88dSmrg image_channel_order = order; 1167af69d88dSmrg image_channel_data_type = type; 1168af69d88dSmrg } 1169af69d88dSmrg 1170af69d88dSmrg ImageFormat& operator = (const ImageFormat& rhs) 1171af69d88dSmrg { 1172af69d88dSmrg if (this != &rhs) { 1173af69d88dSmrg this->image_channel_data_type = rhs.image_channel_data_type; 1174af69d88dSmrg this->image_channel_order = rhs.image_channel_order; 1175af69d88dSmrg } 1176af69d88dSmrg return *this; 1177af69d88dSmrg } 1178af69d88dSmrg}; 1179af69d88dSmrg 1180af69d88dSmrg/*! \class Device 1181af69d88dSmrg * \brief Device interface for cl_device_id. 1182af69d88dSmrg */ 1183af69d88dSmrgclass Device : public detail::Wrapper<cl_device_id> 1184af69d88dSmrg{ 1185af69d88dSmrgpublic: 1186af69d88dSmrg Device(cl_device_id device) { object_ = device; } 1187af69d88dSmrg 1188af69d88dSmrg Device() : detail::Wrapper<cl_type>() { } 1189af69d88dSmrg 1190af69d88dSmrg Device(const Device& device) : detail::Wrapper<cl_type>(device) { } 1191af69d88dSmrg 1192af69d88dSmrg Device& operator = (const Device& rhs) 1193af69d88dSmrg { 1194af69d88dSmrg if (this != &rhs) { 1195af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 1196af69d88dSmrg } 1197af69d88dSmrg return *this; 1198af69d88dSmrg } 1199af69d88dSmrg 1200af69d88dSmrg template <typename T> 1201af69d88dSmrg cl_int getInfo(cl_device_info name, T* param) const 1202af69d88dSmrg { 1203af69d88dSmrg return detail::errHandler( 1204af69d88dSmrg detail::getInfo(&::clGetDeviceInfo, object_, name, param), 1205af69d88dSmrg __GET_DEVICE_INFO_ERR); 1206af69d88dSmrg } 1207af69d88dSmrg 1208af69d88dSmrg template <cl_int name> typename 1209af69d88dSmrg detail::param_traits<detail::cl_device_info, name>::param_type 1210af69d88dSmrg getInfo(cl_int* err = NULL) const 1211af69d88dSmrg { 1212af69d88dSmrg typename detail::param_traits< 1213af69d88dSmrg detail::cl_device_info, name>::param_type param; 1214af69d88dSmrg cl_int result = getInfo(name, ¶m); 1215af69d88dSmrg if (err != NULL) { 1216af69d88dSmrg *err = result; 1217af69d88dSmrg } 1218af69d88dSmrg return param; 1219af69d88dSmrg } 1220af69d88dSmrg 1221af69d88dSmrg#if defined(USE_CL_DEVICE_FISSION) 1222af69d88dSmrg cl_int createSubDevices( 1223af69d88dSmrg const cl_device_partition_property_ext * properties, 1224af69d88dSmrg VECTOR_CLASS<Device>* devices) 1225af69d88dSmrg { 1226af69d88dSmrg typedef CL_API_ENTRY cl_int 1227af69d88dSmrg ( CL_API_CALL * PFN_clCreateSubDevicesEXT)( 1228af69d88dSmrg cl_device_id /*in_device*/, 1229af69d88dSmrg const cl_device_partition_property_ext * /* properties */, 1230af69d88dSmrg cl_uint /*num_entries*/, 1231af69d88dSmrg cl_device_id * /*out_devices*/, 1232af69d88dSmrg cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; 1233af69d88dSmrg 1234af69d88dSmrg static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL; 1235af69d88dSmrg __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT); 1236af69d88dSmrg 1237af69d88dSmrg cl_uint n = 0; 1238af69d88dSmrg cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n); 1239af69d88dSmrg if (err != CL_SUCCESS) { 1240af69d88dSmrg return detail::errHandler(err, __CREATE_SUB_DEVICES); 1241af69d88dSmrg } 1242af69d88dSmrg 1243af69d88dSmrg cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); 1244af69d88dSmrg err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL); 1245af69d88dSmrg if (err != CL_SUCCESS) { 1246af69d88dSmrg return detail::errHandler(err, __CREATE_SUB_DEVICES); 1247af69d88dSmrg } 1248af69d88dSmrg 1249af69d88dSmrg devices->assign(&ids[0], &ids[n]); 1250af69d88dSmrg return CL_SUCCESS; 1251af69d88dSmrg } 1252af69d88dSmrg#endif 1253af69d88dSmrg}; 1254af69d88dSmrg 1255af69d88dSmrg/*! \class Platform 1256af69d88dSmrg * \brief Platform interface. 1257af69d88dSmrg */ 1258af69d88dSmrgclass Platform : public detail::Wrapper<cl_platform_id> 1259af69d88dSmrg{ 1260af69d88dSmrgpublic: 1261af69d88dSmrg static const Platform null(); 1262af69d88dSmrg 1263af69d88dSmrg Platform(cl_platform_id platform) { object_ = platform; } 1264af69d88dSmrg 1265af69d88dSmrg Platform() : detail::Wrapper<cl_type>() { } 1266af69d88dSmrg 1267af69d88dSmrg Platform(const Platform& platform) : detail::Wrapper<cl_type>(platform) { } 1268af69d88dSmrg 1269af69d88dSmrg Platform& operator = (const Platform& rhs) 1270af69d88dSmrg { 1271af69d88dSmrg if (this != &rhs) { 1272af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 1273af69d88dSmrg } 1274af69d88dSmrg return *this; 1275af69d88dSmrg } 1276af69d88dSmrg 1277af69d88dSmrg cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const 1278af69d88dSmrg { 1279af69d88dSmrg return detail::errHandler( 1280af69d88dSmrg detail::getInfo(&::clGetPlatformInfo, object_, name, param), 1281af69d88dSmrg __GET_PLATFORM_INFO_ERR); 1282af69d88dSmrg } 1283af69d88dSmrg 1284af69d88dSmrg template <cl_int name> typename 1285af69d88dSmrg detail::param_traits<detail::cl_platform_info, name>::param_type 1286af69d88dSmrg getInfo(cl_int* err = NULL) const 1287af69d88dSmrg { 1288af69d88dSmrg typename detail::param_traits< 1289af69d88dSmrg detail::cl_platform_info, name>::param_type param; 1290af69d88dSmrg cl_int result = getInfo(name, ¶m); 1291af69d88dSmrg if (err != NULL) { 1292af69d88dSmrg *err = result; 1293af69d88dSmrg } 1294af69d88dSmrg return param; 1295af69d88dSmrg } 1296af69d88dSmrg 1297af69d88dSmrg cl_int getDevices( 1298af69d88dSmrg cl_device_type type, 1299af69d88dSmrg VECTOR_CLASS<Device>* devices) const 1300af69d88dSmrg { 1301af69d88dSmrg cl_uint n = 0; 1302af69d88dSmrg cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n); 1303af69d88dSmrg if (err != CL_SUCCESS) { 1304af69d88dSmrg return detail::errHandler(err, __GET_DEVICE_IDS_ERR); 1305af69d88dSmrg } 1306af69d88dSmrg 1307af69d88dSmrg cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); 1308af69d88dSmrg err = ::clGetDeviceIDs(object_, type, n, ids, NULL); 1309af69d88dSmrg if (err != CL_SUCCESS) { 1310af69d88dSmrg return detail::errHandler(err, __GET_DEVICE_IDS_ERR); 1311af69d88dSmrg } 1312af69d88dSmrg 1313af69d88dSmrg devices->assign(&ids[0], &ids[n]); 1314af69d88dSmrg return CL_SUCCESS; 1315af69d88dSmrg } 1316af69d88dSmrg 1317af69d88dSmrg#if defined(USE_DX_INTEROP) 1318af69d88dSmrg /*! \brief Get the list of available D3D10 devices. 1319af69d88dSmrg * 1320af69d88dSmrg * \param d3d_device_source. 1321af69d88dSmrg * 1322af69d88dSmrg * \param d3d_object. 1323af69d88dSmrg * 1324af69d88dSmrg * \param d3d_device_set. 1325af69d88dSmrg * 1326af69d88dSmrg * \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device 1327af69d88dSmrg * values returned in devices can be used to identify a specific OpenCL 1328af69d88dSmrg * device. If \a devices argument is NULL, this argument is ignored. 1329af69d88dSmrg * 1330af69d88dSmrg * \return One of the following values: 1331af69d88dSmrg * - CL_SUCCESS if the function is executed successfully. 1332af69d88dSmrg * 1333af69d88dSmrg * The application can query specific capabilities of the OpenCL device(s) 1334af69d88dSmrg * returned by cl::getDevices. This can be used by the application to 1335af69d88dSmrg * determine which device(s) to use. 1336af69d88dSmrg * 1337af69d88dSmrg * \note In the case that exceptions are enabled and a return value 1338af69d88dSmrg * other than CL_SUCCESS is generated, then cl::Error exception is 1339af69d88dSmrg * generated. 1340af69d88dSmrg */ 1341af69d88dSmrg cl_int getDevices( 1342af69d88dSmrg cl_d3d10_device_source_khr d3d_device_source, 1343af69d88dSmrg void * d3d_object, 1344af69d88dSmrg cl_d3d10_device_set_khr d3d_device_set, 1345af69d88dSmrg VECTOR_CLASS<Device>* devices) const 1346af69d88dSmrg { 1347af69d88dSmrg typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)( 1348af69d88dSmrg cl_platform_id platform, 1349af69d88dSmrg cl_d3d10_device_source_khr d3d_device_source, 1350af69d88dSmrg void * d3d_object, 1351af69d88dSmrg cl_d3d10_device_set_khr d3d_device_set, 1352af69d88dSmrg cl_uint num_entries, 1353af69d88dSmrg cl_device_id * devices, 1354af69d88dSmrg cl_uint* num_devices); 1355af69d88dSmrg 1356af69d88dSmrg static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL; 1357af69d88dSmrg __INIT_CL_EXT_FCN_PTR(clGetDeviceIDsFromD3D10KHR); 1358af69d88dSmrg 1359af69d88dSmrg cl_uint n = 0; 1360af69d88dSmrg cl_int err = pfn_clGetDeviceIDsFromD3D10KHR( 1361af69d88dSmrg object_, 1362af69d88dSmrg d3d_device_source, 1363af69d88dSmrg d3d_object, 1364af69d88dSmrg d3d_device_set, 1365af69d88dSmrg 0, 1366af69d88dSmrg NULL, 1367af69d88dSmrg &n); 1368af69d88dSmrg if (err != CL_SUCCESS) { 1369af69d88dSmrg return detail::errHandler(err, __GET_DEVICE_IDS_ERR); 1370af69d88dSmrg } 1371af69d88dSmrg 1372af69d88dSmrg cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); 1373af69d88dSmrg err = pfn_clGetDeviceIDsFromD3D10KHR( 1374af69d88dSmrg object_, 1375af69d88dSmrg d3d_device_source, 1376af69d88dSmrg d3d_object, 1377af69d88dSmrg d3d_device_set, 1378af69d88dSmrg n, 1379af69d88dSmrg ids, 1380af69d88dSmrg NULL); 1381af69d88dSmrg if (err != CL_SUCCESS) { 1382af69d88dSmrg return detail::errHandler(err, __GET_DEVICE_IDS_ERR); 1383af69d88dSmrg } 1384af69d88dSmrg 1385af69d88dSmrg devices->assign(&ids[0], &ids[n]); 1386af69d88dSmrg return CL_SUCCESS; 1387af69d88dSmrg } 1388af69d88dSmrg#endif 1389af69d88dSmrg 1390af69d88dSmrg static cl_int get( 1391af69d88dSmrg VECTOR_CLASS<Platform>* platforms) 1392af69d88dSmrg { 1393af69d88dSmrg cl_uint n = 0; 1394af69d88dSmrg cl_int err = ::clGetPlatformIDs(0, NULL, &n); 1395af69d88dSmrg if (err != CL_SUCCESS) { 1396af69d88dSmrg return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); 1397af69d88dSmrg } 1398af69d88dSmrg 1399af69d88dSmrg cl_platform_id* ids = (cl_platform_id*) alloca( 1400af69d88dSmrg n * sizeof(cl_platform_id)); 1401af69d88dSmrg err = ::clGetPlatformIDs(n, ids, NULL); 1402af69d88dSmrg if (err != CL_SUCCESS) { 1403af69d88dSmrg return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); 1404af69d88dSmrg } 1405af69d88dSmrg 1406af69d88dSmrg platforms->assign(&ids[0], &ids[n]); 1407af69d88dSmrg return CL_SUCCESS; 1408af69d88dSmrg } 1409af69d88dSmrg}; 1410af69d88dSmrg 1411af69d88dSmrgstatic inline cl_int 1412af69d88dSmrgUnloadCompiler() 1413af69d88dSmrg{ 1414af69d88dSmrg return ::clUnloadCompiler(); 1415af69d88dSmrg} 1416af69d88dSmrg 1417af69d88dSmrgclass Context : public detail::Wrapper<cl_context> 1418af69d88dSmrg{ 1419af69d88dSmrgpublic: 1420af69d88dSmrg Context( 1421af69d88dSmrg const VECTOR_CLASS<Device>& devices, 1422af69d88dSmrg cl_context_properties* properties = NULL, 1423af69d88dSmrg void (CL_CALLBACK * notifyFptr)( 1424af69d88dSmrg const char *, 1425af69d88dSmrg const void *, 1426af69d88dSmrg ::size_t, 1427af69d88dSmrg void *) = NULL, 1428af69d88dSmrg void* data = NULL, 1429af69d88dSmrg cl_int* err = NULL) 1430af69d88dSmrg { 1431af69d88dSmrg cl_int error; 1432af69d88dSmrg object_ = ::clCreateContext( 1433af69d88dSmrg properties, (cl_uint) devices.size(), 1434af69d88dSmrg (cl_device_id*) &devices.front(), 1435af69d88dSmrg notifyFptr, data, &error); 1436af69d88dSmrg 1437af69d88dSmrg detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); 1438af69d88dSmrg if (err != NULL) { 1439af69d88dSmrg *err = error; 1440af69d88dSmrg } 1441af69d88dSmrg } 1442af69d88dSmrg 1443af69d88dSmrg Context( 1444af69d88dSmrg cl_device_type type, 1445af69d88dSmrg cl_context_properties* properties = NULL, 1446af69d88dSmrg void (CL_CALLBACK * notifyFptr)( 1447af69d88dSmrg const char *, 1448af69d88dSmrg const void *, 1449af69d88dSmrg ::size_t, 1450af69d88dSmrg void *) = NULL, 1451af69d88dSmrg void* data = NULL, 1452af69d88dSmrg cl_int* err = NULL) 1453af69d88dSmrg { 1454af69d88dSmrg cl_int error; 1455af69d88dSmrg object_ = ::clCreateContextFromType( 1456af69d88dSmrg properties, type, notifyFptr, data, &error); 1457af69d88dSmrg 1458af69d88dSmrg detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); 1459af69d88dSmrg if (err != NULL) { 1460af69d88dSmrg *err = error; 1461af69d88dSmrg } 1462af69d88dSmrg } 1463af69d88dSmrg 1464af69d88dSmrg Context() : detail::Wrapper<cl_type>() { } 1465af69d88dSmrg 1466af69d88dSmrg Context(const Context& context) : detail::Wrapper<cl_type>(context) { } 1467af69d88dSmrg 1468af69d88dSmrg Context& operator = (const Context& rhs) 1469af69d88dSmrg { 1470af69d88dSmrg if (this != &rhs) { 1471af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 1472af69d88dSmrg } 1473af69d88dSmrg return *this; 1474af69d88dSmrg } 1475af69d88dSmrg 1476af69d88dSmrg template <typename T> 1477af69d88dSmrg cl_int getInfo(cl_context_info name, T* param) const 1478af69d88dSmrg { 1479af69d88dSmrg return detail::errHandler( 1480af69d88dSmrg detail::getInfo(&::clGetContextInfo, object_, name, param), 1481af69d88dSmrg __GET_CONTEXT_INFO_ERR); 1482af69d88dSmrg } 1483af69d88dSmrg 1484af69d88dSmrg template <cl_int name> typename 1485af69d88dSmrg detail::param_traits<detail::cl_context_info, name>::param_type 1486af69d88dSmrg getInfo(cl_int* err = NULL) const 1487af69d88dSmrg { 1488af69d88dSmrg typename detail::param_traits< 1489af69d88dSmrg detail::cl_context_info, name>::param_type param; 1490af69d88dSmrg cl_int result = getInfo(name, ¶m); 1491af69d88dSmrg if (err != NULL) { 1492af69d88dSmrg *err = result; 1493af69d88dSmrg } 1494af69d88dSmrg return param; 1495af69d88dSmrg } 1496af69d88dSmrg 1497af69d88dSmrg cl_int getSupportedImageFormats( 1498af69d88dSmrg cl_mem_flags flags, 1499af69d88dSmrg cl_mem_object_type type, 1500af69d88dSmrg VECTOR_CLASS<ImageFormat>* formats) const 1501af69d88dSmrg { 1502af69d88dSmrg cl_uint numEntries; 1503af69d88dSmrg cl_int err = ::clGetSupportedImageFormats( 1504af69d88dSmrg object_, 1505af69d88dSmrg flags, 1506af69d88dSmrg type, 1507af69d88dSmrg 0, 1508af69d88dSmrg NULL, 1509af69d88dSmrg &numEntries); 1510af69d88dSmrg if (err != CL_SUCCESS) { 1511af69d88dSmrg return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); 1512af69d88dSmrg } 1513af69d88dSmrg 1514af69d88dSmrg ImageFormat* value = (ImageFormat*) 1515af69d88dSmrg alloca(numEntries * sizeof(ImageFormat)); 1516af69d88dSmrg err = ::clGetSupportedImageFormats( 1517af69d88dSmrg object_, 1518af69d88dSmrg flags, 1519af69d88dSmrg type, 1520af69d88dSmrg numEntries, 1521af69d88dSmrg (cl_image_format*) value, 1522af69d88dSmrg NULL); 1523af69d88dSmrg if (err != CL_SUCCESS) { 1524af69d88dSmrg return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); 1525af69d88dSmrg } 1526af69d88dSmrg 1527af69d88dSmrg formats->assign(&value[0], &value[numEntries]); 1528af69d88dSmrg return CL_SUCCESS; 1529af69d88dSmrg } 1530af69d88dSmrg}; 1531af69d88dSmrg 1532af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::Context) 1533af69d88dSmrg 1534af69d88dSmrg/*! \class Event 1535af69d88dSmrg * \brief Event interface for cl_event. 1536af69d88dSmrg */ 1537af69d88dSmrgclass Event : public detail::Wrapper<cl_event> 1538af69d88dSmrg{ 1539af69d88dSmrgpublic: 1540af69d88dSmrg Event() : detail::Wrapper<cl_type>() { } 1541af69d88dSmrg 1542af69d88dSmrg Event(const Event& event) : detail::Wrapper<cl_type>(event) { } 1543af69d88dSmrg 1544af69d88dSmrg Event& operator = (const Event& rhs) 1545af69d88dSmrg { 1546af69d88dSmrg if (this != &rhs) { 1547af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 1548af69d88dSmrg } 1549af69d88dSmrg return *this; 1550af69d88dSmrg } 1551af69d88dSmrg 1552af69d88dSmrg template <typename T> 1553af69d88dSmrg cl_int getInfo(cl_event_info name, T* param) const 1554af69d88dSmrg { 1555af69d88dSmrg return detail::errHandler( 1556af69d88dSmrg detail::getInfo(&::clGetEventInfo, object_, name, param), 1557af69d88dSmrg __GET_EVENT_INFO_ERR); 1558af69d88dSmrg } 1559af69d88dSmrg 1560af69d88dSmrg template <cl_int name> typename 1561af69d88dSmrg detail::param_traits<detail::cl_event_info, name>::param_type 1562af69d88dSmrg getInfo(cl_int* err = NULL) const 1563af69d88dSmrg { 1564af69d88dSmrg typename detail::param_traits< 1565af69d88dSmrg detail::cl_event_info, name>::param_type param; 1566af69d88dSmrg cl_int result = getInfo(name, ¶m); 1567af69d88dSmrg if (err != NULL) { 1568af69d88dSmrg *err = result; 1569af69d88dSmrg } 1570af69d88dSmrg return param; 1571af69d88dSmrg } 1572af69d88dSmrg 1573af69d88dSmrg template <typename T> 1574af69d88dSmrg cl_int getProfilingInfo(cl_profiling_info name, T* param) const 1575af69d88dSmrg { 1576af69d88dSmrg return detail::errHandler(detail::getInfo( 1577af69d88dSmrg &::clGetEventProfilingInfo, object_, name, param), 1578af69d88dSmrg __GET_EVENT_PROFILE_INFO_ERR); 1579af69d88dSmrg } 1580af69d88dSmrg 1581af69d88dSmrg template <cl_int name> typename 1582af69d88dSmrg detail::param_traits<detail::cl_profiling_info, name>::param_type 1583af69d88dSmrg getProfilingInfo(cl_int* err = NULL) const 1584af69d88dSmrg { 1585af69d88dSmrg typename detail::param_traits< 1586af69d88dSmrg detail::cl_profiling_info, name>::param_type param; 1587af69d88dSmrg cl_int result = getProfilingInfo(name, ¶m); 1588af69d88dSmrg if (err != NULL) { 1589af69d88dSmrg *err = result; 1590af69d88dSmrg } 1591af69d88dSmrg return param; 1592af69d88dSmrg } 1593af69d88dSmrg 1594af69d88dSmrg cl_int wait() const 1595af69d88dSmrg { 1596af69d88dSmrg return detail::errHandler( 1597af69d88dSmrg ::clWaitForEvents(1, &object_), 1598af69d88dSmrg __WAIT_FOR_EVENTS_ERR); 1599af69d88dSmrg } 1600af69d88dSmrg 1601af69d88dSmrg#if defined(CL_VERSION_1_1) 1602af69d88dSmrg cl_int setCallback( 1603af69d88dSmrg cl_int type, 1604af69d88dSmrg void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *), 1605af69d88dSmrg void * user_data = NULL) 1606af69d88dSmrg { 1607af69d88dSmrg return detail::errHandler( 1608af69d88dSmrg ::clSetEventCallback( 1609af69d88dSmrg object_, 1610af69d88dSmrg type, 1611af69d88dSmrg pfn_notify, 1612af69d88dSmrg user_data), 1613af69d88dSmrg __SET_EVENT_CALLBACK_ERR); 1614af69d88dSmrg } 1615af69d88dSmrg#endif 1616af69d88dSmrg 1617af69d88dSmrg static cl_int 1618af69d88dSmrg waitForEvents(const VECTOR_CLASS<Event>& events) 1619af69d88dSmrg { 1620af69d88dSmrg return detail::errHandler( 1621af69d88dSmrg ::clWaitForEvents( 1622af69d88dSmrg (cl_uint) events.size(), (cl_event*)&events.front()), 1623af69d88dSmrg __WAIT_FOR_EVENTS_ERR); 1624af69d88dSmrg } 1625af69d88dSmrg}; 1626af69d88dSmrg 1627af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::Event) 1628af69d88dSmrg 1629af69d88dSmrg#if defined(CL_VERSION_1_1) 1630af69d88dSmrg/*! \class UserEvent 1631af69d88dSmrg * \brief User event interface for cl_event. 1632af69d88dSmrg */ 1633af69d88dSmrgclass UserEvent : public Event 1634af69d88dSmrg{ 1635af69d88dSmrgpublic: 1636af69d88dSmrg UserEvent( 1637af69d88dSmrg const Context& context, 1638af69d88dSmrg cl_int * err = NULL) 1639af69d88dSmrg { 1640af69d88dSmrg cl_int error; 1641af69d88dSmrg object_ = ::clCreateUserEvent( 1642af69d88dSmrg context(), 1643af69d88dSmrg &error); 1644af69d88dSmrg 1645af69d88dSmrg detail::errHandler(error, __CREATE_USER_EVENT_ERR); 1646af69d88dSmrg if (err != NULL) { 1647af69d88dSmrg *err = error; 1648af69d88dSmrg } 1649af69d88dSmrg } 1650af69d88dSmrg 1651af69d88dSmrg UserEvent() : Event() { } 1652af69d88dSmrg 1653af69d88dSmrg UserEvent(const UserEvent& event) : Event(event) { } 1654af69d88dSmrg 1655af69d88dSmrg UserEvent& operator = (const UserEvent& rhs) 1656af69d88dSmrg { 1657af69d88dSmrg if (this != &rhs) { 1658af69d88dSmrg Event::operator=(rhs); 1659af69d88dSmrg } 1660af69d88dSmrg return *this; 1661af69d88dSmrg } 1662af69d88dSmrg 1663af69d88dSmrg cl_int setStatus(cl_int status) 1664af69d88dSmrg { 1665af69d88dSmrg return detail::errHandler( 1666af69d88dSmrg ::clSetUserEventStatus(object_,status), 1667af69d88dSmrg __SET_USER_EVENT_STATUS_ERR); 1668af69d88dSmrg } 1669af69d88dSmrg}; 1670af69d88dSmrg#endif 1671af69d88dSmrg 1672af69d88dSmrginline static cl_int 1673af69d88dSmrgWaitForEvents(const VECTOR_CLASS<Event>& events) 1674af69d88dSmrg{ 1675af69d88dSmrg return detail::errHandler( 1676af69d88dSmrg ::clWaitForEvents( 1677af69d88dSmrg (cl_uint) events.size(), (cl_event*)&events.front()), 1678af69d88dSmrg __WAIT_FOR_EVENTS_ERR); 1679af69d88dSmrg} 1680af69d88dSmrg 1681af69d88dSmrg/*! \class Memory 1682af69d88dSmrg * \brief Memory interface for cl_mem. 1683af69d88dSmrg */ 1684af69d88dSmrgclass Memory : public detail::Wrapper<cl_mem> 1685af69d88dSmrg{ 1686af69d88dSmrgpublic: 1687af69d88dSmrg Memory() : detail::Wrapper<cl_type>() { } 1688af69d88dSmrg 1689af69d88dSmrg Memory(const Memory& memory) : detail::Wrapper<cl_type>(memory) { } 1690af69d88dSmrg 1691af69d88dSmrg Memory& operator = (const Memory& rhs) 1692af69d88dSmrg { 1693af69d88dSmrg if (this != &rhs) { 1694af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 1695af69d88dSmrg } 1696af69d88dSmrg return *this; 1697af69d88dSmrg } 1698af69d88dSmrg 1699af69d88dSmrg template <typename T> 1700af69d88dSmrg cl_int getInfo(cl_mem_info name, T* param) const 1701af69d88dSmrg { 1702af69d88dSmrg return detail::errHandler( 1703af69d88dSmrg detail::getInfo(&::clGetMemObjectInfo, object_, name, param), 1704af69d88dSmrg __GET_MEM_OBJECT_INFO_ERR); 1705af69d88dSmrg } 1706af69d88dSmrg 1707af69d88dSmrg template <cl_int name> typename 1708af69d88dSmrg detail::param_traits<detail::cl_mem_info, name>::param_type 1709af69d88dSmrg getInfo(cl_int* err = NULL) const 1710af69d88dSmrg { 1711af69d88dSmrg typename detail::param_traits< 1712af69d88dSmrg detail::cl_mem_info, name>::param_type param; 1713af69d88dSmrg cl_int result = getInfo(name, ¶m); 1714af69d88dSmrg if (err != NULL) { 1715af69d88dSmrg *err = result; 1716af69d88dSmrg } 1717af69d88dSmrg return param; 1718af69d88dSmrg } 1719af69d88dSmrg 1720af69d88dSmrg#if defined(CL_VERSION_1_1) 1721af69d88dSmrg cl_int setDestructorCallback( 1722af69d88dSmrg void (CL_CALLBACK * pfn_notify)(cl_mem, void *), 1723af69d88dSmrg void * user_data = NULL) 1724af69d88dSmrg { 1725af69d88dSmrg return detail::errHandler( 1726af69d88dSmrg ::clSetMemObjectDestructorCallback( 1727af69d88dSmrg object_, 1728af69d88dSmrg pfn_notify, 1729af69d88dSmrg user_data), 1730af69d88dSmrg __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR); 1731af69d88dSmrg } 1732af69d88dSmrg#endif 1733af69d88dSmrg 1734af69d88dSmrg}; 1735af69d88dSmrg 1736af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::Memory) 1737af69d88dSmrg 1738af69d88dSmrg/*! \class Buffer 1739af69d88dSmrg * \brief Memory buffer interface. 1740af69d88dSmrg */ 1741af69d88dSmrgclass Buffer : public Memory 1742af69d88dSmrg{ 1743af69d88dSmrgpublic: 1744af69d88dSmrg Buffer( 1745af69d88dSmrg const Context& context, 1746af69d88dSmrg cl_mem_flags flags, 1747af69d88dSmrg ::size_t size, 1748af69d88dSmrg void* host_ptr = NULL, 1749af69d88dSmrg cl_int* err = NULL) 1750af69d88dSmrg { 1751af69d88dSmrg cl_int error; 1752af69d88dSmrg object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); 1753af69d88dSmrg 1754af69d88dSmrg detail::errHandler(error, __CREATE_BUFFER_ERR); 1755af69d88dSmrg if (err != NULL) { 1756af69d88dSmrg *err = error; 1757af69d88dSmrg } 1758af69d88dSmrg } 1759af69d88dSmrg 1760af69d88dSmrg Buffer() : Memory() { } 1761af69d88dSmrg 1762af69d88dSmrg Buffer(const Buffer& buffer) : Memory(buffer) { } 1763af69d88dSmrg 1764af69d88dSmrg Buffer& operator = (const Buffer& rhs) 1765af69d88dSmrg { 1766af69d88dSmrg if (this != &rhs) { 1767af69d88dSmrg Memory::operator=(rhs); 1768af69d88dSmrg } 1769af69d88dSmrg return *this; 1770af69d88dSmrg } 1771af69d88dSmrg 1772af69d88dSmrg#if defined(CL_VERSION_1_1) 1773af69d88dSmrg Buffer createSubBuffer( 1774af69d88dSmrg cl_mem_flags flags, 1775af69d88dSmrg cl_buffer_create_type buffer_create_type, 1776af69d88dSmrg const void * buffer_create_info, 1777af69d88dSmrg cl_int * err = NULL) 1778af69d88dSmrg { 1779af69d88dSmrg Buffer result; 1780af69d88dSmrg cl_int error; 1781af69d88dSmrg result.object_ = ::clCreateSubBuffer( 1782af69d88dSmrg object_, 1783af69d88dSmrg flags, 1784af69d88dSmrg buffer_create_type, 1785af69d88dSmrg buffer_create_info, 1786af69d88dSmrg &error); 1787af69d88dSmrg 1788af69d88dSmrg detail::errHandler(error, __CREATE_SUBBUFFER_ERR); 1789af69d88dSmrg if (err != NULL) { 1790af69d88dSmrg *err = error; 1791af69d88dSmrg } 1792af69d88dSmrg 1793af69d88dSmrg return result; 1794af69d88dSmrg } 1795af69d88dSmrg#endif 1796af69d88dSmrg}; 1797af69d88dSmrg 1798af69d88dSmrg#if defined (USE_DX_INTEROP) 1799af69d88dSmrgclass BufferD3D10 : public Buffer 1800af69d88dSmrg{ 1801af69d88dSmrgpublic: 1802af69d88dSmrg typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)( 1803af69d88dSmrg cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer, 1804af69d88dSmrg cl_int* errcode_ret); 1805af69d88dSmrg 1806af69d88dSmrg BufferD3D10( 1807af69d88dSmrg const Context& context, 1808af69d88dSmrg cl_mem_flags flags, 1809af69d88dSmrg ID3D10Buffer* bufobj, 1810af69d88dSmrg cl_int * err = NULL) 1811af69d88dSmrg { 1812af69d88dSmrg static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL; 1813af69d88dSmrg __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR); 1814af69d88dSmrg 1815af69d88dSmrg cl_int error; 1816af69d88dSmrg object_ = pfn_clCreateFromD3D10BufferKHR( 1817af69d88dSmrg context(), 1818af69d88dSmrg flags, 1819af69d88dSmrg bufobj, 1820af69d88dSmrg &error); 1821af69d88dSmrg 1822af69d88dSmrg detail::errHandler(error, __CREATE_GL_BUFFER_ERR); 1823af69d88dSmrg if (err != NULL) { 1824af69d88dSmrg *err = error; 1825af69d88dSmrg } 1826af69d88dSmrg } 1827af69d88dSmrg 1828af69d88dSmrg BufferD3D10() : Buffer() { } 1829af69d88dSmrg 1830af69d88dSmrg BufferD3D10(const BufferD3D10& buffer) : Buffer(buffer) { } 1831af69d88dSmrg 1832af69d88dSmrg BufferD3D10& operator = (const BufferD3D10& rhs) 1833af69d88dSmrg { 1834af69d88dSmrg if (this != &rhs) { 1835af69d88dSmrg Buffer::operator=(rhs); 1836af69d88dSmrg } 1837af69d88dSmrg return *this; 1838af69d88dSmrg } 1839af69d88dSmrg}; 1840af69d88dSmrg#endif 1841af69d88dSmrg 1842af69d88dSmrg/*! \class BufferGL 1843af69d88dSmrg * \brief Memory buffer interface for GL interop. 1844af69d88dSmrg */ 1845af69d88dSmrgclass BufferGL : public Buffer 1846af69d88dSmrg{ 1847af69d88dSmrgpublic: 1848af69d88dSmrg BufferGL( 1849af69d88dSmrg const Context& context, 1850af69d88dSmrg cl_mem_flags flags, 1851af69d88dSmrg GLuint bufobj, 1852af69d88dSmrg cl_int * err = NULL) 1853af69d88dSmrg { 1854af69d88dSmrg cl_int error; 1855af69d88dSmrg object_ = ::clCreateFromGLBuffer( 1856af69d88dSmrg context(), 1857af69d88dSmrg flags, 1858af69d88dSmrg bufobj, 1859af69d88dSmrg &error); 1860af69d88dSmrg 1861af69d88dSmrg detail::errHandler(error, __CREATE_GL_BUFFER_ERR); 1862af69d88dSmrg if (err != NULL) { 1863af69d88dSmrg *err = error; 1864af69d88dSmrg } 1865af69d88dSmrg } 1866af69d88dSmrg 1867af69d88dSmrg BufferGL() : Buffer() { } 1868af69d88dSmrg 1869af69d88dSmrg BufferGL(const BufferGL& buffer) : Buffer(buffer) { } 1870af69d88dSmrg 1871af69d88dSmrg BufferGL& operator = (const BufferGL& rhs) 1872af69d88dSmrg { 1873af69d88dSmrg if (this != &rhs) { 1874af69d88dSmrg Buffer::operator=(rhs); 1875af69d88dSmrg } 1876af69d88dSmrg return *this; 1877af69d88dSmrg } 1878af69d88dSmrg 1879af69d88dSmrg cl_int getObjectInfo( 1880af69d88dSmrg cl_gl_object_type *type, 1881af69d88dSmrg GLuint * gl_object_name) 1882af69d88dSmrg { 1883af69d88dSmrg return detail::errHandler( 1884af69d88dSmrg ::clGetGLObjectInfo(object_,type,gl_object_name), 1885af69d88dSmrg __GET_GL_OBJECT_INFO_ERR); 1886af69d88dSmrg } 1887af69d88dSmrg}; 1888af69d88dSmrg 1889af69d88dSmrg/*! \class BufferRenderGL 1890af69d88dSmrg * \brief Memory buffer interface for GL interop with renderbuffer. 1891af69d88dSmrg */ 1892af69d88dSmrgclass BufferRenderGL : public Buffer 1893af69d88dSmrg{ 1894af69d88dSmrgpublic: 1895af69d88dSmrg BufferRenderGL( 1896af69d88dSmrg const Context& context, 1897af69d88dSmrg cl_mem_flags flags, 1898af69d88dSmrg GLuint bufobj, 1899af69d88dSmrg cl_int * err = NULL) 1900af69d88dSmrg { 1901af69d88dSmrg cl_int error; 1902af69d88dSmrg object_ = ::clCreateFromGLRenderbuffer( 1903af69d88dSmrg context(), 1904af69d88dSmrg flags, 1905af69d88dSmrg bufobj, 1906af69d88dSmrg &error); 1907af69d88dSmrg 1908af69d88dSmrg detail::errHandler(error, __CREATE_GL_BUFFER_ERR); 1909af69d88dSmrg if (err != NULL) { 1910af69d88dSmrg *err = error; 1911af69d88dSmrg } 1912af69d88dSmrg } 1913af69d88dSmrg 1914af69d88dSmrg BufferRenderGL() : Buffer() { } 1915af69d88dSmrg 1916af69d88dSmrg BufferRenderGL(const BufferGL& buffer) : Buffer(buffer) { } 1917af69d88dSmrg 1918af69d88dSmrg BufferRenderGL& operator = (const BufferRenderGL& rhs) 1919af69d88dSmrg { 1920af69d88dSmrg if (this != &rhs) { 1921af69d88dSmrg Buffer::operator=(rhs); 1922af69d88dSmrg } 1923af69d88dSmrg return *this; 1924af69d88dSmrg } 1925af69d88dSmrg 1926af69d88dSmrg cl_int getObjectInfo( 1927af69d88dSmrg cl_gl_object_type *type, 1928af69d88dSmrg GLuint * gl_object_name) 1929af69d88dSmrg { 1930af69d88dSmrg return detail::errHandler( 1931af69d88dSmrg ::clGetGLObjectInfo(object_,type,gl_object_name), 1932af69d88dSmrg __GET_GL_OBJECT_INFO_ERR); 1933af69d88dSmrg } 1934af69d88dSmrg}; 1935af69d88dSmrg 1936af69d88dSmrg/*! \class Image 1937af69d88dSmrg * \brief Base class interface for all images. 1938af69d88dSmrg */ 1939af69d88dSmrgclass Image : public Memory 1940af69d88dSmrg{ 1941af69d88dSmrgprotected: 1942af69d88dSmrg Image() : Memory() { } 1943af69d88dSmrg 1944af69d88dSmrg Image(const Image& image) : Memory(image) { } 1945af69d88dSmrg 1946af69d88dSmrg Image& operator = (const Image& rhs) 1947af69d88dSmrg { 1948af69d88dSmrg if (this != &rhs) { 1949af69d88dSmrg Memory::operator=(rhs); 1950af69d88dSmrg } 1951af69d88dSmrg return *this; 1952af69d88dSmrg } 1953af69d88dSmrgpublic: 1954af69d88dSmrg template <typename T> 1955af69d88dSmrg cl_int getImageInfo(cl_image_info name, T* param) const 1956af69d88dSmrg { 1957af69d88dSmrg return detail::errHandler( 1958af69d88dSmrg detail::getInfo(&::clGetImageInfo, object_, name, param), 1959af69d88dSmrg __GET_IMAGE_INFO_ERR); 1960af69d88dSmrg } 1961af69d88dSmrg 1962af69d88dSmrg template <cl_int name> typename 1963af69d88dSmrg detail::param_traits<detail::cl_image_info, name>::param_type 1964af69d88dSmrg getImageInfo(cl_int* err = NULL) const 1965af69d88dSmrg { 1966af69d88dSmrg typename detail::param_traits< 1967af69d88dSmrg detail::cl_image_info, name>::param_type param; 1968af69d88dSmrg cl_int result = getImageInfo(name, ¶m); 1969af69d88dSmrg if (err != NULL) { 1970af69d88dSmrg *err = result; 1971af69d88dSmrg } 1972af69d88dSmrg return param; 1973af69d88dSmrg } 1974af69d88dSmrg}; 1975af69d88dSmrg 1976af69d88dSmrg/*! \class Image2D 1977af69d88dSmrg * \brief Image interface for 2D images. 1978af69d88dSmrg */ 1979af69d88dSmrgclass Image2D : public Image 1980af69d88dSmrg{ 1981af69d88dSmrgpublic: 1982af69d88dSmrg Image2D( 1983af69d88dSmrg const Context& context, 1984af69d88dSmrg cl_mem_flags flags, 1985af69d88dSmrg ImageFormat format, 1986af69d88dSmrg ::size_t width, 1987af69d88dSmrg ::size_t height, 1988af69d88dSmrg ::size_t row_pitch = 0, 1989af69d88dSmrg void* host_ptr = NULL, 1990af69d88dSmrg cl_int* err = NULL) 1991af69d88dSmrg { 1992af69d88dSmrg cl_int error; 1993af69d88dSmrg object_ = ::clCreateImage2D( 1994af69d88dSmrg context(), flags,&format, width, height, row_pitch, host_ptr, &error); 1995af69d88dSmrg 1996af69d88dSmrg detail::errHandler(error, __CREATE_IMAGE2D_ERR); 1997af69d88dSmrg if (err != NULL) { 1998af69d88dSmrg *err = error; 1999af69d88dSmrg } 2000af69d88dSmrg } 2001af69d88dSmrg 2002af69d88dSmrg Image2D() { } 2003af69d88dSmrg 2004af69d88dSmrg Image2D(const Image2D& image2D) : Image(image2D) { } 2005af69d88dSmrg 2006af69d88dSmrg Image2D& operator = (const Image2D& rhs) 2007af69d88dSmrg { 2008af69d88dSmrg if (this != &rhs) { 2009af69d88dSmrg Image::operator=(rhs); 2010af69d88dSmrg } 2011af69d88dSmrg return *this; 2012af69d88dSmrg } 2013af69d88dSmrg}; 2014af69d88dSmrg 2015af69d88dSmrg/*! \class Image2DGL 2016af69d88dSmrg * \brief 2D image interface for GL interop. 2017af69d88dSmrg */ 2018af69d88dSmrgclass Image2DGL : public Image2D 2019af69d88dSmrg{ 2020af69d88dSmrgpublic: 2021af69d88dSmrg Image2DGL( 2022af69d88dSmrg const Context& context, 2023af69d88dSmrg cl_mem_flags flags, 2024af69d88dSmrg GLenum target, 2025af69d88dSmrg GLint miplevel, 2026af69d88dSmrg GLuint texobj, 2027af69d88dSmrg cl_int * err = NULL) 2028af69d88dSmrg { 2029af69d88dSmrg cl_int error; 2030af69d88dSmrg object_ = ::clCreateFromGLTexture2D( 2031af69d88dSmrg context(), 2032af69d88dSmrg flags, 2033af69d88dSmrg target, 2034af69d88dSmrg miplevel, 2035af69d88dSmrg texobj, 2036af69d88dSmrg &error); 2037af69d88dSmrg 2038af69d88dSmrg detail::errHandler(error, __CREATE_GL_BUFFER_ERR); 2039af69d88dSmrg if (err != NULL) { 2040af69d88dSmrg *err = error; 2041af69d88dSmrg } 2042af69d88dSmrg } 2043af69d88dSmrg 2044af69d88dSmrg Image2DGL() : Image2D() { } 2045af69d88dSmrg 2046af69d88dSmrg Image2DGL(const Image2DGL& image) : Image2D(image) { } 2047af69d88dSmrg 2048af69d88dSmrg Image2DGL& operator = (const Image2DGL& rhs) 2049af69d88dSmrg { 2050af69d88dSmrg if (this != &rhs) { 2051af69d88dSmrg Image2D::operator=(rhs); 2052af69d88dSmrg } 2053af69d88dSmrg return *this; 2054af69d88dSmrg } 2055af69d88dSmrg}; 2056af69d88dSmrg 2057af69d88dSmrg/*! \class Image3D 2058af69d88dSmrg * \brief Image interface for 3D images. 2059af69d88dSmrg */ 2060af69d88dSmrgclass Image3D : public Image 2061af69d88dSmrg{ 2062af69d88dSmrgpublic: 2063af69d88dSmrg Image3D( 2064af69d88dSmrg const Context& context, 2065af69d88dSmrg cl_mem_flags flags, 2066af69d88dSmrg ImageFormat format, 2067af69d88dSmrg ::size_t width, 2068af69d88dSmrg ::size_t height, 2069af69d88dSmrg ::size_t depth, 2070af69d88dSmrg ::size_t row_pitch = 0, 2071af69d88dSmrg ::size_t slice_pitch = 0, 2072af69d88dSmrg void* host_ptr = NULL, 2073af69d88dSmrg cl_int* err = NULL) 2074af69d88dSmrg { 2075af69d88dSmrg cl_int error; 2076af69d88dSmrg object_ = ::clCreateImage3D( 2077af69d88dSmrg context(), flags, &format, width, height, depth, row_pitch, 2078af69d88dSmrg slice_pitch, host_ptr, &error); 2079af69d88dSmrg 2080af69d88dSmrg detail::errHandler(error, __CREATE_IMAGE3D_ERR); 2081af69d88dSmrg if (err != NULL) { 2082af69d88dSmrg *err = error; 2083af69d88dSmrg } 2084af69d88dSmrg } 2085af69d88dSmrg 2086af69d88dSmrg Image3D() { } 2087af69d88dSmrg 2088af69d88dSmrg Image3D(const Image3D& image3D) : Image(image3D) { } 2089af69d88dSmrg 2090af69d88dSmrg Image3D& operator = (const Image3D& rhs) 2091af69d88dSmrg { 2092af69d88dSmrg if (this != &rhs) { 2093af69d88dSmrg Image::operator=(rhs); 2094af69d88dSmrg } 2095af69d88dSmrg return *this; 2096af69d88dSmrg } 2097af69d88dSmrg}; 2098af69d88dSmrg 2099af69d88dSmrg/*! \class Image2DGL 2100af69d88dSmrg * \brief 2D image interface for GL interop. 2101af69d88dSmrg */ 2102af69d88dSmrgclass Image3DGL : public Image3D 2103af69d88dSmrg{ 2104af69d88dSmrgpublic: 2105af69d88dSmrg Image3DGL( 2106af69d88dSmrg const Context& context, 2107af69d88dSmrg cl_mem_flags flags, 2108af69d88dSmrg GLenum target, 2109af69d88dSmrg GLint miplevel, 2110af69d88dSmrg GLuint texobj, 2111af69d88dSmrg cl_int * err = NULL) 2112af69d88dSmrg { 2113af69d88dSmrg cl_int error; 2114af69d88dSmrg object_ = ::clCreateFromGLTexture3D( 2115af69d88dSmrg context(), 2116af69d88dSmrg flags, 2117af69d88dSmrg target, 2118af69d88dSmrg miplevel, 2119af69d88dSmrg texobj, 2120af69d88dSmrg &error); 2121af69d88dSmrg 2122af69d88dSmrg detail::errHandler(error, __CREATE_GL_BUFFER_ERR); 2123af69d88dSmrg if (err != NULL) { 2124af69d88dSmrg *err = error; 2125af69d88dSmrg } 2126af69d88dSmrg } 2127af69d88dSmrg 2128af69d88dSmrg Image3DGL() : Image3D() { } 2129af69d88dSmrg 2130af69d88dSmrg Image3DGL(const Image3DGL& image) : Image3D(image) { } 2131af69d88dSmrg 2132af69d88dSmrg Image3DGL& operator = (const Image3DGL& rhs) 2133af69d88dSmrg { 2134af69d88dSmrg if (this != &rhs) { 2135af69d88dSmrg Image3D::operator=(rhs); 2136af69d88dSmrg } 2137af69d88dSmrg return *this; 2138af69d88dSmrg } 2139af69d88dSmrg}; 2140af69d88dSmrg 2141af69d88dSmrg/*! \class Sampler 2142af69d88dSmrg * \brief Sampler interface for cl_sampler. 2143af69d88dSmrg */ 2144af69d88dSmrgclass Sampler : public detail::Wrapper<cl_sampler> 2145af69d88dSmrg{ 2146af69d88dSmrgpublic: 2147af69d88dSmrg Sampler() { } 2148af69d88dSmrg 2149af69d88dSmrg Sampler( 2150af69d88dSmrg const Context& context, 2151af69d88dSmrg cl_bool normalized_coords, 2152af69d88dSmrg cl_addressing_mode addressing_mode, 2153af69d88dSmrg cl_filter_mode filter_mode, 2154af69d88dSmrg cl_int* err = NULL) 2155af69d88dSmrg { 2156af69d88dSmrg cl_int error; 2157af69d88dSmrg object_ = ::clCreateSampler( 2158af69d88dSmrg context(), 2159af69d88dSmrg normalized_coords, 2160af69d88dSmrg addressing_mode, 2161af69d88dSmrg filter_mode, 2162af69d88dSmrg &error); 2163af69d88dSmrg 2164af69d88dSmrg detail::errHandler(error, __CREATE_SAMPLER_ERR); 2165af69d88dSmrg if (err != NULL) { 2166af69d88dSmrg *err = error; 2167af69d88dSmrg } 2168af69d88dSmrg } 2169af69d88dSmrg 2170af69d88dSmrg Sampler(const Sampler& sampler) : detail::Wrapper<cl_type>(sampler) { } 2171af69d88dSmrg 2172af69d88dSmrg Sampler& operator = (const Sampler& rhs) 2173af69d88dSmrg { 2174af69d88dSmrg if (this != &rhs) { 2175af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 2176af69d88dSmrg } 2177af69d88dSmrg return *this; 2178af69d88dSmrg } 2179af69d88dSmrg 2180af69d88dSmrg template <typename T> 2181af69d88dSmrg cl_int getInfo(cl_sampler_info name, T* param) const 2182af69d88dSmrg { 2183af69d88dSmrg return detail::errHandler( 2184af69d88dSmrg detail::getInfo(&::clGetSamplerInfo, object_, name, param), 2185af69d88dSmrg __GET_SAMPLER_INFO_ERR); 2186af69d88dSmrg } 2187af69d88dSmrg 2188af69d88dSmrg template <cl_int name> typename 2189af69d88dSmrg detail::param_traits<detail::cl_sampler_info, name>::param_type 2190af69d88dSmrg getInfo(cl_int* err = NULL) const 2191af69d88dSmrg { 2192af69d88dSmrg typename detail::param_traits< 2193af69d88dSmrg detail::cl_sampler_info, name>::param_type param; 2194af69d88dSmrg cl_int result = getInfo(name, ¶m); 2195af69d88dSmrg if (err != NULL) { 2196af69d88dSmrg *err = result; 2197af69d88dSmrg } 2198af69d88dSmrg return param; 2199af69d88dSmrg } 2200af69d88dSmrg}; 2201af69d88dSmrg 2202af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::Sampler) 2203af69d88dSmrg 2204af69d88dSmrgclass Program; 2205af69d88dSmrgclass CommandQueue; 2206af69d88dSmrgclass Kernel; 2207af69d88dSmrg 2208af69d88dSmrg/*! \class NDRange 2209af69d88dSmrg * \brief NDRange interface 2210af69d88dSmrg */ 2211af69d88dSmrgclass NDRange 2212af69d88dSmrg{ 2213af69d88dSmrgprivate: 2214af69d88dSmrg size_t<3> sizes_; 2215af69d88dSmrg cl_uint dimensions_; 2216af69d88dSmrg 2217af69d88dSmrgpublic: 2218af69d88dSmrg NDRange() 2219af69d88dSmrg : dimensions_(0) 2220af69d88dSmrg { } 2221af69d88dSmrg 2222af69d88dSmrg NDRange(::size_t size0) 2223af69d88dSmrg : dimensions_(1) 2224af69d88dSmrg { 2225af69d88dSmrg sizes_.push_back(size0); 2226af69d88dSmrg } 2227af69d88dSmrg 2228af69d88dSmrg NDRange(::size_t size0, ::size_t size1) 2229af69d88dSmrg : dimensions_(2) 2230af69d88dSmrg { 2231af69d88dSmrg sizes_.push_back(size0); 2232af69d88dSmrg sizes_.push_back(size1); 2233af69d88dSmrg } 2234af69d88dSmrg 2235af69d88dSmrg NDRange(::size_t size0, ::size_t size1, ::size_t size2) 2236af69d88dSmrg : dimensions_(3) 2237af69d88dSmrg { 2238af69d88dSmrg sizes_.push_back(size0); 2239af69d88dSmrg sizes_.push_back(size1); 2240af69d88dSmrg sizes_.push_back(size2); 2241af69d88dSmrg } 2242af69d88dSmrg 2243af69d88dSmrg operator const ::size_t*() const { return (const ::size_t*) sizes_; } 2244af69d88dSmrg ::size_t dimensions() const { return dimensions_; } 2245af69d88dSmrg}; 2246af69d88dSmrg 2247af69d88dSmrgstatic const NDRange NullRange; 2248af69d88dSmrg 2249af69d88dSmrg/*! 2250af69d88dSmrg * \struct LocalSpaceArg 2251af69d88dSmrg * \brief Local address raper for use with Kernel::setArg 2252af69d88dSmrg */ 2253af69d88dSmrgstruct LocalSpaceArg 2254af69d88dSmrg{ 2255af69d88dSmrg ::size_t size_; 2256af69d88dSmrg}; 2257af69d88dSmrg 2258af69d88dSmrgnamespace detail { 2259af69d88dSmrg 2260af69d88dSmrgtemplate <typename T> 2261af69d88dSmrgstruct KernelArgumentHandler 2262af69d88dSmrg{ 2263af69d88dSmrg static ::size_t size(const T&) { return sizeof(T); } 2264af69d88dSmrg static T* ptr(T& value) { return &value; } 2265af69d88dSmrg}; 2266af69d88dSmrg 2267af69d88dSmrgtemplate <> 2268af69d88dSmrgstruct KernelArgumentHandler<LocalSpaceArg> 2269af69d88dSmrg{ 2270af69d88dSmrg static ::size_t size(const LocalSpaceArg& value) { return value.size_; } 2271af69d88dSmrg static void* ptr(LocalSpaceArg&) { return NULL; } 2272af69d88dSmrg}; 2273af69d88dSmrg 2274af69d88dSmrg} 2275af69d88dSmrg//! \endcond 2276af69d88dSmrg 2277af69d88dSmrginline LocalSpaceArg 2278af69d88dSmrg__local(::size_t size) 2279af69d88dSmrg{ 2280af69d88dSmrg LocalSpaceArg ret = { size }; 2281af69d88dSmrg return ret; 2282af69d88dSmrg} 2283af69d88dSmrg 2284af69d88dSmrgclass KernelFunctor; 2285af69d88dSmrg 2286af69d88dSmrg/*! \class Kernel 2287af69d88dSmrg * \brief Kernel interface that implements cl_kernel 2288af69d88dSmrg */ 2289af69d88dSmrgclass Kernel : public detail::Wrapper<cl_kernel> 2290af69d88dSmrg{ 2291af69d88dSmrgpublic: 2292af69d88dSmrg inline Kernel(const Program& program, const char* name, cl_int* err = NULL); 2293af69d88dSmrg 2294af69d88dSmrg Kernel() { } 2295af69d88dSmrg 2296af69d88dSmrg Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) { } 2297af69d88dSmrg 2298af69d88dSmrg Kernel& operator = (const Kernel& rhs) 2299af69d88dSmrg { 2300af69d88dSmrg if (this != &rhs) { 2301af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 2302af69d88dSmrg } 2303af69d88dSmrg return *this; 2304af69d88dSmrg } 2305af69d88dSmrg 2306af69d88dSmrg template <typename T> 2307af69d88dSmrg cl_int getInfo(cl_kernel_info name, T* param) const 2308af69d88dSmrg { 2309af69d88dSmrg return detail::errHandler( 2310af69d88dSmrg detail::getInfo(&::clGetKernelInfo, object_, name, param), 2311af69d88dSmrg __GET_KERNEL_INFO_ERR); 2312af69d88dSmrg } 2313af69d88dSmrg 2314af69d88dSmrg template <cl_int name> typename 2315af69d88dSmrg detail::param_traits<detail::cl_kernel_info, name>::param_type 2316af69d88dSmrg getInfo(cl_int* err = NULL) const 2317af69d88dSmrg { 2318af69d88dSmrg typename detail::param_traits< 2319af69d88dSmrg detail::cl_kernel_info, name>::param_type param; 2320af69d88dSmrg cl_int result = getInfo(name, ¶m); 2321af69d88dSmrg if (err != NULL) { 2322af69d88dSmrg *err = result; 2323af69d88dSmrg } 2324af69d88dSmrg return param; 2325af69d88dSmrg } 2326af69d88dSmrg 2327af69d88dSmrg template <typename T> 2328af69d88dSmrg cl_int getWorkGroupInfo( 2329af69d88dSmrg const Device& device, cl_kernel_work_group_info name, T* param) const 2330af69d88dSmrg { 2331af69d88dSmrg return detail::errHandler( 2332af69d88dSmrg detail::getInfo( 2333af69d88dSmrg &::clGetKernelWorkGroupInfo, object_, device(), name, param), 2334af69d88dSmrg __GET_KERNEL_WORK_GROUP_INFO_ERR); 2335af69d88dSmrg } 2336af69d88dSmrg 2337af69d88dSmrg template <cl_int name> typename 2338af69d88dSmrg detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type 2339af69d88dSmrg getWorkGroupInfo(const Device& device, cl_int* err = NULL) const 2340af69d88dSmrg { 2341af69d88dSmrg typename detail::param_traits< 2342af69d88dSmrg detail::cl_kernel_work_group_info, name>::param_type param; 2343af69d88dSmrg cl_int result = getWorkGroupInfo(device, name, ¶m); 2344af69d88dSmrg if (err != NULL) { 2345af69d88dSmrg *err = result; 2346af69d88dSmrg } 2347af69d88dSmrg return param; 2348af69d88dSmrg } 2349af69d88dSmrg 2350af69d88dSmrg template <typename T> 2351af69d88dSmrg cl_int setArg(cl_uint index, T value) 2352af69d88dSmrg { 2353af69d88dSmrg return detail::errHandler( 2354af69d88dSmrg ::clSetKernelArg( 2355af69d88dSmrg object_, 2356af69d88dSmrg index, 2357af69d88dSmrg detail::KernelArgumentHandler<T>::size(value), 2358af69d88dSmrg detail::KernelArgumentHandler<T>::ptr(value)), 2359af69d88dSmrg __SET_KERNEL_ARGS_ERR); 2360af69d88dSmrg } 2361af69d88dSmrg 2362af69d88dSmrg cl_int setArg(cl_uint index, ::size_t size, void* argPtr) 2363af69d88dSmrg { 2364af69d88dSmrg return detail::errHandler( 2365af69d88dSmrg ::clSetKernelArg(object_, index, size, argPtr), 2366af69d88dSmrg __SET_KERNEL_ARGS_ERR); 2367af69d88dSmrg } 2368af69d88dSmrg 2369af69d88dSmrg KernelFunctor bind( 2370af69d88dSmrg const CommandQueue& queue, 2371af69d88dSmrg const NDRange& offset, 2372af69d88dSmrg const NDRange& global, 2373af69d88dSmrg const NDRange& local); 2374af69d88dSmrg 2375af69d88dSmrg KernelFunctor bind( 2376af69d88dSmrg const CommandQueue& queue, 2377af69d88dSmrg const NDRange& global, 2378af69d88dSmrg const NDRange& local); 2379af69d88dSmrg}; 2380af69d88dSmrg 2381af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::Kernel) 2382af69d88dSmrg 2383af69d88dSmrg/*! \class Program 2384af69d88dSmrg * \brief Program interface that implements cl_program. 2385af69d88dSmrg */ 2386af69d88dSmrgclass Program : public detail::Wrapper<cl_program> 2387af69d88dSmrg{ 2388af69d88dSmrgpublic: 2389af69d88dSmrg typedef VECTOR_CLASS<std::pair<const void*, ::size_t> > Binaries; 2390af69d88dSmrg typedef VECTOR_CLASS<std::pair<const char*, ::size_t> > Sources; 2391af69d88dSmrg 2392af69d88dSmrg Program( 2393af69d88dSmrg const Context& context, 2394af69d88dSmrg const Sources& sources, 2395af69d88dSmrg cl_int* err = NULL) 2396af69d88dSmrg { 2397af69d88dSmrg cl_int error; 2398af69d88dSmrg 2399af69d88dSmrg const ::size_t n = (::size_t)sources.size(); 2400af69d88dSmrg ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t)); 2401af69d88dSmrg const char** strings = (const char**) alloca(n * sizeof(const char*)); 2402af69d88dSmrg 2403af69d88dSmrg for (::size_t i = 0; i < n; ++i) { 2404af69d88dSmrg strings[i] = sources[(int)i].first; 2405af69d88dSmrg lengths[i] = sources[(int)i].second; 2406af69d88dSmrg } 2407af69d88dSmrg 2408af69d88dSmrg object_ = ::clCreateProgramWithSource( 2409af69d88dSmrg context(), (cl_uint)n, strings, lengths, &error); 2410af69d88dSmrg 2411af69d88dSmrg detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); 2412af69d88dSmrg if (err != NULL) { 2413af69d88dSmrg *err = error; 2414af69d88dSmrg } 2415af69d88dSmrg } 2416af69d88dSmrg 2417af69d88dSmrg Program( 2418af69d88dSmrg const Context& context, 2419af69d88dSmrg const VECTOR_CLASS<Device>& devices, 2420af69d88dSmrg const Binaries& binaries, 2421af69d88dSmrg VECTOR_CLASS<cl_int>* binaryStatus = NULL, 2422af69d88dSmrg cl_int* err = NULL) 2423af69d88dSmrg { 2424af69d88dSmrg cl_int error; 2425af69d88dSmrg const ::size_t n = binaries.size(); 2426af69d88dSmrg ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t)); 2427af69d88dSmrg const unsigned char** images = (const unsigned char**) alloca(n * sizeof(const void*)); 2428af69d88dSmrg 2429af69d88dSmrg for (::size_t i = 0; i < n; ++i) { 2430af69d88dSmrg images[i] = (const unsigned char*)binaries[(int)i].first; 2431af69d88dSmrg lengths[i] = binaries[(int)i].second; 2432af69d88dSmrg } 2433af69d88dSmrg 2434af69d88dSmrg object_ = ::clCreateProgramWithBinary( 2435af69d88dSmrg context(), (cl_uint) devices.size(), 2436af69d88dSmrg (cl_device_id*)&devices.front(), 2437af69d88dSmrg lengths, images, binaryStatus != NULL 2438af69d88dSmrg ? (cl_int*) &binaryStatus->front() 2439af69d88dSmrg : NULL, &error); 2440af69d88dSmrg 2441af69d88dSmrg detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR); 2442af69d88dSmrg if (err != NULL) { 2443af69d88dSmrg *err = error; 2444af69d88dSmrg } 2445af69d88dSmrg } 2446af69d88dSmrg 2447af69d88dSmrg Program() { } 2448af69d88dSmrg 2449af69d88dSmrg Program(const Program& program) : detail::Wrapper<cl_type>(program) { } 2450af69d88dSmrg 2451af69d88dSmrg Program& operator = (const Program& rhs) 2452af69d88dSmrg { 2453af69d88dSmrg if (this != &rhs) { 2454af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 2455af69d88dSmrg } 2456af69d88dSmrg return *this; 2457af69d88dSmrg } 2458af69d88dSmrg 2459af69d88dSmrg cl_int build( 2460af69d88dSmrg const VECTOR_CLASS<Device>& devices, 2461af69d88dSmrg const char* options = NULL, 2462af69d88dSmrg void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, 2463af69d88dSmrg void* data = NULL) const 2464af69d88dSmrg { 2465af69d88dSmrg return detail::errHandler( 2466af69d88dSmrg ::clBuildProgram( 2467af69d88dSmrg object_, 2468af69d88dSmrg (cl_uint) 2469af69d88dSmrg devices.size(), 2470af69d88dSmrg (cl_device_id*)&devices.front(), 2471af69d88dSmrg options, 2472af69d88dSmrg notifyFptr, 2473af69d88dSmrg data), 2474af69d88dSmrg __BUILD_PROGRAM_ERR); 2475af69d88dSmrg } 2476af69d88dSmrg 2477af69d88dSmrg template <typename T> 2478af69d88dSmrg cl_int getInfo(cl_program_info name, T* param) const 2479af69d88dSmrg { 2480af69d88dSmrg return detail::errHandler( 2481af69d88dSmrg detail::getInfo(&::clGetProgramInfo, object_, name, param), 2482af69d88dSmrg __GET_PROGRAM_INFO_ERR); 2483af69d88dSmrg } 2484af69d88dSmrg 2485af69d88dSmrg template <cl_int name> typename 2486af69d88dSmrg detail::param_traits<detail::cl_program_info, name>::param_type 2487af69d88dSmrg getInfo(cl_int* err = NULL) const 2488af69d88dSmrg { 2489af69d88dSmrg typename detail::param_traits< 2490af69d88dSmrg detail::cl_program_info, name>::param_type param; 2491af69d88dSmrg cl_int result = getInfo(name, ¶m); 2492af69d88dSmrg if (err != NULL) { 2493af69d88dSmrg *err = result; 2494af69d88dSmrg } 2495af69d88dSmrg return param; 2496af69d88dSmrg } 2497af69d88dSmrg 2498af69d88dSmrg template <typename T> 2499af69d88dSmrg cl_int getBuildInfo( 2500af69d88dSmrg const Device& device, cl_program_build_info name, T* param) const 2501af69d88dSmrg { 2502af69d88dSmrg return detail::errHandler( 2503af69d88dSmrg detail::getInfo( 2504af69d88dSmrg &::clGetProgramBuildInfo, object_, device(), name, param), 2505af69d88dSmrg __GET_PROGRAM_BUILD_INFO_ERR); 2506af69d88dSmrg } 2507af69d88dSmrg 2508af69d88dSmrg template <cl_int name> typename 2509af69d88dSmrg detail::param_traits<detail::cl_program_build_info, name>::param_type 2510af69d88dSmrg getBuildInfo(const Device& device, cl_int* err = NULL) const 2511af69d88dSmrg { 2512af69d88dSmrg typename detail::param_traits< 2513af69d88dSmrg detail::cl_program_build_info, name>::param_type param; 2514af69d88dSmrg cl_int result = getBuildInfo(device, name, ¶m); 2515af69d88dSmrg if (err != NULL) { 2516af69d88dSmrg *err = result; 2517af69d88dSmrg } 2518af69d88dSmrg return param; 2519af69d88dSmrg } 2520af69d88dSmrg 2521af69d88dSmrg cl_int createKernels(VECTOR_CLASS<Kernel>* kernels) 2522af69d88dSmrg { 2523af69d88dSmrg cl_uint numKernels; 2524af69d88dSmrg cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels); 2525af69d88dSmrg if (err != CL_SUCCESS) { 2526af69d88dSmrg return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); 2527af69d88dSmrg } 2528af69d88dSmrg 2529af69d88dSmrg Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel)); 2530af69d88dSmrg err = ::clCreateKernelsInProgram( 2531af69d88dSmrg object_, numKernels, (cl_kernel*) value, NULL); 2532af69d88dSmrg if (err != CL_SUCCESS) { 2533af69d88dSmrg return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); 2534af69d88dSmrg } 2535af69d88dSmrg 2536af69d88dSmrg kernels->assign(&value[0], &value[numKernels]); 2537af69d88dSmrg return CL_SUCCESS; 2538af69d88dSmrg } 2539af69d88dSmrg}; 2540af69d88dSmrg 2541af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::Program) 2542af69d88dSmrg 2543af69d88dSmrginline Kernel::Kernel(const Program& program, const char* name, cl_int* err) 2544af69d88dSmrg{ 2545af69d88dSmrg cl_int error; 2546af69d88dSmrg 2547af69d88dSmrg object_ = ::clCreateKernel(program(), name, &error); 2548af69d88dSmrg detail::errHandler(error, __CREATE_KERNEL_ERR); 2549af69d88dSmrg 2550af69d88dSmrg if (err != NULL) { 2551af69d88dSmrg *err = error; 2552af69d88dSmrg } 2553af69d88dSmrg 2554af69d88dSmrg} 2555af69d88dSmrg 2556af69d88dSmrg/*! \class CommandQueue 2557af69d88dSmrg * \brief CommandQueue interface for cl_command_queue. 2558af69d88dSmrg */ 2559af69d88dSmrgclass CommandQueue : public detail::Wrapper<cl_command_queue> 2560af69d88dSmrg{ 2561af69d88dSmrgpublic: 2562af69d88dSmrg CommandQueue( 2563af69d88dSmrg const Context& context, 2564af69d88dSmrg const Device& device, 2565af69d88dSmrg cl_command_queue_properties properties = 0, 2566af69d88dSmrg cl_int* err = NULL) 2567af69d88dSmrg { 2568af69d88dSmrg cl_int error; 2569af69d88dSmrg object_ = ::clCreateCommandQueue( 2570af69d88dSmrg context(), device(), properties, &error); 2571af69d88dSmrg 2572af69d88dSmrg detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); 2573af69d88dSmrg if (err != NULL) { 2574af69d88dSmrg *err = error; 2575af69d88dSmrg } 2576af69d88dSmrg } 2577af69d88dSmrg 2578af69d88dSmrg CommandQueue() { } 2579af69d88dSmrg 2580af69d88dSmrg CommandQueue(const CommandQueue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { } 2581af69d88dSmrg 2582af69d88dSmrg CommandQueue& operator = (const CommandQueue& rhs) 2583af69d88dSmrg { 2584af69d88dSmrg if (this != &rhs) { 2585af69d88dSmrg detail::Wrapper<cl_type>::operator=(rhs); 2586af69d88dSmrg } 2587af69d88dSmrg return *this; 2588af69d88dSmrg } 2589af69d88dSmrg 2590af69d88dSmrg template <typename T> 2591af69d88dSmrg cl_int getInfo(cl_command_queue_info name, T* param) const 2592af69d88dSmrg { 2593af69d88dSmrg return detail::errHandler( 2594af69d88dSmrg detail::getInfo( 2595af69d88dSmrg &::clGetCommandQueueInfo, object_, name, param), 2596af69d88dSmrg __GET_COMMAND_QUEUE_INFO_ERR); 2597af69d88dSmrg } 2598af69d88dSmrg 2599af69d88dSmrg template <cl_int name> typename 2600af69d88dSmrg detail::param_traits<detail::cl_command_queue_info, name>::param_type 2601af69d88dSmrg getInfo(cl_int* err = NULL) const 2602af69d88dSmrg { 2603af69d88dSmrg typename detail::param_traits< 2604af69d88dSmrg detail::cl_command_queue_info, name>::param_type param; 2605af69d88dSmrg cl_int result = getInfo(name, ¶m); 2606af69d88dSmrg if (err != NULL) { 2607af69d88dSmrg *err = result; 2608af69d88dSmrg } 2609af69d88dSmrg return param; 2610af69d88dSmrg } 2611af69d88dSmrg 2612af69d88dSmrg cl_int enqueueReadBuffer( 2613af69d88dSmrg const Buffer& buffer, 2614af69d88dSmrg cl_bool blocking, 2615af69d88dSmrg ::size_t offset, 2616af69d88dSmrg ::size_t size, 2617af69d88dSmrg void* ptr, 2618af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2619af69d88dSmrg Event* event = NULL) const 2620af69d88dSmrg { 2621af69d88dSmrg return detail::errHandler( 2622af69d88dSmrg ::clEnqueueReadBuffer( 2623af69d88dSmrg object_, buffer(), blocking, offset, size, 2624af69d88dSmrg ptr, 2625af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2626af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2627af69d88dSmrg (cl_event*) event), 2628af69d88dSmrg __ENQUEUE_READ_BUFFER_ERR); 2629af69d88dSmrg } 2630af69d88dSmrg 2631af69d88dSmrg cl_int enqueueWriteBuffer( 2632af69d88dSmrg const Buffer& buffer, 2633af69d88dSmrg cl_bool blocking, 2634af69d88dSmrg ::size_t offset, 2635af69d88dSmrg ::size_t size, 2636af69d88dSmrg const void* ptr, 2637af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2638af69d88dSmrg Event* event = NULL) const 2639af69d88dSmrg { 2640af69d88dSmrg return detail::errHandler( 2641af69d88dSmrg ::clEnqueueWriteBuffer( 2642af69d88dSmrg object_, buffer(), blocking, offset, size, 2643af69d88dSmrg ptr, 2644af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2645af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2646af69d88dSmrg (cl_event*) event), 2647af69d88dSmrg __ENQUEUE_WRITE_BUFFER_ERR); 2648af69d88dSmrg } 2649af69d88dSmrg 2650af69d88dSmrg cl_int enqueueCopyBuffer( 2651af69d88dSmrg const Buffer& src, 2652af69d88dSmrg const Buffer& dst, 2653af69d88dSmrg ::size_t src_offset, 2654af69d88dSmrg ::size_t dst_offset, 2655af69d88dSmrg ::size_t size, 2656af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2657af69d88dSmrg Event* event = NULL) const 2658af69d88dSmrg { 2659af69d88dSmrg return detail::errHandler( 2660af69d88dSmrg ::clEnqueueCopyBuffer( 2661af69d88dSmrg object_, src(), dst(), src_offset, dst_offset, size, 2662af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2663af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2664af69d88dSmrg (cl_event*) event), 2665af69d88dSmrg __ENQEUE_COPY_BUFFER_ERR); 2666af69d88dSmrg } 2667af69d88dSmrg 2668af69d88dSmrg#if defined(CL_VERSION_1_1) 2669af69d88dSmrg cl_int enqueueReadBufferRect( 2670af69d88dSmrg const Buffer& buffer, 2671af69d88dSmrg cl_bool blocking, 2672af69d88dSmrg const size_t<3>& buffer_offset, 2673af69d88dSmrg const size_t<3>& host_offset, 2674af69d88dSmrg const size_t<3>& region, 2675af69d88dSmrg ::size_t buffer_row_pitch, 2676af69d88dSmrg ::size_t buffer_slice_pitch, 2677af69d88dSmrg ::size_t host_row_pitch, 2678af69d88dSmrg ::size_t host_slice_pitch, 2679af69d88dSmrg void *ptr, 2680af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2681af69d88dSmrg Event* event = NULL) const 2682af69d88dSmrg { 2683af69d88dSmrg return detail::errHandler( 2684af69d88dSmrg ::clEnqueueReadBufferRect( 2685af69d88dSmrg object_, 2686af69d88dSmrg buffer(), 2687af69d88dSmrg blocking, 2688af69d88dSmrg (const ::size_t *)buffer_offset, 2689af69d88dSmrg (const ::size_t *)host_offset, 2690af69d88dSmrg (const ::size_t *)region, 2691af69d88dSmrg buffer_row_pitch, 2692af69d88dSmrg buffer_slice_pitch, 2693af69d88dSmrg host_row_pitch, 2694af69d88dSmrg host_slice_pitch, 2695af69d88dSmrg ptr, 2696af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2697af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2698af69d88dSmrg (cl_event*) event), 2699af69d88dSmrg __ENQUEUE_READ_BUFFER_RECT_ERR); 2700af69d88dSmrg } 2701af69d88dSmrg 2702af69d88dSmrg 2703af69d88dSmrg cl_int enqueueWriteBufferRect( 2704af69d88dSmrg const Buffer& buffer, 2705af69d88dSmrg cl_bool blocking, 2706af69d88dSmrg const size_t<3>& buffer_offset, 2707af69d88dSmrg const size_t<3>& host_offset, 2708af69d88dSmrg const size_t<3>& region, 2709af69d88dSmrg ::size_t buffer_row_pitch, 2710af69d88dSmrg ::size_t buffer_slice_pitch, 2711af69d88dSmrg ::size_t host_row_pitch, 2712af69d88dSmrg ::size_t host_slice_pitch, 2713af69d88dSmrg void *ptr, 2714af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2715af69d88dSmrg Event* event = NULL) const 2716af69d88dSmrg { 2717af69d88dSmrg return detail::errHandler( 2718af69d88dSmrg ::clEnqueueWriteBufferRect( 2719af69d88dSmrg object_, 2720af69d88dSmrg buffer(), 2721af69d88dSmrg blocking, 2722af69d88dSmrg (const ::size_t *)buffer_offset, 2723af69d88dSmrg (const ::size_t *)host_offset, 2724af69d88dSmrg (const ::size_t *)region, 2725af69d88dSmrg buffer_row_pitch, 2726af69d88dSmrg buffer_slice_pitch, 2727af69d88dSmrg host_row_pitch, 2728af69d88dSmrg host_slice_pitch, 2729af69d88dSmrg ptr, 2730af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2731af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2732af69d88dSmrg (cl_event*) event), 2733af69d88dSmrg __ENQUEUE_WRITE_BUFFER_RECT_ERR); 2734af69d88dSmrg } 2735af69d88dSmrg 2736af69d88dSmrg cl_int enqueueCopyBufferRect( 2737af69d88dSmrg const Buffer& src, 2738af69d88dSmrg const Buffer& dst, 2739af69d88dSmrg const size_t<3>& src_origin, 2740af69d88dSmrg const size_t<3>& dst_origin, 2741af69d88dSmrg const size_t<3>& region, 2742af69d88dSmrg ::size_t src_row_pitch, 2743af69d88dSmrg ::size_t src_slice_pitch, 2744af69d88dSmrg ::size_t dst_row_pitch, 2745af69d88dSmrg ::size_t dst_slice_pitch, 2746af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2747af69d88dSmrg Event* event = NULL) const 2748af69d88dSmrg { 2749af69d88dSmrg return detail::errHandler( 2750af69d88dSmrg ::clEnqueueCopyBufferRect( 2751af69d88dSmrg object_, 2752af69d88dSmrg src(), 2753af69d88dSmrg dst(), 2754af69d88dSmrg (const ::size_t *)src_origin, 2755af69d88dSmrg (const ::size_t *)dst_origin, 2756af69d88dSmrg (const ::size_t *)region, 2757af69d88dSmrg src_row_pitch, 2758af69d88dSmrg src_slice_pitch, 2759af69d88dSmrg dst_row_pitch, 2760af69d88dSmrg dst_slice_pitch, 2761af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2762af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2763af69d88dSmrg (cl_event*) event), 2764af69d88dSmrg __ENQEUE_COPY_BUFFER_RECT_ERR); 2765af69d88dSmrg } 2766af69d88dSmrg#endif 2767af69d88dSmrg 2768af69d88dSmrg cl_int enqueueReadImage( 2769af69d88dSmrg const Image& image, 2770af69d88dSmrg cl_bool blocking, 2771af69d88dSmrg const size_t<3>& origin, 2772af69d88dSmrg const size_t<3>& region, 2773af69d88dSmrg ::size_t row_pitch, 2774af69d88dSmrg ::size_t slice_pitch, 2775af69d88dSmrg void* ptr, 2776af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2777af69d88dSmrg Event* event = NULL) const 2778af69d88dSmrg { 2779af69d88dSmrg return detail::errHandler( 2780af69d88dSmrg ::clEnqueueReadImage( 2781af69d88dSmrg object_, image(), blocking, (const ::size_t *) origin, 2782af69d88dSmrg (const ::size_t *) region, row_pitch, slice_pitch, ptr, 2783af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2784af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2785af69d88dSmrg (cl_event*) event), 2786af69d88dSmrg __ENQUEUE_READ_IMAGE_ERR); 2787af69d88dSmrg } 2788af69d88dSmrg 2789af69d88dSmrg cl_int enqueueWriteImage( 2790af69d88dSmrg const Image& image, 2791af69d88dSmrg cl_bool blocking, 2792af69d88dSmrg const size_t<3>& origin, 2793af69d88dSmrg const size_t<3>& region, 2794af69d88dSmrg ::size_t row_pitch, 2795af69d88dSmrg ::size_t slice_pitch, 2796af69d88dSmrg void* ptr, 2797af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2798af69d88dSmrg Event* event = NULL) const 2799af69d88dSmrg { 2800af69d88dSmrg return detail::errHandler( 2801af69d88dSmrg ::clEnqueueWriteImage( 2802af69d88dSmrg object_, image(), blocking, (const ::size_t *) origin, 2803af69d88dSmrg (const ::size_t *) region, row_pitch, slice_pitch, ptr, 2804af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2805af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2806af69d88dSmrg (cl_event*) event), 2807af69d88dSmrg __ENQUEUE_WRITE_IMAGE_ERR); 2808af69d88dSmrg } 2809af69d88dSmrg 2810af69d88dSmrg cl_int enqueueCopyImage( 2811af69d88dSmrg const Image& src, 2812af69d88dSmrg const Image& dst, 2813af69d88dSmrg const size_t<3>& src_origin, 2814af69d88dSmrg const size_t<3>& dst_origin, 2815af69d88dSmrg const size_t<3>& region, 2816af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2817af69d88dSmrg Event* event = NULL) const 2818af69d88dSmrg { 2819af69d88dSmrg return detail::errHandler( 2820af69d88dSmrg ::clEnqueueCopyImage( 2821af69d88dSmrg object_, src(), dst(), (const ::size_t *) src_origin, 2822af69d88dSmrg (const ::size_t *)dst_origin, (const ::size_t *) region, 2823af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2824af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2825af69d88dSmrg (cl_event*) event), 2826af69d88dSmrg __ENQUEUE_COPY_IMAGE_ERR); 2827af69d88dSmrg } 2828af69d88dSmrg 2829af69d88dSmrg cl_int enqueueCopyImageToBuffer( 2830af69d88dSmrg const Image& src, 2831af69d88dSmrg const Buffer& dst, 2832af69d88dSmrg const size_t<3>& src_origin, 2833af69d88dSmrg const size_t<3>& region, 2834af69d88dSmrg ::size_t dst_offset, 2835af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2836af69d88dSmrg Event* event = NULL) const 2837af69d88dSmrg { 2838af69d88dSmrg return detail::errHandler( 2839af69d88dSmrg ::clEnqueueCopyImageToBuffer( 2840af69d88dSmrg object_, src(), dst(), (const ::size_t *) src_origin, 2841af69d88dSmrg (const ::size_t *) region, dst_offset, 2842af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2843af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2844af69d88dSmrg (cl_event*) event), 2845af69d88dSmrg __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR); 2846af69d88dSmrg } 2847af69d88dSmrg 2848af69d88dSmrg cl_int enqueueCopyBufferToImage( 2849af69d88dSmrg const Buffer& src, 2850af69d88dSmrg const Image& dst, 2851af69d88dSmrg ::size_t src_offset, 2852af69d88dSmrg const size_t<3>& dst_origin, 2853af69d88dSmrg const size_t<3>& region, 2854af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2855af69d88dSmrg Event* event = NULL) const 2856af69d88dSmrg { 2857af69d88dSmrg return detail::errHandler( 2858af69d88dSmrg ::clEnqueueCopyBufferToImage( 2859af69d88dSmrg object_, src(), dst(), src_offset, 2860af69d88dSmrg (const ::size_t *) dst_origin, (const ::size_t *) region, 2861af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2862af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2863af69d88dSmrg (cl_event*) event), 2864af69d88dSmrg __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR); 2865af69d88dSmrg } 2866af69d88dSmrg 2867af69d88dSmrg void* enqueueMapBuffer( 2868af69d88dSmrg const Buffer& buffer, 2869af69d88dSmrg cl_bool blocking, 2870af69d88dSmrg cl_map_flags flags, 2871af69d88dSmrg ::size_t offset, 2872af69d88dSmrg ::size_t size, 2873af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2874af69d88dSmrg Event* event = NULL, 2875af69d88dSmrg cl_int* err = NULL) const 2876af69d88dSmrg { 2877af69d88dSmrg cl_int error; 2878af69d88dSmrg void * result = ::clEnqueueMapBuffer( 2879af69d88dSmrg object_, buffer(), blocking, flags, offset, size, 2880af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2881af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2882af69d88dSmrg (cl_event*) event, 2883af69d88dSmrg &error); 2884af69d88dSmrg 2885af69d88dSmrg detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); 2886af69d88dSmrg if (err != NULL) { 2887af69d88dSmrg *err = error; 2888af69d88dSmrg } 2889af69d88dSmrg return result; 2890af69d88dSmrg } 2891af69d88dSmrg 2892af69d88dSmrg void* enqueueMapImage( 2893af69d88dSmrg const Image& buffer, 2894af69d88dSmrg cl_bool blocking, 2895af69d88dSmrg cl_map_flags flags, 2896af69d88dSmrg const size_t<3>& origin, 2897af69d88dSmrg const size_t<3>& region, 2898af69d88dSmrg ::size_t * row_pitch, 2899af69d88dSmrg ::size_t * slice_pitch, 2900af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2901af69d88dSmrg Event* event = NULL, 2902af69d88dSmrg cl_int* err = NULL) const 2903af69d88dSmrg { 2904af69d88dSmrg cl_int error; 2905af69d88dSmrg void * result = ::clEnqueueMapImage( 2906af69d88dSmrg object_, buffer(), blocking, flags, 2907af69d88dSmrg (const ::size_t *) origin, (const ::size_t *) region, 2908af69d88dSmrg row_pitch, slice_pitch, 2909af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2910af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2911af69d88dSmrg (cl_event*) event, 2912af69d88dSmrg &error); 2913af69d88dSmrg 2914af69d88dSmrg detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR); 2915af69d88dSmrg if (err != NULL) { 2916af69d88dSmrg *err = error; 2917af69d88dSmrg } 2918af69d88dSmrg return result; 2919af69d88dSmrg } 2920af69d88dSmrg 2921af69d88dSmrg cl_int enqueueUnmapMemObject( 2922af69d88dSmrg const Memory& memory, 2923af69d88dSmrg void* mapped_ptr, 2924af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2925af69d88dSmrg Event* event = NULL) const 2926af69d88dSmrg { 2927af69d88dSmrg return detail::errHandler( 2928af69d88dSmrg ::clEnqueueUnmapMemObject( 2929af69d88dSmrg object_, memory(), mapped_ptr, 2930af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2931af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2932af69d88dSmrg (cl_event*) event), 2933af69d88dSmrg __ENQUEUE_UNMAP_MEM_OBJECT_ERR); 2934af69d88dSmrg } 2935af69d88dSmrg 2936af69d88dSmrg cl_int enqueueNDRangeKernel( 2937af69d88dSmrg const Kernel& kernel, 2938af69d88dSmrg const NDRange& offset, 2939af69d88dSmrg const NDRange& global, 2940af69d88dSmrg const NDRange& local, 2941af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2942af69d88dSmrg Event* event = NULL) const 2943af69d88dSmrg { 2944af69d88dSmrg return detail::errHandler( 2945af69d88dSmrg ::clEnqueueNDRangeKernel( 2946af69d88dSmrg object_, kernel(), (cl_uint) global.dimensions(), 2947af69d88dSmrg offset.dimensions() != 0 ? (const ::size_t*) offset : NULL, 2948af69d88dSmrg (const ::size_t*) global, 2949af69d88dSmrg local.dimensions() != 0 ? (const ::size_t*) local : NULL, 2950af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2951af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2952af69d88dSmrg (cl_event*) event), 2953af69d88dSmrg __ENQUEUE_NDRANGE_KERNEL_ERR); 2954af69d88dSmrg } 2955af69d88dSmrg 2956af69d88dSmrg cl_int enqueueTask( 2957af69d88dSmrg const Kernel& kernel, 2958af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2959af69d88dSmrg Event* event = NULL) const 2960af69d88dSmrg { 2961af69d88dSmrg return detail::errHandler( 2962af69d88dSmrg ::clEnqueueTask( 2963af69d88dSmrg object_, kernel(), 2964af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2965af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2966af69d88dSmrg (cl_event*) event), 2967af69d88dSmrg __ENQUEUE_TASK_ERR); 2968af69d88dSmrg } 2969af69d88dSmrg 2970af69d88dSmrg cl_int enqueueNativeKernel( 2971af69d88dSmrg void (*userFptr)(void *), 2972af69d88dSmrg std::pair<void*, ::size_t> args, 2973af69d88dSmrg const VECTOR_CLASS<Memory>* mem_objects = NULL, 2974af69d88dSmrg const VECTOR_CLASS<const void*>* mem_locs = NULL, 2975af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 2976af69d88dSmrg Event* event = NULL) const 2977af69d88dSmrg { 2978af69d88dSmrg cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0) 2979af69d88dSmrg ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem)) 2980af69d88dSmrg : NULL; 2981af69d88dSmrg 2982af69d88dSmrg if (mems != NULL) { 2983af69d88dSmrg for (unsigned int i = 0; i < mem_objects->size(); i++) { 2984af69d88dSmrg mems[i] = ((*mem_objects)[i])(); 2985af69d88dSmrg } 2986af69d88dSmrg } 2987af69d88dSmrg 2988af69d88dSmrg return detail::errHandler( 2989af69d88dSmrg ::clEnqueueNativeKernel( 2990af69d88dSmrg object_, userFptr, args.first, args.second, 2991af69d88dSmrg (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, 2992af69d88dSmrg mems, 2993af69d88dSmrg (mem_locs != NULL) ? (const void **) &mem_locs->front() : NULL, 2994af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 2995af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 2996af69d88dSmrg (cl_event*) event), 2997af69d88dSmrg __ENQUEUE_NATIVE_KERNEL); 2998af69d88dSmrg } 2999af69d88dSmrg 3000af69d88dSmrg cl_int enqueueMarker(Event* event = NULL) const 3001af69d88dSmrg { 3002af69d88dSmrg return detail::errHandler( 3003af69d88dSmrg ::clEnqueueMarker(object_, (cl_event*) event), 3004af69d88dSmrg __ENQUEUE_MARKER_ERR); 3005af69d88dSmrg } 3006af69d88dSmrg 3007af69d88dSmrg cl_int enqueueWaitForEvents(const VECTOR_CLASS<Event>& events) const 3008af69d88dSmrg { 3009af69d88dSmrg return detail::errHandler( 3010af69d88dSmrg ::clEnqueueWaitForEvents( 3011af69d88dSmrg object_, 3012af69d88dSmrg (cl_uint) events.size(), 3013af69d88dSmrg (const cl_event*) &events.front()), 3014af69d88dSmrg __ENQUEUE_WAIT_FOR_EVENTS_ERR); 3015af69d88dSmrg } 3016af69d88dSmrg 3017af69d88dSmrg cl_int enqueueAcquireGLObjects( 3018af69d88dSmrg const VECTOR_CLASS<Memory>* mem_objects = NULL, 3019af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 3020af69d88dSmrg Event* event = NULL) const 3021af69d88dSmrg { 3022af69d88dSmrg return detail::errHandler( 3023af69d88dSmrg ::clEnqueueAcquireGLObjects( 3024af69d88dSmrg object_, 3025af69d88dSmrg (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, 3026af69d88dSmrg (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, 3027af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 3028af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 3029af69d88dSmrg (cl_event*) event), 3030af69d88dSmrg __ENQUEUE_ACQUIRE_GL_ERR); 3031af69d88dSmrg } 3032af69d88dSmrg 3033af69d88dSmrg cl_int enqueueReleaseGLObjects( 3034af69d88dSmrg const VECTOR_CLASS<Memory>* mem_objects = NULL, 3035af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 3036af69d88dSmrg Event* event = NULL) const 3037af69d88dSmrg { 3038af69d88dSmrg return detail::errHandler( 3039af69d88dSmrg ::clEnqueueReleaseGLObjects( 3040af69d88dSmrg object_, 3041af69d88dSmrg (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, 3042af69d88dSmrg (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, 3043af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 3044af69d88dSmrg (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, 3045af69d88dSmrg (cl_event*) event), 3046af69d88dSmrg __ENQUEUE_RELEASE_GL_ERR); 3047af69d88dSmrg } 3048af69d88dSmrg 3049af69d88dSmrg#if defined (USE_DX_INTEROP) 3050af69d88dSmrgtypedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)( 3051af69d88dSmrg cl_command_queue command_queue, cl_uint num_objects, 3052af69d88dSmrg const cl_mem* mem_objects, cl_uint num_events_in_wait_list, 3053af69d88dSmrg const cl_event* event_wait_list, cl_event* event); 3054af69d88dSmrgtypedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( 3055af69d88dSmrg cl_command_queue command_queue, cl_uint num_objects, 3056af69d88dSmrg const cl_mem* mem_objects, cl_uint num_events_in_wait_list, 3057af69d88dSmrg const cl_event* event_wait_list, cl_event* event); 3058af69d88dSmrg 3059af69d88dSmrg cl_int enqueueAcquireD3D10Objects( 3060af69d88dSmrg const VECTOR_CLASS<Memory>* mem_objects = NULL, 3061af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 3062af69d88dSmrg Event* event = NULL) const 3063af69d88dSmrg { 3064af69d88dSmrg static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL; 3065af69d88dSmrg __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR); 3066af69d88dSmrg 3067af69d88dSmrg return detail::errHandler( 3068af69d88dSmrg pfn_clEnqueueAcquireD3D10ObjectsKHR( 3069af69d88dSmrg object_, 3070af69d88dSmrg (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, 3071af69d88dSmrg (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, 3072af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 3073af69d88dSmrg (events != NULL) ? (cl_event*) &events->front() : NULL, 3074af69d88dSmrg (cl_event*) event), 3075af69d88dSmrg __ENQUEUE_ACQUIRE_GL_ERR); 3076af69d88dSmrg } 3077af69d88dSmrg 3078af69d88dSmrg cl_int enqueueReleaseD3D10Objects( 3079af69d88dSmrg const VECTOR_CLASS<Memory>* mem_objects = NULL, 3080af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL, 3081af69d88dSmrg Event* event = NULL) const 3082af69d88dSmrg { 3083af69d88dSmrg static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL; 3084af69d88dSmrg __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR); 3085af69d88dSmrg 3086af69d88dSmrg return detail::errHandler( 3087af69d88dSmrg pfn_clEnqueueReleaseD3D10ObjectsKHR( 3088af69d88dSmrg object_, 3089af69d88dSmrg (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, 3090af69d88dSmrg (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, 3091af69d88dSmrg (events != NULL) ? (cl_uint) events->size() : 0, 3092af69d88dSmrg (events != NULL) ? (cl_event*) &events->front() : NULL, 3093af69d88dSmrg (cl_event*) event), 3094af69d88dSmrg __ENQUEUE_RELEASE_GL_ERR); 3095af69d88dSmrg } 3096af69d88dSmrg#endif 3097af69d88dSmrg 3098af69d88dSmrg cl_int enqueueBarrier() const 3099af69d88dSmrg { 3100af69d88dSmrg return detail::errHandler( 3101af69d88dSmrg ::clEnqueueBarrier(object_), 3102af69d88dSmrg __ENQUEUE_BARRIER_ERR); 3103af69d88dSmrg } 3104af69d88dSmrg 3105af69d88dSmrg cl_int flush() const 3106af69d88dSmrg { 3107af69d88dSmrg return detail::errHandler(::clFlush(object_), __FLUSH_ERR); 3108af69d88dSmrg } 3109af69d88dSmrg 3110af69d88dSmrg cl_int finish() const 3111af69d88dSmrg { 3112af69d88dSmrg return detail::errHandler(::clFinish(object_), __FINISH_ERR); 3113af69d88dSmrg } 3114af69d88dSmrg}; 3115af69d88dSmrg 3116af69d88dSmrg__GET_INFO_HELPER_WITH_RETAIN(cl::CommandQueue) 3117af69d88dSmrg 3118af69d88dSmrg/*! \class KernelFunctor 3119af69d88dSmrg * \brief Kernel functor interface 3120af69d88dSmrg * 3121af69d88dSmrg * \note Currently only functors of zero to ten arguments are supported. It 3122af69d88dSmrg * is straightforward to add more and a more general solution, similar to 3123af69d88dSmrg * Boost.Lambda could be followed if required in the future. 3124af69d88dSmrg */ 3125af69d88dSmrgclass KernelFunctor 3126af69d88dSmrg{ 3127af69d88dSmrgprivate: 3128af69d88dSmrg Kernel kernel_; 3129af69d88dSmrg CommandQueue queue_; 3130af69d88dSmrg NDRange offset_; 3131af69d88dSmrg NDRange global_; 3132af69d88dSmrg NDRange local_; 3133af69d88dSmrg 3134af69d88dSmrg cl_int err_; 3135af69d88dSmrgpublic: 3136af69d88dSmrg KernelFunctor() { } 3137af69d88dSmrg 3138af69d88dSmrg KernelFunctor( 3139af69d88dSmrg const Kernel& kernel, 3140af69d88dSmrg const CommandQueue& queue, 3141af69d88dSmrg const NDRange& offset, 3142af69d88dSmrg const NDRange& global, 3143af69d88dSmrg const NDRange& local) : 3144af69d88dSmrg kernel_(kernel), 3145af69d88dSmrg queue_(queue), 3146af69d88dSmrg offset_(offset), 3147af69d88dSmrg global_(global), 3148af69d88dSmrg local_(local), 3149af69d88dSmrg err_(CL_SUCCESS) 3150af69d88dSmrg {} 3151af69d88dSmrg 3152af69d88dSmrg KernelFunctor& operator=(const KernelFunctor& rhs); 3153af69d88dSmrg 3154af69d88dSmrg KernelFunctor(const KernelFunctor& rhs); 3155af69d88dSmrg 3156af69d88dSmrg cl_int getError() { return err_; } 3157af69d88dSmrg 3158af69d88dSmrg inline Event operator()(const VECTOR_CLASS<Event>* events = NULL); 3159af69d88dSmrg 3160af69d88dSmrg template<typename A1> 3161af69d88dSmrg inline Event operator()( 3162af69d88dSmrg const A1& a1, 3163af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3164af69d88dSmrg 3165af69d88dSmrg template<class A1, class A2> 3166af69d88dSmrg inline Event operator()( 3167af69d88dSmrg const A1& a1, 3168af69d88dSmrg const A2& a2, 3169af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3170af69d88dSmrg 3171af69d88dSmrg template<class A1, class A2, class A3> 3172af69d88dSmrg inline Event operator()( 3173af69d88dSmrg const A1& a1, 3174af69d88dSmrg const A2& a2, 3175af69d88dSmrg const A3& a3, 3176af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3177af69d88dSmrg 3178af69d88dSmrg template<class A1, class A2, class A3, class A4> 3179af69d88dSmrg inline Event operator()( 3180af69d88dSmrg const A1& a1, 3181af69d88dSmrg const A2& a2, 3182af69d88dSmrg const A3& a3, 3183af69d88dSmrg const A4& a4, 3184af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3185af69d88dSmrg 3186af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5> 3187af69d88dSmrg inline Event operator()( 3188af69d88dSmrg const A1& a1, 3189af69d88dSmrg const A2& a2, 3190af69d88dSmrg const A3& a3, 3191af69d88dSmrg const A4& a4, 3192af69d88dSmrg const A5& a5, 3193af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3194af69d88dSmrg 3195af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, class A6> 3196af69d88dSmrg inline Event operator()( 3197af69d88dSmrg const A1& a1, 3198af69d88dSmrg const A2& a2, 3199af69d88dSmrg const A3& a3, 3200af69d88dSmrg const A4& a4, 3201af69d88dSmrg const A5& a5, 3202af69d88dSmrg const A6& a6, 3203af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3204af69d88dSmrg 3205af69d88dSmrg template<class A1, class A2, class A3, class A4, 3206af69d88dSmrg class A5, class A6, class A7> 3207af69d88dSmrg inline Event operator()( 3208af69d88dSmrg const A1& a1, 3209af69d88dSmrg const A2& a2, 3210af69d88dSmrg const A3& a3, 3211af69d88dSmrg const A4& a4, 3212af69d88dSmrg const A5& a5, 3213af69d88dSmrg const A6& a6, 3214af69d88dSmrg const A7& a7, 3215af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3216af69d88dSmrg 3217af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3218af69d88dSmrg class A6, class A7, class A8> 3219af69d88dSmrg inline Event operator()( 3220af69d88dSmrg const A1& a1, 3221af69d88dSmrg const A2& a2, 3222af69d88dSmrg const A3& a3, 3223af69d88dSmrg const A4& a4, 3224af69d88dSmrg const A5& a5, 3225af69d88dSmrg const A6& a6, 3226af69d88dSmrg const A7& a7, 3227af69d88dSmrg const A8& a8, 3228af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3229af69d88dSmrg 3230af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3231af69d88dSmrg class A6, class A7, class A8, class A9> 3232af69d88dSmrg inline Event operator()( 3233af69d88dSmrg const A1& a1, 3234af69d88dSmrg const A2& a2, 3235af69d88dSmrg const A3& a3, 3236af69d88dSmrg const A4& a4, 3237af69d88dSmrg const A5& a5, 3238af69d88dSmrg const A6& a6, 3239af69d88dSmrg const A7& a7, 3240af69d88dSmrg const A8& a8, 3241af69d88dSmrg const A9& a9, 3242af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3243af69d88dSmrg 3244af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3245af69d88dSmrg class A6, class A7, class A8, class A9, class A10> 3246af69d88dSmrg inline Event operator()( 3247af69d88dSmrg const A1& a1, 3248af69d88dSmrg const A2& a2, 3249af69d88dSmrg const A3& a3, 3250af69d88dSmrg const A4& a4, 3251af69d88dSmrg const A5& a5, 3252af69d88dSmrg const A6& a6, 3253af69d88dSmrg const A7& a7, 3254af69d88dSmrg const A8& a8, 3255af69d88dSmrg const A9& a9, 3256af69d88dSmrg const A10& a10, 3257af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3258af69d88dSmrg 3259af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3260af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3261af69d88dSmrg class A11> 3262af69d88dSmrg inline Event operator()( 3263af69d88dSmrg const A1& a1, 3264af69d88dSmrg const A2& a2, 3265af69d88dSmrg const A3& a3, 3266af69d88dSmrg const A4& a4, 3267af69d88dSmrg const A5& a5, 3268af69d88dSmrg const A6& a6, 3269af69d88dSmrg const A7& a7, 3270af69d88dSmrg const A8& a8, 3271af69d88dSmrg const A9& a9, 3272af69d88dSmrg const A10& a10, 3273af69d88dSmrg const A11& a11, 3274af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3275af69d88dSmrg 3276af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3277af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3278af69d88dSmrg class A11, class A12> 3279af69d88dSmrg inline Event operator()( 3280af69d88dSmrg const A1& a1, 3281af69d88dSmrg const A2& a2, 3282af69d88dSmrg const A3& a3, 3283af69d88dSmrg const A4& a4, 3284af69d88dSmrg const A5& a5, 3285af69d88dSmrg const A6& a6, 3286af69d88dSmrg const A7& a7, 3287af69d88dSmrg const A8& a8, 3288af69d88dSmrg const A9& a9, 3289af69d88dSmrg const A10& a10, 3290af69d88dSmrg const A11& a11, 3291af69d88dSmrg const A12& a12, 3292af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3293af69d88dSmrg 3294af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3295af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3296af69d88dSmrg class A11, class A12, class A13> 3297af69d88dSmrg inline Event operator()( 3298af69d88dSmrg const A1& a1, 3299af69d88dSmrg const A2& a2, 3300af69d88dSmrg const A3& a3, 3301af69d88dSmrg const A4& a4, 3302af69d88dSmrg const A5& a5, 3303af69d88dSmrg const A6& a6, 3304af69d88dSmrg const A7& a7, 3305af69d88dSmrg const A8& a8, 3306af69d88dSmrg const A9& a9, 3307af69d88dSmrg const A10& a10, 3308af69d88dSmrg const A11& a11, 3309af69d88dSmrg const A12& a12, 3310af69d88dSmrg const A13& a13, 3311af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3312af69d88dSmrg 3313af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3314af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3315af69d88dSmrg class A11, class A12, class A13, class A14> 3316af69d88dSmrg inline Event operator()( 3317af69d88dSmrg const A1& a1, 3318af69d88dSmrg const A2& a2, 3319af69d88dSmrg const A3& a3, 3320af69d88dSmrg const A4& a4, 3321af69d88dSmrg const A5& a5, 3322af69d88dSmrg const A6& a6, 3323af69d88dSmrg const A7& a7, 3324af69d88dSmrg const A8& a8, 3325af69d88dSmrg const A9& a9, 3326af69d88dSmrg const A10& a10, 3327af69d88dSmrg const A11& a11, 3328af69d88dSmrg const A12& a12, 3329af69d88dSmrg const A13& a13, 3330af69d88dSmrg const A14& a14, 3331af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3332af69d88dSmrg 3333af69d88dSmrg template<class A1, class A2, class A3, class A4, class A5, 3334af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3335af69d88dSmrg class A11, class A12, class A13, class A14, class A15> 3336af69d88dSmrg inline Event operator()( 3337af69d88dSmrg const A1& a1, 3338af69d88dSmrg const A2& a2, 3339af69d88dSmrg const A3& a3, 3340af69d88dSmrg const A4& a4, 3341af69d88dSmrg const A5& a5, 3342af69d88dSmrg const A6& a6, 3343af69d88dSmrg const A7& a7, 3344af69d88dSmrg const A8& a8, 3345af69d88dSmrg const A9& a9, 3346af69d88dSmrg const A10& a10, 3347af69d88dSmrg const A11& a11, 3348af69d88dSmrg const A12& a12, 3349af69d88dSmrg const A13& a13, 3350af69d88dSmrg const A14& a14, 3351af69d88dSmrg const A15& a15, 3352af69d88dSmrg const VECTOR_CLASS<Event>* events = NULL); 3353af69d88dSmrg}; 3354af69d88dSmrg 3355af69d88dSmrginline KernelFunctor Kernel::bind( 3356af69d88dSmrg const CommandQueue& queue, 3357af69d88dSmrg const NDRange& offset, 3358af69d88dSmrg const NDRange& global, 3359af69d88dSmrg const NDRange& local) 3360af69d88dSmrg{ 3361af69d88dSmrg return KernelFunctor(*this,queue,offset,global,local); 3362af69d88dSmrg} 3363af69d88dSmrg 3364af69d88dSmrginline KernelFunctor Kernel::bind( 3365af69d88dSmrg const CommandQueue& queue, 3366af69d88dSmrg const NDRange& global, 3367af69d88dSmrg const NDRange& local) 3368af69d88dSmrg{ 3369af69d88dSmrg return KernelFunctor(*this,queue,NullRange,global,local); 3370af69d88dSmrg} 3371af69d88dSmrg 3372af69d88dSmrginline KernelFunctor& KernelFunctor::operator=(const KernelFunctor& rhs) 3373af69d88dSmrg{ 3374af69d88dSmrg if (this == &rhs) { 3375af69d88dSmrg return *this; 3376af69d88dSmrg } 3377af69d88dSmrg 3378af69d88dSmrg kernel_ = rhs.kernel_; 3379af69d88dSmrg queue_ = rhs.queue_; 3380af69d88dSmrg offset_ = rhs.offset_; 3381af69d88dSmrg global_ = rhs.global_; 3382af69d88dSmrg local_ = rhs.local_; 3383af69d88dSmrg 3384af69d88dSmrg return *this; 3385af69d88dSmrg} 3386af69d88dSmrg 3387af69d88dSmrginline KernelFunctor::KernelFunctor(const KernelFunctor& rhs) : 3388af69d88dSmrg kernel_(rhs.kernel_), 3389af69d88dSmrg queue_(rhs.queue_), 3390af69d88dSmrg offset_(rhs.offset_), 3391af69d88dSmrg global_(rhs.global_), 3392af69d88dSmrg local_(rhs.local_) 3393af69d88dSmrg{ 3394af69d88dSmrg} 3395af69d88dSmrg 3396af69d88dSmrgEvent KernelFunctor::operator()(const VECTOR_CLASS<Event>* events) 3397af69d88dSmrg{ 3398af69d88dSmrg Event event; 3399af69d88dSmrg 3400af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3401af69d88dSmrg kernel_, 3402af69d88dSmrg offset_, 3403af69d88dSmrg global_, 3404af69d88dSmrg local_, 3405af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3406af69d88dSmrg &event); 3407af69d88dSmrg 3408af69d88dSmrg return event; 3409af69d88dSmrg} 3410af69d88dSmrg 3411af69d88dSmrgtemplate<typename A1> 3412af69d88dSmrgEvent KernelFunctor::operator()( 3413af69d88dSmrg const A1& a1, 3414af69d88dSmrg const VECTOR_CLASS<Event>* events) 3415af69d88dSmrg{ 3416af69d88dSmrg Event event; 3417af69d88dSmrg 3418af69d88dSmrg kernel_.setArg(0,a1); 3419af69d88dSmrg 3420af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3421af69d88dSmrg kernel_, 3422af69d88dSmrg offset_, 3423af69d88dSmrg global_, 3424af69d88dSmrg local_, 3425af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3426af69d88dSmrg &event); 3427af69d88dSmrg 3428af69d88dSmrg return event; 3429af69d88dSmrg} 3430af69d88dSmrg 3431af69d88dSmrgtemplate<typename A1, typename A2> 3432af69d88dSmrgEvent KernelFunctor::operator()( 3433af69d88dSmrg const A1& a1, 3434af69d88dSmrg const A2& a2, 3435af69d88dSmrg const VECTOR_CLASS<Event>* events) 3436af69d88dSmrg{ 3437af69d88dSmrg Event event; 3438af69d88dSmrg 3439af69d88dSmrg kernel_.setArg(0,a1); 3440af69d88dSmrg kernel_.setArg(1,a2); 3441af69d88dSmrg 3442af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3443af69d88dSmrg kernel_, 3444af69d88dSmrg offset_, 3445af69d88dSmrg global_, 3446af69d88dSmrg local_, 3447af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3448af69d88dSmrg &event); 3449af69d88dSmrg 3450af69d88dSmrg return event; 3451af69d88dSmrg} 3452af69d88dSmrg 3453af69d88dSmrgtemplate<typename A1, typename A2, typename A3> 3454af69d88dSmrgEvent KernelFunctor::operator()( 3455af69d88dSmrg const A1& a1, 3456af69d88dSmrg const A2& a2, 3457af69d88dSmrg const A3& a3, 3458af69d88dSmrg const VECTOR_CLASS<Event>* events) 3459af69d88dSmrg{ 3460af69d88dSmrg Event event; 3461af69d88dSmrg 3462af69d88dSmrg kernel_.setArg(0,a1); 3463af69d88dSmrg kernel_.setArg(1,a2); 3464af69d88dSmrg kernel_.setArg(2,a3); 3465af69d88dSmrg 3466af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3467af69d88dSmrg kernel_, 3468af69d88dSmrg offset_, 3469af69d88dSmrg global_, 3470af69d88dSmrg local_, 3471af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3472af69d88dSmrg &event); 3473af69d88dSmrg 3474af69d88dSmrg return event; 3475af69d88dSmrg} 3476af69d88dSmrg 3477af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4> 3478af69d88dSmrgEvent KernelFunctor::operator()( 3479af69d88dSmrg const A1& a1, 3480af69d88dSmrg const A2& a2, 3481af69d88dSmrg const A3& a3, 3482af69d88dSmrg const A4& a4, 3483af69d88dSmrg const VECTOR_CLASS<Event>* events) 3484af69d88dSmrg{ 3485af69d88dSmrg Event event; 3486af69d88dSmrg 3487af69d88dSmrg kernel_.setArg(0,a1); 3488af69d88dSmrg kernel_.setArg(1,a2); 3489af69d88dSmrg kernel_.setArg(2,a3); 3490af69d88dSmrg kernel_.setArg(3,a4); 3491af69d88dSmrg 3492af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3493af69d88dSmrg kernel_, 3494af69d88dSmrg offset_, 3495af69d88dSmrg global_, 3496af69d88dSmrg local_, 3497af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3498af69d88dSmrg &event); 3499af69d88dSmrg 3500af69d88dSmrg return event; 3501af69d88dSmrg} 3502af69d88dSmrg 3503af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4, typename A5> 3504af69d88dSmrgEvent KernelFunctor::operator()( 3505af69d88dSmrg const A1& a1, 3506af69d88dSmrg const A2& a2, 3507af69d88dSmrg const A3& a3, 3508af69d88dSmrg const A4& a4, 3509af69d88dSmrg const A5& a5, 3510af69d88dSmrg const VECTOR_CLASS<Event>* events) 3511af69d88dSmrg{ 3512af69d88dSmrg Event event; 3513af69d88dSmrg 3514af69d88dSmrg kernel_.setArg(0,a1); 3515af69d88dSmrg kernel_.setArg(1,a2); 3516af69d88dSmrg kernel_.setArg(2,a3); 3517af69d88dSmrg kernel_.setArg(3,a4); 3518af69d88dSmrg kernel_.setArg(4,a5); 3519af69d88dSmrg 3520af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3521af69d88dSmrg kernel_, 3522af69d88dSmrg offset_, 3523af69d88dSmrg global_, 3524af69d88dSmrg local_, 3525af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3526af69d88dSmrg &event); 3527af69d88dSmrg 3528af69d88dSmrg return event; 3529af69d88dSmrg} 3530af69d88dSmrg 3531af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4, typename A5, 3532af69d88dSmrg typename A6> 3533af69d88dSmrgEvent KernelFunctor::operator()( 3534af69d88dSmrg const A1& a1, 3535af69d88dSmrg const A2& a2, 3536af69d88dSmrg const A3& a3, 3537af69d88dSmrg const A4& a4, 3538af69d88dSmrg const A5& a5, 3539af69d88dSmrg const A6& a6, 3540af69d88dSmrg const VECTOR_CLASS<Event>* events) 3541af69d88dSmrg{ 3542af69d88dSmrg Event event; 3543af69d88dSmrg 3544af69d88dSmrg kernel_.setArg(0,a1); 3545af69d88dSmrg kernel_.setArg(1,a2); 3546af69d88dSmrg kernel_.setArg(2,a3); 3547af69d88dSmrg kernel_.setArg(3,a4); 3548af69d88dSmrg kernel_.setArg(4,a5); 3549af69d88dSmrg kernel_.setArg(5,a6); 3550af69d88dSmrg 3551af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3552af69d88dSmrg kernel_, 3553af69d88dSmrg offset_, 3554af69d88dSmrg global_, 3555af69d88dSmrg local_, 3556af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3557af69d88dSmrg &event); 3558af69d88dSmrg 3559af69d88dSmrg return event; 3560af69d88dSmrg} 3561af69d88dSmrg 3562af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4, 3563af69d88dSmrg typename A5, typename A6, typename A7> 3564af69d88dSmrgEvent KernelFunctor::operator()( 3565af69d88dSmrg const A1& a1, 3566af69d88dSmrg const A2& a2, 3567af69d88dSmrg const A3& a3, 3568af69d88dSmrg const A4& a4, 3569af69d88dSmrg const A5& a5, 3570af69d88dSmrg const A6& a6, 3571af69d88dSmrg const A7& a7, 3572af69d88dSmrg const VECTOR_CLASS<Event>* events) 3573af69d88dSmrg{ 3574af69d88dSmrg Event event; 3575af69d88dSmrg 3576af69d88dSmrg kernel_.setArg(0,a1); 3577af69d88dSmrg kernel_.setArg(1,a2); 3578af69d88dSmrg kernel_.setArg(2,a3); 3579af69d88dSmrg kernel_.setArg(3,a4); 3580af69d88dSmrg kernel_.setArg(4,a5); 3581af69d88dSmrg kernel_.setArg(5,a6); 3582af69d88dSmrg kernel_.setArg(6,a7); 3583af69d88dSmrg 3584af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3585af69d88dSmrg kernel_, 3586af69d88dSmrg offset_, 3587af69d88dSmrg global_, 3588af69d88dSmrg local_, 3589af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3590af69d88dSmrg &event); 3591af69d88dSmrg 3592af69d88dSmrg return event; 3593af69d88dSmrg} 3594af69d88dSmrg 3595af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4, typename A5, 3596af69d88dSmrg typename A6, typename A7, typename A8> 3597af69d88dSmrgEvent KernelFunctor::operator()( 3598af69d88dSmrg const A1& a1, 3599af69d88dSmrg const A2& a2, 3600af69d88dSmrg const A3& a3, 3601af69d88dSmrg const A4& a4, 3602af69d88dSmrg const A5& a5, 3603af69d88dSmrg const A6& a6, 3604af69d88dSmrg const A7& a7, 3605af69d88dSmrg const A8& a8, 3606af69d88dSmrg const VECTOR_CLASS<Event>* events) 3607af69d88dSmrg{ 3608af69d88dSmrg Event event; 3609af69d88dSmrg 3610af69d88dSmrg kernel_.setArg(0,a1); 3611af69d88dSmrg kernel_.setArg(1,a2); 3612af69d88dSmrg kernel_.setArg(2,a3); 3613af69d88dSmrg kernel_.setArg(3,a4); 3614af69d88dSmrg kernel_.setArg(4,a5); 3615af69d88dSmrg kernel_.setArg(5,a6); 3616af69d88dSmrg kernel_.setArg(6,a7); 3617af69d88dSmrg kernel_.setArg(7,a8); 3618af69d88dSmrg 3619af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3620af69d88dSmrg kernel_, 3621af69d88dSmrg offset_, 3622af69d88dSmrg global_, 3623af69d88dSmrg local_, 3624af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3625af69d88dSmrg &event); 3626af69d88dSmrg 3627af69d88dSmrg return event; 3628af69d88dSmrg} 3629af69d88dSmrg 3630af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4, typename A5, 3631af69d88dSmrg typename A6, typename A7, typename A8, typename A9> 3632af69d88dSmrgEvent KernelFunctor::operator()( 3633af69d88dSmrg const A1& a1, 3634af69d88dSmrg const A2& a2, 3635af69d88dSmrg const A3& a3, 3636af69d88dSmrg const A4& a4, 3637af69d88dSmrg const A5& a5, 3638af69d88dSmrg const A6& a6, 3639af69d88dSmrg const A7& a7, 3640af69d88dSmrg const A8& a8, 3641af69d88dSmrg const A9& a9, 3642af69d88dSmrg const VECTOR_CLASS<Event>* events) 3643af69d88dSmrg{ 3644af69d88dSmrg Event event; 3645af69d88dSmrg 3646af69d88dSmrg kernel_.setArg(0,a1); 3647af69d88dSmrg kernel_.setArg(1,a2); 3648af69d88dSmrg kernel_.setArg(2,a3); 3649af69d88dSmrg kernel_.setArg(3,a4); 3650af69d88dSmrg kernel_.setArg(4,a5); 3651af69d88dSmrg kernel_.setArg(5,a6); 3652af69d88dSmrg kernel_.setArg(6,a7); 3653af69d88dSmrg kernel_.setArg(7,a8); 3654af69d88dSmrg kernel_.setArg(8,a9); 3655af69d88dSmrg 3656af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3657af69d88dSmrg kernel_, 3658af69d88dSmrg offset_, 3659af69d88dSmrg global_, 3660af69d88dSmrg local_, 3661af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3662af69d88dSmrg &event); 3663af69d88dSmrg 3664af69d88dSmrg return event; 3665af69d88dSmrg} 3666af69d88dSmrg 3667af69d88dSmrgtemplate<typename A1, typename A2, typename A3, typename A4, typename A5, 3668af69d88dSmrg typename A6, typename A7, typename A8, typename A9, typename A10> 3669af69d88dSmrgEvent KernelFunctor::operator()( 3670af69d88dSmrg const A1& a1, 3671af69d88dSmrg const A2& a2, 3672af69d88dSmrg const A3& a3, 3673af69d88dSmrg const A4& a4, 3674af69d88dSmrg const A5& a5, 3675af69d88dSmrg const A6& a6, 3676af69d88dSmrg const A7& a7, 3677af69d88dSmrg const A8& a8, 3678af69d88dSmrg const A9& a9, 3679af69d88dSmrg const A10& a10, 3680af69d88dSmrg const VECTOR_CLASS<Event>* events) 3681af69d88dSmrg{ 3682af69d88dSmrg Event event; 3683af69d88dSmrg 3684af69d88dSmrg kernel_.setArg(0,a1); 3685af69d88dSmrg kernel_.setArg(1,a2); 3686af69d88dSmrg kernel_.setArg(2,a3); 3687af69d88dSmrg kernel_.setArg(3,a4); 3688af69d88dSmrg kernel_.setArg(4,a5); 3689af69d88dSmrg kernel_.setArg(5,a6); 3690af69d88dSmrg kernel_.setArg(6,a7); 3691af69d88dSmrg kernel_.setArg(7,a8); 3692af69d88dSmrg kernel_.setArg(8,a9); 3693af69d88dSmrg kernel_.setArg(9,a10); 3694af69d88dSmrg 3695af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3696af69d88dSmrg kernel_, 3697af69d88dSmrg offset_, 3698af69d88dSmrg global_, 3699af69d88dSmrg local_, 3700af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3701af69d88dSmrg &event); 3702af69d88dSmrg 3703af69d88dSmrg return event; 3704af69d88dSmrg} 3705af69d88dSmrg 3706af69d88dSmrgtemplate<class A1, class A2, class A3, class A4, class A5, 3707af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3708af69d88dSmrg class A11> 3709af69d88dSmrgEvent KernelFunctor::operator()( 3710af69d88dSmrg const A1& a1, 3711af69d88dSmrg const A2& a2, 3712af69d88dSmrg const A3& a3, 3713af69d88dSmrg const A4& a4, 3714af69d88dSmrg const A5& a5, 3715af69d88dSmrg const A6& a6, 3716af69d88dSmrg const A7& a7, 3717af69d88dSmrg const A8& a8, 3718af69d88dSmrg const A9& a9, 3719af69d88dSmrg const A10& a10, 3720af69d88dSmrg const A11& a11, 3721af69d88dSmrg const VECTOR_CLASS<Event>* events) 3722af69d88dSmrg{ 3723af69d88dSmrg Event event; 3724af69d88dSmrg 3725af69d88dSmrg kernel_.setArg(0,a1); 3726af69d88dSmrg kernel_.setArg(1,a2); 3727af69d88dSmrg kernel_.setArg(2,a3); 3728af69d88dSmrg kernel_.setArg(3,a4); 3729af69d88dSmrg kernel_.setArg(4,a5); 3730af69d88dSmrg kernel_.setArg(5,a6); 3731af69d88dSmrg kernel_.setArg(6,a7); 3732af69d88dSmrg kernel_.setArg(7,a8); 3733af69d88dSmrg kernel_.setArg(8,a9); 3734af69d88dSmrg kernel_.setArg(9,a10); 3735af69d88dSmrg kernel_.setArg(10,a11); 3736af69d88dSmrg 3737af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3738af69d88dSmrg kernel_, 3739af69d88dSmrg offset_, 3740af69d88dSmrg global_, 3741af69d88dSmrg local_, 3742af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3743af69d88dSmrg &event); 3744af69d88dSmrg 3745af69d88dSmrg return event; 3746af69d88dSmrg} 3747af69d88dSmrg 3748af69d88dSmrgtemplate<class A1, class A2, class A3, class A4, class A5, 3749af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3750af69d88dSmrg class A11, class A12> 3751af69d88dSmrgEvent KernelFunctor::operator()( 3752af69d88dSmrg const A1& a1, 3753af69d88dSmrg const A2& a2, 3754af69d88dSmrg const A3& a3, 3755af69d88dSmrg const A4& a4, 3756af69d88dSmrg const A5& a5, 3757af69d88dSmrg const A6& a6, 3758af69d88dSmrg const A7& a7, 3759af69d88dSmrg const A8& a8, 3760af69d88dSmrg const A9& a9, 3761af69d88dSmrg const A10& a10, 3762af69d88dSmrg const A11& a11, 3763af69d88dSmrg const A12& a12, 3764af69d88dSmrg const VECTOR_CLASS<Event>* events) 3765af69d88dSmrg{ 3766af69d88dSmrg Event event; 3767af69d88dSmrg 3768af69d88dSmrg kernel_.setArg(0,a1); 3769af69d88dSmrg kernel_.setArg(1,a2); 3770af69d88dSmrg kernel_.setArg(2,a3); 3771af69d88dSmrg kernel_.setArg(3,a4); 3772af69d88dSmrg kernel_.setArg(4,a5); 3773af69d88dSmrg kernel_.setArg(5,a6); 3774af69d88dSmrg kernel_.setArg(6,a7); 3775af69d88dSmrg kernel_.setArg(7,a8); 3776af69d88dSmrg kernel_.setArg(8,a9); 3777af69d88dSmrg kernel_.setArg(9,a10); 3778af69d88dSmrg kernel_.setArg(10,a11); 3779af69d88dSmrg kernel_.setArg(11,a12); 3780af69d88dSmrg 3781af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3782af69d88dSmrg kernel_, 3783af69d88dSmrg offset_, 3784af69d88dSmrg global_, 3785af69d88dSmrg local_, 3786af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3787af69d88dSmrg &event); 3788af69d88dSmrg 3789af69d88dSmrg return event; 3790af69d88dSmrg} 3791af69d88dSmrg 3792af69d88dSmrgtemplate<class A1, class A2, class A3, class A4, class A5, 3793af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3794af69d88dSmrg class A11, class A12, class A13> 3795af69d88dSmrgEvent KernelFunctor::operator()( 3796af69d88dSmrg const A1& a1, 3797af69d88dSmrg const A2& a2, 3798af69d88dSmrg const A3& a3, 3799af69d88dSmrg const A4& a4, 3800af69d88dSmrg const A5& a5, 3801af69d88dSmrg const A6& a6, 3802af69d88dSmrg const A7& a7, 3803af69d88dSmrg const A8& a8, 3804af69d88dSmrg const A9& a9, 3805af69d88dSmrg const A10& a10, 3806af69d88dSmrg const A11& a11, 3807af69d88dSmrg const A12& a12, 3808af69d88dSmrg const A13& a13, 3809af69d88dSmrg const VECTOR_CLASS<Event>* events) 3810af69d88dSmrg{ 3811af69d88dSmrg Event event; 3812af69d88dSmrg 3813af69d88dSmrg kernel_.setArg(0,a1); 3814af69d88dSmrg kernel_.setArg(1,a2); 3815af69d88dSmrg kernel_.setArg(2,a3); 3816af69d88dSmrg kernel_.setArg(3,a4); 3817af69d88dSmrg kernel_.setArg(4,a5); 3818af69d88dSmrg kernel_.setArg(5,a6); 3819af69d88dSmrg kernel_.setArg(6,a7); 3820af69d88dSmrg kernel_.setArg(7,a8); 3821af69d88dSmrg kernel_.setArg(8,a9); 3822af69d88dSmrg kernel_.setArg(9,a10); 3823af69d88dSmrg kernel_.setArg(10,a11); 3824af69d88dSmrg kernel_.setArg(11,a12); 3825af69d88dSmrg kernel_.setArg(12,a13); 3826af69d88dSmrg 3827af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3828af69d88dSmrg kernel_, 3829af69d88dSmrg offset_, 3830af69d88dSmrg global_, 3831af69d88dSmrg local_, 3832af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3833af69d88dSmrg &event); 3834af69d88dSmrg 3835af69d88dSmrg return event; 3836af69d88dSmrg} 3837af69d88dSmrg 3838af69d88dSmrgtemplate<class A1, class A2, class A3, class A4, class A5, 3839af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3840af69d88dSmrg class A11, class A12, class A13, class A14> 3841af69d88dSmrgEvent KernelFunctor::operator()( 3842af69d88dSmrg const A1& a1, 3843af69d88dSmrg const A2& a2, 3844af69d88dSmrg const A3& a3, 3845af69d88dSmrg const A4& a4, 3846af69d88dSmrg const A5& a5, 3847af69d88dSmrg const A6& a6, 3848af69d88dSmrg const A7& a7, 3849af69d88dSmrg const A8& a8, 3850af69d88dSmrg const A9& a9, 3851af69d88dSmrg const A10& a10, 3852af69d88dSmrg const A11& a11, 3853af69d88dSmrg const A12& a12, 3854af69d88dSmrg const A13& a13, 3855af69d88dSmrg const A14& a14, 3856af69d88dSmrg const VECTOR_CLASS<Event>* events) 3857af69d88dSmrg{ 3858af69d88dSmrg Event event; 3859af69d88dSmrg 3860af69d88dSmrg kernel_.setArg(0,a1); 3861af69d88dSmrg kernel_.setArg(1,a2); 3862af69d88dSmrg kernel_.setArg(2,a3); 3863af69d88dSmrg kernel_.setArg(3,a4); 3864af69d88dSmrg kernel_.setArg(4,a5); 3865af69d88dSmrg kernel_.setArg(5,a6); 3866af69d88dSmrg kernel_.setArg(6,a7); 3867af69d88dSmrg kernel_.setArg(7,a8); 3868af69d88dSmrg kernel_.setArg(8,a9); 3869af69d88dSmrg kernel_.setArg(9,a10); 3870af69d88dSmrg kernel_.setArg(10,a11); 3871af69d88dSmrg kernel_.setArg(11,a12); 3872af69d88dSmrg kernel_.setArg(12,a13); 3873af69d88dSmrg kernel_.setArg(13,a14); 3874af69d88dSmrg 3875af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3876af69d88dSmrg kernel_, 3877af69d88dSmrg offset_, 3878af69d88dSmrg global_, 3879af69d88dSmrg local_, 3880af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3881af69d88dSmrg &event); 3882af69d88dSmrg 3883af69d88dSmrg return event; 3884af69d88dSmrg} 3885af69d88dSmrg 3886af69d88dSmrgtemplate<class A1, class A2, class A3, class A4, class A5, 3887af69d88dSmrg class A6, class A7, class A8, class A9, class A10, 3888af69d88dSmrg class A11, class A12, class A13, class A14, class A15> 3889af69d88dSmrgEvent KernelFunctor::operator()( 3890af69d88dSmrg const A1& a1, 3891af69d88dSmrg const A2& a2, 3892af69d88dSmrg const A3& a3, 3893af69d88dSmrg const A4& a4, 3894af69d88dSmrg const A5& a5, 3895af69d88dSmrg const A6& a6, 3896af69d88dSmrg const A7& a7, 3897af69d88dSmrg const A8& a8, 3898af69d88dSmrg const A9& a9, 3899af69d88dSmrg const A10& a10, 3900af69d88dSmrg const A11& a11, 3901af69d88dSmrg const A12& a12, 3902af69d88dSmrg const A13& a13, 3903af69d88dSmrg const A14& a14, 3904af69d88dSmrg const A15& a15, 3905af69d88dSmrg const VECTOR_CLASS<Event>* events) 3906af69d88dSmrg{ 3907af69d88dSmrg Event event; 3908af69d88dSmrg 3909af69d88dSmrg kernel_.setArg(0,a1); 3910af69d88dSmrg kernel_.setArg(1,a2); 3911af69d88dSmrg kernel_.setArg(2,a3); 3912af69d88dSmrg kernel_.setArg(3,a4); 3913af69d88dSmrg kernel_.setArg(4,a5); 3914af69d88dSmrg kernel_.setArg(5,a6); 3915af69d88dSmrg kernel_.setArg(6,a7); 3916af69d88dSmrg kernel_.setArg(7,a8); 3917af69d88dSmrg kernel_.setArg(8,a9); 3918af69d88dSmrg kernel_.setArg(9,a10); 3919af69d88dSmrg kernel_.setArg(10,a11); 3920af69d88dSmrg kernel_.setArg(11,a12); 3921af69d88dSmrg kernel_.setArg(12,a13); 3922af69d88dSmrg kernel_.setArg(13,a14); 3923af69d88dSmrg kernel_.setArg(14,a15); 3924af69d88dSmrg 3925af69d88dSmrg err_ = queue_.enqueueNDRangeKernel( 3926af69d88dSmrg kernel_, 3927af69d88dSmrg offset_, 3928af69d88dSmrg global_, 3929af69d88dSmrg local_, 3930af69d88dSmrg NULL, // bgaster_fixme - do we want to allow wait event lists? 3931af69d88dSmrg &event); 3932af69d88dSmrg 3933af69d88dSmrg return event; 3934af69d88dSmrg} 3935af69d88dSmrg 3936af69d88dSmrg#undef __ERR_STR 3937af69d88dSmrg#if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) 3938af69d88dSmrg#undef __GET_DEVICE_INFO_ERR 3939af69d88dSmrg#undef __GET_PLATFORM_INFO_ERR 3940af69d88dSmrg#undef __GET_DEVICE_IDS_ERR 3941af69d88dSmrg#undef __GET_CONTEXT_INFO_ERR 3942af69d88dSmrg#undef __GET_EVENT_INFO_ERR 3943af69d88dSmrg#undef __GET_EVENT_PROFILE_INFO_ERR 3944af69d88dSmrg#undef __GET_MEM_OBJECT_INFO_ERR 3945af69d88dSmrg#undef __GET_IMAGE_INFO_ERR 3946af69d88dSmrg#undef __GET_SAMPLER_INFO_ERR 3947af69d88dSmrg#undef __GET_KERNEL_INFO_ERR 3948af69d88dSmrg#undef __GET_KERNEL_WORK_GROUP_INFO_ERR 3949af69d88dSmrg#undef __GET_PROGRAM_INFO_ERR 3950af69d88dSmrg#undef __GET_PROGRAM_BUILD_INFO_ERR 3951af69d88dSmrg#undef __GET_COMMAND_QUEUE_INFO_ERR 3952af69d88dSmrg 3953af69d88dSmrg#undef __CREATE_CONTEXT_FROM_TYPE_ERR 3954af69d88dSmrg#undef __GET_SUPPORTED_IMAGE_FORMATS_ERR 3955af69d88dSmrg 3956af69d88dSmrg#undef __CREATE_BUFFER_ERR 3957af69d88dSmrg#undef __CREATE_SUBBUFFER_ERR 3958af69d88dSmrg#undef __CREATE_IMAGE2D_ERR 3959af69d88dSmrg#undef __CREATE_IMAGE3D_ERR 3960af69d88dSmrg#undef __CREATE_SAMPLER_ERR 3961af69d88dSmrg#undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR 3962af69d88dSmrg 3963af69d88dSmrg#undef __CREATE_USER_EVENT_ERR 3964af69d88dSmrg#undef __SET_USER_EVENT_STATUS_ERR 3965af69d88dSmrg#undef __SET_EVENT_CALLBACK_ERR 3966af69d88dSmrg 3967af69d88dSmrg#undef __WAIT_FOR_EVENTS_ERR 3968af69d88dSmrg 3969af69d88dSmrg#undef __CREATE_KERNEL_ERR 3970af69d88dSmrg#undef __SET_KERNEL_ARGS_ERR 3971af69d88dSmrg#undef __CREATE_PROGRAM_WITH_SOURCE_ERR 3972af69d88dSmrg#undef __CREATE_PROGRAM_WITH_BINARY_ERR 3973af69d88dSmrg#undef __BUILD_PROGRAM_ERR 3974af69d88dSmrg#undef __CREATE_KERNELS_IN_PROGRAM_ERR 3975af69d88dSmrg 3976af69d88dSmrg#undef __CREATE_COMMAND_QUEUE_ERR 3977af69d88dSmrg#undef __SET_COMMAND_QUEUE_PROPERTY_ERR 3978af69d88dSmrg#undef __ENQUEUE_READ_BUFFER_ERR 3979af69d88dSmrg#undef __ENQUEUE_WRITE_BUFFER_ERR 3980af69d88dSmrg#undef __ENQUEUE_READ_BUFFER_RECT_ERR 3981af69d88dSmrg#undef __ENQUEUE_WRITE_BUFFER_RECT_ERR 3982af69d88dSmrg#undef __ENQEUE_COPY_BUFFER_ERR 3983af69d88dSmrg#undef __ENQEUE_COPY_BUFFER_RECT_ERR 3984af69d88dSmrg#undef __ENQUEUE_READ_IMAGE_ERR 3985af69d88dSmrg#undef __ENQUEUE_WRITE_IMAGE_ERR 3986af69d88dSmrg#undef __ENQUEUE_COPY_IMAGE_ERR 3987af69d88dSmrg#undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR 3988af69d88dSmrg#undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR 3989af69d88dSmrg#undef __ENQUEUE_MAP_BUFFER_ERR 3990af69d88dSmrg#undef __ENQUEUE_MAP_IMAGE_ERR 3991af69d88dSmrg#undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR 3992af69d88dSmrg#undef __ENQUEUE_NDRANGE_KERNEL_ERR 3993af69d88dSmrg#undef __ENQUEUE_TASK_ERR 3994af69d88dSmrg#undef __ENQUEUE_NATIVE_KERNEL 3995af69d88dSmrg 3996af69d88dSmrg#undef __UNLOAD_COMPILER_ERR 3997af69d88dSmrg#endif //__CL_USER_OVERRIDE_ERROR_STRINGS 3998af69d88dSmrg 3999af69d88dSmrg#undef __GET_INFO_HELPER_WITH_RETAIN 4000af69d88dSmrg 4001af69d88dSmrg// Extensions 4002af69d88dSmrg#undef __INIT_CL_EXT_FCN_PTR 4003af69d88dSmrg#undef __CREATE_SUB_DEVICES 4004af69d88dSmrg 4005af69d88dSmrg#if defined(USE_CL_DEVICE_FISSION) 4006af69d88dSmrg#undef __PARAM_NAME_DEVICE_FISSION 4007af69d88dSmrg#endif // USE_CL_DEVICE_FISSION 4008af69d88dSmrg 4009af69d88dSmrg} // namespace cl 4010af69d88dSmrg 4011af69d88dSmrg#endif // CL_HPP_ 4012