"platforms/reference/src/SimTKReference/GBVIParameters.cpp" did not exist on "2cfc68215e38966587f6dbfbcf6918f04c363a86"
Unverified Commit 1796f668 authored by peastman's avatar peastman Committed by GitHub
Browse files

Merge pull request #2522 from jaimergp/fix-ppc64le

Update cl.hpp
parents 90656381 2a7d78a6
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2008-2013 The Khronos Group Inc. * Copyright (c) 2008-2015 The Khronos Group Inc.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and/or associated documentation files (the * copy of this software and/or associated documentation files (the
...@@ -12,6 +12,11 @@ ...@@ -12,6 +12,11 @@
* The above copyright notice and this permission notice shall be included * The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Materials. * in all copies or substantial portions of the Materials.
* *
* MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
* KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
* SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
* https://www.khronos.org/registry/
*
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
...@@ -31,9 +36,10 @@ ...@@ -31,9 +36,10 @@
* Brian Cole, March 3rd 2010 and April 2012 * Brian Cole, March 3rd 2010 and April 2012
* Matt Gruenke, April 2012. * Matt Gruenke, April 2012.
* Bruce Merry, February 2013. * Bruce Merry, February 2013.
* Tom Deakin and Simon McIntosh-Smith, July 2013
* *
* \version 1.2.5 * \version 1.2.9
* \date June 2013 * \date December 2015
* *
* Optional extension support * Optional extension support
* *
...@@ -143,41 +149,49 @@ ...@@ -143,41 +149,49 @@
*/ */
#ifndef CL_HPP_ #ifndef CL_HPP_
#define CL_HPP_ #define CL_HPP_
#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
// The latest version of the OpenCL C++ bindings can be found on GitHub:
// -> https://github.com/KhronosGroup/OpenCL-CLHPP
#pragma message("This version of the OpenCL Host API C++ bindings is deprecated, please use cl2.hpp instead.")
#ifdef _WIN32 #ifdef _WIN32
#include <windows.h>
#include <malloc.h> #include <malloc.h>
#include <iterator>
#include <intrin.h>
#if defined(__CL_ENABLE_EXCEPTIONS)
#include <exception>
#endif // #if defined(__CL_ENABLE_EXCEPTIONS)
#pragma push_macro("max")
#undef max
#if defined(USE_DX_INTEROP) #if defined(USE_DX_INTEROP)
#include <CL/cl_d3d10.h> #include <CL/cl_d3d10.h>
#include <CL/cl_dx9_media_sharing.h> #include <CL/cl_dx9_media_sharing.h>
#endif #endif
#endif // _WIN32 #endif // _WIN32
#if defined(_MSC_VER)
#include <intrin.h>
#endif // _MSC_VER
// //
#if defined(USE_CL_DEVICE_FISSION) #if defined(USE_CL_DEVICE_FISSION)
#include <CL/cl_ext.h> #include <CL/cl_ext.h>
#endif #endif
#if defined(__APPLE__) || defined(__MACOSX) #if defined(__APPLE__) || defined(__MACOSX)
#include <OpenGL/OpenGL.h>
#include <OpenCL/opencl.h> #include <OpenCL/opencl.h>
#include <libkern/OSAtomic.h>
#else #else
#include <GL/gl.h>
#include <CL/opencl.h> #include <CL/opencl.h>
#endif // !__APPLE__ #endif // !__APPLE__
#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
// To avoid accidentally taking ownership of core OpenCL types // To avoid accidentally taking ownership of core OpenCL types
// such as cl_kernel constructors are made explicit // such as cl_kernel constructors are made explicit
// under OpenCL 1.2 // under OpenCL 1.2
...@@ -202,6 +216,11 @@ ...@@ -202,6 +216,11 @@
#include <utility> #include <utility>
#include <limits> #include <limits>
#include <iterator>
#if defined(__CL_ENABLE_EXCEPTIONS)
#include <exception>
#endif // #if defined(__CL_ENABLE_EXCEPTIONS)
#if !defined(__NO_STD_VECTOR) #if !defined(__NO_STD_VECTOR)
#include <vector> #include <vector>
...@@ -211,15 +230,31 @@ ...@@ -211,15 +230,31 @@
#include <string> #include <string>
#endif #endif
#if defined(linux) || defined(__APPLE__) || defined(__MACOSX) #if defined(__ANDROID__) || defined(linux) || defined(__APPLE__) || defined(__MACOSX)
#include <alloca.h> #include <alloca.h>
#include <emmintrin.h>
#include <xmmintrin.h>
#endif // linux #endif // linux
#include <cstring> #include <cstring>
// Compiler specific weak linking
#ifndef CL_WEAK_ATTRIB_PREFIX
// C++17: use inline variables/functions
#if __cplusplus >= 201703L
#define CL_USE_INLINE
#endif
#ifdef CL_USE_INLINE
#define CL_WEAK_ATTRIB_PREFIX inline
#define CL_WEAK_ATTRIB_SUFFIX
#elif _WIN32
#define CL_WEAK_ATTRIB_PREFIX __declspec(selectany)
#define CL_WEAK_ATTRIB_SUFFIX
#else // GCC, CLANG, etc.
#define CL_WEAK_ATTRIB_PREFIX
#define CL_WEAK_ATTRIB_SUFFIX __attribute__((weak))
#endif // CL_USE_INLINE
#endif // CL_WEAK_ATTRIB_PREFIX
/*! \namespace cl /*! \namespace cl
* *
...@@ -389,7 +424,7 @@ static inline cl_int errHandler (cl_int err, const char * errStr = NULL) ...@@ -389,7 +424,7 @@ static inline cl_int errHandler (cl_int err, const char * errStr = NULL)
#define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram) #define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram)
#if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2)
#define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram) #define __COMPILE_PROGRAM_ERR __ERR_STR(clCompileProgram)
#define __LINK_PROGRAM_ERR __ERR_STR(clLinkProgram)
#endif // #if defined(CL_VERSION_1_2) #endif // #if defined(CL_VERSION_1_2)
#define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram) #define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram)
...@@ -474,7 +509,7 @@ typedef std::string STRING_CLASS; ...@@ -474,7 +509,7 @@ typedef std::string STRING_CLASS;
* re-define the string class to match the std::string * re-define the string class to match the std::string
* interface by defining STRING_CLASS * interface by defining STRING_CLASS
*/ */
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string
{ {
private: private:
::size_t size_; ::size_t size_;
...@@ -546,7 +581,7 @@ public: ...@@ -546,7 +581,7 @@ public:
} }
else { else {
char *newString = new char[n + 1]; char *newString = new char[n + 1];
int copySize = n; ::size_t copySize = n;
if( size_ < n ) { if( size_ < n ) {
copySize = size_; copySize = size_;
} }
...@@ -640,7 +675,7 @@ public: ...@@ -640,7 +675,7 @@ public:
* or "" if empty/unset. * or "" if empty/unset.
*/ */
const char * c_str(void) const { return (str_) ? str_ : "";} const char * c_str(void) const { return (str_) ? str_ : "";}
}; } CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
typedef cl::string STRING_CLASS; typedef cl::string STRING_CLASS;
#endif // #elif !defined(__USE_DEV_STRING) #endif // #elif !defined(__USE_DEV_STRING)
...@@ -676,7 +711,7 @@ typedef cl::string STRING_CLASS; ...@@ -676,7 +711,7 @@ typedef cl::string STRING_CLASS;
* \param N maximum size of the vector. * \param N maximum size of the vector.
*/ */
template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE> template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE>
class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector
{ {
private: private:
T data_[N]; T data_[N];
...@@ -718,7 +753,7 @@ public: ...@@ -718,7 +753,7 @@ public:
*/ */
void push_back (const T& x) void push_back (const T& x)
{ {
if (size() < N) { if (size() < N) {
new (&data_[size_]) T(x); new (&data_[size_]) T(x);
size_++; size_++;
} else { } else {
...@@ -739,7 +774,7 @@ public: ...@@ -739,7 +774,7 @@ public:
detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR); detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
} }
} }
/*! \brief Constructs with a value copied from another. /*! \brief Constructs with a value copied from another.
* *
* \param vec the vector to copy. * \param vec the vector to copy.
...@@ -747,7 +782,7 @@ public: ...@@ -747,7 +782,7 @@ public:
vector(const vector<T, N>& vec) : vector(const vector<T, N>& vec) :
size_(vec.size_) size_(vec.size_)
{ {
if (size_ != 0) { if (size_ != 0) {
assign(vec.begin(), vec.end()); assign(vec.begin(), vec.end());
} }
} }
...@@ -784,7 +819,7 @@ public: ...@@ -784,7 +819,7 @@ public:
} else { } else {
clear(); clear();
} }
return *this; return *this;
} }
...@@ -830,6 +865,28 @@ public: ...@@ -830,6 +865,28 @@ public:
return N; return N;
} }
//! \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();
}
}
}
/*! \brief Returns a reference to a given element. /*! \brief Returns a reference to a given element.
* *
* \param index which element to access. * * \param index which element to access. *
...@@ -1006,7 +1063,7 @@ public: ...@@ -1006,7 +1063,7 @@ public:
{ {
return data_[size_-1]; return data_[size_-1];
} }
}; } CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
#endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) #endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
...@@ -1021,25 +1078,39 @@ namespace detail { ...@@ -1021,25 +1078,39 @@ namespace detail {
/* /*
* Compare and exchange primitives are needed for handling of defaults * Compare and exchange primitives are needed for handling of defaults
*/ */
#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
inline int compare_exchange(std::atomic<int> * dest, int exchange, int comparand)
#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
inline int compare_exchange(volatile int * dest, int exchange, int comparand) inline int compare_exchange(volatile int * dest, int exchange, int comparand)
{ #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
#ifdef _WIN32 {
return (int)(InterlockedCompareExchange( #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
(volatile long*)dest, std::atomic_compare_exchange_strong(dest, &comparand, exchange);
(long)exchange, return comparand;
(long)comparand)); #elif _MSC_VER
#elif defined(__APPLE__) || defined(__MACOSX) return (int)(_InterlockedCompareExchange(
return OSAtomicOr32Orig((uint32_t)exchange, (volatile uint32_t*)dest); (volatile long*)dest,
#else // !_WIN32 || defined(__APPLE__) || defined(__MACOSX) (long)exchange,
(long)comparand));
#else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
return (__sync_val_compare_and_swap( return (__sync_val_compare_and_swap(
dest, dest,
comparand, comparand,
exchange)); exchange));
#endif // !_WIN32 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
} }
inline void fence() { _mm_mfence(); } inline void fence() {
}; // namespace detail #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
/*! \brief class used to interface between C++ and /*! \brief class used to interface between C++ and
...@@ -1163,13 +1234,14 @@ inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, i ...@@ -1163,13 +1234,14 @@ inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, i
template <typename Func> template <typename Func>
inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long) inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
{ {
#if defined(__NO_STD_VECTOR) || defined(__NO_STD_STRING)
::size_t required; ::size_t required;
cl_int err = f(name, 0, NULL, &required); cl_int err = f(name, 0, NULL, &required);
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
return err; return err;
} }
char* value = (char*) alloca(required); char* value = (char*)alloca(required);
err = f(name, required, value, NULL); err = f(name, required, value, NULL);
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
return err; return err;
...@@ -1177,6 +1249,30 @@ inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long) ...@@ -1177,6 +1249,30 @@ inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
*param = value; *param = value;
return CL_SUCCESS; return CL_SUCCESS;
#else
::size_t required;
cl_int err = f(name, 0, NULL, &required);
if (err != CL_SUCCESS) {
return err;
}
if (required > 0) {
// std::string has a constant data member
// a char vector does not
VECTOR_CLASS<char> value(required);
err = f(name, required, value.data(), NULL);
if (err != CL_SUCCESS) {
return err;
}
if (param) {
param->assign(value.begin(), value.end() - 1u);
}
}
else if (param) {
param->assign("");
}
#endif
return CL_SUCCESS;
} }
// Specialized GetInfoHelper for cl::size_t params // Specialized GetInfoHelper for cl::size_t params
...@@ -1264,6 +1360,8 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_ ...@@ -1264,6 +1360,8 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_
F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, 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_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_SINGLE_FP_CONFIG, cl_device_fp_config) \
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_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \ 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_CACHELINE_SIZE, cl_uint)\
F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \
...@@ -1294,7 +1392,7 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_ ...@@ -1294,7 +1392,7 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_
F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \ 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_COMMAND_TYPE, cl_command_type) \
F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \ F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \
F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_uint) \ F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_int) \
\ \
F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \ 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_SUBMIT, cl_ulong) \
...@@ -1319,9 +1417,9 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_ ...@@ -1319,9 +1417,9 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_
\ \
F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \ F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \
F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \ F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \
F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \ F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_bool) \
F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \ F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_addressing_mode) \
F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \ F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_filter_mode) \
\ \
F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \ 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_CONTEXT, cl::Context) \
...@@ -1361,8 +1459,6 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_ ...@@ -1361,8 +1459,6 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, 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_DOUBLE, cl_uint) \
F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, 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_HOST_UNIFIED_MEMORY, cl_bool) \
F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \
\ \
...@@ -1378,7 +1474,10 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_ ...@@ -1378,7 +1474,10 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_
#if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2)
#define __PARAM_NAME_INFO_1_2(F) \ #define __PARAM_NAME_INFO_1_2(F) \
F(cl_image_info, CL_IMAGE_ARRAY_SIZE, ::size_t) \
F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \ F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \
F(cl_image_info, CL_IMAGE_NUM_MIP_LEVELS, cl_uint) \
F(cl_image_info, CL_IMAGE_NUM_SAMPLES, cl_uint) \
\ \
F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \ F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \
F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \ F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \
...@@ -1390,15 +1489,21 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_ ...@@ -1390,15 +1489,21 @@ inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_
F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \ 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_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_TYPE_NAME, STRING_CLASS) \
F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_QUALIFIER, cl_kernel_arg_type_qualifier) \
F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \ F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \
\ \
F(cl_device_info, CL_DEVICE_IMAGE_MAX_BUFFER_SIZE, ::size_t) \
F(cl_device_info, CL_DEVICE_IMAGE_MAX_ARRAY_SIZE, ::size_t) \
F(cl_device_info, CL_DEVICE_LINKER_AVAILABLE, cl_bool) \
F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS) \
F(cl_device_info, CL_DEVICE_PRINTF_BUFFER_SIZE, ::size_t) \
F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, cl_bool) \
F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \ F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \
F(cl_device_info, CL_DEVICE_PARTITION_MAX_SUB_DEVICES, cl_uint) \
F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \ F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \
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) \ F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \
F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS) F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS<cl_device_partition_property>) \
F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint)
#endif // #if defined(CL_VERSION_1_2) #endif // #if defined(CL_VERSION_1_2)
#if defined(USE_CL_DEVICE_FISSION) #if defined(USE_CL_DEVICE_FISSION)
...@@ -1675,7 +1780,7 @@ static cl_uint getVersion(const char *versionInfo) ...@@ -1675,7 +1780,7 @@ static cl_uint getVersion(const char *versionInfo)
++index; ++index;
} }
++index; ++index;
while(versionInfo[index] != ' ' ) { while(versionInfo[index] != ' ' && versionInfo[index] != '\0') {
lowVersion *= 10; lowVersion *= 10;
lowVersion += versionInfo[index]-'0'; lowVersion += versionInfo[index]-'0';
++index; ++index;
...@@ -1739,13 +1844,35 @@ public: ...@@ -1739,13 +1844,35 @@ public:
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
} }
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs) #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
{ {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
object_ = rhs.object_; object_ = rhs.object_;
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } rhs.object_ = NULL;
}
#endif
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
{
if (this != &rhs) {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
object_ = rhs.object_;
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
}
return *this;
}
#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
{
if (this != &rhs) {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
object_ = rhs.object_;
rhs.object_ = NULL;
}
return *this; return *this;
} }
#endif
Wrapper<cl_type>& operator = (const cl_type &rhs) Wrapper<cl_type>& operator = (const cl_type &rhs)
{ {
...@@ -1817,15 +1944,41 @@ public: ...@@ -1817,15 +1944,41 @@ public:
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
} }
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs) #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
{ {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
object_ = rhs.object_; object_ = rhs.object_;
referenceCountable_ = rhs.referenceCountable_; referenceCountable_ = rhs.referenceCountable_;
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); } rhs.object_ = NULL;
rhs.referenceCountable_ = false;
}
#endif
Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
{
if (this != &rhs) {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
object_ = rhs.object_;
referenceCountable_ = rhs.referenceCountable_;
if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
}
return *this; return *this;
} }
#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
{
if (this != &rhs) {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
object_ = rhs.object_;
referenceCountable_ = rhs.referenceCountable_;
rhs.object_ = NULL;
rhs.referenceCountable_ = false;
}
return *this;
}
#endif
Wrapper<cl_type>& operator = (const cl_type &rhs) Wrapper<cl_type>& operator = (const cl_type &rhs)
{ {
if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); } if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
...@@ -1910,17 +2063,11 @@ public: ...@@ -1910,17 +2063,11 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Device() : detail::Wrapper<cl_type>() { } Device() : detail::Wrapper<cl_type>() { }
/*! \brief Copy constructor.
*
* This simply copies the device ID value, which is an inexpensive operation.
*/
Device(const Device& device) : detail::Wrapper<cl_type>(device) { }
/*! \brief Constructor from cl_device_id. /*! \brief Constructor from cl_device_id.
* *
* This simply copies the device ID value, which is an inexpensive operation. * This simply copies the device ID value, which is an inexpensive operation.
*/ */
Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { } __CL_EXPLICIT_CONSTRUCTORS Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { }
/*! \brief Returns the first device on the default context. /*! \brief Returns the first device on the default context.
* *
...@@ -1928,27 +2075,45 @@ public: ...@@ -1928,27 +2075,45 @@ public:
*/ */
static Device getDefault(cl_int * err = NULL); static Device getDefault(cl_int * err = NULL);
/*! \brief Assignment operator from Device. /*! \brief Assignment operator from cl_device_id.
* *
* This simply copies the device ID value, which is an inexpensive operation. * This simply copies the device ID value, which is an inexpensive operation.
*/ */
Device& operator = (const Device& rhs) Device& operator = (const cl_device_id& rhs)
{ {
if (this != &rhs) { detail::Wrapper<cl_type>::operator=(rhs);
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment operator from cl_device_id. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* This simply copies the device ID value, which is an inexpensive operation.
*/ */
Device& operator = (const cl_device_id& rhs) 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)
{ {
detail::Wrapper<cl_type>::operator=(rhs); 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));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
//! \brief Wrapper for clGetDeviceInfo(). //! \brief Wrapper for clGetDeviceInfo().
template <typename T> template <typename T>
...@@ -2051,29 +2216,11 @@ public: ...@@ -2051,29 +2216,11 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Platform() : detail::Wrapper<cl_type>() { } Platform() : detail::Wrapper<cl_type>() { }
/*! \brief Copy constructor.
*
* This simply copies the platform ID value, which is an inexpensive operation.
*/
Platform(const Platform& platform) : detail::Wrapper<cl_type>(platform) { }
/*! \brief Constructor from cl_platform_id. /*! \brief Constructor from cl_platform_id.
* *
* This simply copies the platform ID value, which is an inexpensive operation. * This simply copies the platform ID value, which is an inexpensive operation.
*/ */
Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { } __CL_EXPLICIT_CONSTRUCTORS Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { }
/*! \brief Assignment operator from Platform.
*
* This simply copies the platform ID value, which is an inexpensive operation.
*/
Platform& operator = (const Platform& rhs)
{
if (this != &rhs) {
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this;
}
/*! \brief Assignment operator from cl_platform_id. /*! \brief Assignment operator from cl_platform_id.
* *
...@@ -2284,6 +2431,7 @@ public: ...@@ -2284,6 +2431,7 @@ public:
if (errResult != NULL) { if (errResult != NULL) {
*errResult = err; *errResult = err;
} }
return Platform();
} }
cl_platform_id* ids = (cl_platform_id*) alloca( cl_platform_id* ids = (cl_platform_id*) alloca(
...@@ -2292,13 +2440,14 @@ public: ...@@ -2292,13 +2440,14 @@ public:
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
detail::errHandler(err, __GET_PLATFORM_IDS_ERR); detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
if (errResult != NULL) {
*errResult = err;
}
return Platform();
} }
if (errResult != NULL) {
*errResult = err;
}
return ids[0]; return Platform(ids[0]);
} }
static Platform getDefault( static Platform getDefault(
...@@ -2347,16 +2496,15 @@ class Context ...@@ -2347,16 +2496,15 @@ class Context
: public detail::Wrapper<cl_context> : public detail::Wrapper<cl_context>
{ {
private: private:
#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
static std::atomic<int> default_initialized_;
#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
static volatile int default_initialized_; static volatile int default_initialized_;
#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
static Context default_; static Context default_;
static volatile cl_int default_error_; static volatile cl_int default_error_;
public: public:
/*! \brief Destructor.
*
* This calls clReleaseContext() on the value held by this instance.
*/
~Context() { }
/*! \brief Constructs a context including a list of specified devices. /*! \brief Constructs a context including a list of specified devices.
* *
* Wraps clCreateContext(). * Wraps clCreateContext().
...@@ -2417,7 +2565,7 @@ public: ...@@ -2417,7 +2565,7 @@ public:
} }
} }
/*! \brief Constructs a context including all devices of a specified type. /*! \brief Constructs a context including all or a subset of devices of a specified type.
* *
* Wraps clCreateContextFromType(). * Wraps clCreateContextFromType().
*/ */
...@@ -2434,18 +2582,62 @@ public: ...@@ -2434,18 +2582,62 @@ public:
{ {
cl_int error; cl_int error;
#if !defined(__APPLE__) || !defined(__MACOS) #if !defined(__APPLE__) && !defined(__MACOS)
cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 }; cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };
if (properties == NULL) { if (properties == NULL) {
prop[1] = (cl_context_properties)Platform::get(&error)(); // Get a valid platform ID as we cannot send in a blank one
VECTOR_CLASS<Platform> platforms;
error = Platform::get(&platforms);
if (error != CL_SUCCESS) { if (error != CL_SUCCESS) {
detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
if (err != NULL) { if (err != NULL) {
*err = error; *err = error;
return;
} }
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);
if (err != NULL) {
*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);
if (err != NULL) {
*err = CL_DEVICE_NOT_FOUND;
}
return;
} }
prop[1] = platform_id;
properties = &prop[0]; properties = &prop[0];
} }
#endif #endif
...@@ -2458,6 +2650,36 @@ public: ...@@ -2458,6 +2650,36 @@ public:
} }
} }
/*! \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)
/*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT. /*! \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. * \note All calls to this function return the same cl_context as the first.
...@@ -2513,12 +2735,6 @@ public: ...@@ -2513,12 +2735,6 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Context() : detail::Wrapper<cl_type>() { } Context() : detail::Wrapper<cl_type>() { }
/*! \brief Copy constructor.
*
* This calls clRetainContext() on the parameter's cl_context.
*/
Context(const Context& context) : detail::Wrapper<cl_type>(context) { }
/*! \brief Constructor from cl_context - takes ownership. /*! \brief Constructor from cl_context - takes ownership.
* *
* This effectively transfers ownership of a refcount on the cl_context * This effectively transfers ownership of a refcount on the cl_context
...@@ -2526,19 +2742,6 @@ public: ...@@ -2526,19 +2742,6 @@ public:
*/ */
__CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { } __CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { }
/*! \brief Assignment operator from Context.
*
* This calls clRetainContext() on the parameter and clReleaseContext() on
* the previous value held by this instance.
*/
Context& operator = (const Context& rhs)
{
if (this != &rhs) {
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this;
}
/*! \brief Assignment operator from cl_context - takes ownership. /*! \brief Assignment operator from cl_context - takes ownership.
* *
* This effectively transfers ownership of a refcount on the rhs and calls * This effectively transfers ownership of a refcount on the rhs and calls
...@@ -2583,31 +2786,41 @@ public: ...@@ -2583,31 +2786,41 @@ public:
VECTOR_CLASS<ImageFormat>* formats) const VECTOR_CLASS<ImageFormat>* formats) const
{ {
cl_uint numEntries; cl_uint numEntries;
cl_int err = ::clGetSupportedImageFormats(
object_, if (!formats) {
flags, return CL_SUCCESS;
type,
0,
NULL,
&numEntries);
if (err != CL_SUCCESS) {
return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
} }
ImageFormat* value = (ImageFormat*) cl_int err = ::clGetSupportedImageFormats(
alloca(numEntries * sizeof(ImageFormat)); object_,
err = ::clGetSupportedImageFormats( flags,
object_, type,
flags, 0,
type, NULL,
numEntries, &numEntries);
(cl_image_format*) value,
NULL);
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
} }
formats->assign(&value[0], &value[numEntries]); if (numEntries > 0) {
ImageFormat* value = (ImageFormat*)
alloca(numEntries * sizeof(ImageFormat));
err = ::clGetSupportedImageFormats(
object_,
flags,
type,
numEntries,
(cl_image_format*)value,
NULL);
if (err != CL_SUCCESS) {
return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
}
formats->assign(&value[0], &value[numEntries]);
}
else {
formats->clear();
}
return CL_SUCCESS; return CL_SUCCESS;
} }
}; };
...@@ -2618,7 +2831,7 @@ inline Device Device::getDefault(cl_int * err) ...@@ -2618,7 +2831,7 @@ inline Device Device::getDefault(cl_int * err)
Device device; Device device;
Context context = Context::getDefault(&error); Context context = Context::getDefault(&error);
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); detail::errHandler(error, __CREATE_CONTEXT_ERR);
if (error != CL_SUCCESS) { if (error != CL_SUCCESS) {
if (err != NULL) { if (err != NULL) {
...@@ -2635,16 +2848,14 @@ inline Device Device::getDefault(cl_int * err) ...@@ -2635,16 +2848,14 @@ inline Device Device::getDefault(cl_int * err)
return device; return device;
} }
#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
CL_WEAK_ATTRIB_PREFIX std::atomic<int> CL_WEAK_ATTRIB_SUFFIX Context::default_initialized_;
#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
CL_WEAK_ATTRIB_PREFIX volatile int CL_WEAK_ATTRIB_SUFFIX Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
#ifdef _WIN32 CL_WEAK_ATTRIB_PREFIX Context CL_WEAK_ATTRIB_SUFFIX Context::default_;
__declspec(selectany) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED; CL_WEAK_ATTRIB_PREFIX volatile cl_int CL_WEAK_ATTRIB_SUFFIX Context::default_error_ = CL_SUCCESS;
__declspec(selectany) Context Context::default_;
__declspec(selectany) volatile cl_int Context::default_error_ = CL_SUCCESS;
#else
__attribute__((weak)) volatile int Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
__attribute__((weak)) Context Context::default_;
__attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS;
#endif
/*! \brief Class interface for cl_event. /*! \brief Class interface for cl_event.
* *
...@@ -2657,46 +2868,21 @@ __attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS; ...@@ -2657,46 +2868,21 @@ __attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS;
class Event : public detail::Wrapper<cl_event> class Event : public detail::Wrapper<cl_event>
{ {
public: public:
/*! \brief Destructor.
*
* This calls clReleaseEvent() on the value held by this instance.
*/
~Event() { }
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Event() : detail::Wrapper<cl_type>() { } Event() : detail::Wrapper<cl_type>() { }
/*! \brief Copy constructor.
*
* This calls clRetainEvent() on the parameter's cl_event.
*/
Event(const Event& event) : detail::Wrapper<cl_type>(event) { }
/*! \brief Constructor from cl_event - takes ownership. /*! \brief Constructor from cl_event - takes ownership.
* *
* This effectively transfers ownership of a refcount on the cl_event * This effectively transfers ownership of a refcount on the cl_event
* into the new Event object. * into the new Event object.
*/ */
Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { } __CL_EXPLICIT_CONSTRUCTORS Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { }
/*! \brief Assignment operator from cl_event - takes ownership. /*! \brief Assignment operator from cl_event - takes ownership.
* *
* This effectively transfers ownership of a refcount on the rhs and calls * This effectively transfers ownership of a refcount on the rhs and calls
* clReleaseEvent() on the value previously held by this instance. * clReleaseEvent() on the value previously held by this instance.
*/ */
Event& operator = (const Event& rhs)
{
if (this != &rhs) {
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this;
}
/*! \brief Assignment operator from cl_event.
*
* This calls clRetainEvent() on the parameter and clReleaseEvent() on
* the previous value held by this instance.
*/
Event& operator = (const cl_event& rhs) Event& operator = (const cl_event& rhs)
{ {
detail::Wrapper<cl_type>::operator=(rhs); detail::Wrapper<cl_type>::operator=(rhs);
...@@ -2789,7 +2975,7 @@ public: ...@@ -2789,7 +2975,7 @@ public:
{ {
return detail::errHandler( return detail::errHandler(
::clWaitForEvents( ::clWaitForEvents(
(cl_uint) events.size(), (cl_event*)&events.front()), (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
__WAIT_FOR_EVENTS_ERR); __WAIT_FOR_EVENTS_ERR);
} }
}; };
...@@ -2824,18 +3010,6 @@ public: ...@@ -2824,18 +3010,6 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
UserEvent() : Event() { } UserEvent() : Event() { }
//! \brief Copy constructor - performs shallow copy.
UserEvent(const UserEvent& event) : Event(event) { }
//! \brief Assignment Operator - performs shallow copy.
UserEvent& operator = (const UserEvent& rhs)
{
if (this != &rhs) {
Event::operator=(rhs);
}
return *this;
}
/*! \brief Sets the execution status of a user event object. /*! \brief Sets the execution status of a user event object.
* *
* Wraps clSetUserEventStatus(). * Wraps clSetUserEventStatus().
...@@ -2858,7 +3032,7 @@ WaitForEvents(const VECTOR_CLASS<Event>& events) ...@@ -2858,7 +3032,7 @@ WaitForEvents(const VECTOR_CLASS<Event>& events)
{ {
return detail::errHandler( return detail::errHandler(
::clWaitForEvents( ::clWaitForEvents(
(cl_uint) events.size(), (cl_event*)&events.front()), (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
__WAIT_FOR_EVENTS_ERR); __WAIT_FOR_EVENTS_ERR);
} }
...@@ -2873,22 +3047,9 @@ WaitForEvents(const VECTOR_CLASS<Event>& events) ...@@ -2873,22 +3047,9 @@ WaitForEvents(const VECTOR_CLASS<Event>& events)
class Memory : public detail::Wrapper<cl_mem> class Memory : public detail::Wrapper<cl_mem>
{ {
public: public:
/*! \brief Destructor.
*
* This calls clReleaseMemObject() on the value held by this instance.
*/
~Memory() {}
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Memory() : detail::Wrapper<cl_type>() { } Memory() : detail::Wrapper<cl_type>() { }
/*! \brief Copy constructor - performs shallow copy.
*
* This calls clRetainMemObject() on the parameter's cl_mem.
*/
Memory(const Memory& memory) : detail::Wrapper<cl_type>(memory) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* This effectively transfers ownership of a refcount on the cl_mem * This effectively transfers ownership of a refcount on the cl_mem
...@@ -2896,19 +3057,6 @@ public: ...@@ -2896,19 +3057,6 @@ public:
*/ */
__CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { } __CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { }
/*! \brief Assignment operator from Memory.
*
* This calls clRetainMemObject() on the parameter and clReleaseMemObject()
* on the previous value held by this instance.
*/
Memory& operator = (const Memory& rhs)
{
if (this != &rhs) {
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this;
}
/*! \brief Assignment operator from cl_mem - takes ownership. /*! \brief Assignment operator from cl_mem - takes ownership.
* *
* This effectively transfers ownership of a refcount on the rhs and calls * This effectively transfers ownership of a refcount on the rhs and calls
...@@ -2920,11 +3068,41 @@ public: ...@@ -2920,11 +3068,41 @@ public:
return *this; return *this;
} }
//! \brief Wrapper for clGetMemObjectInfo(). /*! \brief Copy constructor to forward copy to the superclass correctly.
template <typename T> * Required for MSVC.
cl_int getInfo(cl_mem_info name, T* param) const */
{ Memory(const Memory& mem) : detail::Wrapper<cl_type>(mem) {}
return detail::errHandler(
/*! \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)
//! \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), detail::getInfo(&::clGetMemObjectInfo, object_, name, param),
__GET_MEM_OBJECT_INFO_ERR); __GET_MEM_OBJECT_INFO_ERR);
} }
...@@ -2978,6 +3156,11 @@ template< typename IteratorType > ...@@ -2978,6 +3156,11 @@ template< typename IteratorType >
cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ); cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
template< typename IteratorType > template< typename IteratorType >
cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ); cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
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 );
/*! \brief Class interface for Buffer Memory Objects. /*! \brief Class interface for Buffer Memory Objects.
* *
...@@ -3041,7 +3224,8 @@ public: ...@@ -3041,7 +3224,8 @@ public:
/*! /*!
* \brief Construct a Buffer from a host container via iterators. * \brief Construct a Buffer from a host container via iterators.
* If useHostPtr is specified iterators must be random access. * IteratorType must be random access.
* If useHostPtr is specified iterators must represent contiguous data.
*/ */
template< typename IteratorType > template< typename IteratorType >
Buffer( Buffer(
...@@ -3089,42 +3273,71 @@ public: ...@@ -3089,42 +3273,71 @@ public:
} }
} }
/*!
* \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,
bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
/*!
* \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,
bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Buffer() : Memory() { } Buffer() : Memory() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Buffer(const Buffer& buffer) : Memory(buffer) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { } __CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { }
/*! \brief Assignment from Buffer - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Buffer& operator = (const Buffer& rhs) Buffer& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Memory::operator=(rhs);
Memory::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC.
*/
Buffer(const Buffer& buf) : Memory(buf) {}
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy assignment to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Buffer& operator = (const cl_mem& rhs) Buffer& operator = (const Buffer &buf)
{ {
Memory::operator=(rhs); 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));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
#if defined(CL_VERSION_1_1) #if defined(CL_VERSION_1_1)
/*! \brief Creates a new buffer object from this. /*! \brief Creates a new buffer object from this.
...@@ -3215,39 +3428,51 @@ public: ...@@ -3215,39 +3428,51 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
BufferD3D10() : Buffer() { } BufferD3D10() : Buffer() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
BufferD3D10(const BufferD3D10& buffer) : Buffer(buffer) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { } __CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { }
/*! \brief Assignment from BufferD3D10 - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
BufferD3D10& operator = (const BufferD3D10& rhs) BufferD3D10& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Buffer::operator=(rhs);
Buffer::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details. */
*/ BufferD3D10(const BufferD3D10& buf) : Buffer(buf) {}
BufferD3D10& operator = (const cl_mem& rhs)
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
BufferD3D10& operator = (const BufferD3D10 &buf)
{ {
Buffer::operator=(rhs); 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));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
#endif #endif
...@@ -3270,7 +3495,7 @@ public: ...@@ -3270,7 +3495,7 @@ public:
BufferGL( BufferGL(
const Context& context, const Context& context,
cl_mem_flags flags, cl_mem_flags flags,
GLuint bufobj, cl_GLuint bufobj,
cl_int * err = NULL) cl_int * err = NULL)
{ {
cl_int error; cl_int error;
...@@ -3289,30 +3514,12 @@ public: ...@@ -3289,30 +3514,12 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
BufferGL() : Buffer() { } BufferGL() : Buffer() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
BufferGL(const BufferGL& buffer) : Buffer(buffer) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { } __CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { }
/*! \brief Assignment from BufferGL - performs shallow copy.
*
* See Memory for further details.
*/
BufferGL& operator = (const BufferGL& rhs)
{
if (this != &rhs) {
Buffer::operator=(rhs);
}
return *this;
}
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
...@@ -3323,93 +3530,40 @@ public: ...@@ -3323,93 +3530,40 @@ public:
return *this; return *this;
} }
//! \brief Wrapper for clGetGLObjectInfo(). /*! \brief Copy constructor to forward copy to the superclass correctly.
cl_int getObjectInfo( * Required for MSVC.
cl_gl_object_type *type, */
GLuint * gl_object_name) BufferGL(const BufferGL& buf) : Buffer(buf) {}
{
return detail::errHandler(
::clGetGLObjectInfo(object_,type,gl_object_name),
__GET_GL_OBJECT_INFO_ERR);
}
};
/*! \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 : public Buffer
{
public:
/*! \brief Constructs a BufferRenderGL in a specified context, from a given
* GL Renderbuffer.
*
* Wraps clCreateFromGLRenderbuffer().
*/
BufferRenderGL(
const Context& context,
cl_mem_flags flags,
GLuint bufobj,
cl_int * err = NULL)
{
cl_int error;
object_ = ::clCreateFromGLRenderbuffer(
context(),
flags,
bufobj,
&error);
detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
if (err != NULL) {
*err = error;
}
}
//! \brief Default constructor - initializes to NULL.
BufferRenderGL() : Buffer() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
BufferRenderGL(const BufferGL& buffer) : Buffer(buffer) { }
/*! \brief Constructor from cl_mem - takes ownership.
*
* See Memory for further details.
*/
__CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Buffer(buffer) { }
/*! \brief Assignment from BufferGL - performs shallow copy. /*! \brief Copy assignment to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details. */
*/ BufferGL& operator = (const BufferGL &buf)
BufferRenderGL& operator = (const BufferRenderGL& rhs)
{ {
if (this != &rhs) { Buffer::operator=(buf);
Buffer::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
* /*! \brief Move constructor to forward move to the superclass correctly.
* See Memory for further details. * Required for MSVC.
*/ */
BufferRenderGL& operator = (const cl_mem& rhs) 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)
{ {
Buffer::operator=(rhs); Buffer::operator=(std::move(buf));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
//! \brief Wrapper for clGetGLObjectInfo(). //! \brief Wrapper for clGetGLObjectInfo().
cl_int getObjectInfo( cl_int getObjectInfo(
cl_gl_object_type *type, cl_gl_object_type *type,
GLuint * gl_object_name) cl_GLuint * gl_object_name)
{ {
return detail::errHandler( return detail::errHandler(
::clGetGLObjectInfo(object_,type,gl_object_name), ::clGetGLObjectInfo(object_,type,gl_object_name),
...@@ -3429,40 +3583,52 @@ protected: ...@@ -3429,40 +3583,52 @@ protected:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Image() : Memory() { } Image() : Memory() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Image(const Image& image) : Memory(image) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { } __CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { }
/*! \brief Assignment from Image - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Image& operator = (const Image& rhs) Image& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Memory::operator=(rhs);
Memory::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Image& operator = (const cl_mem& rhs) Image(const Image& img) : Memory(img) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image& operator = (const Image &img)
{ {
Memory::operator=(rhs); Memory::operator=(img);
return *this; 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));
return *this;
}
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
public: public:
//! \brief Wrapper for clGetImageInfo(). //! \brief Wrapper for clGetImageInfo().
template <typename T> template <typename T>
...@@ -3511,13 +3677,12 @@ public: ...@@ -3511,13 +3677,12 @@ public:
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int error; cl_int error;
cl_image_desc desc; cl_image_desc desc =
desc.image_type = CL_MEM_OBJECT_IMAGE1D; {
desc.image_width = width; CL_MEM_OBJECT_IMAGE1D,
desc.image_row_pitch = 0; width,
desc.num_mip_levels = 0; 0, 0, 0, 0, 0, 0, 0, 0
desc.num_samples = 0; };
desc.buffer = 0;
object_ = ::clCreateImage( object_ = ::clCreateImage(
context(), context(),
flags, flags,
...@@ -3535,39 +3700,51 @@ public: ...@@ -3535,39 +3700,51 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Image1D() { } Image1D() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Image1D(const Image1D& image1D) : Image(image1D) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { } __CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { }
/*! \brief Assignment from Image1D - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Image1D& operator = (const Image1D& rhs) Image1D& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Image1D& operator = (const cl_mem& rhs) Image1D(const Image1D& img) : Image(img) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image1D& operator = (const Image1D &img)
{ {
Image::operator=(rhs); 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));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
/*! \class Image1DBuffer /*! \class Image1DBuffer
...@@ -3585,13 +3762,13 @@ public: ...@@ -3585,13 +3762,13 @@ public:
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int error; cl_int error;
cl_image_desc desc; cl_image_desc desc =
desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER; {
desc.image_width = width; CL_MEM_OBJECT_IMAGE1D_BUFFER,
desc.image_row_pitch = 0; width,
desc.num_mip_levels = 0; 0, 0, 0, 0, 0, 0, 0,
desc.num_samples = 0; buffer()
desc.buffer = buffer(); };
object_ = ::clCreateImage( object_ = ::clCreateImage(
context(), context(),
flags, flags,
...@@ -3608,23 +3785,43 @@ public: ...@@ -3608,23 +3785,43 @@ public:
Image1DBuffer() { } Image1DBuffer() { }
Image1DBuffer(const Image1DBuffer& image1D) : Image(image1D) { }
__CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { } __CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { }
Image1DBuffer& operator = (const Image1DBuffer& rhs) Image1DBuffer& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image1DBuffer(const Image1DBuffer& img) : Image(img) {}
Image1DBuffer& operator = (const cl_mem& rhs) /*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image1DBuffer& operator = (const Image1DBuffer &img)
{ {
Image::operator=(rhs); Image::operator=(img);
return *this; return *this;
} }
#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)
{
Image::operator=(std::move(img));
return *this;
}
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
/*! \class Image1DArray /*! \class Image1DArray
...@@ -3644,14 +3841,15 @@ public: ...@@ -3644,14 +3841,15 @@ public:
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int error; cl_int error;
cl_image_desc desc; cl_image_desc desc =
desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY; {
desc.image_array_size = arraySize; CL_MEM_OBJECT_IMAGE1D_ARRAY,
desc.image_width = width; width,
desc.image_row_pitch = rowPitch; 0, 0, // height, depth (unused)
desc.num_mip_levels = 0; arraySize,
desc.num_samples = 0; rowPitch,
desc.buffer = 0; 0, 0, 0, 0
};
object_ = ::clCreateImage( object_ = ::clCreateImage(
context(), context(),
flags, flags,
...@@ -3668,23 +3866,43 @@ public: ...@@ -3668,23 +3866,43 @@ public:
Image1DArray() { } Image1DArray() { }
Image1DArray(const Image1DArray& imageArray) : Image(imageArray) { }
__CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { } __CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { }
Image1DArray& operator = (const Image1DArray& rhs) Image1DArray& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image1DArray(const Image1DArray& img) : Image(img) {}
Image1DArray& operator = (const cl_mem& rhs) /*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image1DArray& operator = (const Image1DArray &img)
{ {
Image::operator=(rhs); Image::operator=(img);
return *this; return *this;
} }
#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)) {}
/*! \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) #endif // #if defined(CL_VERSION_1_2)
...@@ -3730,14 +3948,15 @@ public: ...@@ -3730,14 +3948,15 @@ public:
#if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2)
if (useCreateImage) if (useCreateImage)
{ {
cl_image_desc desc; cl_image_desc desc =
desc.image_type = CL_MEM_OBJECT_IMAGE2D; {
desc.image_width = width; CL_MEM_OBJECT_IMAGE2D,
desc.image_height = height; width,
desc.image_row_pitch = row_pitch; height,
desc.num_mip_levels = 0; 0, 0, // depth, array size (unused)
desc.num_samples = 0; row_pitch,
desc.buffer = 0; 0, 0, 0, 0
};
object_ = ::clCreateImage( object_ = ::clCreateImage(
context(), context(),
flags, flags,
...@@ -3769,39 +3988,51 @@ public: ...@@ -3769,39 +3988,51 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Image2D() { } Image2D() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Image2D(const Image2D& image2D) : Image(image2D) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { } __CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { }
/*! \brief Assignment from Image2D - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Image2D& operator = (const Image2D& rhs) Image2D& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Image2D& operator = (const cl_mem& rhs) Image2D(const Image2D& img) : Image(img) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image2D& operator = (const Image2D &img)
{ {
Image::operator=(rhs); Image::operator=(img);
return *this; 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));
return *this;
}
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
...@@ -3826,9 +4057,9 @@ public: ...@@ -3826,9 +4057,9 @@ public:
Image2DGL( Image2DGL(
const Context& context, const Context& context,
cl_mem_flags flags, cl_mem_flags flags,
GLenum target, cl_GLenum target,
GLint miplevel, cl_GLint miplevel,
GLuint texobj, cl_GLuint texobj,
cl_int * err = NULL) cl_int * err = NULL)
{ {
cl_int error; cl_int error;
...@@ -3850,39 +4081,51 @@ public: ...@@ -3850,39 +4081,51 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Image2DGL() : Image2D() { } Image2DGL() : Image2D() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Image2DGL(const Image2DGL& image) : Image2D(image) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { } __CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { }
/*! \brief Assignment from Image2DGL - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Image2DGL& operator = (const Image2DGL& rhs) Image2DGL& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image2D::operator=(rhs);
Image2D::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Image2DGL& operator = (const cl_mem& rhs) Image2DGL(const Image2DGL& img) : Image2D(img) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image2DGL& operator = (const Image2DGL &img)
{ {
Image2D::operator=(rhs); Image2D::operator=(img);
return *this; return *this;
} }
#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)
}; };
#endif // #if !defined(CL_VERSION_1_2) #endif // #if !defined(CL_VERSION_1_2)
...@@ -3906,16 +4149,17 @@ public: ...@@ -3906,16 +4149,17 @@ public:
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int error; cl_int error;
cl_image_desc desc; cl_image_desc desc =
desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY; {
desc.image_array_size = arraySize; CL_MEM_OBJECT_IMAGE2D_ARRAY,
desc.image_width = width; width,
desc.image_height = height; height,
desc.image_row_pitch = rowPitch; 0, // depth (unused)
desc.image_slice_pitch = slicePitch; arraySize,
desc.num_mip_levels = 0; rowPitch,
desc.num_samples = 0; slicePitch,
desc.buffer = 0; 0, 0, 0
};
object_ = ::clCreateImage( object_ = ::clCreateImage(
context(), context(),
flags, flags,
...@@ -3932,23 +4176,43 @@ public: ...@@ -3932,23 +4176,43 @@ public:
Image2DArray() { } Image2DArray() { }
Image2DArray(const Image2DArray& imageArray) : Image(imageArray) { }
__CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { } __CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { }
Image2DArray& operator = (const Image2DArray& rhs) Image2DArray& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image2DArray(const Image2DArray& img) : Image(img) {}
Image2DArray& operator = (const cl_mem& rhs) /*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image2DArray& operator = (const Image2DArray &img)
{ {
Image::operator=(rhs); Image::operator=(img);
return *this; return *this;
} }
#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)
}; };
#endif // #if defined(CL_VERSION_1_2) #endif // #if defined(CL_VERSION_1_2)
...@@ -3995,16 +4259,17 @@ public: ...@@ -3995,16 +4259,17 @@ public:
#if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2)
if (useCreateImage) if (useCreateImage)
{ {
cl_image_desc desc; cl_image_desc desc =
desc.image_type = CL_MEM_OBJECT_IMAGE3D; {
desc.image_width = width; CL_MEM_OBJECT_IMAGE3D,
desc.image_height = height; width,
desc.image_depth = depth; height,
desc.image_row_pitch = row_pitch; depth,
desc.image_slice_pitch = slice_pitch; 0, // array size (unused)
desc.num_mip_levels = 0; row_pitch,
desc.num_samples = 0; slice_pitch,
desc.buffer = 0; 0, 0, 0
};
object_ = ::clCreateImage( object_ = ::clCreateImage(
context(), context(),
flags, flags,
...@@ -4035,13 +4300,7 @@ public: ...@@ -4035,13 +4300,7 @@ public:
} }
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Image3D() { } Image3D() : Image() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Image3D(const Image3D& image3D) : Image(image3D) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
...@@ -4049,27 +4308,45 @@ public: ...@@ -4049,27 +4308,45 @@ public:
*/ */
__CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { } __CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { }
/*! \brief Assignment from Image3D - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Image3D& operator = (const Image3D& rhs) Image3D& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Image3D& operator = (const cl_mem& rhs) Image3D(const Image3D& img) : Image(img) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image3D& operator = (const Image3D &img)
{ {
Image::operator=(rhs); 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.
*/
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; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
#if !defined(CL_VERSION_1_2) #if !defined(CL_VERSION_1_2)
...@@ -4092,9 +4369,9 @@ public: ...@@ -4092,9 +4369,9 @@ public:
Image3DGL( Image3DGL(
const Context& context, const Context& context,
cl_mem_flags flags, cl_mem_flags flags,
GLenum target, cl_GLenum target,
GLint miplevel, cl_GLint miplevel,
GLuint texobj, cl_GLuint texobj,
cl_int * err = NULL) cl_int * err = NULL)
{ {
cl_int error; cl_int error;
...@@ -4115,39 +4392,51 @@ public: ...@@ -4115,39 +4392,51 @@ public:
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Image3DGL() : Image3D() { } Image3DGL() : Image3D() { }
/*! \brief Copy constructor - performs shallow copy.
*
* See Memory for further details.
*/
Image3DGL(const Image3DGL& image) : Image3D(image) { }
/*! \brief Constructor from cl_mem - takes ownership. /*! \brief Constructor from cl_mem - takes ownership.
* *
* See Memory for further details. * See Memory for further details.
*/ */
__CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { } __CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { }
/*! \brief Assignment from Image3DGL - performs shallow copy. /*! \brief Assignment from cl_mem - performs shallow copy.
* *
* See Memory for further details. * See Memory for further details.
*/ */
Image3DGL& operator = (const Image3DGL& rhs) Image3DGL& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image3D::operator=(rhs);
Image3D::operator=(rhs);
}
return *this; return *this;
} }
/*! \brief Assignment from cl_mem - performs shallow copy. /*! \brief Copy constructor to forward copy to the superclass correctly.
* * Required for MSVC.
* See Memory for further details.
*/ */
Image3DGL& operator = (const cl_mem& rhs) Image3DGL(const Image3DGL& img) : Image3D(img) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Image3DGL& operator = (const Image3DGL &img)
{ {
Image3D::operator=(rhs); Image3D::operator=(img);
return *this;
}
#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; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
#endif // #if !defined(CL_VERSION_1_2) #endif // #if !defined(CL_VERSION_1_2)
...@@ -4164,9 +4453,9 @@ public: ...@@ -4164,9 +4453,9 @@ public:
ImageGL( ImageGL(
const Context& context, const Context& context,
cl_mem_flags flags, cl_mem_flags flags,
GLenum target, cl_GLenum target,
GLint miplevel, cl_GLint miplevel,
GLuint texobj, cl_GLuint texobj,
cl_int * err = NULL) cl_int * err = NULL)
{ {
cl_int error; cl_int error;
...@@ -4186,26 +4475,178 @@ public: ...@@ -4186,26 +4475,178 @@ public:
ImageGL() : Image() { } ImageGL() : Image() { }
ImageGL(const ImageGL& image) : Image(image) { }
__CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { } __CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { }
ImageGL& operator = (const ImageGL& rhs) ImageGL& operator = (const cl_mem& rhs)
{ {
if (this != &rhs) { Image::operator=(rhs);
Image::operator=(rhs);
}
return *this; return *this;
} }
ImageGL& operator = (const cl_mem& rhs) /*! \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=(rhs); 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; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
}; };
#endif // #if defined(CL_VERSION_1_2) #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,
cl_int * err = NULL)
{
cl_int error;
object_ = ::clCreateFromGLRenderbuffer(
context(),
flags,
bufobj,
&error);
detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
if (err != NULL) {
*err = error;
}
}
//! \brief Default constructor - initializes to NULL.
#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)
return *this;
}
/*! \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) {}
#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)
return *this;
}
#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);
}
};
/*! \brief Class interface for cl_sampler. /*! \brief Class interface for cl_sampler.
* *
* \note Copies of these objects are shallow, meaning that the copy will refer * \note Copies of these objects are shallow, meaning that the copy will refer
...@@ -4217,12 +4658,6 @@ public: ...@@ -4217,12 +4658,6 @@ public:
class Sampler : public detail::Wrapper<cl_sampler> class Sampler : public detail::Wrapper<cl_sampler>
{ {
public: public:
/*! \brief Destructor.
*
* This calls clReleaseSampler() on the value held by this instance.
*/
~Sampler() { }
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Sampler() { } Sampler() { }
...@@ -4251,42 +4686,53 @@ public: ...@@ -4251,42 +4686,53 @@ public:
} }
} }
/*! \brief Copy constructor - performs shallow copy.
*
* This calls clRetainSampler() on the parameter's cl_sampler.
*/
Sampler(const Sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
/*! \brief Constructor from cl_sampler - takes ownership. /*! \brief Constructor from cl_sampler - takes ownership.
* *
* This effectively transfers ownership of a refcount on the cl_sampler * This effectively transfers ownership of a refcount on the cl_sampler
* into the new Sampler object. * into the new Sampler object.
*/ */
Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { } __CL_EXPLICIT_CONSTRUCTORS Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
/*! \brief Assignment operator from Sampler. /*! \brief Assignment operator from cl_sampler - takes ownership.
* *
* This calls clRetainSampler() on the parameter and clReleaseSampler() * This effectively transfers ownership of a refcount on the rhs and calls
* on the previous value held by this instance. * clReleaseSampler() on the value previously held by this instance.
*/ */
Sampler& operator = (const Sampler& rhs) Sampler& operator = (const cl_sampler& rhs)
{ {
if (this != &rhs) { detail::Wrapper<cl_type>::operator=(rhs);
detail::Wrapper<cl_type>::operator=(rhs); return *this;
} }
/*! \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; return *this;
} }
/*! \brief Assignment operator from cl_sampler - takes ownership. #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
* /*! \brief Move constructor to forward move to the superclass correctly.
* This effectively transfers ownership of a refcount on the rhs and calls * Required for MSVC.
* clReleaseSampler() on the value previously held by this instance. */
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 = (const cl_sampler& rhs) Sampler& operator = (Sampler &&sam)
{ {
detail::Wrapper<cl_type>::operator=(rhs); detail::Wrapper<cl_type>::operator=(std::move(sam));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
//! \brief Wrapper for clGetSamplerInfo(). //! \brief Wrapper for clGetSamplerInfo().
template <typename T> template <typename T>
...@@ -4380,14 +4826,14 @@ template <typename T> ...@@ -4380,14 +4826,14 @@ template <typename T>
struct KernelArgumentHandler struct KernelArgumentHandler
{ {
static ::size_t size(const T&) { return sizeof(T); } static ::size_t size(const T&) { return sizeof(T); }
static T* ptr(T& value) { return &value; } static const T* ptr(const T& value) { return &value; }
}; };
template <> template <>
struct KernelArgumentHandler<LocalSpaceArg> struct KernelArgumentHandler<LocalSpaceArg>
{ {
static ::size_t size(const LocalSpaceArg& value) { return value.size_; } static ::size_t size(const LocalSpaceArg& value) { return value.size_; }
static void* ptr(LocalSpaceArg&) { return NULL; } static const void* ptr(const LocalSpaceArg&) { return NULL; }
}; };
} }
...@@ -4431,21 +4877,9 @@ class Kernel : public detail::Wrapper<cl_kernel> ...@@ -4431,21 +4877,9 @@ class Kernel : public detail::Wrapper<cl_kernel>
public: public:
inline Kernel(const Program& program, const char* name, cl_int* err = NULL); inline Kernel(const Program& program, const char* name, cl_int* err = NULL);
/*! \brief Destructor.
*
* This calls clReleaseKernel() on the value held by this instance.
*/
~Kernel() { }
//! \brief Default constructor - initializes to NULL. //! \brief Default constructor - initializes to NULL.
Kernel() { } Kernel() { }
/*! \brief Copy constructor - performs shallow copy.
*
* This calls clRetainKernel() on the parameter's cl_kernel.
*/
Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
/*! \brief Constructor from cl_kernel - takes ownership. /*! \brief Constructor from cl_kernel - takes ownership.
* *
* This effectively transfers ownership of a refcount on the cl_kernel * This effectively transfers ownership of a refcount on the cl_kernel
...@@ -4453,19 +4887,6 @@ public: ...@@ -4453,19 +4887,6 @@ public:
*/ */
__CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { } __CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
/*! \brief Assignment operator from Kernel.
*
* This calls clRetainKernel() on the parameter and clReleaseKernel()
* on the previous value held by this instance.
*/
Kernel& operator = (const Kernel& rhs)
{
if (this != &rhs) {
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this;
}
/*! \brief Assignment operator from cl_kernel - takes ownership. /*! \brief Assignment operator from cl_kernel - takes ownership.
* *
* This effectively transfers ownership of a refcount on the rhs and calls * This effectively transfers ownership of a refcount on the rhs and calls
...@@ -4477,6 +4898,36 @@ public: ...@@ -4477,6 +4898,36 @@ public:
return *this; return *this;
} }
/*! \brief Copy constructor to forward copy to the superclass correctly.
* Required for MSVC.
*/
Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) {}
/*! \brief Copy assignment to forward copy to the superclass correctly.
* Required for MSVC.
*/
Kernel& operator = (const Kernel &kernel)
{
detail::Wrapper<cl_type>::operator=(kernel);
return *this;
}
#if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
/*! \brief Move constructor to forward move to the superclass correctly.
* Required for MSVC.
*/
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)
{
detail::Wrapper<cl_type>::operator=(std::move(kernel));
return *this;
}
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
template <typename T> template <typename T>
cl_int getInfo(cl_kernel_info name, T* param) const cl_int getInfo(cl_kernel_info name, T* param) const
{ {
...@@ -4545,7 +4996,7 @@ public: ...@@ -4545,7 +4996,7 @@ public:
} }
template <typename T> template <typename T>
cl_int setArg(cl_uint index, T value) cl_int setArg(cl_uint index, const T &value)
{ {
return detail::errHandler( return detail::errHandler(
::clSetKernelArg( ::clSetKernelArg(
...@@ -4556,7 +5007,7 @@ public: ...@@ -4556,7 +5007,7 @@ public:
__SET_KERNEL_ARGS_ERR); __SET_KERNEL_ARGS_ERR);
} }
cl_int setArg(cl_uint index, ::size_t size, void* argPtr) cl_int setArg(cl_uint index, ::size_t size, const void* argPtr)
{ {
return detail::errHandler( return detail::errHandler(
::clSetKernelArg(object_, index, size, argPtr), ::clSetKernelArg(object_, index, size, argPtr),
...@@ -4575,41 +5026,7 @@ public: ...@@ -4575,41 +5026,7 @@ public:
Program( Program(
const STRING_CLASS& source, const STRING_CLASS& source,
cl_int* err = NULL) bool build = false,
{
cl_int error;
const char * strings = source.c_str();
const ::size_t length = source.size();
Context context = Context::getDefault(err);
object_ = ::clCreateProgramWithSource(
context(), (cl_uint)1, &strings, &length, &error);
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
if (error == CL_SUCCESS) {
error = ::clBuildProgram(
object_,
0,
NULL,
"",
NULL,
NULL);
detail::errHandler(error, __BUILD_PROGRAM_ERR);
}
if (err != NULL) {
*err = error;
}
}
Program(
const STRING_CLASS& source,
bool build,
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int error; cl_int error;
...@@ -4761,7 +5178,7 @@ public: ...@@ -4761,7 +5178,7 @@ public:
object_ = ::clCreateProgramWithBinary( object_ = ::clCreateProgramWithBinary(
context(), (cl_uint) devices.size(), context(), (cl_uint) devices.size(),
deviceIDs, deviceIDs,
lengths, images, binaryStatus != NULL lengths, images, (binaryStatus != NULL && numDevices > 0)
? &binaryStatus->front() ? &binaryStatus->front()
: NULL, &error); : NULL, &error);
...@@ -4808,23 +5225,43 @@ public: ...@@ -4808,23 +5225,43 @@ public:
Program() { } Program() { }
Program(const Program& program) : detail::Wrapper<cl_type>(program) { }
__CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { } __CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { }
Program& operator = (const Program& rhs) Program& operator = (const cl_program& rhs)
{ {
if (this != &rhs) { detail::Wrapper<cl_type>::operator=(rhs);
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this; return *this;
} }
Program& operator = (const cl_program& rhs) /*! \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)
{ {
detail::Wrapper<cl_type>::operator=(rhs); 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));
return *this; return *this;
} }
#endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
cl_int build( cl_int build(
const VECTOR_CLASS<Device>& devices, const VECTOR_CLASS<Device>& devices,
...@@ -4867,7 +5304,7 @@ public: ...@@ -4867,7 +5304,7 @@ public:
} }
#if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2)
cl_int compile( cl_int compile(
const char* options = NULL, const char* options = NULL,
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
void* data = NULL) const void* data = NULL) const
...@@ -4878,9 +5315,9 @@ public: ...@@ -4878,9 +5315,9 @@ public:
0, 0,
NULL, NULL,
options, options,
0, 0,
NULL, NULL,
NULL, NULL,
notifyFptr, notifyFptr,
data), data),
__COMPILE_PROGRAM_ERR); __COMPILE_PROGRAM_ERR);
...@@ -4960,11 +5397,14 @@ inline Program linkProgram( ...@@ -4960,11 +5397,14 @@ inline Program linkProgram(
void* data = NULL, void* data = NULL,
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int err_local = CL_SUCCESS; cl_int error_local = CL_SUCCESS;
cl_program programs[2] = { input1(), input2() }; cl_program programs[2] = { input1(), input2() };
Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>(); Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>(&error_local);
if(error_local!=CL_SUCCESS) {
detail::errHandler(error_local, __LINK_PROGRAM_ERR);
}
cl_program prog = ::clLinkProgram( cl_program prog = ::clLinkProgram(
ctx(), ctx(),
...@@ -4975,11 +5415,11 @@ inline Program linkProgram( ...@@ -4975,11 +5415,11 @@ inline Program linkProgram(
programs, programs,
notifyFptr, notifyFptr,
data, data,
&err_local); &error_local);
detail::errHandler(err_local,__COMPILE_PROGRAM_ERR); detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
if (err != NULL) { if (err != NULL) {
*err = err_local; *err = error_local;
} }
return Program(prog); return Program(prog);
...@@ -4992,7 +5432,7 @@ inline Program linkProgram( ...@@ -4992,7 +5432,7 @@ inline Program linkProgram(
void* data = NULL, void* data = NULL,
cl_int* err = NULL) cl_int* err = NULL)
{ {
cl_int err_local = CL_SUCCESS; cl_int error_local = CL_SUCCESS;
cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program)); cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));
...@@ -5002,8 +5442,15 @@ inline Program linkProgram( ...@@ -5002,8 +5442,15 @@ inline Program linkProgram(
} }
} }
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);
}
}
cl_program prog = ::clLinkProgram( cl_program prog = ::clLinkProgram(
Context::getDefault()(), ctx(),
0, 0,
NULL, NULL,
options, options,
...@@ -5011,11 +5458,11 @@ inline Program linkProgram( ...@@ -5011,11 +5458,11 @@ inline Program linkProgram(
programs, programs,
notifyFptr, notifyFptr,
data, data,
&err_local); &error_local);
detail::errHandler(err_local,__COMPILE_PROGRAM_ERR); detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
if (err != NULL) { if (err != NULL) {
*err = err_local; *err = error_local;
} }
return Program(prog); return Program(prog);
...@@ -5061,7 +5508,11 @@ inline Kernel::Kernel(const Program& program, const char* name, cl_int* err) ...@@ -5061,7 +5508,11 @@ inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
class CommandQueue : public detail::Wrapper<cl_command_queue> class CommandQueue : public detail::Wrapper<cl_command_queue>
{ {
private: private:
#ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
static std::atomic<int> default_initialized_;
#else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
static volatile int default_initialized_; static volatile int default_initialized_;
#endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
static CommandQueue default_; static CommandQueue default_;
static volatile cl_int default_error_; static volatile cl_int default_error_;
public: public:
...@@ -5072,7 +5523,7 @@ public: ...@@ -5072,7 +5523,7 @@ public:
cl_int error; cl_int error;
Context context = Context::getDefault(&error); Context context = Context::getDefault(&error);
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); detail::errHandler(error, __CREATE_CONTEXT_ERR);
if (error != CL_SUCCESS) { if (error != CL_SUCCESS) {
if (err != NULL) { if (err != NULL) {
...@@ -5091,6 +5542,37 @@ public: ...@@ -5091,6 +5542,37 @@ public:
} }
} }
} }
/*!
* \brief Constructs a CommandQueue for an implementation defined device in the given context
*/
explicit CommandQueue(
const Context& context,
cl_command_queue_properties properties = 0,
cl_int* err = NULL)
{
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)
{
if (err != NULL) {
*err = error;
}
return;
}
object_ = ::clCreateCommandQueue(context(), devices[0](), properties, &error);
detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
if (err != NULL) {
*err = error;
}
}
CommandQueue( CommandQueue(
const Context& context, const Context& context,
...@@ -5108,6 +5590,36 @@ public: ...@@ -5108,6 +5590,36 @@ public:
} }
} }
/*! \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)
static CommandQueue getDefault(cl_int * err = NULL) static CommandQueue getDefault(cl_int * err = NULL)
{ {
int state = detail::compare_exchange( int state = detail::compare_exchange(
...@@ -5171,17 +5683,7 @@ public: ...@@ -5171,17 +5683,7 @@ public:
CommandQueue() { } CommandQueue() { }
CommandQueue(const CommandQueue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { } __CL_EXPLICIT_CONSTRUCTORS CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
CommandQueue& operator = (const CommandQueue& rhs)
{
if (this != &rhs) {
detail::Wrapper<cl_type>::operator=(rhs);
}
return *this;
}
CommandQueue& operator = (const cl_command_queue& rhs) CommandQueue& operator = (const cl_command_queue& rhs)
{ {
...@@ -5284,6 +5786,7 @@ public: ...@@ -5284,6 +5786,7 @@ public:
return err; return err;
} }
#if defined(CL_VERSION_1_1)
cl_int enqueueReadBufferRect( cl_int enqueueReadBufferRect(
const Buffer& buffer, const Buffer& buffer,
...@@ -5334,7 +5837,7 @@ public: ...@@ -5334,7 +5837,7 @@ public:
::size_t buffer_slice_pitch, ::size_t buffer_slice_pitch,
::size_t host_row_pitch, ::size_t host_row_pitch,
::size_t host_slice_pitch, ::size_t host_slice_pitch,
void *ptr, const void *ptr,
const VECTOR_CLASS<Event>* events = NULL, const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) const Event* event = NULL) const
{ {
...@@ -5399,6 +5902,7 @@ public: ...@@ -5399,6 +5902,7 @@ public:
return err; return err;
} }
#endif //if defined(CL_VERSION_1_1)
#if defined(CL_VERSION_1_2) #if defined(CL_VERSION_1_2)
/** /**
...@@ -5471,7 +5975,7 @@ public: ...@@ -5471,7 +5975,7 @@ public:
const size_t<3>& region, const size_t<3>& region,
::size_t row_pitch, ::size_t row_pitch,
::size_t slice_pitch, ::size_t slice_pitch,
void* ptr, const void* ptr,
const VECTOR_CLASS<Event>* events = NULL, const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) const Event* event = NULL) const
{ {
...@@ -5680,18 +6184,22 @@ public: ...@@ -5680,18 +6184,22 @@ public:
Event* event = NULL, Event* event = NULL,
cl_int* err = NULL) const cl_int* err = NULL) const
{ {
cl_event tmp;
cl_int error; cl_int error;
void * result = ::clEnqueueMapBuffer( void * result = ::clEnqueueMapBuffer(
object_, buffer(), blocking, flags, offset, size, object_, buffer(), blocking, flags, offset, size,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(cl_event*) event, (event != NULL) ? &tmp : NULL,
&error); &error);
detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
if (err != NULL) { if (err != NULL) {
*err = error; *err = error;
} }
if (event != NULL && error == CL_SUCCESS)
*event = tmp;
return result; return result;
} }
...@@ -5707,6 +6215,7 @@ public: ...@@ -5707,6 +6215,7 @@ public:
Event* event = NULL, Event* event = NULL,
cl_int* err = NULL) const cl_int* err = NULL) const
{ {
cl_event tmp;
cl_int error; cl_int error;
void * result = ::clEnqueueMapImage( void * result = ::clEnqueueMapImage(
object_, buffer(), blocking, flags, object_, buffer(), blocking, flags,
...@@ -5714,13 +6223,15 @@ public: ...@@ -5714,13 +6223,15 @@ public:
row_pitch, slice_pitch, row_pitch, slice_pitch,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(cl_event*) event, (event != NULL) ? &tmp : NULL,
&error); &error);
detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR); detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);
if (err != NULL) { if (err != NULL) {
*err = error; *err = error;
} }
if (event != NULL && error == CL_SUCCESS)
*event = tmp;
return result; return result;
} }
...@@ -5759,7 +6270,7 @@ public: ...@@ -5759,7 +6270,7 @@ public:
*/ */
cl_int enqueueMarkerWithWaitList( cl_int enqueueMarkerWithWaitList(
const VECTOR_CLASS<Event> *events = 0, const VECTOR_CLASS<Event> *events = 0,
Event *event = 0) Event *event = 0) const
{ {
cl_event tmp; cl_event tmp;
cl_int err = detail::errHandler( cl_int err = detail::errHandler(
...@@ -5789,7 +6300,7 @@ public: ...@@ -5789,7 +6300,7 @@ public:
*/ */
cl_int enqueueBarrierWithWaitList( cl_int enqueueBarrierWithWaitList(
const VECTOR_CLASS<Event> *events = 0, const VECTOR_CLASS<Event> *events = 0,
Event *event = 0) Event *event = 0) const
{ {
cl_event tmp; cl_event tmp;
cl_int err = detail::errHandler( cl_int err = detail::errHandler(
...@@ -5815,7 +6326,7 @@ public: ...@@ -5815,7 +6326,7 @@ public:
cl_mem_migration_flags flags, cl_mem_migration_flags flags,
const VECTOR_CLASS<Event>* events = NULL, const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL Event* event = NULL
) ) const
{ {
cl_event tmp; cl_event tmp;
...@@ -5913,7 +6424,7 @@ public: ...@@ -5913,7 +6424,7 @@ public:
object_, userFptr, args.first, args.second, object_, userFptr, args.first, args.second,
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
mems, mems,
(mem_locs != NULL) ? (const void **) &mem_locs->front() : NULL, (mem_locs != NULL && mem_locs->size() > 0) ? (const void **) &mem_locs->front() : NULL,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL), (event != NULL) ? &tmp : NULL),
...@@ -5932,9 +6443,17 @@ public: ...@@ -5932,9 +6443,17 @@ public:
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
{ {
return detail::errHandler( cl_event tmp;
::clEnqueueMarker(object_, (cl_event*) event), cl_int err = detail::errHandler(
::clEnqueueMarker(
object_,
(event != NULL) ? &tmp : NULL),
__ENQUEUE_MARKER_ERR); __ENQUEUE_MARKER_ERR);
if (event != NULL && err == CL_SUCCESS)
*event = tmp;
return err;
} }
CL_EXT_PREFIX__VERSION_1_1_DEPRECATED CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
...@@ -5944,7 +6463,7 @@ public: ...@@ -5944,7 +6463,7 @@ public:
::clEnqueueWaitForEvents( ::clEnqueueWaitForEvents(
object_, object_,
(cl_uint) events.size(), (cl_uint) events.size(),
(const cl_event*) &events.front()), events.size() > 0 ? (const cl_event*) &events.front() : NULL),
__ENQUEUE_WAIT_FOR_EVENTS_ERR); __ENQUEUE_WAIT_FOR_EVENTS_ERR);
} }
#endif // #if defined(CL_VERSION_1_1) #endif // #if defined(CL_VERSION_1_1)
...@@ -5959,7 +6478,7 @@ public: ...@@ -5959,7 +6478,7 @@ public:
::clEnqueueAcquireGLObjects( ::clEnqueueAcquireGLObjects(
object_, object_,
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL), (event != NULL) ? &tmp : NULL),
...@@ -5981,7 +6500,7 @@ public: ...@@ -5981,7 +6500,7 @@ public:
::clEnqueueReleaseGLObjects( ::clEnqueueReleaseGLObjects(
object_, object_,
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL), (event != NULL) ? &tmp : NULL),
...@@ -6024,7 +6543,7 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( ...@@ -6024,7 +6543,7 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
pfn_clEnqueueAcquireD3D10ObjectsKHR( pfn_clEnqueueAcquireD3D10ObjectsKHR(
object_, object_,
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL) ? (cl_event*) &events->front() : NULL, (events != NULL) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL), (event != NULL) ? &tmp : NULL),
...@@ -6057,9 +6576,9 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( ...@@ -6057,9 +6576,9 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
pfn_clEnqueueReleaseD3D10ObjectsKHR( pfn_clEnqueueReleaseD3D10ObjectsKHR(
object_, object_,
(mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
(mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
(events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL) ? (cl_event*) &events->front() : NULL, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL), (event != NULL) ? &tmp : NULL),
__ENQUEUE_RELEASE_GL_ERR); __ENQUEUE_RELEASE_GL_ERR);
...@@ -6094,15 +6613,113 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( ...@@ -6094,15 +6613,113 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
} }
}; };
#ifdef _WIN32 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
__declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED; CL_WEAK_ATTRIB_PREFIX std::atomic<int> CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_initialized_;
__declspec(selectany) CommandQueue CommandQueue::default_; #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
__declspec(selectany) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS; CL_WEAK_ATTRIB_PREFIX volatile int CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
#else #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
__attribute__((weak)) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
__attribute__((weak)) CommandQueue CommandQueue::default_; CL_WEAK_ATTRIB_PREFIX CommandQueue CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_;
__attribute__((weak)) volatile cl_int CommandQueue::default_error_ = CL_SUCCESS; CL_WEAK_ATTRIB_PREFIX volatile cl_int CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_error_ = CL_SUCCESS;
#endif
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 {
object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
}
detail::errHandler(error, __CREATE_BUFFER_ERR);
if (err != NULL) {
*err = error;
}
if( !useHostPtr ) {
CommandQueue queue(context, 0, &error);
detail::errHandler(error, __CREATE_BUFFER_ERR);
if (err != NULL) {
*err = error;
}
error = cl::copy(queue, startIterator, endIterator, *this);
detail::errHandler(error, __CREATE_BUFFER_ERR);
if (err != NULL) {
*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 {
object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
}
detail::errHandler(error, __CREATE_BUFFER_ERR);
if (err != NULL) {
*err = error;
}
if (!useHostPtr) {
error = cl::copy(queue, startIterator, endIterator, *this);
detail::errHandler(error, __CREATE_BUFFER_ERR);
if (err != NULL) {
*err = error;
}
}
}
inline cl_int enqueueReadBuffer( inline cl_int enqueueReadBuffer(
const Buffer& buffer, const Buffer& buffer,
...@@ -6222,9 +6839,43 @@ inline cl_int enqueueCopyBuffer( ...@@ -6222,9 +6839,43 @@ inline cl_int enqueueCopyBuffer(
/** /**
* Blocking copy operation between iterators and a buffer. * Blocking copy operation between iterators and a buffer.
* Host to Device.
* Uses default command queue.
*/ */
template< typename IteratorType > template< typename IteratorType >
inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer ) inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
{
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 )
{ {
typedef typename std::iterator_traits<IteratorType>::value_type DataType; typedef typename std::iterator_traits<IteratorType>::value_type DataType;
cl_int error; cl_int error;
...@@ -6233,7 +6884,7 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu ...@@ -6233,7 +6884,7 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu
::size_t byteLength = length*sizeof(DataType); ::size_t byteLength = length*sizeof(DataType);
DataType *pointer = DataType *pointer =
static_cast<DataType*>(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error)); static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));
// if exceptions enabled, enqueueMapBuffer will throw // if exceptions enabled, enqueueMapBuffer will throw
if( error != CL_SUCCESS ) { if( error != CL_SUCCESS ) {
return error; return error;
...@@ -6248,7 +6899,7 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu ...@@ -6248,7 +6899,7 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu
std::copy(startIterator, endIterator, pointer); std::copy(startIterator, endIterator, pointer);
#endif #endif
Event endEvent; Event endEvent;
error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent); error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
// if exceptions enabled, enqueueUnmapMemObject will throw // if exceptions enabled, enqueueUnmapMemObject will throw
if( error != CL_SUCCESS ) { if( error != CL_SUCCESS ) {
return error; return error;
...@@ -6259,9 +6910,11 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu ...@@ -6259,9 +6910,11 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu
/** /**
* Blocking copy operation between iterators and a buffer. * Blocking copy operation between iterators and a buffer.
* Device to Host.
* Uses specified queue.
*/ */
template< typename IteratorType > template< typename IteratorType >
inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator ) inline cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
{ {
typedef typename std::iterator_traits<IteratorType>::value_type DataType; typedef typename std::iterator_traits<IteratorType>::value_type DataType;
cl_int error; cl_int error;
...@@ -6270,14 +6923,14 @@ inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, Iterat ...@@ -6270,14 +6923,14 @@ inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, Iterat
::size_t byteLength = length*sizeof(DataType); ::size_t byteLength = length*sizeof(DataType);
DataType *pointer = DataType *pointer =
static_cast<DataType*>(enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error)); static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));
// if exceptions enabled, enqueueMapBuffer will throw // if exceptions enabled, enqueueMapBuffer will throw
if( error != CL_SUCCESS ) { if( error != CL_SUCCESS ) {
return error; return error;
} }
std::copy(pointer, pointer + length, startIterator); std::copy(pointer, pointer + length, startIterator);
Event endEvent; Event endEvent;
error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent); error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
// if exceptions enabled, enqueueUnmapMemObject will throw // if exceptions enabled, enqueueUnmapMemObject will throw
if( error != CL_SUCCESS ) { if( error != CL_SUCCESS ) {
return error; return error;
...@@ -6333,7 +6986,7 @@ inline cl_int enqueueWriteBufferRect( ...@@ -6333,7 +6986,7 @@ inline cl_int enqueueWriteBufferRect(
::size_t buffer_slice_pitch, ::size_t buffer_slice_pitch,
::size_t host_row_pitch, ::size_t host_row_pitch,
::size_t host_slice_pitch, ::size_t host_slice_pitch,
void *ptr, const void *ptr,
const VECTOR_CLASS<Event>* events = NULL, const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) Event* event = NULL)
{ {
...@@ -6431,7 +7084,7 @@ inline cl_int enqueueWriteImage( ...@@ -6431,7 +7084,7 @@ inline cl_int enqueueWriteImage(
const size_t<3>& region, const size_t<3>& region,
::size_t row_pitch, ::size_t row_pitch,
::size_t slice_pitch, ::size_t slice_pitch,
void* ptr, const void* ptr,
const VECTOR_CLASS<Event>* events = NULL, const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) Event* event = NULL)
{ {
...@@ -12162,8 +12815,8 @@ struct make_kernel : ...@@ -12162,8 +12815,8 @@ struct make_kernel :
> >
{ {
public: public:
typedef detail::KernelFunctorGlobal< typedef detail::KernelFunctorGlobal<
T0, T1, T2, T3, T0, T1, T2, T3,
T4, T5, T6, T7, T4, T5, T6, T7,
T8, T9, T10, T11, T8, T9, T10, T11,
T12, T13, T14, T15, T12, T13, T14, T15,
...@@ -12297,11 +12950,9 @@ public: ...@@ -12297,11 +12950,9 @@ public:
#undef __DEFAULT_BEING_INITIALIZED #undef __DEFAULT_BEING_INITIALIZED
#undef __DEFAULT_INITIALIZED #undef __DEFAULT_INITIALIZED
} // namespace cl #undef CL_HPP_RVALUE_REFERENCES_SUPPORTED
#undef CL_HPP_NOEXCEPT
#ifdef _WIN32
#pragma pop_macro("max")
#endif // _WIN32
#endif // CL_HPP_ } // namespace cl
#endif // CL_HPP_
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment