Image Component Library (ICL)
|
00001 /******************************************************************** 00002 ** Image Component Library (ICL) ** 00003 ** ** 00004 ** Copyright (C) 2006-2013 CITEC, University of Bielefeld ** 00005 ** Neuroinformatics Group ** 00006 ** Website: www.iclcv.org and ** 00007 ** http://opensource.cit-ec.de/projects/icl ** 00008 ** ** 00009 ** File : ICLUtils/src/ICLUtils/CLKernel.h ** 00010 ** Module : ICLUtils ** 00011 ** Authors: Viktor Losing ** 00012 ** ** 00013 ** ** 00014 ** GNU LESSER GENERAL PUBLIC LICENSE ** 00015 ** This file may be used under the terms of the GNU Lesser General ** 00016 ** Public License version 3.0 as published by the ** 00017 ** ** 00018 ** Free Software Foundation and appearing in the file LICENSE.GPL ** 00019 ** included in the packaging of this file. Please review the ** 00020 ** following information to ensure the license requirements will ** 00021 ** be met: http://www.gnu.org/licenses/lgpl-3.0.txt ** 00022 ** ** 00023 ** The development of this software was supported by the ** 00024 ** Excellence Cluster EXC 277 Cognitive Interaction Technology. ** 00025 ** The Excellence Cluster EXC 277 is a grant of the Deutsche ** 00026 ** Forschungsgemeinschaft (DFG) in the context of the German ** 00027 ** Excellence Initiative. ** 00028 ** ** 00029 ********************************************************************/ 00030 00031 #pragma once 00032 00033 #ifdef ICL_HAVE_OPENCL 00034 00035 #include <ICLUtils/CompatMacros.h> 00036 #include <ICLUtils/CLBuffer.h> 00037 #include <ICLUtils/CLImage2D.h> 00038 #include <ICLUtils/CLException.h> 00039 #include <ICLUtils/FixedArray.h> 00040 #include <string> 00041 00043 namespace cl{ 00044 class CommandQueue; 00045 class Program; 00046 } 00049 namespace icl { 00050 namespace utils { 00052 00072 class ICLUtils_API CLKernel { 00073 struct Impl; 00074 Impl *impl; 00075 00077 CLKernel(const string &id, cl::Program & program, 00078 cl::CommandQueue& cmdQueue) throw (CLKernelException); 00079 00080 public: 00081 00083 struct LocalMemory { 00084 size_t size; 00085 00087 LocalMemory(size_t size) : size(size) { } 00088 }; 00089 00091 CLKernel(); 00092 00094 CLKernel(const CLKernel &other); 00095 00097 CLKernel const& operator=(CLKernel const& other); 00098 00100 ~CLKernel(); 00101 00103 00104 void apply(int gloW, int gloH = 0, int gloC = 0, 00105 int locW = 0, int locH = 0, int locC = 0) throw (CLKernelException); 00106 00107 00109 friend class CLProgram; 00110 00112 void setArg(const unsigned idx, const unsigned int &value) throw (CLKernelException); 00113 00115 void setArg(const unsigned idx, const int &value) throw (CLKernelException); 00116 00118 void setArg(const unsigned idx, const short &value) throw (CLKernelException); 00119 00121 void setArg(const unsigned idx, const long &value) throw (CLKernelException); 00122 00124 void setArg(const unsigned idx, const unsigned long &value) throw (CLKernelException); 00125 00127 void setArg(const unsigned idx, const float &value) throw (CLKernelException); 00128 00130 void setArg(const unsigned idx, const double &value) throw (CLKernelException); 00131 00133 void setArg(const unsigned idx, const char &value) throw (CLKernelException); 00134 00136 void setArg(const unsigned idx, const unsigned char &value) throw (CLKernelException); 00137 00139 void setArg(const unsigned idx, const FixedArray<float,4> &value) throw (CLKernelException); 00140 00142 void setArg(const unsigned idx, const FixedArray<float,3> &value) throw (CLKernelException); 00143 00145 void setArg(const unsigned idx, const CLBuffer &value) throw (CLKernelException); 00146 00148 void setArg(const unsigned idx, const CLImage2D &value) throw (CLKernelException); 00149 00151 void setArg(const unsigned idx, const LocalMemory &value) throw (CLKernelException); 00152 00154 template<typename A> 00155 void setArgs(const A &value) throw (CLKernelException) { 00156 setArg(0, value); 00157 } 00158 00160 template<typename A, typename B> 00161 void setArgs(const A &valueA, const B &valueB) throw (CLKernelException) { 00162 setArgs(valueA); 00163 setArg(1, valueB); 00164 } 00165 00167 template<typename A, typename B, typename C> 00168 void setArgs(const A &valueA, const B &valueB, const C &valueC) throw (CLKernelException) { 00169 setArgs(valueA, valueB); 00170 setArg(2, valueC); 00171 } 00172 00174 template<typename A, typename B, typename C, typename D> 00175 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD) throw (CLKernelException) { 00176 setArgs(valueA, valueB, valueC); 00177 setArg(3, valueD); 00178 } 00179 00181 template<typename A, typename B, typename C, typename D, typename E> 00182 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00183 const E &valueE) throw (CLKernelException) { 00184 setArgs(valueA, valueB, valueC, valueD); 00185 setArg(4, valueE); 00186 } 00187 00189 template<typename A, typename B, typename C, typename D, typename E, typename F> 00190 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00191 const E &valueE, const F &valueF) throw (CLKernelException) { 00192 setArgs(valueA, valueB, valueC, valueD, valueE); 00193 setArg(5, valueF); 00194 } 00195 00197 template<typename A, typename B, typename C, typename D, typename E, typename F, 00198 typename G> 00199 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00200 const E &valueE, const F &valueF, const G &valueG) 00201 throw (CLKernelException) { 00202 setArgs(valueA, valueB, valueC, valueD, valueE, valueF); 00203 setArg(6, valueG); 00204 } 00205 00207 template<typename A, typename B, typename C, typename D, typename E, typename F, 00208 typename G, typename H> 00209 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00210 const E &valueE, const F &valueF, const G &valueG, const H &valueH) 00211 throw (CLKernelException) { 00212 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG); 00213 setArg(7, valueH); 00214 } 00215 00217 template<typename A, typename B, typename C, typename D, typename E, typename F, 00218 typename G, typename H, typename I> 00219 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00220 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00221 const I &valueI) throw (CLKernelException) { 00222 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH); 00223 setArg(8, valueI); 00224 } 00225 00227 template<typename A, typename B, typename C, typename D, typename E, typename F, 00228 typename G, typename H, typename I, typename J> 00229 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00230 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00231 const I &valueI, const J &valueJ) throw (CLKernelException) { 00232 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI); 00233 setArg(9, valueJ); 00234 } 00235 00237 template<typename A, typename B, typename C, typename D, typename E, typename F, 00238 typename G, typename H, typename I, typename J, typename K> 00239 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00240 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00241 const I &valueI, const J &valueJ, const K &valueK) 00242 throw (CLKernelException) { 00243 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00244 valueJ); 00245 setArg(10, valueK); 00246 } 00248 template<typename A, typename B, typename C, typename D, typename E, typename F, 00249 typename G, typename H, typename I, typename J, typename K, typename L> 00250 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00251 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00252 const I &valueI, const J &valueJ, const K &valueK, const L &valueL) 00253 throw (CLKernelException) { 00254 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00255 valueJ, valueK); 00256 setArg(11, valueL); 00257 } 00258 00260 template<typename A, typename B, typename C, typename D, typename E, typename F, 00261 typename G, typename H, typename I, typename J, typename K, typename L, 00262 typename M> 00263 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00264 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00265 const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 00266 const M &valueM) throw (CLKernelException) { 00267 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00268 valueJ, valueK, valueL); 00269 setArg(12, valueM); 00270 } 00271 00273 template<typename A, typename B, typename C, typename D, typename E, typename F, 00274 typename G, typename H, typename I, typename J, typename K, typename L, 00275 typename M, typename N> 00276 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00277 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00278 const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 00279 const M &valueM, const N &valueN) throw (CLKernelException) { 00280 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00281 valueJ, valueK, valueL, valueM); 00282 setArg(13, valueN); 00283 } 00284 00286 template<typename A, typename B, typename C, typename D, typename E, typename F, 00287 typename G, typename H, typename I, typename J, typename K, typename L, 00288 typename M, typename N, typename O> 00289 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00290 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00291 const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 00292 const M &valueM, const N &valueN, const O &valueO) 00293 throw (CLKernelException) { 00294 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00295 valueJ, valueK, valueL, valueM, valueN); 00296 setArg(14, valueO); 00297 } 00298 00300 template<typename A, typename B, typename C, typename D, typename E, typename F, 00301 typename G, typename H, typename I, typename J, typename K, typename L, 00302 typename M, typename N, typename O, typename P> 00303 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00304 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00305 const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 00306 const M &valueM, const N &valueN, const O &valueO, const P &valueP) 00307 throw (CLKernelException) { 00308 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00309 valueJ, valueK, valueL, valueM, valueN, valueP); 00310 setArg(15, valueP); 00311 } 00312 00314 template<typename A, typename B, typename C, typename D, typename E, typename F, 00315 typename G, typename H, typename I, typename J, typename K, typename L, 00316 typename M, typename N, typename O, typename P, typename Q> 00317 void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 00318 const E &valueE, const F &valueF, const G &valueG, const H &valueH, 00319 const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 00320 const M &valueM, const N &valueN, const O &valueO, const P &valueP, 00321 const Q &valueQ) 00322 throw (CLKernelException) { 00323 setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 00324 valueJ, valueK, valueL, valueM, valueN, valueP, valueQ); 00325 setArg(16, valueQ); 00326 } 00327 00329 struct Arg { 00330 CLKernel &k; 00331 int idx; 00332 00334 Arg(CLKernel &k, int idx):k(k),idx(idx) {} 00335 00337 template<class T> 00338 inline void operator=(const T &t) { 00339 k.setArg(idx,t); 00340 } 00341 }; 00342 00344 inline Arg operator[](int idx) { return Arg(*this,idx); } 00345 00346 }; 00347 } 00348 } 00349 00350 #endif