xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/spir/kernelargs.h (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
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