[Beignet] [PATCH] [opencl-1.2] Sync the OpenCL standard header file with the new version

Zhigang Gong zhigang.gong at linux.intel.com
Mon Apr 28 21:51:55 PDT 2014


LGTM, will push latter, thanks.

On Thu, Apr 24, 2014 at 02:51:17PM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  include/CL/cl.h                   |   4 +-
>  include/CL/cl.hpp                 | 897 ++++++++++++++++++++++++--------------
>  include/CL/cl_d3d10.h             |  16 +-
>  include/CL/cl_d3d11.h             |  16 +-
>  include/CL/cl_d3d9.h              |  98 -----
>  include/CL/cl_dx9_media_sharing.h |  16 +-
>  include/CL/cl_egl.h               | 133 ++++++
>  include/CL/cl_ext.h               |  75 +++-
>  include/CL/cl_gl.h                |   3 +-
>  include/CL/cl_platform.h          | 346 ++++++++-------
>  10 files changed, 979 insertions(+), 625 deletions(-)
>  delete mode 100644 include/CL/cl_d3d9.h
>  create mode 100644 include/CL/cl_egl.h
> 
> diff --git a/include/CL/cl.h b/include/CL/cl.h
> index 203c659..316565d 100644
> --- a/include/CL/cl.h
> +++ b/include/CL/cl.h
> @@ -345,7 +345,7 @@ typedef struct _cl_buffer_region {
>  #define CL_MEM_USE_HOST_PTR                         (1 << 3)
>  #define CL_MEM_ALLOC_HOST_PTR                       (1 << 4)
>  #define CL_MEM_COPY_HOST_PTR                        (1 << 5)
> -// reserved                                         (1 << 6)    
> +/* reserved                                         (1 << 6)    */
>  #define CL_MEM_HOST_WRITE_ONLY                      (1 << 7)
>  #define CL_MEM_HOST_READ_ONLY                       (1 << 8)
>  #define CL_MEM_HOST_NO_ACCESS                       (1 << 9)
> @@ -1165,7 +1165,7 @@ clGetExtensionFunctionAddressForPlatform(cl_platform_id /* platform */,
>                                           const char *   /* func_name */) CL_API_SUFFIX__VERSION_1_2;
>      
>  
> -// Deprecated OpenCL 1.1 APIs
> +/* Deprecated OpenCL 1.1 APIs */
>  extern CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL
>  clCreateImage2D(cl_context              /* context */,
>                  cl_mem_flags            /* flags */,
> diff --git a/include/CL/cl.hpp b/include/CL/cl.hpp
> index 06448e2..38fac19 100644
> --- a/include/CL/cl.hpp
> +++ b/include/CL/cl.hpp
> @@ -1,5 +1,5 @@
>  /*******************************************************************************
> - * Copyright (c) 2008-2012 The Khronos Group Inc.
> + * Copyright (c) 2008-2013 The Khronos Group Inc.
>   *
>   * Permission is hereby granted, free of charge, to any person obtaining a
>   * copy of this software and/or associated documentation files (the
> @@ -30,9 +30,11 @@
>   *   Additions and fixes from:
>   *       Brian Cole, March 3rd 2010 and April 2012 
>   *       Matt Gruenke, April 2012.
> + *       Bruce Merry, February 2013.
> + *       Tom Deakin and Simon McIntosh-Smith, July 2013
>   *   
> - *   \version 1.2.4
> - *   \date January 2013
> + *   \version 1.2.6
> + *   \date August 2013
>   *
>   *   Optional extension support
>   *
> @@ -58,8 +60,8 @@
>   *
>   * For detail documentation on the bindings see:
>   *
> - * The OpenCL C++ Wrapper API 1.1 (revision 04)
> - *  http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.1.pdf
> + * The OpenCL C++ Wrapper API 1.2 (revision 09)
> + *  http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf
>   *
>   * \section example Example
>   *
> @@ -256,6 +258,7 @@ class Device;
>  class Context;
>  class CommandQueue;
>  class Memory;
> +class Buffer;
>  
>  #if defined(__CL_ENABLE_EXCEPTIONS)
>  /*! \brief Exception class 
> @@ -1077,145 +1080,154 @@ public:
>  
>  namespace detail {
>  
> -// GetInfo help struct
> -template <typename Functor, typename T>
> -struct GetInfoHelper
> +// Generic getInfoHelper. The final parameter is used to guide overload
> +// resolution: the actual parameter passed is an int, which makes this
> +// a worse conversion sequence than a specialization that declares the
> +// parameter as an int.
> +template<typename Functor, typename T>
> +inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)
>  {
> -    static cl_int
> -    get(Functor f, cl_uint name, T* param)
> -    {
> -        return f(name, sizeof(T), param, NULL);
> -    }
> -};
> +    return f(name, sizeof(T), param, NULL);
> +}
>  
> -// Specialized GetInfoHelper for VECTOR_CLASS params
> +// Specialized getInfoHelper for VECTOR_CLASS params
>  template <typename Func, typename T>
> -struct GetInfoHelper<Func, VECTOR_CLASS<T> >
> +inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, long)
>  {
> -    static cl_int get(Func f, cl_uint name, VECTOR_CLASS<T>* param)
> -    {
> -        ::size_t required;
> -        cl_int err = f(name, 0, NULL, &required);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> -
> -        T* value = (T*) alloca(required);
> -        err = f(name, required, value, NULL);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> +    ::size_t required;
> +    cl_int err = f(name, 0, NULL, &required);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
>  
> -        param->assign(&value[0], &value[required/sizeof(T)]);
> -        return CL_SUCCESS;
> +    T* value = (T*) alloca(required);
> +    err = f(name, required, value, NULL);
> +    if (err != CL_SUCCESS) {
> +        return err;
>      }
> -};
>  
> -template <typename Func>
> -struct GetInfoHelper<Func, VECTOR_CLASS<cl::Device> >
> +    param->assign(&value[0], &value[required/sizeof(T)]);
> +    return CL_SUCCESS;
> +}
> +
> +/* Specialization for reference-counted types. This depends on the
> + * existence of Wrapper<T>::cl_type, and none of the other types having the
> + * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
> + * does not work, because when using a derived type (e.g. Context) the generic
> + * template will provide a better match.
> + */
> +template <typename Func, typename T>
> +inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, int, typename T::cl_type = 0)
>  {
> -    static cl_int get(Func f, cl_uint name, VECTOR_CLASS<cl::Device>* param)
> -    {
> -        ::size_t required;
> -        cl_int err = f(name, 0, NULL, &required);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> +    ::size_t required;
> +    cl_int err = f(name, 0, NULL, &required);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
>  
> -        cl_device_id* value = (cl_device_id*) alloca(required);
> -        err = f(name, required, value, NULL);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> +    typename T::cl_type * value = (typename T::cl_type *) alloca(required);
> +    err = f(name, required, value, NULL);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
>  
> -        param->assign(&value[0], &value[required/sizeof(cl_device_id)]);
> -        return CL_SUCCESS;
> +    ::size_t elements = required / sizeof(typename T::cl_type);
> +    param->assign(&value[0], &value[elements]);
> +    for (::size_t i = 0; i < elements; i++)
> +    {
> +        if (value[i] != NULL)
> +        {
> +            err = (*param)[i].retain();
> +            if (err != CL_SUCCESS) {
> +                return err;
> +            }
> +        }
>      }
> -};
> +    return CL_SUCCESS;
> +}
>  
>  // Specialized for getInfo<CL_PROGRAM_BINARIES>
>  template <typename Func>
> -struct GetInfoHelper<Func, VECTOR_CLASS<char *> >
> +inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, int)
>  {
> -    static cl_int
> -    get(Func f, cl_uint name, VECTOR_CLASS<char *>* param)
> -    {
> -      cl_uint err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);
> +    cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);
>  
> -      if (err != CL_SUCCESS) {
> +    if (err != CL_SUCCESS) {
>          return err;
> -      }
> -
> -      return CL_SUCCESS;
>      }
> -};
> +
> +    return CL_SUCCESS;
> +}
>  
>  // Specialized GetInfoHelper for STRING_CLASS params
>  template <typename Func>
> -struct GetInfoHelper<Func, STRING_CLASS>
> +inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
>  {
> -    static cl_int get(Func f, cl_uint name, STRING_CLASS* param)
> -    {
> -        ::size_t required;
> -        cl_int err = f(name, 0, NULL, &required);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> -
> -        char* value = (char*) alloca(required);
> -        err = f(name, required, value, NULL);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> +    ::size_t required;
> +    cl_int err = f(name, 0, NULL, &required);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
>  
> -        *param = value;
> -        return CL_SUCCESS;
> +    char* value = (char*) alloca(required);
> +    err = f(name, required, value, NULL);
> +    if (err != CL_SUCCESS) {
> +        return err;
>      }
> -};
> +
> +    *param = value;
> +    return CL_SUCCESS;
> +}
>  
>  // Specialized GetInfoHelper for cl::size_t params
>  template <typename Func, ::size_t N>
> -struct GetInfoHelper<Func, size_t<N> >
> +inline cl_int getInfoHelper(Func f, cl_uint name, size_t<N>* param, long)
>  {
> -    static cl_int get(Func f, cl_uint name, size_t<N>* param)
> -    {
> -        ::size_t required;
> -        cl_int err = f(name, 0, NULL, &required);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> +    ::size_t required;
> +    cl_int err = f(name, 0, NULL, &required);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
>  
> -        ::size_t* value = (::size_t*) alloca(required);
> -        err = f(name, required, value, NULL);
> -        if (err != CL_SUCCESS) {
> -            return err;
> -        }
> +    ::size_t* value = (::size_t*) alloca(required);
> +    err = f(name, required, value, NULL);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
>  
> -        for(int i = 0; i < N; ++i) {
> -            (*param)[i] = value[i];
> -        }
> - 
> -        return CL_SUCCESS;
> +    for(int i = 0; i < N; ++i) {
> +        (*param)[i] = value[i];
>      }
> -};
>  
> -#define __GET_INFO_HELPER_WITH_RETAIN(CPP_TYPE) \
> -namespace detail { \
> -template <typename Func> \
> -struct GetInfoHelper<Func, CPP_TYPE> \
> -{ \
> -    static cl_int get(Func f, cl_uint name, CPP_TYPE* param) \
> -    { \
> -      cl_uint err = f(name, sizeof(CPP_TYPE), param, NULL); \
> -      if (err != CL_SUCCESS) { \
> -        return err; \
> -      } \
> -      \
> -      return ReferenceHandler<CPP_TYPE::cl_type>::retain((*param)()); \
> -    } \
> -}; \
> -} 
> +    return CL_SUCCESS;
> +}
> +
> +template<typename T> struct ReferenceHandler;
>  
> +/* Specialization for reference-counted types. This depends on the
> + * existence of Wrapper<T>::cl_type, and none of the other types having the
> + * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
> + * does not work, because when using a derived type (e.g. Context) the generic
> + * template will provide a better match.
> + */
> +template<typename Func, typename T>
> +inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)
> +{
> +    typename T::cl_type value;
> +    cl_int err = f(name, sizeof(value), &value, NULL);
> +    if (err != CL_SUCCESS) {
> +        return err;
> +    }
> +    *param = value;
> +    if (value != NULL)
> +    {
> +        err = param->retain();
> +        if (err != CL_SUCCESS) {
> +            return err;
> +        }
> +    }
> +    return CL_SUCCESS;
> +}
>  
>  #define __PARAM_NAME_INFO_1_0(F) \
>      F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \
> @@ -1366,6 +1378,8 @@ struct GetInfoHelper<Func, CPP_TYPE> \
>      
>  #if defined(CL_VERSION_1_2)
>  #define __PARAM_NAME_INFO_1_2(F) \
> +    F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \
> +    \
>      F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \
>      F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \
>      \
> @@ -1487,7 +1501,7 @@ template <typename Func, typename T>
>  inline cl_int
>  getInfo(Func f, cl_uint name, T* param)
>  {
> -    return GetInfoHelper<Func, T>::get(f, name, param);
> +    return getInfoHelper(f, name, param, 0);
>  }
>  
>  template <typename Func, typename Arg0>
> @@ -1513,8 +1527,7 @@ inline cl_int
>  getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)
>  {
>      GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };
> -    return GetInfoHelper<GetInfoFunctor0<Func, Arg0>, T>
> -        ::get(f0, name, param);
> +    return getInfoHelper(f0, name, param, 0);
>  }
>  
>  template <typename Func, typename Arg0, typename Arg1, typename T>
> @@ -1522,8 +1535,7 @@ inline cl_int
>  getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)
>  {
>      GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };
> -    return GetInfoHelper<GetInfoFunctor1<Func, Arg0, Arg1>, T>
> -        ::get(f0, name, param);
> +    return getInfoHelper(f0, name, param, 0);
>  }
>  
>  template<typename T>
> @@ -1650,6 +1662,58 @@ struct ReferenceHandler<cl_event>
>      { return ::clReleaseEvent(event); }
>  };
>  
> +
> +// Extracts version number with major in the upper 16 bits, minor in the lower 16
> +static cl_uint getVersion(const char *versionInfo)
> +{
> +    int highVersion = 0;
> +    int lowVersion = 0;
> +    int index = 7;
> +    while(versionInfo[index] != '.' ) {
> +        highVersion *= 10;
> +        highVersion += versionInfo[index]-'0';
> +        ++index;
> +    }
> +    ++index;
> +    while(versionInfo[index] != ' ' ) {
> +        lowVersion *= 10;
> +        lowVersion += versionInfo[index]-'0';
> +        ++index;
> +    }
> +    return (highVersion << 16) | lowVersion;
> +}
> +
> +static cl_uint getPlatformVersion(cl_platform_id platform)
> +{
> +    ::size_t size = 0;
> +    clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);
> +    char *versionInfo = (char *) alloca(size);
> +    clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size);
> +    return getVersion(versionInfo);
> +}
> +
> +static cl_uint getDevicePlatformVersion(cl_device_id device)
> +{
> +    cl_platform_id platform;
> +    clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);
> +    return getPlatformVersion(platform);
> +}
> +
> +#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
> +static cl_uint getContextPlatformVersion(cl_context context)
> +{
> +    // The platform cannot be queried directly, so we first have to grab a
> +    // device and obtain its context
> +    ::size_t size = 0;
> +    clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);
> +    if (size == 0)
> +        return 0;
> +    cl_device_id *devices = (cl_device_id *) alloca(size);
> +    clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL);
> +    return getDevicePlatformVersion(devices[0]);
> +}
> +#endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
> +
>  template <typename T>
>  class Wrapper
>  {
> @@ -1695,6 +1759,8 @@ public:
>      cl_type& operator ()() { return object_; }
>  
>  protected:
> +    template<typename Func, typename U>
> +    friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
>  
>      cl_int retain() const
>      {
> @@ -1717,37 +1783,14 @@ protected:
>      cl_type object_;
>      bool referenceCountable_;
>  
> -    static int getVersion(cl_device_id device)
> -    {
> -        ::size_t size = 0;
> -        clGetDeviceInfo(device, CL_DEVICE_VERSION, 0, 0, &size);
> -        STRING_CLASS versionInfo;
> -        versionInfo.resize(size + 1);
> -        clGetDeviceInfo(device, CL_DEVICE_VERSION, size, &versionInfo[0],
> -&size);
> -        int highVersion = 0;
> -        int lowVersion = 0;
> -        int index = 7;
> -        while(versionInfo[index] != '.' ) {
> -            highVersion *= 10;
> -            highVersion += versionInfo[index]-'0';
> -            ++index;
> -        }
> -        ++index;
> -        while(versionInfo[index] != ' ' ) {
> -            lowVersion *= 10;
> -            lowVersion += versionInfo[index]-'0';
> -            ++index;
> -        }
> -        return (highVersion << 16) | lowVersion;
> -    }
> -
>      static bool isReferenceCountable(cl_device_id device)
>      {
>          bool retVal = false;
> -        int version = getVersion(device);
> -        if(version > ((1 << 16) + 1)) {
> -            retVal = true;
> +        if (device != NULL) {
> +            int version = getDevicePlatformVersion(device);
> +            if(version > ((1 << 16) + 1)) {
> +                retVal = true;
> +            }
>          }
>          return retVal;
>      }
> @@ -1796,6 +1839,11 @@ public:
>      cl_type& operator ()() { return object_; }
>  
>  protected:
> +    template<typename Func, typename U>
> +    friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
> +
> +    template<typename Func, typename U>
> +    friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS<U>*, int, typename U::cl_type);
>  
>      cl_int retain() const
>      {
> @@ -2369,7 +2417,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().
>       */
> @@ -2387,17 +2435,61 @@ public:
>          cl_int error;
>  
>  #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) {
> -            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) {
>                  detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
>                  if (err != NULL) {
>                      *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];
>          }
>  #endif
> @@ -2598,8 +2690,6 @@ __attribute__((weak)) Context Context::default_;
>  __attribute__((weak)) volatile cl_int Context::default_error_ = CL_SUCCESS;
>  #endif
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::Context)
> -
>  /*! \brief Class interface for cl_event.
>   *
>   *  \note Copies of these objects are shallow, meaning that the copy will refer
> @@ -2748,8 +2838,6 @@ public:
>      }
>  };
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::Event)
> -
>  #if defined(CL_VERSION_1_1)
>  /*! \brief Class interface for user events (a subset of cl_event's).
>   * 
> @@ -2906,7 +2994,7 @@ public:
>       *  Wraps clSetMemObjectDestructorCallback().
>       *
>       *  Repeated calls to this function, for a given cl_mem value, will append
> -     *  to the list of functions called (in reverse order) when memory object?s
> +     *  to the list of functions called (in reverse order) when memory object's
>       *  resources are freed and the memory object is deleted.
>       *
>       *  \note
> @@ -2928,14 +3016,17 @@ public:
>  
>  };
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::Memory)
> -
>  // Pre-declare copy functions
>  class Buffer;
>  template< typename IteratorType >
>  cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
>  template< typename IteratorType >
> -cl_int copy( 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.
>   * 
> @@ -2999,7 +3090,8 @@ public:
>  
>      /*!
>       * \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 >
>      Buffer(
> @@ -3047,6 +3139,15 @@ 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 Default constructor - initializes to NULL.
>      Buffer() : Memory() { }
>  
> @@ -3469,13 +3570,12 @@ public:
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -        cl_image_desc desc;
> -        desc.image_type = CL_MEM_OBJECT_IMAGE1D;
> -        desc.image_width = width;
> -        desc.image_row_pitch = 0;
> -        desc.num_mip_levels = 0;
> -        desc.num_samples = 0;
> -        desc.buffer = 0;
> +        cl_image_desc desc =
> +        {
> +            CL_MEM_OBJECT_IMAGE1D,
> +            width,
> +            0, 0, 0, 0, 0, 0, 0, 0
> +        };
>          object_ = ::clCreateImage(
>              context(), 
>              flags, 
> @@ -3539,24 +3639,23 @@ public:
>          cl_mem_flags flags,
>          ImageFormat format,
>          ::size_t width,
> -        Buffer &buffer,
> -        void* host_ptr = NULL,
> +        const Buffer &buffer,
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -        cl_image_desc desc;
> -        desc.image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
> -        desc.image_width = width;
> -        desc.image_row_pitch = 0;
> -        desc.num_mip_levels = 0;
> -        desc.num_samples = 0;
> -        desc.buffer = buffer();
> +        cl_image_desc desc =
> +        {
> +            CL_MEM_OBJECT_IMAGE1D_BUFFER,
> +            width,
> +            0, 0, 0, 0, 0, 0, 0,
> +            buffer()
> +        };
>          object_ = ::clCreateImage(
>              context(), 
>              flags, 
>              &format, 
>              &desc, 
> -            host_ptr, 
> +            NULL, 
>              &error);
>  
>          detail::errHandler(error, __CREATE_IMAGE_ERR);
> @@ -3603,14 +3702,15 @@ public:
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -        cl_image_desc desc;
> -        desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY;
> -        desc.image_array_size = arraySize;
> -        desc.image_width = width;
> -        desc.image_row_pitch = rowPitch;
> -        desc.num_mip_levels = 0;
> -        desc.num_samples = 0;
> -        desc.buffer = 0;
> +        cl_image_desc desc =
> +        {
> +            CL_MEM_OBJECT_IMAGE1D_ARRAY,
> +            width,
> +            0, 0,  // height, depth (unused)
> +            arraySize,
> +            rowPitch,
> +            0, 0, 0, 0
> +        };
>          object_ = ::clCreateImage(
>              context(), 
>              flags, 
> @@ -3672,36 +3772,58 @@ public:
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -#if defined(CL_VERSION_1_2)
> -        cl_image_desc desc;
> -        desc.image_type = CL_MEM_OBJECT_IMAGE2D;
> -        desc.image_width = width;
> -        desc.image_height = height;
> -        desc.image_row_pitch = row_pitch;
> -        desc.num_mip_levels = 0;
> -        desc.num_samples = 0;
> -        desc.buffer = 0;
> -        object_ = ::clCreateImage(
> -            context(), 
> -            flags, 
> -            &format, 
> -            &desc, 
> -            host_ptr, 
> -            &error);
> +        bool useCreateImage;
>  
> -        detail::errHandler(error, __CREATE_IMAGE_ERR);
> -        if (err != NULL) {
> -            *err = error;
> +#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
> +        // Run-time decision based on the actual platform
> +        {
> +            cl_uint version = detail::getContextPlatformVersion(context());
> +            useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
>          }
> +#elif defined(CL_VERSION_1_2)
> +        useCreateImage = true;
>  #else
> -        object_ = ::clCreateImage2D(
> -            context(), flags,&format, width, height, row_pitch, host_ptr, &error);
> +        useCreateImage = false;
> +#endif
>  
> -        detail::errHandler(error, __CREATE_IMAGE2D_ERR);
> -        if (err != NULL) {
> -            *err = error;
> +#if defined(CL_VERSION_1_2)
> +        if (useCreateImage)
> +        {
> +            cl_image_desc desc =
> +            {
> +                CL_MEM_OBJECT_IMAGE2D,
> +                width,
> +                height,
> +                0, 0, // depth, array size (unused)
> +                row_pitch,
> +                0, 0, 0, 0
> +            };
> +            object_ = ::clCreateImage(
> +                context(),
> +                flags,
> +                &format,
> +                &desc,
> +                host_ptr,
> +                &error);
> +
> +            detail::errHandler(error, __CREATE_IMAGE_ERR);
> +            if (err != NULL) {
> +                *err = error;
> +            }
>          }
>  #endif // #if defined(CL_VERSION_1_2)
> +#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
> +        if (!useCreateImage)
> +        {
> +            object_ = ::clCreateImage2D(
> +                context(), flags,&format, width, height, row_pitch, host_ptr, &error);
> +
> +            detail::errHandler(error, __CREATE_IMAGE2D_ERR);
> +            if (err != NULL) {
> +                *err = error;
> +            }
> +        }
> +#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
>      }
>  
>      //! \brief Default constructor - initializes to NULL.
> @@ -3844,16 +3966,17 @@ public:
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -        cl_image_desc desc;
> -        desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY;
> -        desc.image_array_size = arraySize;
> -        desc.image_width = width;
> -        desc.image_height = height;
> -        desc.image_row_pitch = rowPitch;
> -        desc.image_slice_pitch = slicePitch;
> -        desc.num_mip_levels = 0;
> -        desc.num_samples = 0;
> -        desc.buffer = 0;
> +        cl_image_desc desc =
> +        {
> +            CL_MEM_OBJECT_IMAGE2D_ARRAY,
> +            width,
> +            height,
> +            0,       // depth (unused)
> +            arraySize,
> +            rowPitch,
> +            slicePitch,
> +            0, 0, 0
> +        };
>          object_ = ::clCreateImage(
>              context(), 
>              flags, 
> @@ -3916,39 +4039,61 @@ public:
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -#if defined(CL_VERSION_1_2)
> -        cl_image_desc desc;
> -        desc.image_type = CL_MEM_OBJECT_IMAGE3D;
> -        desc.image_width = width;
> -        desc.image_height = height;
> -        desc.image_depth = depth;
> -        desc.image_row_pitch = row_pitch;
> -        desc.image_slice_pitch = slice_pitch;
> -        desc.num_mip_levels = 0;
> -        desc.num_samples = 0;
> -        desc.buffer = 0;
> -        object_ = ::clCreateImage(
> -            context(), 
> -            flags, 
> -            &format, 
> -            &desc, 
> -            host_ptr, 
> -            &error);
> +        bool useCreateImage;
>  
> -        detail::errHandler(error, __CREATE_IMAGE_ERR);
> -        if (err != NULL) {
> -            *err = error;
> +#if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
> +        // Run-time decision based on the actual platform
> +        {
> +            cl_uint version = detail::getContextPlatformVersion(context());
> +            useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
>          }
> -#else  // #if defined(CL_VERSION_1_2)
> -        object_ = ::clCreateImage3D(
> -            context(), flags, &format, width, height, depth, row_pitch,
> -            slice_pitch, host_ptr, &error);
> +#elif defined(CL_VERSION_1_2)
> +        useCreateImage = true;
> +#else
> +        useCreateImage = false;
> +#endif
>  
> -        detail::errHandler(error, __CREATE_IMAGE3D_ERR);
> -        if (err != NULL) {
> -            *err = error;
> +#if defined(CL_VERSION_1_2)
> +        if (useCreateImage)
> +        {
> +            cl_image_desc desc =
> +            {
> +                CL_MEM_OBJECT_IMAGE3D,
> +                width,
> +                height,
> +                depth,
> +                0,      // array size (unused)
> +                row_pitch,
> +                slice_pitch,
> +                0, 0, 0
> +            };
> +            object_ = ::clCreateImage(
> +                context(), 
> +                flags, 
> +                &format, 
> +                &desc, 
> +                host_ptr, 
> +                &error);
> +
> +            detail::errHandler(error, __CREATE_IMAGE_ERR);
> +            if (err != NULL) {
> +                *err = error;
> +            }
>          }
> -#endif // #if defined(CL_VERSION_1_2)
> +#endif  // #if defined(CL_VERSION_1_2)
> +#if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
> +        if (!useCreateImage)
> +        {
> +            object_ = ::clCreateImage3D(
> +                context(), flags, &format, width, height, depth, row_pitch,
> +                slice_pitch, host_ptr, &error);
> +
> +            detail::errHandler(error, __CREATE_IMAGE3D_ERR);
> +            if (err != NULL) {
> +                *err = error;
> +            }
> +        }
> +#endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
>      }
>  
>      //! \brief Default constructor - initializes to NULL.
> @@ -4229,8 +4374,6 @@ public:
>      }
>  };
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::Sampler)
> -
>  class Program;
>  class CommandQueue;
>  class Kernel;
> @@ -4483,8 +4626,6 @@ public:
>      }
>  };
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::Kernel)
> -
>  /*! \class Program
>   * \brief Program interface that implements cl_program.
>   */
> @@ -4496,41 +4637,7 @@ public:
>  
>      Program(
>          const STRING_CLASS& source,
> -        cl_int* err = NULL)
> -    {
> -        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,
> +		bool build = false,
>          cl_int* err = NULL)
>      {
>          cl_int error;
> @@ -4622,6 +4729,25 @@ public:
>          }
>      }
>  
> +    /**
> +     * Construct a program object from a list of devices and a per-device list of binaries.
> +     * \param context A valid OpenCL context in which to construct the program.
> +     * \param devices A vector of OpenCL device objects for which the program will be created.
> +     * \param binaries A vector of pairs of a pointer to a binary object and its length.
> +     * \param binaryStatus An optional vector that on completion will be resized to
> +     *   match the size of binaries and filled with values to specify if each binary
> +     *   was successfully loaded.
> +     *   Set to CL_SUCCESS if the binary was successfully loaded.
> +     *   Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.
> +     *   Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.
> +     * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:
> +     *   CL_INVALID_CONTEXT if context is not a valid context.
> +     *   CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices; 
> +     *     or if any entry in binaries is NULL or has length 0.
> +     *   CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.
> +     *   CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device.
> +     *   CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
> +     */
>      Program(
>          const Context& context,
>          const VECTOR_CLASS<Device>& devices,
> @@ -4630,26 +4756,41 @@ public:
>          cl_int* err = NULL)
>      {
>          cl_int error;
> -        const ::size_t n = binaries.size();
> -        ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t));
> -        const unsigned char** images = (const unsigned char**) alloca(n * sizeof(const void*));
> +        
> +        const ::size_t numDevices = devices.size();
> +        
> +        // Catch size mismatch early and return
> +        if(binaries.size() != numDevices) {
> +            error = CL_INVALID_VALUE;
> +            detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
> +            if (err != NULL) {
> +                *err = error;
> +            }
> +            return;
> +        }
>  
> -        for (::size_t i = 0; i < n; ++i) {
> -            images[i] = (const unsigned char*)binaries[(int)i].first;
> +        ::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t));
> +        const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**));
> +
> +        for (::size_t i = 0; i < numDevices; ++i) {
> +            images[i] = (const unsigned char*)binaries[i].first;
>              lengths[i] = binaries[(int)i].second;
>          }
>  
> -        ::size_t numDevices = devices.size();
>          cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
>          for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
>              deviceIDs[deviceIndex] = (devices[deviceIndex])();
>          }
>  
> +        if(binaryStatus) {
> +            binaryStatus->resize(numDevices);
> +        }
> +        
>          object_ = ::clCreateProgramWithBinary(
>              context(), (cl_uint) devices.size(),
>              deviceIDs,
>              lengths, images, binaryStatus != NULL
> -               ? (cl_int*) &binaryStatus->front()
> +               ? &binaryStatus->front()
>                 : NULL, &error);
>  
>          detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
> @@ -4847,7 +4988,7 @@ inline Program linkProgram(
>      void* data = NULL,
>      cl_int* err = NULL) 
>  {
> -    cl_int err_local;
> +    cl_int err_local = CL_SUCCESS;
>  
>      cl_program programs[2] = { input1(), input2() };
>  
> @@ -4864,11 +5005,9 @@ inline Program linkProgram(
>          data,
>          &err_local);
>  
> -    if (err_local != CL_SUCCESS) {
> -        err_local = detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);
> -        if (err != NULL) {
> -            *err = err_local;
> -        }
> +    detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);
> +    if (err != NULL) {
> +        *err = err_local;
>      }
>  
>      return Program(prog);
> @@ -4881,15 +5020,7 @@ inline Program linkProgram(
>      void* data = NULL,
>      cl_int* err = NULL) 
>  {
> -    cl_int err_local;
> -
> -    if (inputPrograms.size() == 0) {
> -        err_local = detail::errHandler(CL_INVALID_VALUE,__COMPILE_PROGRAM_ERR);
> -        if (err != NULL) {
> -            *err = err_local;
> -        }
> -        return Program();
> -    }
> +    cl_int err_local = CL_SUCCESS;
>  
>      cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));
>  
> @@ -4898,13 +5029,6 @@ inline Program linkProgram(
>            programs[i] = inputPrograms[i]();
>          }
>      } 
> -    else {
> -        err_local = detail::errHandler(CL_OUT_OF_HOST_MEMORY,__COMPILE_PROGRAM_ERR);
> -        if (err != NULL) {
> -            *err = err_local;
> -        }
> -        return Program();
> -    }
>  
>      cl_program prog = ::clLinkProgram(
>          Context::getDefault()(),
> @@ -4917,11 +5041,9 @@ inline Program linkProgram(
>          data,
>          &err_local);
>  
> -    if (err_local != CL_SUCCESS) {
> -        err_local = detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);
> -        if (err != NULL) {
> -            *err = err_local;
> -        }
> +    detail::errHandler(err_local,__COMPILE_PROGRAM_ERR);
> +    if (err != NULL) {
> +        *err = err_local;
>      }
>  
>      return Program(prog);
> @@ -4948,8 +5070,6 @@ inline VECTOR_CLASS<char *> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* er
>      return binaries;
>  }
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::Program)
> -
>  inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
>  {
>      cl_int error;
> @@ -4999,6 +5119,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_COMMAND_QUEUE_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(
>          const Context& context,
> @@ -6002,8 +6153,6 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
>      }
>  };
>  
> -__GET_INFO_HELPER_WITH_RETAIN(cl::CommandQueue)
> -
>  #ifdef _WIN32
>  __declspec(selectany) volatile int CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
>  __declspec(selectany) CommandQueue CommandQueue::default_;
> @@ -6014,6 +6163,57 @@ __attribute__((weak)) CommandQueue CommandQueue::default_;
>  __attribute__((weak)) volatile cl_int 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;
> +        }
> +    }
> +}
> +
>  inline cl_int enqueueReadBuffer(
>      const Buffer& buffer,
>      cl_bool blocking,
> @@ -6132,10 +6332,44 @@ inline cl_int enqueueCopyBuffer(
>  
>  /**
>   * Blocking copy operation between iterators and a buffer.
> + * Host to Device.
> + * Uses default command queue.
>   */
>  template< typename IteratorType >
>  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;
>      cl_int error;
>      
> @@ -6143,7 +6377,7 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu
>      ::size_t byteLength = length*sizeof(DataType);
>  
>      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( error != CL_SUCCESS ) {
>          return error;
> @@ -6158,7 +6392,7 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu
>      std::copy(startIterator, endIterator, pointer);
>  #endif
>      Event endEvent;
> -    error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
> +    error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
>      // if exceptions enabled, enqueueUnmapMemObject will throw
>      if( error != CL_SUCCESS ) { 
>          return error;
> @@ -6169,9 +6403,11 @@ inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Bu
>  
>  /**
>   * Blocking copy operation between iterators and a buffer.
> + * Device to Host.
> + * Uses specified queue.
>   */
>  template< typename IteratorType >
> -inline cl_int copy( 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;
>      cl_int error;
> @@ -6180,14 +6416,14 @@ inline cl_int copy( cl::Buffer &buffer, IteratorType startIterator, IteratorType
>      ::size_t byteLength = length*sizeof(DataType);
>  
>      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( error != CL_SUCCESS ) {
>          return error;
>      }
>      std::copy(pointer, pointer + length, startIterator);
>      Event endEvent;
> -    error = enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
> +    error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
>      // if exceptions enabled, enqueueUnmapMemObject will throw
>      if( error != CL_SUCCESS ) { 
>          return error;
> @@ -6468,7 +6704,6 @@ inline cl_int finish(void)
>      return queue.finish();
>  }
>  
> -
>  // Kernel Functor support
>  // New interface as of September 2011
>  // Requires the C++11 std::tr1::function (note do not support TR1)
> @@ -6664,7 +6899,6 @@ struct SetArg
>      }
>  };  
>  
> -
>  template<int index>
>  struct SetArg<index, NullType>
>  {
> @@ -6673,7 +6907,6 @@ struct SetArg<index, NullType>
>      }
>  };
>  
> -
>  template <
>     typename T0,   typename T1,   typename T2,   typename T3,
>     typename T4,   typename T5,   typename T6,   typename T7,
> @@ -6772,7 +7005,6 @@ public:
>          SetArg<30, T30>::set(kernel_, t30);
>          SetArg<31, T31>::set(kernel_, t31);
>          
> -
>          args.queue_.enqueueNDRangeKernel(
>              kernel_,
>              args.offset_,
> @@ -6781,7 +7013,6 @@ public:
>              &args.events_,
>              &event);
>          
> -
>          return event;
>      }
>  
> @@ -12193,8 +12424,6 @@ public:
>  #undef __UNLOAD_COMPILER_ERR
>  #endif //__CL_USER_OVERRIDE_ERROR_STRINGS
>  
> -#undef __GET_INFO_HELPER_WITH_RETAIN
> -
>  #undef __CL_FUNCTION_TYPE
>  
>  // Extensions
> diff --git a/include/CL/cl_d3d10.h b/include/CL/cl_d3d10.h
> index 81b0d37..b6c90b3 100644
> --- a/include/CL/cl_d3d10.h
> +++ b/include/CL/cl_d3d10.h
> @@ -43,31 +43,31 @@ typedef cl_uint cl_d3d10_device_set_khr;
>  
>  /******************************************************************************/
>  
> -// Error Codes
> +/* Error Codes */
>  #define CL_INVALID_D3D10_DEVICE_KHR                  -1002
>  #define CL_INVALID_D3D10_RESOURCE_KHR                -1003
>  #define CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR       -1004
>  #define CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR           -1005
>  
> -// cl_d3d10_device_source_nv
> +/* cl_d3d10_device_source_nv */
>  #define CL_D3D10_DEVICE_KHR                          0x4010
>  #define CL_D3D10_DXGI_ADAPTER_KHR                    0x4011
>  
> -// cl_d3d10_device_set_nv
> +/* cl_d3d10_device_set_nv */
>  #define CL_PREFERRED_DEVICES_FOR_D3D10_KHR           0x4012
>  #define CL_ALL_DEVICES_FOR_D3D10_KHR                 0x4013
>  
> -// cl_context_info
> +/* cl_context_info */
>  #define CL_CONTEXT_D3D10_DEVICE_KHR                  0x4014
>  #define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C
>  
> -// cl_mem_info
> +/* cl_mem_info */
>  #define CL_MEM_D3D10_RESOURCE_KHR                    0x4015
>  
> -// cl_image_info
> +/* cl_image_info */
>  #define CL_IMAGE_D3D10_SUBRESOURCE_KHR               0x4016
>  
> -// cl_command_type
> +/* cl_command_type */
>  #define CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR         0x4017
>  #define CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR         0x4018
>  
> @@ -122,5 +122,5 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D10ObjectsKHR_fn)(
>  }
>  #endif
>  
> -#endif  // __OPENCL_CL_D3D10_H
> +#endif  /* __OPENCL_CL_D3D10_H */
>  
> diff --git a/include/CL/cl_d3d11.h b/include/CL/cl_d3d11.h
> index d3c8bdc..2e0a63f 100644
> --- a/include/CL/cl_d3d11.h
> +++ b/include/CL/cl_d3d11.h
> @@ -43,31 +43,31 @@ typedef cl_uint cl_d3d11_device_set_khr;
>  
>  /******************************************************************************/
>  
> -// Error Codes
> +/* Error Codes */
>  #define CL_INVALID_D3D11_DEVICE_KHR                  -1006
>  #define CL_INVALID_D3D11_RESOURCE_KHR                -1007
>  #define CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR       -1008
>  #define CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR           -1009
>  
> -// cl_d3d11_device_source
> +/* cl_d3d11_device_source */
>  #define CL_D3D11_DEVICE_KHR                          0x4019
>  #define CL_D3D11_DXGI_ADAPTER_KHR                    0x401A
>  
> -// cl_d3d11_device_set
> +/* cl_d3d11_device_set */
>  #define CL_PREFERRED_DEVICES_FOR_D3D11_KHR           0x401B
>  #define CL_ALL_DEVICES_FOR_D3D11_KHR                 0x401C
>  
> -// cl_context_info
> +/* cl_context_info */
>  #define CL_CONTEXT_D3D11_DEVICE_KHR                  0x401D
>  #define CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR 0x402D
>  
> -// cl_mem_info
> +/* cl_mem_info */
>  #define CL_MEM_D3D11_RESOURCE_KHR                    0x401E
>  
> -// cl_image_info
> +/* cl_image_info */
>  #define CL_IMAGE_D3D11_SUBRESOURCE_KHR               0x401F
>  
> -// cl_command_type
> +/* cl_command_type */
>  #define CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR         0x4020
>  #define CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR         0x4021
>  
> @@ -122,5 +122,5 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D11ObjectsKHR_fn)(
>  }
>  #endif
>  
> -#endif  // __OPENCL_CL_D3D11_H
> +#endif  /* __OPENCL_CL_D3D11_H */
>  
> diff --git a/include/CL/cl_d3d9.h b/include/CL/cl_d3d9.h
> deleted file mode 100644
> index babc611..0000000
> --- a/include/CL/cl_d3d9.h
> +++ /dev/null
> @@ -1,98 +0,0 @@
> -/* 
> - * Copyright © 2012 Intel Corporation
> - *
> - * This library is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU Lesser General Public
> - * License as published by the Free Software Foundation; either
> - * version 2 of the License, or (at your option) any later version.
> - *
> - * This library is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> - * Lesser General Public License for more details.
> - *
> - * You should have received a copy of the GNU Lesser General Public
> - * License along with this library. If not, see <http://www.gnu.org/licenses/>.
> - *
> - * Author: Benjamin Segovia <benjamin.segovia at intel.com>
> - */
> -
> -/* $Revision$ on $Date$ */
> -
> -#ifndef __OPENCL_CL_D3D9_H
> -#define __OPENCL_CL_D3D9_H
> -
> -#include <CL/cl_platform.h>
> -#include <d3d9.h>
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -/* cl_khr_d3d9_sharing extension    */
> -#define cl_khr_d3d9_sharing 1
> -
> -/* cl_context_properties            */
> -#define CL_CONTEXT_D3D9_DEVICE 0x1085
> -
> -extern CL_API_ENTRY cl_mem CL_API_CALL
> -clCreateFromD3D9BufferKHR(
> -    cl_context           /* context */,
> -    cl_mem_flags         /* flags */,
> -    IDirect3DResource9 * /* resource */,
> -    HANDLE               /* shared_handle */,
> -    cl_int *             /* errcode_ret */);
> -
> -
> -extern CL_API_ENTRY cl_mem CL_API_CALL
> -clCreateFromD3D9TextureKHR(
> -    cl_context          /* context */,
> -    cl_mem_flags        /* flags */,
> -    IDirect3DTexture9 * /* texture */,
> -    HANDLE              /* shared_handle */,
> -    UINT                /* miplevel */,
> -    cl_int *            /* errcode_ret */);
> -
> -extern CL_API_ENTRY cl_mem CL_API_CALL
> -clCreateFromD3D9VolumeTextureKHR(
> -    cl_context                /* context */,
> -    cl_mem_flags              /* flags */,
> -    IDirect3DVolumeTexture9 * /* resource */,
> -    HANDLE                    /* shared_handle */,
> -    UINT                      /* miplevel */,
> -    cl_int *                  /* errcode_ret */);
> -
> -extern CL_API_ENTRY cl_mem CL_API_CALL
> -clCreateFromD3D9CubeTextureKHR(
> -    cl_context                /* context */,
> -    cl_mem_flags              /* flags */,
> -    IDirect3DCubeTexture9 *   /* resource */,                            
> -    HANDLE                    /* shared_handle */,
> -    D3DCUBEMAP_FACES Facetype /* face */,
> -    UINT                      /* miplevel */,
> -    cl_int *                  /* errcode_ret */);
> -
> -extern CL_API_ENTRY cl_int CL_API_CALL
> -clEnqueueAcquireD3D9ObjectsKHR(
> -    cl_command_queue /* command_queue */,
> -    cl_uint          /* num_objects */,
> -    const cl_mem *   /* mem_objects */,
> -    cl_uint          /* num_events_in_wait_list */,
> -    const cl_event * /* event_wait_list */,
> -    cl_event *       /* event */);
> -
> -extern CL_API_ENTRY cl_int CL_API_CALL
> -clEnqueueReleaseD3D9ObjectsKHR(
> -    cl_command_queue /* command_queue */,
> -    cl_uint          /* num_objects */,
> -    const cl_mem *   /* mem_objects */,
> -    cl_uint          /* num_events_in_wait_list */,
> -    const cl_event * /* event_wait_list */,
> -    cl_event *       /* event */);
> -
> -#ifdef __cplusplus
> -}
> -#endif
> -
> -#endif  /* __OPENCL_CL_D3D9_H   */
> -
> diff --git a/include/CL/cl_dx9_media_sharing.h b/include/CL/cl_dx9_media_sharing.h
> index 1ef543a..23f1631 100644
> --- a/include/CL/cl_dx9_media_sharing.h
> +++ b/include/CL/cl_dx9_media_sharing.h
> @@ -52,34 +52,34 @@ typedef struct _cl_dx9_surface_info_khr
>  
>  /******************************************************************************/
>  
> -// Error Codes
> +/* Error Codes */
>  #define CL_INVALID_DX9_MEDIA_ADAPTER_KHR                -1010
>  #define CL_INVALID_DX9_MEDIA_SURFACE_KHR                -1011
>  #define CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR       -1012
>  #define CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR           -1013
>  
> -// cl_media_adapter_type_khr
> +/* cl_media_adapter_type_khr */
>  #define CL_ADAPTER_D3D9_KHR                              0x2020
>  #define CL_ADAPTER_D3D9EX_KHR                            0x2021
>  #define CL_ADAPTER_DXVA_KHR                              0x2022
>  
> -// cl_media_adapter_set_khr
> +/* cl_media_adapter_set_khr */
>  #define CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR   0x2023
>  #define CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR         0x2024
>  
> -// cl_context_info
> +/* cl_context_info */
>  #define CL_CONTEXT_ADAPTER_D3D9_KHR                      0x2025
>  #define CL_CONTEXT_ADAPTER_D3D9EX_KHR                    0x2026
>  #define CL_CONTEXT_ADAPTER_DXVA_KHR                      0x2027
>  
> -// cl_mem_info
> +/* cl_mem_info */
>  #define CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR                0x2028
>  #define CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR                0x2029
>  
> -// cl_image_info
> +/* cl_image_info */
>  #define CL_IMAGE_DX9_MEDIA_PLANE_KHR                     0x202A
>  
> -// cl_command_type
> +/* cl_command_type */
>  #define CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR        0x202B
>  #define CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR        0x202C
>  
> @@ -123,5 +123,5 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseDX9MediaSurfacesKHR_fn
>  }
>  #endif
>  
> -#endif  // __OPENCL_CL_DX9_MEDIA_SHARING_H
> +#endif  /* __OPENCL_CL_DX9_MEDIA_SHARING_H */
>  
> diff --git a/include/CL/cl_egl.h b/include/CL/cl_egl.h
> new file mode 100644
> index 0000000..93e6c9c
> --- /dev/null
> +++ b/include/CL/cl_egl.h
> @@ -0,0 +1,133 @@
> +/*******************************************************************************
> + * Copyright (c) 2008-2010 The Khronos Group Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and/or associated documentation files (the
> + * "Materials"), to deal in the Materials without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sublicense, and/or sell copies of the Materials, and to
> + * permit persons to whom the Materials are furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included
> + * in all copies or substantial portions of the Materials.
> + *
> + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
> + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
> + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
> + ******************************************************************************/
> +
> +#ifndef __OPENCL_CL_EGL_H
> +#define __OPENCL_CL_EGL_H
> +
> +#ifdef __APPLE__
> +
> +#else
> +#include <CL/cl.h>
> +#include <EGL/egl.h>
> +#include <EGL/eglext.h>
> +#endif  
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +
> +/* Command type for events created with clEnqueueAcquireEGLObjectsKHR */
> +#define CL_COMMAND_EGL_FENCE_SYNC_OBJECT_KHR  0x202F
> +#define CL_COMMAND_ACQUIRE_EGL_OBJECTS_KHR    0x202D
> +#define CL_COMMAND_RELEASE_EGL_OBJECTS_KHR    0x202E
> +
> +/* Error type for clCreateFromEGLImageKHR */
> +#define CL_INVALID_EGL_OBJECT_KHR             -1093
> +#define CL_EGL_RESOURCE_NOT_ACQUIRED_KHR      -1092
> +
> +/* CLeglImageKHR is an opaque handle to an EGLImage */
> +typedef void* CLeglImageKHR;
> +
> +/* CLeglDisplayKHR is an opaque handle to an EGLDisplay */
> +typedef void* CLeglDisplayKHR;
> +
> +/* CLeglSyncKHR is an opaque handle to an EGLSync object */
> +typedef void* CLeglSyncKHR;
> +
> +/* properties passed to clCreateFromEGLImageKHR */
> +typedef intptr_t cl_egl_image_properties_khr;
> +
> +
> +#define cl_khr_egl_image 1
> +
> +extern CL_API_ENTRY cl_mem CL_API_CALL
> +clCreateFromEGLImageKHR(cl_context                  /* context */,
> +                        CLeglDisplayKHR             /* egldisplay */,
> +                        CLeglImageKHR               /* eglimage */,
> +                        cl_mem_flags                /* flags */,
> +                        const cl_egl_image_properties_khr * /* properties */,
> +                        cl_int *                    /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
> +
> +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromEGLImageKHR_fn)(
> +	cl_context                  context,
> +	CLeglDisplayKHR             egldisplay,
> +	CLeglImageKHR               eglimage,
> +	cl_mem_flags                flags,
> +	const cl_egl_image_properties_khr * properties,
> +	cl_int *                    errcode_ret);
> +
> +
> +extern CL_API_ENTRY cl_int CL_API_CALL
> +clEnqueueAcquireEGLObjectsKHR(cl_command_queue /* command_queue */,
> +                              cl_uint          /* num_objects */,
> +                              const cl_mem *   /* mem_objects */,
> +                              cl_uint          /* num_events_in_wait_list */,
> +                              const cl_event * /* event_wait_list */,
> +                              cl_event *       /* event */) CL_API_SUFFIX__VERSION_1_0;
> +
> +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireEGLObjectsKHR_fn)(
> +	cl_command_queue command_queue,
> +	cl_uint          num_objects,
> +	const cl_mem *   mem_objects,
> +	cl_uint          num_events_in_wait_list,
> +	const cl_event * event_wait_list,
> +	cl_event *       event);
> +
> +
> +extern CL_API_ENTRY cl_int CL_API_CALL
> +clEnqueueReleaseEGLObjectsKHR(cl_command_queue /* command_queue */,
> +                              cl_uint          /* num_objects */,
> +                              const cl_mem *   /* mem_objects */,
> +                              cl_uint          /* num_events_in_wait_list */,
> +                              const cl_event * /* event_wait_list */,
> +                              cl_event *       /* event */) CL_API_SUFFIX__VERSION_1_0;
> +
> +typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseEGLObjectsKHR_fn)(
> +	cl_command_queue command_queue,
> +	cl_uint          num_objects,
> +	const cl_mem *   mem_objects,
> +	cl_uint          num_events_in_wait_list,
> +	const cl_event * event_wait_list,
> +	cl_event *       event);
> +
> +
> +#define cl_khr_egl_event 1
> +
> +extern CL_API_ENTRY cl_event CL_API_CALL
> +clCreateEventFromEGLSyncKHR(cl_context      /* context */,
> +                            CLeglSyncKHR    /* sync */,
> +                            CLeglDisplayKHR /* display */,
> +                            cl_int *        /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
> +
> +typedef CL_API_ENTRY cl_event (CL_API_CALL *clCreateEventFromEGLSyncKHR_fn)(
> +	cl_context      context,
> +	CLeglSyncKHR    sync,
> +	CLeglDisplayKHR display,
> +	cl_int *        errcode_ret);
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __OPENCL_CL_EGL_H */
> diff --git a/include/CL/cl_ext.h b/include/CL/cl_ext.h
> index 632cb21..710bea8 100644
> --- a/include/CL/cl_ext.h
> +++ b/include/CL/cl_ext.h
> @@ -1,5 +1,5 @@
>  /*******************************************************************************
> - * Copyright (c) 2008 - 2012 The Khronos Group Inc.
> + * Copyright (c) 2008-2013 The Khronos Group Inc.
>   *
>   * Permission is hereby granted, free of charge, to any person obtaining a
>   * copy of this software and/or associated documentation files (the
> @@ -34,10 +34,10 @@ extern "C" {
>  #endif
>  
>  #ifdef __APPLE__
> -	#include <OpenCL/cl.h>
> +        #include <OpenCL/cl.h>
>      #include <AvailabilityMacros.h>
>  #else
> -	#include <CL/cl.h>
> +        #include <CL/cl.h>
>  #endif
>  
>  /* cl_khr_fp16 extension - no extension #define since it has no functions  */
> @@ -61,7 +61,7 @@ extern "C" {
>   * before using.
>   */
>  #define cl_APPLE_SetMemObjectDestructor 1
> -cl_int	CL_API_ENTRY clSetMemObjectDestructorAPPLE(  cl_mem /* memobj */, 
> +cl_int  CL_API_ENTRY clSetMemObjectDestructorAPPLE(  cl_mem /* memobj */, 
>                                          void (* /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), 
>                                          void * /*user_data */ )             CL_EXT_SUFFIX__VERSION_1_0;  
>  
> @@ -157,6 +157,10 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clTerminateContextKHR_fn)(cl_context /
>   * Standard Portable Intermediate Representation (SPIR) instance
>   */
>  
> +#define CL_DEVICE_SPIR_VERSIONS                     0x40E0
> +#define CL_PROGRAM_BINARY_TYPE_INTERMEDIATE         0x40E1
> +
> +
>  /******************************************
>  * cl_nv_device_attribute_query extension *
>  ******************************************/
> @@ -169,12 +173,17 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clTerminateContextKHR_fn)(cl_context /
>  #define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV            0x4005
>  #define CL_DEVICE_INTEGRATED_MEMORY_NV              0x4006
>  
> -
>  /*********************************
>  * cl_amd_device_attribute_query *
>  *********************************/
>  #define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD        0x4036
>  
> +/*********************************
> +* cl_arm_printf extension
> +*********************************/
> +#define CL_PRINTF_CALLBACK_ARM                      0x40B0
> +#define CL_PRINTF_BUFFERSIZE_ARM                    0x40B1
> +
>  #ifdef CL_VERSION_1_1
>     /***********************************
>      * cl_ext_device_fission extension *
> @@ -239,7 +248,63 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clTerminateContextKHR_fn)(cl_context /
>      #define CL_PARTITION_BY_COUNTS_LIST_END_EXT         ((cl_device_partition_property_ext) 0)
>      #define CL_PARTITION_BY_NAMES_LIST_END_EXT          ((cl_device_partition_property_ext) 0 - 1)
>  
> +/*********************************
> +* cl_qcom_ext_host_ptr extension
> +*********************************/
> +
> +#define CL_MEM_EXT_HOST_PTR_QCOM                  (1 << 29)
> +
> +#define CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM   0x40A0      
> +#define CL_DEVICE_PAGE_SIZE_QCOM                  0x40A1
> +#define CL_IMAGE_ROW_ALIGNMENT_QCOM               0x40A2
> +#define CL_IMAGE_SLICE_ALIGNMENT_QCOM             0x40A3
> +#define CL_MEM_HOST_UNCACHED_QCOM                 0x40A4
> +#define CL_MEM_HOST_WRITEBACK_QCOM                0x40A5
> +#define CL_MEM_HOST_WRITETHROUGH_QCOM             0x40A6
> +#define CL_MEM_HOST_WRITE_COMBINING_QCOM          0x40A7
> +
> +typedef cl_uint                                   cl_image_pitch_info_qcom;
> +
> +extern CL_API_ENTRY cl_int CL_API_CALL
> +clGetDeviceImageInfoQCOM(cl_device_id             device,
> +                         size_t                   image_width,
> +                         size_t                   image_height,
> +                         const cl_image_format   *image_format,
> +                         cl_image_pitch_info_qcom param_name,
> +                         size_t                   param_value_size,
> +                         void                    *param_value,
> +                         size_t                  *param_value_size_ret);
> +
> +typedef struct _cl_mem_ext_host_ptr
> +{
> +    /* Type of external memory allocation. */
> +    /* Legal values will be defined in layered extensions. */
> +    cl_uint  allocation_type;
> +            
> +	/* Host cache policy for this external memory allocation. */
> +    cl_uint  host_cache_policy;
> +
> +} cl_mem_ext_host_ptr;
> +
> +/*********************************
> +* cl_qcom_ion_host_ptr extension
> +*********************************/
> +
> +#define CL_MEM_ION_HOST_PTR_QCOM                  0x40A8
> +
> +typedef struct _cl_mem_ion_host_ptr
> +{
> +    /* Type of external memory allocation. */
> +    /* Must be CL_MEM_ION_HOST_PTR_QCOM for ION allocations. */
> +    cl_mem_ext_host_ptr  ext_host_ptr;
> +
> +    /* ION file descriptor */
> +    int                  ion_filedesc;
> +            
> +    /* Host pointer to the ION allocated memory */
> +    void*                ion_hostptr;
>  
> +} cl_mem_ion_host_ptr;
>  
>  #endif /* CL_VERSION_1_1 */
>  
> diff --git a/include/CL/cl_gl.h b/include/CL/cl_gl.h
> index eb9ce5c..e52c1b6 100644
> --- a/include/CL/cl_gl.h
> +++ b/include/CL/cl_gl.h
> @@ -52,6 +52,7 @@ typedef struct __GLsync *cl_GLsync;
>  /* cl_gl_texture_info           */
>  #define CL_GL_TEXTURE_TARGET                    0x2004
>  #define CL_GL_MIPMAP_LEVEL                      0x2005
> +#define CL_GL_NUM_SAMPLES                       0x2012
>  
>  
>  extern CL_API_ENTRY cl_mem CL_API_CALL
> @@ -103,7 +104,7 @@ clEnqueueReleaseGLObjects(cl_command_queue      /* command_queue */,
>                            cl_event *            /* event */) CL_API_SUFFIX__VERSION_1_0;
>  
>  
> -// Deprecated OpenCL 1.1 APIs
> +/* Deprecated OpenCL 1.1 APIs */
>  extern CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL
>  clCreateFromGLTexture2D(cl_context      /* context */,
>                          cl_mem_flags    /* flags */,
> diff --git a/include/CL/cl_platform.h b/include/CL/cl_platform.h
> index cf2b721..7f6f5e8 100644
> --- a/include/CL/cl_platform.h
> +++ b/include/CL/cl_platform.h
> @@ -451,6 +451,24 @@ typedef unsigned int cl_GLenum;
>      #define __CL_DOUBLE4__  1
>  #endif
>  
> +/* Define capabilities for anonymous struct members. */
> +#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> +#define  __CL_HAS_ANON_STRUCT__ 1
> +#define  __CL_ANON_STRUCT__ __extension__
> +#elif defined( _WIN32) && (_MSC_VER >= 1500)
> +   /* Microsoft Developer Studio 2008 supports anonymous structs, but
> +    * complains by default. */
> +#define  __CL_HAS_ANON_STRUCT__ 1
> +#define  __CL_ANON_STRUCT__
> +   /* Disable warning C4201: nonstandard extension used : nameless
> +    * struct/union */
> +#pragma warning( push )
> +#pragma warning( disable : 4201 )
> +#else
> +#define  __CL_HAS_ANON_STRUCT__ 0
> +#define  __CL_ANON_STRUCT__
> +#endif
> +
>  /* Define alignment keys */
>  #if defined( __GNUC__ )
>      #define CL_ALIGNED(_x)          __attribute__ ((aligned(_x)))
> @@ -466,7 +484,7 @@ typedef unsigned int cl_GLenum;
>  #endif
>  
>  /* Indicate whether .xyzw, .s0123 and .hi.lo are supported */
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> +#if __CL_HAS_ANON_STRUCT__
>      /* .xyzw and .s0123...{f|F} are supported */
>      #define CL_HAS_NAMED_VECTOR_FIELDS 1
>      /* .hi and .lo are supported */
> @@ -479,10 +497,10 @@ typedef unsigned int cl_GLenum;
>  typedef union
>  {
>      cl_char  CL_ALIGNED(2) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_char  x, y; };
> -   __extension__ struct{ cl_char  s0, s1; };
> -   __extension__ struct{ cl_char  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_char  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_char  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_char  lo, hi; };
>  #endif
>  #if defined( __CL_CHAR2__) 
>      __cl_char2     v2;
> @@ -492,10 +510,10 @@ typedef union
>  typedef union
>  {
>      cl_char  CL_ALIGNED(4) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_char  x, y, z, w; };
> -   __extension__ struct{ cl_char  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_char2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_char  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_char  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_char2 lo, hi; };
>  #endif
>  #if defined( __CL_CHAR2__) 
>      __cl_char2     v2[2];
> @@ -511,10 +529,10 @@ typedef  cl_char4  cl_char3;
>  typedef union
>  {
>      cl_char   CL_ALIGNED(8) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_char  x, y, z, w; };
> -   __extension__ struct{ cl_char  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_char4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_char  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_char  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_char4 lo, hi; };
>  #endif
>  #if defined( __CL_CHAR2__) 
>      __cl_char2     v2[4];
> @@ -530,10 +548,10 @@ typedef union
>  typedef union
>  {
>      cl_char  CL_ALIGNED(16) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_char  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_char  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_char8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_char  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_char  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_char8 lo, hi; };
>  #endif
>  #if defined( __CL_CHAR2__) 
>      __cl_char2     v2[8];
> @@ -554,10 +572,10 @@ typedef union
>  typedef union
>  {
>      cl_uchar  CL_ALIGNED(2) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uchar  x, y; };
> -   __extension__ struct{ cl_uchar  s0, s1; };
> -   __extension__ struct{ cl_uchar  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  lo, hi; };
>  #endif
>  #if defined( __cl_uchar2__) 
>      __cl_uchar2     v2;
> @@ -567,10 +585,10 @@ typedef union
>  typedef union
>  {
>      cl_uchar  CL_ALIGNED(4) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uchar  x, y, z, w; };
> -   __extension__ struct{ cl_uchar  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_uchar2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar2 lo, hi; };
>  #endif
>  #if defined( __CL_UCHAR2__) 
>      __cl_uchar2     v2[2];
> @@ -586,10 +604,10 @@ typedef  cl_uchar4  cl_uchar3;
>  typedef union
>  {
>      cl_uchar   CL_ALIGNED(8) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uchar  x, y, z, w; };
> -   __extension__ struct{ cl_uchar  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_uchar4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar4 lo, hi; };
>  #endif
>  #if defined( __CL_UCHAR2__) 
>      __cl_uchar2     v2[4];
> @@ -605,10 +623,10 @@ typedef union
>  typedef union
>  {
>      cl_uchar  CL_ALIGNED(16) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uchar  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_uchar  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_uchar8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_uchar8 lo, hi; };
>  #endif
>  #if defined( __CL_UCHAR2__) 
>      __cl_uchar2     v2[8];
> @@ -629,10 +647,10 @@ typedef union
>  typedef union
>  {
>      cl_short  CL_ALIGNED(4) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_short  x, y; };
> -   __extension__ struct{ cl_short  s0, s1; };
> -   __extension__ struct{ cl_short  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_short  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_short  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_short  lo, hi; };
>  #endif
>  #if defined( __CL_SHORT2__) 
>      __cl_short2     v2;
> @@ -642,10 +660,10 @@ typedef union
>  typedef union
>  {
>      cl_short  CL_ALIGNED(8) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_short  x, y, z, w; };
> -   __extension__ struct{ cl_short  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_short2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_short  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_short  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_short2 lo, hi; };
>  #endif
>  #if defined( __CL_SHORT2__) 
>      __cl_short2     v2[2];
> @@ -661,10 +679,10 @@ typedef  cl_short4  cl_short3;
>  typedef union
>  {
>      cl_short   CL_ALIGNED(16) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_short  x, y, z, w; };
> -   __extension__ struct{ cl_short  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_short4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_short  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_short  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_short4 lo, hi; };
>  #endif
>  #if defined( __CL_SHORT2__) 
>      __cl_short2     v2[4];
> @@ -680,10 +698,10 @@ typedef union
>  typedef union
>  {
>      cl_short  CL_ALIGNED(32) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_short  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_short  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_short8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_short  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_short  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_short8 lo, hi; };
>  #endif
>  #if defined( __CL_SHORT2__) 
>      __cl_short2     v2[8];
> @@ -704,10 +722,10 @@ typedef union
>  typedef union
>  {
>      cl_ushort  CL_ALIGNED(4) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ushort  x, y; };
> -   __extension__ struct{ cl_ushort  s0, s1; };
> -   __extension__ struct{ cl_ushort  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  lo, hi; };
>  #endif
>  #if defined( __CL_USHORT2__) 
>      __cl_ushort2     v2;
> @@ -717,10 +735,10 @@ typedef union
>  typedef union
>  {
>      cl_ushort  CL_ALIGNED(8) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ushort  x, y, z, w; };
> -   __extension__ struct{ cl_ushort  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_ushort2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort2 lo, hi; };
>  #endif
>  #if defined( __CL_USHORT2__) 
>      __cl_ushort2     v2[2];
> @@ -736,10 +754,10 @@ typedef  cl_ushort4  cl_ushort3;
>  typedef union
>  {
>      cl_ushort   CL_ALIGNED(16) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ushort  x, y, z, w; };
> -   __extension__ struct{ cl_ushort  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_ushort4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort4 lo, hi; };
>  #endif
>  #if defined( __CL_USHORT2__) 
>      __cl_ushort2     v2[4];
> @@ -755,10 +773,10 @@ typedef union
>  typedef union
>  {
>      cl_ushort  CL_ALIGNED(32) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ushort  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_ushort  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_ushort8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_ushort8 lo, hi; };
>  #endif
>  #if defined( __CL_USHORT2__) 
>      __cl_ushort2     v2[8];
> @@ -778,10 +796,10 @@ typedef union
>  typedef union
>  {
>      cl_int  CL_ALIGNED(8) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_int  x, y; };
> -   __extension__ struct{ cl_int  s0, s1; };
> -   __extension__ struct{ cl_int  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_int  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_int  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_int  lo, hi; };
>  #endif
>  #if defined( __CL_INT2__) 
>      __cl_int2     v2;
> @@ -791,10 +809,10 @@ typedef union
>  typedef union
>  {
>      cl_int  CL_ALIGNED(16) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_int  x, y, z, w; };
> -   __extension__ struct{ cl_int  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_int2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_int  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_int  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_int2 lo, hi; };
>  #endif
>  #if defined( __CL_INT2__) 
>      __cl_int2     v2[2];
> @@ -810,10 +828,10 @@ typedef  cl_int4  cl_int3;
>  typedef union
>  {
>      cl_int   CL_ALIGNED(32) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_int  x, y, z, w; };
> -   __extension__ struct{ cl_int  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_int4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_int  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_int  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_int4 lo, hi; };
>  #endif
>  #if defined( __CL_INT2__) 
>      __cl_int2     v2[4];
> @@ -829,10 +847,10 @@ typedef union
>  typedef union
>  {
>      cl_int  CL_ALIGNED(64) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_int  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_int  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_int8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_int  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_int  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_int8 lo, hi; };
>  #endif
>  #if defined( __CL_INT2__) 
>      __cl_int2     v2[8];
> @@ -853,10 +871,10 @@ typedef union
>  typedef union
>  {
>      cl_uint  CL_ALIGNED(8) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uint  x, y; };
> -   __extension__ struct{ cl_uint  s0, s1; };
> -   __extension__ struct{ cl_uint  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uint  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint  lo, hi; };
>  #endif
>  #if defined( __CL_UINT2__) 
>      __cl_uint2     v2;
> @@ -866,10 +884,10 @@ typedef union
>  typedef union
>  {
>      cl_uint  CL_ALIGNED(16) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uint  x, y, z, w; };
> -   __extension__ struct{ cl_uint  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_uint2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uint  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint2 lo, hi; };
>  #endif
>  #if defined( __CL_UINT2__) 
>      __cl_uint2     v2[2];
> @@ -885,10 +903,10 @@ typedef  cl_uint4  cl_uint3;
>  typedef union
>  {
>      cl_uint   CL_ALIGNED(32) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uint  x, y, z, w; };
> -   __extension__ struct{ cl_uint  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_uint4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uint  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint4 lo, hi; };
>  #endif
>  #if defined( __CL_UINT2__) 
>      __cl_uint2     v2[4];
> @@ -904,10 +922,10 @@ typedef union
>  typedef union
>  {
>      cl_uint  CL_ALIGNED(64) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_uint  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_uint  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_uint8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_uint  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_uint8 lo, hi; };
>  #endif
>  #if defined( __CL_UINT2__) 
>      __cl_uint2     v2[8];
> @@ -927,10 +945,10 @@ typedef union
>  typedef union
>  {
>      cl_long  CL_ALIGNED(16) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_long  x, y; };
> -   __extension__ struct{ cl_long  s0, s1; };
> -   __extension__ struct{ cl_long  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_long  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_long  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_long  lo, hi; };
>  #endif
>  #if defined( __CL_LONG2__) 
>      __cl_long2     v2;
> @@ -940,10 +958,10 @@ typedef union
>  typedef union
>  {
>      cl_long  CL_ALIGNED(32) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_long  x, y, z, w; };
> -   __extension__ struct{ cl_long  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_long2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_long  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_long  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_long2 lo, hi; };
>  #endif
>  #if defined( __CL_LONG2__) 
>      __cl_long2     v2[2];
> @@ -959,10 +977,10 @@ typedef  cl_long4  cl_long3;
>  typedef union
>  {
>      cl_long   CL_ALIGNED(64) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_long  x, y, z, w; };
> -   __extension__ struct{ cl_long  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_long4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_long  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_long  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_long4 lo, hi; };
>  #endif
>  #if defined( __CL_LONG2__) 
>      __cl_long2     v2[4];
> @@ -978,10 +996,10 @@ typedef union
>  typedef union
>  {
>      cl_long  CL_ALIGNED(128) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_long  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_long  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_long8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_long  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_long  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_long8 lo, hi; };
>  #endif
>  #if defined( __CL_LONG2__) 
>      __cl_long2     v2[8];
> @@ -1002,10 +1020,10 @@ typedef union
>  typedef union
>  {
>      cl_ulong  CL_ALIGNED(16) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ulong  x, y; };
> -   __extension__ struct{ cl_ulong  s0, s1; };
> -   __extension__ struct{ cl_ulong  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  lo, hi; };
>  #endif
>  #if defined( __CL_ULONG2__) 
>      __cl_ulong2     v2;
> @@ -1015,10 +1033,10 @@ typedef union
>  typedef union
>  {
>      cl_ulong  CL_ALIGNED(32) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ulong  x, y, z, w; };
> -   __extension__ struct{ cl_ulong  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_ulong2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong2 lo, hi; };
>  #endif
>  #if defined( __CL_ULONG2__) 
>      __cl_ulong2     v2[2];
> @@ -1034,10 +1052,10 @@ typedef  cl_ulong4  cl_ulong3;
>  typedef union
>  {
>      cl_ulong   CL_ALIGNED(64) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ulong  x, y, z, w; };
> -   __extension__ struct{ cl_ulong  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_ulong4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong4 lo, hi; };
>  #endif
>  #if defined( __CL_ULONG2__) 
>      __cl_ulong2     v2[4];
> @@ -1053,10 +1071,10 @@ typedef union
>  typedef union
>  {
>      cl_ulong  CL_ALIGNED(128) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_ulong  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_ulong  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_ulong8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_ulong8 lo, hi; };
>  #endif
>  #if defined( __CL_ULONG2__) 
>      __cl_ulong2     v2[8];
> @@ -1078,10 +1096,10 @@ typedef union
>  typedef union
>  {
>      cl_float  CL_ALIGNED(8) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_float  x, y; };
> -   __extension__ struct{ cl_float  s0, s1; };
> -   __extension__ struct{ cl_float  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_float  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_float  s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_float  lo, hi; };
>  #endif
>  #if defined( __CL_FLOAT2__) 
>      __cl_float2     v2;
> @@ -1091,10 +1109,10 @@ typedef union
>  typedef union
>  {
>      cl_float  CL_ALIGNED(16) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_float   x, y, z, w; };
> -   __extension__ struct{ cl_float   s0, s1, s2, s3; };
> -   __extension__ struct{ cl_float2  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_float   x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_float   s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_float2  lo, hi; };
>  #endif
>  #if defined( __CL_FLOAT2__) 
>      __cl_float2     v2[2];
> @@ -1110,10 +1128,10 @@ typedef  cl_float4  cl_float3;
>  typedef union
>  {
>      cl_float   CL_ALIGNED(32) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_float   x, y, z, w; };
> -   __extension__ struct{ cl_float   s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_float4  lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_float   x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_float   s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_float4  lo, hi; };
>  #endif
>  #if defined( __CL_FLOAT2__) 
>      __cl_float2     v2[4];
> @@ -1129,10 +1147,10 @@ typedef union
>  typedef union
>  {
>      cl_float  CL_ALIGNED(64) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_float  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_float  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_float8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_float  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_float  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_float8 lo, hi; };
>  #endif
>  #if defined( __CL_FLOAT2__) 
>      __cl_float2     v2[8];
> @@ -1153,10 +1171,10 @@ typedef union
>  typedef union
>  {
>      cl_double  CL_ALIGNED(16) s[2];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_double  x, y; };
> -   __extension__ struct{ cl_double s0, s1; };
> -   __extension__ struct{ cl_double lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_double  x, y; };
> +   __CL_ANON_STRUCT__ struct{ cl_double s0, s1; };
> +   __CL_ANON_STRUCT__ struct{ cl_double lo, hi; };
>  #endif
>  #if defined( __CL_DOUBLE2__) 
>      __cl_double2     v2;
> @@ -1166,10 +1184,10 @@ typedef union
>  typedef union
>  {
>      cl_double  CL_ALIGNED(32) s[4];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_double  x, y, z, w; };
> -   __extension__ struct{ cl_double  s0, s1, s2, s3; };
> -   __extension__ struct{ cl_double2 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_double  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_double  s0, s1, s2, s3; };
> +   __CL_ANON_STRUCT__ struct{ cl_double2 lo, hi; };
>  #endif
>  #if defined( __CL_DOUBLE2__) 
>      __cl_double2     v2[2];
> @@ -1185,10 +1203,10 @@ typedef  cl_double4  cl_double3;
>  typedef union
>  {
>      cl_double   CL_ALIGNED(64) s[8];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_double  x, y, z, w; };
> -   __extension__ struct{ cl_double  s0, s1, s2, s3, s4, s5, s6, s7; };
> -   __extension__ struct{ cl_double4 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_double  x, y, z, w; };
> +   __CL_ANON_STRUCT__ struct{ cl_double  s0, s1, s2, s3, s4, s5, s6, s7; };
> +   __CL_ANON_STRUCT__ struct{ cl_double4 lo, hi; };
>  #endif
>  #if defined( __CL_DOUBLE2__) 
>      __cl_double2     v2[4];
> @@ -1204,10 +1222,10 @@ typedef union
>  typedef union
>  {
>      cl_double  CL_ALIGNED(128) s[16];
> -#if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
> -   __extension__ struct{ cl_double  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> -   __extension__ struct{ cl_double  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> -   __extension__ struct{ cl_double8 lo, hi; };
> +#if __CL_HAS_ANON_STRUCT__
> +   __CL_ANON_STRUCT__ struct{ cl_double  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
> +   __CL_ANON_STRUCT__ struct{ cl_double  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
> +   __CL_ANON_STRUCT__ struct{ cl_double8 lo, hi; };
>  #endif
>  #if defined( __CL_DOUBLE2__) 
>      __cl_double2     v2[8];
> @@ -1251,4 +1269,10 @@ typedef union
>  }
>  #endif
>  
> +#undef __CL_HAS_ANON_STRUCT__
> +#undef __CL_ANON_STRUCT__
> +#if defined( _WIN32) && (_MSC_VER >= 1500)
> +#pragma warning( pop )
> +#endif
> +
>  #endif  /* __CL_PLATFORM_H  */
> -- 
> 1.8.3.2
> 

> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet



More information about the Beignet mailing list