1 //---------------------------------------------------------------------------// 2 // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com> 3 // 4 // Distributed under the Boost Software License, Version 1.0 5 // See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt 7 // 8 // See http://boostorg.github.com/compute for more information. 9 //---------------------------------------------------------------------------// 10 11 #ifndef BOOST_COMPUTE_PIPE_HPP 12 #define BOOST_COMPUTE_PIPE_HPP 13 14 #include <boost/compute/cl.hpp> 15 #include <boost/compute/context.hpp> 16 #include <boost/compute/memory_object.hpp> 17 #include <boost/compute/exception/opencl_error.hpp> 18 #include <boost/compute/detail/get_object_info.hpp> 19 20 // pipe objects require opencl 2.0 21 #if defined(BOOST_COMPUTE_CL_VERSION_2_0) || defined(BOOST_COMPUTE_DOXYGEN_INVOKED) 22 23 namespace boost { 24 namespace compute { 25 26 /// \class pipe 27 /// \brief A FIFO data pipe 28 /// 29 /// \opencl_version_warning{2,0} 30 /// 31 /// \see memory_object 32 class pipe : public memory_object 33 { 34 public: 35 /// Creates a null pipe object. pipe()36 pipe() 37 : memory_object() 38 { 39 } 40 41 /// Creates a pipe object for \p mem. If \p retain is \c true, the 42 /// reference count for \p mem will be incremented. pipe(cl_mem mem,bool retain=true)43 explicit pipe(cl_mem mem, bool retain = true) 44 : memory_object(mem, retain) 45 { 46 } 47 48 /// Creates a new pipe in \p context. pipe(const context & context,uint_ pipe_packet_size,uint_ pipe_max_packets,cl_mem_flags flags=read_write,const cl_pipe_properties * properties=0)49 pipe(const context &context, 50 uint_ pipe_packet_size, 51 uint_ pipe_max_packets, 52 cl_mem_flags flags = read_write, 53 const cl_pipe_properties *properties = 0) 54 { 55 cl_int error = 0; 56 m_mem = clCreatePipe(context, 57 flags, 58 pipe_packet_size, 59 pipe_max_packets, 60 properties, 61 &error); 62 if(!m_mem){ 63 BOOST_THROW_EXCEPTION(opencl_error(error)); 64 } 65 } 66 67 /// Creates a new pipe object as a copy of \p other. pipe(const pipe & other)68 pipe(const pipe &other) 69 : memory_object(other) 70 { 71 } 72 73 /// Copies the pipe object from \p other to \c *this. operator =(const pipe & other)74 pipe& operator=(const pipe &other) 75 { 76 if(this != &other){ 77 memory_object::operator=(other); 78 } 79 80 return *this; 81 } 82 83 #ifndef BOOST_COMPUTE_NO_RVALUE_REFERENCES 84 /// Move-constructs a new pipe object from \p other. pipe(pipe && other)85 pipe(pipe&& other) BOOST_NOEXCEPT 86 : memory_object(std::move(other)) 87 { 88 } 89 90 /// Move-assigns the pipe from \p other to \c *this. operator =(pipe && other)91 pipe& operator=(pipe&& other) BOOST_NOEXCEPT 92 { 93 memory_object::operator=(std::move(other)); 94 95 return *this; 96 } 97 #endif // BOOST_COMPUTE_NO_RVALUE_REFERENCES 98 99 /// Destroys the pipe object. ~pipe()100 ~pipe() 101 { 102 } 103 104 /// Returns the packet size. packet_size() const105 uint_ packet_size() const 106 { 107 return get_info<uint_>(CL_PIPE_PACKET_SIZE); 108 } 109 110 /// Returns the max number of packets. max_packets() const111 uint_ max_packets() const 112 { 113 return get_info<uint_>(CL_PIPE_MAX_PACKETS); 114 } 115 116 /// Returns information about the pipe. 117 /// 118 /// \see_opencl2_ref{clGetPipeInfo} 119 template<class T> get_info(cl_pipe_info info) const120 T get_info(cl_pipe_info info) const 121 { 122 return detail::get_object_info<T>(clGetPipeInfo, m_mem, info); 123 } 124 125 /// \overload 126 template<int Enum> 127 typename detail::get_object_info_type<pipe, Enum>::type get_info() const; 128 }; 129 130 /// \internal_ define get_info() specializations for pipe 131 BOOST_COMPUTE_DETAIL_DEFINE_GET_INFO_SPECIALIZATIONS(pipe, 132 ((cl_uint, CL_PIPE_PACKET_SIZE)) 133 ((cl_uint, CL_PIPE_MAX_PACKETS)) 134 ) 135 136 namespace detail { 137 138 // set_kernel_arg specialization for pipe 139 template<> 140 struct set_kernel_arg<pipe> 141 { operator ()boost::compute::detail::set_kernel_arg142 void operator()(kernel &kernel_, size_t index, const pipe &pipe_) 143 { 144 kernel_.set_arg(index, pipe_.get()); 145 } 146 }; 147 148 } // end detail namespace 149 } // end compute namespace 150 } // end boost namespace 151 152 #endif // BOOST_COMPUTE_CL_VERSION_2_0 153 154 #endif // BOOST_COMPUTE_PIPE_HPP 155