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 #if defined(__APPLE__)
18*6467f958SSadaf Ebrahimi #include <OpenGL/glu.h>
19*6467f958SSadaf Ebrahimi #else
20*6467f958SSadaf Ebrahimi #include <GL/glu.h>
21*6467f958SSadaf Ebrahimi #endif
22*6467f958SSadaf Ebrahimi
get_kernel_suffix(cl_image_format * format)23*6467f958SSadaf Ebrahimi const char *get_kernel_suffix(cl_image_format *format)
24*6467f958SSadaf Ebrahimi {
25*6467f958SSadaf Ebrahimi switch (format->image_channel_data_type)
26*6467f958SSadaf Ebrahimi {
27*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
28*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
29*6467f958SSadaf Ebrahimi case CL_UNORM_INT24:
30*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
31*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
32*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
33*6467f958SSadaf Ebrahimi case CL_FLOAT:
34*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010: return "f";
35*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
36*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
37*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32: return "i";
38*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
39*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
40*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32: return "ui";
41*6467f958SSadaf Ebrahimi default:
42*6467f958SSadaf Ebrahimi log_error("Test error: unsupported kernel suffix for "
43*6467f958SSadaf Ebrahimi "image_channel_data_type 0x%X\n",
44*6467f958SSadaf Ebrahimi format->image_channel_data_type);
45*6467f958SSadaf Ebrahimi return "";
46*6467f958SSadaf Ebrahimi }
47*6467f958SSadaf Ebrahimi }
48*6467f958SSadaf Ebrahimi
get_read_kernel_type(cl_image_format * format)49*6467f958SSadaf Ebrahimi ExplicitType get_read_kernel_type(cl_image_format *format)
50*6467f958SSadaf Ebrahimi {
51*6467f958SSadaf Ebrahimi switch (format->image_channel_data_type)
52*6467f958SSadaf Ebrahimi {
53*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
54*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
55*6467f958SSadaf Ebrahimi case CL_UNORM_INT24:
56*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
57*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
58*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
59*6467f958SSadaf Ebrahimi case CL_FLOAT:
60*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010:
61*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
62*6467f958SSadaf Ebrahimi case CL_DEPTH:
63*6467f958SSadaf Ebrahimi #endif
64*6467f958SSadaf Ebrahimi return kFloat;
65*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
66*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
67*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32: return kInt;
68*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
69*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
70*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32: return kUInt;
71*6467f958SSadaf Ebrahimi default:
72*6467f958SSadaf Ebrahimi log_error("Test error: unsupported kernel suffix for "
73*6467f958SSadaf Ebrahimi "image_channel_data_type 0x%X\n",
74*6467f958SSadaf Ebrahimi format->image_channel_data_type);
75*6467f958SSadaf Ebrahimi return kNumExplicitTypes;
76*6467f958SSadaf Ebrahimi }
77*6467f958SSadaf Ebrahimi }
78*6467f958SSadaf Ebrahimi
get_write_kernel_type(cl_image_format * format)79*6467f958SSadaf Ebrahimi ExplicitType get_write_kernel_type(cl_image_format *format)
80*6467f958SSadaf Ebrahimi {
81*6467f958SSadaf Ebrahimi switch (format->image_channel_data_type)
82*6467f958SSadaf Ebrahimi {
83*6467f958SSadaf Ebrahimi case CL_UNORM_INT8: return kFloat;
84*6467f958SSadaf Ebrahimi case CL_UNORM_INT16: return kFloat;
85*6467f958SSadaf Ebrahimi case CL_UNORM_INT24: return kFloat;
86*6467f958SSadaf Ebrahimi case CL_SNORM_INT8: return kFloat;
87*6467f958SSadaf Ebrahimi case CL_SNORM_INT16: return kFloat;
88*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT: return kHalf;
89*6467f958SSadaf Ebrahimi case CL_FLOAT: return kFloat;
90*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8: return kChar;
91*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16: return kShort;
92*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32: return kInt;
93*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8: return kUChar;
94*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16: return kUShort;
95*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32: return kUInt;
96*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010: return kFloat;
97*6467f958SSadaf Ebrahimi #ifdef GL_VERSION_3_2
98*6467f958SSadaf Ebrahimi case CL_DEPTH: return kFloat;
99*6467f958SSadaf Ebrahimi #endif
100*6467f958SSadaf Ebrahimi default: return kInt;
101*6467f958SSadaf Ebrahimi }
102*6467f958SSadaf Ebrahimi }
103*6467f958SSadaf Ebrahimi
get_write_conversion(cl_image_format * format,ExplicitType type)104*6467f958SSadaf Ebrahimi const char *get_write_conversion(cl_image_format *format, ExplicitType type)
105*6467f958SSadaf Ebrahimi {
106*6467f958SSadaf Ebrahimi switch (format->image_channel_data_type)
107*6467f958SSadaf Ebrahimi {
108*6467f958SSadaf Ebrahimi case CL_UNORM_INT8:
109*6467f958SSadaf Ebrahimi case CL_UNORM_INT16:
110*6467f958SSadaf Ebrahimi case CL_SNORM_INT8:
111*6467f958SSadaf Ebrahimi case CL_SNORM_INT16:
112*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT:
113*6467f958SSadaf Ebrahimi case CL_FLOAT:
114*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010:
115*6467f958SSadaf Ebrahimi case CL_UNORM_INT24:
116*6467f958SSadaf Ebrahimi if (type != kFloat) return "convert_float4";
117*6467f958SSadaf Ebrahimi break;
118*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8:
119*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16:
120*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32:
121*6467f958SSadaf Ebrahimi if (type != kInt) return "convert_int4";
122*6467f958SSadaf Ebrahimi break;
123*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8:
124*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16:
125*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32:
126*6467f958SSadaf Ebrahimi if (type != kUInt) return "convert_uint4";
127*6467f958SSadaf Ebrahimi break;
128*6467f958SSadaf Ebrahimi default: return "";
129*6467f958SSadaf Ebrahimi }
130*6467f958SSadaf Ebrahimi return "";
131*6467f958SSadaf Ebrahimi }
132*6467f958SSadaf Ebrahimi
133*6467f958SSadaf Ebrahimi // The only three input types to this function are kInt, kUInt and kFloat, due
134*6467f958SSadaf Ebrahimi // to the way we set up our tests The output types, though, are pretty much
135*6467f958SSadaf Ebrahimi // anything valid for GL to receive
136*6467f958SSadaf Ebrahimi
137*6467f958SSadaf Ebrahimi #define DOWNSCALE_INTEGER_CASE(enum, type, bitShift) \
138*6467f958SSadaf Ebrahimi case enum: { \
139*6467f958SSadaf Ebrahimi cl_##type *dst = new cl_##type[numPixels * 4]; \
140*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * 4; i++) 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 cl_##type *dst = new cl_##type[numPixels * 4]; \
147*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * 4; i++) \
148*6467f958SSadaf Ebrahimi dst[i] = (cl_##type)(src[i] * typeMax); \
149*6467f958SSadaf Ebrahimi return (char *)dst; \
150*6467f958SSadaf Ebrahimi }
151*6467f958SSadaf Ebrahimi
convert_to_expected(void * inputBuffer,size_t numPixels,ExplicitType inType,ExplicitType outType,size_t channelNum,GLenum glDataType)152*6467f958SSadaf Ebrahimi char *convert_to_expected(void *inputBuffer, size_t numPixels,
153*6467f958SSadaf Ebrahimi ExplicitType inType, ExplicitType outType,
154*6467f958SSadaf Ebrahimi size_t channelNum, GLenum glDataType)
155*6467f958SSadaf Ebrahimi {
156*6467f958SSadaf Ebrahimi #ifdef DEBUG
157*6467f958SSadaf Ebrahimi log_info("- Converting from input type '%s' to output type '%s'\n",
158*6467f958SSadaf Ebrahimi get_explicit_type_name(inType), get_explicit_type_name(outType));
159*6467f958SSadaf Ebrahimi #endif
160*6467f958SSadaf Ebrahimi
161*6467f958SSadaf Ebrahimi if (inType == outType)
162*6467f958SSadaf Ebrahimi {
163*6467f958SSadaf Ebrahimi char *outData =
164*6467f958SSadaf Ebrahimi new char[numPixels * channelNum
165*6467f958SSadaf Ebrahimi * get_explicit_type_size(outType)]; // sizeof( cl_int ) ];
166*6467f958SSadaf Ebrahimi if (glDataType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
167*6467f958SSadaf Ebrahimi {
168*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels; ++i)
169*6467f958SSadaf Ebrahimi {
170*6467f958SSadaf Ebrahimi ((cl_float *)outData)[i] = ((cl_float *)inputBuffer)[2 * i];
171*6467f958SSadaf Ebrahimi }
172*6467f958SSadaf Ebrahimi }
173*6467f958SSadaf Ebrahimi else
174*6467f958SSadaf Ebrahimi {
175*6467f958SSadaf Ebrahimi memcpy(outData, inputBuffer,
176*6467f958SSadaf Ebrahimi numPixels * channelNum * get_explicit_type_size(inType));
177*6467f958SSadaf Ebrahimi }
178*6467f958SSadaf Ebrahimi return outData;
179*6467f958SSadaf Ebrahimi }
180*6467f958SSadaf Ebrahimi else if (inType == kChar)
181*6467f958SSadaf Ebrahimi {
182*6467f958SSadaf Ebrahimi cl_char *src = (cl_char *)inputBuffer;
183*6467f958SSadaf Ebrahimi
184*6467f958SSadaf Ebrahimi switch (outType)
185*6467f958SSadaf Ebrahimi {
186*6467f958SSadaf Ebrahimi case kInt: {
187*6467f958SSadaf Ebrahimi cl_int *outData = new cl_int[numPixels * channelNum];
188*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
189*6467f958SSadaf Ebrahimi {
190*6467f958SSadaf Ebrahimi outData[i] = (cl_int)((src[i]));
191*6467f958SSadaf Ebrahimi }
192*6467f958SSadaf Ebrahimi return (char *)outData;
193*6467f958SSadaf Ebrahimi }
194*6467f958SSadaf Ebrahimi case kFloat: {
195*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should
196*6467f958SSadaf Ebrahimi // be normalized
197*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
198*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
199*6467f958SSadaf Ebrahimi {
200*6467f958SSadaf Ebrahimi outData[i] = (cl_float)src[i] / 127.0f;
201*6467f958SSadaf Ebrahimi }
202*6467f958SSadaf Ebrahimi return (char *)outData;
203*6467f958SSadaf Ebrahimi }
204*6467f958SSadaf Ebrahimi default:
205*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
206*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
207*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
208*6467f958SSadaf Ebrahimi return NULL;
209*6467f958SSadaf Ebrahimi }
210*6467f958SSadaf Ebrahimi }
211*6467f958SSadaf Ebrahimi else if (inType == kUChar)
212*6467f958SSadaf Ebrahimi {
213*6467f958SSadaf Ebrahimi cl_uchar *src = (cl_uchar *)inputBuffer;
214*6467f958SSadaf Ebrahimi
215*6467f958SSadaf Ebrahimi switch (outType)
216*6467f958SSadaf Ebrahimi {
217*6467f958SSadaf Ebrahimi case kUInt: {
218*6467f958SSadaf Ebrahimi cl_uint *outData = new cl_uint[numPixels * channelNum];
219*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
220*6467f958SSadaf Ebrahimi {
221*6467f958SSadaf Ebrahimi outData[i] = (cl_uint)((src[i]));
222*6467f958SSadaf Ebrahimi }
223*6467f958SSadaf Ebrahimi return (char *)outData;
224*6467f958SSadaf Ebrahimi }
225*6467f958SSadaf Ebrahimi case kFloat: {
226*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should
227*6467f958SSadaf Ebrahimi // be normalized
228*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
229*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
230*6467f958SSadaf Ebrahimi {
231*6467f958SSadaf Ebrahimi outData[i] = (cl_float)(src[i]) / 256.0f;
232*6467f958SSadaf Ebrahimi }
233*6467f958SSadaf Ebrahimi return (char *)outData;
234*6467f958SSadaf Ebrahimi }
235*6467f958SSadaf Ebrahimi default:
236*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
237*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
238*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
239*6467f958SSadaf Ebrahimi return NULL;
240*6467f958SSadaf Ebrahimi }
241*6467f958SSadaf Ebrahimi }
242*6467f958SSadaf Ebrahimi else if (inType == kShort)
243*6467f958SSadaf Ebrahimi {
244*6467f958SSadaf Ebrahimi cl_short *src = (cl_short *)inputBuffer;
245*6467f958SSadaf Ebrahimi
246*6467f958SSadaf Ebrahimi switch (outType)
247*6467f958SSadaf Ebrahimi {
248*6467f958SSadaf Ebrahimi case kInt: {
249*6467f958SSadaf Ebrahimi cl_int *outData = new cl_int[numPixels * channelNum];
250*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
251*6467f958SSadaf Ebrahimi {
252*6467f958SSadaf Ebrahimi outData[i] = (cl_int)((src[i]));
253*6467f958SSadaf Ebrahimi }
254*6467f958SSadaf Ebrahimi return (char *)outData;
255*6467f958SSadaf Ebrahimi }
256*6467f958SSadaf Ebrahimi case kFloat: {
257*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should
258*6467f958SSadaf Ebrahimi // be normalized
259*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
260*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
261*6467f958SSadaf Ebrahimi {
262*6467f958SSadaf Ebrahimi outData[i] = (cl_float)src[i] / 32768.0f;
263*6467f958SSadaf Ebrahimi }
264*6467f958SSadaf Ebrahimi return (char *)outData;
265*6467f958SSadaf Ebrahimi }
266*6467f958SSadaf Ebrahimi default:
267*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
268*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
269*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
270*6467f958SSadaf Ebrahimi return NULL;
271*6467f958SSadaf Ebrahimi }
272*6467f958SSadaf Ebrahimi }
273*6467f958SSadaf Ebrahimi else if (inType == kUShort)
274*6467f958SSadaf Ebrahimi {
275*6467f958SSadaf Ebrahimi cl_ushort *src = (cl_ushort *)inputBuffer;
276*6467f958SSadaf Ebrahimi
277*6467f958SSadaf Ebrahimi switch (outType)
278*6467f958SSadaf Ebrahimi {
279*6467f958SSadaf Ebrahimi case kUInt: {
280*6467f958SSadaf Ebrahimi cl_uint *outData = new cl_uint[numPixels * channelNum];
281*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
282*6467f958SSadaf Ebrahimi {
283*6467f958SSadaf Ebrahimi outData[i] = (cl_uint)((src[i]));
284*6467f958SSadaf Ebrahimi }
285*6467f958SSadaf Ebrahimi return (char *)outData;
286*6467f958SSadaf Ebrahimi }
287*6467f958SSadaf Ebrahimi case kFloat: {
288*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should
289*6467f958SSadaf Ebrahimi // be normalized
290*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
291*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
292*6467f958SSadaf Ebrahimi {
293*6467f958SSadaf Ebrahimi outData[i] = (cl_float)(src[i]) / 65535.0f;
294*6467f958SSadaf Ebrahimi }
295*6467f958SSadaf Ebrahimi return (char *)outData;
296*6467f958SSadaf Ebrahimi }
297*6467f958SSadaf Ebrahimi default:
298*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
299*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
300*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
301*6467f958SSadaf Ebrahimi return NULL;
302*6467f958SSadaf Ebrahimi }
303*6467f958SSadaf Ebrahimi }
304*6467f958SSadaf Ebrahimi else if (inType == kInt)
305*6467f958SSadaf Ebrahimi {
306*6467f958SSadaf Ebrahimi cl_int *src = (cl_int *)inputBuffer;
307*6467f958SSadaf Ebrahimi
308*6467f958SSadaf Ebrahimi switch (outType)
309*6467f958SSadaf Ebrahimi {
310*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE(kShort, short, 16)
311*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE(kChar, char, 24)
312*6467f958SSadaf Ebrahimi case kFloat: {
313*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should
314*6467f958SSadaf Ebrahimi // be normalized
315*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
316*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
317*6467f958SSadaf Ebrahimi {
318*6467f958SSadaf Ebrahimi outData[i] =
319*6467f958SSadaf Ebrahimi (cl_float)fmaxf((float)src[i] / 2147483647.f, -1.f);
320*6467f958SSadaf Ebrahimi }
321*6467f958SSadaf Ebrahimi return (char *)outData;
322*6467f958SSadaf Ebrahimi }
323*6467f958SSadaf Ebrahimi default:
324*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
325*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
326*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
327*6467f958SSadaf Ebrahimi return NULL;
328*6467f958SSadaf Ebrahimi }
329*6467f958SSadaf Ebrahimi }
330*6467f958SSadaf Ebrahimi else if (inType == kUInt)
331*6467f958SSadaf Ebrahimi {
332*6467f958SSadaf Ebrahimi cl_uint *src = (cl_uint *)inputBuffer;
333*6467f958SSadaf Ebrahimi
334*6467f958SSadaf Ebrahimi switch (outType)
335*6467f958SSadaf Ebrahimi {
336*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE(kUShort, ushort, 16)
337*6467f958SSadaf Ebrahimi DOWNSCALE_INTEGER_CASE(kUChar, uchar, 24)
338*6467f958SSadaf Ebrahimi case kFloat: {
339*6467f958SSadaf Ebrahimi // If we're converting to float, then CL decided that we should
340*6467f958SSadaf Ebrahimi // be normalized
341*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
342*6467f958SSadaf Ebrahimi const cl_float MaxValue = (glDataType == GL_UNSIGNED_INT_24_8)
343*6467f958SSadaf Ebrahimi ? 16777215.f
344*6467f958SSadaf Ebrahimi : 4294967295.f;
345*6467f958SSadaf Ebrahimi const cl_uint ShiftBits =
346*6467f958SSadaf Ebrahimi (glDataType == GL_UNSIGNED_INT_24_8) ? 8 : 0;
347*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
348*6467f958SSadaf Ebrahimi {
349*6467f958SSadaf Ebrahimi outData[i] = (cl_float)(src[i] >> ShiftBits) / MaxValue;
350*6467f958SSadaf Ebrahimi }
351*6467f958SSadaf Ebrahimi return (char *)outData;
352*6467f958SSadaf Ebrahimi }
353*6467f958SSadaf Ebrahimi default:
354*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
355*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
356*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
357*6467f958SSadaf Ebrahimi return NULL;
358*6467f958SSadaf Ebrahimi }
359*6467f958SSadaf Ebrahimi }
360*6467f958SSadaf Ebrahimi else if (inType == kHalf)
361*6467f958SSadaf Ebrahimi {
362*6467f958SSadaf Ebrahimi cl_half *src = (cl_half *)inputBuffer;
363*6467f958SSadaf Ebrahimi
364*6467f958SSadaf Ebrahimi switch (outType)
365*6467f958SSadaf Ebrahimi {
366*6467f958SSadaf Ebrahimi case kFloat: {
367*6467f958SSadaf Ebrahimi cl_float *outData = new cl_float[numPixels * channelNum];
368*6467f958SSadaf Ebrahimi for (size_t i = 0; i < numPixels * channelNum; i++)
369*6467f958SSadaf Ebrahimi {
370*6467f958SSadaf Ebrahimi outData[i] = cl_half_to_float(src[i]);
371*6467f958SSadaf Ebrahimi }
372*6467f958SSadaf Ebrahimi return (char *)outData;
373*6467f958SSadaf Ebrahimi }
374*6467f958SSadaf Ebrahimi default:
375*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
376*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
377*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
378*6467f958SSadaf Ebrahimi return NULL;
379*6467f958SSadaf Ebrahimi }
380*6467f958SSadaf Ebrahimi }
381*6467f958SSadaf Ebrahimi else
382*6467f958SSadaf Ebrahimi {
383*6467f958SSadaf Ebrahimi cl_float *src = (cl_float *)inputBuffer;
384*6467f958SSadaf Ebrahimi
385*6467f958SSadaf Ebrahimi switch (outType)
386*6467f958SSadaf Ebrahimi {
387*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE(kChar, char, 127.f)
388*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE(kUChar, uchar, 255.f)
389*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE(kShort, short, 32767.f)
390*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE(kUShort, ushort, 65535.f)
391*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE(kInt, int, 2147483647.f)
392*6467f958SSadaf Ebrahimi UPSCALE_FLOAT_CASE(kUInt, uint, 4294967295.f)
393*6467f958SSadaf Ebrahimi default:
394*6467f958SSadaf Ebrahimi log_error("ERROR: Unsupported conversion from %s to %s!\n",
395*6467f958SSadaf Ebrahimi get_explicit_type_name(inType),
396*6467f958SSadaf Ebrahimi get_explicit_type_name(outType));
397*6467f958SSadaf Ebrahimi return NULL;
398*6467f958SSadaf Ebrahimi }
399*6467f958SSadaf Ebrahimi }
400*6467f958SSadaf Ebrahimi
401*6467f958SSadaf Ebrahimi return NULL;
402*6467f958SSadaf Ebrahimi }
403*6467f958SSadaf Ebrahimi
validate_integer_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t sampleNum,size_t typeSize)404*6467f958SSadaf Ebrahimi int validate_integer_results(void *expectedResults, void *actualResults,
405*6467f958SSadaf Ebrahimi size_t width, size_t height, size_t sampleNum,
406*6467f958SSadaf Ebrahimi size_t typeSize)
407*6467f958SSadaf Ebrahimi {
408*6467f958SSadaf Ebrahimi return validate_integer_results(expectedResults, actualResults, width,
409*6467f958SSadaf Ebrahimi height, sampleNum, 0, typeSize);
410*6467f958SSadaf Ebrahimi }
411*6467f958SSadaf Ebrahimi
validate_integer_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t depth,size_t sampleNum,size_t typeSize)412*6467f958SSadaf Ebrahimi int validate_integer_results(void *expectedResults, void *actualResults,
413*6467f958SSadaf Ebrahimi size_t width, size_t height, size_t depth,
414*6467f958SSadaf Ebrahimi size_t sampleNum, size_t typeSize)
415*6467f958SSadaf Ebrahimi {
416*6467f958SSadaf Ebrahimi char *expected = (char *)expectedResults;
417*6467f958SSadaf Ebrahimi char *actual = (char *)actualResults;
418*6467f958SSadaf Ebrahimi for (size_t s = 0; s < sampleNum; s++)
419*6467f958SSadaf Ebrahimi {
420*6467f958SSadaf Ebrahimi for (size_t z = 0; z < ((depth == 0) ? 1 : depth); z++)
421*6467f958SSadaf Ebrahimi {
422*6467f958SSadaf Ebrahimi for (size_t y = 0; y < height; y++)
423*6467f958SSadaf Ebrahimi {
424*6467f958SSadaf Ebrahimi for (size_t x = 0; x < width; x++)
425*6467f958SSadaf Ebrahimi {
426*6467f958SSadaf Ebrahimi if (memcmp(expected, actual, typeSize * 4) != 0)
427*6467f958SSadaf Ebrahimi {
428*6467f958SSadaf Ebrahimi char scratch[1024];
429*6467f958SSadaf Ebrahimi
430*6467f958SSadaf Ebrahimi if (depth == 0)
431*6467f958SSadaf Ebrahimi log_error("ERROR: Data sample %d,%d,%d did not "
432*6467f958SSadaf Ebrahimi "validate!\n",
433*6467f958SSadaf Ebrahimi (int)x, (int)y, (int)s);
434*6467f958SSadaf Ebrahimi else
435*6467f958SSadaf Ebrahimi log_error("ERROR: Data sample %d,%d,%d,%d did not "
436*6467f958SSadaf Ebrahimi "validate!\n",
437*6467f958SSadaf Ebrahimi (int)x, (int)y, (int)z, (int)s);
438*6467f958SSadaf Ebrahimi log_error("\tExpected: %s\n",
439*6467f958SSadaf Ebrahimi GetDataVectorString(expected, typeSize, 4,
440*6467f958SSadaf Ebrahimi scratch));
441*6467f958SSadaf Ebrahimi log_error(
442*6467f958SSadaf Ebrahimi "\t Actual: %s\n",
443*6467f958SSadaf Ebrahimi GetDataVectorString(actual, typeSize, 4, scratch));
444*6467f958SSadaf Ebrahimi return -1;
445*6467f958SSadaf Ebrahimi }
446*6467f958SSadaf Ebrahimi expected += typeSize * 4;
447*6467f958SSadaf Ebrahimi actual += typeSize * 4;
448*6467f958SSadaf Ebrahimi }
449*6467f958SSadaf Ebrahimi }
450*6467f958SSadaf Ebrahimi }
451*6467f958SSadaf Ebrahimi }
452*6467f958SSadaf Ebrahimi
453*6467f958SSadaf Ebrahimi return 0;
454*6467f958SSadaf Ebrahimi }
455*6467f958SSadaf Ebrahimi
validate_float_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t sampleNum,size_t channelNum)456*6467f958SSadaf Ebrahimi int validate_float_results(void *expectedResults, void *actualResults,
457*6467f958SSadaf Ebrahimi size_t width, size_t height, size_t sampleNum,
458*6467f958SSadaf Ebrahimi size_t channelNum)
459*6467f958SSadaf Ebrahimi {
460*6467f958SSadaf Ebrahimi return validate_float_results(expectedResults, actualResults, width, height,
461*6467f958SSadaf Ebrahimi sampleNum, 0, channelNum);
462*6467f958SSadaf Ebrahimi }
463*6467f958SSadaf Ebrahimi
validate_float_results(void * expectedResults,void * actualResults,size_t width,size_t height,size_t depth,size_t sampleNum,size_t channelNum)464*6467f958SSadaf Ebrahimi int validate_float_results(void *expectedResults, void *actualResults,
465*6467f958SSadaf Ebrahimi size_t width, size_t height, size_t depth,
466*6467f958SSadaf Ebrahimi size_t sampleNum, size_t channelNum)
467*6467f958SSadaf Ebrahimi {
468*6467f958SSadaf Ebrahimi cl_float *expected = (cl_float *)expectedResults;
469*6467f958SSadaf Ebrahimi cl_float *actual = (cl_float *)actualResults;
470*6467f958SSadaf Ebrahimi for (size_t s = 0; s < sampleNum; s++)
471*6467f958SSadaf Ebrahimi {
472*6467f958SSadaf Ebrahimi for (size_t z = 0; z < ((depth == 0) ? 1 : depth); z++)
473*6467f958SSadaf Ebrahimi {
474*6467f958SSadaf Ebrahimi for (size_t y = 0; y < height; y++)
475*6467f958SSadaf Ebrahimi {
476*6467f958SSadaf Ebrahimi for (size_t x = 0; x < width; x++)
477*6467f958SSadaf Ebrahimi {
478*6467f958SSadaf Ebrahimi float err = 0.f;
479*6467f958SSadaf Ebrahimi for (size_t i = 0; i < channelNum; i++)
480*6467f958SSadaf Ebrahimi {
481*6467f958SSadaf Ebrahimi float error = fabsf(expected[i] - actual[i]);
482*6467f958SSadaf Ebrahimi if (error > err) err = error;
483*6467f958SSadaf Ebrahimi }
484*6467f958SSadaf Ebrahimi
485*6467f958SSadaf Ebrahimi if (err > 1.f / 127.f) // Max expected range of error if we
486*6467f958SSadaf Ebrahimi // converted from an 8-bit integer to
487*6467f958SSadaf Ebrahimi // a normalized float
488*6467f958SSadaf Ebrahimi {
489*6467f958SSadaf Ebrahimi if (depth == 0)
490*6467f958SSadaf Ebrahimi log_error("ERROR: Data sample %d,%d,%d did not "
491*6467f958SSadaf Ebrahimi "validate!\n",
492*6467f958SSadaf Ebrahimi (int)x, (int)y, (int)s);
493*6467f958SSadaf Ebrahimi else
494*6467f958SSadaf Ebrahimi log_error("ERROR: Data sample %d,%d,%d,%d did not "
495*6467f958SSadaf Ebrahimi "validate!\n",
496*6467f958SSadaf Ebrahimi (int)x, (int)y, (int)z, (int)s);
497*6467f958SSadaf Ebrahimi
498*6467f958SSadaf Ebrahimi if (channelNum == 4)
499*6467f958SSadaf Ebrahimi {
500*6467f958SSadaf Ebrahimi log_error("\tExpected: %f %f %f %f\n", expected[0],
501*6467f958SSadaf Ebrahimi expected[1], expected[2], expected[3]);
502*6467f958SSadaf Ebrahimi log_error("\t : %a %a %a %a\n", expected[0],
503*6467f958SSadaf Ebrahimi expected[1], expected[2], expected[3]);
504*6467f958SSadaf Ebrahimi log_error("\t Actual: %f %f %f %f\n", actual[0],
505*6467f958SSadaf Ebrahimi actual[1], actual[2], actual[3]);
506*6467f958SSadaf Ebrahimi log_error("\t : %a %a %a %a\n", actual[0],
507*6467f958SSadaf Ebrahimi actual[1], actual[2], actual[3]);
508*6467f958SSadaf Ebrahimi }
509*6467f958SSadaf Ebrahimi else if (channelNum == 1)
510*6467f958SSadaf Ebrahimi {
511*6467f958SSadaf Ebrahimi log_error("\tExpected: %f\n", expected[0]);
512*6467f958SSadaf Ebrahimi log_error("\t : %a\n", expected[0]);
513*6467f958SSadaf Ebrahimi log_error("\t Actual: %f\n", actual[0]);
514*6467f958SSadaf Ebrahimi log_error("\t : %a\n", actual[0]);
515*6467f958SSadaf Ebrahimi }
516*6467f958SSadaf Ebrahimi return -1;
517*6467f958SSadaf Ebrahimi }
518*6467f958SSadaf Ebrahimi expected += channelNum;
519*6467f958SSadaf Ebrahimi actual += channelNum;
520*6467f958SSadaf Ebrahimi }
521*6467f958SSadaf Ebrahimi }
522*6467f958SSadaf Ebrahimi }
523*6467f958SSadaf Ebrahimi }
524*6467f958SSadaf Ebrahimi
525*6467f958SSadaf Ebrahimi return 0;
526*6467f958SSadaf Ebrahimi }
527*6467f958SSadaf Ebrahimi
validate_float_results_rgb_101010(void * expectedResults,void * actualResults,size_t width,size_t height,size_t sampleNum)528*6467f958SSadaf Ebrahimi int validate_float_results_rgb_101010(void *expectedResults,
529*6467f958SSadaf Ebrahimi void *actualResults, size_t width,
530*6467f958SSadaf Ebrahimi size_t height, size_t sampleNum)
531*6467f958SSadaf Ebrahimi {
532*6467f958SSadaf Ebrahimi return validate_float_results_rgb_101010(expectedResults, actualResults,
533*6467f958SSadaf Ebrahimi width, height, sampleNum, 0);
534*6467f958SSadaf Ebrahimi }
535*6467f958SSadaf Ebrahimi
validate_float_results_rgb_101010(void * expectedResults,void * actualResults,size_t width,size_t height,size_t depth,size_t sampleNum)536*6467f958SSadaf Ebrahimi int validate_float_results_rgb_101010(void *expectedResults,
537*6467f958SSadaf Ebrahimi void *actualResults, size_t width,
538*6467f958SSadaf Ebrahimi size_t height, size_t depth,
539*6467f958SSadaf Ebrahimi size_t sampleNum)
540*6467f958SSadaf Ebrahimi {
541*6467f958SSadaf Ebrahimi cl_float *expected = (cl_float *)expectedResults;
542*6467f958SSadaf Ebrahimi cl_float *actual = (cl_float *)actualResults;
543*6467f958SSadaf Ebrahimi for (size_t s = 0; s < sampleNum; s++)
544*6467f958SSadaf Ebrahimi {
545*6467f958SSadaf Ebrahimi for (size_t z = 0; z < ((depth == 0) ? 1 : depth); z++)
546*6467f958SSadaf Ebrahimi {
547*6467f958SSadaf Ebrahimi for (size_t y = 0; y < height; y++)
548*6467f958SSadaf Ebrahimi {
549*6467f958SSadaf Ebrahimi for (size_t x = 0; x < width; x++)
550*6467f958SSadaf Ebrahimi {
551*6467f958SSadaf Ebrahimi float err = 0.f;
552*6467f958SSadaf Ebrahimi for (size_t i = 0; i < 3; i++) // skip the fourth channel
553*6467f958SSadaf Ebrahimi {
554*6467f958SSadaf Ebrahimi float error = fabsf(expected[i] - actual[i]);
555*6467f958SSadaf Ebrahimi if (error > err) err = error;
556*6467f958SSadaf Ebrahimi }
557*6467f958SSadaf Ebrahimi
558*6467f958SSadaf Ebrahimi if (err > 1.f / 127.f) // Max expected range of error if we
559*6467f958SSadaf Ebrahimi // converted from an 8-bit integer to
560*6467f958SSadaf Ebrahimi // a normalized float
561*6467f958SSadaf Ebrahimi {
562*6467f958SSadaf Ebrahimi if (depth == 0)
563*6467f958SSadaf Ebrahimi log_error("ERROR: Data sample %d,%d,%d did not "
564*6467f958SSadaf Ebrahimi "validate!\n",
565*6467f958SSadaf Ebrahimi (int)x, (int)y, (int)s);
566*6467f958SSadaf Ebrahimi else
567*6467f958SSadaf Ebrahimi log_error("ERROR: Data sample %d,%d,%d,%d did not "
568*6467f958SSadaf Ebrahimi "validate!\n",
569*6467f958SSadaf Ebrahimi (int)x, (int)y, (int)z, (int)s);
570*6467f958SSadaf Ebrahimi log_error("\tExpected: %f %f %f\n", expected[0],
571*6467f958SSadaf Ebrahimi expected[1], expected[2]);
572*6467f958SSadaf Ebrahimi log_error("\t : %a %a %a\n", expected[0],
573*6467f958SSadaf Ebrahimi expected[1], expected[2]);
574*6467f958SSadaf Ebrahimi log_error("\t Actual: %f %f %f\n", actual[0],
575*6467f958SSadaf Ebrahimi actual[1], actual[2]);
576*6467f958SSadaf Ebrahimi log_error("\t : %a %a %a\n", actual[0],
577*6467f958SSadaf Ebrahimi actual[1], actual[2]);
578*6467f958SSadaf Ebrahimi return -1;
579*6467f958SSadaf Ebrahimi }
580*6467f958SSadaf Ebrahimi expected += 4;
581*6467f958SSadaf Ebrahimi actual += 4;
582*6467f958SSadaf Ebrahimi }
583*6467f958SSadaf Ebrahimi }
584*6467f958SSadaf Ebrahimi }
585*6467f958SSadaf Ebrahimi }
586*6467f958SSadaf Ebrahimi
587*6467f958SSadaf Ebrahimi return 0;
588*6467f958SSadaf Ebrahimi }
589*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)590*6467f958SSadaf Ebrahimi int CheckGLObjectInfo(cl_mem mem, cl_gl_object_type expected_cl_gl_type,
591*6467f958SSadaf Ebrahimi GLuint expected_gl_name,
592*6467f958SSadaf Ebrahimi GLenum expected_cl_gl_texture_target,
593*6467f958SSadaf Ebrahimi GLint expected_cl_gl_mipmap_level)
594*6467f958SSadaf Ebrahimi {
595*6467f958SSadaf Ebrahimi cl_gl_object_type object_type;
596*6467f958SSadaf Ebrahimi GLuint object_name;
597*6467f958SSadaf Ebrahimi GLenum texture_target;
598*6467f958SSadaf Ebrahimi GLint mipmap_level;
599*6467f958SSadaf Ebrahimi int error;
600*6467f958SSadaf Ebrahimi
601*6467f958SSadaf Ebrahimi error = (*clGetGLObjectInfo_ptr)(mem, &object_type, &object_name);
602*6467f958SSadaf Ebrahimi test_error(error, "clGetGLObjectInfo failed");
603*6467f958SSadaf Ebrahimi if (object_type != expected_cl_gl_type)
604*6467f958SSadaf Ebrahimi {
605*6467f958SSadaf Ebrahimi log_error("clGetGLObjectInfo did not return expected object type: "
606*6467f958SSadaf Ebrahimi "expected %d, got %d.\n",
607*6467f958SSadaf Ebrahimi expected_cl_gl_type, object_type);
608*6467f958SSadaf Ebrahimi return -1;
609*6467f958SSadaf Ebrahimi }
610*6467f958SSadaf Ebrahimi if (object_name != expected_gl_name)
611*6467f958SSadaf Ebrahimi {
612*6467f958SSadaf Ebrahimi log_error("clGetGLObjectInfo did not return expected object name: "
613*6467f958SSadaf Ebrahimi "expected %d, got %d.\n",
614*6467f958SSadaf Ebrahimi expected_gl_name, object_name);
615*6467f958SSadaf Ebrahimi return -1;
616*6467f958SSadaf Ebrahimi }
617*6467f958SSadaf Ebrahimi
618*6467f958SSadaf Ebrahimi // If we're dealing with a buffer or render buffer, we are done.
619*6467f958SSadaf Ebrahimi
620*6467f958SSadaf Ebrahimi if (object_type == CL_GL_OBJECT_BUFFER
621*6467f958SSadaf Ebrahimi || object_type == CL_GL_OBJECT_RENDERBUFFER)
622*6467f958SSadaf Ebrahimi {
623*6467f958SSadaf Ebrahimi return 0;
624*6467f958SSadaf Ebrahimi }
625*6467f958SSadaf Ebrahimi
626*6467f958SSadaf Ebrahimi // Otherwise, it's a texture-based object and requires a bit more checking.
627*6467f958SSadaf Ebrahimi
628*6467f958SSadaf Ebrahimi error = (*clGetGLTextureInfo_ptr)(mem, CL_GL_TEXTURE_TARGET,
629*6467f958SSadaf Ebrahimi sizeof(texture_target), &texture_target,
630*6467f958SSadaf Ebrahimi NULL);
631*6467f958SSadaf Ebrahimi test_error(error, "clGetGLTextureInfo for CL_GL_TEXTURE_TARGET failed");
632*6467f958SSadaf Ebrahimi
633*6467f958SSadaf Ebrahimi if (texture_target != expected_cl_gl_texture_target)
634*6467f958SSadaf Ebrahimi {
635*6467f958SSadaf Ebrahimi log_error("clGetGLTextureInfo did not return expected texture target: "
636*6467f958SSadaf Ebrahimi "expected %d, got %d.\n",
637*6467f958SSadaf Ebrahimi expected_cl_gl_texture_target, texture_target);
638*6467f958SSadaf Ebrahimi return -1;
639*6467f958SSadaf Ebrahimi }
640*6467f958SSadaf Ebrahimi
641*6467f958SSadaf Ebrahimi error = (*clGetGLTextureInfo_ptr)(
642*6467f958SSadaf Ebrahimi mem, CL_GL_MIPMAP_LEVEL, sizeof(mipmap_level), &mipmap_level, NULL);
643*6467f958SSadaf Ebrahimi test_error(error, "clGetGLTextureInfo for CL_GL_MIPMAP_LEVEL failed");
644*6467f958SSadaf Ebrahimi
645*6467f958SSadaf Ebrahimi if (mipmap_level != expected_cl_gl_mipmap_level)
646*6467f958SSadaf Ebrahimi {
647*6467f958SSadaf Ebrahimi log_error("clGetGLTextureInfo did not return expected mipmap level: "
648*6467f958SSadaf Ebrahimi "expected %d, got %d.\n",
649*6467f958SSadaf Ebrahimi expected_cl_gl_mipmap_level, mipmap_level);
650*6467f958SSadaf Ebrahimi return -1;
651*6467f958SSadaf Ebrahimi }
652*6467f958SSadaf Ebrahimi
653*6467f958SSadaf Ebrahimi return 0;
654*6467f958SSadaf Ebrahimi }
655*6467f958SSadaf Ebrahimi
CheckGLIntegerExtensionSupport()656*6467f958SSadaf Ebrahimi bool CheckGLIntegerExtensionSupport()
657*6467f958SSadaf Ebrahimi {
658*6467f958SSadaf Ebrahimi // Get the OpenGL version and supported extensions
659*6467f958SSadaf Ebrahimi const GLubyte *glVersion = glGetString(GL_VERSION);
660*6467f958SSadaf Ebrahimi const GLubyte *glExtensionList = glGetString(GL_EXTENSIONS);
661*6467f958SSadaf Ebrahimi
662*6467f958SSadaf Ebrahimi // Check if the OpenGL vrsion is 3.0 or grater or GL_EXT_texture_integer is
663*6467f958SSadaf Ebrahimi // supported
664*6467f958SSadaf Ebrahimi return (
665*6467f958SSadaf Ebrahimi ((glVersion[0] - '0') >= 3)
666*6467f958SSadaf Ebrahimi || (strstr((const char *)glExtensionList, "GL_EXT_texture_integer")));
667*6467f958SSadaf Ebrahimi }
668*6467f958SSadaf Ebrahimi
is_rgb_101010_supported(cl_context context,GLenum gl_target)669*6467f958SSadaf Ebrahimi int is_rgb_101010_supported(cl_context context, GLenum gl_target)
670*6467f958SSadaf Ebrahimi {
671*6467f958SSadaf Ebrahimi cl_image_format formatList[128];
672*6467f958SSadaf Ebrahimi cl_uint formatCount = 0;
673*6467f958SSadaf Ebrahimi unsigned int i;
674*6467f958SSadaf Ebrahimi int error;
675*6467f958SSadaf Ebrahimi
676*6467f958SSadaf Ebrahimi cl_mem_object_type image_type;
677*6467f958SSadaf Ebrahimi
678*6467f958SSadaf Ebrahimi switch (get_base_gl_target(gl_target))
679*6467f958SSadaf Ebrahimi {
680*6467f958SSadaf Ebrahimi case GL_TEXTURE_1D: image_type = CL_MEM_OBJECT_IMAGE1D;
681*6467f958SSadaf Ebrahimi case GL_TEXTURE_BUFFER:
682*6467f958SSadaf Ebrahimi image_type = CL_MEM_OBJECT_IMAGE1D_BUFFER;
683*6467f958SSadaf Ebrahimi break;
684*6467f958SSadaf Ebrahimi case GL_TEXTURE_RECTANGLE_EXT:
685*6467f958SSadaf Ebrahimi case GL_TEXTURE_2D:
686*6467f958SSadaf Ebrahimi case GL_COLOR_ATTACHMENT0:
687*6467f958SSadaf Ebrahimi case GL_RENDERBUFFER:
688*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP:
689*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
690*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
691*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
692*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
693*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
694*6467f958SSadaf Ebrahimi case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
695*6467f958SSadaf Ebrahimi image_type = CL_MEM_OBJECT_IMAGE2D;
696*6467f958SSadaf Ebrahimi break;
697*6467f958SSadaf Ebrahimi case GL_TEXTURE_3D: image_type = CL_MEM_OBJECT_IMAGE3D;
698*6467f958SSadaf Ebrahimi case GL_TEXTURE_1D_ARRAY: image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY;
699*6467f958SSadaf Ebrahimi case GL_TEXTURE_2D_ARRAY:
700*6467f958SSadaf Ebrahimi image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY;
701*6467f958SSadaf Ebrahimi break;
702*6467f958SSadaf Ebrahimi default: image_type = CL_MEM_OBJECT_IMAGE2D;
703*6467f958SSadaf Ebrahimi }
704*6467f958SSadaf Ebrahimi
705*6467f958SSadaf Ebrahimi if ((error =
706*6467f958SSadaf Ebrahimi clGetSupportedImageFormats(context, CL_MEM_READ_WRITE, image_type,
707*6467f958SSadaf Ebrahimi 128, formatList, &formatCount)))
708*6467f958SSadaf Ebrahimi {
709*6467f958SSadaf Ebrahimi return error;
710*6467f958SSadaf Ebrahimi }
711*6467f958SSadaf Ebrahimi
712*6467f958SSadaf Ebrahimi // Check if the RGB 101010 format is supported
713*6467f958SSadaf Ebrahimi for (i = 0; i < formatCount; i++)
714*6467f958SSadaf Ebrahimi {
715*6467f958SSadaf Ebrahimi if (formatList[i].image_channel_data_type == CL_UNORM_INT_101010)
716*6467f958SSadaf Ebrahimi {
717*6467f958SSadaf Ebrahimi return 1;
718*6467f958SSadaf Ebrahimi }
719*6467f958SSadaf Ebrahimi }
720*6467f958SSadaf Ebrahimi
721*6467f958SSadaf Ebrahimi return 0;
722*6467f958SSadaf Ebrahimi }
723