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 #include "testBase.h"
17*6467f958SSadaf Ebrahimi
18*6467f958SSadaf Ebrahimi #include "gl_headers.h"
19*6467f958SSadaf Ebrahimi
get_kernel_suffix(cl_image_format * format)20*6467f958SSadaf Ebrahimi const char *get_kernel_suffix( cl_image_format *format )
21*6467f958SSadaf Ebrahimi {
22*6467f958SSadaf Ebrahimi switch( format->image_channel_data_type )
23*6467f958SSadaf Ebrahimi {
24*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
25*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
26*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
27*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
28*6467f958SSadaf Ebrahimi case CL_FLOAT:
29*6467f958SSadaf Ebrahimi return "f";
30*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
31*6467f958SSadaf Ebrahimi return "h";
32*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
33*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
34*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32:
35*6467f958SSadaf Ebrahimi return "i";
36*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
37*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
38*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32:
39*6467f958SSadaf Ebrahimi return "ui";
40*6467f958SSadaf Ebrahimi default:
41*6467f958SSadaf Ebrahimi return "";
42*6467f958SSadaf Ebrahimi }
43*6467f958SSadaf Ebrahimi }
44*6467f958SSadaf Ebrahimi
get_read_kernel_type(cl_image_format * format)45*6467f958SSadaf Ebrahimi ExplicitType get_read_kernel_type( cl_image_format *format )
46*6467f958SSadaf Ebrahimi {
47*6467f958SSadaf Ebrahimi switch( format->image_channel_data_type )
48*6467f958SSadaf Ebrahimi {
49*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
50*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
51*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
52*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
53*6467f958SSadaf Ebrahimi case CL_FLOAT:
54*6467f958SSadaf Ebrahimi return kFloat;
55*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
56*6467f958SSadaf Ebrahimi return kHalf;
57*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
58*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
59*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32:
60*6467f958SSadaf Ebrahimi return kInt;
61*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
62*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
63*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32:
64*6467f958SSadaf Ebrahimi return kUInt;
65*6467f958SSadaf Ebrahimi default:
66*6467f958SSadaf Ebrahimi return kInt;
67*6467f958SSadaf Ebrahimi }
68*6467f958SSadaf Ebrahimi }
69*6467f958SSadaf Ebrahimi
get_write_kernel_type(cl_image_format * format)70*6467f958SSadaf Ebrahimi ExplicitType get_write_kernel_type( cl_image_format *format )
71*6467f958SSadaf Ebrahimi {
72*6467f958SSadaf Ebrahimi switch( format->image_channel_data_type )
73*6467f958SSadaf Ebrahimi {
74*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
75*6467f958SSadaf Ebrahimi return kFloat;
76*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
77*6467f958SSadaf Ebrahimi return kFloat;
78*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
79*6467f958SSadaf Ebrahimi return kFloat;
80*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
81*6467f958SSadaf Ebrahimi return kFloat;
82*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
83*6467f958SSadaf Ebrahimi return kHalf;
84*6467f958SSadaf Ebrahimi case CL_FLOAT:
85*6467f958SSadaf Ebrahimi return kFloat;
86*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
87*6467f958SSadaf Ebrahimi return kChar;
88*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
89*6467f958SSadaf Ebrahimi return kShort;
90*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32:
91*6467f958SSadaf Ebrahimi return kInt;
92*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
93*6467f958SSadaf Ebrahimi return kUChar;
94*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
95*6467f958SSadaf Ebrahimi return kUShort;
96*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32:
97*6467f958SSadaf Ebrahimi return kUInt;
98*6467f958SSadaf Ebrahimi default:
99*6467f958SSadaf Ebrahimi return kInt;
100*6467f958SSadaf Ebrahimi }
101*6467f958SSadaf Ebrahimi }
102*6467f958SSadaf Ebrahimi
get_write_conversion(cl_image_format * format,ExplicitType type)103*6467f958SSadaf Ebrahimi const char* get_write_conversion( cl_image_format *format, ExplicitType type )
104*6467f958SSadaf Ebrahimi {
105*6467f958SSadaf Ebrahimi switch( format->image_channel_data_type )
106*6467f958SSadaf Ebrahimi {
107*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
108*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
109*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
110*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
111*6467f958SSadaf Ebrahimi case CL_FLOAT:
112*6467f958SSadaf Ebrahimi if(type != kFloat) return "convert_float4";
113*6467f958SSadaf Ebrahimi break;
114*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
115*6467f958SSadaf Ebrahimi break;
116*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
117*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
118*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32:
119*6467f958SSadaf Ebrahimi if(type != kInt) return "convert_int4";
120*6467f958SSadaf Ebrahimi break;
121*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
122*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
123*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32:
124*6467f958SSadaf Ebrahimi if(type != kUInt) return "convert_uint4";
125*6467f958SSadaf Ebrahimi break;
126*6467f958SSadaf Ebrahimi default:
127*6467f958SSadaf Ebrahimi return "";
128*6467f958SSadaf Ebrahimi }
129*6467f958SSadaf Ebrahimi return "";
130*6467f958SSadaf Ebrahimi }
131*6467f958SSadaf Ebrahimi
132*6467f958SSadaf Ebrahimi // The only three input types to this function are kInt, kUInt and kFloat, due to the way we set up our tests
133*6467f958SSadaf Ebrahimi // The output types, though, are pretty much anything valid for GL to receive
134*6467f958SSadaf Ebrahimi
135*6467f958SSadaf Ebrahimi #define DOWNSCALE_INTEGER_CASE( enum, type, bitShift ) \
136*6467f958SSadaf Ebrahimi case enum: \
137*6467f958SSadaf Ebrahimi { \
138*6467f958SSadaf Ebrahimi cl_##type *dst = new cl_##type[ numPixels * 4 ]; \
139*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ ) \
140*6467f958SSadaf Ebrahimi dst[ i ] = src[ i ]; \
141*6467f958SSadaf Ebrahimi return (char *)dst; \
142*6467f958SSadaf Ebrahimi }
143*6467f958SSadaf Ebrahimi
144*6467f958SSadaf Ebrahimi #define UPSCALE_FLOAT_CASE( enum, type, typeMax ) \
145*6467f958SSadaf Ebrahimi case enum: \
146*6467f958SSadaf Ebrahimi { \
147*6467f958SSadaf Ebrahimi cl_##type *dst = new cl_##type[ numPixels * 4 ]; \
148*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ ) \
149*6467f958SSadaf Ebrahimi dst[ i ] = (cl_##type)( src[ i ] * typeMax ); \
150*6467f958SSadaf Ebrahimi return (char *)dst; \
151*6467f958SSadaf Ebrahimi }
152*6467f958SSadaf Ebrahimi
convert_to_expected(void * inputBuffer,size_t numPixels,ExplicitType inType,ExplicitType outType)153*6467f958SSadaf Ebrahimi char * convert_to_expected( void * inputBuffer, size_t numPixels, ExplicitType inType, ExplicitType outType )
154*6467f958SSadaf Ebrahimi {
155*6467f958SSadaf Ebrahimi #ifdef GLES_DEBUG
156*6467f958SSadaf Ebrahimi log_info( "- Converting from input type '%s' to output type '%s'\n",
157*6467f958SSadaf Ebrahimi get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
158*6467f958SSadaf Ebrahimi #endif
159*6467f958SSadaf Ebrahimi
160*6467f958SSadaf Ebrahimi if( inType == outType )
161*6467f958SSadaf Ebrahimi {
162*6467f958SSadaf Ebrahimi char *outData = new char[ numPixels * 4 * get_explicit_type_size(outType) ] ; // sizeof( cl_int ) ];
163*6467f958SSadaf Ebrahimi memcpy( outData, inputBuffer, numPixels * 4 * get_explicit_type_size(inType) );
164*6467f958SSadaf Ebrahimi return outData;
165*6467f958SSadaf Ebrahimi }
166*6467f958SSadaf Ebrahimi else if( inType == kChar )
167*6467f958SSadaf Ebrahimi {
168*6467f958SSadaf Ebrahimi cl_char *src = (cl_char *)inputBuffer;
169*6467f958SSadaf Ebrahimi
170*6467f958SSadaf Ebrahimi switch( outType )
171*6467f958SSadaf Ebrahimi {
172*6467f958SSadaf Ebrahimi case kInt:
173*6467f958SSadaf Ebrahimi {
174*6467f958SSadaf Ebrahimi cl_int *outData = new cl_int[ numPixels * 4 ];
175*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
176*6467f958SSadaf Ebrahimi {
177*6467f958SSadaf Ebrahimi outData[ i ] = (cl_int)((src[ i ]));
178*6467f958SSadaf Ebrahimi }
179*6467f958SSadaf Ebrahimi return (char *)outData;
180*6467f958SSadaf Ebrahimi }
181*6467f958SSadaf Ebrahimi case kFloat:
182*6467f958SSadaf Ebrahimi {
183*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should be normalized
184*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[ numPixels * 4 ];
185*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
186*6467f958SSadaf Ebrahimi {
187*6467f958SSadaf Ebrahimi outData[ i ] = (cl_float)src[ i ] / 127.0f;
188*6467f958SSadaf Ebrahimi }
189*6467f958SSadaf Ebrahimi return (char *)outData;
190*6467f958SSadaf Ebrahimi }
191*6467f958SSadaf Ebrahimi default:
192*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
193*6467f958SSadaf Ebrahimi return NULL;
194*6467f958SSadaf Ebrahimi }
195*6467f958SSadaf Ebrahimi }
196*6467f958SSadaf Ebrahimi else if( inType == kUChar )
197*6467f958SSadaf Ebrahimi {
198*6467f958SSadaf Ebrahimi cl_uchar *src = (cl_uchar *)inputBuffer;
199*6467f958SSadaf Ebrahimi
200*6467f958SSadaf Ebrahimi switch( outType )
201*6467f958SSadaf Ebrahimi {
202*6467f958SSadaf Ebrahimi case kUInt:
203*6467f958SSadaf Ebrahimi {
204*6467f958SSadaf Ebrahimi cl_uint *outData = new cl_uint[ numPixels * 4 ];
205*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
206*6467f958SSadaf Ebrahimi {
207*6467f958SSadaf Ebrahimi outData[ i ] = (cl_uint)((src[ i ]));
208*6467f958SSadaf Ebrahimi }
209*6467f958SSadaf Ebrahimi return (char *)outData;
210*6467f958SSadaf Ebrahimi }
211*6467f958SSadaf Ebrahimi case kFloat:
212*6467f958SSadaf Ebrahimi {
213*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should be normalized
214*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[ numPixels * 4 ];
215*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
216*6467f958SSadaf Ebrahimi {
217*6467f958SSadaf Ebrahimi outData[ i ] = (cl_float)(src[ i ]) / 256.0f;
218*6467f958SSadaf Ebrahimi }
219*6467f958SSadaf Ebrahimi return (char *)outData;
220*6467f958SSadaf Ebrahimi }
221*6467f958SSadaf Ebrahimi default:
222*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
223*6467f958SSadaf Ebrahimi return NULL;
224*6467f958SSadaf Ebrahimi }
225*6467f958SSadaf Ebrahimi }
226*6467f958SSadaf Ebrahimi else if( inType == kShort )
227*6467f958SSadaf Ebrahimi {
228*6467f958SSadaf Ebrahimi cl_short *src = (cl_short *)inputBuffer;
229*6467f958SSadaf Ebrahimi
230*6467f958SSadaf Ebrahimi switch( outType )
231*6467f958SSadaf Ebrahimi {
232*6467f958SSadaf Ebrahimi case kInt:
233*6467f958SSadaf Ebrahimi {
234*6467f958SSadaf Ebrahimi cl_int *outData = new cl_int[ numPixels * 4 ];
235*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
236*6467f958SSadaf Ebrahimi {
237*6467f958SSadaf Ebrahimi outData[ i ] = (cl_int)((src[ i ]));
238*6467f958SSadaf Ebrahimi }
239*6467f958SSadaf Ebrahimi return (char *)outData;
240*6467f958SSadaf Ebrahimi }
241*6467f958SSadaf Ebrahimi case kFloat:
242*6467f958SSadaf Ebrahimi {
243*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should be normalized
244*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[ numPixels * 4 ];
245*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
246*6467f958SSadaf Ebrahimi {
247*6467f958SSadaf Ebrahimi outData[ i ] = (cl_float)src[ i ] / 32768.0f;
248*6467f958SSadaf Ebrahimi }
249*6467f958SSadaf Ebrahimi return (char *)outData;
250*6467f958SSadaf Ebrahimi }
251*6467f958SSadaf Ebrahimi default:
252*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
253*6467f958SSadaf Ebrahimi return NULL;
254*6467f958SSadaf Ebrahimi }
255*6467f958SSadaf Ebrahimi }
256*6467f958SSadaf Ebrahimi else if( inType == kUShort )
257*6467f958SSadaf Ebrahimi {
258*6467f958SSadaf Ebrahimi cl_ushort *src = (cl_ushort *)inputBuffer;
259*6467f958SSadaf Ebrahimi
260*6467f958SSadaf Ebrahimi switch( outType )
261*6467f958SSadaf Ebrahimi {
262*6467f958SSadaf Ebrahimi case kUInt:
263*6467f958SSadaf Ebrahimi {
264*6467f958SSadaf Ebrahimi cl_uint *outData = new cl_uint[ numPixels * 4 ];
265*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
266*6467f958SSadaf Ebrahimi {
267*6467f958SSadaf Ebrahimi outData[ i ] = (cl_uint)((src[ i ]));
268*6467f958SSadaf Ebrahimi }
269*6467f958SSadaf Ebrahimi return (char *)outData;
270*6467f958SSadaf Ebrahimi }
271*6467f958SSadaf Ebrahimi case kFloat:
272*6467f958SSadaf Ebrahimi {
273*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should be normalized
274*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[ numPixels * 4 ];
275*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
276*6467f958SSadaf Ebrahimi {
277*6467f958SSadaf Ebrahimi outData[ i ] = (cl_float)(src[ i ]) / 65535.0f;
278*6467f958SSadaf Ebrahimi }
279*6467f958SSadaf Ebrahimi return (char *)outData;
280*6467f958SSadaf Ebrahimi }
281*6467f958SSadaf Ebrahimi default:
282*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
283*6467f958SSadaf Ebrahimi return NULL;
284*6467f958SSadaf Ebrahimi }
285*6467f958SSadaf Ebrahimi }
286*6467f958SSadaf Ebrahimi else if( inType == kInt )
287*6467f958SSadaf Ebrahimi {
288*6467f958SSadaf Ebrahimi cl_int *src = (cl_int *)inputBuffer;
289*6467f958SSadaf Ebrahimi
290*6467f958SSadaf Ebrahimi switch( outType )
291*6467f958SSadaf Ebrahimi {
292*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE( kShort, short, 16 )
293*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE( kChar, char, 24 )
294*6467f958SSadaf Ebrahimi case kFloat:
295*6467f958SSadaf Ebrahimi {
296*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should be normalized
297*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[ numPixels * 4 ];
298*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
299*6467f958SSadaf Ebrahimi {
300*6467f958SSadaf Ebrahimi outData[ i ] = (cl_float)fmaxf( (float)src[ i ] / 2147483647.f, -1.f );
301*6467f958SSadaf Ebrahimi }
302*6467f958SSadaf Ebrahimi return (char *)outData;
303*6467f958SSadaf Ebrahimi }
304*6467f958SSadaf Ebrahimi default:
305*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
306*6467f958SSadaf Ebrahimi return NULL;
307*6467f958SSadaf Ebrahimi }
308*6467f958SSadaf Ebrahimi }
309*6467f958SSadaf Ebrahimi else if( inType == kUInt )
310*6467f958SSadaf Ebrahimi {
311*6467f958SSadaf Ebrahimi cl_uint *src = (cl_uint *)inputBuffer;
312*6467f958SSadaf Ebrahimi
313*6467f958SSadaf Ebrahimi switch( outType )
314*6467f958SSadaf Ebrahimi {
315*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE( kUShort, ushort, 16 )
316*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE( kUChar, uchar, 24 )
317*6467f958SSadaf Ebrahimi case kFloat:
318*6467f958SSadaf Ebrahimi {
319*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should be normalized
320*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[ numPixels * 4 ];
321*6467f958SSadaf Ebrahimi for( size_t i = 0; i < numPixels * 4; i++ )
322*6467f958SSadaf Ebrahimi {
323*6467f958SSadaf Ebrahimi outData[ i ] = (cl_float)src[ i ] / 4294967295.f;
324*6467f958SSadaf Ebrahimi }
325*6467f958SSadaf Ebrahimi return (char *)outData;
326*6467f958SSadaf Ebrahimi }
327*6467f958SSadaf Ebrahimi default:
328*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
329*6467f958SSadaf Ebrahimi return NULL;
330*6467f958SSadaf Ebrahimi }
331*6467f958SSadaf Ebrahimi }
332*6467f958SSadaf Ebrahimi else
333*6467f958SSadaf Ebrahimi {
334*6467f958SSadaf Ebrahimi cl_float *src = (cl_float *)inputBuffer;
335*6467f958SSadaf Ebrahimi
336*6467f958SSadaf Ebrahimi switch( outType )
337*6467f958SSadaf Ebrahimi {
338*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE( kChar, char, 127.f )
339*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE( kUChar, uchar, 255.f )
340*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE( kShort, short, 32767.f )
341*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE( kUShort, ushort, 65535.f )
342*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE( kInt, int, 2147483647.f )
343*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE( kUInt, uint, 4294967295.f )
344*6467f958SSadaf Ebrahimi default:
345*6467f958SSadaf Ebrahimi log_error( "ERROR: Unsupported conversion from %s to %s!\n", get_explicit_type_name( inType ), get_explicit_type_name( outType ) );
346*6467f958SSadaf Ebrahimi return NULL;
347*6467f958SSadaf Ebrahimi }
348*6467f958SSadaf Ebrahimi }
349*6467f958SSadaf Ebrahimi
350*6467f958SSadaf Ebrahimi return NULL;
351*6467f958SSadaf Ebrahimi }
352*6467f958SSadaf Ebrahimi
validate_integer_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t typeSize)353*6467f958SSadaf Ebrahimi int validate_integer_results( void *expectedResults, void *actualResults, size_t width, size_t height, size_t typeSize )
354*6467f958SSadaf Ebrahimi {
355*6467f958SSadaf Ebrahimi return validate_integer_results( expectedResults, actualResults, width, height, 0, typeSize );
356*6467f958SSadaf Ebrahimi }
357*6467f958SSadaf Ebrahimi
validate_integer_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t depth,size_t typeSize)358*6467f958SSadaf Ebrahimi int validate_integer_results( void *expectedResults, void *actualResults, size_t width, size_t height, size_t depth, size_t typeSize )
359*6467f958SSadaf Ebrahimi {
360*6467f958SSadaf Ebrahimi char *expected = (char *)expectedResults;
361*6467f958SSadaf Ebrahimi char *actual = (char *)actualResults;
362*6467f958SSadaf Ebrahimi for( size_t z = 0; z < ( ( depth == 0 ) ? 1 : depth ); z++ )
363*6467f958SSadaf Ebrahimi {
364*6467f958SSadaf Ebrahimi for( size_t y = 0; y < height; y++ )
365*6467f958SSadaf Ebrahimi {
366*6467f958SSadaf Ebrahimi for( size_t x = 0; x < width; x++ )
367*6467f958SSadaf Ebrahimi {
368*6467f958SSadaf Ebrahimi if( memcmp( expected, actual, typeSize * 4 ) != 0 )
369*6467f958SSadaf Ebrahimi {
370*6467f958SSadaf Ebrahimi char scratch[ 1024 ];
371*6467f958SSadaf Ebrahimi
372*6467f958SSadaf Ebrahimi if( depth == 0 )
373*6467f958SSadaf Ebrahimi log_error( "ERROR: Data sample %d,%d did not validate!\n", (int)x, (int)y );
374*6467f958SSadaf Ebrahimi else
375*6467f958SSadaf Ebrahimi log_error( "ERROR: Data sample %d,%d,%d did not validate!\n", (int)x, (int)y, (int)z );
376*6467f958SSadaf Ebrahimi log_error( "\tExpected: %s\n", GetDataVectorString( expected, typeSize, 4, scratch ) );
377*6467f958SSadaf Ebrahimi log_error( "\t Actual: %s\n", GetDataVectorString( actual, typeSize, 4, scratch ) );
378*6467f958SSadaf Ebrahimi return -1;
379*6467f958SSadaf Ebrahimi }
380*6467f958SSadaf Ebrahimi expected += typeSize * 4;
381*6467f958SSadaf Ebrahimi actual += typeSize * 4;
382*6467f958SSadaf Ebrahimi }
383*6467f958SSadaf Ebrahimi }
384*6467f958SSadaf Ebrahimi }
385*6467f958SSadaf Ebrahimi
386*6467f958SSadaf Ebrahimi return 0;
387*6467f958SSadaf Ebrahimi }
388*6467f958SSadaf Ebrahimi
validate_float_results(void * expectedResults,void * actualResults,size_t width,size_t height)389*6467f958SSadaf Ebrahimi int validate_float_results( void *expectedResults, void *actualResults, size_t width, size_t height )
390*6467f958SSadaf Ebrahimi {
391*6467f958SSadaf Ebrahimi return validate_float_results( expectedResults, actualResults, width, height, 0 );
392*6467f958SSadaf Ebrahimi }
393*6467f958SSadaf Ebrahimi
validate_float_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t depth)394*6467f958SSadaf Ebrahimi int validate_float_results( void *expectedResults, void *actualResults, size_t width, size_t height, size_t depth )
395*6467f958SSadaf Ebrahimi {
396*6467f958SSadaf Ebrahimi cl_float *expected = (cl_float *)expectedResults;
397*6467f958SSadaf Ebrahimi cl_float *actual = (cl_float *)actualResults;
398*6467f958SSadaf Ebrahimi for( size_t z = 0; z < ( ( depth == 0 ) ? 1 : depth ); z++ )
399*6467f958SSadaf Ebrahimi {
400*6467f958SSadaf Ebrahimi for( size_t y = 0; y < height; y++ )
401*6467f958SSadaf Ebrahimi {
402*6467f958SSadaf Ebrahimi for( size_t x = 0; x < width; x++ )
403*6467f958SSadaf Ebrahimi {
404*6467f958SSadaf Ebrahimi float err = 0.f;
405*6467f958SSadaf Ebrahimi for( size_t i = 0; i < 4; i++ )
406*6467f958SSadaf Ebrahimi {
407*6467f958SSadaf Ebrahimi float error = fabsf( expected[ i ] - actual[ i ] );
408*6467f958SSadaf Ebrahimi if( error > err )
409*6467f958SSadaf Ebrahimi err = error;
410*6467f958SSadaf Ebrahimi }
411*6467f958SSadaf Ebrahimi
412*6467f958SSadaf Ebrahimi if( err > 1.f / 127.f ) // Max expected range of error if we converted from an 8-bit integer to a normalized float
413*6467f958SSadaf Ebrahimi {
414*6467f958SSadaf Ebrahimi if( depth == 0 )
415*6467f958SSadaf Ebrahimi log_error( "ERROR: Data sample %d,%d did not validate!\n", (int)x, (int)y );
416*6467f958SSadaf Ebrahimi else
417*6467f958SSadaf Ebrahimi log_error( "ERROR: Data sample %d,%d,%d did not validate!\n", (int)x, (int)y, (int)z );
418*6467f958SSadaf Ebrahimi log_error( "\tExpected: %f %f %f %f\n", expected[ 0 ], expected[ 1 ], expected[ 2 ], expected[ 3 ] );
419*6467f958SSadaf Ebrahimi log_error( "\t : %a %a %a %a\n", expected[ 0 ], expected[ 1 ], expected[ 2 ], expected[ 3 ] );
420*6467f958SSadaf Ebrahimi log_error( "\t Actual: %f %f %f %f\n", actual[ 0 ], actual[ 1 ], actual[ 2 ], actual[ 3 ] );
421*6467f958SSadaf Ebrahimi log_error( "\t : %a %a %a %a\n", actual[ 0 ], actual[ 1 ], actual[ 2 ], actual[ 3 ] );
422*6467f958SSadaf Ebrahimi return -1;
423*6467f958SSadaf Ebrahimi }
424*6467f958SSadaf Ebrahimi expected += 4;
425*6467f958SSadaf Ebrahimi actual += 4;
426*6467f958SSadaf Ebrahimi }
427*6467f958SSadaf Ebrahimi }
428*6467f958SSadaf Ebrahimi }
429*6467f958SSadaf Ebrahimi
430*6467f958SSadaf Ebrahimi return 0;
431*6467f958SSadaf Ebrahimi }
432*6467f958SSadaf Ebrahimi
CheckGLObjectInfo(cl_mem mem,cl_gl_object_type expected_cl_gl_type,GLuint expected_gl_name,GLenum expected_cl_gl_texture_target,GLint expected_cl_gl_mipmap_level)433*6467f958SSadaf Ebrahimi int CheckGLObjectInfo(cl_mem mem, cl_gl_object_type expected_cl_gl_type, GLuint expected_gl_name,
434*6467f958SSadaf Ebrahimi GLenum expected_cl_gl_texture_target, GLint expected_cl_gl_mipmap_level)
435*6467f958SSadaf Ebrahimi {
436*6467f958SSadaf Ebrahimi cl_gl_object_type object_type;
437*6467f958SSadaf Ebrahimi GLuint object_name;
438*6467f958SSadaf Ebrahimi GLenum texture_target;
439*6467f958SSadaf Ebrahimi GLint mipmap_level;
440*6467f958SSadaf Ebrahimi int error;
441*6467f958SSadaf Ebrahimi
442*6467f958SSadaf Ebrahimi error = (*clGetGLObjectInfo_ptr)(mem, &object_type, &object_name);
443*6467f958SSadaf Ebrahimi test_error( error, "clGetGLObjectInfo failed");
444*6467f958SSadaf Ebrahimi if (object_type != expected_cl_gl_type) {
445*6467f958SSadaf Ebrahimi log_error("clGetGLObjectInfo did not return expected object type: expected %d, got %d.\n", expected_cl_gl_type, object_type);
446*6467f958SSadaf Ebrahimi return -1;
447*6467f958SSadaf Ebrahimi }
448*6467f958SSadaf Ebrahimi if (object_name != expected_gl_name) {
449*6467f958SSadaf Ebrahimi log_error("clGetGLObjectInfo did not return expected object name: expected %d, got %d.\n", expected_gl_name, object_name);
450*6467f958SSadaf Ebrahimi return -1;
451*6467f958SSadaf Ebrahimi }
452*6467f958SSadaf Ebrahimi
453*6467f958SSadaf Ebrahimi if (object_type == CL_GL_OBJECT_TEXTURE2D || object_type == CL_GL_OBJECT_TEXTURE3D) {
454*6467f958SSadaf Ebrahimi error = (*clGetGLTextureInfo_ptr)(mem, CL_GL_TEXTURE_TARGET, sizeof(texture_target), &texture_target, NULL);
455*6467f958SSadaf Ebrahimi test_error( error, "clGetGLTextureInfo for CL_GL_TEXTURE_TARGET failed");
456*6467f958SSadaf Ebrahimi
457*6467f958SSadaf Ebrahimi if (texture_target != expected_cl_gl_texture_target) {
458*6467f958SSadaf Ebrahimi log_error("clGetGLTextureInfo did not return expected texture target: expected %d, got %d.\n", expected_cl_gl_texture_target, texture_target);
459*6467f958SSadaf Ebrahimi return -1;
460*6467f958SSadaf Ebrahimi }
461*6467f958SSadaf Ebrahimi
462*6467f958SSadaf Ebrahimi error = (*clGetGLTextureInfo_ptr)(mem, CL_GL_MIPMAP_LEVEL, sizeof(mipmap_level), &mipmap_level, NULL);
463*6467f958SSadaf Ebrahimi test_error( error, "clGetGLTextureInfo for CL_GL_MIPMAP_LEVEL failed");
464*6467f958SSadaf Ebrahimi
465*6467f958SSadaf Ebrahimi if (mipmap_level != expected_cl_gl_mipmap_level) {
466*6467f958SSadaf Ebrahimi log_error("clGetGLTextureInfo did not return expected mipmap level: expected %d, got %d.\n", expected_cl_gl_mipmap_level, mipmap_level);
467*6467f958SSadaf Ebrahimi return -1;
468*6467f958SSadaf Ebrahimi }
469*6467f958SSadaf Ebrahimi }
470*6467f958SSadaf Ebrahimi return 0;
471*6467f958SSadaf Ebrahimi }
472*6467f958SSadaf Ebrahimi
CheckGLIntegerExtensionSupport()473*6467f958SSadaf Ebrahimi bool CheckGLIntegerExtensionSupport()
474*6467f958SSadaf Ebrahimi {
475*6467f958SSadaf Ebrahimi // Get the OpenGL version and supported extensions
476*6467f958SSadaf Ebrahimi const GLubyte *glVersion = glGetString(GL_VERSION);
477*6467f958SSadaf Ebrahimi const GLubyte *glExtensionList = glGetString(GL_EXTENSIONS);
478*6467f958SSadaf Ebrahimi
479*6467f958SSadaf Ebrahimi // Check if the OpenGL vrsion is 3.0 or grater or GL_EXT_texture_integer is supported
480*6467f958SSadaf Ebrahimi return (((glVersion[0] - '0') >= 3) || (strstr((const char*)glExtensionList, "GL_EXT_texture_integer")));
481*6467f958SSadaf Ebrahimi }
482