1*6467f958SSadaf Ebrahimi // 2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc. 3*6467f958SSadaf Ebrahimi // 4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License"); 5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License. 6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at 7*6467f958SSadaf Ebrahimi // 8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0 9*6467f958SSadaf Ebrahimi // 10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software 11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS, 12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and 14*6467f958SSadaf Ebrahimi // limitations under the License. 15*6467f958SSadaf Ebrahimi // 16*6467f958SSadaf Ebrahimi #ifndef __KERNELARGS_H 17*6467f958SSadaf Ebrahimi #define __KERNELARGS_H 18*6467f958SSadaf Ebrahimi 19*6467f958SSadaf Ebrahimi 20*6467f958SSadaf Ebrahimi #ifdef __APPLE__ 21*6467f958SSadaf Ebrahimi #include <OpenCL/opencl.h> 22*6467f958SSadaf Ebrahimi #else 23*6467f958SSadaf Ebrahimi #include <CL/cl.h> 24*6467f958SSadaf Ebrahimi #endif 25*6467f958SSadaf Ebrahimi 26*6467f958SSadaf Ebrahimi #include <assert.h> 27*6467f958SSadaf Ebrahimi 28*6467f958SSadaf Ebrahimi #include <string> 29*6467f958SSadaf Ebrahimi #include <vector> 30*6467f958SSadaf Ebrahimi #include <iostream> 31*6467f958SSadaf Ebrahimi 32*6467f958SSadaf Ebrahimi #include "harness/typeWrappers.h" 33*6467f958SSadaf Ebrahimi 34*6467f958SSadaf Ebrahimi #include "exceptions.h" 35*6467f958SSadaf Ebrahimi 36*6467f958SSadaf Ebrahimi class WorkSizeInfo; 37*6467f958SSadaf Ebrahimi 38*6467f958SSadaf Ebrahimi /** 39*6467f958SSadaf Ebrahimi Represents the single kernel argument information 40*6467f958SSadaf Ebrahimi */ 41*6467f958SSadaf Ebrahimi class KernelArgInfo 42*6467f958SSadaf Ebrahimi { 43*6467f958SSadaf Ebrahimi public: getAddressQualifier()44*6467f958SSadaf Ebrahimi cl_kernel_arg_address_qualifier getAddressQualifier() const { return m_address_qualifier; } getAccessQualifier()45*6467f958SSadaf Ebrahimi cl_kernel_arg_access_qualifier getAccessQualifier() const { return m_access_qualifier; } getTypeQualifier()46*6467f958SSadaf Ebrahimi cl_kernel_arg_type_qualifier getTypeQualifier() const { return m_type_qualifier; } 47*6467f958SSadaf Ebrahimi getAddressQualifierRef()48*6467f958SSadaf Ebrahimi cl_kernel_arg_address_qualifier* getAddressQualifierRef() { return &m_address_qualifier; } getAccessQualifierRef()49*6467f958SSadaf Ebrahimi cl_kernel_arg_access_qualifier* getAccessQualifierRef() { return &m_access_qualifier; } getTypeQualifierRef()50*6467f958SSadaf Ebrahimi cl_kernel_arg_type_qualifier* getTypeQualifierRef() { return &m_type_qualifier; } 51*6467f958SSadaf Ebrahimi setTypeName(const char * name)52*6467f958SSadaf Ebrahimi void setTypeName( const char* name) { m_type.assign(name); } setName(const char * name)53*6467f958SSadaf Ebrahimi void setName( const char* name) { m_name.assign(name); } 54*6467f958SSadaf Ebrahimi getTypeName()55*6467f958SSadaf Ebrahimi std::string getTypeName() const { return m_type; } getName()56*6467f958SSadaf Ebrahimi std::string getName() const { return m_name; } 57*6467f958SSadaf Ebrahimi 58*6467f958SSadaf Ebrahimi bool operator == ( const KernelArgInfo& rhs ) const 59*6467f958SSadaf Ebrahimi { 60*6467f958SSadaf Ebrahimi return !m_name.compare(rhs.m_name) && 61*6467f958SSadaf Ebrahimi !m_type.compare(rhs.m_type) && 62*6467f958SSadaf Ebrahimi m_address_qualifier == rhs.m_address_qualifier && 63*6467f958SSadaf Ebrahimi m_access_qualifier == rhs.m_access_qualifier && 64*6467f958SSadaf Ebrahimi m_type_qualifier == rhs.m_type_qualifier; 65*6467f958SSadaf Ebrahimi } 66*6467f958SSadaf Ebrahimi 67*6467f958SSadaf Ebrahimi bool operator != ( const KernelArgInfo& rhs ) const 68*6467f958SSadaf Ebrahimi { 69*6467f958SSadaf Ebrahimi return !(*this == rhs); 70*6467f958SSadaf Ebrahimi } 71*6467f958SSadaf Ebrahimi 72*6467f958SSadaf Ebrahimi private: 73*6467f958SSadaf Ebrahimi std::string m_name; 74*6467f958SSadaf Ebrahimi std::string m_type; 75*6467f958SSadaf Ebrahimi cl_kernel_arg_address_qualifier m_address_qualifier; 76*6467f958SSadaf Ebrahimi cl_kernel_arg_access_qualifier m_access_qualifier; 77*6467f958SSadaf Ebrahimi cl_kernel_arg_type_qualifier m_type_qualifier; 78*6467f958SSadaf Ebrahimi }; 79*6467f958SSadaf Ebrahimi 80*6467f958SSadaf Ebrahimi /** 81*6467f958SSadaf Ebrahimi Represents the single kernel's argument value. 82*6467f958SSadaf Ebrahimi Responsible for livekeeping of OCL objects. 83*6467f958SSadaf Ebrahimi */ 84*6467f958SSadaf Ebrahimi class KernelArg 85*6467f958SSadaf Ebrahimi { 86*6467f958SSadaf Ebrahimi public: KernelArg(const KernelArgInfo & argInfo,void * buffer,size_t size)87*6467f958SSadaf Ebrahimi KernelArg(const KernelArgInfo& argInfo, void* buffer, size_t size): 88*6467f958SSadaf Ebrahimi m_argInfo(argInfo), 89*6467f958SSadaf Ebrahimi m_buffer(buffer), 90*6467f958SSadaf Ebrahimi m_size(size) 91*6467f958SSadaf Ebrahimi {} 92*6467f958SSadaf Ebrahimi ~KernelArg()93*6467f958SSadaf Ebrahimi virtual ~KernelArg() 94*6467f958SSadaf Ebrahimi { 95*6467f958SSadaf Ebrahimi align_free(m_buffer); 96*6467f958SSadaf Ebrahimi } 97*6467f958SSadaf Ebrahimi getArgSize()98*6467f958SSadaf Ebrahimi virtual size_t getArgSize() const 99*6467f958SSadaf Ebrahimi { 100*6467f958SSadaf Ebrahimi return m_size; 101*6467f958SSadaf Ebrahimi } 102*6467f958SSadaf Ebrahimi getBuffer()103*6467f958SSadaf Ebrahimi virtual const void* getBuffer() const 104*6467f958SSadaf Ebrahimi { 105*6467f958SSadaf Ebrahimi return m_buffer; 106*6467f958SSadaf Ebrahimi } 107*6467f958SSadaf Ebrahimi getArgValue()108*6467f958SSadaf Ebrahimi virtual const void* getArgValue() const 109*6467f958SSadaf Ebrahimi { 110*6467f958SSadaf Ebrahimi return m_buffer; 111*6467f958SSadaf Ebrahimi } 112*6467f958SSadaf Ebrahimi compare(const KernelArg & rhs,float ulps)113*6467f958SSadaf Ebrahimi virtual bool compare( const KernelArg& rhs, float ulps ) const 114*6467f958SSadaf Ebrahimi { 115*6467f958SSadaf Ebrahimi if( m_argInfo != rhs.m_argInfo ) 116*6467f958SSadaf Ebrahimi { 117*6467f958SSadaf Ebrahimi return false; 118*6467f958SSadaf Ebrahimi } 119*6467f958SSadaf Ebrahimi 120*6467f958SSadaf Ebrahimi if( m_size != rhs.m_size) 121*6467f958SSadaf Ebrahimi { 122*6467f958SSadaf Ebrahimi return false; 123*6467f958SSadaf Ebrahimi } 124*6467f958SSadaf Ebrahimi 125*6467f958SSadaf Ebrahimi if( (NULL == m_buffer || NULL == rhs.m_buffer) && m_buffer != rhs.m_buffer ) 126*6467f958SSadaf Ebrahimi { 127*6467f958SSadaf Ebrahimi return false; 128*6467f958SSadaf Ebrahimi } 129*6467f958SSadaf Ebrahimi 130*6467f958SSadaf Ebrahimi //check two NULL buffers case 131*6467f958SSadaf Ebrahimi if( NULL == m_buffer && NULL == rhs.m_buffer ) 132*6467f958SSadaf Ebrahimi { 133*6467f958SSadaf Ebrahimi return true; 134*6467f958SSadaf Ebrahimi } 135*6467f958SSadaf Ebrahimi 136*6467f958SSadaf Ebrahimi bool match = true; 137*6467f958SSadaf Ebrahimi if( memcmp( m_buffer, rhs.m_buffer, m_size) ) 138*6467f958SSadaf Ebrahimi { 139*6467f958SSadaf Ebrahimi std::string typeName = m_argInfo.getTypeName(); 140*6467f958SSadaf Ebrahimi size_t compared = 0; 141*6467f958SSadaf Ebrahimi if (typeName.compare("float*") == 0) 142*6467f958SSadaf Ebrahimi { 143*6467f958SSadaf Ebrahimi while (compared < m_size) 144*6467f958SSadaf Ebrahimi { 145*6467f958SSadaf Ebrahimi float l = *(float*)(((char*)m_buffer)+compared); 146*6467f958SSadaf Ebrahimi float r = *(float*)(((char*)rhs.m_buffer)+compared); 147*6467f958SSadaf Ebrahimi if (fabsf(Ulp_Error(l, r)) > ulps) 148*6467f958SSadaf Ebrahimi { 149*6467f958SSadaf Ebrahimi match = false; 150*6467f958SSadaf Ebrahimi break; 151*6467f958SSadaf Ebrahimi } 152*6467f958SSadaf Ebrahimi compared += sizeof(float); 153*6467f958SSadaf Ebrahimi } 154*6467f958SSadaf Ebrahimi } 155*6467f958SSadaf Ebrahimi else if (typeName.compare("double*") == 0) 156*6467f958SSadaf Ebrahimi { 157*6467f958SSadaf Ebrahimi while (compared < m_size) 158*6467f958SSadaf Ebrahimi { 159*6467f958SSadaf Ebrahimi double l = *(double*)(((char*)m_buffer)+compared); 160*6467f958SSadaf Ebrahimi double r = *(double*)(((char*)rhs.m_buffer)+compared); 161*6467f958SSadaf Ebrahimi if (fabsf(Ulp_Error_Double(l, r)) > ulps) 162*6467f958SSadaf Ebrahimi { 163*6467f958SSadaf Ebrahimi match = false; 164*6467f958SSadaf Ebrahimi break; 165*6467f958SSadaf Ebrahimi } 166*6467f958SSadaf Ebrahimi compared += sizeof(double); 167*6467f958SSadaf Ebrahimi } 168*6467f958SSadaf Ebrahimi } 169*6467f958SSadaf Ebrahimi else 170*6467f958SSadaf Ebrahimi { 171*6467f958SSadaf Ebrahimi while (compared < m_size) 172*6467f958SSadaf Ebrahimi { 173*6467f958SSadaf Ebrahimi if ( *(((char*)m_buffer)+compared) != *(((char*)rhs.m_buffer)+compared) ) 174*6467f958SSadaf Ebrahimi { 175*6467f958SSadaf Ebrahimi match = false; 176*6467f958SSadaf Ebrahimi break; 177*6467f958SSadaf Ebrahimi } 178*6467f958SSadaf Ebrahimi compared++; 179*6467f958SSadaf Ebrahimi } 180*6467f958SSadaf Ebrahimi } 181*6467f958SSadaf Ebrahimi if (!match) 182*6467f958SSadaf Ebrahimi { 183*6467f958SSadaf Ebrahimi std::cerr << std::endl << " difference is at offset " << compared << std::endl; 184*6467f958SSadaf Ebrahimi } 185*6467f958SSadaf Ebrahimi } 186*6467f958SSadaf Ebrahimi 187*6467f958SSadaf Ebrahimi return match; 188*6467f958SSadaf Ebrahimi } 189*6467f958SSadaf Ebrahimi readToHost(cl_command_queue queue)190*6467f958SSadaf Ebrahimi virtual void readToHost(cl_command_queue queue) 191*6467f958SSadaf Ebrahimi { 192*6467f958SSadaf Ebrahimi return; 193*6467f958SSadaf Ebrahimi } 194*6467f958SSadaf Ebrahimi 195*6467f958SSadaf Ebrahimi KernelArg* clone(cl_context context, const WorkSizeInfo& ws, const cl_kernel kernel, const cl_device_id device) const; 196*6467f958SSadaf Ebrahimi 197*6467f958SSadaf Ebrahimi protected: 198*6467f958SSadaf Ebrahimi KernelArgInfo m_argInfo; 199*6467f958SSadaf Ebrahimi void* m_buffer; 200*6467f958SSadaf Ebrahimi size_t m_size; 201*6467f958SSadaf Ebrahimi }; 202*6467f958SSadaf Ebrahimi 203*6467f958SSadaf Ebrahimi class KernelArgSampler:public KernelArg 204*6467f958SSadaf Ebrahimi { 205*6467f958SSadaf Ebrahimi public: KernelArgSampler(cl_context context,cl_bool isNormalized,cl_addressing_mode addressMode,cl_filter_mode filterMode)206*6467f958SSadaf Ebrahimi KernelArgSampler(cl_context context, cl_bool isNormalized, 207*6467f958SSadaf Ebrahimi cl_addressing_mode addressMode, cl_filter_mode filterMode): 208*6467f958SSadaf Ebrahimi KernelArg(KernelArgInfo(), NULL, sizeof(cl_sampler)) 209*6467f958SSadaf Ebrahimi { 210*6467f958SSadaf Ebrahimi m_argInfo.setTypeName("sampler_t"); 211*6467f958SSadaf Ebrahimi int error = CL_SUCCESS; 212*6467f958SSadaf Ebrahimi m_samplerObj = clCreateSampler(context, isNormalized, addressMode, 213*6467f958SSadaf Ebrahimi filterMode, &error); 214*6467f958SSadaf Ebrahimi if( error != CL_SUCCESS ) 215*6467f958SSadaf Ebrahimi { 216*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clCreateSampler failed\n", error); 217*6467f958SSadaf Ebrahimi } 218*6467f958SSadaf Ebrahimi } 219*6467f958SSadaf Ebrahimi ~KernelArgSampler()220*6467f958SSadaf Ebrahimi ~KernelArgSampler() 221*6467f958SSadaf Ebrahimi { 222*6467f958SSadaf Ebrahimi //~clSamplerWrapper() releases the sampler object 223*6467f958SSadaf Ebrahimi } 224*6467f958SSadaf Ebrahimi getArgSize()225*6467f958SSadaf Ebrahimi size_t getArgSize() const 226*6467f958SSadaf Ebrahimi { 227*6467f958SSadaf Ebrahimi return sizeof(cl_sampler); 228*6467f958SSadaf Ebrahimi } 229*6467f958SSadaf Ebrahimi getArgValue()230*6467f958SSadaf Ebrahimi const void* getArgValue() const 231*6467f958SSadaf Ebrahimi { 232*6467f958SSadaf Ebrahimi return &m_samplerObj; 233*6467f958SSadaf Ebrahimi } 234*6467f958SSadaf Ebrahimi compare(const KernelArg & rhs,float)235*6467f958SSadaf Ebrahimi bool compare(const KernelArg& rhs, float) const 236*6467f958SSadaf Ebrahimi { 237*6467f958SSadaf Ebrahimi if (const KernelArgSampler *Rhs = dynamic_cast<const KernelArgSampler*>(&rhs)) 238*6467f958SSadaf Ebrahimi { 239*6467f958SSadaf Ebrahimi return isNormalized() == Rhs->isNormalized() && 240*6467f958SSadaf Ebrahimi getAddressingMode() == Rhs->getAddressingMode() && 241*6467f958SSadaf Ebrahimi getFilterMode() == Rhs->getFilterMode(); 242*6467f958SSadaf Ebrahimi } 243*6467f958SSadaf Ebrahimi return false; 244*6467f958SSadaf Ebrahimi } 245*6467f958SSadaf Ebrahimi getSampler()246*6467f958SSadaf Ebrahimi cl_sampler getSampler() const 247*6467f958SSadaf Ebrahimi { 248*6467f958SSadaf Ebrahimi return (cl_sampler)m_samplerObj; 249*6467f958SSadaf Ebrahimi } 250*6467f958SSadaf Ebrahimi 251*6467f958SSadaf Ebrahimi protected: 252*6467f958SSadaf Ebrahimi mutable clSamplerWrapper m_samplerObj; 253*6467f958SSadaf Ebrahimi isNormalized()254*6467f958SSadaf Ebrahimi cl_bool isNormalized() const 255*6467f958SSadaf Ebrahimi { 256*6467f958SSadaf Ebrahimi cl_bool norm; 257*6467f958SSadaf Ebrahimi cl_int err = clGetSamplerInfo(getSampler(), 258*6467f958SSadaf Ebrahimi CL_SAMPLER_NORMALIZED_COORDS, 259*6467f958SSadaf Ebrahimi sizeof(cl_bool), 260*6467f958SSadaf Ebrahimi &norm, 261*6467f958SSadaf Ebrahimi NULL); 262*6467f958SSadaf Ebrahimi if (CL_SUCCESS != err) 263*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clGetSamplerInfo failed\n", err); 264*6467f958SSadaf Ebrahimi return norm; 265*6467f958SSadaf Ebrahimi } 266*6467f958SSadaf Ebrahimi getAddressingMode()267*6467f958SSadaf Ebrahimi cl_addressing_mode getAddressingMode() const 268*6467f958SSadaf Ebrahimi { 269*6467f958SSadaf Ebrahimi cl_addressing_mode addressingmode; 270*6467f958SSadaf Ebrahimi cl_int err = clGetSamplerInfo(getSampler(), 271*6467f958SSadaf Ebrahimi CL_SAMPLER_ADDRESSING_MODE, 272*6467f958SSadaf Ebrahimi sizeof(cl_addressing_mode), 273*6467f958SSadaf Ebrahimi &addressingmode, 274*6467f958SSadaf Ebrahimi NULL); 275*6467f958SSadaf Ebrahimi if (CL_SUCCESS != err) 276*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clGetSamplerInfo failed\n", err); 277*6467f958SSadaf Ebrahimi return addressingmode; 278*6467f958SSadaf Ebrahimi } 279*6467f958SSadaf Ebrahimi getFilterMode()280*6467f958SSadaf Ebrahimi cl_filter_mode getFilterMode() const 281*6467f958SSadaf Ebrahimi { 282*6467f958SSadaf Ebrahimi cl_filter_mode filtermode; 283*6467f958SSadaf Ebrahimi cl_int err = clGetSamplerInfo(getSampler(), 284*6467f958SSadaf Ebrahimi CL_SAMPLER_FILTER_MODE, 285*6467f958SSadaf Ebrahimi sizeof(cl_filter_mode), 286*6467f958SSadaf Ebrahimi &filtermode, 287*6467f958SSadaf Ebrahimi NULL); 288*6467f958SSadaf Ebrahimi if (CL_SUCCESS != err) 289*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clGetSamplerInfo failed\n", err); 290*6467f958SSadaf Ebrahimi return filtermode; 291*6467f958SSadaf Ebrahimi } 292*6467f958SSadaf Ebrahimi 293*6467f958SSadaf Ebrahimi }; 294*6467f958SSadaf Ebrahimi 295*6467f958SSadaf Ebrahimi 296*6467f958SSadaf Ebrahimi class KernelArgMemObj:public KernelArg 297*6467f958SSadaf Ebrahimi { 298*6467f958SSadaf Ebrahimi public: KernelArgMemObj(const KernelArgInfo & argInfo,void * buffer,size_t size)299*6467f958SSadaf Ebrahimi KernelArgMemObj(const KernelArgInfo& argInfo, void* buffer, size_t size): 300*6467f958SSadaf Ebrahimi KernelArg(argInfo, buffer, size) 301*6467f958SSadaf Ebrahimi { 302*6467f958SSadaf Ebrahimi m_memObj = NULL; 303*6467f958SSadaf Ebrahimi } 304*6467f958SSadaf Ebrahimi ~KernelArgMemObj()305*6467f958SSadaf Ebrahimi ~KernelArgMemObj() 306*6467f958SSadaf Ebrahimi { 307*6467f958SSadaf Ebrahimi //~clMemWrapper() releases the memory object 308*6467f958SSadaf Ebrahimi } 309*6467f958SSadaf Ebrahimi 310*6467f958SSadaf Ebrahimi virtual void readToHost(cl_command_queue queue) = 0; 311*6467f958SSadaf Ebrahimi 312*6467f958SSadaf Ebrahimi getArgSize()313*6467f958SSadaf Ebrahimi size_t getArgSize() const 314*6467f958SSadaf Ebrahimi { 315*6467f958SSadaf Ebrahimi if( NULL == m_buffer ) 316*6467f958SSadaf Ebrahimi return m_size; // local buffer 317*6467f958SSadaf Ebrahimi else 318*6467f958SSadaf Ebrahimi return sizeof(cl_mem); 319*6467f958SSadaf Ebrahimi } 320*6467f958SSadaf Ebrahimi getArgValue()321*6467f958SSadaf Ebrahimi const void* getArgValue() const 322*6467f958SSadaf Ebrahimi { 323*6467f958SSadaf Ebrahimi if( NULL == m_buffer ) 324*6467f958SSadaf Ebrahimi { 325*6467f958SSadaf Ebrahimi return NULL; // local buffer 326*6467f958SSadaf Ebrahimi } 327*6467f958SSadaf Ebrahimi else { 328*6467f958SSadaf Ebrahimi clMemWrapper* p = const_cast<clMemWrapper*>(&m_memObj); 329*6467f958SSadaf Ebrahimi 330*6467f958SSadaf Ebrahimi return (const void*)(&(*p)); 331*6467f958SSadaf Ebrahimi } 332*6467f958SSadaf Ebrahimi } 333*6467f958SSadaf Ebrahimi 334*6467f958SSadaf Ebrahimi protected: 335*6467f958SSadaf Ebrahimi clMemWrapper m_memObj; 336*6467f958SSadaf Ebrahimi }; 337*6467f958SSadaf Ebrahimi 338*6467f958SSadaf Ebrahimi /** 339*6467f958SSadaf Ebrahimi Represents the single kernel's argument value. 340*6467f958SSadaf Ebrahimi Responsible for livekeeping of OCL objects. 341*6467f958SSadaf Ebrahimi */ 342*6467f958SSadaf Ebrahimi class KernelArgBuffer:public KernelArgMemObj 343*6467f958SSadaf Ebrahimi { 344*6467f958SSadaf Ebrahimi public: KernelArgBuffer(cl_context context,const KernelArgInfo & argInfo,void * buffer,size_t size)345*6467f958SSadaf Ebrahimi KernelArgBuffer(cl_context context, const KernelArgInfo& argInfo, void* buffer, size_t size): 346*6467f958SSadaf Ebrahimi KernelArgMemObj(argInfo, buffer, size) 347*6467f958SSadaf Ebrahimi { 348*6467f958SSadaf Ebrahimi if( NULL != buffer ) 349*6467f958SSadaf Ebrahimi { 350*6467f958SSadaf Ebrahimi int error = CL_SUCCESS; 351*6467f958SSadaf Ebrahimi m_memObj = clCreateBuffer(context, 352*6467f958SSadaf Ebrahimi CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, 353*6467f958SSadaf Ebrahimi size, buffer, &error); 354*6467f958SSadaf Ebrahimi if( error != CL_SUCCESS ) 355*6467f958SSadaf Ebrahimi { 356*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clCreateBuffer failed\n", error); 357*6467f958SSadaf Ebrahimi } 358*6467f958SSadaf Ebrahimi } 359*6467f958SSadaf Ebrahimi } 360*6467f958SSadaf Ebrahimi readToHost(cl_command_queue queue)361*6467f958SSadaf Ebrahimi void readToHost(cl_command_queue queue) 362*6467f958SSadaf Ebrahimi { 363*6467f958SSadaf Ebrahimi if( NULL == m_buffer ) 364*6467f958SSadaf Ebrahimi { 365*6467f958SSadaf Ebrahimi return; 366*6467f958SSadaf Ebrahimi } 367*6467f958SSadaf Ebrahimi 368*6467f958SSadaf Ebrahimi int error = clEnqueueReadBuffer( queue, m_memObj, CL_TRUE, 0, m_size, m_buffer, 0, NULL, NULL); 369*6467f958SSadaf Ebrahimi if( error != CL_SUCCESS ) 370*6467f958SSadaf Ebrahimi { 371*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clEnqueueReadBuffer failed\n", error); 372*6467f958SSadaf Ebrahimi } 373*6467f958SSadaf Ebrahimi } 374*6467f958SSadaf Ebrahimi }; 375*6467f958SSadaf Ebrahimi 376*6467f958SSadaf Ebrahimi class KernelArgImage:public KernelArgMemObj 377*6467f958SSadaf Ebrahimi { 378*6467f958SSadaf Ebrahimi public: KernelArgImage(cl_context context,const KernelArgInfo & argInfo,void * buffer,size_t size,cl_mem_flags flags,cl_image_format format,cl_image_desc desc)379*6467f958SSadaf Ebrahimi KernelArgImage(cl_context context, const KernelArgInfo& argInfo, 380*6467f958SSadaf Ebrahimi void* buffer, size_t size, cl_mem_flags flags, 381*6467f958SSadaf Ebrahimi cl_image_format format, cl_image_desc desc): 382*6467f958SSadaf Ebrahimi KernelArgMemObj(argInfo, buffer, size), m_desc(desc) 383*6467f958SSadaf Ebrahimi { 384*6467f958SSadaf Ebrahimi if( NULL != buffer ) 385*6467f958SSadaf Ebrahimi { 386*6467f958SSadaf Ebrahimi int error = CL_SUCCESS; 387*6467f958SSadaf Ebrahimi flags |= CL_MEM_COPY_HOST_PTR ; 388*6467f958SSadaf Ebrahimi if (CL_MEM_OBJECT_IMAGE1D_BUFFER == m_desc.image_type) 389*6467f958SSadaf Ebrahimi { 390*6467f958SSadaf Ebrahimi m_desc.buffer = clCreateBuffer( context, flags, m_desc.image_row_pitch, buffer, &error ); 391*6467f958SSadaf Ebrahimi if( error != CL_SUCCESS ) 392*6467f958SSadaf Ebrahimi { 393*6467f958SSadaf Ebrahimi throw Exceptions::TestError("KernelArgImage clCreateBuffer failed\n", error); 394*6467f958SSadaf Ebrahimi } 395*6467f958SSadaf Ebrahimi buffer = NULL; 396*6467f958SSadaf Ebrahimi flags &= ~CL_MEM_COPY_HOST_PTR; 397*6467f958SSadaf Ebrahimi m_desc.image_row_pitch = 0; 398*6467f958SSadaf Ebrahimi m_desc.image_slice_pitch = 0; 399*6467f958SSadaf Ebrahimi } 400*6467f958SSadaf Ebrahimi m_memObj = clCreateImage( context, flags, &format, &m_desc, buffer, &error ); 401*6467f958SSadaf Ebrahimi if( error != CL_SUCCESS ) 402*6467f958SSadaf Ebrahimi { 403*6467f958SSadaf Ebrahimi throw Exceptions::TestError("KernelArgImage clCreateImage failed\n", error); 404*6467f958SSadaf Ebrahimi } 405*6467f958SSadaf Ebrahimi } 406*6467f958SSadaf Ebrahimi } 407*6467f958SSadaf Ebrahimi ~KernelArgImage()408*6467f958SSadaf Ebrahimi ~KernelArgImage() 409*6467f958SSadaf Ebrahimi { 410*6467f958SSadaf Ebrahimi if (CL_MEM_OBJECT_IMAGE1D_BUFFER == m_desc.image_type) 411*6467f958SSadaf Ebrahimi { 412*6467f958SSadaf Ebrahimi clReleaseMemObject(m_desc.buffer); 413*6467f958SSadaf Ebrahimi } 414*6467f958SSadaf Ebrahimi } 415*6467f958SSadaf Ebrahimi readToHost(cl_command_queue queue)416*6467f958SSadaf Ebrahimi void readToHost(cl_command_queue queue) 417*6467f958SSadaf Ebrahimi { 418*6467f958SSadaf Ebrahimi if( NULL == m_buffer ) 419*6467f958SSadaf Ebrahimi { 420*6467f958SSadaf Ebrahimi return; 421*6467f958SSadaf Ebrahimi } 422*6467f958SSadaf Ebrahimi 423*6467f958SSadaf Ebrahimi size_t origin[3] = {0, 0, 0}; 424*6467f958SSadaf Ebrahimi size_t region[3] = {m_desc.image_width , m_desc.image_height , m_desc.image_depth}; 425*6467f958SSadaf Ebrahimi 426*6467f958SSadaf Ebrahimi int error = clEnqueueReadImage (queue, m_memObj, CL_TRUE, origin, region, m_desc.image_row_pitch, m_desc.image_slice_pitch, m_buffer, 0, NULL, NULL); 427*6467f958SSadaf Ebrahimi 428*6467f958SSadaf Ebrahimi if( error != CL_SUCCESS ) 429*6467f958SSadaf Ebrahimi { 430*6467f958SSadaf Ebrahimi throw Exceptions::TestError("clEnqueueReadImage failed\n", error); 431*6467f958SSadaf Ebrahimi } 432*6467f958SSadaf Ebrahimi } 433*6467f958SSadaf Ebrahimi 434*6467f958SSadaf Ebrahimi private: 435*6467f958SSadaf Ebrahimi cl_image_desc m_desc; 436*6467f958SSadaf Ebrahimi }; 437*6467f958SSadaf Ebrahimi 438*6467f958SSadaf Ebrahimi /** 439*6467f958SSadaf Ebrahimi Represents the container for the kernel parameters 440*6467f958SSadaf Ebrahimi */ 441*6467f958SSadaf Ebrahimi class KernelArgs 442*6467f958SSadaf Ebrahimi { 443*6467f958SSadaf Ebrahimi typedef std::vector<KernelArg*> KernelsArgsVector; 444*6467f958SSadaf Ebrahimi public: KernelArgs()445*6467f958SSadaf Ebrahimi KernelArgs(){} ~KernelArgs()446*6467f958SSadaf Ebrahimi ~KernelArgs() 447*6467f958SSadaf Ebrahimi { 448*6467f958SSadaf Ebrahimi KernelsArgsVector::iterator i = m_args.begin(); 449*6467f958SSadaf Ebrahimi KernelsArgsVector::iterator e = m_args.end(); 450*6467f958SSadaf Ebrahimi 451*6467f958SSadaf Ebrahimi for( ; i != e; ++i ) 452*6467f958SSadaf Ebrahimi { 453*6467f958SSadaf Ebrahimi assert( NULL != *i ); 454*6467f958SSadaf Ebrahimi delete *i; 455*6467f958SSadaf Ebrahimi } 456*6467f958SSadaf Ebrahimi } 457*6467f958SSadaf Ebrahimi readToHost(cl_command_queue queue)458*6467f958SSadaf Ebrahimi void readToHost(cl_command_queue queue) 459*6467f958SSadaf Ebrahimi { 460*6467f958SSadaf Ebrahimi KernelsArgsVector::iterator i = m_args.begin(); 461*6467f958SSadaf Ebrahimi KernelsArgsVector::iterator e = m_args.end(); 462*6467f958SSadaf Ebrahimi 463*6467f958SSadaf Ebrahimi for( ; i != e; ++i ) 464*6467f958SSadaf Ebrahimi { 465*6467f958SSadaf Ebrahimi (*i)->readToHost(queue); 466*6467f958SSadaf Ebrahimi } 467*6467f958SSadaf Ebrahimi } 468*6467f958SSadaf Ebrahimi getArgCount()469*6467f958SSadaf Ebrahimi size_t getArgCount() const { return m_args.size(); } 470*6467f958SSadaf Ebrahimi getArg(size_t index)471*6467f958SSadaf Ebrahimi KernelArg* getArg(size_t index ) { return m_args[index]; } 472*6467f958SSadaf Ebrahimi getArg(size_t index)473*6467f958SSadaf Ebrahimi const KernelArg* getArg(size_t index) const { return m_args[index]; } 474*6467f958SSadaf Ebrahimi addArg(KernelArg * arg)475*6467f958SSadaf Ebrahimi void addArg( KernelArg* arg ) { m_args.push_back(arg); } 476*6467f958SSadaf Ebrahimi 477*6467f958SSadaf Ebrahimi private: 478*6467f958SSadaf Ebrahimi KernelsArgsVector m_args; 479*6467f958SSadaf Ebrahimi }; 480*6467f958SSadaf Ebrahimi 481*6467f958SSadaf Ebrahimi #endif 482