2013-10-18 18:26:06 +00:00
/*******************************************************************************
2019-06-24 09:25:18 +00:00
* Copyright ( c ) 2008 - 2015 The Khronos Group Inc .
2013-10-18 18:26:06 +00:00
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and / or associated documentation files ( the
* " Materials " ) , to deal in the Materials without restriction , including
* without limitation the rights to use , copy , modify , merge , publish ,
* distribute , sublicense , and / or sell copies of the Materials , and to
* permit persons to whom the Materials are furnished to do so , subject to
* the following conditions :
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Materials .
*
* THE MATERIALS ARE PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT .
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT ,
* TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION WITH THE
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*! \file
*
2018-12-09 21:00:09 +00:00
* \ brief C + + bindings for OpenCL 1.0 ( rev 48 ) , OpenCL 1.1 ( rev 33 ) and
* OpenCL 1.2 ( rev 15 )
2013-10-18 18:26:06 +00:00
* \ author Benedict R . Gaster , Laurent Morichetti and Lee Howes
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Additions and fixes from :
2018-12-09 21:00:09 +00:00
* Brian Cole , March 3 rd 2010 and April 2012
2013-10-18 18:26:06 +00:00
* Matt Gruenke , April 2012.
* Bruce Merry , February 2013.
2019-06-24 09:25:18 +00:00
* Tom Deakin and Simon McIntosh - Smith , July 2013
2018-12-09 21:00:09 +00:00
*
2019-06-24 09:25:18 +00:00
* \ version 1.2 .8
* \ date October 2015
2013-10-18 18:26:06 +00:00
*
* Optional extension support
*
* cl
* cl_ext_device_fission
2019-10-05 01:16:31 +00:00
* # define USE_CL_DEVICE_FISSION
2013-10-18 18:26:06 +00:00
*/
/*! \mainpage
* \ section intro Introduction
* For many large applications C + + is the language of choice and so it seems
* reasonable to define C + + bindings for OpenCL .
*
*
* The interface is contained with a single C + + header file \ em cl . hpp and all
* definitions are contained within the namespace \ em cl . There is no additional
* requirement to include \ em cl . h and to use either the C + + or original C
* bindings it is enough to simply include \ em cl . hpp .
*
* The bindings themselves are lightweight and correspond closely to the
* underlying C API . Using the C + + bindings introduces no additional execution
* overhead .
*
* For detail documentation on the bindings see :
*
* The OpenCL C + + Wrapper API 1.2 ( revision 09 )
2020-02-05 20:24:46 +00:00
* https : //www.khronos.org/registry/OpenCL/specs/opencl-cplusplus-1.2.pdf
2013-10-18 18:26:06 +00:00
*
* \ section example Example
*
* The following example shows a general use case for the C + +
* bindings , including support for the optional exception feature and
* also the supplied vector and string classes , see following sections for
2019-06-24 09:25:18 +00:00
* decriptions of these features .
2013-10-18 18:26:06 +00:00
*
* \ code
* # define __CL_ENABLE_EXCEPTIONS
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* # if defined ( __APPLE__ ) | | defined ( __MACOSX )
* # include < OpenCL / cl . hpp >
* # else
* # include < CL / cl . hpp >
* # endif
* # include < cstdio >
* # include < cstdlib >
* # include < iostream >
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* const char * helloStr = " __kernel void "
* " hello(void) "
* " { "
* " "
* " } " ;
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* int
* main ( void )
* {
* cl_int err = CL_SUCCESS ;
* try {
*
* std : : vector < cl : : Platform > platforms ;
* cl : : Platform : : get ( & platforms ) ;
* if ( platforms . size ( ) = = 0 ) {
* std : : cout < < " Platform size 0 \n " ;
* return - 1 ;
* }
*
2018-12-09 21:00:09 +00:00
* cl_context_properties properties [ ] =
2013-10-18 18:26:06 +00:00
* { CL_CONTEXT_PLATFORM , ( cl_context_properties ) ( platforms [ 0 ] ) ( ) , 0 } ;
2018-12-09 21:00:09 +00:00
* cl : : Context context ( CL_DEVICE_TYPE_CPU , properties ) ;
*
2013-10-18 18:26:06 +00:00
* std : : vector < cl : : Device > devices = context . getInfo < CL_CONTEXT_DEVICES > ( ) ;
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* cl : : Program : : Sources source ( 1 ,
* std : : make_pair ( helloStr , strlen ( helloStr ) ) ) ;
* cl : : Program program_ = cl : : Program ( context , source ) ;
* program_ . build ( devices ) ;
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* cl : : Kernel kernel ( program_ , " hello " , & err ) ;
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* cl : : Event event ;
* cl : : CommandQueue queue ( context , devices [ 0 ] , 0 , & err ) ;
* queue . enqueueNDRangeKernel (
2018-12-09 21:00:09 +00:00
* kernel ,
* cl : : NullRange ,
2013-10-18 18:26:06 +00:00
* cl : : NDRange ( 4 , 4 ) ,
* cl : : NullRange ,
2019-06-24 17:25:51 +00:00
* nullptr ,
2018-12-09 21:00:09 +00:00
* & event ) ;
*
2013-10-18 18:26:06 +00:00
* event . wait ( ) ;
* }
* catch ( cl : : Error err ) {
2018-12-09 21:00:09 +00:00
* std : : cerr
2013-10-18 18:26:06 +00:00
* < < " ERROR: "
* < < err . what ( )
* < < " ( "
* < < err . err ( )
* < < " ) "
* < < std : : endl ;
* }
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* return EXIT_SUCCESS ;
* }
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ endcode
*
*/
# ifndef CL_HPP_
# define CL_HPP_
# ifdef _WIN32
2018-12-09 21:00:09 +00:00
# include <malloc.h>
2013-10-18 18:26:06 +00:00
# if defined(USE_DX_INTEROP)
# include <CL/cl_d3d10.h>
# include <CL/cl_dx9_media_sharing.h>
# endif
2018-03-25 17:47:28 +00:00
# endif // _WIN32
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
# if defined(_MSC_VER)
# include <intrin.h>
# endif // _MSC_VER
2018-03-25 17:47:28 +00:00
//
2013-10-18 18:26:06 +00:00
# if defined(USE_CL_DEVICE_FISSION)
# include <CL/cl_ext.h>
# endif
# if defined(__APPLE__) || defined(__MACOSX)
2019-06-24 09:25:18 +00:00
# define CL_SILENCE_DEPRECATION
2013-10-18 18:26:06 +00:00
# include <OpenCL/opencl.h>
# else
# include <CL/opencl.h>
2018-03-25 17:47:28 +00:00
# endif // !__APPLE__
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
# if (_MSC_VER >= 1700) || (__cplusplus >= 201103L)
# define CL_HPP_RVALUE_REFERENCES_SUPPORTED
# define CL_HPP_CPP11_ATOMICS_SUPPORTED
# include <atomic>
# endif
# if (__cplusplus >= 201103L)
# define CL_HPP_NOEXCEPT noexcept
# else
# define CL_HPP_NOEXCEPT
# endif
2013-10-18 18:26:06 +00:00
// To avoid accidentally taking ownership of core OpenCL types
// such as cl_kernel constructors are made explicit
// under OpenCL 1.2
# if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
# define __CL_EXPLICIT_CONSTRUCTORS explicit
2018-03-25 17:47:28 +00:00
# else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
# define __CL_EXPLICIT_CONSTRUCTORS
# endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
2013-10-18 18:26:06 +00:00
// Define deprecated prefixes and suffixes to ensure compilation
// in case they are not pre-defined
# if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
2018-03-25 17:47:28 +00:00
# define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
# endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
2013-10-18 18:26:06 +00:00
# if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED)
# define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
2018-03-25 17:47:28 +00:00
# endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
2013-10-18 18:26:06 +00:00
# if !defined(CL_CALLBACK)
# define CL_CALLBACK
2018-03-25 17:47:28 +00:00
# endif //CL_CALLBACK
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
# include <iterator>
2013-10-18 18:26:06 +00:00
# include <limits>
2018-12-09 21:00:09 +00:00
# include <utility>
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
# if defined(__CL_ENABLE_EXCEPTIONS)
# include <exception>
# endif // #if defined(__CL_ENABLE_EXCEPTIONS)
2013-10-18 18:26:06 +00:00
# if !defined(__NO_STD_VECTOR)
# include <vector>
# endif
# if !defined(__NO_STD_STRING)
# include <string>
2018-03-25 17:47:28 +00:00
# endif
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
# if defined(__ANDROID__) || defined(linux) || defined(__APPLE__) || defined(__MACOSX)
2013-10-18 18:26:06 +00:00
# include <alloca.h>
2018-03-25 17:47:28 +00:00
# endif // linux
2013-10-18 18:26:06 +00:00
# include <cstring>
/*! \namespace cl
*
* \ brief The OpenCL C + + bindings are defined within this namespace .
*
*/
2018-03-25 17:47:28 +00:00
namespace cl
{
2013-10-18 18:26:06 +00:00
class Memory ;
/**
* Deprecated APIs for 1.2
*/
2018-03-25 17:47:28 +00:00
# if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
# define __INIT_CL_EXT_FCN_PTR(name) \
if ( ! pfn_ # # name ) \
{ \
pfn_ # # name = ( PFN_ # # name ) \
clGetExtensionFunctionAddress ( # name ) ; \
if ( ! pfn_ # # name ) \
{ \
} \
}
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \
if ( ! pfn_ # # name ) \
{ \
pfn_ # # name = ( PFN_ # # name ) \
clGetExtensionFunctionAddressForPlatform ( platform , # name ) ; \
if ( ! pfn_ # # name ) \
{ \
} \
}
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
class Program ;
class Device ;
class Context ;
class CommandQueue ;
class Memory ;
class Buffer ;
# if defined(__CL_ENABLE_EXCEPTIONS)
2018-12-09 21:00:09 +00:00
/*! \brief Exception class
*
2013-10-18 18:26:06 +00:00
* This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined .
*/
class Error : public std : : exception
{
private :
cl_int err_ ;
2018-03-25 17:47:28 +00:00
const char * errStr_ ;
2013-10-18 18:26:06 +00:00
public :
/*! \brief Create a new CL error exception for a given error code
* and corresponding message .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ param err error code value .
*
* \ param errStr a descriptive string that must remain in scope until
* handling of the exception has concluded . If set , it
* will be returned by what ( ) .
*/
2019-06-24 17:25:51 +00:00
Error ( cl_int err , const char * errStr = nullptr ) : err_ ( err ) , errStr_ ( errStr )
2018-03-25 17:47:28 +00:00
{
}
2013-10-18 18:26:06 +00:00
~ Error ( ) throw ( ) { }
/*! \brief Get error string associated with exception
*
* \ return A memory pointer to the error message string .
*/
2018-03-25 17:47:28 +00:00
virtual const char * what ( ) const throw ( )
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
if ( errStr_ = = nullptr )
2018-03-25 17:47:28 +00:00
{
return " empty " ;
}
else
{
return errStr_ ;
}
2013-10-18 18:26:06 +00:00
}
/*! \brief Get error code associated with exception
*
* \ return The error code .
*/
cl_int err ( void ) const { return err_ ; }
} ;
# define __ERR_STR(x) #x
# else
2019-06-24 17:25:51 +00:00
# define __ERR_STR(x) nullptr
2018-03-25 17:47:28 +00:00
# endif // __CL_ENABLE_EXCEPTIONS
2013-10-18 18:26:06 +00:00
namespace detail
{
# if defined(__CL_ENABLE_EXCEPTIONS)
2018-03-25 17:47:28 +00:00
static inline cl_int errHandler (
2013-10-18 18:26:06 +00:00
cl_int err ,
2019-06-24 17:25:51 +00:00
const char * errStr = nullptr )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
throw Error ( err , errStr ) ;
}
2013-10-18 18:26:06 +00:00
return err ;
}
# else
2019-06-24 17:25:51 +00:00
static inline cl_int errHandler ( cl_int err , const char * errStr = nullptr )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
( void ) errStr ; // suppress unused variable warning
2013-10-18 18:26:06 +00:00
return err ;
}
2018-03-25 17:47:28 +00:00
# endif // __CL_ENABLE_EXCEPTIONS
} // namespace detail
2013-10-18 18:26:06 +00:00
//! \cond DOXYGEN_DETAIL
# if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
2018-03-25 17:47:28 +00:00
# define __GET_DEVICE_INFO_ERR __ERR_STR(clGetDeviceInfo)
# define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo)
# define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs)
# define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs)
# define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo)
# define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo)
# define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo)
# define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo)
# define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo)
# define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo)
# define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __GET_KERNEL_ARG_INFO_ERR __ERR_STR(clGetKernelArgInfo)
# endif // #if defined(CL_VERSION_1_2)
# define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo)
# define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo)
# define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo)
# define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo)
# define __CREATE_CONTEXT_ERR __ERR_STR(clCreateContext)
# define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType)
# define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats)
# define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer)
# define __COPY_ERR __ERR_STR(cl::copy)
# define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer)
# define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)
# define __CREATE_GL_RENDER_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer)
# define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __CREATE_IMAGE_ERR __ERR_STR(clCreateImage)
# define __CREATE_GL_TEXTURE_ERR __ERR_STR(clCreateFromGLTexture)
# define __IMAGE_DIMENSION_ERR __ERR_STR(Incorrect image dimensions)
# endif // #if defined(CL_VERSION_1_2)
# define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler)
2013-10-18 18:26:06 +00:00
# define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback)
2018-03-25 17:47:28 +00:00
# define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent)
# define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus)
# define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback)
# define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents)
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
# define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel)
# define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg)
# define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource)
# define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR __ERR_STR(clCreateProgramWithBuiltInKernels)
# endif // #if defined(CL_VERSION_1_2)
# define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram)
2019-06-24 09:25:18 +00:00
# define __LINK_PROGRAM_ERR __ERR_STR(clLinkProgram)
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
# define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram)
# define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue)
# define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty)
# define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer)
# define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect)
# define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer)
# define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect)
# define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer)
# define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect)
# define __ENQUEUE_FILL_BUFFER_ERR __ERR_STR(clEnqueueFillBuffer)
# define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage)
# define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage)
# define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage)
# define __ENQUEUE_FILL_IMAGE_ERR __ERR_STR(clEnqueueFillImage)
# define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer)
# define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage)
# define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer)
# define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage)
# define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject)
# define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel)
# define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask)
# define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR __ERR_STR(clEnqueueMigrateMemObjects)
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
# define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects)
# define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects)
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
# define __RETAIN_ERR __ERR_STR(Retain Object)
# define __RELEASE_ERR __ERR_STR(Release Object)
# define __FLUSH_ERR __ERR_STR(clFlush)
# define __FINISH_ERR __ERR_STR(clFinish)
# define __VECTOR_CAPACITY_ERR __ERR_STR(Vector capacity error)
2013-10-18 18:26:06 +00:00
/**
* CL 1.2 version that uses device fission .
*/
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevices)
2013-10-18 18:26:06 +00:00
# else
2018-03-25 17:47:28 +00:00
# define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT)
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
/**
* Deprecated APIs for 1.2
*/
2018-03-25 17:47:28 +00:00
# if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
# define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker)
# define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents)
# define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier)
# define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler)
# define __CREATE_GL_TEXTURE_2D_ERR __ERR_STR(clCreateFromGLTexture2D)
# define __CREATE_GL_TEXTURE_3D_ERR __ERR_STR(clCreateFromGLTexture3D)
# define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D)
# define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D)
# endif // #if defined(CL_VERSION_1_1)
# endif // __CL_USER_OVERRIDE_ERROR_STRINGS
2013-10-18 18:26:06 +00:00
//! \endcond
/**
* CL 1.2 marker and barrier commands
*/
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __ENQUEUE_MARKER_WAIT_LIST_ERR __ERR_STR(clEnqueueMarkerWithWaitList)
# define __ENQUEUE_BARRIER_WAIT_LIST_ERR __ERR_STR(clEnqueueBarrierWithWaitList)
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
# if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING)
typedef std : : string STRING_CLASS ;
2018-03-25 17:47:28 +00:00
# elif !defined(__USE_DEV_STRING)
2013-10-18 18:26:06 +00:00
/*! \class string
* \ brief Simple string class , that provides a limited subset of std : : string
* functionality but avoids many of the issues that come with that class .
2018-12-09 21:00:09 +00:00
2013-10-18 18:26:06 +00:00
* \ note Deprecated . Please use std : : string as default or
* re - define the string class to match the std : : string
* interface by defining STRING_CLASS
*/
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
{
private :
: : size_t size_ ;
2018-03-25 17:47:28 +00:00
char * str_ ;
2013-10-18 18:26:06 +00:00
public :
//! \brief Constructs an empty string, allocating no memory.
2019-06-24 17:25:51 +00:00
string ( void ) : size_ ( 0 ) , str_ ( nullptr )
2013-10-18 18:26:06 +00:00
{
}
/*! \brief Constructs a string populated from an arbitrary value of
* specified size .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* An extra ' \0 ' is added , in case none was contained in str .
*
2018-12-09 21:00:09 +00:00
* \ param str the initial value of the string instance . Note that ' \0 '
2019-06-24 17:25:51 +00:00
* characters receive no special treatment . If nullptr ,
2013-10-18 18:26:06 +00:00
* the string is left empty , with a size of 0.
*
* \ param size the number of characters to copy from str .
*/
2018-03-25 17:47:28 +00:00
string ( const char * str , : : size_t size ) : size_ ( size ) ,
2019-06-24 17:25:51 +00:00
str_ ( nullptr )
2018-03-25 17:47:28 +00:00
{
if ( size > 0 )
{
str_ = new char [ size_ + 1 ] ;
2019-06-24 17:25:51 +00:00
if ( str_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
memcpy ( str_ , str , size_ * sizeof ( char ) ) ;
str_ [ size_ ] = ' \0 ' ;
}
else
{
size_ = 0 ;
}
2013-10-18 18:26:06 +00:00
}
}
/*! \brief Constructs a string populated from a null-terminated value.
*
* \ param str the null - terminated initial value of the string instance .
2019-06-24 17:25:51 +00:00
* If nullptr , the string is left empty , with a size of 0.
2013-10-18 18:26:06 +00:00
*/
2018-03-25 17:47:28 +00:00
string ( const char * str ) : size_ ( 0 ) ,
2019-06-24 17:25:51 +00:00
str_ ( nullptr )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
if ( str )
{
size_ = : : strlen ( str ) ;
}
if ( size_ > 0 )
{
str_ = new char [ size_ + 1 ] ;
2019-06-24 17:25:51 +00:00
if ( str_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
memcpy ( str_ , str , ( size_ + 1 ) * sizeof ( char ) ) ;
}
2013-10-18 18:26:06 +00:00
}
}
2018-03-25 17:47:28 +00:00
void resize ( : : size_t n )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
if ( size_ = = n )
{
return ;
}
if ( n = = 0 )
{
if ( str_ )
{
delete [ ] str_ ;
}
2019-06-24 17:25:51 +00:00
str_ = nullptr ;
2018-03-25 17:47:28 +00:00
size_ = 0 ;
}
else
{
char * newString = new char [ n + 1 ] ;
2019-06-24 09:25:18 +00:00
: : size_t copySize = n ;
2018-03-25 17:47:28 +00:00
if ( size_ < n )
{
copySize = size_ ;
}
size_ = n ;
if ( str_ )
{
memcpy ( newString , str_ , ( copySize + 1 ) * sizeof ( char ) ) ;
}
if ( copySize < size_ )
{
memset ( newString + copySize , 0 , size_ - copySize ) ;
}
newString [ size_ ] = ' \0 ' ;
delete [ ] str_ ;
str_ = newString ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
const char & operator [ ] ( : : size_t pos ) const
2013-10-18 18:26:06 +00:00
{
return str_ [ pos ] ;
}
2018-03-25 17:47:28 +00:00
char & operator [ ] ( : : size_t pos )
2013-10-18 18:26:06 +00:00
{
return str_ [ pos ] ;
}
/*! \brief Copies the value of another string to this one.
*
* \ param rhs the string to copy .
*
* \ returns a reference to the modified instance .
*/
string & operator = ( const string & rhs )
{
2018-03-25 17:47:28 +00:00
if ( this = = & rhs )
{
return * this ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( str_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
delete [ ] str_ ;
2019-06-24 17:25:51 +00:00
str_ = nullptr ;
2018-03-25 17:47:28 +00:00
size_ = 0 ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( rhs . size_ = = 0 | | rhs . str_ = = nullptr )
2018-03-25 17:47:28 +00:00
{
2019-06-24 17:25:51 +00:00
str_ = nullptr ;
2013-10-18 18:26:06 +00:00
size_ = 0 ;
}
2018-03-25 17:47:28 +00:00
else
{
str_ = new char [ rhs . size_ + 1 ] ;
size_ = rhs . size_ ;
2019-06-24 17:25:51 +00:00
if ( str_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
memcpy ( str_ , rhs . str_ , ( size_ + 1 ) * sizeof ( char ) ) ;
}
else
{
size_ = 0 ;
}
}
2013-10-18 18:26:06 +00:00
return * this ;
}
/*! \brief Constructs a string by copying the value of another instance.
*
* \ param rhs the string to copy .
*/
2018-03-25 17:47:28 +00:00
string ( const string & rhs ) : size_ ( 0 ) ,
2019-06-24 17:25:51 +00:00
str_ ( nullptr )
2013-10-18 18:26:06 +00:00
{
* this = rhs ;
}
//! \brief Destructor - frees memory used to hold the current value.
~ string ( )
{
delete [ ] str_ ;
2019-06-24 17:25:51 +00:00
str_ = nullptr ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
//! \brief Queries the length of the string, excluding any added '\0's.
2018-03-25 17:47:28 +00:00
: : size_t size ( void ) const { return size_ ; }
2013-10-18 18:26:06 +00:00
//! \brief Queries the length of the string, excluding any added '\0's.
: : size_t length ( void ) const { return size ( ) ; }
/*! \brief Returns a pointer to the private copy held by this instance,
* or " " if empty / unset .
*/
2018-03-25 17:47:28 +00:00
const char * c_str ( void ) const { return ( str_ ) ? str_ : " " ; }
2013-10-18 18:26:06 +00:00
} ;
typedef cl : : string STRING_CLASS ;
2018-03-25 17:47:28 +00:00
# endif // #elif !defined(__USE_DEV_STRING)
2013-10-18 18:26:06 +00:00
# if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
# define VECTOR_CLASS std::vector
2018-03-25 17:47:28 +00:00
# elif !defined(__USE_DEV_VECTOR)
# define VECTOR_CLASS cl::vector
2013-10-18 18:26:06 +00:00
# if !defined(__MAX_DEFAULT_VECTOR_SIZE)
# define __MAX_DEFAULT_VECTOR_SIZE 10
# endif
/*! \class vector
2018-12-09 21:00:09 +00:00
* \ brief Fixed sized vector implementation that mirroring
2013-10-18 18:26:06 +00:00
*
* \ note Deprecated . Please use std : : vector as default or
* re - define the vector class to match the std : : vector
* interface by defining VECTOR_CLASS
* \ note Not recommended for use with custom objects as
* current implementation will construct N elements
*
* std : : vector functionality .
* \ brief Fixed sized vector compatible with std : : vector .
*
* \ note
* This differs from std : : vector < > not just in memory allocation ,
* but also in terms of when members are constructed , destroyed ,
* and assigned instead of being copy constructed .
*
* \ param T type of element contained in the vector .
*
* \ param N maximum size of the vector .
*/
template < typename T , unsigned int N = __MAX_DEFAULT_VECTOR_SIZE >
2019-06-24 09:25:18 +00:00
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector
2013-10-18 18:26:06 +00:00
{
private :
T data_ [ N ] ;
unsigned int size_ ;
public :
//! \brief Constructs an empty vector with no memory allocated.
2018-03-25 17:47:28 +00:00
vector ( ) : size_ ( static_cast < unsigned int > ( 0 ) )
{
}
2013-10-18 18:26:06 +00:00
//! \brief Deallocates the vector's memory and destroys all of its elements.
2018-03-25 17:47:28 +00:00
~ vector ( )
2013-10-18 18:26:06 +00:00
{
clear ( ) ;
}
//! \brief Returns the number of elements currently contained.
unsigned int size ( void ) const
{
return size_ ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
/*! \brief Empties the vector of all elements.
* \ note
* This does not deallocate memory but will invoke destructors
* on contained elements .
*/
void clear ( )
{
2018-03-25 17:47:28 +00:00
while ( ! empty ( ) )
{
pop_back ( ) ;
}
2013-10-18 18:26:06 +00:00
}
/*! \brief Appends an element after the last valid element.
2018-12-09 21:00:09 +00:00
* Calling this on a vector that has reached capacity will throw an
2013-10-18 18:26:06 +00:00
* exception if exceptions are enabled .
*/
2018-03-25 17:47:28 +00:00
void push_back ( const T & x )
{
if ( size ( ) < N )
{
new ( & data_ [ size_ ] ) T ( x ) ;
size_ + + ;
}
else
{
detail : : errHandler ( CL_MEM_OBJECT_ALLOCATION_FAILURE , __VECTOR_CAPACITY_ERR ) ;
}
2013-10-18 18:26:06 +00:00
}
/*! \brief Removes the last valid element from the vector.
* Calling this on an empty vector will throw an exception
* if exceptions are enabled .
*/
void pop_back ( void )
{
2018-03-25 17:47:28 +00:00
if ( size_ ! = 0 )
{
- - size_ ;
data_ [ size_ ] . ~ T ( ) ;
}
else
{
detail : : errHandler ( CL_MEM_OBJECT_ALLOCATION_FAILURE , __VECTOR_CAPACITY_ERR ) ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
/*! \brief Constructs with a value copied from another.
*
* \ param vec the vector to copy .
*/
2018-03-25 17:47:28 +00:00
vector ( const vector < T , N > & vec ) : size_ ( vec . size_ )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
if ( size_ ! = 0 )
{
assign ( vec . begin ( ) , vec . end ( ) ) ;
}
}
2013-10-18 18:26:06 +00:00
/*! \brief Constructs with a specified number of initial elements.
*
* \ param size number of initial elements .
*
* \ param val value of initial elements .
*/
2018-03-25 17:47:28 +00:00
vector ( unsigned int size , const T & val = T ( ) ) : size_ ( 0 )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
for ( unsigned int i = 0 ; i < size ; i + + )
{
push_back ( val ) ;
}
2013-10-18 18:26:06 +00:00
}
/*! \brief Overwrites the current content with that copied from another
* instance .
*
* \ param rhs vector to copy .
*
* \ returns a reference to this .
*/
vector < T , N > & operator = ( const vector < T , N > & rhs )
{
2018-03-25 17:47:28 +00:00
if ( this = = & rhs )
{
return * this ;
}
if ( rhs . size_ ! = 0 )
{
assign ( rhs . begin ( ) , rhs . end ( ) ) ;
}
else
{
clear ( ) ;
}
2013-10-18 18:26:06 +00:00
return * this ;
}
/*! \brief Tests equality against another instance.
*
* \ param vec the vector against which to compare .
*/
2018-03-25 17:47:28 +00:00
bool operator = = ( vector < T , N > & vec )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
if ( size ( ) ! = vec . size ( ) )
{
2013-10-18 18:26:06 +00:00
return false ;
}
2018-03-25 17:47:28 +00:00
for ( unsigned int i = 0 ; i < size ( ) ; + + i )
{
if ( operator [ ] ( i ) ! = vec [ i ] )
{
return false ;
}
}
2013-10-18 18:26:06 +00:00
return true ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
//! \brief Conversion operator to T*.
2018-03-25 17:47:28 +00:00
operator T * ( ) { return data_ ; }
2013-10-18 18:26:06 +00:00
//! \brief Conversion operator to const T*.
2018-03-25 17:47:28 +00:00
operator const T * ( ) const { return data_ ; }
2013-10-18 18:26:06 +00:00
//! \brief Tests whether this instance has any elements.
2018-03-25 17:47:28 +00:00
bool empty ( void ) const
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
return size_ = = 0 ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
//! \brief Returns the maximum number of elements this instance can hold.
2018-03-25 17:47:28 +00:00
unsigned int max_size ( void ) const
2013-10-18 18:26:06 +00:00
{
return N ;
}
//! \brief Returns the maximum number of elements this instance can hold.
2018-03-25 17:47:28 +00:00
unsigned int capacity ( ) const
2013-10-18 18:26:06 +00:00
{
return N ;
}
2019-06-24 09:25:18 +00:00
//! \brief Resizes the vector to the given size
void resize ( unsigned int newSize , T fill = T ( ) )
{
if ( newSize > N )
{
detail : : errHandler ( CL_MEM_OBJECT_ALLOCATION_FAILURE , __VECTOR_CAPACITY_ERR ) ;
}
else
{
while ( size_ < newSize )
{
new ( & data_ [ size_ ] ) T ( fill ) ;
size_ + + ;
}
while ( size_ > newSize )
{
- - size_ ;
data_ [ size_ ] . ~ T ( ) ;
}
}
}
2013-10-18 18:26:06 +00:00
/*! \brief Returns a reference to a given element.
*
* \ param index which element to access . *
* \ note
* The caller is responsible for ensuring index is > = 0 and < size ( ) .
*/
T & operator [ ] ( int index )
{
return data_ [ index ] ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
/*! \brief Returns a const reference to a given element.
*
* \ param index which element to access .
*
* \ note
* The caller is responsible for ensuring index is > = 0 and < size ( ) .
*/
const T & operator [ ] ( int index ) const
{
return data_ [ index ] ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
/*! \brief Assigns elements of the vector based on a source iterator range.
*
* \ param start Beginning iterator of source range
* \ param end Enditerator of source range
*
* \ note
* Will throw an exception if exceptions are enabled and size exceeded .
*/
2018-03-25 17:47:28 +00:00
template < class I >
2013-10-18 18:26:06 +00:00
void assign ( I start , I end )
{
2018-03-25 17:47:28 +00:00
clear ( ) ;
while ( start ! = end )
{
push_back ( * start ) ;
start + + ;
}
2013-10-18 18:26:06 +00:00
}
/*! \class iterator
* \ brief Const iterator class for vectors
*/
class iterator
{
private :
2018-03-25 17:47:28 +00:00
const vector < T , N > * vec_ ;
2013-10-18 18:26:06 +00:00
int index_ ;
/**
* Internal iterator constructor to capture reference
2018-12-09 21:00:09 +00:00
* to the vector it iterates over rather than taking
2013-10-18 18:26:06 +00:00
* the vector by copy .
*/
2018-03-25 17:47:28 +00:00
iterator ( const vector < T , N > & vec , int index ) : vec_ ( & vec )
{
if ( ! vec . empty ( ) )
{
index_ = index ;
}
else
{
index_ = - 1 ;
}
2013-10-18 18:26:06 +00:00
}
public :
2018-03-25 17:47:28 +00:00
iterator ( void ) : index_ ( - 1 ) ,
2019-06-24 17:25:51 +00:00
vec_ ( nullptr )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
iterator ( const iterator & rhs ) : vec_ ( rhs . vec_ ) ,
index_ ( rhs . index_ )
2013-10-18 18:26:06 +00:00
{
}
~ iterator ( void ) { }
2018-03-25 17:47:28 +00:00
static iterator begin ( const cl : : vector < T , N > & vec )
2013-10-18 18:26:06 +00:00
{
iterator i ( vec , 0 ) ;
return i ;
}
2018-03-25 17:47:28 +00:00
static iterator end ( const cl : : vector < T , N > & vec )
2013-10-18 18:26:06 +00:00
{
iterator i ( vec , vec . size ( ) ) ;
return i ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
bool operator = = ( iterator i )
{
2018-03-25 17:47:28 +00:00
return ( ( vec_ = = i . vec_ ) & &
2013-10-18 18:26:06 +00:00
( index_ = = i . index_ ) ) ;
}
bool operator ! = ( iterator i )
{
2018-03-25 17:47:28 +00:00
return ( ! ( * this = = i ) ) ;
2013-10-18 18:26:06 +00:00
}
iterator & operator + + ( )
{
+ + index_ ;
return * this ;
}
iterator operator + + ( int )
{
iterator retVal ( * this ) ;
+ + index_ ;
return retVal ;
}
iterator & operator - - ( )
{
- - index_ ;
return * this ;
}
iterator operator - - ( int )
{
iterator retVal ( * this ) ;
- - index_ ;
return retVal ;
}
2018-03-25 17:47:28 +00:00
const T & operator * ( ) const
2013-10-18 18:26:06 +00:00
{
return ( * vec_ ) [ index_ ] ;
}
} ;
iterator begin ( void )
{
return iterator : : begin ( * this ) ;
}
iterator begin ( void ) const
{
return iterator : : begin ( * this ) ;
}
iterator end ( void )
{
return iterator : : end ( * this ) ;
}
iterator end ( void ) const
{
return iterator : : end ( * this ) ;
}
T & front ( void )
{
return data_ [ 0 ] ;
}
T & back ( void )
{
return data_ [ size_ ] ;
}
const T & front ( void ) const
{
return data_ [ 0 ] ;
}
const T & back ( void ) const
{
2018-03-25 17:47:28 +00:00
return data_ [ size_ - 1 ] ;
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
} CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED ;
2018-03-25 17:47:28 +00:00
# endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
namespace detail
{
# define __DEFAULT_NOT_INITIALIZED 1
2013-10-18 18:26:06 +00:00
# define __DEFAULT_BEING_INITIALIZED 2
# define __DEFAULT_INITIALIZED 4
2018-03-25 17:47:28 +00:00
/*
2013-10-18 18:26:06 +00:00
* Compare and exchange primitives are needed for handling of defaults
*/
2019-06-24 09:25:18 +00:00
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
inline int compare_exchange ( std : : atomic < int > * dest , int exchange , int comparand )
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2018-03-25 17:47:28 +00:00
inline int compare_exchange ( volatile int * dest , int exchange , int comparand )
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
std : : atomic_compare_exchange_strong ( dest , & comparand , exchange ) ;
return comparand ;
# elif _MSC_VER
return ( int ) ( _InterlockedCompareExchange (
2018-03-25 17:47:28 +00:00
( volatile long * ) dest ,
( long ) exchange ,
( long ) comparand ) ) ;
2019-06-24 09:25:18 +00:00
# else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
2018-03-25 17:47:28 +00:00
return ( __sync_val_compare_and_swap (
dest ,
comparand ,
exchange ) ) ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2018-03-25 17:47:28 +00:00
}
2019-06-24 09:25:18 +00:00
inline void fence ( )
{
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
std : : atomic_thread_fence ( std : : memory_order_seq_cst ) ;
# elif _MSC_VER // !CL_HPP_CPP11_ATOMICS_SUPPORTED
_ReadWriteBarrier ( ) ;
# else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
__sync_synchronize ( ) ;
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
}
} // namespace detail
2013-10-18 18:26:06 +00:00
/*! \brief class used to interface between C++ and
* OpenCL C calls that require arrays of size_t values , whose
* size is known statically .
*/
template < int N >
class size_t
2018-03-25 17:47:28 +00:00
{
2013-10-18 18:26:06 +00:00
private :
: : size_t data_ [ N ] ;
public :
//! \brief Initialize size_t to all 0s
size_t ( )
{
2018-03-25 17:47:28 +00:00
for ( int i = 0 ; i < N ; + + i )
{
data_ [ i ] = 0 ;
}
2013-10-18 18:26:06 +00:00
}
: : size_t & operator [ ] ( int index )
{
return data_ [ index ] ;
}
const : : size_t & operator [ ] ( int index ) const
{
return data_ [ index ] ;
}
//! \brief Conversion operator to T*.
2018-03-25 17:47:28 +00:00
operator : : size_t * ( ) { return data_ ; }
2013-10-18 18:26:06 +00:00
//! \brief Conversion operator to const T*.
2018-03-25 17:47:28 +00:00
operator const : : size_t * ( ) const { return data_ ; }
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
namespace detail
{
2013-10-18 18:26:06 +00:00
// Generic getInfoHelper. The final parameter is used to guide overload
// resolution: the actual parameter passed is an int, which makes this
// a worse conversion sequence than a specialization that declares the
// parameter as an int.
2018-03-25 17:47:28 +00:00
template < typename Functor , typename T >
2013-10-18 18:26:06 +00:00
inline cl_int getInfoHelper ( Functor f , cl_uint name , T * param , long )
{
2019-06-24 17:25:51 +00:00
return f ( name , sizeof ( T ) , param , nullptr ) ;
2013-10-18 18:26:06 +00:00
}
// Specialized getInfoHelper for VECTOR_CLASS params
template < typename Func , typename T >
inline cl_int getInfoHelper ( Func f , cl_uint name , VECTOR_CLASS < T > * param , long )
{
: : size_t required ;
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , 0 , nullptr , & required ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
T * value = ( T * ) alloca ( required ) ;
2019-06-24 17:25:51 +00:00
err = f ( name , required , value , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
param - > assign ( & value [ 0 ] , & value [ required / sizeof ( T ) ] ) ;
2013-10-18 18:26:06 +00:00
return CL_SUCCESS ;
}
/* Specialization for reference-counted types. This depends on the
* existence of Wrapper < T > : : cl_type , and none of the other types having the
* cl_type member . Note that simplify specifying the parameter as Wrapper < T >
* does not work , because when using a derived type ( e . g . Context ) the generic
* template will provide a better match .
*/
template < typename Func , typename T >
2019-06-28 10:26:46 +00:00
inline cl_int getInfoHelper ( Func f , cl_uint name , VECTOR_CLASS < T > * param , int , typename T : : cl_type = nullptr )
2013-10-18 18:26:06 +00:00
{
: : size_t required ;
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , 0 , nullptr , & required ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
typename T : : cl_type * value = ( typename T : : cl_type * ) alloca ( required ) ;
2019-06-24 17:25:51 +00:00
err = f ( name , required , value , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
: : size_t elements = required / sizeof ( typename T : : cl_type ) ;
param - > assign ( & value [ 0 ] , & value [ elements ] ) ;
for ( : : size_t i = 0 ; i < elements ; i + + )
{
2019-06-24 17:25:51 +00:00
if ( value [ i ] ! = nullptr )
2018-03-25 17:47:28 +00:00
{
err = ( * param ) [ i ] . retain ( ) ;
if ( err ! = CL_SUCCESS )
{
return err ;
}
}
2013-10-18 18:26:06 +00:00
}
return CL_SUCCESS ;
}
// Specialized for getInfo<CL_PROGRAM_BINARIES>
template < typename Func >
2018-03-25 17:47:28 +00:00
inline cl_int getInfoHelper ( Func f , cl_uint name , VECTOR_CLASS < char * > * param , int )
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , param - > size ( ) * sizeof ( char * ) , & ( * param ) [ 0 ] , nullptr ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
return CL_SUCCESS ;
}
// Specialized GetInfoHelper for STRING_CLASS params
template < typename Func >
inline cl_int getInfoHelper ( Func f , cl_uint name , STRING_CLASS * param , long )
{
2019-06-24 09:25:18 +00:00
# if defined(__NO_STD_VECTOR) || defined(__NO_STD_STRING)
2013-10-18 18:26:06 +00:00
: : size_t required ;
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , 0 , nullptr , & required ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
char * value = ( char * ) alloca ( required ) ;
2019-06-24 17:25:51 +00:00
err = f ( name , required , value , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
* param = value ;
return CL_SUCCESS ;
2019-06-24 09:25:18 +00:00
# else
: : size_t required ;
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , 0 , nullptr , & required ) ;
2019-06-24 09:25:18 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
// std::string has a constant data member
// a char vector does not
VECTOR_CLASS < char > value ( required ) ;
2019-06-24 17:25:51 +00:00
err = f ( name , required , value . data ( ) , nullptr ) ;
2019-06-24 09:25:18 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
if ( param )
{
param - > assign ( value . begin ( ) , value . end ( ) ) ;
}
# endif
return CL_SUCCESS ;
2013-10-18 18:26:06 +00:00
}
// Specialized GetInfoHelper for cl::size_t params
template < typename Func , : : size_t N >
inline cl_int getInfoHelper ( Func f , cl_uint name , size_t < N > * param , long )
{
: : size_t required ;
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , 0 , nullptr , & required ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
: : size_t * value = ( : : size_t * ) alloca ( required ) ;
2019-06-24 17:25:51 +00:00
err = f ( name , required , value , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
for ( int i = 0 ; i < N ; + + i )
{
( * param ) [ i ] = value [ i ] ;
}
2013-10-18 18:26:06 +00:00
return CL_SUCCESS ;
}
2018-03-25 17:47:28 +00:00
template < typename T >
struct ReferenceHandler ;
2013-10-18 18:26:06 +00:00
/* Specialization for reference-counted types. This depends on the
* existence of Wrapper < T > : : cl_type , and none of the other types having the
* cl_type member . Note that simplify specifying the parameter as Wrapper < T >
* does not work , because when using a derived type ( e . g . Context ) the generic
* template will provide a better match .
*/
2018-03-25 17:47:28 +00:00
template < typename Func , typename T >
2019-06-28 10:26:46 +00:00
inline cl_int getInfoHelper ( Func f , cl_uint name , T * param , int , typename T : : cl_type = nullptr )
2013-10-18 18:26:06 +00:00
{
typename T : : cl_type value ;
2019-06-24 17:25:51 +00:00
cl_int err = f ( name , sizeof ( value ) , & value , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
* param = value ;
2019-06-24 17:25:51 +00:00
if ( value ! = nullptr )
2018-03-25 17:47:28 +00:00
{
err = param - > retain ( ) ;
if ( err ! = CL_SUCCESS )
{
return err ;
}
2013-10-18 18:26:06 +00:00
}
return CL_SUCCESS ;
}
2018-03-25 17:47:28 +00:00
# define __PARAM_NAME_INFO_1_0(F) \
F ( cl_platform_info , CL_PLATFORM_PROFILE , STRING_CLASS ) \
F ( cl_platform_info , CL_PLATFORM_VERSION , STRING_CLASS ) \
F ( cl_platform_info , CL_PLATFORM_NAME , STRING_CLASS ) \
F ( cl_platform_info , CL_PLATFORM_VENDOR , STRING_CLASS ) \
F ( cl_platform_info , CL_PLATFORM_EXTENSIONS , STRING_CLASS ) \
\
F ( cl_device_info , CL_DEVICE_TYPE , cl_device_type ) \
F ( cl_device_info , CL_DEVICE_VENDOR_ID , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_COMPUTE_UNITS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_WORK_GROUP_SIZE , : : size_t ) \
F ( cl_device_info , CL_DEVICE_MAX_WORK_ITEM_SIZES , VECTOR_CLASS < : : size_t > ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_CLOCK_FREQUENCY , cl_uint ) \
F ( cl_device_info , CL_DEVICE_ADDRESS_BITS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_READ_IMAGE_ARGS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_WRITE_IMAGE_ARGS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MAX_MEM_ALLOC_SIZE , cl_ulong ) \
F ( cl_device_info , CL_DEVICE_IMAGE2D_MAX_WIDTH , : : size_t ) \
F ( cl_device_info , CL_DEVICE_IMAGE2D_MAX_HEIGHT , : : size_t ) \
F ( cl_device_info , CL_DEVICE_IMAGE3D_MAX_WIDTH , : : size_t ) \
F ( cl_device_info , CL_DEVICE_IMAGE3D_MAX_HEIGHT , : : size_t ) \
F ( cl_device_info , CL_DEVICE_IMAGE3D_MAX_DEPTH , : : size_t ) \
F ( cl_device_info , CL_DEVICE_IMAGE_SUPPORT , cl_bool ) \
F ( cl_device_info , CL_DEVICE_MAX_PARAMETER_SIZE , : : size_t ) \
F ( cl_device_info , CL_DEVICE_MAX_SAMPLERS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MEM_BASE_ADDR_ALIGN , cl_uint ) \
F ( cl_device_info , CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE , cl_uint ) \
F ( cl_device_info , CL_DEVICE_SINGLE_FP_CONFIG , cl_device_fp_config ) \
F ( cl_device_info , CL_DEVICE_GLOBAL_MEM_CACHE_TYPE , cl_device_mem_cache_type ) \
F ( cl_device_info , CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE , cl_uint ) \
F ( cl_device_info , CL_DEVICE_GLOBAL_MEM_CACHE_SIZE , cl_ulong ) \
F ( cl_device_info , CL_DEVICE_GLOBAL_MEM_SIZE , cl_ulong ) \
F ( cl_device_info , CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE , cl_ulong ) \
F ( cl_device_info , CL_DEVICE_MAX_CONSTANT_ARGS , cl_uint ) \
F ( cl_device_info , CL_DEVICE_LOCAL_MEM_TYPE , cl_device_local_mem_type ) \
F ( cl_device_info , CL_DEVICE_LOCAL_MEM_SIZE , cl_ulong ) \
F ( cl_device_info , CL_DEVICE_ERROR_CORRECTION_SUPPORT , cl_bool ) \
F ( cl_device_info , CL_DEVICE_PROFILING_TIMER_RESOLUTION , : : size_t ) \
F ( cl_device_info , CL_DEVICE_ENDIAN_LITTLE , cl_bool ) \
F ( cl_device_info , CL_DEVICE_AVAILABLE , cl_bool ) \
F ( cl_device_info , CL_DEVICE_COMPILER_AVAILABLE , cl_bool ) \
2013-10-18 18:26:06 +00:00
F ( cl_device_info , CL_DEVICE_EXECUTION_CAPABILITIES , cl_device_exec_capabilities ) \
2018-03-25 17:47:28 +00:00
F ( cl_device_info , CL_DEVICE_QUEUE_PROPERTIES , cl_command_queue_properties ) \
F ( cl_device_info , CL_DEVICE_PLATFORM , cl_platform_id ) \
F ( cl_device_info , CL_DEVICE_NAME , STRING_CLASS ) \
F ( cl_device_info , CL_DEVICE_VENDOR , STRING_CLASS ) \
F ( cl_device_info , CL_DRIVER_VERSION , STRING_CLASS ) \
F ( cl_device_info , CL_DEVICE_PROFILE , STRING_CLASS ) \
F ( cl_device_info , CL_DEVICE_VERSION , STRING_CLASS ) \
F ( cl_device_info , CL_DEVICE_EXTENSIONS , STRING_CLASS ) \
\
F ( cl_context_info , CL_CONTEXT_REFERENCE_COUNT , cl_uint ) \
F ( cl_context_info , CL_CONTEXT_DEVICES , VECTOR_CLASS < Device > ) \
F ( cl_context_info , CL_CONTEXT_PROPERTIES , VECTOR_CLASS < cl_context_properties > ) \
\
F ( cl_event_info , CL_EVENT_COMMAND_QUEUE , cl : : CommandQueue ) \
F ( cl_event_info , CL_EVENT_COMMAND_TYPE , cl_command_type ) \
F ( cl_event_info , CL_EVENT_REFERENCE_COUNT , cl_uint ) \
2019-06-24 09:25:18 +00:00
F ( cl_event_info , CL_EVENT_COMMAND_EXECUTION_STATUS , cl_int ) \
2018-03-25 17:47:28 +00:00
\
F ( cl_profiling_info , CL_PROFILING_COMMAND_QUEUED , cl_ulong ) \
F ( cl_profiling_info , CL_PROFILING_COMMAND_SUBMIT , cl_ulong ) \
F ( cl_profiling_info , CL_PROFILING_COMMAND_START , cl_ulong ) \
F ( cl_profiling_info , CL_PROFILING_COMMAND_END , cl_ulong ) \
\
F ( cl_mem_info , CL_MEM_TYPE , cl_mem_object_type ) \
F ( cl_mem_info , CL_MEM_FLAGS , cl_mem_flags ) \
F ( cl_mem_info , CL_MEM_SIZE , : : size_t ) \
F ( cl_mem_info , CL_MEM_HOST_PTR , void * ) \
F ( cl_mem_info , CL_MEM_MAP_COUNT , cl_uint ) \
F ( cl_mem_info , CL_MEM_REFERENCE_COUNT , cl_uint ) \
F ( cl_mem_info , CL_MEM_CONTEXT , cl : : Context ) \
\
F ( cl_image_info , CL_IMAGE_FORMAT , cl_image_format ) \
F ( cl_image_info , CL_IMAGE_ELEMENT_SIZE , : : size_t ) \
F ( cl_image_info , CL_IMAGE_ROW_PITCH , : : size_t ) \
F ( cl_image_info , CL_IMAGE_SLICE_PITCH , : : size_t ) \
F ( cl_image_info , CL_IMAGE_WIDTH , : : size_t ) \
F ( cl_image_info , CL_IMAGE_HEIGHT , : : size_t ) \
F ( cl_image_info , CL_IMAGE_DEPTH , : : size_t ) \
\
F ( cl_sampler_info , CL_SAMPLER_REFERENCE_COUNT , cl_uint ) \
F ( cl_sampler_info , CL_SAMPLER_CONTEXT , cl : : Context ) \
2019-06-24 09:25:18 +00:00
F ( cl_sampler_info , CL_SAMPLER_NORMALIZED_COORDS , cl_bool ) \
F ( cl_sampler_info , CL_SAMPLER_ADDRESSING_MODE , cl_addressing_mode ) \
F ( cl_sampler_info , CL_SAMPLER_FILTER_MODE , cl_filter_mode ) \
2018-03-25 17:47:28 +00:00
\
F ( cl_program_info , CL_PROGRAM_REFERENCE_COUNT , cl_uint ) \
F ( cl_program_info , CL_PROGRAM_CONTEXT , cl : : Context ) \
F ( cl_program_info , CL_PROGRAM_NUM_DEVICES , cl_uint ) \
F ( cl_program_info , CL_PROGRAM_DEVICES , VECTOR_CLASS < Device > ) \
F ( cl_program_info , CL_PROGRAM_SOURCE , STRING_CLASS ) \
F ( cl_program_info , CL_PROGRAM_BINARY_SIZES , VECTOR_CLASS < : : size_t > ) \
F ( cl_program_info , CL_PROGRAM_BINARIES , VECTOR_CLASS < char * > ) \
\
F ( cl_program_build_info , CL_PROGRAM_BUILD_STATUS , cl_build_status ) \
F ( cl_program_build_info , CL_PROGRAM_BUILD_OPTIONS , STRING_CLASS ) \
F ( cl_program_build_info , CL_PROGRAM_BUILD_LOG , STRING_CLASS ) \
\
F ( cl_kernel_info , CL_KERNEL_FUNCTION_NAME , STRING_CLASS ) \
F ( cl_kernel_info , CL_KERNEL_NUM_ARGS , cl_uint ) \
F ( cl_kernel_info , CL_KERNEL_REFERENCE_COUNT , cl_uint ) \
F ( cl_kernel_info , CL_KERNEL_CONTEXT , cl : : Context ) \
F ( cl_kernel_info , CL_KERNEL_PROGRAM , cl : : Program ) \
\
F ( cl_kernel_work_group_info , CL_KERNEL_WORK_GROUP_SIZE , : : size_t ) \
F ( cl_kernel_work_group_info , CL_KERNEL_COMPILE_WORK_GROUP_SIZE , cl : : size_t < 3 > ) \
F ( cl_kernel_work_group_info , CL_KERNEL_LOCAL_MEM_SIZE , cl_ulong ) \
\
F ( cl_command_queue_info , CL_QUEUE_CONTEXT , cl : : Context ) \
F ( cl_command_queue_info , CL_QUEUE_DEVICE , cl : : Device ) \
F ( cl_command_queue_info , CL_QUEUE_REFERENCE_COUNT , cl_uint ) \
2013-10-18 18:26:06 +00:00
F ( cl_command_queue_info , CL_QUEUE_PROPERTIES , cl_command_queue_properties )
# if defined(CL_VERSION_1_1)
2018-03-25 17:47:28 +00:00
# define __PARAM_NAME_INFO_1_1(F) \
F ( cl_context_info , CL_CONTEXT_NUM_DEVICES , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_INT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE , cl_uint ) \
F ( cl_device_info , CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF , cl_uint ) \
F ( cl_device_info , CL_DEVICE_DOUBLE_FP_CONFIG , cl_device_fp_config ) \
F ( cl_device_info , CL_DEVICE_HALF_FP_CONFIG , cl_device_fp_config ) \
F ( cl_device_info , CL_DEVICE_HOST_UNIFIED_MEMORY , cl_bool ) \
F ( cl_device_info , CL_DEVICE_OPENCL_C_VERSION , STRING_CLASS ) \
\
F ( cl_mem_info , CL_MEM_ASSOCIATED_MEMOBJECT , cl : : Memory ) \
F ( cl_mem_info , CL_MEM_OFFSET , : : size_t ) \
\
2013-10-18 18:26:06 +00:00
F ( cl_kernel_work_group_info , CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE , : : size_t ) \
2018-03-25 17:47:28 +00:00
F ( cl_kernel_work_group_info , CL_KERNEL_PRIVATE_MEM_SIZE , cl_ulong ) \
\
2013-10-18 18:26:06 +00:00
F ( cl_event_info , CL_EVENT_CONTEXT , cl : : Context )
2018-03-25 17:47:28 +00:00
# endif // CL_VERSION_1_1
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
# define __PARAM_NAME_INFO_1_2(F) \
F ( cl_image_info , CL_IMAGE_BUFFER , cl : : Buffer ) \
\
F ( cl_program_info , CL_PROGRAM_NUM_KERNELS , : : size_t ) \
F ( cl_program_info , CL_PROGRAM_KERNEL_NAMES , STRING_CLASS ) \
\
F ( cl_program_build_info , CL_PROGRAM_BINARY_TYPE , cl_program_binary_type ) \
\
F ( cl_kernel_info , CL_KERNEL_ATTRIBUTES , STRING_CLASS ) \
\
F ( cl_kernel_arg_info , CL_KERNEL_ARG_ADDRESS_QUALIFIER , cl_kernel_arg_address_qualifier ) \
F ( cl_kernel_arg_info , CL_KERNEL_ARG_ACCESS_QUALIFIER , cl_kernel_arg_access_qualifier ) \
F ( cl_kernel_arg_info , CL_KERNEL_ARG_TYPE_NAME , STRING_CLASS ) \
F ( cl_kernel_arg_info , CL_KERNEL_ARG_NAME , STRING_CLASS ) \
2019-06-24 09:25:18 +00:00
F ( cl_kernel_arg_info , CL_KERNEL_ARG_TYPE_QUALIFIER , cl_kernel_arg_type_qualifier ) \
2018-03-25 17:47:28 +00:00
\
F ( cl_device_info , CL_DEVICE_PARENT_DEVICE , cl_device_id ) \
2013-10-18 18:26:06 +00:00
F ( cl_device_info , CL_DEVICE_PARTITION_PROPERTIES , VECTOR_CLASS < cl_device_partition_property > ) \
2018-03-25 17:47:28 +00:00
F ( cl_device_info , CL_DEVICE_PARTITION_TYPE , VECTOR_CLASS < cl_device_partition_property > ) \
F ( cl_device_info , CL_DEVICE_REFERENCE_COUNT , cl_uint ) \
F ( cl_device_info , CL_DEVICE_PREFERRED_INTEROP_USER_SYNC , : : size_t ) \
F ( cl_device_info , CL_DEVICE_PARTITION_AFFINITY_DOMAIN , cl_device_affinity_domain ) \
2013-10-18 18:26:06 +00:00
F ( cl_device_info , CL_DEVICE_BUILT_IN_KERNELS , STRING_CLASS )
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
# if defined(USE_CL_DEVICE_FISSION)
2018-03-25 17:47:28 +00:00
# define __PARAM_NAME_DEVICE_FISSION(F) \
F ( cl_device_info , CL_DEVICE_PARENT_DEVICE_EXT , cl_device_id ) \
F ( cl_device_info , CL_DEVICE_PARTITION_TYPES_EXT , VECTOR_CLASS < cl_device_partition_property_ext > ) \
2013-10-18 18:26:06 +00:00
F ( cl_device_info , CL_DEVICE_AFFINITY_DOMAINS_EXT , VECTOR_CLASS < cl_device_partition_property_ext > ) \
2018-03-25 17:47:28 +00:00
F ( cl_device_info , CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint ) \
2013-10-18 18:26:06 +00:00
F ( cl_device_info , CL_DEVICE_PARTITION_STYLE_EXT , VECTOR_CLASS < cl_device_partition_property_ext > )
2018-03-25 17:47:28 +00:00
# endif // USE_CL_DEVICE_FISSION
2013-10-18 18:26:06 +00:00
template < typename enum_type , cl_int Name >
2018-03-25 17:47:28 +00:00
struct param_traits
{
} ;
2013-10-18 18:26:06 +00:00
# define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \
2018-03-25 17:47:28 +00:00
struct token ; \
template < > \
struct param_traits < detail : : token , param_name > \
{ \
enum \
{ \
value = param_name \
} ; \
typedef T param_type ; \
} ;
2013-10-18 18:26:06 +00:00
__PARAM_NAME_INFO_1_0 ( __CL_DECLARE_PARAM_TRAITS )
# if defined(CL_VERSION_1_1)
__PARAM_NAME_INFO_1_1 ( __CL_DECLARE_PARAM_TRAITS )
2018-03-25 17:47:28 +00:00
# endif // CL_VERSION_1_1
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
__PARAM_NAME_INFO_1_2 ( __CL_DECLARE_PARAM_TRAITS )
2018-03-25 17:47:28 +00:00
# endif // CL_VERSION_1_1
2013-10-18 18:26:06 +00:00
# if defined(USE_CL_DEVICE_FISSION)
__PARAM_NAME_DEVICE_FISSION ( __CL_DECLARE_PARAM_TRAITS ) ;
2018-03-25 17:47:28 +00:00
# endif // USE_CL_DEVICE_FISSION
2013-10-18 18:26:06 +00:00
# ifdef CL_PLATFORM_ICD_SUFFIX_KHR
__CL_DECLARE_PARAM_TRAITS ( cl_platform_info , CL_PLATFORM_ICD_SUFFIX_KHR , STRING_CLASS )
# endif
# ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_PROFILING_TIMER_OFFSET_AMD , cl_ulong )
# endif
# ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_GLOBAL_FREE_MEMORY_AMD , VECTOR_CLASS < : : size_t > )
# endif
# ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_SIMD_WIDTH_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_SIMD_WIDTH_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_WAVEFRONT_WIDTH_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_LOCAL_MEM_BANKS_AMD , cl_uint )
# endif
# ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV , cl_uint )
# endif
# ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV , cl_uint )
# endif
# ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_REGISTERS_PER_BLOCK_NV , cl_uint )
# endif
# ifdef CL_DEVICE_WARP_SIZE_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_WARP_SIZE_NV , cl_uint )
# endif
# ifdef CL_DEVICE_GPU_OVERLAP_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_GPU_OVERLAP_NV , cl_bool )
# endif
# ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV , cl_bool )
# endif
# ifdef CL_DEVICE_INTEGRATED_MEMORY_NV
__CL_DECLARE_PARAM_TRAITS ( cl_device_info , CL_DEVICE_INTEGRATED_MEMORY_NV , cl_bool )
# endif
// Convenience functions
template < typename Func , typename T >
inline cl_int
getInfo ( Func f , cl_uint name , T * param )
{
return getInfoHelper ( f , name , param , 0 ) ;
}
template < typename Func , typename Arg0 >
struct GetInfoFunctor0
{
2018-03-25 17:47:28 +00:00
Func f_ ;
const Arg0 & arg0_ ;
cl_int operator ( ) (
2013-10-18 18:26:06 +00:00
cl_uint param , : : size_t size , void * value , : : size_t * size_ret )
2018-03-25 17:47:28 +00:00
{
return f_ ( arg0_ , param , size , value , size_ret ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < typename Func , typename Arg0 , typename Arg1 >
struct GetInfoFunctor1
{
2018-03-25 17:47:28 +00:00
Func f_ ;
const Arg0 & arg0_ ;
const Arg1 & arg1_ ;
cl_int operator ( ) (
2013-10-18 18:26:06 +00:00
cl_uint param , : : size_t size , void * value , : : size_t * size_ret )
2018-03-25 17:47:28 +00:00
{
return f_ ( arg0_ , arg1_ , param , size , value , size_ret ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < typename Func , typename Arg0 , typename T >
inline cl_int
getInfo ( Func f , const Arg0 & arg0 , cl_uint name , T * param )
{
2018-03-25 17:47:28 +00:00
GetInfoFunctor0 < Func , Arg0 > f0 = { f , arg0 } ;
2013-10-18 18:26:06 +00:00
return getInfoHelper ( f0 , name , param , 0 ) ;
}
template < typename Func , typename Arg0 , typename Arg1 , typename T >
inline cl_int
getInfo ( Func f , const Arg0 & arg0 , const Arg1 & arg1 , cl_uint name , T * param )
{
2018-03-25 17:47:28 +00:00
GetInfoFunctor1 < Func , Arg0 , Arg1 > f0 = { f , arg0 , arg1 } ;
2013-10-18 18:26:06 +00:00
return getInfoHelper ( f0 , name , param , 0 ) ;
}
2018-03-25 17:47:28 +00:00
template < typename T >
2013-10-18 18:26:06 +00:00
struct ReferenceHandler
2018-03-25 17:47:28 +00:00
{
} ;
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
/**
* OpenCL 1.2 devices do have retain / release .
*/
template < >
struct ReferenceHandler < cl_device_id >
{
/**
* Retain the device .
* \ param device A valid device created using createSubDevices
2018-12-09 21:00:09 +00:00
* \ return
2013-10-18 18:26:06 +00:00
* CL_SUCCESS if the function executed successfully .
* CL_INVALID_DEVICE if device was not a valid subdevice
* CL_OUT_OF_RESOURCES
* CL_OUT_OF_HOST_MEMORY
*/
static cl_int retain ( cl_device_id device )
2018-03-25 17:47:28 +00:00
{
return : : clRetainDevice ( device ) ;
}
2013-10-18 18:26:06 +00:00
/**
* Retain the device .
* \ param device A valid device created using createSubDevices
2018-12-09 21:00:09 +00:00
* \ return
2013-10-18 18:26:06 +00:00
* CL_SUCCESS if the function executed successfully .
* CL_INVALID_DEVICE if device was not a valid subdevice
* CL_OUT_OF_RESOURCES
* CL_OUT_OF_HOST_MEMORY
*/
static cl_int release ( cl_device_id device )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseDevice ( device ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
# else // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
/**
* OpenCL 1.1 devices do not have retain / release .
*/
template < >
struct ReferenceHandler < cl_device_id >
{
// cl_device_id does not have retain().
static cl_int retain ( cl_device_id )
2018-03-25 17:47:28 +00:00
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
// cl_device_id does not have release().
static cl_int release ( cl_device_id )
2018-03-25 17:47:28 +00:00
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
template < >
struct ReferenceHandler < cl_platform_id >
{
// cl_platform_id does not have retain().
static cl_int retain ( cl_platform_id )
2018-03-25 17:47:28 +00:00
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
// cl_platform_id does not have release().
static cl_int release ( cl_platform_id )
2018-03-25 17:47:28 +00:00
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_context >
{
static cl_int retain ( cl_context context )
2018-03-25 17:47:28 +00:00
{
return : : clRetainContext ( context ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_context context )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseContext ( context ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_command_queue >
{
static cl_int retain ( cl_command_queue queue )
2018-03-25 17:47:28 +00:00
{
return : : clRetainCommandQueue ( queue ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_command_queue queue )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseCommandQueue ( queue ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_mem >
{
static cl_int retain ( cl_mem memory )
2018-03-25 17:47:28 +00:00
{
return : : clRetainMemObject ( memory ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_mem memory )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseMemObject ( memory ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_sampler >
{
static cl_int retain ( cl_sampler sampler )
2018-03-25 17:47:28 +00:00
{
return : : clRetainSampler ( sampler ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_sampler sampler )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseSampler ( sampler ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_program >
{
static cl_int retain ( cl_program program )
2018-03-25 17:47:28 +00:00
{
return : : clRetainProgram ( program ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_program program )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseProgram ( program ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_kernel >
{
static cl_int retain ( cl_kernel kernel )
2018-03-25 17:47:28 +00:00
{
return : : clRetainKernel ( kernel ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_kernel kernel )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseKernel ( kernel ) ;
}
2013-10-18 18:26:06 +00:00
} ;
template < >
struct ReferenceHandler < cl_event >
{
static cl_int retain ( cl_event event )
2018-03-25 17:47:28 +00:00
{
return : : clRetainEvent ( event ) ;
}
2013-10-18 18:26:06 +00:00
static cl_int release ( cl_event event )
2018-03-25 17:47:28 +00:00
{
return : : clReleaseEvent ( event ) ;
}
2013-10-18 18:26:06 +00:00
} ;
// Extracts version number with major in the upper 16 bits, minor in the lower 16
2018-03-25 17:47:28 +00:00
static cl_uint getVersion ( const char * versionInfo )
2013-10-18 18:26:06 +00:00
{
int highVersion = 0 ;
int lowVersion = 0 ;
int index = 7 ;
2018-03-25 17:47:28 +00:00
while ( versionInfo [ index ] ! = ' . ' )
{
highVersion * = 10 ;
highVersion + = versionInfo [ index ] - ' 0 ' ;
+ + index ;
}
2013-10-18 18:26:06 +00:00
+ + index ;
2019-06-24 09:25:18 +00:00
while ( versionInfo [ index ] ! = ' ' & & versionInfo [ index ] ! = ' \0 ' )
2018-03-25 17:47:28 +00:00
{
lowVersion * = 10 ;
lowVersion + = versionInfo [ index ] - ' 0 ' ;
+ + index ;
}
2013-10-18 18:26:06 +00:00
return ( highVersion < < 16 ) | lowVersion ;
}
static cl_uint getPlatformVersion ( cl_platform_id platform )
{
: : size_t size = 0 ;
2019-06-24 17:25:51 +00:00
clGetPlatformInfo ( platform , CL_PLATFORM_VERSION , 0 , nullptr , & size ) ;
2018-03-25 17:47:28 +00:00
char * versionInfo = ( char * ) alloca ( size ) ;
2013-10-18 18:26:06 +00:00
clGetPlatformInfo ( platform , CL_PLATFORM_VERSION , size , & versionInfo [ 0 ] , & size ) ;
return getVersion ( versionInfo ) ;
}
static cl_uint getDevicePlatformVersion ( cl_device_id device )
{
cl_platform_id platform ;
2019-06-24 17:25:51 +00:00
clGetDeviceInfo ( device , CL_DEVICE_PLATFORM , sizeof ( platform ) , & platform , nullptr ) ;
2013-10-18 18:26:06 +00:00
return getPlatformVersion ( platform ) ;
}
# if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
static cl_uint getContextPlatformVersion ( cl_context context )
{
// The platform cannot be queried directly, so we first have to grab a
// device and obtain its context
: : size_t size = 0 ;
2019-06-24 17:25:51 +00:00
clGetContextInfo ( context , CL_CONTEXT_DEVICES , 0 , nullptr , & size ) ;
2013-10-18 18:26:06 +00:00
if ( size = = 0 )
return 0 ;
2018-03-25 17:47:28 +00:00
cl_device_id * devices = ( cl_device_id * ) alloca ( size ) ;
2019-06-24 17:25:51 +00:00
clGetContextInfo ( context , CL_CONTEXT_DEVICES , size , devices , nullptr ) ;
2013-10-18 18:26:06 +00:00
return getDevicePlatformVersion ( devices [ 0 ] ) ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
2013-10-18 18:26:06 +00:00
template < typename T >
class Wrapper
{
public :
typedef T cl_type ;
protected :
cl_type object_ ;
public :
2019-06-24 17:25:51 +00:00
Wrapper ( ) : object_ ( nullptr ) { }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Wrapper ( const cl_type & obj ) : object_ ( obj ) { }
2013-10-18 18:26:06 +00:00
~ Wrapper ( )
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
release ( ) ;
}
2013-10-18 18:26:06 +00:00
}
Wrapper ( const Wrapper < cl_type > & rhs )
{
object_ = rhs . object_ ;
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
detail : : errHandler ( retain ( ) , __RETAIN_ERR ) ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper ( Wrapper < cl_type > & & rhs ) CL_HPP_NOEXCEPT
{
object_ = rhs . object_ ;
2019-06-24 17:25:51 +00:00
rhs . object_ = nullptr ;
2019-06-24 09:25:18 +00:00
}
# endif
2018-03-25 17:47:28 +00:00
Wrapper < cl_type > & operator = ( const Wrapper < cl_type > & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
if ( this ! = & rhs )
2018-03-25 17:47:28 +00:00
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2019-06-24 09:25:18 +00:00
{
detail : : errHandler ( release ( ) , __RELEASE_ERR ) ;
}
object_ = rhs . object_ ;
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2019-06-24 09:25:18 +00:00
{
detail : : errHandler ( retain ( ) , __RETAIN_ERR ) ;
}
2018-03-25 17:47:28 +00:00
}
2019-06-24 09:25:18 +00:00
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper < cl_type > & operator = ( Wrapper < cl_type > & & rhs )
{
if ( this ! = & rhs )
2018-03-25 17:47:28 +00:00
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2019-06-24 09:25:18 +00:00
{
detail : : errHandler ( release ( ) , __RELEASE_ERR ) ;
}
object_ = rhs . object_ ;
2019-06-24 17:25:51 +00:00
rhs . object_ = nullptr ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Wrapper < cl_type > & operator = ( const cl_type & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
detail : : errHandler ( release ( ) , __RELEASE_ERR ) ;
}
2013-10-18 18:26:06 +00:00
object_ = rhs ;
return * this ;
}
2018-03-25 17:47:28 +00:00
cl_type operator ( ) ( ) const { return object_ ; }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_type & operator ( ) ( ) { return object_ ; }
2013-10-18 18:26:06 +00:00
protected :
2018-03-25 17:47:28 +00:00
template < typename Func , typename U >
2013-10-18 18:26:06 +00:00
friend inline cl_int getInfoHelper ( Func , cl_uint , U * , int , typename U : : cl_type ) ;
cl_int retain ( ) const
{
return ReferenceHandler < cl_type > : : retain ( object_ ) ;
}
cl_int release ( ) const
{
return ReferenceHandler < cl_type > : : release ( object_ ) ;
}
} ;
template < >
class Wrapper < cl_device_id >
{
public :
typedef cl_device_id cl_type ;
protected :
cl_type object_ ;
bool referenceCountable_ ;
static bool isReferenceCountable ( cl_device_id device )
{
bool retVal = false ;
2019-06-24 17:25:51 +00:00
if ( device ! = nullptr )
2018-03-25 17:47:28 +00:00
{
int version = getDevicePlatformVersion ( device ) ;
if ( version > ( ( 1 < < 16 ) + 1 ) )
{
retVal = true ;
}
2013-10-18 18:26:06 +00:00
}
return retVal ;
}
public :
2019-06-24 17:25:51 +00:00
Wrapper ( ) : object_ ( nullptr ) , referenceCountable_ ( false )
2018-03-25 17:47:28 +00:00
{
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
Wrapper ( const cl_type & obj ) : object_ ( obj ) , referenceCountable_ ( false )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
referenceCountable_ = isReferenceCountable ( obj ) ;
2013-10-18 18:26:06 +00:00
}
~ Wrapper ( )
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
release ( ) ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
Wrapper ( const Wrapper < cl_type > & rhs )
{
object_ = rhs . object_ ;
2018-03-25 17:47:28 +00:00
referenceCountable_ = isReferenceCountable ( object_ ) ;
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
detail : : errHandler ( retain ( ) , __RETAIN_ERR ) ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper ( Wrapper < cl_type > & & rhs ) CL_HPP_NOEXCEPT
{
object_ = rhs . object_ ;
referenceCountable_ = rhs . referenceCountable_ ;
2019-06-24 17:25:51 +00:00
rhs . object_ = nullptr ;
2019-06-24 09:25:18 +00:00
rhs . referenceCountable_ = false ;
}
# endif
2018-03-25 17:47:28 +00:00
Wrapper < cl_type > & operator = ( const Wrapper < cl_type > & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
if ( this ! = & rhs )
2018-03-25 17:47:28 +00:00
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2019-06-24 09:25:18 +00:00
{
detail : : errHandler ( release ( ) , __RELEASE_ERR ) ;
}
object_ = rhs . object_ ;
referenceCountable_ = rhs . referenceCountable_ ;
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2019-06-24 09:25:18 +00:00
{
detail : : errHandler ( retain ( ) , __RETAIN_ERR ) ;
}
2018-03-25 17:47:28 +00:00
}
2019-06-24 09:25:18 +00:00
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper < cl_type > & operator = ( Wrapper < cl_type > & & rhs )
{
if ( this ! = & rhs )
2018-03-25 17:47:28 +00:00
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2019-06-24 09:25:18 +00:00
{
detail : : errHandler ( release ( ) , __RELEASE_ERR ) ;
}
object_ = rhs . object_ ;
referenceCountable_ = rhs . referenceCountable_ ;
2019-06-24 17:25:51 +00:00
rhs . object_ = nullptr ;
2019-06-24 09:25:18 +00:00
rhs . referenceCountable_ = false ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Wrapper < cl_type > & operator = ( const cl_type & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
if ( object_ ! = nullptr )
2018-03-25 17:47:28 +00:00
{
detail : : errHandler ( release ( ) , __RELEASE_ERR ) ;
}
2013-10-18 18:26:06 +00:00
object_ = rhs ;
2018-03-25 17:47:28 +00:00
referenceCountable_ = isReferenceCountable ( object_ ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2018-03-25 17:47:28 +00:00
cl_type operator ( ) ( ) const { return object_ ; }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_type & operator ( ) ( ) { return object_ ; }
2013-10-18 18:26:06 +00:00
protected :
2018-03-25 17:47:28 +00:00
template < typename Func , typename U >
2013-10-18 18:26:06 +00:00
friend inline cl_int getInfoHelper ( Func , cl_uint , U * , int , typename U : : cl_type ) ;
2018-03-25 17:47:28 +00:00
template < typename Func , typename U >
2013-10-18 18:26:06 +00:00
friend inline cl_int getInfoHelper ( Func , cl_uint , VECTOR_CLASS < U > * , int , typename U : : cl_type ) ;
cl_int retain ( ) const
{
2018-03-25 17:47:28 +00:00
if ( referenceCountable_ )
{
return ReferenceHandler < cl_type > : : retain ( object_ ) ;
}
else
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
}
cl_int release ( ) const
{
2018-03-25 17:47:28 +00:00
if ( referenceCountable_ )
{
return ReferenceHandler < cl_type > : : release ( object_ ) ;
}
else
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
}
} ;
2018-03-25 17:47:28 +00:00
} // namespace detail
2013-10-18 18:26:06 +00:00
//! \endcond
2019-06-24 09:25:18 +00:00
/*! \stuct ImageFormat
2013-10-18 18:26:06 +00:00
* \ brief Adds constructors and member functions for cl_image_format .
*
* \ see cl_image_format
*/
struct ImageFormat : public cl_image_format
{
//! \brief Default constructor - performs no initialization.
2018-03-25 17:47:28 +00:00
ImageFormat ( ) { }
2013-10-18 18:26:06 +00:00
//! \brief Initializing constructor.
ImageFormat ( cl_channel_order order , cl_channel_type type )
{
image_channel_order = order ;
image_channel_data_type = type ;
}
//! \brief Assignment operator.
2018-03-25 17:47:28 +00:00
ImageFormat & operator = ( const ImageFormat & rhs )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
if ( this ! = & rhs )
{
this - > image_channel_data_type = rhs . image_channel_data_type ;
this - > image_channel_order = rhs . image_channel_order ;
}
2013-10-18 18:26:06 +00:00
return * this ;
}
} ;
/*! \brief Class interface for cl_device_id.
*
* \ note Copies of these objects are inexpensive , since they don ' t ' own '
* any underlying resources or data structures .
*
* \ see cl_device_id
*/
class Device : public detail : : Wrapper < cl_device_id >
{
public :
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Device ( ) : detail : : Wrapper < cl_type > ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_device_id.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This simply copies the device ID value , which is an inexpensive operation .
*/
2019-06-24 09:25:18 +00:00
__CL_EXPLICIT_CONSTRUCTORS Device ( const cl_device_id & device ) : detail : : Wrapper < cl_type > ( device ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Returns the first device on the default context.
*
* \ see Context : : getDefault ( )
*/
2019-06-24 17:25:51 +00:00
static Device getDefault ( cl_int * err = nullptr ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment operator from cl_device_id.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This simply copies the device ID value , which is an inexpensive operation .
*/
2019-06-24 09:25:18 +00:00
Device & operator = ( const cl_device_id & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Device ( const Device & dev ) : detail : : Wrapper < cl_type > ( dev ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Device & operator = ( const Device & dev )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
detail : : Wrapper < cl_type > : : operator = ( dev ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Device ( Device & & dev ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( dev ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Device & operator = ( Device & & dev )
{
detail : : Wrapper < cl_type > : : operator = ( std : : move ( dev ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
//! \brief Wrapper for clGetDeviceInfo().
template < typename T >
cl_int getInfo ( cl_device_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetDeviceInfo , object_ , name , param ) ,
__GET_DEVICE_INFO_ERR ) ;
}
//! \brief Wrapper for clGetDeviceInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_device_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_device_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
/**
* CL 1.2 version
*/
# if defined(CL_VERSION_1_2)
//! \brief Wrapper for clCreateSubDevicesEXT().
cl_int createSubDevices (
2018-03-25 17:47:28 +00:00
const cl_device_partition_property * properties ,
2013-10-18 18:26:06 +00:00
VECTOR_CLASS < Device > * devices )
{
cl_uint n = 0 ;
2019-06-24 17:25:51 +00:00
cl_int err = clCreateSubDevices ( object_ , properties , 0 , nullptr , & n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __CREATE_SUB_DEVICES ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_device_id * ids = ( cl_device_id * ) alloca ( n * sizeof ( cl_device_id ) ) ;
2019-06-24 17:25:51 +00:00
err = clCreateSubDevices ( object_ , properties , n , ids , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __CREATE_SUB_DEVICES ) ;
}
2013-10-18 18:26:06 +00:00
devices - > assign ( & ids [ 0 ] , & ids [ n ] ) ;
return CL_SUCCESS ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
/**
* CL 1.1 version that uses device fission .
*/
# if defined(CL_VERSION_1_1)
# if defined(USE_CL_DEVICE_FISSION)
cl_int createSubDevices (
2018-03-25 17:47:28 +00:00
const cl_device_partition_property_ext * properties ,
2013-10-18 18:26:06 +00:00
VECTOR_CLASS < Device > * devices )
{
2018-03-25 17:47:28 +00:00
typedef CL_API_ENTRY cl_int ( CL_API_CALL * PFN_clCreateSubDevicesEXT ) (
cl_device_id /*in_device*/ ,
const cl_device_partition_property_ext * /* properties */ ,
cl_uint /*num_entries*/ ,
cl_device_id * /*out_devices*/ ,
cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1 ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = nullptr ;
2013-10-18 18:26:06 +00:00
__INIT_CL_EXT_FCN_PTR ( clCreateSubDevicesEXT ) ;
cl_uint n = 0 ;
2019-06-24 17:25:51 +00:00
cl_int err = pfn_clCreateSubDevicesEXT ( object_ , properties , 0 , nullptr , & n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __CREATE_SUB_DEVICES ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_device_id * ids = ( cl_device_id * ) alloca ( n * sizeof ( cl_device_id ) ) ;
2019-06-24 17:25:51 +00:00
err = pfn_clCreateSubDevicesEXT ( object_ , properties , n , ids , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __CREATE_SUB_DEVICES ) ;
}
2013-10-18 18:26:06 +00:00
devices - > assign ( & ids [ 0 ] , & ids [ n ] ) ;
return CL_SUCCESS ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(USE_CL_DEVICE_FISSION)
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
} ;
/*! \brief Class interface for cl_platform_id.
*
* \ note Copies of these objects are inexpensive , since they don ' t ' own '
* any underlying resources or data structures .
*
* \ see cl_platform_id
*/
class Platform : public detail : : Wrapper < cl_platform_id >
{
public :
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Platform ( ) : detail : : Wrapper < cl_type > ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_platform_id.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This simply copies the platform ID value , which is an inexpensive operation .
*/
2019-06-24 09:25:18 +00:00
__CL_EXPLICIT_CONSTRUCTORS Platform ( const cl_platform_id & platform ) : detail : : Wrapper < cl_type > ( platform ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Assignment operator from cl_platform_id.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This simply copies the platform ID value , which is an inexpensive operation .
*/
2018-03-25 17:47:28 +00:00
Platform & operator = ( const cl_platform_id & rhs )
2013-10-18 18:26:06 +00:00
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
//! \brief Wrapper for clGetPlatformInfo().
cl_int getInfo ( cl_platform_info name , STRING_CLASS * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetPlatformInfo , object_ , name , param ) ,
__GET_PLATFORM_INFO_ERR ) ;
}
//! \brief Wrapper for clGetPlatformInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_platform_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_platform_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
/*! \brief Gets a list of devices for this platform.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clGetDeviceIDs ( ) .
*/
cl_int getDevices (
cl_device_type type ,
VECTOR_CLASS < Device > * devices ) const
{
cl_uint n = 0 ;
2019-06-24 17:25:51 +00:00
if ( devices = = nullptr )
2018-03-25 17:47:28 +00:00
{
return detail : : errHandler ( CL_INVALID_ARG_VALUE , __GET_DEVICE_IDS_ERR ) ;
}
2019-06-24 17:25:51 +00:00
cl_int err = : : clGetDeviceIDs ( object_ , type , 0 , nullptr , & n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_DEVICE_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_device_id * ids = ( cl_device_id * ) alloca ( n * sizeof ( cl_device_id ) ) ;
2019-06-24 17:25:51 +00:00
err = : : clGetDeviceIDs ( object_ , type , n , ids , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_DEVICE_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
devices - > assign ( & ids [ 0 ] , & ids [ n ] ) ;
return CL_SUCCESS ;
}
# if defined(USE_DX_INTEROP)
2018-03-25 17:47:28 +00:00
/*! \brief Get the list of available D3D10 devices.
2013-10-18 18:26:06 +00:00
*
* \ param d3d_device_source .
*
* \ param d3d_object .
*
* \ param d3d_device_set .
*
* \ param devices returns a vector of OpenCL D3D10 devices found . The cl : : Device
* values returned in devices can be used to identify a specific OpenCL
2019-06-24 17:25:51 +00:00
* device . If \ a devices argument is nullptr , this argument is ignored .
2013-10-18 18:26:06 +00:00
*
* \ return One of the following values :
* - CL_SUCCESS if the function is executed successfully .
*
* The application can query specific capabilities of the OpenCL device ( s )
* returned by cl : : getDevices . This can be used by the application to
* determine which device ( s ) to use .
*
* \ note In the case that exceptions are enabled and a return value
* other than CL_SUCCESS is generated , then cl : : Error exception is
* generated .
*/
cl_int getDevices (
cl_d3d10_device_source_khr d3d_device_source ,
2018-03-25 17:47:28 +00:00
void * d3d_object ,
cl_d3d10_device_set_khr d3d_device_set ,
2013-10-18 18:26:06 +00:00
VECTOR_CLASS < Device > * devices ) const
{
2018-03-25 17:47:28 +00:00
typedef CL_API_ENTRY cl_int ( CL_API_CALL * PFN_clGetDeviceIDsFromD3D10KHR ) (
cl_platform_id platform ,
cl_d3d10_device_source_khr d3d_device_source ,
void * d3d_object ,
2013-10-18 18:26:06 +00:00
cl_d3d10_device_set_khr d3d_device_set ,
cl_uint num_entries ,
2018-03-25 17:47:28 +00:00
cl_device_id * devices ,
2013-10-18 18:26:06 +00:00
cl_uint * num_devices ) ;
2019-06-24 17:25:51 +00:00
if ( devices = = nullptr )
2018-03-25 17:47:28 +00:00
{
return detail : : errHandler ( CL_INVALID_ARG_VALUE , __GET_DEVICE_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = nullptr ;
2013-10-18 18:26:06 +00:00
__INIT_CL_EXT_FCN_PTR_PLATFORM ( object_ , clGetDeviceIDsFromD3D10KHR ) ;
cl_uint n = 0 ;
cl_int err = pfn_clGetDeviceIDsFromD3D10KHR (
2018-03-25 17:47:28 +00:00
object_ ,
d3d_device_source ,
2013-10-18 18:26:06 +00:00
d3d_object ,
2018-03-25 17:47:28 +00:00
d3d_device_set ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2013-10-18 18:26:06 +00:00
& n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_DEVICE_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_device_id * ids = ( cl_device_id * ) alloca ( n * sizeof ( cl_device_id ) ) ;
2013-10-18 18:26:06 +00:00
err = pfn_clGetDeviceIDsFromD3D10KHR (
2018-03-25 17:47:28 +00:00
object_ ,
d3d_device_source ,
2013-10-18 18:26:06 +00:00
d3d_object ,
d3d_device_set ,
2018-03-25 17:47:28 +00:00
n ,
ids ,
2019-06-24 17:25:51 +00:00
nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_DEVICE_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
devices - > assign ( & ids [ 0 ] , & ids [ n ] ) ;
return CL_SUCCESS ;
}
# endif
/*! \brief Gets a list of available platforms.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clGetPlatformIDs ( ) .
*/
static cl_int get (
VECTOR_CLASS < Platform > * platforms )
{
cl_uint n = 0 ;
2019-06-24 17:25:51 +00:00
if ( platforms = = nullptr )
2018-03-25 17:47:28 +00:00
{
return detail : : errHandler ( CL_INVALID_ARG_VALUE , __GET_PLATFORM_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
cl_int err = : : clGetPlatformIDs ( 0 , nullptr , & n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_PLATFORM_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_platform_id * ids = ( cl_platform_id * ) alloca (
2013-10-18 18:26:06 +00:00
n * sizeof ( cl_platform_id ) ) ;
2019-06-24 17:25:51 +00:00
err = : : clGetPlatformIDs ( n , ids , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_PLATFORM_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
platforms - > assign ( & ids [ 0 ] , & ids [ n ] ) ;
return CL_SUCCESS ;
}
/*! \brief Gets the first available platform.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clGetPlatformIDs ( ) , returning the first result .
*/
static cl_int get (
2018-03-25 17:47:28 +00:00
Platform * platform )
2013-10-18 18:26:06 +00:00
{
cl_uint n = 0 ;
2019-06-24 17:25:51 +00:00
if ( platform = = nullptr )
2018-03-25 17:47:28 +00:00
{
return detail : : errHandler ( CL_INVALID_ARG_VALUE , __GET_PLATFORM_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
cl_int err = : : clGetPlatformIDs ( 0 , nullptr , & n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_PLATFORM_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_platform_id * ids = ( cl_platform_id * ) alloca (
2013-10-18 18:26:06 +00:00
n * sizeof ( cl_platform_id ) ) ;
2019-06-24 17:25:51 +00:00
err = : : clGetPlatformIDs ( n , ids , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_PLATFORM_IDS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
* platform = ids [ 0 ] ;
return CL_SUCCESS ;
}
/*! \brief Gets the first available platform, returning it by value.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clGetPlatformIDs ( ) , returning the first result .
*/
static Platform get (
2019-06-24 17:25:51 +00:00
cl_int * errResult = nullptr )
2013-10-18 18:26:06 +00:00
{
Platform platform ;
cl_uint n = 0 ;
2019-06-24 17:25:51 +00:00
cl_int err = : : clGetPlatformIDs ( 0 , nullptr , & n ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
detail : : errHandler ( err , __GET_PLATFORM_IDS_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( errResult ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* errResult = err ;
}
2019-06-24 09:25:18 +00:00
return Platform ( ) ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
cl_platform_id * ids = ( cl_platform_id * ) alloca (
2013-10-18 18:26:06 +00:00
n * sizeof ( cl_platform_id ) ) ;
2019-06-24 17:25:51 +00:00
err = : : clGetPlatformIDs ( n , ids , nullptr ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
detail : : errHandler ( err , __GET_PLATFORM_IDS_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( errResult ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* errResult = err ;
}
return Platform ( ) ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
return Platform ( ids [ 0 ] ) ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
static Platform getDefault (
2019-06-24 17:25:51 +00:00
cl_int * errResult = nullptr )
2013-10-18 18:26:06 +00:00
{
return get ( errResult ) ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
//! \brief Wrapper for clUnloadCompiler().
cl_int
unloadCompiler ( )
{
return : : clUnloadPlatformCompiler ( object_ ) ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
} ; // class Platform
2013-10-18 18:26:06 +00:00
/**
* Deprecated APIs for 1.2
*/
# if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
/**
* Unload the OpenCL compiler .
* \ note Deprecated for OpenCL 1.2 . Use Platform : : unloadCompiler instead .
*/
inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int
UnloadCompiler ( ) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED ;
inline cl_int
UnloadCompiler ( )
{
return : : clUnloadCompiler ( ) ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
/*! \brief Class interface for cl_context.
*
* \ note Copies of these objects are shallow , meaning that the copy will refer
* to the same underlying cl_context as the original . For details , see
* clRetainContext ( ) and clReleaseContext ( ) .
*
* \ see cl_context
*/
2018-03-25 17:47:28 +00:00
class Context
2013-10-18 18:26:06 +00:00
: public detail : : Wrapper < cl_context >
{
private :
2019-06-24 09:25:18 +00:00
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
static std : : atomic < int > default_initialized_ ;
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
static volatile int default_initialized_ ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
static Context default_ ;
static volatile cl_int default_error_ ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
public :
/*! \brief Constructs a context including a list of specified devices.
*
* Wraps clCreateContext ( ) .
*/
Context (
const VECTOR_CLASS < Device > & devices ,
2019-06-24 17:25:51 +00:00
cl_context_properties * properties = nullptr ,
2018-03-25 17:47:28 +00:00
void ( CL_CALLBACK * notifyFptr ) (
const char * ,
const void * ,
2013-10-18 18:26:06 +00:00
: : size_t ,
2019-06-24 17:25:51 +00:00
void * ) = nullptr ,
void * data = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
: : size_t numDevices = devices . size ( ) ;
2018-03-25 17:47:28 +00:00
cl_device_id * deviceIDs = ( cl_device_id * ) alloca ( numDevices * sizeof ( cl_device_id ) ) ;
for ( : : size_t deviceIndex = 0 ; deviceIndex < numDevices ; + + deviceIndex )
{
deviceIDs [ deviceIndex ] = ( devices [ deviceIndex ] ) ( ) ;
}
2013-10-18 18:26:06 +00:00
object_ = : : clCreateContext (
2018-03-25 17:47:28 +00:00
properties , ( cl_uint ) numDevices ,
2013-10-18 18:26:06 +00:00
deviceIDs ,
notifyFptr , data , & error ) ;
detail : : errHandler ( error , __CREATE_CONTEXT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
Context (
const Device & device ,
2019-06-24 17:25:51 +00:00
cl_context_properties * properties = nullptr ,
2018-03-25 17:47:28 +00:00
void ( CL_CALLBACK * notifyFptr ) (
const char * ,
const void * ,
2013-10-18 18:26:06 +00:00
: : size_t ,
2019-06-24 17:25:51 +00:00
void * ) = nullptr ,
void * data = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
cl_device_id deviceID = device ( ) ;
object_ = : : clCreateContext (
properties , 1 ,
& deviceID ,
notifyFptr , data , & error ) ;
detail : : errHandler ( error , __CREATE_CONTEXT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
/*! \brief Constructs a context including all or a subset of devices of a specified type.
2013-10-18 18:26:06 +00:00
*
* Wraps clCreateContextFromType ( ) .
*/
Context (
cl_device_type type ,
2019-06-24 17:25:51 +00:00
cl_context_properties * properties = nullptr ,
2018-03-25 17:47:28 +00:00
void ( CL_CALLBACK * notifyFptr ) (
const char * ,
const void * ,
2013-10-18 18:26:06 +00:00
: : size_t ,
2019-06-24 17:25:51 +00:00
void * ) = nullptr ,
void * data = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2019-06-24 09:25:18 +00:00
# if !defined(__APPLE__) && !defined(__MACOS)
2018-03-25 17:47:28 +00:00
cl_context_properties prop [ 4 ] = { CL_CONTEXT_PLATFORM , 0 , 0 , 0 } ;
2019-06-24 09:25:18 +00:00
2019-06-24 17:25:51 +00:00
if ( properties = = nullptr )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
// Get a valid platform ID as we cannot send in a blank one
VECTOR_CLASS < Platform > platforms ;
error = Platform : : get ( & platforms ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
detail : : errHandler ( error , __CREATE_CONTEXT_FROM_TYPE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2019-06-24 09:25:18 +00:00
return ;
}
// Check the platforms we found for a device of our specified type
cl_context_properties platform_id = 0 ;
for ( unsigned int i = 0 ; i < platforms . size ( ) ; i + + )
{
VECTOR_CLASS < Device > devices ;
# if defined(__CL_ENABLE_EXCEPTIONS)
try
{
# endif
error = platforms [ i ] . getDevices ( type , & devices ) ;
# if defined(__CL_ENABLE_EXCEPTIONS)
}
catch ( Error )
{
}
// Catch if exceptions are enabled as we don't want to exit if first platform has no devices of type
// We do error checking next anyway, and can throw there if needed
# endif
// Only squash CL_SUCCESS and CL_DEVICE_NOT_FOUND
if ( error ! = CL_SUCCESS & & error ! = CL_DEVICE_NOT_FOUND )
{
detail : : errHandler ( error , __CREATE_CONTEXT_FROM_TYPE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
}
if ( devices . size ( ) > 0 )
{
platform_id = ( cl_context_properties ) platforms [ i ] ( ) ;
break ;
}
}
if ( platform_id = = 0 )
{
detail : : errHandler ( CL_DEVICE_NOT_FOUND , __CREATE_CONTEXT_FROM_TYPE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = CL_DEVICE_NOT_FOUND ;
}
return ;
2018-03-25 17:47:28 +00:00
}
2019-06-24 09:25:18 +00:00
prop [ 1 ] = platform_id ;
2018-03-25 17:47:28 +00:00
properties = & prop [ 0 ] ;
2013-10-18 18:26:06 +00:00
}
# endif
object_ = : : clCreateContextFromType (
properties , type , notifyFptr , data , & error ) ;
detail : : errHandler ( error , __CREATE_CONTEXT_FROM_TYPE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Context ( const Context & ctx ) : detail : : Wrapper < cl_type > ( ctx ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Context & operator = ( const Context & ctx )
{
detail : : Wrapper < cl_type > : : operator = ( ctx ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Context ( Context & & ctx ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( ctx ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Context & operator = ( Context & & ctx )
{
detail : : Wrapper < cl_type > : : operator = ( std : : move ( ctx ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
/*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.
*
* \ note All calls to this function return the same cl_context as the first .
*/
2019-06-24 17:25:51 +00:00
static Context getDefault ( cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
int state = detail : : compare_exchange (
2018-03-25 17:47:28 +00:00
& default_initialized_ ,
2013-10-18 18:26:06 +00:00
__DEFAULT_BEING_INITIALIZED , __DEFAULT_NOT_INITIALIZED ) ;
2018-03-25 17:47:28 +00:00
if ( state & __DEFAULT_INITIALIZED )
{
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = default_error_ ;
}
return default_ ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
if ( state & __DEFAULT_BEING_INITIALIZED )
{
// Assume writes will propagate eventually...
while ( default_initialized_ ! = __DEFAULT_INITIALIZED )
{
detail : : fence ( ) ;
}
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = default_error_ ;
}
return default_ ;
2013-10-18 18:26:06 +00:00
}
cl_int error ;
default_ = Context (
CL_DEVICE_TYPE_DEFAULT ,
2019-06-24 17:25:51 +00:00
nullptr ,
nullptr ,
nullptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : fence ( ) ;
default_error_ = error ;
// Assume writes will propagate eventually...
default_initialized_ = __DEFAULT_INITIALIZED ;
detail : : fence ( ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = default_error_ ;
}
2013-10-18 18:26:06 +00:00
return default_ ;
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Context ( ) : detail : : Wrapper < cl_type > ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_context - takes ownership.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This effectively transfers ownership of a refcount on the cl_context
* into the new Context object .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Context ( const cl_context & context ) : detail : : Wrapper < cl_type > ( context ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Assignment operator from cl_context - takes ownership.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This effectively transfers ownership of a refcount on the rhs and calls
* clReleaseContext ( ) on the value previously held by this instance .
*/
2018-03-25 17:47:28 +00:00
Context & operator = ( const cl_context & rhs )
2013-10-18 18:26:06 +00:00
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
//! \brief Wrapper for clGetContextInfo().
template < typename T >
cl_int getInfo ( cl_context_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetContextInfo , object_ , name , param ) ,
__GET_CONTEXT_INFO_ERR ) ;
}
//! \brief Wrapper for clGetContextInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_context_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_context_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
/*! \brief Gets a list of supported image formats.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clGetSupportedImageFormats ( ) .
*/
cl_int getSupportedImageFormats (
cl_mem_flags flags ,
cl_mem_object_type type ,
VECTOR_CLASS < ImageFormat > * formats ) const
{
cl_uint numEntries ;
2019-06-24 09:25:18 +00:00
if ( ! formats )
{
return CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
cl_int err = : : clGetSupportedImageFormats (
2018-03-25 17:47:28 +00:00
object_ ,
flags ,
type ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2018-03-25 17:47:28 +00:00
& numEntries ) ;
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_SUPPORTED_IMAGE_FORMATS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
if ( numEntries > 0 )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
ImageFormat * value = ( ImageFormat * )
alloca ( numEntries * sizeof ( ImageFormat ) ) ;
err = : : clGetSupportedImageFormats (
object_ ,
flags ,
type ,
numEntries ,
( cl_image_format * ) value ,
2019-06-24 17:25:51 +00:00
nullptr ) ;
2019-06-24 09:25:18 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __GET_SUPPORTED_IMAGE_FORMATS_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
formats - > assign ( & value [ 0 ] , & value [ numEntries ] ) ;
}
else
{
formats - > clear ( ) ;
}
2013-10-18 18:26:06 +00:00
return CL_SUCCESS ;
}
} ;
2018-03-25 17:47:28 +00:00
inline Device Device : : getDefault ( cl_int * err )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
Device device ;
Context context = Context : : getDefault ( & error ) ;
2019-06-24 09:25:18 +00:00
detail : : errHandler ( error , __CREATE_CONTEXT_ERR ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
else
{
device = context . getInfo < CL_CONTEXT_DEVICES > ( ) [ 0 ] ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = CL_SUCCESS ;
}
2013-10-18 18:26:06 +00:00
}
return device ;
}
# ifdef _WIN32
2019-06-24 09:25:18 +00:00
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
__declspec ( selectany ) std : : atomic < int > Context : : default_initialized_ ;
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__declspec ( selectany ) volatile int Context : : default_initialized_ = __DEFAULT_NOT_INITIALIZED ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__declspec ( selectany ) Context Context : : default_ ;
__declspec ( selectany ) volatile cl_int Context : : default_error_ = CL_SUCCESS ;
2019-06-24 09:25:18 +00:00
# else // !_WIN32
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
__attribute__ ( ( weak ) ) std : : atomic < int > Context : : default_initialized_ ;
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__attribute__ ( ( weak ) ) volatile int Context : : default_initialized_ = __DEFAULT_NOT_INITIALIZED ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__attribute__ ( ( weak ) ) Context Context : : default_ ;
__attribute__ ( ( weak ) ) volatile cl_int Context : : default_error_ = CL_SUCCESS ;
2019-06-24 09:25:18 +00:00
# endif // !_WIN32
2013-10-18 18:26:06 +00:00
/*! \brief Class interface for cl_event.
*
* \ note Copies of these objects are shallow , meaning that the copy will refer
* to the same underlying cl_event as the original . For details , see
* clRetainEvent ( ) and clReleaseEvent ( ) .
*
* \ see cl_event
*/
class Event : public detail : : Wrapper < cl_event >
{
public :
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Event ( ) : detail : : Wrapper < cl_type > ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_event - takes ownership.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This effectively transfers ownership of a refcount on the cl_event
* into the new Event object .
*/
2019-06-24 09:25:18 +00:00
__CL_EXPLICIT_CONSTRUCTORS Event ( const cl_event & event ) : detail : : Wrapper < cl_type > ( event ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Assignment operator from cl_event - takes ownership.
*
* This effectively transfers ownership of a refcount on the rhs and calls
* clReleaseEvent ( ) on the value previously held by this instance .
*/
2018-03-25 17:47:28 +00:00
Event & operator = ( const cl_event & rhs )
2013-10-18 18:26:06 +00:00
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
//! \brief Wrapper for clGetEventInfo().
template < typename T >
cl_int getInfo ( cl_event_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetEventInfo , object_ , name , param ) ,
__GET_EVENT_INFO_ERR ) ;
}
//! \brief Wrapper for clGetEventInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_event_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_event_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
//! \brief Wrapper for clGetEventProfilingInfo().
template < typename T >
cl_int getProfilingInfo ( cl_profiling_info name , T * param ) const
{
return detail : : errHandler ( detail : : getInfo (
2018-03-25 17:47:28 +00:00
& : : clGetEventProfilingInfo , object_ , name , param ) ,
2013-10-18 18:26:06 +00:00
__GET_EVENT_PROFILE_INFO_ERR ) ;
}
//! \brief Wrapper for clGetEventProfilingInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_profiling_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getProfilingInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_profiling_info , name > : : param_type param ;
cl_int result = getProfilingInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
/*! \brief Blocks the calling thread until this event completes.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clWaitForEvents ( ) .
*/
cl_int wait ( ) const
{
return detail : : errHandler (
: : clWaitForEvents ( 1 , & object_ ) ,
__WAIT_FOR_EVENTS_ERR ) ;
}
# if defined(CL_VERSION_1_1)
/*! \brief Registers a user callback function for a specific command execution status.
*
* Wraps clSetEventCallback ( ) .
*/
cl_int setCallback (
cl_int type ,
2018-03-25 17:47:28 +00:00
void ( CL_CALLBACK * pfn_notify ) ( cl_event , cl_int , void * ) ,
2019-06-24 17:25:51 +00:00
void * user_data = nullptr )
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
: : clSetEventCallback (
object_ ,
type ,
pfn_notify ,
2018-03-25 17:47:28 +00:00
user_data ) ,
2013-10-18 18:26:06 +00:00
__SET_EVENT_CALLBACK_ERR ) ;
}
# endif
/*! \brief Blocks the calling thread until every event specified is complete.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clWaitForEvents ( ) .
*/
static cl_int
waitForEvents ( const VECTOR_CLASS < Event > & events )
{
return detail : : errHandler (
: : clWaitForEvents (
2019-06-24 17:25:51 +00:00
( cl_uint ) events . size ( ) , ( events . size ( ) > 0 ) ? ( cl_event * ) & events . front ( ) : nullptr ) ,
2013-10-18 18:26:06 +00:00
__WAIT_FOR_EVENTS_ERR ) ;
}
} ;
# if defined(CL_VERSION_1_1)
/*! \brief Class interface for user events (a subset of cl_event's).
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* See Event for details about copy semantics , etc .
*/
class UserEvent : public Event
{
public :
/*! \brief Constructs a user event on a given context.
*
* Wraps clCreateUserEvent ( ) .
*/
UserEvent (
const Context & context ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateUserEvent (
context ( ) ,
& error ) ;
detail : : errHandler ( error , __CREATE_USER_EVENT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
UserEvent ( ) : Event ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Sets the execution status of a user event object.
*
* Wraps clSetUserEventStatus ( ) .
*/
cl_int setStatus ( cl_int status )
{
return detail : : errHandler (
2018-03-25 17:47:28 +00:00
: : clSetUserEventStatus ( object_ , status ) ,
2013-10-18 18:26:06 +00:00
__SET_USER_EVENT_STATUS_ERR ) ;
}
} ;
# endif
/*! \brief Blocks the calling thread until every event specified is complete.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* Wraps clWaitForEvents ( ) .
*/
inline static cl_int
WaitForEvents ( const VECTOR_CLASS < Event > & events )
{
return detail : : errHandler (
: : clWaitForEvents (
2019-06-24 17:25:51 +00:00
( cl_uint ) events . size ( ) , ( events . size ( ) > 0 ) ? ( cl_event * ) & events . front ( ) : nullptr ) ,
2013-10-18 18:26:06 +00:00
__WAIT_FOR_EVENTS_ERR ) ;
}
/*! \brief Class interface for cl_mem.
*
* \ note Copies of these objects are shallow , meaning that the copy will refer
* to the same underlying cl_mem as the original . For details , see
* clRetainMemObject ( ) and clReleaseMemObject ( ) .
*
* \ see cl_mem
*/
class Memory : public detail : : Wrapper < cl_mem >
{
public :
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Memory ( ) : detail : : Wrapper < cl_type > ( ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This effectively transfers ownership of a refcount on the cl_mem
* into the new Memory object .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Memory ( const cl_mem & memory ) : detail : : Wrapper < cl_type > ( memory ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Assignment operator from cl_mem - takes ownership.
*
* This effectively transfers ownership of a refcount on the rhs and calls
* clReleaseMemObject ( ) on the value previously held by this instance .
*/
2018-03-25 17:47:28 +00:00
Memory & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Memory ( const Memory & mem ) : detail : : Wrapper < cl_type > ( mem ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Memory & operator = ( const Memory & mem )
{
detail : : Wrapper < cl_type > : : operator = ( mem ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Memory ( Memory & & mem ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( mem ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Memory & operator = ( Memory & & mem )
{
detail : : Wrapper < cl_type > : : operator = ( std : : move ( mem ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
//! \brief Wrapper for clGetMemObjectInfo().
template < typename T >
cl_int getInfo ( cl_mem_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetMemObjectInfo , object_ , name , param ) ,
__GET_MEM_OBJECT_INFO_ERR ) ;
}
//! \brief Wrapper for clGetMemObjectInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_mem_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_mem_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
# if defined(CL_VERSION_1_1)
/*! \brief Registers a callback function to be called when the memory object
* is no longer needed .
*
* Wraps clSetMemObjectDestructorCallback ( ) .
*
* Repeated calls to this function , for a given cl_mem value , will append
* to the list of functions called ( in reverse order ) when memory object ' s
* resources are freed and the memory object is deleted .
*
* \ note
* The registered callbacks are associated with the underlying cl_mem
* value - not the Memory class instance .
*/
cl_int setDestructorCallback (
2018-03-25 17:47:28 +00:00
void ( CL_CALLBACK * pfn_notify ) ( cl_mem , void * ) ,
2019-06-24 17:25:51 +00:00
void * user_data = nullptr )
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
: : clSetMemObjectDestructorCallback (
object_ ,
pfn_notify ,
2018-03-25 17:47:28 +00:00
user_data ) ,
2013-10-18 18:26:06 +00:00
__SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR ) ;
}
# endif
} ;
// Pre-declare copy functions
class Buffer ;
2018-03-25 17:47:28 +00:00
template < typename IteratorType >
cl_int copy ( IteratorType startIterator , IteratorType endIterator , cl : : Buffer & buffer ) ;
template < typename IteratorType >
cl_int copy ( const cl : : Buffer & buffer , IteratorType startIterator , IteratorType endIterator ) ;
2019-06-24 09:25:18 +00:00
template < typename IteratorType >
cl_int copy ( const CommandQueue & queue , IteratorType startIterator , IteratorType endIterator , cl : : Buffer & buffer ) ;
template < typename IteratorType >
cl_int copy ( const CommandQueue & queue , const cl : : Buffer & buffer , IteratorType startIterator , IteratorType endIterator ) ;
2013-10-18 18:26:06 +00:00
/*! \brief Class interface for Buffer Memory Objects.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* See Memory for details about copy semantics , etc .
*
* \ see Memory
*/
class Buffer : public Memory
{
public :
/*! \brief Constructs a Buffer in a specified context.
*
* Wraps clCreateBuffer ( ) .
*
* \ param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
* specified . Note alignment & exclusivity requirements .
*/
Buffer (
const Context & context ,
cl_mem_flags flags ,
: : size_t size ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateBuffer ( context ( ) , flags , size , host_ptr , & error ) ;
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
/*! \brief Constructs a Buffer in the default context.
*
* Wraps clCreateBuffer ( ) .
*
* \ param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
* specified . Note alignment & exclusivity requirements .
*
* \ see Context : : getDefault ( )
*/
Buffer (
2018-03-25 17:47:28 +00:00
cl_mem_flags flags ,
2013-10-18 18:26:06 +00:00
: : size_t size ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
Context context = Context : : getDefault ( err ) ;
object_ = : : clCreateBuffer ( context ( ) , flags , size , host_ptr , & error ) ;
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
/*!
* \ brief Construct a Buffer from a host container via iterators .
2019-06-24 09:25:18 +00:00
* IteratorType must be random access .
* If useHostPtr is specified iterators must represent contiguous data .
2013-10-18 18:26:06 +00:00
*/
2018-03-25 17:47:28 +00:00
template < typename IteratorType >
2013-10-18 18:26:06 +00:00
Buffer (
IteratorType startIterator ,
IteratorType endIterator ,
bool readOnly ,
bool useHostPtr = false ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
typedef typename std : : iterator_traits < IteratorType > : : value_type DataType ;
cl_int error ;
cl_mem_flags flags = 0 ;
2018-03-25 17:47:28 +00:00
if ( readOnly )
{
flags | = CL_MEM_READ_ONLY ;
}
else
{
flags | = CL_MEM_READ_WRITE ;
}
if ( useHostPtr )
{
flags | = CL_MEM_USE_HOST_PTR ;
}
: : size_t size = sizeof ( DataType ) * ( endIterator - startIterator ) ;
2013-10-18 18:26:06 +00:00
Context context = Context : : getDefault ( err ) ;
2018-03-25 17:47:28 +00:00
if ( useHostPtr )
{
object_ = : : clCreateBuffer ( context ( ) , flags , size , static_cast < DataType * > ( & * startIterator ) , & error ) ;
}
else
{
2019-06-28 10:26:46 +00:00
object_ = : : clCreateBuffer ( context ( ) , flags , size , nullptr , & error ) ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
2013-10-18 18:26:06 +00:00
* err = error ;
}
2018-03-25 17:47:28 +00:00
if ( ! useHostPtr )
{
error = cl : : copy ( startIterator , endIterator , * this ) ;
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
/*!
* \ brief Construct a Buffer from a host container via iterators using a specified context .
* IteratorType must be random access .
* If useHostPtr is specified iterators must represent contiguous data .
*/
template < typename IteratorType >
Buffer ( const Context & context , IteratorType startIterator , IteratorType endIterator ,
2019-06-24 17:25:51 +00:00
bool readOnly , bool useHostPtr = false , cl_int * err = nullptr ) ;
2019-06-24 09:25:18 +00:00
/*!
* \ brief Construct a Buffer from a host container via iterators using a specified queue .
* If useHostPtr is specified iterators must represent contiguous data .
*/
template < typename IteratorType >
Buffer ( const CommandQueue & queue , IteratorType startIterator , IteratorType endIterator ,
2019-06-24 17:25:51 +00:00
bool readOnly , bool useHostPtr = false , cl_int * err = nullptr ) ;
2019-06-24 09:25:18 +00:00
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Buffer ( ) : Memory ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Buffer ( const cl_mem & buffer ) : Memory ( buffer ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Buffer & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Memory : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Buffer ( const Buffer & buf ) : Memory ( buf ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Buffer & operator = ( const Buffer & buf )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Memory : : operator = ( buf ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Buffer ( Buffer & & buf ) CL_HPP_NOEXCEPT : Memory ( std : : move ( buf ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Buffer & operator = ( Buffer & & buf )
{
Memory : : operator = ( std : : move ( buf ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_1)
/*! \brief Creates a new buffer object from this.
*
* Wraps clCreateSubBuffer ( ) .
*/
Buffer createSubBuffer (
cl_mem_flags flags ,
cl_buffer_create_type buffer_create_type ,
2018-03-25 17:47:28 +00:00
const void * buffer_create_info ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
Buffer result ;
cl_int error ;
result . object_ = : : clCreateSubBuffer (
2018-03-25 17:47:28 +00:00
object_ ,
flags ,
buffer_create_type ,
buffer_create_info ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __CREATE_SUBBUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
return result ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
# endif
} ;
2018-03-25 17:47:28 +00:00
# if defined(USE_DX_INTEROP)
2013-10-18 18:26:06 +00:00
/*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.
*
* This is provided to facilitate interoperability with Direct3D .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* See Memory for details about copy semantics , etc .
*
* \ see Memory
*/
class BufferD3D10 : public Buffer
{
public :
2018-03-25 17:47:28 +00:00
typedef CL_API_ENTRY cl_mem ( CL_API_CALL * PFN_clCreateFromD3D10BufferKHR ) (
cl_context context , cl_mem_flags flags , ID3D10Buffer * buffer ,
cl_int * errcode_ret ) ;
2013-10-18 18:26:06 +00:00
/*! \brief Constructs a BufferD3D10, in a specified context, from a
* given ID3D10Buffer .
*
* Wraps clCreateFromD3D10BufferKHR ( ) .
*/
BufferD3D10 (
const Context & context ,
cl_mem_flags flags ,
ID3D10Buffer * bufobj ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = nullptr ;
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
vector < cl_context_properties > props = context . getInfo < CL_CONTEXT_PROPERTIES > ( ) ;
cl_platform platform = - 1 ;
2018-03-25 17:47:28 +00:00
for ( int i = 0 ; i < props . size ( ) ; + + i )
{
if ( props [ i ] = = CL_CONTEXT_PLATFORM )
{
platform = props [ i + 1 ] ;
}
2013-10-18 18:26:06 +00:00
}
__INIT_CL_EXT_FCN_PTR_PLATFORM ( platform , clCreateFromD3D10BufferKHR ) ;
# endif
# if defined(CL_VERSION_1_1)
__INIT_CL_EXT_FCN_PTR ( clCreateFromD3D10BufferKHR ) ;
# endif
cl_int error ;
object_ = pfn_clCreateFromD3D10BufferKHR (
context ( ) ,
flags ,
bufobj ,
& error ) ;
detail : : errHandler ( error , __CREATE_GL_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
BufferD3D10 ( ) : Buffer ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS BufferD3D10 ( const cl_mem & buffer ) : Buffer ( buffer ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
BufferD3D10 & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Buffer : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
BufferD3D10 ( const BufferD3D10 & buf ) : Buffer ( buf ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
BufferD3D10 & operator = ( const BufferD3D10 & buf )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Buffer : : operator = ( buf ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
BufferD3D10 ( BufferD3D10 & & buf ) CL_HPP_NOEXCEPT : Buffer ( std : : move ( buf ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
BufferD3D10 & operator = ( BufferD3D10 & & buf )
{
Buffer : : operator = ( std : : move ( buf ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
# endif
/*! \brief Class interface for GL Buffer Memory Objects.
*
* This is provided to facilitate interoperability with OpenGL .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
*/
class BufferGL : public Buffer
{
public :
/*! \brief Constructs a BufferGL in a specified context, from a given
* GL buffer .
*
* Wraps clCreateFromGLBuffer ( ) .
*/
BufferGL (
const Context & context ,
cl_mem_flags flags ,
2019-06-24 09:25:18 +00:00
cl_GLuint bufobj ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateFromGLBuffer (
context ( ) ,
flags ,
bufobj ,
& error ) ;
detail : : errHandler ( error , __CREATE_GL_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
BufferGL ( ) : Buffer ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS BufferGL ( const cl_mem & buffer ) : Buffer ( buffer ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
BufferGL & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
Buffer : : operator = ( rhs ) ;
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
BufferGL ( const BufferGL & buf ) : Buffer ( buf ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
BufferGL & operator = ( const BufferGL & buf )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Buffer : : operator = ( buf ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
BufferGL ( BufferGL & & buf ) CL_HPP_NOEXCEPT : Buffer ( std : : move ( buf ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
BufferGL & operator = ( BufferGL & & buf )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Buffer : : operator = ( std : : move ( buf ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
//! \brief Wrapper for clGetGLObjectInfo().
cl_int getObjectInfo (
2018-03-25 17:47:28 +00:00
cl_gl_object_type * type ,
2019-06-24 09:25:18 +00:00
cl_GLuint * gl_object_name )
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
2018-03-25 17:47:28 +00:00
: : clGetGLObjectInfo ( object_ , type , gl_object_name ) ,
2013-10-18 18:26:06 +00:00
__GET_GL_OBJECT_INFO_ERR ) ;
}
} ;
/*! \brief C++ base class for Image Memory objects.
*
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
*/
class Image : public Memory
{
protected :
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Image ( ) : Memory ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image ( const cl_mem & image ) : Memory ( image ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Image & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Memory : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Image ( const Image & img ) : Memory ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image & operator = ( const Image & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Memory : : operator = ( img ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image ( Image & & img ) CL_HPP_NOEXCEPT : Memory ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image & operator = ( Image & & img )
{
Memory : : operator = ( std : : move ( img ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
public :
//! \brief Wrapper for clGetImageInfo().
template < typename T >
cl_int getImageInfo ( cl_image_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetImageInfo , object_ , name , param ) ,
__GET_IMAGE_INFO_ERR ) ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
//! \brief Wrapper for clGetImageInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_image_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getImageInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_image_info , name > : : param_type param ;
cl_int result = getImageInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
} ;
# if defined(CL_VERSION_1_2)
/*! \brief Class interface for 1D Image Memory objects.
*
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
*/
class Image1D : public Image
{
public :
/*! \brief Constructs a 1D Image in a specified context.
*
* Wraps clCreateImage ( ) .
*/
Image1D (
const Context & context ,
cl_mem_flags flags ,
ImageFormat format ,
: : size_t width ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2019-06-24 09:25:18 +00:00
cl_image_desc desc =
{
CL_MEM_OBJECT_IMAGE1D ,
width ,
2019-06-28 10:26:46 +00:00
0 , 0 , 0 , 0 , 0 , 0 , 0 , nullptr } ;
2013-10-18 18:26:06 +00:00
object_ = : : clCreateImage (
2018-03-25 17:47:28 +00:00
context ( ) ,
flags ,
& format ,
& desc ,
host_ptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __CREATE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Image1D ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image1D ( const cl_mem & image1D ) : Image ( image1D ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Image1D & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Image1D ( const Image1D & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image1D & operator = ( const Image1D & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( img ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image1D ( Image1D & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image1D & operator = ( Image1D & & img )
{
Image : : operator = ( std : : move ( img ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
/*! \class Image1DBuffer
* \ brief Image interface for 1 D buffer images .
*/
class Image1DBuffer : public Image
{
public :
Image1DBuffer (
const Context & context ,
cl_mem_flags flags ,
ImageFormat format ,
: : size_t width ,
2018-03-25 17:47:28 +00:00
const Buffer & buffer ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2019-06-24 09:25:18 +00:00
cl_image_desc desc =
{
CL_MEM_OBJECT_IMAGE1D_BUFFER ,
width ,
0 , 0 , 0 , 0 , 0 , 0 , 0 ,
buffer ( ) } ;
2013-10-18 18:26:06 +00:00
object_ = : : clCreateImage (
2018-03-25 17:47:28 +00:00
context ( ) ,
flags ,
& format ,
& desc ,
2019-06-24 17:25:51 +00:00
nullptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __CREATE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
Image1DBuffer ( ) { }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image1DBuffer ( const cl_mem & image1D ) : Image ( image1D ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
Image1DBuffer & operator = ( const cl_mem & rhs )
{
Image : : operator = ( rhs ) ;
return * this ;
}
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image1DBuffer ( const Image1DBuffer & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image1DBuffer & operator = ( const Image1DBuffer & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( img ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image1DBuffer ( Image1DBuffer & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image1DBuffer & operator = ( Image1DBuffer & & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( std : : move ( img ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
/*! \class Image1DArray
* \ brief Image interface for arrays of 1 D images .
*/
class Image1DArray : public Image
{
public :
Image1DArray (
const Context & context ,
cl_mem_flags flags ,
ImageFormat format ,
: : size_t arraySize ,
: : size_t width ,
: : size_t rowPitch ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2019-06-24 09:25:18 +00:00
cl_image_desc desc =
{
CL_MEM_OBJECT_IMAGE1D_ARRAY ,
width ,
0 , 0 , // height, depth (unused)
arraySize ,
rowPitch ,
2019-06-28 10:26:46 +00:00
0 , 0 , 0 , nullptr } ;
2013-10-18 18:26:06 +00:00
object_ = : : clCreateImage (
2018-03-25 17:47:28 +00:00
context ( ) ,
flags ,
& format ,
& desc ,
host_ptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __CREATE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
Image1DArray ( ) { }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image1DArray ( const cl_mem & imageArray ) : Image ( imageArray ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
Image1DArray & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image1DArray ( const Image1DArray & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image1DArray & operator = ( const Image1DArray & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( img ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image1DArray ( Image1DArray & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image1DArray & operator = ( Image1DArray & & img )
{
Image : : operator = ( std : : move ( img ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
} ;
# endif // #if defined(CL_VERSION_1_2)
/*! \brief Class interface for 2D Image Memory objects.
*
2013-10-18 18:26:06 +00:00
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
*/
class Image2D : public Image
{
public :
/*! \brief Constructs a 1D Image in a specified context.
*
* Wraps clCreateImage ( ) .
*/
Image2D (
const Context & context ,
cl_mem_flags flags ,
ImageFormat format ,
: : size_t width ,
: : size_t height ,
: : size_t row_pitch = 0 ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
bool useCreateImage ;
# if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
// Run-time decision based on the actual platform
{
cl_uint version = detail : : getContextPlatformVersion ( context ( ) ) ;
2018-03-25 17:47:28 +00:00
useCreateImage = ( version > = 0x10002 ) ; // OpenCL 1.2 or above
2013-10-18 18:26:06 +00:00
}
# elif defined(CL_VERSION_1_2)
useCreateImage = true ;
# else
useCreateImage = false ;
# endif
# if defined(CL_VERSION_1_2)
if ( useCreateImage )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
cl_image_desc desc =
{
CL_MEM_OBJECT_IMAGE2D ,
width ,
height ,
0 , 0 , // depth, array size (unused)
row_pitch ,
2019-06-28 10:26:46 +00:00
0 , 0 , 0 , nullptr } ;
2018-03-25 17:47:28 +00:00
object_ = : : clCreateImage (
context ( ) ,
flags ,
& format ,
& desc ,
host_ptr ,
& error ) ;
detail : : errHandler ( error , __CREATE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
# if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
if ( ! useCreateImage )
2018-03-25 17:47:28 +00:00
{
object_ = : : clCreateImage2D (
context ( ) , flags , & format , width , height , row_pitch , host_ptr , & error ) ;
detail : : errHandler ( error , __CREATE_IMAGE2D_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
# endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Image2D ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image2D ( const cl_mem & image2D ) : Image ( image2D ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Image2D & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Image2D ( const Image2D & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image2D & operator = ( const Image2D & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( img ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image2D ( Image2D & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image2D & operator = ( Image2D & & img )
{
Image : : operator = ( std : : move ( img ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
# if !defined(CL_VERSION_1_2)
/*! \brief Class interface for GL 2D Image Memory objects.
*
* This is provided to facilitate interoperability with OpenGL .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
* \ note Deprecated for OpenCL 1.2 . Please use ImageGL instead .
*/
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D
{
public :
/*! \brief Constructs an Image2DGL in a specified context, from a given
* GL Texture .
*
* Wraps clCreateFromGLTexture2D ( ) .
*/
Image2DGL (
const Context & context ,
cl_mem_flags flags ,
2019-06-24 09:25:18 +00:00
cl_GLenum target ,
cl_GLint miplevel ,
cl_GLuint texobj ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateFromGLTexture2D (
context ( ) ,
flags ,
target ,
miplevel ,
texobj ,
& error ) ;
detail : : errHandler ( error , __CREATE_GL_TEXTURE_2D_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Image2DGL ( ) : Image2D ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image2DGL ( const cl_mem & image ) : Image2D ( image ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Image2DGL & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image2D : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Image2DGL ( const Image2DGL & img ) : Image2D ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image2DGL & operator = ( const Image2DGL & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image2D : : operator = ( img ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image2DGL ( Image2DGL & & img ) CL_HPP_NOEXCEPT : Image2D ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image2DGL & operator = ( Image2DGL & & img )
{
Image2D : : operator = ( std : : move ( img ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
# endif // #if !defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
/*! \class Image2DArray
* \ brief Image interface for arrays of 2 D images .
*/
class Image2DArray : public Image
{
public :
Image2DArray (
const Context & context ,
cl_mem_flags flags ,
ImageFormat format ,
: : size_t arraySize ,
: : size_t width ,
: : size_t height ,
: : size_t rowPitch ,
: : size_t slicePitch ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2019-06-24 09:25:18 +00:00
cl_image_desc desc =
{
CL_MEM_OBJECT_IMAGE2D_ARRAY ,
width ,
height ,
0 , // depth (unused)
arraySize ,
rowPitch ,
slicePitch ,
2019-06-28 10:26:46 +00:00
0 , 0 , nullptr } ;
2013-10-18 18:26:06 +00:00
object_ = : : clCreateImage (
2018-03-25 17:47:28 +00:00
context ( ) ,
flags ,
& format ,
& desc ,
host_ptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __CREATE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
Image2DArray ( ) { }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image2DArray ( const cl_mem & imageArray ) : Image ( imageArray ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
Image2DArray & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image2DArray ( const Image2DArray & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image2DArray & operator = ( const Image2DArray & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( img ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image2DArray ( Image2DArray & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image2DArray & operator = ( Image2DArray & & img )
{
Image : : operator = ( std : : move ( img ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
/*! \brief Class interface for 3D Image Memory objects.
*
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
*/
class Image3D : public Image
{
public :
/*! \brief Constructs a 3D Image in a specified context.
*
* Wraps clCreateImage ( ) .
*/
Image3D (
const Context & context ,
cl_mem_flags flags ,
ImageFormat format ,
: : size_t width ,
: : size_t height ,
: : size_t depth ,
: : size_t row_pitch = 0 ,
: : size_t slice_pitch = 0 ,
2019-06-24 17:25:51 +00:00
void * host_ptr = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
bool useCreateImage ;
# if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
// Run-time decision based on the actual platform
{
cl_uint version = detail : : getContextPlatformVersion ( context ( ) ) ;
2018-03-25 17:47:28 +00:00
useCreateImage = ( version > = 0x10002 ) ; // OpenCL 1.2 or above
2013-10-18 18:26:06 +00:00
}
# elif defined(CL_VERSION_1_2)
useCreateImage = true ;
# else
useCreateImage = false ;
# endif
# if defined(CL_VERSION_1_2)
if ( useCreateImage )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
cl_image_desc desc =
{
CL_MEM_OBJECT_IMAGE3D ,
width ,
height ,
depth ,
0 , // array size (unused)
row_pitch ,
slice_pitch ,
2019-06-28 10:26:46 +00:00
0 , 0 , nullptr } ;
2018-03-25 17:47:28 +00:00
object_ = : : clCreateImage (
context ( ) ,
flags ,
& format ,
& desc ,
host_ptr ,
& error ) ;
detail : : errHandler ( error , __CREATE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
# endif // #if defined(CL_VERSION_1_2)
# if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
if ( ! useCreateImage )
2018-03-25 17:47:28 +00:00
{
object_ = : : clCreateImage3D (
context ( ) , flags , & format , width , height , depth , row_pitch ,
slice_pitch , host_ptr , & error ) ;
detail : : errHandler ( error , __CREATE_IMAGE3D_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
# endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2019-06-24 09:25:18 +00:00
Image3D ( ) : Image ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image3D ( const cl_mem & image3D ) : Image ( image3D ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Image3D & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Image3D ( const Image3D & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image3D & operator = ( const Image3D & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( img ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image3D ( Image3D & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image3D & operator = ( Image3D & & img )
{
Image : : operator = ( std : : move ( img ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
# if !defined(CL_VERSION_1_2)
/*! \brief Class interface for GL 3D Image Memory objects.
*
* This is provided to facilitate interoperability with OpenGL .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* See Memory for details about copy semantics , etc .
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ see Memory
*/
class Image3DGL : public Image3D
{
public :
/*! \brief Constructs an Image3DGL in a specified context, from a given
* GL Texture .
*
* Wraps clCreateFromGLTexture3D ( ) .
*/
Image3DGL (
const Context & context ,
cl_mem_flags flags ,
2019-06-24 09:25:18 +00:00
cl_GLenum target ,
cl_GLint miplevel ,
cl_GLuint texobj ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateFromGLTexture3D (
context ( ) ,
flags ,
target ,
miplevel ,
texobj ,
& error ) ;
detail : : errHandler ( error , __CREATE_GL_TEXTURE_3D_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Image3DGL ( ) : Image3D ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Image3DGL ( const cl_mem & image ) : Image3D ( image ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment from cl_mem - performs shallow copy.
2013-10-18 18:26:06 +00:00
*
* See Memory for further details .
*/
2019-06-24 09:25:18 +00:00
Image3DGL & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image3D : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Image3DGL ( const Image3DGL & img ) : Image3D ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Image3DGL & operator = ( const Image3DGL & img )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image3D : : operator = ( img ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Image3DGL ( Image3DGL & & img ) CL_HPP_NOEXCEPT : Image3D ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Image3DGL & operator = ( Image3DGL & & img )
{
Image3D : : operator = ( std : : move ( img ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
# endif // #if !defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
/*! \class ImageGL
* \ brief general image interface for GL interop .
* We abstract the 2 D and 3 D GL images into a single instance here
* that wraps all GL sourced images on the grounds that setup information
* was performed by OpenCL anyway .
*/
class ImageGL : public Image
{
public :
ImageGL (
const Context & context ,
cl_mem_flags flags ,
2019-06-24 09:25:18 +00:00
cl_GLenum target ,
cl_GLint miplevel ,
cl_GLuint texobj ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateFromGLTexture (
2018-03-25 17:47:28 +00:00
context ( ) ,
flags ,
2013-10-18 18:26:06 +00:00
target ,
miplevel ,
texobj ,
& error ) ;
detail : : errHandler ( error , __CREATE_GL_TEXTURE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
ImageGL ( ) : Image ( ) { }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS ImageGL ( const cl_mem & image ) : Image ( image ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
ImageGL & operator = ( const cl_mem & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
Image : : operator = ( rhs ) ;
return * this ;
}
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
ImageGL ( const ImageGL & img ) : Image ( img ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
ImageGL & operator = ( const ImageGL & img )
{
Image : : operator = ( img ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
ImageGL ( ImageGL & & img ) CL_HPP_NOEXCEPT : Image ( std : : move ( img ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
ImageGL & operator = ( ImageGL & & img )
{
Image : : operator = ( std : : move ( img ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
} ;
# endif // #if defined(CL_VERSION_1_2)
/*! \brief Class interface for GL Render Buffer Memory Objects.
*
* This is provided to facilitate interoperability with OpenGL .
*
* See Memory for details about copy semantics , etc .
*
* \ see Memory
*/
class BufferRenderGL :
# if defined(CL_VERSION_1_2)
public ImageGL
# else // #if defined(CL_VERSION_1_2)
public Image2DGL
# endif //#if defined(CL_VERSION_1_2)
{
public :
/*! \brief Constructs a BufferRenderGL in a specified context, from a given
* GL Renderbuffer .
*
* Wraps clCreateFromGLRenderbuffer ( ) .
*/
BufferRenderGL (
const Context & context ,
cl_mem_flags flags ,
cl_GLuint bufobj ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2019-06-24 09:25:18 +00:00
{
cl_int error ;
object_ = : : clCreateFromGLRenderbuffer (
context ( ) ,
flags ,
bufobj ,
& error ) ;
detail : : errHandler ( error , __CREATE_GL_RENDER_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
* err = error ;
2018-03-25 17:47:28 +00:00
}
2019-06-24 09:25:18 +00:00
}
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2019-06-24 09:25:18 +00:00
# if defined(CL_VERSION_1_2)
BufferRenderGL ( ) : ImageGL ( ) { } ;
# else // #if defined(CL_VERSION_1_2)
BufferRenderGL ( ) : Image2DGL ( ) { } ;
# endif //#if defined(CL_VERSION_1_2)
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details .
*/
# if defined(CL_VERSION_1_2)
__CL_EXPLICIT_CONSTRUCTORS BufferRenderGL ( const cl_mem & buffer ) : ImageGL ( buffer )
{
}
# else // #if defined(CL_VERSION_1_2)
__CL_EXPLICIT_CONSTRUCTORS BufferRenderGL ( const cl_mem & buffer ) : Image2DGL ( buffer )
{
}
# endif //#if defined(CL_VERSION_1_2)
/*! \brief Assignment from cl_mem - performs shallow copy.
*
* See Memory for further details .
*/
BufferRenderGL & operator = ( const cl_mem & rhs )
{
# if defined(CL_VERSION_1_2)
ImageGL : : operator = ( rhs ) ;
# else // #if defined(CL_VERSION_1_2)
Image2DGL : : operator = ( rhs ) ;
# endif //#if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
# if defined(CL_VERSION_1_2)
BufferRenderGL ( const BufferRenderGL & buf ) : ImageGL ( buf )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
}
# else // #if defined(CL_VERSION_1_2)
BufferRenderGL ( const BufferRenderGL & buf ) : Image2DGL ( buf )
{
}
# endif //#if defined(CL_VERSION_1_2)
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
BufferRenderGL & operator = ( const BufferRenderGL & rhs )
{
# if defined(CL_VERSION_1_2)
ImageGL : : operator = ( rhs ) ;
# else // #if defined(CL_VERSION_1_2)
Image2DGL : : operator = ( rhs ) ;
# endif //#if defined(CL_VERSION_1_2)
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
# if defined(CL_VERSION_1_2)
BufferRenderGL ( BufferRenderGL & & buf ) CL_HPP_NOEXCEPT : ImageGL ( std : : move ( buf ) )
{
}
# else // #if defined(CL_VERSION_1_2)
BufferRenderGL ( BufferRenderGL & & buf ) CL_HPP_NOEXCEPT : Image2DGL ( std : : move ( buf ) )
{
}
# endif //#if defined(CL_VERSION_1_2)
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
BufferRenderGL & operator = ( BufferRenderGL & & buf )
{
# if defined(CL_VERSION_1_2)
ImageGL : : operator = ( std : : move ( buf ) ) ;
# else // #if defined(CL_VERSION_1_2)
Image2DGL : : operator = ( std : : move ( buf ) ) ;
# endif //#if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
//! \brief Wrapper for clGetGLObjectInfo().
cl_int getObjectInfo (
cl_gl_object_type * type ,
cl_GLuint * gl_object_name )
{
return detail : : errHandler (
: : clGetGLObjectInfo ( object_ , type , gl_object_name ) ,
__GET_GL_OBJECT_INFO_ERR ) ;
}
2013-10-18 18:26:06 +00:00
} ;
/*! \brief Class interface for cl_sampler.
*
* \ note Copies of these objects are shallow , meaning that the copy will refer
* to the same underlying cl_sampler as the original . For details , see
* clRetainSampler ( ) and clReleaseSampler ( ) .
*
2018-12-09 21:00:09 +00:00
* \ see cl_sampler
2013-10-18 18:26:06 +00:00
*/
class Sampler : public detail : : Wrapper < cl_sampler >
{
public :
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2018-03-25 17:47:28 +00:00
Sampler ( ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Constructs a Sampler in a specified context.
*
* Wraps clCreateSampler ( ) .
*/
Sampler (
const Context & context ,
cl_bool normalized_coords ,
cl_addressing_mode addressing_mode ,
cl_filter_mode filter_mode ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateSampler (
2018-03-25 17:47:28 +00:00
context ( ) ,
2013-10-18 18:26:06 +00:00
normalized_coords ,
addressing_mode ,
filter_mode ,
& error ) ;
detail : : errHandler ( error , __CREATE_SAMPLER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
/*! \brief Constructor from cl_sampler - takes ownership.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* This effectively transfers ownership of a refcount on the cl_sampler
* into the new Sampler object .
*/
2019-06-24 09:25:18 +00:00
__CL_EXPLICIT_CONSTRUCTORS Sampler ( const cl_sampler & sampler ) : detail : : Wrapper < cl_type > ( sampler ) { }
2013-10-18 18:26:06 +00:00
/*! \brief Assignment operator from cl_sampler - takes ownership.
*
* This effectively transfers ownership of a refcount on the rhs and calls
* clReleaseSampler ( ) on the value previously held by this instance .
*/
2018-03-25 17:47:28 +00:00
Sampler & operator = ( const cl_sampler & rhs )
2013-10-18 18:26:06 +00:00
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Sampler ( const Sampler & sam ) : detail : : Wrapper < cl_type > ( sam ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Sampler & operator = ( const Sampler & sam )
{
detail : : Wrapper < cl_type > : : operator = ( sam ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Sampler ( Sampler & & sam ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( sam ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Sampler & operator = ( Sampler & & sam )
{
detail : : Wrapper < cl_type > : : operator = ( std : : move ( sam ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
//! \brief Wrapper for clGetSamplerInfo().
template < typename T >
cl_int getInfo ( cl_sampler_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetSamplerInfo , object_ , name , param ) ,
__GET_SAMPLER_INFO_ERR ) ;
}
//! \brief Wrapper for clGetSamplerInfo() that returns by value.
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_sampler_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_sampler_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
} ;
class Program ;
class CommandQueue ;
class Kernel ;
//! \brief Class interface for specifying NDRange values.
class NDRange
{
private :
size_t < 3 > sizes_ ;
cl_uint dimensions_ ;
public :
//! \brief Default constructor - resulting range has zero dimensions.
NDRange ( )
: dimensions_ ( 0 )
2018-03-25 17:47:28 +00:00
{
}
2013-10-18 18:26:06 +00:00
//! \brief Constructs one-dimensional range.
NDRange ( : : size_t size0 )
: dimensions_ ( 1 )
{
sizes_ [ 0 ] = size0 ;
}
//! \brief Constructs two-dimensional range.
NDRange ( : : size_t size0 , : : size_t size1 )
: dimensions_ ( 2 )
{
sizes_ [ 0 ] = size0 ;
sizes_ [ 1 ] = size1 ;
}
//! \brief Constructs three-dimensional range.
NDRange ( : : size_t size0 , : : size_t size1 , : : size_t size2 )
: dimensions_ ( 3 )
{
sizes_ [ 0 ] = size0 ;
sizes_ [ 1 ] = size1 ;
sizes_ [ 2 ] = size2 ;
}
/*! \brief Conversion operator to const ::size_t *.
2018-12-09 21:00:09 +00:00
*
2013-10-18 18:26:06 +00:00
* \ returns a pointer to the size of the first dimension .
*/
2018-03-25 17:47:28 +00:00
operator const : : size_t * ( ) const
{
return ( const : : size_t * ) sizes_ ;
2013-10-18 18:26:06 +00:00
}
//! \brief Queries the number of dimensions in the range.
: : size_t dimensions ( ) const { return dimensions_ ; }
} ;
//! \brief A zero-dimensional range.
static const NDRange NullRange ;
//! \brief Local address wrapper for use with Kernel::setArg
struct LocalSpaceArg
{
: : size_t size_ ;
} ;
2018-03-25 17:47:28 +00:00
namespace detail
{
2013-10-18 18:26:06 +00:00
template < typename T >
struct KernelArgumentHandler
{
static : : size_t size ( const T & ) { return sizeof ( T ) ; }
2019-06-24 09:25:18 +00:00
static const T * ptr ( const T & value ) { return & value ; }
2013-10-18 18:26:06 +00:00
} ;
template < >
struct KernelArgumentHandler < LocalSpaceArg >
{
static : : size_t size ( const LocalSpaceArg & value ) { return value . size_ ; }
2019-06-24 17:25:51 +00:00
static const void * ptr ( const LocalSpaceArg & ) { return nullptr ; }
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
} // namespace detail
2013-10-18 18:26:06 +00:00
//! \endcond
/*! __local
* \ brief Helper function for generating LocalSpaceArg objects .
* Deprecated . Replaced with Local .
*/
inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg
__local ( : : size_t size ) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED ;
inline LocalSpaceArg
__local ( : : size_t size )
{
2018-03-25 17:47:28 +00:00
LocalSpaceArg ret = { size } ;
2013-10-18 18:26:06 +00:00
return ret ;
}
/*! Local
* \ brief Helper function for generating LocalSpaceArg objects .
*/
inline LocalSpaceArg
Local ( : : size_t size )
{
2018-03-25 17:47:28 +00:00
LocalSpaceArg ret = { size } ;
2013-10-18 18:26:06 +00:00
return ret ;
}
//class KernelFunctor;
/*! \brief Class interface for cl_kernel.
*
* \ note Copies of these objects are shallow , meaning that the copy will refer
* to the same underlying cl_kernel as the original . For details , see
* clRetainKernel ( ) and clReleaseKernel ( ) .
*
* \ see cl_kernel
*/
class Kernel : public detail : : Wrapper < cl_kernel >
{
public :
2019-06-24 17:25:51 +00:00
inline Kernel ( const Program & program , const char * name , cl_int * err = nullptr ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
//! \brief Default constructor - initializes to nullptr.
2019-06-24 09:25:18 +00:00
Kernel ( ) { }
/*! \brief Constructor from cl_kernel - takes ownership.
2013-10-18 18:26:06 +00:00
*
2019-06-24 09:25:18 +00:00
* This effectively transfers ownership of a refcount on the cl_kernel
* into the new Kernel object .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
__CL_EXPLICIT_CONSTRUCTORS Kernel ( const cl_kernel & kernel ) : detail : : Wrapper < cl_type > ( kernel ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Assignment operator from cl_kernel - takes ownership.
*
* This effectively transfers ownership of a refcount on the rhs and calls
* clReleaseKernel ( ) on the value previously held by this instance .
*/
Kernel & operator = ( const cl_kernel & rhs )
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2018-03-25 17:47:28 +00:00
Kernel ( const Kernel & kernel ) : detail : : Wrapper < cl_type > ( kernel ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Kernel & operator = ( const Kernel & kernel )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
detail : : Wrapper < cl_type > : : operator = ( kernel ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
2013-10-18 18:26:06 +00:00
*/
2019-06-24 09:25:18 +00:00
Kernel ( Kernel & & kernel ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( kernel ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Kernel & operator = ( Kernel & & kernel )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
detail : : Wrapper < cl_type > : : operator = ( std : : move ( kernel ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
template < typename T >
cl_int getInfo ( cl_kernel_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetKernelInfo , object_ , name , param ) ,
__GET_KERNEL_INFO_ERR ) ;
}
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_kernel_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_kernel_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
# if defined(CL_VERSION_1_2)
template < typename T >
cl_int getArgInfo ( cl_uint argIndex , cl_kernel_arg_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetKernelArgInfo , object_ , argIndex , name , param ) ,
__GET_KERNEL_ARG_INFO_ERR ) ;
}
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_kernel_arg_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getArgInfo ( cl_uint argIndex , cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_kernel_arg_info , name > : : param_type param ;
cl_int result = getArgInfo ( argIndex , name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
template < typename T >
cl_int getWorkGroupInfo (
const Device & device , cl_kernel_work_group_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo (
& : : clGetKernelWorkGroupInfo , object_ , device ( ) , name , param ) ,
2018-03-25 17:47:28 +00:00
__GET_KERNEL_WORK_GROUP_INFO_ERR ) ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_kernel_work_group_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getWorkGroupInfo ( const Device & device , cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
2018-03-25 17:47:28 +00:00
detail : : cl_kernel_work_group_info , name > : : param_type param ;
2013-10-18 18:26:06 +00:00
cl_int result = getWorkGroupInfo ( device , name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
template < typename T >
2019-06-24 09:25:18 +00:00
cl_int setArg ( cl_uint index , const T & value )
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
: : clSetKernelArg (
object_ ,
index ,
detail : : KernelArgumentHandler < T > : : size ( value ) ,
detail : : KernelArgumentHandler < T > : : ptr ( value ) ) ,
__SET_KERNEL_ARGS_ERR ) ;
}
2019-06-24 09:25:18 +00:00
cl_int setArg ( cl_uint index , : : size_t size , const void * argPtr )
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
: : clSetKernelArg ( object_ , index , size , argPtr ) ,
__SET_KERNEL_ARGS_ERR ) ;
}
} ;
/*! \class Program
* \ brief Program interface that implements cl_program .
*/
class Program : public detail : : Wrapper < cl_program >
{
public :
typedef VECTOR_CLASS < std : : pair < const void * , : : size_t > > Binaries ;
typedef VECTOR_CLASS < std : : pair < const char * , : : size_t > > Sources ;
Program (
const STRING_CLASS & source ,
2019-06-24 09:25:18 +00:00
bool build = false ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2018-03-25 17:47:28 +00:00
const char * strings = source . c_str ( ) ;
const : : size_t length = source . size ( ) ;
2013-10-18 18:26:06 +00:00
Context context = Context : : getDefault ( err ) ;
object_ = : : clCreateProgramWithSource (
context ( ) , ( cl_uint ) 1 , & strings , & length , & error ) ;
detail : : errHandler ( error , __CREATE_PROGRAM_WITH_SOURCE_ERR ) ;
2018-03-25 17:47:28 +00:00
if ( error = = CL_SUCCESS & & build )
{
error = : : clBuildProgram (
object_ ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2018-03-25 17:47:28 +00:00
" " ,
2019-06-24 17:25:51 +00:00
nullptr ,
nullptr ) ;
2018-03-25 17:47:28 +00:00
detail : : errHandler ( error , __BUILD_PROGRAM_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
Program (
const Context & context ,
const STRING_CLASS & source ,
bool build = false ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2018-03-25 17:47:28 +00:00
const char * strings = source . c_str ( ) ;
const : : size_t length = source . size ( ) ;
2013-10-18 18:26:06 +00:00
object_ = : : clCreateProgramWithSource (
context ( ) , ( cl_uint ) 1 , & strings , & length , & error ) ;
detail : : errHandler ( error , __CREATE_PROGRAM_WITH_SOURCE_ERR ) ;
2018-03-25 17:47:28 +00:00
if ( error = = CL_SUCCESS & & build )
{
error = : : clBuildProgram (
object_ ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2018-03-25 17:47:28 +00:00
" " ,
2019-06-24 17:25:51 +00:00
nullptr ,
nullptr ) ;
2018-03-25 17:47:28 +00:00
detail : : errHandler ( error , __BUILD_PROGRAM_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
Program (
const Context & context ,
const Sources & sources ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
const : : size_t n = ( : : size_t ) sources . size ( ) ;
2018-03-25 17:47:28 +00:00
: : size_t * lengths = ( : : size_t * ) alloca ( n * sizeof ( : : size_t ) ) ;
const char * * strings = ( const char * * ) alloca ( n * sizeof ( const char * ) ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
for ( : : size_t i = 0 ; i < n ; + + i )
{
strings [ i ] = sources [ ( int ) i ] . first ;
lengths [ i ] = sources [ ( int ) i ] . second ;
}
2013-10-18 18:26:06 +00:00
object_ = : : clCreateProgramWithSource (
context ( ) , ( cl_uint ) n , strings , lengths , & error ) ;
detail : : errHandler ( error , __CREATE_PROGRAM_WITH_SOURCE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
/**
* Construct a program object from a list of devices and a per - device list of binaries .
* \ param context A valid OpenCL context in which to construct the program .
* \ param devices A vector of OpenCL device objects for which the program will be created .
* \ param binaries A vector of pairs of a pointer to a binary object and its length .
* \ param binaryStatus An optional vector that on completion will be resized to
* match the size of binaries and filled with values to specify if each binary
* was successfully loaded .
* Set to CL_SUCCESS if the binary was successfully loaded .
2019-06-24 17:25:51 +00:00
* Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is nullptr .
2013-10-18 18:26:06 +00:00
* Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device .
2019-06-24 17:25:51 +00:00
* \ param err if non - nullptr will be set to CL_SUCCESS on successful operation or one of the following errors :
2013-10-18 18:26:06 +00:00
* CL_INVALID_CONTEXT if context is not a valid context .
2018-12-09 21:00:09 +00:00
* CL_INVALID_VALUE if the length of devices is zero ; or if the length of binaries does not match the length of devices ;
2019-06-24 17:25:51 +00:00
* or if any entry in binaries is nullptr or has length 0.
2013-10-18 18:26:06 +00:00
* CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context .
* CL_INVALID_BINARY if an invalid program binary was encountered for any device . binaryStatus will return specific status for each device .
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host .
*/
Program (
const Context & context ,
const VECTOR_CLASS < Device > & devices ,
const Binaries & binaries ,
2019-06-24 17:25:51 +00:00
VECTOR_CLASS < cl_int > * binaryStatus = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
const : : size_t numDevices = devices . size ( ) ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
// Catch size mismatch early and return
2018-03-25 17:47:28 +00:00
if ( binaries . size ( ) ! = numDevices )
{
error = CL_INVALID_VALUE ;
detail : : errHandler ( error , __CREATE_PROGRAM_WITH_BINARY_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
return ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
: : size_t * lengths = ( : : size_t * ) alloca ( numDevices * sizeof ( : : size_t ) ) ;
const unsigned char * * images = ( const unsigned char * * ) alloca ( numDevices * sizeof ( const unsigned char * * ) ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
for ( : : size_t i = 0 ; i < numDevices ; + + i )
{
images [ i ] = ( const unsigned char * ) binaries [ i ] . first ;
lengths [ i ] = binaries [ ( int ) i ] . second ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_device_id * deviceIDs = ( cl_device_id * ) alloca ( numDevices * sizeof ( cl_device_id ) ) ;
for ( : : size_t deviceIndex = 0 ; deviceIndex < numDevices ; + + deviceIndex )
{
deviceIDs [ deviceIndex ] = ( devices [ deviceIndex ] ) ( ) ;
}
if ( binaryStatus )
{
binaryStatus - > resize ( numDevices ) ;
}
2013-10-18 18:26:06 +00:00
object_ = : : clCreateProgramWithBinary (
2018-03-25 17:47:28 +00:00
context ( ) , ( cl_uint ) devices . size ( ) ,
2013-10-18 18:26:06 +00:00
deviceIDs ,
2019-06-24 17:25:51 +00:00
lengths , images , ( binaryStatus ! = nullptr & & numDevices > 0 ) ? & binaryStatus - > front ( ) : nullptr , & error ) ;
2013-10-18 18:26:06 +00:00
detail : : errHandler ( error , __CREATE_PROGRAM_WITH_BINARY_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
/**
* Create program using builtin kernels .
* \ param kernelNames Semi - colon separated list of builtin kernel names
*/
Program (
const Context & context ,
const VECTOR_CLASS < Device > & devices ,
const STRING_CLASS & kernelNames ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
: : size_t numDevices = devices . size ( ) ;
2018-03-25 17:47:28 +00:00
cl_device_id * deviceIDs = ( cl_device_id * ) alloca ( numDevices * sizeof ( cl_device_id ) ) ;
for ( : : size_t deviceIndex = 0 ; deviceIndex < numDevices ; + + deviceIndex )
{
deviceIDs [ deviceIndex ] = ( devices [ deviceIndex ] ) ( ) ;
}
2013-10-18 18:26:06 +00:00
object_ = : : clCreateProgramWithBuiltInKernels (
2018-03-25 17:47:28 +00:00
context ( ) ,
( cl_uint ) devices . size ( ) ,
2013-10-18 18:26:06 +00:00
deviceIDs ,
2018-03-25 17:47:28 +00:00
kernelNames . c_str ( ) ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Program ( )
{
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
__CL_EXPLICIT_CONSTRUCTORS Program ( const cl_program & program ) : detail : : Wrapper < cl_type > ( program ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
Program & operator = ( const cl_program & rhs )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
Program ( const Program & program ) : detail : : Wrapper < cl_type > ( program ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
Program & operator = ( const Program & program )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
detail : : Wrapper < cl_type > : : operator = ( program ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
Program ( Program & & program ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( program ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
Program & operator = ( Program & & program )
{
detail : : Wrapper < cl_type > : : operator = ( std : : move ( program ) ) ;
2013-10-18 18:26:06 +00:00
return * this ;
}
2019-06-24 09:25:18 +00:00
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2013-10-18 18:26:06 +00:00
cl_int build (
const VECTOR_CLASS < Device > & devices ,
2019-06-24 17:25:51 +00:00
const char * options = nullptr ,
void ( CL_CALLBACK * notifyFptr ) ( cl_program , void * ) = nullptr ,
void * data = nullptr ) const
2013-10-18 18:26:06 +00:00
{
: : size_t numDevices = devices . size ( ) ;
2018-03-25 17:47:28 +00:00
cl_device_id * deviceIDs = ( cl_device_id * ) alloca ( numDevices * sizeof ( cl_device_id ) ) ;
for ( : : size_t deviceIndex = 0 ; deviceIndex < numDevices ; + + deviceIndex )
{
deviceIDs [ deviceIndex ] = ( devices [ deviceIndex ] ) ( ) ;
}
2013-10-18 18:26:06 +00:00
return detail : : errHandler (
: : clBuildProgram (
object_ ,
( cl_uint )
2018-03-25 17:47:28 +00:00
devices . size ( ) ,
2013-10-18 18:26:06 +00:00
deviceIDs ,
options ,
notifyFptr ,
data ) ,
2018-03-25 17:47:28 +00:00
__BUILD_PROGRAM_ERR ) ;
2013-10-18 18:26:06 +00:00
}
cl_int build (
2019-06-24 17:25:51 +00:00
const char * options = nullptr ,
void ( CL_CALLBACK * notifyFptr ) ( cl_program , void * ) = nullptr ,
void * data = nullptr ) const
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
: : clBuildProgram (
object_ ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2013-10-18 18:26:06 +00:00
options ,
notifyFptr ,
data ) ,
2018-03-25 17:47:28 +00:00
__BUILD_PROGRAM_ERR ) ;
2013-10-18 18:26:06 +00:00
}
# if defined(CL_VERSION_1_2)
2018-03-25 17:47:28 +00:00
cl_int compile (
2019-06-24 17:25:51 +00:00
const char * options = nullptr ,
void ( CL_CALLBACK * notifyFptr ) ( cl_program , void * ) = nullptr ,
void * data = nullptr ) const
2013-10-18 18:26:06 +00:00
{
return detail : : errHandler (
: : clCompileProgram (
object_ ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2013-10-18 18:26:06 +00:00
options ,
2018-03-25 17:47:28 +00:00
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
nullptr ,
2013-10-18 18:26:06 +00:00
notifyFptr ,
data ) ,
2018-03-25 17:47:28 +00:00
__COMPILE_PROGRAM_ERR ) ;
2013-10-18 18:26:06 +00:00
}
# endif
template < typename T >
cl_int getInfo ( cl_program_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo ( & : : clGetProgramInfo , object_ , name , param ) ,
__GET_PROGRAM_INFO_ERR ) ;
}
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_program_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_program_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
template < typename T >
cl_int getBuildInfo (
const Device & device , cl_program_build_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo (
& : : clGetProgramBuildInfo , object_ , device ( ) , name , param ) ,
2018-03-25 17:47:28 +00:00
__GET_PROGRAM_BUILD_INFO_ERR ) ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_program_build_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getBuildInfo ( const Device & device , cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_program_build_info , name > : : param_type param ;
cl_int result = getBuildInfo ( device , name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
cl_int createKernels ( VECTOR_CLASS < Kernel > * kernels )
{
cl_uint numKernels ;
2019-06-24 17:25:51 +00:00
cl_int err = : : clCreateKernelsInProgram ( object_ , 0 , nullptr , & numKernels ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __CREATE_KERNELS_IN_PROGRAM_ERR ) ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Kernel * value = ( Kernel * ) alloca ( numKernels * sizeof ( Kernel ) ) ;
2013-10-18 18:26:06 +00:00
err = : : clCreateKernelsInProgram (
2019-06-24 17:25:51 +00:00
object_ , numKernels , ( cl_kernel * ) value , nullptr ) ;
2018-03-25 17:47:28 +00:00
if ( err ! = CL_SUCCESS )
{
return detail : : errHandler ( err , __CREATE_KERNELS_IN_PROGRAM_ERR ) ;
}
2013-10-18 18:26:06 +00:00
kernels - > assign ( & value [ 0 ] , & value [ numKernels ] ) ;
return CL_SUCCESS ;
}
} ;
# if defined(CL_VERSION_1_2)
inline Program linkProgram (
Program input1 ,
Program input2 ,
2019-06-24 17:25:51 +00:00
const char * options = nullptr ,
void ( CL_CALLBACK * notifyFptr ) ( cl_program , void * ) = nullptr ,
void * data = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
cl_int error_local = CL_SUCCESS ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_program programs [ 2 ] = { input1 ( ) , input2 ( ) } ;
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
Context ctx = input1 . getInfo < CL_PROGRAM_CONTEXT > ( & error_local ) ;
if ( error_local ! = CL_SUCCESS )
{
detail : : errHandler ( error_local , __LINK_PROGRAM_ERR ) ;
}
2013-10-18 18:26:06 +00:00
cl_program prog = : : clLinkProgram (
ctx ( ) ,
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2013-10-18 18:26:06 +00:00
options ,
2 ,
programs ,
notifyFptr ,
data ,
2019-06-24 09:25:18 +00:00
& error_local ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
detail : : errHandler ( error_local , __COMPILE_PROGRAM_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
* err = error_local ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
return Program ( prog ) ;
}
inline Program linkProgram (
VECTOR_CLASS < Program > inputPrograms ,
2019-06-24 17:25:51 +00:00
const char * options = nullptr ,
void ( CL_CALLBACK * notifyFptr ) ( cl_program , void * ) = nullptr ,
void * data = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
cl_int error_local = CL_SUCCESS ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
cl_program * programs = ( cl_program * ) alloca ( inputPrograms . size ( ) * sizeof ( cl_program ) ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( programs ! = nullptr )
2018-03-25 17:47:28 +00:00
{
for ( unsigned int i = 0 ; i < inputPrograms . size ( ) ; i + + )
{
programs [ i ] = inputPrograms [ i ] ( ) ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
Context ctx ;
if ( inputPrograms . size ( ) > 0 )
{
ctx = inputPrograms [ 0 ] . getInfo < CL_PROGRAM_CONTEXT > ( & error_local ) ;
if ( error_local ! = CL_SUCCESS )
{
detail : : errHandler ( error_local , __LINK_PROGRAM_ERR ) ;
}
}
2013-10-18 18:26:06 +00:00
cl_program prog = : : clLinkProgram (
2019-06-24 09:25:18 +00:00
ctx ( ) ,
2013-10-18 18:26:06 +00:00
0 ,
2019-06-24 17:25:51 +00:00
nullptr ,
2013-10-18 18:26:06 +00:00
options ,
( cl_uint ) inputPrograms . size ( ) ,
programs ,
notifyFptr ,
data ,
2019-06-24 09:25:18 +00:00
& error_local ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
detail : : errHandler ( error_local , __COMPILE_PROGRAM_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
2019-06-24 09:25:18 +00:00
* err = error_local ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
return Program ( prog ) ;
}
# endif
2018-03-25 17:47:28 +00:00
template < >
inline VECTOR_CLASS < char * > cl : : Program : : getInfo < CL_PROGRAM_BINARIES > ( cl_int * err ) const
2013-10-18 18:26:06 +00:00
{
VECTOR_CLASS < : : size_t > sizes = getInfo < CL_PROGRAM_BINARY_SIZES > ( ) ;
2018-03-25 17:47:28 +00:00
VECTOR_CLASS < char * > binaries ;
2019-11-24 12:06:32 +00:00
for ( unsigned long & size : sizes )
2018-03-25 17:47:28 +00:00
{
2019-06-24 17:25:51 +00:00
char * ptr = nullptr ;
2019-06-28 10:26:46 +00:00
if ( size ! = 0 )
ptr = new char [ size ] ;
2018-03-25 17:47:28 +00:00
binaries . push_back ( ptr ) ;
}
2013-10-18 18:26:06 +00:00
cl_int result = getInfo ( CL_PROGRAM_BINARIES , & binaries ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return binaries ;
}
inline Kernel : : Kernel ( const Program & program , const char * name , cl_int * err )
{
cl_int error ;
object_ = : : clCreateKernel ( program ( ) , name , & error ) ;
detail : : errHandler ( error , __CREATE_KERNEL_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
/*! \class CommandQueue
* \ brief CommandQueue interface for cl_command_queue .
*/
class CommandQueue : public detail : : Wrapper < cl_command_queue >
{
private :
2019-06-24 09:25:18 +00:00
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
static std : : atomic < int > default_initialized_ ;
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
static volatile int default_initialized_ ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
static CommandQueue default_ ;
static volatile cl_int default_error_ ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
public :
2018-03-25 17:47:28 +00:00
CommandQueue (
2013-10-18 18:26:06 +00:00
cl_command_queue_properties properties ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
Context context = Context : : getDefault ( & error ) ;
2019-06-24 09:25:18 +00:00
detail : : errHandler ( error , __CREATE_CONTEXT_ERR ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
else
{
Device device = context . getInfo < CL_CONTEXT_DEVICES > ( ) [ 0 ] ;
object_ = : : clCreateCommandQueue (
context ( ) , device ( ) , properties , & error ) ;
detail : : errHandler ( error , __CREATE_COMMAND_QUEUE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
}
2019-06-24 09:25:18 +00:00
/*!
* \ brief Constructs a CommandQueue for an implementation defined device in the given context
*/
explicit CommandQueue (
const Context & context ,
cl_command_queue_properties properties = 0 ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2019-06-24 09:25:18 +00:00
{
cl_int error ;
VECTOR_CLASS < cl : : Device > devices ;
error = context . getInfo ( CL_CONTEXT_DEVICES , & devices ) ;
detail : : errHandler ( error , __CREATE_CONTEXT_ERR ) ;
if ( error ! = CL_SUCCESS )
{
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
return ;
}
object_ = : : clCreateCommandQueue ( context ( ) , devices [ 0 ] ( ) , properties , & error ) ;
detail : : errHandler ( error , __CREATE_COMMAND_QUEUE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
}
2013-10-18 18:26:06 +00:00
CommandQueue (
const Context & context ,
const Device & device ,
cl_command_queue_properties properties = 0 ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
object_ = : : clCreateCommandQueue (
context ( ) , device ( ) , properties , & error ) ;
detail : : errHandler ( error , __CREATE_COMMAND_QUEUE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2019-06-24 09:25:18 +00:00
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC .
*/
CommandQueue ( const CommandQueue & queue ) : detail : : Wrapper < cl_type > ( queue ) { }
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC .
*/
CommandQueue & operator = ( const CommandQueue & queue )
{
detail : : Wrapper < cl_type > : : operator = ( queue ) ;
return * this ;
}
# if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC .
*/
CommandQueue ( CommandQueue & & queue ) CL_HPP_NOEXCEPT : detail : : Wrapper < cl_type > ( std : : move ( queue ) ) { }
/*! \brief Move assignment to forward move to the superclass correctly.
* Required for MSVC .
*/
CommandQueue & operator = ( CommandQueue & & queue )
{
detail : : Wrapper < cl_type > : : operator = ( std : : move ( queue ) ) ;
return * this ;
}
# endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2019-06-24 17:25:51 +00:00
static CommandQueue getDefault ( cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
int state = detail : : compare_exchange (
2018-03-25 17:47:28 +00:00
& default_initialized_ ,
2013-10-18 18:26:06 +00:00
__DEFAULT_BEING_INITIALIZED , __DEFAULT_NOT_INITIALIZED ) ;
2018-03-25 17:47:28 +00:00
if ( state & __DEFAULT_INITIALIZED )
{
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = default_error_ ;
}
return default_ ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
if ( state & __DEFAULT_BEING_INITIALIZED )
{
// Assume writes will propagate eventually...
while ( default_initialized_ ! = __DEFAULT_INITIALIZED )
{
detail : : fence ( ) ;
}
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = default_error_ ;
}
return default_ ;
2013-10-18 18:26:06 +00:00
}
cl_int error ;
Context context = Context : : getDefault ( & error ) ;
detail : : errHandler ( error , __CREATE_COMMAND_QUEUE_ERR ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
else
{
Device device = context . getInfo < CL_CONTEXT_DEVICES > ( ) [ 0 ] ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
default_ = CommandQueue ( context , device , 0 , & error ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
detail : : errHandler ( error , __CREATE_COMMAND_QUEUE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
}
detail : : fence ( ) ;
default_error_ = error ;
// Assume writes will propagate eventually...
default_initialized_ = __DEFAULT_INITIALIZED ;
detail : : fence ( ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = default_error_ ;
}
2013-10-18 18:26:06 +00:00
return default_ ;
}
2018-03-25 17:47:28 +00:00
CommandQueue ( ) { }
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
__CL_EXPLICIT_CONSTRUCTORS CommandQueue ( const cl_command_queue & commandQueue ) : detail : : Wrapper < cl_type > ( commandQueue ) { }
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
CommandQueue & operator = ( const cl_command_queue & rhs )
2013-10-18 18:26:06 +00:00
{
detail : : Wrapper < cl_type > : : operator = ( rhs ) ;
return * this ;
}
template < typename T >
cl_int getInfo ( cl_command_queue_info name , T * param ) const
{
return detail : : errHandler (
detail : : getInfo (
& : : clGetCommandQueueInfo , object_ , name , param ) ,
2018-03-25 17:47:28 +00:00
__GET_COMMAND_QUEUE_INFO_ERR ) ;
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
template < cl_int name >
typename detail : : param_traits < detail : : cl_command_queue_info , name > : : param_type
2019-06-24 17:25:51 +00:00
getInfo ( cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
typename detail : : param_traits <
detail : : cl_command_queue_info , name > : : param_type param ;
cl_int result = getInfo ( name , & param ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = result ;
}
2013-10-18 18:26:06 +00:00
return param ;
}
cl_int enqueueReadBuffer (
const Buffer & buffer ,
cl_bool blocking ,
: : size_t offset ,
: : size_t size ,
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueReadBuffer (
object_ , buffer ( ) , blocking , offset , size ,
ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_READ_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueWriteBuffer (
const Buffer & buffer ,
cl_bool blocking ,
: : size_t offset ,
: : size_t size ,
const void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueWriteBuffer (
object_ , buffer ( ) , blocking , offset , size ,
ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_WRITE_BUFFER_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueCopyBuffer (
const Buffer & src ,
const Buffer & dst ,
: : size_t src_offset ,
: : size_t dst_offset ,
: : size_t size ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueCopyBuffer (
object_ , src ( ) , dst ( ) , src_offset , dst_offset , size ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQEUE_COPY_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueReadBufferRect (
const Buffer & buffer ,
cl_bool blocking ,
const size_t < 3 > & buffer_offset ,
const size_t < 3 > & host_offset ,
const size_t < 3 > & region ,
: : size_t buffer_row_pitch ,
: : size_t buffer_slice_pitch ,
: : size_t host_row_pitch ,
: : size_t host_slice_pitch ,
2018-03-25 17:47:28 +00:00
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueReadBufferRect (
2018-03-25 17:47:28 +00:00
object_ ,
buffer ( ) ,
blocking ,
( const : : size_t * ) buffer_offset ,
( const : : size_t * ) host_offset ,
( const : : size_t * ) region ,
2013-10-18 18:26:06 +00:00
buffer_row_pitch ,
buffer_slice_pitch ,
host_row_pitch ,
host_slice_pitch ,
ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_READ_BUFFER_RECT_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueWriteBufferRect (
const Buffer & buffer ,
cl_bool blocking ,
const size_t < 3 > & buffer_offset ,
const size_t < 3 > & host_offset ,
const size_t < 3 > & region ,
: : size_t buffer_row_pitch ,
: : size_t buffer_slice_pitch ,
: : size_t host_row_pitch ,
: : size_t host_slice_pitch ,
2018-03-25 17:47:28 +00:00
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueWriteBufferRect (
2018-03-25 17:47:28 +00:00
object_ ,
buffer ( ) ,
blocking ,
( const : : size_t * ) buffer_offset ,
( const : : size_t * ) host_offset ,
( const : : size_t * ) region ,
2013-10-18 18:26:06 +00:00
buffer_row_pitch ,
buffer_slice_pitch ,
host_row_pitch ,
host_slice_pitch ,
ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_WRITE_BUFFER_RECT_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueCopyBufferRect (
const Buffer & src ,
const Buffer & dst ,
const size_t < 3 > & src_origin ,
const size_t < 3 > & dst_origin ,
const size_t < 3 > & region ,
: : size_t src_row_pitch ,
: : size_t src_slice_pitch ,
: : size_t dst_row_pitch ,
: : size_t dst_slice_pitch ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueCopyBufferRect (
2018-03-25 17:47:28 +00:00
object_ ,
src ( ) ,
dst ( ) ,
( const : : size_t * ) src_origin ,
( const : : size_t * ) dst_origin ,
( const : : size_t * ) region ,
2013-10-18 18:26:06 +00:00
src_row_pitch ,
src_slice_pitch ,
dst_row_pitch ,
dst_slice_pitch ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQEUE_COPY_BUFFER_RECT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
# if defined(CL_VERSION_1_2)
/**
* Enqueue a command to fill a buffer object with a pattern
* of a given size . The pattern is specified a as vector .
2018-12-09 21:00:09 +00:00
* \ tparam PatternType The datatype of the pattern field .
2013-10-18 18:26:06 +00:00
* The pattern type must be an accepted OpenCL data type .
*/
2018-03-25 17:47:28 +00:00
template < typename PatternType >
2013-10-18 18:26:06 +00:00
cl_int enqueueFillBuffer (
const Buffer & buffer ,
PatternType pattern ,
: : size_t offset ,
: : size_t size ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueFillBuffer (
2018-03-25 17:47:28 +00:00
object_ ,
2013-10-18 18:26:06 +00:00
buffer ( ) ,
static_cast < void * > ( & pattern ) ,
2018-03-25 17:47:28 +00:00
sizeof ( PatternType ) ,
offset ,
2013-10-18 18:26:06 +00:00
size ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_FILL_BUFFER_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
cl_int enqueueReadImage (
const Image & image ,
cl_bool blocking ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
: : size_t row_pitch ,
: : size_t slice_pitch ,
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueReadImage (
2018-03-25 17:47:28 +00:00
object_ , image ( ) , blocking , ( const : : size_t * ) origin ,
( const : : size_t * ) region , row_pitch , slice_pitch , ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_READ_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueWriteImage (
const Image & image ,
cl_bool blocking ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
: : size_t row_pitch ,
: : size_t slice_pitch ,
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueWriteImage (
2018-03-25 17:47:28 +00:00
object_ , image ( ) , blocking , ( const : : size_t * ) origin ,
( const : : size_t * ) region , row_pitch , slice_pitch , ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_WRITE_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueCopyImage (
const Image & src ,
const Image & dst ,
const size_t < 3 > & src_origin ,
const size_t < 3 > & dst_origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueCopyImage (
2018-03-25 17:47:28 +00:00
object_ , src ( ) , dst ( ) , ( const : : size_t * ) src_origin ,
( const : : size_t * ) dst_origin , ( const : : size_t * ) region ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_COPY_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
# if defined(CL_VERSION_1_2)
/**
* Enqueue a command to fill an image object with a specified color .
* \ param fillColor is the color to use to fill the image .
* This is a four component RGBA floating - point color value if
* the image channel data type is not an unnormalized signed or
* unsigned data type .
*/
cl_int enqueueFillImage (
const Image & image ,
cl_float4 fillColor ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueFillImage (
2018-03-25 17:47:28 +00:00
object_ ,
2013-10-18 18:26:06 +00:00
image ( ) ,
2018-03-25 17:47:28 +00:00
static_cast < void * > ( & fillColor ) ,
( const : : size_t * ) origin ,
( const : : size_t * ) region ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_FILL_IMAGE_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
/**
* Enqueue a command to fill an image object with a specified color .
* \ param fillColor is the color to use to fill the image .
* This is a four component RGBA signed integer color value if
* the image channel data type is an unnormalized signed integer
* type .
*/
cl_int enqueueFillImage (
const Image & image ,
cl_int4 fillColor ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueFillImage (
2018-03-25 17:47:28 +00:00
object_ ,
2013-10-18 18:26:06 +00:00
image ( ) ,
2018-03-25 17:47:28 +00:00
static_cast < void * > ( & fillColor ) ,
( const : : size_t * ) origin ,
( const : : size_t * ) region ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_FILL_IMAGE_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
/**
* Enqueue a command to fill an image object with a specified color .
* \ param fillColor is the color to use to fill the image .
* This is a four component RGBA unsigned integer color value if
* the image channel data type is an unnormalized unsigned integer
* type .
*/
cl_int enqueueFillImage (
const Image & image ,
cl_uint4 fillColor ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueFillImage (
2018-03-25 17:47:28 +00:00
object_ ,
2013-10-18 18:26:06 +00:00
image ( ) ,
2018-03-25 17:47:28 +00:00
static_cast < void * > ( & fillColor ) ,
( const : : size_t * ) origin ,
( const : : size_t * ) region ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_FILL_IMAGE_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
cl_int enqueueCopyImageToBuffer (
const Image & src ,
const Buffer & dst ,
const size_t < 3 > & src_origin ,
const size_t < 3 > & region ,
: : size_t dst_offset ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueCopyImageToBuffer (
2018-03-25 17:47:28 +00:00
object_ , src ( ) , dst ( ) , ( const : : size_t * ) src_origin ,
( const : : size_t * ) region , dst_offset ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueCopyBufferToImage (
const Buffer & src ,
const Image & dst ,
: : size_t src_offset ,
const size_t < 3 > & dst_origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueCopyBufferToImage (
object_ , src ( ) , dst ( ) , src_offset ,
2018-03-25 17:47:28 +00:00
( const : : size_t * ) dst_origin , ( const : : size_t * ) region ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
void * enqueueMapBuffer (
const Buffer & buffer ,
cl_bool blocking ,
cl_map_flags flags ,
: : size_t offset ,
: : size_t size ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ,
cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
cl_event tmp ;
2013-10-18 18:26:06 +00:00
cl_int error ;
2018-03-25 17:47:28 +00:00
void * result = : : clEnqueueMapBuffer (
2013-10-18 18:26:06 +00:00
object_ , buffer ( ) , blocking , flags , offset , size ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __ENQUEUE_MAP_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & error = = CL_SUCCESS )
2019-06-24 09:25:18 +00:00
* event = tmp ;
2013-10-18 18:26:06 +00:00
return result ;
}
void * enqueueMapImage (
const Image & buffer ,
cl_bool blocking ,
cl_map_flags flags ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
2018-03-25 17:47:28 +00:00
: : size_t * row_pitch ,
: : size_t * slice_pitch ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ,
cl_int * err = nullptr ) const
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
cl_event tmp ;
2013-10-18 18:26:06 +00:00
cl_int error ;
2018-03-25 17:47:28 +00:00
void * result = : : clEnqueueMapImage (
2013-10-18 18:26:06 +00:00
object_ , buffer ( ) , blocking , flags ,
2018-03-25 17:47:28 +00:00
( const : : size_t * ) origin , ( const : : size_t * ) region ,
2013-10-18 18:26:06 +00:00
row_pitch , slice_pitch ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ,
2013-10-18 18:26:06 +00:00
& error ) ;
detail : : errHandler ( error , __ENQUEUE_MAP_IMAGE_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & error = = CL_SUCCESS )
2019-06-24 09:25:18 +00:00
* event = tmp ;
2013-10-18 18:26:06 +00:00
return result ;
}
cl_int enqueueUnmapMemObject (
const Memory & memory ,
void * mapped_ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueUnmapMemObject (
object_ , memory ( ) , mapped_ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_UNMAP_MEM_OBJECT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
# if defined(CL_VERSION_1_2)
/**
2018-12-09 21:00:09 +00:00
* Enqueues a marker command which waits for either a list of events to complete ,
2013-10-18 18:26:06 +00:00
* or all previously enqueued commands to complete .
*
2018-12-09 21:00:09 +00:00
* Enqueues a marker command which waits for either a list of events to complete ,
* or if the list is empty it waits for all commands previously enqueued in command_queue
* to complete before it completes . This command returns an event which can be waited on ,
* i . e . this event can be waited on to insure that all events either in the event_wait_list
* or all previously enqueued commands , queued before this command to command_queue ,
2013-10-18 18:26:06 +00:00
* have completed .
*/
cl_int enqueueMarkerWithWaitList (
2019-06-28 10:26:46 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueMarkerWithWaitList (
object_ ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_MARKER_WAIT_LIST_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
/**
* A synchronization point that enqueues a barrier operation .
*
2018-12-09 21:00:09 +00:00
* Enqueues a barrier command which waits for either a list of events to complete ,
* or if the list is empty it waits for all commands previously enqueued in command_queue
* to complete before it completes . This command blocks command execution , that is , any
* following commands enqueued after it do not execute until it completes . This command
* returns an event which can be waited on , i . e . this event can be waited on to insure that
* all events either in the event_wait_list or all previously enqueued commands , queued
2013-10-18 18:26:06 +00:00
* before this command to command_queue , have completed .
*/
cl_int enqueueBarrierWithWaitList (
2019-06-28 10:26:46 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueBarrierWithWaitList (
object_ ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_BARRIER_WAIT_LIST_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
/**
* Enqueues a command to indicate with which device a set of memory objects
* should be associated .
*/
cl_int enqueueMigrateMemObjects (
2018-03-25 17:47:28 +00:00
const VECTOR_CLASS < Memory > & memObjects ,
2013-10-18 18:26:06 +00:00
cl_mem_migration_flags flags ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
cl_mem * localMemObjects = static_cast < cl_mem * > ( alloca ( memObjects . size ( ) * sizeof ( cl_mem ) ) ) ;
2018-03-25 17:47:28 +00:00
for ( int i = 0 ; i < ( int ) memObjects . size ( ) ; + + i )
{
localMemObjects [ i ] = memObjects [ i ] ( ) ;
}
2013-10-18 18:26:06 +00:00
cl_int err = detail : : errHandler (
: : clEnqueueMigrateMemObjects (
2018-03-25 17:47:28 +00:00
object_ ,
( cl_uint ) memObjects . size ( ) ,
2013-10-18 18:26:06 +00:00
static_cast < const cl_mem * > ( localMemObjects ) ,
flags ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_UNMAP_MEM_OBJECT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
cl_int enqueueNDRangeKernel (
const Kernel & kernel ,
const NDRange & offset ,
const NDRange & global ,
const NDRange & local = NullRange ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueNDRangeKernel (
2018-03-25 17:47:28 +00:00
object_ , kernel ( ) , ( cl_uint ) global . dimensions ( ) ,
2019-06-24 17:25:51 +00:00
offset . dimensions ( ) ! = 0 ? ( const : : size_t * ) offset : nullptr ,
2018-03-25 17:47:28 +00:00
( const : : size_t * ) global ,
2019-06-24 17:25:51 +00:00
local . dimensions ( ) ! = 0 ? ( const : : size_t * ) local : nullptr ,
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_NDRANGE_KERNEL_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueTask (
const Kernel & kernel ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueTask (
object_ , kernel ( ) ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_TASK_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
cl_int enqueueNativeKernel (
2018-03-25 17:47:28 +00:00
void ( CL_CALLBACK * userFptr ) ( void * ) ,
2013-10-18 18:26:06 +00:00
std : : pair < void * , : : size_t > args ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Memory > * mem_objects = nullptr ,
const VECTOR_CLASS < const void * > * mem_locs = nullptr ,
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
cl_mem * mems = ( mem_objects ! = nullptr & & mem_objects - > size ( ) > 0 )
2018-03-25 17:47:28 +00:00
? ( cl_mem * ) alloca ( mem_objects - > size ( ) * sizeof ( cl_mem ) )
2019-06-24 17:25:51 +00:00
: nullptr ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( mems ! = nullptr )
2018-03-25 17:47:28 +00:00
{
for ( unsigned int i = 0 ; i < mem_objects - > size ( ) ; i + + )
{
mems [ i ] = ( ( * mem_objects ) [ i ] ) ( ) ;
}
2013-10-18 18:26:06 +00:00
}
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueNativeKernel (
object_ , userFptr , args . first , args . second ,
2019-06-24 17:25:51 +00:00
( mem_objects ! = nullptr ) ? ( cl_uint ) mem_objects - > size ( ) : 0 ,
2013-10-18 18:26:06 +00:00
mems ,
2019-06-24 17:25:51 +00:00
( mem_locs ! = nullptr & & mem_locs - > size ( ) > 0 ) ? ( const void * * ) & mem_locs - > front ( ) : nullptr ,
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_NATIVE_KERNEL ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
/**
* Deprecated APIs for 1.2
*/
2018-03-25 17:47:28 +00:00
# if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
2019-06-24 17:25:51 +00:00
cl_int enqueueMarker ( Event * event = nullptr ) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
2013-10-18 18:26:06 +00:00
{
2019-06-24 09:25:18 +00:00
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueMarker (
object_ ,
2019-06-24 17:25:51 +00:00
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_MARKER_ERR ) ;
2019-06-24 09:25:18 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2019-06-24 09:25:18 +00:00
* event = tmp ;
return err ;
2013-10-18 18:26:06 +00:00
}
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int enqueueWaitForEvents ( const VECTOR_CLASS < Event > & events ) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
{
return detail : : errHandler (
: : clEnqueueWaitForEvents (
object_ ,
2018-03-25 17:47:28 +00:00
( cl_uint ) events . size ( ) ,
2019-06-24 17:25:51 +00:00
events . size ( ) > 0 ? ( const cl_event * ) & events . front ( ) : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_WAIT_FOR_EVENTS_ERR ) ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
cl_int enqueueAcquireGLObjects (
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Memory > * mem_objects = nullptr ,
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2018-03-25 17:47:28 +00:00
{
2013-10-18 18:26:06 +00:00
cl_event tmp ;
cl_int err = detail : : errHandler (
2018-03-25 17:47:28 +00:00
: : clEnqueueAcquireGLObjects (
object_ ,
2019-06-24 17:25:51 +00:00
( mem_objects ! = nullptr ) ? ( cl_uint ) mem_objects - > size ( ) : 0 ,
( mem_objects ! = nullptr & & mem_objects - > size ( ) > 0 ) ? ( const cl_mem * ) & mem_objects - > front ( ) : nullptr ,
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_ACQUIRE_GL_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
cl_int enqueueReleaseGLObjects (
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Memory > * mem_objects = nullptr ,
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2018-03-25 17:47:28 +00:00
{
2013-10-18 18:26:06 +00:00
cl_event tmp ;
cl_int err = detail : : errHandler (
2018-03-25 17:47:28 +00:00
: : clEnqueueReleaseGLObjects (
object_ ,
2019-06-24 17:25:51 +00:00
( mem_objects ! = nullptr ) ? ( cl_uint ) mem_objects - > size ( ) : 0 ,
( mem_objects ! = nullptr & & mem_objects - > size ( ) > 0 ) ? ( const cl_mem * ) & mem_objects - > front ( ) : nullptr ,
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_RELEASE_GL_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
2018-03-25 17:47:28 +00:00
}
# if defined(USE_DX_INTEROP)
typedef CL_API_ENTRY cl_int ( CL_API_CALL * PFN_clEnqueueAcquireD3D10ObjectsKHR ) (
cl_command_queue command_queue , cl_uint num_objects ,
const cl_mem * mem_objects , cl_uint num_events_in_wait_list ,
const cl_event * event_wait_list , cl_event * event ) ;
typedef CL_API_ENTRY cl_int ( CL_API_CALL * PFN_clEnqueueReleaseD3D10ObjectsKHR ) (
cl_command_queue command_queue , cl_uint num_objects ,
const cl_mem * mem_objects , cl_uint num_events_in_wait_list ,
const cl_event * event_wait_list , cl_event * event ) ;
2013-10-18 18:26:06 +00:00
cl_int enqueueAcquireD3D10Objects (
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Memory > * mem_objects = nullptr ,
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = nullptr ;
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
cl_context context = getInfo < CL_QUEUE_CONTEXT > ( ) ;
cl : : Device device ( getInfo < CL_QUEUE_DEVICE > ( ) ) ;
cl_platform_id platform = device . getInfo < CL_DEVICE_PLATFORM > ( ) ;
__INIT_CL_EXT_FCN_PTR_PLATFORM ( platform , clEnqueueAcquireD3D10ObjectsKHR ) ;
# endif
# if defined(CL_VERSION_1_1)
__INIT_CL_EXT_FCN_PTR ( clEnqueueAcquireD3D10ObjectsKHR ) ;
# endif
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
cl_event tmp ;
cl_int err = detail : : errHandler (
2018-03-25 17:47:28 +00:00
pfn_clEnqueueAcquireD3D10ObjectsKHR (
object_ ,
2019-06-24 17:25:51 +00:00
( mem_objects ! = nullptr ) ? ( cl_uint ) mem_objects - > size ( ) : 0 ,
( mem_objects ! = nullptr & & mem_objects - > size ( ) > 0 ) ? ( const cl_mem * ) & mem_objects - > front ( ) : nullptr ,
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2018-03-25 17:47:28 +00:00
__ENQUEUE_ACQUIRE_GL_ERR ) ;
2013-10-18 18:26:06 +00:00
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
2018-03-25 17:47:28 +00:00
}
2013-10-18 18:26:06 +00:00
cl_int enqueueReleaseD3D10Objects (
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Memory > * mem_objects = nullptr ,
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ) const
2013-10-18 18:26:06 +00:00
{
2019-06-24 17:25:51 +00:00
static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = nullptr ;
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_2)
cl_context context = getInfo < CL_QUEUE_CONTEXT > ( ) ;
cl : : Device device ( getInfo < CL_QUEUE_DEVICE > ( ) ) ;
cl_platform_id platform = device . getInfo < CL_DEVICE_PLATFORM > ( ) ;
__INIT_CL_EXT_FCN_PTR_PLATFORM ( platform , clEnqueueReleaseD3D10ObjectsKHR ) ;
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_2)
2013-10-18 18:26:06 +00:00
# if defined(CL_VERSION_1_1)
__INIT_CL_EXT_FCN_PTR ( clEnqueueReleaseD3D10ObjectsKHR ) ;
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
cl_event tmp ;
cl_int err = detail : : errHandler (
pfn_clEnqueueReleaseD3D10ObjectsKHR (
object_ ,
2019-06-24 17:25:51 +00:00
( mem_objects ! = nullptr ) ? ( cl_uint ) mem_objects - > size ( ) : 0 ,
( mem_objects ! = nullptr & & mem_objects - > size ( ) > 0 ) ? ( const cl_mem * ) & mem_objects - > front ( ) : nullptr ,
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_RELEASE_GL_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
# endif
/**
* Deprecated APIs for 1.2
*/
2018-03-25 17:47:28 +00:00
# if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
2013-10-18 18:26:06 +00:00
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int enqueueBarrier ( ) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
{
return detail : : errHandler (
: : clEnqueueBarrier ( object_ ) ,
__ENQUEUE_BARRIER_ERR ) ;
}
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
cl_int flush ( ) const
{
return detail : : errHandler ( : : clFlush ( object_ ) , __FLUSH_ERR ) ;
}
cl_int finish ( ) const
{
return detail : : errHandler ( : : clFinish ( object_ ) , __FINISH_ERR ) ;
}
} ;
# ifdef _WIN32
2019-06-24 09:25:18 +00:00
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
__declspec ( selectany ) std : : atomic < int > CommandQueue : : default_initialized_ ;
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__declspec ( selectany ) volatile int CommandQueue : : default_initialized_ = __DEFAULT_NOT_INITIALIZED ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__declspec ( selectany ) CommandQueue CommandQueue : : default_ ;
__declspec ( selectany ) volatile cl_int CommandQueue : : default_error_ = CL_SUCCESS ;
2019-06-24 09:25:18 +00:00
# else // !_WIN32
# ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
__attribute__ ( ( weak ) ) std : : atomic < int > CommandQueue : : default_initialized_ ;
# else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__attribute__ ( ( weak ) ) volatile int CommandQueue : : default_initialized_ = __DEFAULT_NOT_INITIALIZED ;
2019-06-24 09:25:18 +00:00
# endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2013-10-18 18:26:06 +00:00
__attribute__ ( ( weak ) ) CommandQueue CommandQueue : : default_ ;
__attribute__ ( ( weak ) ) volatile cl_int CommandQueue : : default_error_ = CL_SUCCESS ;
2019-06-24 09:25:18 +00:00
# endif // !_WIN32
template < typename IteratorType >
Buffer : : Buffer (
const Context & context ,
IteratorType startIterator ,
IteratorType endIterator ,
bool readOnly ,
bool useHostPtr ,
cl_int * err )
{
typedef typename std : : iterator_traits < IteratorType > : : value_type DataType ;
cl_int error ;
cl_mem_flags flags = 0 ;
if ( readOnly )
{
flags | = CL_MEM_READ_ONLY ;
}
else
{
flags | = CL_MEM_READ_WRITE ;
}
if ( useHostPtr )
{
flags | = CL_MEM_USE_HOST_PTR ;
}
: : size_t size = sizeof ( DataType ) * ( endIterator - startIterator ) ;
if ( useHostPtr )
{
object_ = : : clCreateBuffer ( context ( ) , flags , size , static_cast < DataType * > ( & * startIterator ) , & error ) ;
}
else
{
2019-06-28 10:26:46 +00:00
object_ = : : clCreateBuffer ( context ( ) , flags , size , nullptr , & error ) ;
2019-06-24 09:25:18 +00:00
}
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
if ( ! useHostPtr )
{
CommandQueue queue ( context , 0 , & error ) ;
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
error = cl : : copy ( queue , startIterator , endIterator , * this ) ;
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
}
}
template < typename IteratorType >
Buffer : : Buffer (
const CommandQueue & queue ,
IteratorType startIterator ,
IteratorType endIterator ,
bool readOnly ,
bool useHostPtr ,
cl_int * err )
{
typedef typename std : : iterator_traits < IteratorType > : : value_type DataType ;
cl_int error ;
cl_mem_flags flags = 0 ;
if ( readOnly )
{
flags | = CL_MEM_READ_ONLY ;
}
else
{
flags | = CL_MEM_READ_WRITE ;
}
if ( useHostPtr )
{
flags | = CL_MEM_USE_HOST_PTR ;
}
: : size_t size = sizeof ( DataType ) * ( endIterator - startIterator ) ;
Context context = queue . getInfo < CL_QUEUE_CONTEXT > ( ) ;
if ( useHostPtr )
{
object_ = : : clCreateBuffer ( context ( ) , flags , size , static_cast < DataType * > ( & * startIterator ) , & error ) ;
}
else
{
2019-06-28 10:26:46 +00:00
object_ = : : clCreateBuffer ( context ( ) , flags , size , nullptr , & error ) ;
2019-06-24 09:25:18 +00:00
}
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
if ( ! useHostPtr )
{
error = cl : : copy ( queue , startIterator , endIterator , * this ) ;
detail : : errHandler ( error , __CREATE_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2019-06-24 09:25:18 +00:00
{
* err = error ;
}
}
}
2013-10-18 18:26:06 +00:00
inline cl_int enqueueReadBuffer (
const Buffer & buffer ,
cl_bool blocking ,
: : size_t offset ,
: : size_t size ,
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueReadBuffer ( buffer , blocking , offset , size , ptr , events , event ) ;
}
inline cl_int enqueueWriteBuffer (
2018-03-25 17:47:28 +00:00
const Buffer & buffer ,
cl_bool blocking ,
: : size_t offset ,
: : size_t size ,
const void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueWriteBuffer ( buffer , blocking , offset , size , ptr , events , event ) ;
}
inline void * enqueueMapBuffer (
2018-03-25 17:47:28 +00:00
const Buffer & buffer ,
cl_bool blocking ,
cl_map_flags flags ,
: : size_t offset ,
: : size_t size ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr ,
cl_int * err = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
detail : : errHandler ( error , __ENQUEUE_MAP_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
void * result = : : clEnqueueMapBuffer (
queue ( ) , buffer ( ) , blocking , flags , offset , size ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
2018-03-25 17:47:28 +00:00
( cl_event * ) event ,
& error ) ;
2013-10-18 18:26:06 +00:00
detail : : errHandler ( error , __ENQUEUE_MAP_BUFFER_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( err ! = nullptr )
2018-03-25 17:47:28 +00:00
{
* err = error ;
}
2013-10-18 18:26:06 +00:00
return result ;
}
inline cl_int enqueueUnmapMemObject (
const Memory & memory ,
void * mapped_ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
detail : : errHandler ( error , __ENQUEUE_MAP_BUFFER_ERR ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
cl_event tmp ;
cl_int err = detail : : errHandler (
: : clEnqueueUnmapMemObject (
queue ( ) , memory ( ) , mapped_ptr ,
2019-06-24 17:25:51 +00:00
( events ! = nullptr ) ? ( cl_uint ) events - > size ( ) : 0 ,
( events ! = nullptr & & events - > size ( ) > 0 ) ? ( cl_event * ) & events - > front ( ) : nullptr ,
( event ! = nullptr ) ? & tmp : nullptr ) ,
2013-10-18 18:26:06 +00:00
__ENQUEUE_UNMAP_MEM_OBJECT_ERR ) ;
2019-06-24 17:25:51 +00:00
if ( event ! = nullptr & & err = = CL_SUCCESS )
2013-10-18 18:26:06 +00:00
* event = tmp ;
return err ;
}
inline cl_int enqueueCopyBuffer (
2018-03-25 17:47:28 +00:00
const Buffer & src ,
const Buffer & dst ,
: : size_t src_offset ,
: : size_t dst_offset ,
: : size_t size ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueCopyBuffer ( src , dst , src_offset , dst_offset , size , events , event ) ;
}
/**
* Blocking copy operation between iterators and a buffer .
2019-06-24 09:25:18 +00:00
* Host to Device .
* Uses default command queue .
2013-10-18 18:26:06 +00:00
*/
2018-03-25 17:47:28 +00:00
template < typename IteratorType >
inline cl_int copy ( IteratorType startIterator , IteratorType endIterator , cl : : Buffer & buffer )
2019-06-24 09:25:18 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
if ( error ! = CL_SUCCESS )
return error ;
return cl : : copy ( queue , startIterator , endIterator , buffer ) ;
}
/**
* Blocking copy operation between iterators and a buffer .
* Device to Host .
* Uses default command queue .
*/
template < typename IteratorType >
inline cl_int copy ( const cl : : Buffer & buffer , IteratorType startIterator , IteratorType endIterator )
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
if ( error ! = CL_SUCCESS )
return error ;
return cl : : copy ( queue , buffer , startIterator , endIterator ) ;
}
/**
* Blocking copy operation between iterators and a buffer .
* Host to Device .
* Uses specified queue .
*/
template < typename IteratorType >
inline cl_int copy ( const CommandQueue & queue , IteratorType startIterator , IteratorType endIterator , cl : : Buffer & buffer )
2013-10-18 18:26:06 +00:00
{
typedef typename std : : iterator_traits < IteratorType > : : value_type DataType ;
cl_int error ;
2018-03-25 17:47:28 +00:00
: : size_t length = endIterator - startIterator ;
: : size_t byteLength = length * sizeof ( DataType ) ;
DataType * pointer =
2019-06-28 10:26:46 +00:00
static_cast < DataType * > ( queue . enqueueMapBuffer ( buffer , CL_TRUE , CL_MAP_WRITE , 0 , byteLength , nullptr , nullptr , & error ) ) ;
2013-10-18 18:26:06 +00:00
// if exceptions enabled, enqueueMapBuffer will throw
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
# if defined(_MSC_VER)
std : : copy (
2018-03-25 17:47:28 +00:00
startIterator ,
endIterator ,
2013-10-18 18:26:06 +00:00
stdext : : checked_array_iterator < DataType * > (
pointer , length ) ) ;
# else
std : : copy ( startIterator , endIterator , pointer ) ;
# endif
Event endEvent ;
2019-06-24 09:25:18 +00:00
error = queue . enqueueUnmapMemObject ( buffer , pointer , 0 , & endEvent ) ;
2013-10-18 18:26:06 +00:00
// if exceptions enabled, enqueueUnmapMemObject will throw
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
endEvent . wait ( ) ;
return CL_SUCCESS ;
}
/**
* Blocking copy operation between iterators and a buffer .
2019-06-24 09:25:18 +00:00
* Device to Host .
* Uses specified queue .
2013-10-18 18:26:06 +00:00
*/
2018-03-25 17:47:28 +00:00
template < typename IteratorType >
2019-06-24 09:25:18 +00:00
inline cl_int copy ( const CommandQueue & queue , const cl : : Buffer & buffer , IteratorType startIterator , IteratorType endIterator )
2013-10-18 18:26:06 +00:00
{
typedef typename std : : iterator_traits < IteratorType > : : value_type DataType ;
cl_int error ;
2018-03-25 17:47:28 +00:00
: : size_t length = endIterator - startIterator ;
: : size_t byteLength = length * sizeof ( DataType ) ;
DataType * pointer =
2019-06-28 10:26:46 +00:00
static_cast < DataType * > ( queue . enqueueMapBuffer ( buffer , CL_TRUE , CL_MAP_READ , 0 , byteLength , nullptr , nullptr , & error ) ) ;
2013-10-18 18:26:06 +00:00
// if exceptions enabled, enqueueMapBuffer will throw
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
std : : copy ( pointer , pointer + length , startIterator ) ;
Event endEvent ;
2019-06-24 09:25:18 +00:00
error = queue . enqueueUnmapMemObject ( buffer , pointer , 0 , & endEvent ) ;
2013-10-18 18:26:06 +00:00
// if exceptions enabled, enqueueUnmapMemObject will throw
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
endEvent . wait ( ) ;
return CL_SUCCESS ;
}
# if defined(CL_VERSION_1_1)
inline cl_int enqueueReadBufferRect (
const Buffer & buffer ,
cl_bool blocking ,
const size_t < 3 > & buffer_offset ,
const size_t < 3 > & host_offset ,
const size_t < 3 > & region ,
: : size_t buffer_row_pitch ,
: : size_t buffer_slice_pitch ,
: : size_t host_row_pitch ,
: : size_t host_slice_pitch ,
2018-03-25 17:47:28 +00:00
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueReadBufferRect (
2018-03-25 17:47:28 +00:00
buffer ,
blocking ,
buffer_offset ,
2013-10-18 18:26:06 +00:00
host_offset ,
region ,
buffer_row_pitch ,
buffer_slice_pitch ,
host_row_pitch ,
host_slice_pitch ,
2018-03-25 17:47:28 +00:00
ptr ,
events ,
2013-10-18 18:26:06 +00:00
event ) ;
}
inline cl_int enqueueWriteBufferRect (
const Buffer & buffer ,
cl_bool blocking ,
const size_t < 3 > & buffer_offset ,
const size_t < 3 > & host_offset ,
const size_t < 3 > & region ,
: : size_t buffer_row_pitch ,
: : size_t buffer_slice_pitch ,
: : size_t host_row_pitch ,
: : size_t host_slice_pitch ,
2018-03-25 17:47:28 +00:00
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueWriteBufferRect (
2018-03-25 17:47:28 +00:00
buffer ,
blocking ,
buffer_offset ,
2013-10-18 18:26:06 +00:00
host_offset ,
region ,
buffer_row_pitch ,
buffer_slice_pitch ,
host_row_pitch ,
host_slice_pitch ,
2018-03-25 17:47:28 +00:00
ptr ,
events ,
2013-10-18 18:26:06 +00:00
event ) ;
}
inline cl_int enqueueCopyBufferRect (
const Buffer & src ,
const Buffer & dst ,
const size_t < 3 > & src_origin ,
const size_t < 3 > & dst_origin ,
const size_t < 3 > & region ,
: : size_t src_row_pitch ,
: : size_t src_slice_pitch ,
: : size_t dst_row_pitch ,
: : size_t dst_slice_pitch ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueCopyBufferRect (
src ,
dst ,
src_origin ,
dst_origin ,
region ,
src_row_pitch ,
src_slice_pitch ,
dst_row_pitch ,
dst_slice_pitch ,
2018-03-25 17:47:28 +00:00
events ,
2013-10-18 18:26:06 +00:00
event ) ;
}
# endif
inline cl_int enqueueReadImage (
const Image & image ,
cl_bool blocking ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
: : size_t row_pitch ,
: : size_t slice_pitch ,
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueReadImage (
image ,
blocking ,
origin ,
region ,
row_pitch ,
slice_pitch ,
ptr ,
2018-03-25 17:47:28 +00:00
events ,
2013-10-18 18:26:06 +00:00
event ) ;
}
inline cl_int enqueueWriteImage (
const Image & image ,
cl_bool blocking ,
const size_t < 3 > & origin ,
const size_t < 3 > & region ,
: : size_t row_pitch ,
: : size_t slice_pitch ,
void * ptr ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueWriteImage (
image ,
blocking ,
origin ,
region ,
row_pitch ,
slice_pitch ,
ptr ,
2018-03-25 17:47:28 +00:00
events ,
2013-10-18 18:26:06 +00:00
event ) ;
}
inline cl_int enqueueCopyImage (
const Image & src ,
const Image & dst ,
const size_t < 3 > & src_origin ,
const size_t < 3 > & dst_origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueCopyImage (
src ,
dst ,
src_origin ,
dst_origin ,
region ,
events ,
event ) ;
}
inline cl_int enqueueCopyImageToBuffer (
const Image & src ,
const Buffer & dst ,
const size_t < 3 > & src_origin ,
const size_t < 3 > & region ,
: : size_t dst_offset ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueCopyImageToBuffer (
src ,
dst ,
src_origin ,
region ,
dst_offset ,
events ,
event ) ;
}
inline cl_int enqueueCopyBufferToImage (
const Buffer & src ,
const Image & dst ,
: : size_t src_offset ,
const size_t < 3 > & dst_origin ,
const size_t < 3 > & region ,
2019-06-24 17:25:51 +00:00
const VECTOR_CLASS < Event > * events = nullptr ,
Event * event = nullptr )
2013-10-18 18:26:06 +00:00
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . enqueueCopyBufferToImage (
src ,
dst ,
src_offset ,
dst_origin ,
region ,
events ,
event ) ;
}
inline cl_int flush ( void )
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . flush ( ) ;
}
inline cl_int finish ( void )
{
cl_int error ;
CommandQueue queue = CommandQueue : : getDefault ( & error ) ;
2018-03-25 17:47:28 +00:00
if ( error ! = CL_SUCCESS )
{
return error ;
}
2013-10-18 18:26:06 +00:00
return queue . finish ( ) ;
}
// Kernel Functor support
// New interface as of September 2011
// Requires the C++11 std::tr1::function (note do not support TR1)
// Visual Studio 2010 and GCC 4.2
struct EnqueueArgs
{
CommandQueue queue_ ;
const NDRange offset_ ;
const NDRange global_ ;
const NDRange local_ ;
VECTOR_CLASS < Event > events_ ;
2018-03-25 17:47:28 +00:00
EnqueueArgs ( NDRange global ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( NullRange )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( NDRange global , NDRange local ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( NDRange offset , NDRange global , NDRange local ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( offset ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( Event e , NDRange global ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( NullRange )
2013-10-18 18:26:06 +00:00
{
events_ . push_back ( e ) ;
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( Event e , NDRange global , NDRange local ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
events_ . push_back ( e ) ;
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( Event e , NDRange offset , NDRange global , NDRange local ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( offset ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
events_ . push_back ( e ) ;
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( const VECTOR_CLASS < Event > & events , NDRange global ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( NullRange ) ,
events_ ( events )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( const VECTOR_CLASS < Event > & events , NDRange global , NDRange local ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( local ) ,
events_ ( events )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( const VECTOR_CLASS < Event > & events , NDRange offset , NDRange global , NDRange local ) : queue_ ( CommandQueue : : getDefault ( ) ) ,
offset_ ( offset ) ,
global_ ( global ) ,
local_ ( local ) ,
events_ ( events )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , NDRange global ) : queue_ ( queue ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( NullRange )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , NDRange global , NDRange local ) : queue_ ( queue ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , NDRange offset , NDRange global , NDRange local ) : queue_ ( queue ) ,
offset_ ( offset ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , Event e , NDRange global ) : queue_ ( queue ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( NullRange )
2013-10-18 18:26:06 +00:00
{
events_ . push_back ( e ) ;
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , Event e , NDRange global , NDRange local ) : queue_ ( queue ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
events_ . push_back ( e ) ;
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , Event e , NDRange offset , NDRange global , NDRange local ) : queue_ ( queue ) ,
offset_ ( offset ) ,
global_ ( global ) ,
local_ ( local )
2013-10-18 18:26:06 +00:00
{
events_ . push_back ( e ) ;
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , const VECTOR_CLASS < Event > & events , NDRange global ) : queue_ ( queue ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( NullRange ) ,
events_ ( events )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , const VECTOR_CLASS < Event > & events , NDRange global , NDRange local ) : queue_ ( queue ) ,
offset_ ( NullRange ) ,
global_ ( global ) ,
local_ ( local ) ,
events_ ( events )
2013-10-18 18:26:06 +00:00
{
}
2018-03-25 17:47:28 +00:00
EnqueueArgs ( CommandQueue & queue , const VECTOR_CLASS < Event > & events , NDRange offset , NDRange global , NDRange local ) : queue_ ( queue ) ,
offset_ ( offset ) ,
global_ ( global ) ,
local_ ( local ) ,
events_ ( events )
2013-10-18 18:26:06 +00:00
{
}
} ;
2018-03-25 17:47:28 +00:00
namespace detail
{
class NullType
{
} ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
template < int index , typename T0 >
2013-10-18 18:26:06 +00:00
struct SetArg
{
2018-03-25 17:47:28 +00:00
static void set ( Kernel kernel , T0 arg )
2013-10-18 18:26:06 +00:00
{
kernel . setArg ( index , arg ) ;
}
2018-03-25 17:47:28 +00:00
} ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
template < int index >
2013-10-18 18:26:06 +00:00
struct SetArg < index , NullType >
{
2018-03-25 17:47:28 +00:00
static void set ( Kernel , NullType )
{
2013-10-18 18:26:06 +00:00
}
} ;
template <
2018-03-25 17:47:28 +00:00
typename T0 , typename T1 , typename T2 , typename T3 ,
typename T4 , typename T5 , typename T6 , typename T7 ,
typename T8 , typename T9 , typename T10 , typename T11 ,
typename T12 , typename T13 , typename T14 , typename T15 ,
typename T16 , typename T17 , typename T18 , typename T19 ,
typename T20 , typename T21 , typename T22 , typename T23 ,
typename T24 , typename T25 , typename T26 , typename T27 ,
typename T28 , typename T29 , typename T30 , typename T31 >
2013-10-18 18:26:06 +00:00
class KernelFunctorGlobal
{
private :
Kernel kernel_ ;
public :
2018-03-25 17:47:28 +00:00
KernelFunctorGlobal (
Kernel kernel ) : kernel_ ( kernel )
{
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
KernelFunctorGlobal (
2013-10-18 18:26:06 +00:00
const Program & program ,
const STRING_CLASS name ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr ) : kernel_ ( program , name . c_str ( ) , err )
2018-03-25 17:47:28 +00:00
{
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Event operator ( ) (
2013-10-18 18:26:06 +00:00
const EnqueueArgs & args ,
T0 t0 ,
T1 t1 = NullType ( ) ,
T2 t2 = NullType ( ) ,
T3 t3 = NullType ( ) ,
T4 t4 = NullType ( ) ,
T5 t5 = NullType ( ) ,
T6 t6 = NullType ( ) ,
T7 t7 = NullType ( ) ,
T8 t8 = NullType ( ) ,
T9 t9 = NullType ( ) ,
T10 t10 = NullType ( ) ,
T11 t11 = NullType ( ) ,
T12 t12 = NullType ( ) ,
T13 t13 = NullType ( ) ,
T14 t14 = NullType ( ) ,
T15 t15 = NullType ( ) ,
T16 t16 = NullType ( ) ,
T17 t17 = NullType ( ) ,
T18 t18 = NullType ( ) ,
T19 t19 = NullType ( ) ,
T20 t20 = NullType ( ) ,
T21 t21 = NullType ( ) ,
T22 t22 = NullType ( ) ,
T23 t23 = NullType ( ) ,
T24 t24 = NullType ( ) ,
T25 t25 = NullType ( ) ,
T26 t26 = NullType ( ) ,
T27 t27 = NullType ( ) ,
T28 t28 = NullType ( ) ,
T29 t29 = NullType ( ) ,
T30 t30 = NullType ( ) ,
2018-03-25 17:47:28 +00:00
T31 t31 = NullType ( ) )
2013-10-18 18:26:06 +00:00
{
Event event ;
SetArg < 0 , T0 > : : set ( kernel_ , t0 ) ;
SetArg < 1 , T1 > : : set ( kernel_ , t1 ) ;
SetArg < 2 , T2 > : : set ( kernel_ , t2 ) ;
SetArg < 3 , T3 > : : set ( kernel_ , t3 ) ;
SetArg < 4 , T4 > : : set ( kernel_ , t4 ) ;
SetArg < 5 , T5 > : : set ( kernel_ , t5 ) ;
SetArg < 6 , T6 > : : set ( kernel_ , t6 ) ;
SetArg < 7 , T7 > : : set ( kernel_ , t7 ) ;
SetArg < 8 , T8 > : : set ( kernel_ , t8 ) ;
SetArg < 9 , T9 > : : set ( kernel_ , t9 ) ;
SetArg < 10 , T10 > : : set ( kernel_ , t10 ) ;
SetArg < 11 , T11 > : : set ( kernel_ , t11 ) ;
SetArg < 12 , T12 > : : set ( kernel_ , t12 ) ;
SetArg < 13 , T13 > : : set ( kernel_ , t13 ) ;
SetArg < 14 , T14 > : : set ( kernel_ , t14 ) ;
SetArg < 15 , T15 > : : set ( kernel_ , t15 ) ;
SetArg < 16 , T16 > : : set ( kernel_ , t16 ) ;
SetArg < 17 , T17 > : : set ( kernel_ , t17 ) ;
SetArg < 18 , T18 > : : set ( kernel_ , t18 ) ;
SetArg < 19 , T19 > : : set ( kernel_ , t19 ) ;
SetArg < 20 , T20 > : : set ( kernel_ , t20 ) ;
SetArg < 21 , T21 > : : set ( kernel_ , t21 ) ;
SetArg < 22 , T22 > : : set ( kernel_ , t22 ) ;
SetArg < 23 , T23 > : : set ( kernel_ , t23 ) ;
SetArg < 24 , T24 > : : set ( kernel_ , t24 ) ;
SetArg < 25 , T25 > : : set ( kernel_ , t25 ) ;
SetArg < 26 , T26 > : : set ( kernel_ , t26 ) ;
SetArg < 27 , T27 > : : set ( kernel_ , t27 ) ;
SetArg < 28 , T28 > : : set ( kernel_ , t28 ) ;
SetArg < 29 , T29 > : : set ( kernel_ , t29 ) ;
SetArg < 30 , T30 > : : set ( kernel_ , t30 ) ;
SetArg < 31 , T31 > : : set ( kernel_ , t31 ) ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
args . queue_ . enqueueNDRangeKernel (
kernel_ ,
args . offset_ ,
args . global_ ,
args . local_ ,
& args . events_ ,
& event ) ;
2018-03-25 17:47:28 +00:00
2013-10-18 18:26:06 +00:00
return event ;
}
} ;
2019-09-13 06:56:37 +00:00
// -----------------------------------------------------------------------------------------------------
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 ,
typename T26 ,
typename T27 ,
typename T28 ,
typename T29 ,
typename T30 ,
typename T31 >
2013-10-18 18:26:06 +00:00
struct functionImplementation_
{
2018-03-25 17:47:28 +00:00
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
T30 ,
T31 >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
T30 ,
T31 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 ,
T26 arg26 ,
T27 arg27 ,
T28 arg28 ,
T29 arg29 ,
T30 arg30 ,
T31 arg31 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ,
arg26 ,
arg27 ,
arg28 ,
arg29 ,
arg30 ,
arg31 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 ,
typename T26 ,
typename T27 ,
typename T28 ,
typename T29 ,
typename T30 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
T30 ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
T30 ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
T30 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 ,
T26 arg26 ,
T27 arg27 ,
T28 arg28 ,
T29 arg29 ,
T30 arg30 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ,
arg26 ,
arg27 ,
arg28 ,
arg29 ,
arg30 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 ,
typename T26 ,
typename T27 ,
typename T28 ,
typename T29 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
T29 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 ,
T26 arg26 ,
T27 arg27 ,
T28 arg28 ,
T29 arg29 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ,
arg26 ,
arg27 ,
arg28 ,
arg29 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 ,
typename T26 ,
typename T27 ,
typename T28 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
T28 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 ,
T26 arg26 ,
T27 arg27 ,
T28 arg28 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ,
arg26 ,
arg27 ,
arg28 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 ,
typename T26 ,
typename T27 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
T27 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 ,
T26 arg26 ,
T27 arg27 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ,
arg26 ,
arg27 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 ,
typename T26 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
T26 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 ,
T26 arg26 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ,
arg26 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 ,
typename T25 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
T25 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 ,
T25 arg25 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ,
arg25 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 ,
typename T24 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
T24 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 ,
T24 arg24 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ,
arg24 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 ,
typename T23 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
T23 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 ,
T23 arg23 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ,
arg23 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 ,
typename T22 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
T22 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 ,
T22 arg22 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ,
arg22 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 ,
typename T21 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
T21 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 ,
T21 arg21 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ,
arg21 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 ,
typename T20 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
T20 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 ,
T20 arg20 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ,
arg20 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 ,
typename T19 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
T19 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 ,
T19 arg19 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ,
arg19 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 ,
typename T18 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
T18 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 ,
T18 arg18 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ,
arg18 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 ,
typename T17 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
T17 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 ,
T17 arg17 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ,
arg17 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 ,
typename T16 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
T16 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 ,
T16 arg16 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ,
arg16 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 ,
typename T15 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
T15 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 ,
T15 arg15 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ,
arg15 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 ,
typename T14 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
T14 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 ,
T14 arg14 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ,
arg14 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 ,
typename T13 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
T13 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 ,
T13 arg13 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ,
arg13 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 ,
typename T12 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
T12 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 ,
T12 arg12 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ,
arg12 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 ,
typename T11 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
T11 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 ,
T11 arg11 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ,
arg11 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 ,
typename T10 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
T10 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 ,
T10 arg10 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ,
arg10 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 ,
typename T9 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
T9 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 ,
T9 arg9 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ,
arg9 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 ,
typename T8 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
T8 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 ,
T8 arg8 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ,
arg8 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 ,
typename T7 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
T7 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 ,
T7 arg7 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ,
arg7 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 ,
typename T6 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
T6 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 ,
T6 arg6 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ,
arg6 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 ,
typename T5 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
T5 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 ,
T5 arg5 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ,
arg5 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 ,
typename T4 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
T4 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ,
T4 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 ,
T4 arg4 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ,
arg4 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 ,
typename T3 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
T3 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
T3 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ,
T3 ) ;
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 ,
T3 arg3 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ,
arg3 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 ,
typename T2 >
struct functionImplementation_ < T0 ,
T1 ,
T2 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
T2 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
}
//! \brief Return type of the functor
typedef Event result_type ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ,
T2 ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 ,
T2 arg2 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ,
arg2 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 ,
typename T1 >
struct functionImplementation_ < T0 ,
T1 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
T1 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ,
T1 ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 ,
T1 arg1 )
{
return functor_ (
enqueueArgs ,
arg0 ,
arg1 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
template <
typename T0 >
struct functionImplementation_ < T0 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
{
typedef detail : : KernelFunctorGlobal <
T0 ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType ,
NullType >
FunctorType ;
2013-10-18 18:26:06 +00:00
FunctorType functor_ ;
2018-03-25 17:47:28 +00:00
functionImplementation_ ( const FunctorType & functor ) : functor_ ( functor )
2013-10-18 18:26:06 +00:00
{
2018-03-25 17:47:28 +00:00
# if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1))
2013-10-18 18:26:06 +00:00
// Fail variadic expansion for dev11
static_assert ( 0 , " Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it. " ) ;
2018-03-25 17:47:28 +00:00
# endif
2013-10-18 18:26:06 +00:00
}
2018-03-25 17:47:28 +00:00
//! \brief Return type of the functor
typedef Event result_type ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
//! \brief Function signature of kernel functor with no event dependency.
typedef Event type_ (
const EnqueueArgs & ,
T0 ) ;
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
Event operator ( ) (
const EnqueueArgs & enqueueArgs ,
T0 arg0 )
{
return functor_ (
enqueueArgs ,
arg0 ) ;
}
2013-10-18 18:26:06 +00:00
} ;
2018-03-25 17:47:28 +00:00
} // namespace detail
2013-10-18 18:26:06 +00:00
2019-09-13 06:56:37 +00:00
// ---------------------------------------------------------------------------------------------
2013-10-18 18:26:06 +00:00
template <
2018-03-25 17:47:28 +00:00
typename T0 , typename T1 = detail : : NullType , typename T2 = detail : : NullType ,
typename T3 = detail : : NullType , typename T4 = detail : : NullType ,
typename T5 = detail : : NullType , typename T6 = detail : : NullType ,
typename T7 = detail : : NullType , typename T8 = detail : : NullType ,
typename T9 = detail : : NullType , typename T10 = detail : : NullType ,
typename T11 = detail : : NullType , typename T12 = detail : : NullType ,
typename T13 = detail : : NullType , typename T14 = detail : : NullType ,
typename T15 = detail : : NullType , typename T16 = detail : : NullType ,
typename T17 = detail : : NullType , typename T18 = detail : : NullType ,
typename T19 = detail : : NullType , typename T20 = detail : : NullType ,
typename T21 = detail : : NullType , typename T22 = detail : : NullType ,
typename T23 = detail : : NullType , typename T24 = detail : : NullType ,
typename T25 = detail : : NullType , typename T26 = detail : : NullType ,
typename T27 = detail : : NullType , typename T28 = detail : : NullType ,
typename T29 = detail : : NullType , typename T30 = detail : : NullType ,
typename T31 = detail : : NullType >
struct make_kernel : public detail : : functionImplementation_ <
T0 , T1 , T2 , T3 ,
T4 , T5 , T6 , T7 ,
T8 , T9 , T10 , T11 ,
T12 , T13 , T14 , T15 ,
T16 , T17 , T18 , T19 ,
T20 , T21 , T22 , T23 ,
T24 , T25 , T26 , T27 ,
T28 , T29 , T30 , T31 >
2013-10-18 18:26:06 +00:00
{
public :
2018-03-25 17:47:28 +00:00
typedef detail : : KernelFunctorGlobal <
T0 , T1 , T2 , T3 ,
T4 , T5 , T6 , T7 ,
T8 , T9 , T10 , T11 ,
T12 , T13 , T14 , T15 ,
T16 , T17 , T18 , T19 ,
T20 , T21 , T22 , T23 ,
T24 , T25 , T26 , T27 ,
T28 , T29 , T30 , T31 >
FunctorType ;
2013-10-18 18:26:06 +00:00
make_kernel (
const Program & program ,
const STRING_CLASS name ,
2019-06-24 17:25:51 +00:00
cl_int * err = nullptr ) : detail : : functionImplementation_ < T0 , T1 , T2 , T3 ,
T4 , T5 , T6 , T7 ,
T8 , T9 , T10 , T11 ,
T12 , T13 , T14 , T15 ,
T16 , T17 , T18 , T19 ,
T20 , T21 , T22 , T23 ,
T24 , T25 , T26 , T27 ,
T28 , T29 , T30 , T31 > (
FunctorType ( program , name , err ) )
2018-03-25 17:47:28 +00:00
{
}
2013-10-18 18:26:06 +00:00
make_kernel (
2018-03-25 17:47:28 +00:00
const Kernel kernel ) : detail : : functionImplementation_ < T0 , T1 , T2 , T3 ,
T4 , T5 , T6 , T7 ,
T8 , T9 , T10 , T11 ,
T12 , T13 , T14 , T15 ,
T16 , T17 , T18 , T19 ,
T20 , T21 , T22 , T23 ,
T24 , T25 , T26 , T27 ,
T28 , T29 , T30 , T31 > (
FunctorType ( kernel ) )
{
}
2013-10-18 18:26:06 +00:00
} ;
2019-09-13 06:56:37 +00:00
// ---------------------------------------------------------------------------------------------------------------------
2013-10-18 18:26:06 +00:00
# undef __ERR_STR
# if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
# undef __GET_DEVICE_INFO_ERR
# undef __GET_PLATFORM_INFO_ERR
# undef __GET_DEVICE_IDS_ERR
# undef __GET_CONTEXT_INFO_ERR
# undef __GET_EVENT_INFO_ERR
# undef __GET_EVENT_PROFILE_INFO_ERR
# undef __GET_MEM_OBJECT_INFO_ERR
# undef __GET_IMAGE_INFO_ERR
# undef __GET_SAMPLER_INFO_ERR
# undef __GET_KERNEL_INFO_ERR
# undef __GET_KERNEL_ARG_INFO_ERR
# undef __GET_KERNEL_WORK_GROUP_INFO_ERR
# undef __GET_PROGRAM_INFO_ERR
# undef __GET_PROGRAM_BUILD_INFO_ERR
# undef __GET_COMMAND_QUEUE_INFO_ERR
# undef __CREATE_CONTEXT_ERR
# undef __CREATE_CONTEXT_FROM_TYPE_ERR
# undef __GET_SUPPORTED_IMAGE_FORMATS_ERR
# undef __CREATE_BUFFER_ERR
# undef __CREATE_SUBBUFFER_ERR
# undef __CREATE_IMAGE2D_ERR
# undef __CREATE_IMAGE3D_ERR
# undef __CREATE_SAMPLER_ERR
# undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR
# undef __CREATE_USER_EVENT_ERR
# undef __SET_USER_EVENT_STATUS_ERR
# undef __SET_EVENT_CALLBACK_ERR
# undef __SET_PRINTF_CALLBACK_ERR
# undef __WAIT_FOR_EVENTS_ERR
# undef __CREATE_KERNEL_ERR
# undef __SET_KERNEL_ARGS_ERR
# undef __CREATE_PROGRAM_WITH_SOURCE_ERR
# undef __CREATE_PROGRAM_WITH_BINARY_ERR
# undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR
# undef __BUILD_PROGRAM_ERR
# undef __CREATE_KERNELS_IN_PROGRAM_ERR
# undef __CREATE_COMMAND_QUEUE_ERR
# undef __SET_COMMAND_QUEUE_PROPERTY_ERR
# undef __ENQUEUE_READ_BUFFER_ERR
# undef __ENQUEUE_WRITE_BUFFER_ERR
# undef __ENQUEUE_READ_BUFFER_RECT_ERR
# undef __ENQUEUE_WRITE_BUFFER_RECT_ERR
# undef __ENQEUE_COPY_BUFFER_ERR
# undef __ENQEUE_COPY_BUFFER_RECT_ERR
# undef __ENQUEUE_READ_IMAGE_ERR
# undef __ENQUEUE_WRITE_IMAGE_ERR
# undef __ENQUEUE_COPY_IMAGE_ERR
# undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR
# undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR
# undef __ENQUEUE_MAP_BUFFER_ERR
# undef __ENQUEUE_MAP_IMAGE_ERR
# undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR
# undef __ENQUEUE_NDRANGE_KERNEL_ERR
# undef __ENQUEUE_TASK_ERR
# undef __ENQUEUE_NATIVE_KERNEL
# undef __CL_EXPLICIT_CONSTRUCTORS
# undef __UNLOAD_COMPILER_ERR
2018-03-25 17:47:28 +00:00
# endif //__CL_USER_OVERRIDE_ERROR_STRINGS
2013-10-18 18:26:06 +00:00
# undef __CL_FUNCTION_TYPE
// Extensions
/**
* Deprecated APIs for 1.2
*/
# if defined(CL_VERSION_1_1)
# undef __INIT_CL_EXT_FCN_PTR
2018-03-25 17:47:28 +00:00
# endif // #if defined(CL_VERSION_1_1)
2013-10-18 18:26:06 +00:00
# undef __CREATE_SUB_DEVICES
# if defined(USE_CL_DEVICE_FISSION)
# undef __PARAM_NAME_DEVICE_FISSION
2018-03-25 17:47:28 +00:00
# endif // USE_CL_DEVICE_FISSION
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
# undef __DEFAULT_NOT_INITIALIZED
# undef __DEFAULT_BEING_INITIALIZED
2013-10-18 18:26:06 +00:00
# undef __DEFAULT_INITIALIZED
2019-06-24 09:25:18 +00:00
# undef CL_HPP_RVALUE_REFERENCES_SUPPORTED
# undef CL_HPP_NOEXCEPT
2013-10-18 18:26:06 +00:00
2019-06-24 09:25:18 +00:00
} // namespace cl
2013-10-18 18:26:06 +00:00
2018-03-25 17:47:28 +00:00
# endif // CL_HPP_