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 _imageHelpers_h
17*6467f958SSadaf Ebrahimi #define _imageHelpers_h
18*6467f958SSadaf Ebrahimi
19*6467f958SSadaf Ebrahimi #include "compat.h"
20*6467f958SSadaf Ebrahimi
21*6467f958SSadaf Ebrahimi #include <stdio.h>
22*6467f958SSadaf Ebrahimi #include <stdlib.h>
23*6467f958SSadaf Ebrahimi #include <string.h>
24*6467f958SSadaf Ebrahimi #include <sys/types.h>
25*6467f958SSadaf Ebrahimi #include <sys/stat.h>
26*6467f958SSadaf Ebrahimi #include <vector>
27*6467f958SSadaf Ebrahimi
28*6467f958SSadaf Ebrahimi #if !defined(_WIN32)
29*6467f958SSadaf Ebrahimi #include <unistd.h>
30*6467f958SSadaf Ebrahimi #endif
31*6467f958SSadaf Ebrahimi
32*6467f958SSadaf Ebrahimi #include <time.h>
33*6467f958SSadaf Ebrahimi
34*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
35*6467f958SSadaf Ebrahimi
36*6467f958SSadaf Ebrahimi #include "conversions.h"
37*6467f958SSadaf Ebrahimi #include "typeWrappers.h"
38*6467f958SSadaf Ebrahimi #include "kernelHelpers.h"
39*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
40*6467f958SSadaf Ebrahimi #include "mt19937.h"
41*6467f958SSadaf Ebrahimi #include "rounding_mode.h"
42*6467f958SSadaf Ebrahimi #include "clImageHelper.h"
43*6467f958SSadaf Ebrahimi
44*6467f958SSadaf Ebrahimi #include <CL/cl_half.h>
45*6467f958SSadaf Ebrahimi
46*6467f958SSadaf Ebrahimi extern cl_device_type gDeviceType;
47*6467f958SSadaf Ebrahimi extern bool gTestRounding;
48*6467f958SSadaf Ebrahimi
49*6467f958SSadaf Ebrahimi // Number of iterations per image format to test if not testing max images,
50*6467f958SSadaf Ebrahimi // rounding, or small images
51*6467f958SSadaf Ebrahimi #define NUM_IMAGE_ITERATIONS 3
52*6467f958SSadaf Ebrahimi
53*6467f958SSadaf Ebrahimi
54*6467f958SSadaf Ebrahimi // Definition for our own sampler type, to mirror the cl_sampler internals
55*6467f958SSadaf Ebrahimi #define MAX_sRGB_TO_lRGB_CONVERSION_ERROR 0.5
56*6467f958SSadaf Ebrahimi #define MAX_lRGB_TO_sRGB_CONVERSION_ERROR 0.6
57*6467f958SSadaf Ebrahimi
58*6467f958SSadaf Ebrahimi // Definition for our own sampler type, to mirror the cl_sampler internals
59*6467f958SSadaf Ebrahimi typedef struct
60*6467f958SSadaf Ebrahimi {
61*6467f958SSadaf Ebrahimi cl_addressing_mode addressing_mode;
62*6467f958SSadaf Ebrahimi cl_filter_mode filter_mode;
63*6467f958SSadaf Ebrahimi bool normalized_coords;
64*6467f958SSadaf Ebrahimi } image_sampler_data;
65*6467f958SSadaf Ebrahimi
66*6467f958SSadaf Ebrahimi cl_int round_to_even(float v);
67*6467f958SSadaf Ebrahimi
68*6467f958SSadaf Ebrahimi #define NORMALIZE(v, max) (v < 0 ? 0 : (v > 1.f ? max : round_to_even(v * max)))
69*6467f958SSadaf Ebrahimi #define NORMALIZE_UNROUNDED(v, max) (v < 0 ? 0 : (v > 1.f ? max : v * max))
70*6467f958SSadaf Ebrahimi #define NORMALIZE_SIGNED(v, min, max) \
71*6467f958SSadaf Ebrahimi (v < -1.0f ? min : (v > 1.f ? max : round_to_even(v * max)))
72*6467f958SSadaf Ebrahimi #define NORMALIZE_SIGNED_UNROUNDED(v, min, max) \
73*6467f958SSadaf Ebrahimi (v < -1.0f ? min : (v > 1.f ? max : v * max))
74*6467f958SSadaf Ebrahimi #define CONVERT_INT(v, min, max, max_val) \
75*6467f958SSadaf Ebrahimi (v < min ? min : (v > max ? max_val : round_to_even(v)))
76*6467f958SSadaf Ebrahimi #define CONVERT_UINT(v, max, max_val) \
77*6467f958SSadaf Ebrahimi (v < 0 ? 0 : (v > max ? max_val : round_to_even(v)))
78*6467f958SSadaf Ebrahimi
79*6467f958SSadaf Ebrahimi extern void print_read_header(const cl_image_format *format,
80*6467f958SSadaf Ebrahimi image_sampler_data *sampler, bool err = false,
81*6467f958SSadaf Ebrahimi int t = 0);
82*6467f958SSadaf Ebrahimi extern void print_write_header(const cl_image_format *format, bool err);
83*6467f958SSadaf Ebrahimi extern void print_header(const cl_image_format *format, bool err);
84*6467f958SSadaf Ebrahimi extern bool find_format(cl_image_format *formatList, unsigned int numFormats,
85*6467f958SSadaf Ebrahimi cl_image_format *formatToFind);
86*6467f958SSadaf Ebrahimi extern bool is_image_format_required(cl_image_format format, cl_mem_flags flags,
87*6467f958SSadaf Ebrahimi cl_mem_object_type image_type,
88*6467f958SSadaf Ebrahimi cl_device_id device);
89*6467f958SSadaf Ebrahimi extern void
90*6467f958SSadaf Ebrahimi build_required_image_formats(cl_mem_flags flags, cl_mem_object_type image_type,
91*6467f958SSadaf Ebrahimi cl_device_id device,
92*6467f958SSadaf Ebrahimi std::vector<cl_image_format> &formatsToSupport);
93*6467f958SSadaf Ebrahimi
94*6467f958SSadaf Ebrahimi extern uint32_t get_format_type_size(const cl_image_format *format);
95*6467f958SSadaf Ebrahimi extern uint32_t get_channel_data_type_size(cl_channel_type channelType);
96*6467f958SSadaf Ebrahimi extern uint32_t get_format_channel_count(const cl_image_format *format);
97*6467f958SSadaf Ebrahimi extern uint32_t get_channel_order_channel_count(cl_channel_order order);
98*6467f958SSadaf Ebrahimi cl_channel_type get_channel_type_from_name(const char *name);
99*6467f958SSadaf Ebrahimi cl_channel_order get_channel_order_from_name(const char *name);
100*6467f958SSadaf Ebrahimi extern int is_format_signed(const cl_image_format *format);
101*6467f958SSadaf Ebrahimi extern uint32_t get_pixel_size(const cl_image_format *format);
102*6467f958SSadaf Ebrahimi
103*6467f958SSadaf Ebrahimi /* Helper to get any ol image format as long as it is 8-bits-per-channel */
104*6467f958SSadaf Ebrahimi extern int get_8_bit_image_format(cl_context context,
105*6467f958SSadaf Ebrahimi cl_mem_object_type objType,
106*6467f958SSadaf Ebrahimi cl_mem_flags flags, size_t channelCount,
107*6467f958SSadaf Ebrahimi cl_image_format *outFormat);
108*6467f958SSadaf Ebrahimi
109*6467f958SSadaf Ebrahimi /* Helper to get any ol image format as long as it is 32-bits-per-channel */
110*6467f958SSadaf Ebrahimi extern int get_32_bit_image_format(cl_context context,
111*6467f958SSadaf Ebrahimi cl_mem_object_type objType,
112*6467f958SSadaf Ebrahimi cl_mem_flags flags, size_t channelCount,
113*6467f958SSadaf Ebrahimi cl_image_format *outFormat);
114*6467f958SSadaf Ebrahimi
115*6467f958SSadaf Ebrahimi int random_in_range(int minV, int maxV, MTdata d);
116*6467f958SSadaf Ebrahimi int random_log_in_range(int minV, int maxV, MTdata d);
117*6467f958SSadaf Ebrahimi
118*6467f958SSadaf Ebrahimi typedef struct
119*6467f958SSadaf Ebrahimi {
120*6467f958SSadaf Ebrahimi size_t width;
121*6467f958SSadaf Ebrahimi size_t height;
122*6467f958SSadaf Ebrahimi size_t depth;
123*6467f958SSadaf Ebrahimi size_t rowPitch;
124*6467f958SSadaf Ebrahimi size_t slicePitch;
125*6467f958SSadaf Ebrahimi size_t arraySize;
126*6467f958SSadaf Ebrahimi const cl_image_format *format;
127*6467f958SSadaf Ebrahimi cl_mem buffer;
128*6467f958SSadaf Ebrahimi cl_mem_object_type type;
129*6467f958SSadaf Ebrahimi cl_uint num_mip_levels;
130*6467f958SSadaf Ebrahimi } image_descriptor;
131*6467f958SSadaf Ebrahimi
132*6467f958SSadaf Ebrahimi typedef struct
133*6467f958SSadaf Ebrahimi {
134*6467f958SSadaf Ebrahimi float p[4];
135*6467f958SSadaf Ebrahimi } FloatPixel;
136*6467f958SSadaf Ebrahimi
137*6467f958SSadaf Ebrahimi void print_first_pixel_difference_error(size_t where, const char *sourcePixel,
138*6467f958SSadaf Ebrahimi const char *destPixel,
139*6467f958SSadaf Ebrahimi image_descriptor *imageInfo, size_t y,
140*6467f958SSadaf Ebrahimi size_t thirdDim);
141*6467f958SSadaf Ebrahimi
142*6467f958SSadaf Ebrahimi size_t compare_scanlines(const image_descriptor *imageInfo, const char *aPtr,
143*6467f958SSadaf Ebrahimi const char *bPtr);
144*6467f958SSadaf Ebrahimi
145*6467f958SSadaf Ebrahimi void get_max_sizes(size_t *numberOfSizes, const int maxNumberOfSizes,
146*6467f958SSadaf Ebrahimi size_t sizes[][3], size_t maxWidth, size_t maxHeight,
147*6467f958SSadaf Ebrahimi size_t maxDepth, size_t maxArraySize,
148*6467f958SSadaf Ebrahimi const cl_ulong maxIndividualAllocSize,
149*6467f958SSadaf Ebrahimi const cl_ulong maxTotalAllocSize,
150*6467f958SSadaf Ebrahimi cl_mem_object_type image_type, const cl_image_format *format,
151*6467f958SSadaf Ebrahimi int usingMaxPixelSize = 0);
152*6467f958SSadaf Ebrahimi extern size_t get_format_max_int(const cl_image_format *format);
153*6467f958SSadaf Ebrahimi
154*6467f958SSadaf Ebrahimi extern cl_ulong get_image_size(image_descriptor const *imageInfo);
155*6467f958SSadaf Ebrahimi extern cl_ulong get_image_size_mb(image_descriptor const *imageInfo);
156*6467f958SSadaf Ebrahimi
157*6467f958SSadaf Ebrahimi extern char *generate_random_image_data(image_descriptor *imageInfo,
158*6467f958SSadaf Ebrahimi BufferOwningPtr<char> &Owner, MTdata d);
159*6467f958SSadaf Ebrahimi
160*6467f958SSadaf Ebrahimi extern int debug_find_vector_in_image(void *imagePtr,
161*6467f958SSadaf Ebrahimi image_descriptor *imageInfo,
162*6467f958SSadaf Ebrahimi void *vectorToFind, size_t vectorSize,
163*6467f958SSadaf Ebrahimi int *outX, int *outY, int *outZ,
164*6467f958SSadaf Ebrahimi size_t lod = 0);
165*6467f958SSadaf Ebrahimi
166*6467f958SSadaf Ebrahimi extern int debug_find_pixel_in_image(void *imagePtr,
167*6467f958SSadaf Ebrahimi image_descriptor *imageInfo,
168*6467f958SSadaf Ebrahimi unsigned int *valuesToFind, int *outX,
169*6467f958SSadaf Ebrahimi int *outY, int *outZ, int lod = 0);
170*6467f958SSadaf Ebrahimi extern int debug_find_pixel_in_image(void *imagePtr,
171*6467f958SSadaf Ebrahimi image_descriptor *imageInfo,
172*6467f958SSadaf Ebrahimi int *valuesToFind, int *outX, int *outY,
173*6467f958SSadaf Ebrahimi int *outZ, int lod = 0);
174*6467f958SSadaf Ebrahimi extern int debug_find_pixel_in_image(void *imagePtr,
175*6467f958SSadaf Ebrahimi image_descriptor *imageInfo,
176*6467f958SSadaf Ebrahimi float *valuesToFind, int *outX, int *outY,
177*6467f958SSadaf Ebrahimi int *outZ, int lod = 0);
178*6467f958SSadaf Ebrahimi
179*6467f958SSadaf Ebrahimi extern void copy_image_data(image_descriptor *srcImageInfo,
180*6467f958SSadaf Ebrahimi image_descriptor *dstImageInfo, void *imageValues,
181*6467f958SSadaf Ebrahimi void *destImageValues, const size_t sourcePos[],
182*6467f958SSadaf Ebrahimi const size_t destPos[], const size_t regionSize[]);
183*6467f958SSadaf Ebrahimi
184*6467f958SSadaf Ebrahimi int has_alpha(const cl_image_format *format);
185*6467f958SSadaf Ebrahimi
186*6467f958SSadaf Ebrahimi extern bool is_sRGBA_order(cl_channel_order image_channel_order);
187*6467f958SSadaf Ebrahimi
188*6467f958SSadaf Ebrahimi inline float calculate_array_index(float coord, float extent);
189*6467f958SSadaf Ebrahimi
190*6467f958SSadaf Ebrahimi cl_uint compute_max_mip_levels(size_t width, size_t height, size_t depth);
191*6467f958SSadaf Ebrahimi cl_ulong compute_mipmapped_image_size(image_descriptor imageInfo);
192*6467f958SSadaf Ebrahimi size_t compute_mip_level_offset(image_descriptor *imageInfo, size_t lod);
193*6467f958SSadaf Ebrahimi
194*6467f958SSadaf Ebrahimi template <class T>
read_image_pixel(void * imageData,image_descriptor * imageInfo,int x,int y,int z,T * outData,int lod)195*6467f958SSadaf Ebrahimi void read_image_pixel(void *imageData, image_descriptor *imageInfo, int x,
196*6467f958SSadaf Ebrahimi int y, int z, T *outData, int lod)
197*6467f958SSadaf Ebrahimi {
198*6467f958SSadaf Ebrahimi size_t width_lod = imageInfo->width, height_lod = imageInfo->height,
199*6467f958SSadaf Ebrahimi depth_lod = imageInfo->depth,
200*6467f958SSadaf Ebrahimi slice_pitch_lod = 0 /*imageInfo->slicePitch*/,
201*6467f958SSadaf Ebrahimi row_pitch_lod = 0 /*imageInfo->rowPitch*/;
202*6467f958SSadaf Ebrahimi width_lod = (imageInfo->width >> lod) ? (imageInfo->width >> lod) : 1;
203*6467f958SSadaf Ebrahimi
204*6467f958SSadaf Ebrahimi if (imageInfo->type != CL_MEM_OBJECT_IMAGE1D_ARRAY
205*6467f958SSadaf Ebrahimi && imageInfo->type != CL_MEM_OBJECT_IMAGE1D)
206*6467f958SSadaf Ebrahimi height_lod =
207*6467f958SSadaf Ebrahimi (imageInfo->height >> lod) ? (imageInfo->height >> lod) : 1;
208*6467f958SSadaf Ebrahimi
209*6467f958SSadaf Ebrahimi if (imageInfo->type == CL_MEM_OBJECT_IMAGE3D)
210*6467f958SSadaf Ebrahimi depth_lod = (imageInfo->depth >> lod) ? (imageInfo->depth >> lod) : 1;
211*6467f958SSadaf Ebrahimi row_pitch_lod = (imageInfo->num_mip_levels > 0)
212*6467f958SSadaf Ebrahimi ? (width_lod * get_pixel_size(imageInfo->format))
213*6467f958SSadaf Ebrahimi : imageInfo->rowPitch;
214*6467f958SSadaf Ebrahimi slice_pitch_lod = (imageInfo->num_mip_levels > 0)
215*6467f958SSadaf Ebrahimi ? (row_pitch_lod * height_lod)
216*6467f958SSadaf Ebrahimi : imageInfo->slicePitch;
217*6467f958SSadaf Ebrahimi
218*6467f958SSadaf Ebrahimi // correct depth_lod and height_lod for array image types in order to avoid
219*6467f958SSadaf Ebrahimi // return
220*6467f958SSadaf Ebrahimi if (imageInfo->type == CL_MEM_OBJECT_IMAGE1D_ARRAY && height_lod == 1
221*6467f958SSadaf Ebrahimi && depth_lod == 1)
222*6467f958SSadaf Ebrahimi {
223*6467f958SSadaf Ebrahimi depth_lod = 0;
224*6467f958SSadaf Ebrahimi height_lod = 0;
225*6467f958SSadaf Ebrahimi }
226*6467f958SSadaf Ebrahimi
227*6467f958SSadaf Ebrahimi if (imageInfo->type == CL_MEM_OBJECT_IMAGE2D_ARRAY && depth_lod == 1)
228*6467f958SSadaf Ebrahimi {
229*6467f958SSadaf Ebrahimi depth_lod = 0;
230*6467f958SSadaf Ebrahimi }
231*6467f958SSadaf Ebrahimi
232*6467f958SSadaf Ebrahimi if (x < 0 || x >= (int)width_lod
233*6467f958SSadaf Ebrahimi || (height_lod != 0 && (y < 0 || y >= (int)height_lod))
234*6467f958SSadaf Ebrahimi || (depth_lod != 0 && (z < 0 || z >= (int)depth_lod))
235*6467f958SSadaf Ebrahimi || (imageInfo->arraySize != 0
236*6467f958SSadaf Ebrahimi && (z < 0 || z >= (int)imageInfo->arraySize)))
237*6467f958SSadaf Ebrahimi {
238*6467f958SSadaf Ebrahimi // Border color
239*6467f958SSadaf Ebrahimi if (imageInfo->format->image_channel_order == CL_DEPTH)
240*6467f958SSadaf Ebrahimi {
241*6467f958SSadaf Ebrahimi outData[0] = 1;
242*6467f958SSadaf Ebrahimi }
243*6467f958SSadaf Ebrahimi else
244*6467f958SSadaf Ebrahimi {
245*6467f958SSadaf Ebrahimi outData[0] = outData[1] = outData[2] = outData[3] = 0;
246*6467f958SSadaf Ebrahimi if (!has_alpha(imageInfo->format)) outData[3] = 1;
247*6467f958SSadaf Ebrahimi }
248*6467f958SSadaf Ebrahimi return;
249*6467f958SSadaf Ebrahimi }
250*6467f958SSadaf Ebrahimi
251*6467f958SSadaf Ebrahimi const cl_image_format *format = imageInfo->format;
252*6467f958SSadaf Ebrahimi
253*6467f958SSadaf Ebrahimi unsigned int i;
254*6467f958SSadaf Ebrahimi T tempData[4];
255*6467f958SSadaf Ebrahimi
256*6467f958SSadaf Ebrahimi // Advance to the right spot
257*6467f958SSadaf Ebrahimi char *ptr = (char *)imageData;
258*6467f958SSadaf Ebrahimi size_t pixelSize = get_pixel_size(format);
259*6467f958SSadaf Ebrahimi
260*6467f958SSadaf Ebrahimi ptr += z * slice_pitch_lod + y * row_pitch_lod + x * pixelSize;
261*6467f958SSadaf Ebrahimi
262*6467f958SSadaf Ebrahimi // OpenCL only supports reading floats from certain formats
263*6467f958SSadaf Ebrahimi switch (format->image_channel_data_type)
264*6467f958SSadaf Ebrahimi {
265*6467f958SSadaf Ebrahimi case CL_SNORM_INT8: {
266*6467f958SSadaf Ebrahimi cl_char *dPtr = (cl_char *)ptr;
267*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
268*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
269*6467f958SSadaf Ebrahimi break;
270*6467f958SSadaf Ebrahimi }
271*6467f958SSadaf Ebrahimi
272*6467f958SSadaf Ebrahimi case CL_UNORM_INT8: {
273*6467f958SSadaf Ebrahimi cl_uchar *dPtr = (cl_uchar *)ptr;
274*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
275*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
276*6467f958SSadaf Ebrahimi break;
277*6467f958SSadaf Ebrahimi }
278*6467f958SSadaf Ebrahimi
279*6467f958SSadaf Ebrahimi case CL_SIGNED_INT8: {
280*6467f958SSadaf Ebrahimi cl_char *dPtr = (cl_char *)ptr;
281*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
282*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
283*6467f958SSadaf Ebrahimi break;
284*6467f958SSadaf Ebrahimi }
285*6467f958SSadaf Ebrahimi
286*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT8: {
287*6467f958SSadaf Ebrahimi cl_uchar *dPtr = (cl_uchar *)ptr;
288*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
289*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
290*6467f958SSadaf Ebrahimi break;
291*6467f958SSadaf Ebrahimi }
292*6467f958SSadaf Ebrahimi
293*6467f958SSadaf Ebrahimi case CL_SNORM_INT16: {
294*6467f958SSadaf Ebrahimi cl_short *dPtr = (cl_short *)ptr;
295*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
296*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
297*6467f958SSadaf Ebrahimi break;
298*6467f958SSadaf Ebrahimi }
299*6467f958SSadaf Ebrahimi
300*6467f958SSadaf Ebrahimi case CL_UNORM_INT16: {
301*6467f958SSadaf Ebrahimi cl_ushort *dPtr = (cl_ushort *)ptr;
302*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
303*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
304*6467f958SSadaf Ebrahimi break;
305*6467f958SSadaf Ebrahimi }
306*6467f958SSadaf Ebrahimi
307*6467f958SSadaf Ebrahimi case CL_SIGNED_INT16: {
308*6467f958SSadaf Ebrahimi cl_short *dPtr = (cl_short *)ptr;
309*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
310*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
311*6467f958SSadaf Ebrahimi break;
312*6467f958SSadaf Ebrahimi }
313*6467f958SSadaf Ebrahimi
314*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT16: {
315*6467f958SSadaf Ebrahimi cl_ushort *dPtr = (cl_ushort *)ptr;
316*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
317*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
318*6467f958SSadaf Ebrahimi break;
319*6467f958SSadaf Ebrahimi }
320*6467f958SSadaf Ebrahimi
321*6467f958SSadaf Ebrahimi case CL_HALF_FLOAT: {
322*6467f958SSadaf Ebrahimi cl_half *dPtr = (cl_half *)ptr;
323*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
324*6467f958SSadaf Ebrahimi tempData[i] = (T)cl_half_to_float(dPtr[i]);
325*6467f958SSadaf Ebrahimi break;
326*6467f958SSadaf Ebrahimi }
327*6467f958SSadaf Ebrahimi
328*6467f958SSadaf Ebrahimi case CL_SIGNED_INT32: {
329*6467f958SSadaf Ebrahimi cl_int *dPtr = (cl_int *)ptr;
330*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
331*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
332*6467f958SSadaf Ebrahimi break;
333*6467f958SSadaf Ebrahimi }
334*6467f958SSadaf Ebrahimi
335*6467f958SSadaf Ebrahimi case CL_UNSIGNED_INT32: {
336*6467f958SSadaf Ebrahimi cl_uint *dPtr = (cl_uint *)ptr;
337*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
338*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
339*6467f958SSadaf Ebrahimi break;
340*6467f958SSadaf Ebrahimi }
341*6467f958SSadaf Ebrahimi
342*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_565: {
343*6467f958SSadaf Ebrahimi cl_ushort *dPtr = (cl_ushort *)ptr;
344*6467f958SSadaf Ebrahimi tempData[0] = (T)(dPtr[0] >> 11);
345*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 5) & 63);
346*6467f958SSadaf Ebrahimi tempData[2] = (T)(dPtr[0] & 31);
347*6467f958SSadaf Ebrahimi break;
348*6467f958SSadaf Ebrahimi }
349*6467f958SSadaf Ebrahimi
350*6467f958SSadaf Ebrahimi #ifdef OBSOLETE_FORMAT
351*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_565_REV: {
352*6467f958SSadaf Ebrahimi unsigned short *dPtr = (unsigned short *)ptr;
353*6467f958SSadaf Ebrahimi tempData[2] = (T)(dPtr[0] >> 11);
354*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 5) & 63);
355*6467f958SSadaf Ebrahimi tempData[0] = (T)(dPtr[0] & 31);
356*6467f958SSadaf Ebrahimi break;
357*6467f958SSadaf Ebrahimi }
358*6467f958SSadaf Ebrahimi
359*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_555_REV: {
360*6467f958SSadaf Ebrahimi unsigned short *dPtr = (unsigned short *)ptr;
361*6467f958SSadaf Ebrahimi tempData[2] = (T)((dPtr[0] >> 10) & 31);
362*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 5) & 31);
363*6467f958SSadaf Ebrahimi tempData[0] = (T)(dPtr[0] & 31);
364*6467f958SSadaf Ebrahimi break;
365*6467f958SSadaf Ebrahimi }
366*6467f958SSadaf Ebrahimi
367*6467f958SSadaf Ebrahimi case CL_UNORM_INT_8888: {
368*6467f958SSadaf Ebrahimi unsigned int *dPtr = (unsigned int *)ptr;
369*6467f958SSadaf Ebrahimi tempData[3] = (T)(dPtr[0] >> 24);
370*6467f958SSadaf Ebrahimi tempData[2] = (T)((dPtr[0] >> 16) & 0xff);
371*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 8) & 0xff);
372*6467f958SSadaf Ebrahimi tempData[0] = (T)(dPtr[0] & 0xff);
373*6467f958SSadaf Ebrahimi break;
374*6467f958SSadaf Ebrahimi }
375*6467f958SSadaf Ebrahimi case CL_UNORM_INT_8888_REV: {
376*6467f958SSadaf Ebrahimi unsigned int *dPtr = (unsigned int *)ptr;
377*6467f958SSadaf Ebrahimi tempData[0] = (T)(dPtr[0] >> 24);
378*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 16) & 0xff);
379*6467f958SSadaf Ebrahimi tempData[2] = (T)((dPtr[0] >> 8) & 0xff);
380*6467f958SSadaf Ebrahimi tempData[3] = (T)(dPtr[0] & 0xff);
381*6467f958SSadaf Ebrahimi break;
382*6467f958SSadaf Ebrahimi }
383*6467f958SSadaf Ebrahimi
384*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010_REV: {
385*6467f958SSadaf Ebrahimi unsigned int *dPtr = (unsigned int *)ptr;
386*6467f958SSadaf Ebrahimi tempData[2] = (T)((dPtr[0] >> 20) & 0x3ff);
387*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 10) & 0x3ff);
388*6467f958SSadaf Ebrahimi tempData[0] = (T)(dPtr[0] & 0x3ff);
389*6467f958SSadaf Ebrahimi break;
390*6467f958SSadaf Ebrahimi }
391*6467f958SSadaf Ebrahimi #endif
392*6467f958SSadaf Ebrahimi case CL_UNORM_SHORT_555: {
393*6467f958SSadaf Ebrahimi cl_ushort *dPtr = (cl_ushort *)ptr;
394*6467f958SSadaf Ebrahimi tempData[0] = (T)((dPtr[0] >> 10) & 31);
395*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 5) & 31);
396*6467f958SSadaf Ebrahimi tempData[2] = (T)(dPtr[0] & 31);
397*6467f958SSadaf Ebrahimi break;
398*6467f958SSadaf Ebrahimi }
399*6467f958SSadaf Ebrahimi
400*6467f958SSadaf Ebrahimi case CL_UNORM_INT_101010: {
401*6467f958SSadaf Ebrahimi cl_uint *dPtr = (cl_uint *)ptr;
402*6467f958SSadaf Ebrahimi tempData[0] = (T)((dPtr[0] >> 20) & 0x3ff);
403*6467f958SSadaf Ebrahimi tempData[1] = (T)((dPtr[0] >> 10) & 0x3ff);
404*6467f958SSadaf Ebrahimi tempData[2] = (T)(dPtr[0] & 0x3ff);
405*6467f958SSadaf Ebrahimi break;
406*6467f958SSadaf Ebrahimi }
407*6467f958SSadaf Ebrahimi
408*6467f958SSadaf Ebrahimi case CL_FLOAT: {
409*6467f958SSadaf Ebrahimi cl_float *dPtr = (cl_float *)ptr;
410*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
411*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i];
412*6467f958SSadaf Ebrahimi break;
413*6467f958SSadaf Ebrahimi }
414*6467f958SSadaf Ebrahimi #ifdef CL_SFIXED14_APPLE
415*6467f958SSadaf Ebrahimi case CL_SFIXED14_APPLE: {
416*6467f958SSadaf Ebrahimi cl_float *dPtr = (cl_float *)ptr;
417*6467f958SSadaf Ebrahimi for (i = 0; i < get_format_channel_count(format); i++)
418*6467f958SSadaf Ebrahimi tempData[i] = (T)dPtr[i] + 0x4000;
419*6467f958SSadaf Ebrahimi break;
420*6467f958SSadaf Ebrahimi }
421*6467f958SSadaf Ebrahimi #endif
422*6467f958SSadaf Ebrahimi }
423*6467f958SSadaf Ebrahimi
424*6467f958SSadaf Ebrahimi
425*6467f958SSadaf Ebrahimi outData[0] = outData[1] = outData[2] = 0;
426*6467f958SSadaf Ebrahimi outData[3] = 1;
427*6467f958SSadaf Ebrahimi
428*6467f958SSadaf Ebrahimi if (format->image_channel_order == CL_A)
429*6467f958SSadaf Ebrahimi {
430*6467f958SSadaf Ebrahimi outData[3] = tempData[0];
431*6467f958SSadaf Ebrahimi }
432*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_R)
433*6467f958SSadaf Ebrahimi {
434*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
435*6467f958SSadaf Ebrahimi }
436*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_Rx)
437*6467f958SSadaf Ebrahimi {
438*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
439*6467f958SSadaf Ebrahimi }
440*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_RA)
441*6467f958SSadaf Ebrahimi {
442*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
443*6467f958SSadaf Ebrahimi outData[3] = tempData[1];
444*6467f958SSadaf Ebrahimi }
445*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_RG)
446*6467f958SSadaf Ebrahimi {
447*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
448*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
449*6467f958SSadaf Ebrahimi }
450*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_RGx)
451*6467f958SSadaf Ebrahimi {
452*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
453*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
454*6467f958SSadaf Ebrahimi }
455*6467f958SSadaf Ebrahimi else if ((format->image_channel_order == CL_RGB)
456*6467f958SSadaf Ebrahimi || (format->image_channel_order == CL_sRGB))
457*6467f958SSadaf Ebrahimi {
458*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
459*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
460*6467f958SSadaf Ebrahimi outData[2] = tempData[2];
461*6467f958SSadaf Ebrahimi }
462*6467f958SSadaf Ebrahimi else if ((format->image_channel_order == CL_RGBx)
463*6467f958SSadaf Ebrahimi || (format->image_channel_order == CL_sRGBx))
464*6467f958SSadaf Ebrahimi {
465*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
466*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
467*6467f958SSadaf Ebrahimi outData[2] = tempData[2];
468*6467f958SSadaf Ebrahimi outData[3] = 0;
469*6467f958SSadaf Ebrahimi }
470*6467f958SSadaf Ebrahimi else if ((format->image_channel_order == CL_RGBA)
471*6467f958SSadaf Ebrahimi || (format->image_channel_order == CL_sRGBA))
472*6467f958SSadaf Ebrahimi {
473*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
474*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
475*6467f958SSadaf Ebrahimi outData[2] = tempData[2];
476*6467f958SSadaf Ebrahimi outData[3] = tempData[3];
477*6467f958SSadaf Ebrahimi }
478*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_ARGB)
479*6467f958SSadaf Ebrahimi {
480*6467f958SSadaf Ebrahimi outData[0] = tempData[1];
481*6467f958SSadaf Ebrahimi outData[1] = tempData[2];
482*6467f958SSadaf Ebrahimi outData[2] = tempData[3];
483*6467f958SSadaf Ebrahimi outData[3] = tempData[0];
484*6467f958SSadaf Ebrahimi }
485*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_ABGR)
486*6467f958SSadaf Ebrahimi {
487*6467f958SSadaf Ebrahimi outData[0] = tempData[3];
488*6467f958SSadaf Ebrahimi outData[1] = tempData[2];
489*6467f958SSadaf Ebrahimi outData[2] = tempData[1];
490*6467f958SSadaf Ebrahimi outData[3] = tempData[0];
491*6467f958SSadaf Ebrahimi }
492*6467f958SSadaf Ebrahimi else if ((format->image_channel_order == CL_BGRA)
493*6467f958SSadaf Ebrahimi || (format->image_channel_order == CL_sBGRA))
494*6467f958SSadaf Ebrahimi {
495*6467f958SSadaf Ebrahimi outData[0] = tempData[2];
496*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
497*6467f958SSadaf Ebrahimi outData[2] = tempData[0];
498*6467f958SSadaf Ebrahimi outData[3] = tempData[3];
499*6467f958SSadaf Ebrahimi }
500*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_INTENSITY)
501*6467f958SSadaf Ebrahimi {
502*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
503*6467f958SSadaf Ebrahimi outData[1] = tempData[0];
504*6467f958SSadaf Ebrahimi outData[2] = tempData[0];
505*6467f958SSadaf Ebrahimi outData[3] = tempData[0];
506*6467f958SSadaf Ebrahimi }
507*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_LUMINANCE)
508*6467f958SSadaf Ebrahimi {
509*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
510*6467f958SSadaf Ebrahimi outData[1] = tempData[0];
511*6467f958SSadaf Ebrahimi outData[2] = tempData[0];
512*6467f958SSadaf Ebrahimi }
513*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_DEPTH)
514*6467f958SSadaf Ebrahimi {
515*6467f958SSadaf Ebrahimi outData[0] = tempData[0];
516*6467f958SSadaf Ebrahimi }
517*6467f958SSadaf Ebrahimi #ifdef CL_1RGB_APPLE
518*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_1RGB_APPLE)
519*6467f958SSadaf Ebrahimi {
520*6467f958SSadaf Ebrahimi outData[0] = tempData[1];
521*6467f958SSadaf Ebrahimi outData[1] = tempData[2];
522*6467f958SSadaf Ebrahimi outData[2] = tempData[3];
523*6467f958SSadaf Ebrahimi outData[3] = 0xff;
524*6467f958SSadaf Ebrahimi }
525*6467f958SSadaf Ebrahimi #endif
526*6467f958SSadaf Ebrahimi #ifdef CL_BGR1_APPLE
527*6467f958SSadaf Ebrahimi else if (format->image_channel_order == CL_BGR1_APPLE)
528*6467f958SSadaf Ebrahimi {
529*6467f958SSadaf Ebrahimi outData[0] = tempData[2];
530*6467f958SSadaf Ebrahimi outData[1] = tempData[1];
531*6467f958SSadaf Ebrahimi outData[2] = tempData[0];
532*6467f958SSadaf Ebrahimi outData[3] = 0xff;
533*6467f958SSadaf Ebrahimi }
534*6467f958SSadaf Ebrahimi #endif
535*6467f958SSadaf Ebrahimi else
536*6467f958SSadaf Ebrahimi {
537*6467f958SSadaf Ebrahimi log_error("Invalid format:");
538*6467f958SSadaf Ebrahimi print_header(format, true);
539*6467f958SSadaf Ebrahimi }
540*6467f958SSadaf Ebrahimi }
541*6467f958SSadaf Ebrahimi
542*6467f958SSadaf Ebrahimi template <class T>
read_image_pixel(void * imageData,image_descriptor * imageInfo,int x,int y,int z,T * outData)543*6467f958SSadaf Ebrahimi void read_image_pixel(void *imageData, image_descriptor *imageInfo, int x,
544*6467f958SSadaf Ebrahimi int y, int z, T *outData)
545*6467f958SSadaf Ebrahimi {
546*6467f958SSadaf Ebrahimi read_image_pixel<T>(imageData, imageInfo, x, y, z, outData, 0);
547*6467f958SSadaf Ebrahimi }
548*6467f958SSadaf Ebrahimi
549*6467f958SSadaf Ebrahimi // Stupid template rules
550*6467f958SSadaf Ebrahimi bool get_integer_coords(float x, float y, float z, size_t width, size_t height,
551*6467f958SSadaf Ebrahimi size_t depth, image_sampler_data *imageSampler,
552*6467f958SSadaf Ebrahimi image_descriptor *imageInfo, int &outX, int &outY,
553*6467f958SSadaf Ebrahimi int &outZ);
554*6467f958SSadaf Ebrahimi bool get_integer_coords_offset(float x, float y, float z, float xAddressOffset,
555*6467f958SSadaf Ebrahimi float yAddressOffset, float zAddressOffset,
556*6467f958SSadaf Ebrahimi size_t width, size_t height, size_t depth,
557*6467f958SSadaf Ebrahimi image_sampler_data *imageSampler,
558*6467f958SSadaf Ebrahimi image_descriptor *imageInfo, int &outX,
559*6467f958SSadaf Ebrahimi int &outY, int &outZ);
560*6467f958SSadaf Ebrahimi
561*6467f958SSadaf Ebrahimi
562*6467f958SSadaf Ebrahimi template <class T>
sample_image_pixel_offset(void * imageData,image_descriptor * imageInfo,float x,float y,float z,float xAddressOffset,float yAddressOffset,float zAddressOffset,image_sampler_data * imageSampler,T * outData,int lod)563*6467f958SSadaf Ebrahimi void sample_image_pixel_offset(void *imageData, image_descriptor *imageInfo,
564*6467f958SSadaf Ebrahimi float x, float y, float z, float xAddressOffset,
565*6467f958SSadaf Ebrahimi float yAddressOffset, float zAddressOffset,
566*6467f958SSadaf Ebrahimi image_sampler_data *imageSampler, T *outData,
567*6467f958SSadaf Ebrahimi int lod)
568*6467f958SSadaf Ebrahimi {
569*6467f958SSadaf Ebrahimi int iX = 0, iY = 0, iZ = 0;
570*6467f958SSadaf Ebrahimi
571*6467f958SSadaf Ebrahimi float max_w = imageInfo->width;
572*6467f958SSadaf Ebrahimi float max_h;
573*6467f958SSadaf Ebrahimi float max_d;
574*6467f958SSadaf Ebrahimi
575*6467f958SSadaf Ebrahimi switch (imageInfo->type)
576*6467f958SSadaf Ebrahimi {
577*6467f958SSadaf Ebrahimi case CL_MEM_OBJECT_IMAGE1D_ARRAY:
578*6467f958SSadaf Ebrahimi max_h = imageInfo->arraySize;
579*6467f958SSadaf Ebrahimi max_d = 0;
580*6467f958SSadaf Ebrahimi break;
581*6467f958SSadaf Ebrahimi case CL_MEM_OBJECT_IMAGE2D_ARRAY:
582*6467f958SSadaf Ebrahimi max_h = imageInfo->height;
583*6467f958SSadaf Ebrahimi max_d = imageInfo->arraySize;
584*6467f958SSadaf Ebrahimi break;
585*6467f958SSadaf Ebrahimi default:
586*6467f958SSadaf Ebrahimi max_h = imageInfo->height;
587*6467f958SSadaf Ebrahimi max_d = imageInfo->depth;
588*6467f958SSadaf Ebrahimi break;
589*6467f958SSadaf Ebrahimi }
590*6467f958SSadaf Ebrahimi
591*6467f958SSadaf Ebrahimi if (/*gTestMipmaps*/ imageInfo->num_mip_levels > 1)
592*6467f958SSadaf Ebrahimi {
593*6467f958SSadaf Ebrahimi switch (imageInfo->type)
594*6467f958SSadaf Ebrahimi {
595*6467f958SSadaf Ebrahimi case CL_MEM_OBJECT_IMAGE3D:
596*6467f958SSadaf Ebrahimi max_d = (float)((imageInfo->depth >> lod)
597*6467f958SSadaf Ebrahimi ? (imageInfo->depth >> lod)
598*6467f958SSadaf Ebrahimi : 1);
599*6467f958SSadaf Ebrahimi case CL_MEM_OBJECT_IMAGE2D:
600*6467f958SSadaf Ebrahimi case CL_MEM_OBJECT_IMAGE2D_ARRAY:
601*6467f958SSadaf Ebrahimi max_h = (float)((imageInfo->height >> lod)
602*6467f958SSadaf Ebrahimi ? (imageInfo->height >> lod)
603*6467f958SSadaf Ebrahimi : 1);
604*6467f958SSadaf Ebrahimi break;
605*6467f958SSadaf Ebrahimi default:;
606*6467f958SSadaf Ebrahimi }
607*6467f958SSadaf Ebrahimi max_w =
608*6467f958SSadaf Ebrahimi (float)((imageInfo->width >> lod) ? (imageInfo->width >> lod) : 1);
609*6467f958SSadaf Ebrahimi }
610*6467f958SSadaf Ebrahimi get_integer_coords_offset(x, y, z, xAddressOffset, yAddressOffset,
611*6467f958SSadaf Ebrahimi zAddressOffset, max_w, max_h, max_d, imageSampler,
612*6467f958SSadaf Ebrahimi imageInfo, iX, iY, iZ);
613*6467f958SSadaf Ebrahimi
614*6467f958SSadaf Ebrahimi read_image_pixel<T>(imageData, imageInfo, iX, iY, iZ, outData, lod);
615*6467f958SSadaf Ebrahimi }
616*6467f958SSadaf Ebrahimi
617*6467f958SSadaf Ebrahimi template <class T>
sample_image_pixel_offset(void * imageData,image_descriptor * imageInfo,float x,float y,float z,float xAddressOffset,float yAddressOffset,float zAddressOffset,image_sampler_data * imageSampler,T * outData)618*6467f958SSadaf Ebrahimi void sample_image_pixel_offset(void *imageData, image_descriptor *imageInfo,
619*6467f958SSadaf Ebrahimi float x, float y, float z, float xAddressOffset,
620*6467f958SSadaf Ebrahimi float yAddressOffset, float zAddressOffset,
621*6467f958SSadaf Ebrahimi image_sampler_data *imageSampler, T *outData)
622*6467f958SSadaf Ebrahimi {
623*6467f958SSadaf Ebrahimi sample_image_pixel_offset<T>(imageData, imageInfo, x, y, z, xAddressOffset,
624*6467f958SSadaf Ebrahimi yAddressOffset, zAddressOffset, imageSampler,
625*6467f958SSadaf Ebrahimi outData, 0);
626*6467f958SSadaf Ebrahimi }
627*6467f958SSadaf Ebrahimi
628*6467f958SSadaf Ebrahimi template <class T>
sample_image_pixel(void * imageData,image_descriptor * imageInfo,float x,float y,float z,image_sampler_data * imageSampler,T * outData)629*6467f958SSadaf Ebrahimi void sample_image_pixel(void *imageData, image_descriptor *imageInfo, float x,
630*6467f958SSadaf Ebrahimi float y, float z, image_sampler_data *imageSampler,
631*6467f958SSadaf Ebrahimi T *outData)
632*6467f958SSadaf Ebrahimi {
633*6467f958SSadaf Ebrahimi return sample_image_pixel_offset<T>(imageData, imageInfo, x, y, z, 0.0f,
634*6467f958SSadaf Ebrahimi 0.0f, 0.0f, imageSampler, outData);
635*6467f958SSadaf Ebrahimi }
636*6467f958SSadaf Ebrahimi
637*6467f958SSadaf Ebrahimi FloatPixel
638*6467f958SSadaf Ebrahimi sample_image_pixel_float(void *imageData, image_descriptor *imageInfo, float x,
639*6467f958SSadaf Ebrahimi float y, float z, image_sampler_data *imageSampler,
640*6467f958SSadaf Ebrahimi float *outData, int verbose, int *containsDenorms);
641*6467f958SSadaf Ebrahimi
642*6467f958SSadaf Ebrahimi FloatPixel sample_image_pixel_float(void *imageData,
643*6467f958SSadaf Ebrahimi image_descriptor *imageInfo, float x,
644*6467f958SSadaf Ebrahimi float y, float z,
645*6467f958SSadaf Ebrahimi image_sampler_data *imageSampler,
646*6467f958SSadaf Ebrahimi float *outData, int verbose,
647*6467f958SSadaf Ebrahimi int *containsDenorms, int lod);
648*6467f958SSadaf Ebrahimi
649*6467f958SSadaf Ebrahimi FloatPixel sample_image_pixel_float_offset(
650*6467f958SSadaf Ebrahimi void *imageData, image_descriptor *imageInfo, float x, float y, float z,
651*6467f958SSadaf Ebrahimi float xAddressOffset, float yAddressOffset, float zAddressOffset,
652*6467f958SSadaf Ebrahimi image_sampler_data *imageSampler, float *outData, int verbose,
653*6467f958SSadaf Ebrahimi int *containsDenorms);
654*6467f958SSadaf Ebrahimi FloatPixel sample_image_pixel_float_offset(
655*6467f958SSadaf Ebrahimi void *imageData, image_descriptor *imageInfo, float x, float y, float z,
656*6467f958SSadaf Ebrahimi float xAddressOffset, float yAddressOffset, float zAddressOffset,
657*6467f958SSadaf Ebrahimi image_sampler_data *imageSampler, float *outData, int verbose,
658*6467f958SSadaf Ebrahimi int *containsDenorms, int lod);
659*6467f958SSadaf Ebrahimi
660*6467f958SSadaf Ebrahimi
661*6467f958SSadaf Ebrahimi extern void pack_image_pixel(unsigned int *srcVector,
662*6467f958SSadaf Ebrahimi const cl_image_format *imageFormat, void *outData);
663*6467f958SSadaf Ebrahimi extern void pack_image_pixel(int *srcVector, const cl_image_format *imageFormat,
664*6467f958SSadaf Ebrahimi void *outData);
665*6467f958SSadaf Ebrahimi extern void pack_image_pixel(float *srcVector,
666*6467f958SSadaf Ebrahimi const cl_image_format *imageFormat, void *outData);
667*6467f958SSadaf Ebrahimi extern void pack_image_pixel_error(const float *srcVector,
668*6467f958SSadaf Ebrahimi const cl_image_format *imageFormat,
669*6467f958SSadaf Ebrahimi const void *results, float *errors);
670*6467f958SSadaf Ebrahimi
671*6467f958SSadaf Ebrahimi extern char *create_random_image_data(ExplicitType dataType,
672*6467f958SSadaf Ebrahimi image_descriptor *imageInfo,
673*6467f958SSadaf Ebrahimi BufferOwningPtr<char> &P, MTdata d,
674*6467f958SSadaf Ebrahimi bool image2DFromBuffer = false);
675*6467f958SSadaf Ebrahimi
676*6467f958SSadaf Ebrahimi // deprecated
677*6467f958SSadaf Ebrahimi // extern bool clamp_image_coord( image_sampler_data *imageSampler, float value,
678*6467f958SSadaf Ebrahimi // size_t max, int &outValue );
679*6467f958SSadaf Ebrahimi
680*6467f958SSadaf Ebrahimi extern void get_sampler_kernel_code(image_sampler_data *imageSampler,
681*6467f958SSadaf Ebrahimi char *outLine);
682*6467f958SSadaf Ebrahimi extern float get_max_absolute_error(const cl_image_format *format,
683*6467f958SSadaf Ebrahimi image_sampler_data *sampler);
684*6467f958SSadaf Ebrahimi extern float get_max_relative_error(const cl_image_format *format,
685*6467f958SSadaf Ebrahimi image_sampler_data *sampler, int is3D,
686*6467f958SSadaf Ebrahimi int isLinearFilter);
687*6467f958SSadaf Ebrahimi
688*6467f958SSadaf Ebrahimi
689*6467f958SSadaf Ebrahimi #define errMax(_x, _y) ((_x) != (_x) ? (_x) : (_x) > (_y) ? (_x) : (_y))
690*6467f958SSadaf Ebrahimi
abs_diff_uint(cl_uint x,cl_uint y)691*6467f958SSadaf Ebrahimi static inline cl_uint abs_diff_uint(cl_uint x, cl_uint y)
692*6467f958SSadaf Ebrahimi {
693*6467f958SSadaf Ebrahimi return y > x ? y - x : x - y;
694*6467f958SSadaf Ebrahimi }
695*6467f958SSadaf Ebrahimi
abs_diff_int(cl_int x,cl_int y)696*6467f958SSadaf Ebrahimi static inline cl_uint abs_diff_int(cl_int x, cl_int y)
697*6467f958SSadaf Ebrahimi {
698*6467f958SSadaf Ebrahimi return (cl_uint)(y > x ? y - x : x - y);
699*6467f958SSadaf Ebrahimi }
700*6467f958SSadaf Ebrahimi
relative_error(float test,float expected)701*6467f958SSadaf Ebrahimi static inline cl_float relative_error(float test, float expected)
702*6467f958SSadaf Ebrahimi {
703*6467f958SSadaf Ebrahimi // 0-0/0 is 0 in this case, not NaN
704*6467f958SSadaf Ebrahimi if (test == 0.0f && expected == 0.0f) return 0.0f;
705*6467f958SSadaf Ebrahimi
706*6467f958SSadaf Ebrahimi return (test - expected) / expected;
707*6467f958SSadaf Ebrahimi }
708*6467f958SSadaf Ebrahimi
709*6467f958SSadaf Ebrahimi extern float random_float(float low, float high);
710*6467f958SSadaf Ebrahimi
711*6467f958SSadaf Ebrahimi class CoordWalker {
712*6467f958SSadaf Ebrahimi public:
713*6467f958SSadaf Ebrahimi CoordWalker(void *coords, bool useFloats, size_t vecSize);
714*6467f958SSadaf Ebrahimi ~CoordWalker();
715*6467f958SSadaf Ebrahimi
716*6467f958SSadaf Ebrahimi cl_float Get(size_t idx, size_t el);
717*6467f958SSadaf Ebrahimi
718*6467f958SSadaf Ebrahimi protected:
719*6467f958SSadaf Ebrahimi cl_float *mFloatCoords;
720*6467f958SSadaf Ebrahimi cl_int *mIntCoords;
721*6467f958SSadaf Ebrahimi size_t mVecSize;
722*6467f958SSadaf Ebrahimi };
723*6467f958SSadaf Ebrahimi
724*6467f958SSadaf Ebrahimi extern cl_half convert_float_to_half(float f);
725*6467f958SSadaf Ebrahimi extern int DetectFloatToHalfRoundingMode(
726*6467f958SSadaf Ebrahimi cl_command_queue); // Returns CL_SUCCESS on success
727*6467f958SSadaf Ebrahimi
728*6467f958SSadaf Ebrahimi // sign bit: don't care, exponent: maximum value, significand: non-zero
is_half_nan(cl_half half)729*6467f958SSadaf Ebrahimi static int inline is_half_nan(cl_half half) { return (half & 0x7fff) > 0x7c00; }
730*6467f958SSadaf Ebrahimi
731*6467f958SSadaf Ebrahimi // sign bit: don't care, exponent: zero, significand: non-zero
is_half_denorm(cl_half half)732*6467f958SSadaf Ebrahimi static int inline is_half_denorm(cl_half half) { return IsHalfSubnormal(half); }
733*6467f958SSadaf Ebrahimi
734*6467f958SSadaf Ebrahimi // sign bit: don't care, exponent: zero, significand: zero
is_half_zero(cl_half half)735*6467f958SSadaf Ebrahimi static int inline is_half_zero(cl_half half) { return (half & 0x7fff) == 0; }
736*6467f958SSadaf Ebrahimi
737*6467f958SSadaf Ebrahimi extern double sRGBmap(float fc);
738*6467f958SSadaf Ebrahimi
739*6467f958SSadaf Ebrahimi extern const char *convert_image_type_to_string(cl_mem_object_type imageType);
740*6467f958SSadaf Ebrahimi
741*6467f958SSadaf Ebrahimi
742*6467f958SSadaf Ebrahimi #endif // _imageHelpers_h
743